diff options
Diffstat (limited to 'Modules')
203 files changed, 50966 insertions, 80413 deletions
diff --git a/Modules/Setup.config.in b/Modules/Setup.config.in index fed62e9d8ef..5ac2404bf8a 100644 --- a/Modules/Setup.config.in +++ b/Modules/Setup.config.in @@ -4,7 +4,7 @@ # based on configure-time options. # Threading -@USE_THREAD_MODULE@thread threadmodule.c +@USE_THREAD_MODULE@_thread _threadmodule.c # The signal module @USE_SIGNAL_MODULE@signal signalmodule.c diff --git a/Modules/Setup.dist b/Modules/Setup.dist index 1121ae64a84..9269ddf2869 100644 --- a/Modules/Setup.dist +++ b/Modules/Setup.dist @@ -94,14 +94,7 @@ TESTPATH= MACHDEPPATH=:plat-$(MACHDEP) EXTRAMACHDEPPATH= -# Path component for the Tkinter-related modules -# The TKPATH variable is always enabled, to save you the effort. -TKPATH=:lib-tk - -# Path component for old modules. -OLDPATH=:lib-old - -COREPYTHONPATH=$(DESTPATH)$(SITEPATH)$(TESTPATH)$(MACHDEPPATH)$(EXTRAMACHDEPPATH)$(TKPATH)$(OLDPATH) +COREPYTHONPATH=$(DESTPATH)$(SITEPATH)$(TESTPATH)$(MACHDEPPATH)$(EXTRAMACHDEPPATH) PYTHONPATH=$(COREPYTHONPATH) @@ -118,7 +111,17 @@ pwd pwdmodule.c # this is needed to find out the user's home dir # if $HOME is not set _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 +_weakref _weakref.c # weak references +_functools _functoolsmodule.c # Tools for working with functions and callable objects +operator operator.c # operator.add() and similar goodies +_collections _collectionsmodule.c # Container types +itertools itertoolsmodule.c # Functions creating iterators for efficient looping + +# access to ISO C locale support +_locale _localemodule.c # -lintl + +# Standard I/O baseline +_io -I$(srcdir)/Modules/_io _io/_iomodule.c _io/iobase.c _io/fileio.c _io/bytesio.c _io/bufferedio.c _io/textio.c _io/stringio.c # The zipimport module is always imported at startup. Having it as a # builtin module avoids some bootstrapping problems and reduces overhead. @@ -137,18 +140,6 @@ zipimport zipimport.c # The Python symtable module depends on .h files that setup.py doesn't track _symtable symtablemodule.c -# The SGI specific GL module: - -GLHACK=-Dclear=__GLclear -#gl glmodule.c cgensupport.c -I$(srcdir) $(GLHACK) -lgl -lX11 - -# Pure module. Cannot be linked dynamically. -# -DWITH_QUANTIFY, -DWITH_PURIFY, or -DWITH_ALL_PURE -#WHICH_PURE_PRODUCTS=-DWITH_ALL_PURE -#PURE_INCLS=-I/usr/local/include -#PURE_STUBLIBS=-L/usr/local/lib -lpurify_stubs -lquantify_stubs -#pure puremodule.c $(WHICH_PURE_PRODUCTS) $(PURE_INCLS) $(PURE_STUBLIBS) - # Uncommenting the following line tells makesetup that all following # modules are to be built as shared libraries (see above for more # detail; also note that *static* reverses this effect): @@ -173,24 +164,18 @@ GLHACK=-Dclear=__GLclear #math mathmodule.c _math.c # -lm # math library functions, e.g. sin() #_struct _struct.c # binary structure packing/unpacking #time timemodule.c # -lm # time operations and variables -#operator operator.c # operator.add() and similar goodies +#_weakref _weakref.c # basic weak reference support #_testcapi _testcapimodule.c # Python C API test module #_random _randommodule.c # Random number generator -#_collections _collectionsmodule.c # Container types -#_heapq _heapqmodule.c # Heapq type -#itertools itertoolsmodule.c # Functions creating iterators for efficient looping -#strop stropmodule.c # String manipulations -#_functools _functoolsmodule.c # Tools for working with functions and callable objects +#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 # date/time type +#_datetime _datetimemodule.c # datetime accelerator #_bisect _bisectmodule.c # Bisection algorithms +#_heapq _heapqmodule.c # Heap queue algorithm #unicodedata unicodedata.c # static Unicode character database -# access to ISO C locale support -#_locale _localemodule.c # -lintl - # Modules with some UNIX dependencies -- on by default: # (If you have a really backward UNIX, select and socket may not be @@ -232,6 +217,7 @@ GLHACK=-Dclear=__GLclear #termios termios.c # Steen Lumholt's termios module #resource resource.c # Jeremy Hylton's rlimit interface +#_posixsubprocess _posixsubprocess.c # POSIX subprocess module helper # Multimedia modules -- off by default. # These don't work for 64-bit platforms!!! @@ -239,7 +225,6 @@ GLHACK=-Dclear=__GLclear # These represent audio samples or images as strings: #audioop audioop.c # Operations on audio samples -#imageop imageop.c # Operations on images # Note that the _md5 and _sha modules are normally only built if the @@ -259,58 +244,6 @@ GLHACK=-Dclear=__GLclear #_sha512 sha512module.c -# SGI IRIX specific modules -- off by default. - -# These module work on any SGI machine: - -# *** gl must be enabled higher up in this file *** -#fm fmmodule.c $(GLHACK) -lfm -lgl # Font Manager -#sgi sgimodule.c # sgi.nap() and a few more - -# This module requires the header file -# /usr/people/4Dgifts/iristools/include/izoom.h: -#imgfile imgfile.c -limage -lgutil -lgl -lm # Image Processing Utilities - - -# These modules require the Multimedia Development Option (I think): - -#al almodule.c -laudio # Audio Library -#cd cdmodule.c -lcdaudio -lds -lmediad # CD Audio Library -#cl clmodule.c -lcl -lawareaudio # Compression Library -#sv svmodule.c yuvconvert.c -lsvideo -lXext -lX11 # Starter Video - - -# The FORMS library, by Mark Overmars, implements user interface -# components such as dialogs and buttons using SGI's GL and FM -# libraries. You must ftp the FORMS library separately from -# ftp://ftp.cs.ruu.nl/pub/SGI/FORMS. It was tested with FORMS 2.2a. -# NOTE: if you want to be able to use FORMS and curses simultaneously -# (or both link them statically into the same binary), you must -# compile all of FORMS with the cc option "-Dclear=__GLclear". - -# The FORMS variable must point to the FORMS subdirectory of the forms -# toplevel directory: - -#FORMS=/ufs/guido/src/forms/FORMS -#fl flmodule.c -I$(FORMS) $(GLHACK) $(FORMS)/libforms.a -lfm -lgl - - -# SunOS specific modules -- off by default: - -#sunaudiodev sunaudiodev.c - - -# A Linux specific module -- off by default; this may also work on -# some *BSDs. - -#linuxaudiodev linuxaudiodev.c - - -# George Neville-Neil's timing module: - -#timing timingmodule.c - - # The _tkinter module. # # The command for _tkinter is long and site specific. Please @@ -358,7 +291,7 @@ GLHACK=-Dclear=__GLclear #syslog syslogmodule.c # syslog daemon interface -# Curses support, requring the System V version of curses, often +# Curses support, requiring the System V version of curses, often # provided by the ncurses library. e.g. on Linux, link with -lncurses # instead of -lcurses). # @@ -369,19 +302,11 @@ GLHACK=-Dclear=__GLclear #_curses_panel _curses_panel.c -lpanel -lncurses -# Generic (SunOS / SVR4) dynamic loading module. -# This is not needed for dynamic loading of Python modules -- -# it is a highly experimental and dangerous device for calling -# *arbitrary* C functions in *arbitrary* shared libraries: - -#dl dlmodule.c - - # Modules that provide persistent dictionary-like semantics. You will # probably want to arrange for at least one of them to be available on # your machine, though none are defined by default because of library -# dependencies. The Python module anydbm.py provides an -# implementation independent wrapper for these; dumbdbm.py provides +# dependencies. The Python module dbm/__init__.py provides an +# implementation independent wrapper for these; dbm/dumb.py provides # similar functionality (but slower of course) implemented in Python. # The standard Unix dbm module has been moved to Setup.config so that @@ -391,43 +316,13 @@ GLHACK=-Dclear=__GLclear # # First, look at Setup.config; configure may have set this for you. -#dbm dbmmodule.c # dbm(3) may require -lndbm or similar +#_dbm _dbmmodule.c # dbm(3) may require -lndbm or similar # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm: # # First, look at Setup.config; configure may have set this for you. -#gdbm gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm - - -# Sleepycat Berkeley DB interface. -# -# This requires the Sleepycat DB code, see http://www.sleepycat.com/ -# The earliest supported version of that library is 3.0, the latest -# supported version is 4.0 (4.1 is specifically not supported, as that -# changes the semantics of transactional databases). A list of available -# releases can be found at -# -# http://www.sleepycat.com/update/index.html -# -# Edit the variables DB and DBLIBVERto point to the db top directory -# and the subdirectory of PORT where you built it. -#DB=/usr/local/BerkeleyDB.4.0 -#DBLIBVER=4.0 -#DBINC=$(DB)/include -#DBLIB=$(DB)/lib -#_bsddb _bsddb.c -I$(DBINC) -L$(DBLIB) -ldb-$(DBLIBVER) - -# Historical Berkeley DB 1.85 -# -# This module is deprecated; the 1.85 version of the Berkeley DB library has -# bugs that can cause data corruption. If you can, use later versions of the -# library instead, available from <http://www.sleepycat.com/>. - -#DB=/depot/sundry/src/berkeley-db/db.1.85 -#DBPORT=$(DB)/PORT/irix.5.3 -#bsddb185 bsddbmodule.c -I$(DBPORT)/include -I$(DBPORT) $(DBPORT)/libdb.a - +#_gdbm _gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm # Helper module for various ascii-encoders @@ -436,10 +331,6 @@ GLHACK=-Dclear=__GLclear # Fred Drake's interface to the Python parser #parser parsermodule.c -# cStringIO and cPickle -#cStringIO cStringIO.c -#cPickle cPickle.c - # Lee Busby's SIGFPE modules. # The library to link fpectl with is platform specific. @@ -476,7 +367,6 @@ GLHACK=-Dclear=__GLclear # #pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI - # Hye-Shik Chang's CJKCodecs # multibytecodec is required for all the other CJK codec modules diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index b6652c0ecb0..eae29784dc6 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -3,6 +3,7 @@ Converted to C by Dmitry Vasiliev (dima at hlabs.spb.ru). */ +#define PY_SSIZE_T_CLEAN #include "Python.h" static Py_ssize_t @@ -55,12 +56,11 @@ bisect_right(PyObject *self, PyObject *args, PyObject *kw) index = internal_bisect_right(list, item, lo, hi); if (index < 0) return NULL; - return PyInt_FromSsize_t(index); + return PyLong_FromSsize_t(index); } PyDoc_STRVAR(bisect_right_doc, -"bisect(a, x[, lo[, hi]]) -> index\n\ -bisect_right(a, x[, lo[, hi]]) -> index\n\ +"bisect_right(a, x[, lo[, hi]]) -> index\n\ \n\ Return the index where to insert item x in list a, assuming a is sorted.\n\ \n\ @@ -90,8 +90,7 @@ insort_right(PyObject *self, PyObject *args, PyObject *kw) if (PyList_Insert(list, index, item) < 0) return NULL; } else { - result = PyObject_CallMethod(list, "insert", "nO", - index, item); + result = PyObject_CallMethod(list, "insert", "nO", index, item); if (result == NULL) return NULL; Py_DECREF(result); @@ -101,8 +100,7 @@ insort_right(PyObject *self, PyObject *args, PyObject *kw) } PyDoc_STRVAR(insort_right_doc, -"insort(a, x[, lo[, hi]])\n\ -insort_right(a, x[, lo[, hi]])\n\ +"insort_right(a, x[, lo[, hi]])\n\ \n\ Insert item x in list a, and keep it sorted assuming a is sorted.\n\ \n\ @@ -161,7 +159,7 @@ bisect_left(PyObject *self, PyObject *args, PyObject *kw) index = internal_bisect_left(list, item, lo, hi); if (index < 0) return NULL; - return PyInt_FromSsize_t(index); + return PyLong_FromSsize_t(index); } PyDoc_STRVAR(bisect_left_doc, @@ -195,8 +193,7 @@ insort_left(PyObject *self, PyObject *args, PyObject *kw) if (PyList_Insert(list, index, item) < 0) return NULL; } else { - result = PyObject_CallMethod(list, "insert", "nO", - index, item); + result = PyObject_CallMethod(list, "insert", "nO", index, item); if (result == NULL) return NULL; Py_DECREF(result); @@ -215,15 +212,18 @@ If x is already in a, insert it to the left of the leftmost x.\n\ Optional args lo (default 0) and hi (default len(a)) bound the\n\ slice of a to be searched.\n"); +PyDoc_STRVAR(bisect_doc, "Alias for bisect_right().\n"); +PyDoc_STRVAR(insort_doc, "Alias for insort_right().\n"); + static PyMethodDef bisect_methods[] = { {"bisect_right", (PyCFunction)bisect_right, METH_VARARGS|METH_KEYWORDS, bisect_right_doc}, {"bisect", (PyCFunction)bisect_right, - METH_VARARGS|METH_KEYWORDS, bisect_right_doc}, + METH_VARARGS|METH_KEYWORDS, bisect_doc}, {"insort_right", (PyCFunction)insort_right, METH_VARARGS|METH_KEYWORDS, insort_right_doc}, {"insort", (PyCFunction)insort_right, - METH_VARARGS|METH_KEYWORDS, insort_right_doc}, + METH_VARARGS|METH_KEYWORDS, insort_doc}, {"bisect_left", (PyCFunction)bisect_left, METH_VARARGS|METH_KEYWORDS, bisect_left_doc}, {"insort_left", (PyCFunction)insort_left, @@ -239,8 +239,21 @@ having to sort the list after each insertion. For long lists of items with\n\ expensive comparison operations, this can be an improvement over the more\n\ common approach.\n"); + +static struct PyModuleDef _bisectmodule = { + PyModuleDef_HEAD_INIT, + "_bisect", + module_doc, + -1, + bisect_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_bisect(void) +PyInit__bisect(void) { - Py_InitModule3("_bisect", bisect_methods, module_doc); + return PyModule_Create(&_bisectmodule); } diff --git a/Modules/_bsddb.c b/Modules/_bsddb.c deleted file mode 100644 index 83f298fb77d..00000000000 --- a/Modules/_bsddb.c +++ /dev/null @@ -1,10026 +0,0 @@ -/*---------------------------------------------------------------------- - Copyright (c) 1999-2001, Digital Creations, Fredericksburg, VA, USA - and Andrew Kuchling. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - o Redistributions of source code must retain the above copyright - notice, this list of conditions, and the disclaimer that follows. - - o 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. - - o Neither the name of Digital Creations nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS 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 DIGITAL - CREATIONS 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. -------------------------------------------------------------------------*/ - - -/* - * Handwritten code to wrap version 3.x of the Berkeley DB library, - * written to replace a SWIG-generated file. It has since been updated - * to compile with Berkeley DB versions 3.2 through 4.2. - * - * This module was started by Andrew Kuchling to remove the dependency - * on SWIG in a package by Gregory P. Smith who based his work on a - * similar package by Robin Dunn <robin@alldunn.com> which wrapped - * Berkeley DB 2.7.x. - * - * Development of this module then returned full circle back to Robin Dunn - * who worked on behalf of Digital Creations to complete the wrapping of - * the DB 3.x API and to build a solid unit test suite. Robin has - * since gone onto other projects (wxPython). - * - * Gregory P. Smith <greg@krypto.org> was once again the maintainer. - * - * Since January 2008, new maintainer is Jesus Cea <jcea@jcea.es>. - * Jesus Cea licenses this code to PSF under a Contributor Agreement. - * - * Use the pybsddb-users@lists.sf.net mailing list for all questions. - * Things can change faster than the header of this file is updated. This - * file is shared with the PyBSDDB project at SourceForge: - * - * http://pybsddb.sf.net - * - * This file should remain backward compatible with Python 2.1, but see PEP - * 291 for the most current backward compatibility requirements: - * - * http://www.python.org/peps/pep-0291.html - * - * This module contains 6 types: - * - * DB (Database) - * DBCursor (Database Cursor) - * DBEnv (database environment) - * DBTxn (An explicit database transaction) - * DBLock (A lock handle) - * DBSequence (Sequence) - * - * More datatypes added: - * - * DBLogCursor (Log Cursor) - * - */ - -/* --------------------------------------------------------------------- */ - -/* - * Portions of this module, associated unit tests and build scripts are the - * result of a contract with The Written Word (http://thewrittenword.com/) - * Many thanks go out to them for causing me to raise the bar on quality and - * functionality, resulting in a better bsddb3 package for all of us to use. - * - * --Robin - */ - -/* --------------------------------------------------------------------- */ - -#include <stddef.h> /* for offsetof() */ -#include <Python.h> - -#define COMPILING_BSDDB_C -#include "bsddb.h" -#undef COMPILING_BSDDB_C - -static char *rcs_id = "$Id$"; - -/* --------------------------------------------------------------------- */ -/* Various macro definitions */ - -#if (PY_VERSION_HEX < 0x02050000) -typedef int Py_ssize_t; -#endif - -#if (PY_VERSION_HEX < 0x02060000) /* really: before python trunk r63675 */ -/* This code now uses PyBytes* API function names instead of PyString*. - * These #defines map to their equivalent on earlier python versions. */ -#define PyBytes_FromStringAndSize PyString_FromStringAndSize -#define PyBytes_FromString PyString_FromString -#define PyBytes_AsStringAndSize PyString_AsStringAndSize -#define PyBytes_Check PyString_Check -#define PyBytes_GET_SIZE PyString_GET_SIZE -#define PyBytes_AS_STRING PyString_AS_STRING -#endif - -#if (PY_VERSION_HEX >= 0x03000000) -#define NUMBER_Check PyLong_Check -#define NUMBER_AsLong PyLong_AsLong -#define NUMBER_FromLong PyLong_FromLong -#else -#define NUMBER_Check PyInt_Check -#define NUMBER_AsLong PyInt_AsLong -#define NUMBER_FromLong PyInt_FromLong -#endif - -#ifdef WITH_THREAD - -/* These are for when calling Python --> C */ -#define MYDB_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS; -#define MYDB_END_ALLOW_THREADS Py_END_ALLOW_THREADS; - -/* For 2.3, use the PyGILState_ calls */ -#if (PY_VERSION_HEX >= 0x02030000) -#define MYDB_USE_GILSTATE -#endif - -/* and these are for calling C --> Python */ -#if defined(MYDB_USE_GILSTATE) -#define MYDB_BEGIN_BLOCK_THREADS \ - PyGILState_STATE __savestate = PyGILState_Ensure(); -#define MYDB_END_BLOCK_THREADS \ - PyGILState_Release(__savestate); -#else /* MYDB_USE_GILSTATE */ -/* Pre GILState API - do it the long old way */ -static PyInterpreterState* _db_interpreterState = NULL; -#define MYDB_BEGIN_BLOCK_THREADS { \ - PyThreadState* prevState; \ - PyThreadState* newState; \ - PyEval_AcquireLock(); \ - newState = PyThreadState_New(_db_interpreterState); \ - prevState = PyThreadState_Swap(newState); - -#define MYDB_END_BLOCK_THREADS \ - newState = PyThreadState_Swap(prevState); \ - PyThreadState_Clear(newState); \ - PyEval_ReleaseLock(); \ - PyThreadState_Delete(newState); \ - } -#endif /* MYDB_USE_GILSTATE */ - -#else -/* Compiled without threads - avoid all this cruft */ -#define MYDB_BEGIN_ALLOW_THREADS -#define MYDB_END_ALLOW_THREADS -#define MYDB_BEGIN_BLOCK_THREADS -#define MYDB_END_BLOCK_THREADS - -#endif - -/* --------------------------------------------------------------------- */ -/* Exceptions */ - -static PyObject* DBError; /* Base class, all others derive from this */ -static PyObject* DBCursorClosedError; /* raised when trying to use a closed cursor object */ -static PyObject* DBKeyEmptyError; /* DB_KEYEMPTY: also derives from KeyError */ -static PyObject* DBKeyExistError; /* DB_KEYEXIST */ -static PyObject* DBLockDeadlockError; /* DB_LOCK_DEADLOCK */ -static PyObject* DBLockNotGrantedError; /* DB_LOCK_NOTGRANTED */ -static PyObject* DBNotFoundError; /* DB_NOTFOUND: also derives from KeyError */ -static PyObject* DBOldVersionError; /* DB_OLD_VERSION */ -static PyObject* DBRunRecoveryError; /* DB_RUNRECOVERY */ -static PyObject* DBVerifyBadError; /* DB_VERIFY_BAD */ -static PyObject* DBNoServerError; /* DB_NOSERVER */ -static PyObject* DBNoServerHomeError; /* DB_NOSERVER_HOME */ -static PyObject* DBNoServerIDError; /* DB_NOSERVER_ID */ -static PyObject* DBPageNotFoundError; /* DB_PAGE_NOTFOUND */ -static PyObject* DBSecondaryBadError; /* DB_SECONDARY_BAD */ - -static PyObject* DBInvalidArgError; /* EINVAL */ -static PyObject* DBAccessError; /* EACCES */ -static PyObject* DBNoSpaceError; /* ENOSPC */ -static PyObject* DBNoMemoryError; /* DB_BUFFER_SMALL (ENOMEM when < 4.3) */ -static PyObject* DBAgainError; /* EAGAIN */ -static PyObject* DBBusyError; /* EBUSY */ -static PyObject* DBFileExistsError; /* EEXIST */ -static PyObject* DBNoSuchFileError; /* ENOENT */ -static PyObject* DBPermissionsError; /* EPERM */ - -#if (DBVER >= 42) -static PyObject* DBRepHandleDeadError; /* DB_REP_HANDLE_DEAD */ -#endif -#if (DBVER >= 44) -static PyObject* DBRepLockoutError; /* DB_REP_LOCKOUT */ -#endif - -#if (DBVER >= 46) -static PyObject* DBRepLeaseExpiredError; /* DB_REP_LEASE_EXPIRED */ -#endif - -#if (DBVER >= 47) -static PyObject* DBForeignConflictError; /* DB_FOREIGN_CONFLICT */ -#endif - - -static PyObject* DBRepUnavailError; /* DB_REP_UNAVAIL */ - -#if (DBVER < 43) -#define DB_BUFFER_SMALL ENOMEM -#endif - -#if (DBVER < 48) -#define DB_GID_SIZE DB_XIDDATASIZE -#endif - - -/* --------------------------------------------------------------------- */ -/* Structure definitions */ - -#if PYTHON_API_VERSION < 1010 -#error "Python 2.1 or later required" -#endif - - -/* Defaults for moduleFlags in DBEnvObject and DBObject. */ -#define DEFAULT_GET_RETURNS_NONE 1 -#define DEFAULT_CURSOR_SET_RETURNS_NONE 1 /* 0 in pybsddb < 4.2, python < 2.4 */ - - -/* See comment in Python 2.6 "object.h" */ -#ifndef staticforward -#define staticforward static -#endif -#ifndef statichere -#define statichere static -#endif - -staticforward PyTypeObject DB_Type, DBCursor_Type, DBEnv_Type, DBTxn_Type, - DBLock_Type, DBLogCursor_Type; -#if (DBVER >= 43) -staticforward PyTypeObject DBSequence_Type; -#endif - -#ifndef Py_TYPE -/* for compatibility with Python 2.5 and earlier */ -#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) -#endif - -#define DBObject_Check(v) (Py_TYPE(v) == &DB_Type) -#define DBCursorObject_Check(v) (Py_TYPE(v) == &DBCursor_Type) -#define DBLogCursorObject_Check(v) (Py_TYPE(v) == &DBLogCursor_Type) -#define DBEnvObject_Check(v) (Py_TYPE(v) == &DBEnv_Type) -#define DBTxnObject_Check(v) (Py_TYPE(v) == &DBTxn_Type) -#define DBLockObject_Check(v) (Py_TYPE(v) == &DBLock_Type) -#if (DBVER >= 43) -#define DBSequenceObject_Check(v) (Py_TYPE(v) == &DBSequence_Type) -#endif - -#if (DBVER < 46) - #define _DBC_close(dbc) dbc->c_close(dbc) - #define _DBC_count(dbc,a,b) dbc->c_count(dbc,a,b) - #define _DBC_del(dbc,a) dbc->c_del(dbc,a) - #define _DBC_dup(dbc,a,b) dbc->c_dup(dbc,a,b) - #define _DBC_get(dbc,a,b,c) dbc->c_get(dbc,a,b,c) - #define _DBC_pget(dbc,a,b,c,d) dbc->c_pget(dbc,a,b,c,d) - #define _DBC_put(dbc,a,b,c) dbc->c_put(dbc,a,b,c) -#else - #define _DBC_close(dbc) dbc->close(dbc) - #define _DBC_count(dbc,a,b) dbc->count(dbc,a,b) - #define _DBC_del(dbc,a) dbc->del(dbc,a) - #define _DBC_dup(dbc,a,b) dbc->dup(dbc,a,b) - #define _DBC_get(dbc,a,b,c) dbc->get(dbc,a,b,c) - #define _DBC_pget(dbc,a,b,c,d) dbc->pget(dbc,a,b,c,d) - #define _DBC_put(dbc,a,b,c) dbc->put(dbc,a,b,c) -#endif - - -/* --------------------------------------------------------------------- */ -/* Utility macros and functions */ - -#define INSERT_IN_DOUBLE_LINKED_LIST(backlink,object) \ - { \ - object->sibling_next=backlink; \ - object->sibling_prev_p=&(backlink); \ - backlink=object; \ - if (object->sibling_next) { \ - object->sibling_next->sibling_prev_p=&(object->sibling_next); \ - } \ - } - -#define EXTRACT_FROM_DOUBLE_LINKED_LIST(object) \ - { \ - if (object->sibling_next) { \ - object->sibling_next->sibling_prev_p=object->sibling_prev_p; \ - } \ - *(object->sibling_prev_p)=object->sibling_next; \ - } - -#define EXTRACT_FROM_DOUBLE_LINKED_LIST_MAYBE_NULL(object) \ - { \ - if (object->sibling_next) { \ - object->sibling_next->sibling_prev_p=object->sibling_prev_p; \ - } \ - if (object->sibling_prev_p) { \ - *(object->sibling_prev_p)=object->sibling_next; \ - } \ - } - -#define INSERT_IN_DOUBLE_LINKED_LIST_TXN(backlink,object) \ - { \ - object->sibling_next_txn=backlink; \ - object->sibling_prev_p_txn=&(backlink); \ - backlink=object; \ - if (object->sibling_next_txn) { \ - object->sibling_next_txn->sibling_prev_p_txn= \ - &(object->sibling_next_txn); \ - } \ - } - -#define EXTRACT_FROM_DOUBLE_LINKED_LIST_TXN(object) \ - { \ - if (object->sibling_next_txn) { \ - object->sibling_next_txn->sibling_prev_p_txn= \ - object->sibling_prev_p_txn; \ - } \ - *(object->sibling_prev_p_txn)=object->sibling_next_txn; \ - } - - -#define RETURN_IF_ERR() \ - if (makeDBError(err)) { \ - return NULL; \ - } - -#define RETURN_NONE() Py_INCREF(Py_None); return Py_None; - -#define _CHECK_OBJECT_NOT_CLOSED(nonNull, pyErrObj, name) \ - if ((nonNull) == NULL) { \ - PyObject *errTuple = NULL; \ - errTuple = Py_BuildValue("(is)", 0, #name " object has been closed"); \ - if (errTuple) { \ - PyErr_SetObject((pyErrObj), errTuple); \ - Py_DECREF(errTuple); \ - } \ - return NULL; \ - } - -#define CHECK_DB_NOT_CLOSED(dbobj) \ - _CHECK_OBJECT_NOT_CLOSED(dbobj->db, DBError, DB) - -#define CHECK_ENV_NOT_CLOSED(env) \ - _CHECK_OBJECT_NOT_CLOSED(env->db_env, DBError, DBEnv) - -#define CHECK_CURSOR_NOT_CLOSED(curs) \ - _CHECK_OBJECT_NOT_CLOSED(curs->dbc, DBCursorClosedError, DBCursor) - -#define CHECK_LOGCURSOR_NOT_CLOSED(logcurs) \ - _CHECK_OBJECT_NOT_CLOSED(logcurs->logc, DBCursorClosedError, DBLogCursor) - -#if (DBVER >= 43) -#define CHECK_SEQUENCE_NOT_CLOSED(curs) \ - _CHECK_OBJECT_NOT_CLOSED(curs->sequence, DBError, DBSequence) -#endif - -#define CHECK_DBFLAG(mydb, flag) (((mydb)->flags & (flag)) || \ - (((mydb)->myenvobj != NULL) && ((mydb)->myenvobj->flags & (flag)))) - -#define CLEAR_DBT(dbt) (memset(&(dbt), 0, sizeof(dbt))) - -#define FREE_DBT(dbt) if ((dbt.flags & (DB_DBT_MALLOC|DB_DBT_REALLOC)) && \ - dbt.data != NULL) { free(dbt.data); dbt.data = NULL; } - - -static int makeDBError(int err); - - -/* Return the access method type of the DBObject */ -static int _DB_get_type(DBObject* self) -{ - DBTYPE type; - int err; - - err = self->db->get_type(self->db, &type); - if (makeDBError(err)) { - return -1; - } - return type; -} - - -/* Create a DBT structure (containing key and data values) from Python - strings. Returns 1 on success, 0 on an error. */ -static int make_dbt(PyObject* obj, DBT* dbt) -{ - CLEAR_DBT(*dbt); - if (obj == Py_None) { - /* no need to do anything, the structure has already been zeroed */ - } - else if (!PyArg_Parse(obj, "s#", &dbt->data, &dbt->size)) { - PyErr_SetString(PyExc_TypeError, -#if (PY_VERSION_HEX < 0x03000000) - "Data values must be of type string or None."); -#else - "Data values must be of type bytes or None."); -#endif - return 0; - } - return 1; -} - - -/* Recno and Queue DBs can have integer keys. This function figures out - what's been given, verifies that it's allowed, and then makes the DBT. - - Caller MUST call FREE_DBT(key) when done. */ -static int -make_key_dbt(DBObject* self, PyObject* keyobj, DBT* key, int* pflags) -{ - db_recno_t recno; - int type; - - CLEAR_DBT(*key); - if (keyobj == Py_None) { - type = _DB_get_type(self); - if (type == -1) - return 0; - if (type == DB_RECNO || type == DB_QUEUE) { - PyErr_SetString( - PyExc_TypeError, - "None keys not allowed for Recno and Queue DB's"); - return 0; - } - /* no need to do anything, the structure has already been zeroed */ - } - - else if (PyBytes_Check(keyobj)) { - /* verify access method type */ - type = _DB_get_type(self); - if (type == -1) - return 0; - if (type == DB_RECNO || type == DB_QUEUE) { - PyErr_SetString( - PyExc_TypeError, -#if (PY_VERSION_HEX < 0x03000000) - "String keys not allowed for Recno and Queue DB's"); -#else - "Bytes keys not allowed for Recno and Queue DB's"); -#endif - return 0; - } - - /* - * NOTE(gps): I don't like doing a data copy here, it seems - * wasteful. But without a clean way to tell FREE_DBT if it - * should free key->data or not we have to. Other places in - * the code check for DB_THREAD and forceably set DBT_MALLOC - * when we otherwise would leave flags 0 to indicate that. - */ - key->data = malloc(PyBytes_GET_SIZE(keyobj)); - if (key->data == NULL) { - PyErr_SetString(PyExc_MemoryError, "Key memory allocation failed"); - return 0; - } - memcpy(key->data, PyBytes_AS_STRING(keyobj), - PyBytes_GET_SIZE(keyobj)); - key->flags = DB_DBT_REALLOC; - key->size = PyBytes_GET_SIZE(keyobj); - } - - else if (NUMBER_Check(keyobj)) { - /* verify access method type */ - type = _DB_get_type(self); - if (type == -1) - return 0; - if (type == DB_BTREE && pflags != NULL) { - /* if BTREE then an Integer key is allowed with the - * DB_SET_RECNO flag */ - *pflags |= DB_SET_RECNO; - } - else if (type != DB_RECNO && type != DB_QUEUE) { - PyErr_SetString( - PyExc_TypeError, - "Integer keys only allowed for Recno and Queue DB's"); - return 0; - } - - /* Make a key out of the requested recno, use allocated space so DB - * will be able to realloc room for the real key if needed. */ - recno = NUMBER_AsLong(keyobj); - key->data = malloc(sizeof(db_recno_t)); - if (key->data == NULL) { - PyErr_SetString(PyExc_MemoryError, "Key memory allocation failed"); - return 0; - } - key->ulen = key->size = sizeof(db_recno_t); - memcpy(key->data, &recno, sizeof(db_recno_t)); - key->flags = DB_DBT_REALLOC; - } - else { - PyErr_Format(PyExc_TypeError, -#if (PY_VERSION_HEX < 0x03000000) - "String or Integer object expected for key, %s found", -#else - "Bytes or Integer object expected for key, %s found", -#endif - Py_TYPE(keyobj)->tp_name); - return 0; - } - - return 1; -} - - -/* Add partial record access to an existing DBT data struct. - If dlen and doff are set, then the DB_DBT_PARTIAL flag will be set - and the data storage/retrieval will be done using dlen and doff. */ -static int add_partial_dbt(DBT* d, int dlen, int doff) { - /* if neither were set we do nothing (-1 is the default value) */ - if ((dlen == -1) && (doff == -1)) { - return 1; - } - - if ((dlen < 0) || (doff < 0)) { - PyErr_SetString(PyExc_TypeError, "dlen and doff must both be >= 0"); - return 0; - } - - d->flags = d->flags | DB_DBT_PARTIAL; - d->dlen = (unsigned int) dlen; - d->doff = (unsigned int) doff; - return 1; -} - -/* a safe strcpy() without the zeroing behaviour and semantics of strncpy. */ -/* TODO: make this use the native libc strlcpy() when available (BSD) */ -unsigned int our_strlcpy(char* dest, const char* src, unsigned int n) -{ - unsigned int srclen, copylen; - - srclen = strlen(src); - if (n <= 0) - return srclen; - copylen = (srclen > n-1) ? n-1 : srclen; - /* populate dest[0] thru dest[copylen-1] */ - memcpy(dest, src, copylen); - /* guarantee null termination */ - dest[copylen] = 0; - - return srclen; -} - -/* Callback used to save away more information about errors from the DB - * library. */ -static char _db_errmsg[1024]; -#if (DBVER <= 42) -static void _db_errorCallback(const char* prefix, char* msg) -#else -static void _db_errorCallback(const DB_ENV *db_env, - const char* prefix, const char* msg) -#endif -{ - our_strlcpy(_db_errmsg, msg, sizeof(_db_errmsg)); -} - - -/* -** We need these functions because some results -** are undefined if pointer is NULL. Some other -** give None instead of "". -** -** This functions are static and will be -** -I hope- inlined. -*/ -static const char *DummyString = "This string is a simple placeholder"; -static PyObject *Build_PyString(const char *p,int s) -{ - if (!p) { - p=DummyString; - assert(s==0); - } - return PyBytes_FromStringAndSize(p,s); -} - -static PyObject *BuildValue_S(const void *p,int s) -{ - if (!p) { - p=DummyString; - assert(s==0); - } - return PyBytes_FromStringAndSize(p, s); -} - -static PyObject *BuildValue_SS(const void *p1,int s1,const void *p2,int s2) -{ -PyObject *a, *b, *r; - - if (!p1) { - p1=DummyString; - assert(s1==0); - } - if (!p2) { - p2=DummyString; - assert(s2==0); - } - - if (!(a = PyBytes_FromStringAndSize(p1, s1))) { - return NULL; - } - if (!(b = PyBytes_FromStringAndSize(p2, s2))) { - Py_DECREF(a); - return NULL; - } - -#if (PY_VERSION_HEX >= 0x02040000) - r = PyTuple_Pack(2, a, b) ; -#else - r = Py_BuildValue("OO", a, b); -#endif - Py_DECREF(a); - Py_DECREF(b); - return r; -} - -static PyObject *BuildValue_IS(int i,const void *p,int s) -{ - PyObject *a, *r; - - if (!p) { - p=DummyString; - assert(s==0); - } - - if (!(a = PyBytes_FromStringAndSize(p, s))) { - return NULL; - } - - r = Py_BuildValue("iO", i, a); - Py_DECREF(a); - return r; -} - -static PyObject *BuildValue_LS(long l,const void *p,int s) -{ - PyObject *a, *r; - - if (!p) { - p=DummyString; - assert(s==0); - } - - if (!(a = PyBytes_FromStringAndSize(p, s))) { - return NULL; - } - - r = Py_BuildValue("lO", l, a); - Py_DECREF(a); - return r; -} - - - -/* make a nice exception object to raise for errors. */ -static int makeDBError(int err) -{ - char errTxt[2048]; /* really big, just in case... */ - PyObject *errObj = NULL; - PyObject *errTuple = NULL; - int exceptionRaised = 0; - unsigned int bytes_left; - - switch (err) { - case 0: /* successful, no error */ - return 0; - - case DB_KEYEMPTY: errObj = DBKeyEmptyError; break; - case DB_KEYEXIST: errObj = DBKeyExistError; break; - case DB_LOCK_DEADLOCK: errObj = DBLockDeadlockError; break; - case DB_LOCK_NOTGRANTED: errObj = DBLockNotGrantedError; break; - case DB_NOTFOUND: errObj = DBNotFoundError; break; - case DB_OLD_VERSION: errObj = DBOldVersionError; break; - case DB_RUNRECOVERY: errObj = DBRunRecoveryError; break; - case DB_VERIFY_BAD: errObj = DBVerifyBadError; break; - case DB_NOSERVER: errObj = DBNoServerError; break; - case DB_NOSERVER_HOME: errObj = DBNoServerHomeError; break; - case DB_NOSERVER_ID: errObj = DBNoServerIDError; break; - case DB_PAGE_NOTFOUND: errObj = DBPageNotFoundError; break; - case DB_SECONDARY_BAD: errObj = DBSecondaryBadError; break; - case DB_BUFFER_SMALL: errObj = DBNoMemoryError; break; - -#if (DBVER >= 43) - /* ENOMEM and DB_BUFFER_SMALL were one and the same until 4.3 */ - case ENOMEM: errObj = PyExc_MemoryError; break; -#endif - case EINVAL: errObj = DBInvalidArgError; break; - case EACCES: errObj = DBAccessError; break; - case ENOSPC: errObj = DBNoSpaceError; break; - case EAGAIN: errObj = DBAgainError; break; - case EBUSY : errObj = DBBusyError; break; - case EEXIST: errObj = DBFileExistsError; break; - case ENOENT: errObj = DBNoSuchFileError; break; - case EPERM : errObj = DBPermissionsError; break; - -#if (DBVER >= 42) - case DB_REP_HANDLE_DEAD : errObj = DBRepHandleDeadError; break; -#endif -#if (DBVER >= 44) - case DB_REP_LOCKOUT : errObj = DBRepLockoutError; break; -#endif - -#if (DBVER >= 46) - case DB_REP_LEASE_EXPIRED : errObj = DBRepLeaseExpiredError; break; -#endif - -#if (DBVER >= 47) - case DB_FOREIGN_CONFLICT : errObj = DBForeignConflictError; break; -#endif - - case DB_REP_UNAVAIL : errObj = DBRepUnavailError; break; - - default: errObj = DBError; break; - } - - if (errObj != NULL) { - bytes_left = our_strlcpy(errTxt, db_strerror(err), sizeof(errTxt)); - /* Ensure that bytes_left never goes negative */ - if (_db_errmsg[0] && bytes_left < (sizeof(errTxt) - 4)) { - bytes_left = sizeof(errTxt) - bytes_left - 4 - 1; - assert(bytes_left >= 0); - strcat(errTxt, " -- "); - strncat(errTxt, _db_errmsg, bytes_left); - } - _db_errmsg[0] = 0; - - errTuple = Py_BuildValue("(is)", err, errTxt); - if (errTuple == NULL) { - Py_DECREF(errObj); - return !0; - } - PyErr_SetObject(errObj, errTuple); - Py_DECREF(errTuple); - } - - return ((errObj != NULL) || exceptionRaised); -} - - - -/* set a type exception */ -static void makeTypeError(char* expected, PyObject* found) -{ - PyErr_Format(PyExc_TypeError, "Expected %s argument, %s found.", - expected, Py_TYPE(found)->tp_name); -} - - -/* verify that an obj is either None or a DBTxn, and set the txn pointer */ -static int checkTxnObj(PyObject* txnobj, DB_TXN** txn) -{ - if (txnobj == Py_None || txnobj == NULL) { - *txn = NULL; - return 1; - } - if (DBTxnObject_Check(txnobj)) { - *txn = ((DBTxnObject*)txnobj)->txn; - return 1; - } - else - makeTypeError("DBTxn", txnobj); - return 0; -} - - -/* Delete a key from a database - Returns 0 on success, -1 on an error. */ -static int _DB_delete(DBObject* self, DB_TXN *txn, DBT *key, int flags) -{ - int err; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->del(self->db, txn, key, 0); - MYDB_END_ALLOW_THREADS; - if (makeDBError(err)) { - return -1; - } - return 0; -} - - -/* Store a key into a database - Returns 0 on success, -1 on an error. */ -static int _DB_put(DBObject* self, DB_TXN *txn, DBT *key, DBT *data, int flags) -{ - int err; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->put(self->db, txn, key, data, flags); - MYDB_END_ALLOW_THREADS; - if (makeDBError(err)) { - return -1; - } - return 0; -} - -/* Get a key/data pair from a cursor */ -static PyObject* _DBCursor_get(DBCursorObject* self, int extra_flags, - PyObject *args, PyObject *kwargs, char *format) -{ - int err; - PyObject* retval = NULL; - DBT key, data; - int dlen = -1; - int doff = -1; - int flags = 0; - static char* kwnames[] = { "flags", "dlen", "doff", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, format, kwnames, - &flags, &dlen, &doff)) - return NULL; - - CHECK_CURSOR_NOT_CLOSED(self); - - flags |= extra_flags; - CLEAR_DBT(key); - CLEAR_DBT(data); - if (!add_partial_dbt(&data, dlen, doff)) - return NULL; - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_get(self->dbc, &key, &data, flags); - MYDB_END_ALLOW_THREADS; - - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->mydb->moduleFlags.getReturnsNone) { - Py_INCREF(Py_None); - retval = Py_None; - } - else if (makeDBError(err)) { - retval = NULL; - } - else { /* otherwise, success! */ - - /* if Recno or Queue, return the key as an Int */ - switch (_DB_get_type(self->mydb)) { - case -1: - retval = NULL; - break; - - case DB_RECNO: - case DB_QUEUE: - retval = BuildValue_IS(*((db_recno_t*)key.data), data.data, data.size); - break; - case DB_HASH: - case DB_BTREE: - default: - retval = BuildValue_SS(key.data, key.size, data.data, data.size); - break; - } - } - return retval; -} - - -/* add an integer to a dictionary using the given name as a key */ -static void _addIntToDict(PyObject* dict, char *name, int value) -{ - PyObject* v = NUMBER_FromLong((long) value); - if (!v || PyDict_SetItemString(dict, name, v)) - PyErr_Clear(); - - Py_XDECREF(v); -} - -/* The same, when the value is a time_t */ -static void _addTimeTToDict(PyObject* dict, char *name, time_t value) -{ - PyObject* v; - /* if the value fits in regular int, use that. */ -#ifdef PY_LONG_LONG - if (sizeof(time_t) > sizeof(long)) - v = PyLong_FromLongLong((PY_LONG_LONG) value); - else -#endif - v = NUMBER_FromLong((long) value); - if (!v || PyDict_SetItemString(dict, name, v)) - PyErr_Clear(); - - Py_XDECREF(v); -} - -#if (DBVER >= 43) -/* add an db_seq_t to a dictionary using the given name as a key */ -static void _addDb_seq_tToDict(PyObject* dict, char *name, db_seq_t value) -{ - PyObject* v = PyLong_FromLongLong(value); - if (!v || PyDict_SetItemString(dict, name, v)) - PyErr_Clear(); - - Py_XDECREF(v); -} -#endif - -static void _addDB_lsnToDict(PyObject* dict, char *name, DB_LSN value) -{ - PyObject *v = Py_BuildValue("(ll)",value.file,value.offset); - if (!v || PyDict_SetItemString(dict, name, v)) - PyErr_Clear(); - - Py_XDECREF(v); -} - -/* --------------------------------------------------------------------- */ -/* Allocators and deallocators */ - -static DBObject* -newDBObject(DBEnvObject* arg, int flags) -{ - DBObject* self; - DB_ENV* db_env = NULL; - int err; - - self = PyObject_New(DBObject, &DB_Type); - if (self == NULL) - return NULL; - - self->flags = 0; - self->setflags = 0; - self->myenvobj = NULL; - self->db = NULL; - self->children_cursors = NULL; -#if (DBVER >=43) - self->children_sequences = NULL; -#endif - self->associateCallback = NULL; - self->btCompareCallback = NULL; - self->primaryDBType = 0; - Py_INCREF(Py_None); - self->private_obj = Py_None; - self->in_weakreflist = NULL; - - /* keep a reference to our python DBEnv object */ - if (arg) { - Py_INCREF(arg); - self->myenvobj = arg; - db_env = arg->db_env; - INSERT_IN_DOUBLE_LINKED_LIST(self->myenvobj->children_dbs,self); - } else { - self->sibling_prev_p=NULL; - self->sibling_next=NULL; - } - self->txn=NULL; - self->sibling_prev_p_txn=NULL; - self->sibling_next_txn=NULL; - - if (self->myenvobj) - self->moduleFlags = self->myenvobj->moduleFlags; - else - self->moduleFlags.getReturnsNone = DEFAULT_GET_RETURNS_NONE; - self->moduleFlags.cursorSetReturnsNone = DEFAULT_CURSOR_SET_RETURNS_NONE; - - MYDB_BEGIN_ALLOW_THREADS; - err = db_create(&self->db, db_env, flags); - if (self->db != NULL) { - self->db->set_errcall(self->db, _db_errorCallback); - self->db->app_private = (void*)self; - } - MYDB_END_ALLOW_THREADS; - /* TODO add a weakref(self) to the self->myenvobj->open_child_weakrefs - * list so that a DBEnv can refuse to close without aborting any open - * DBTxns and closing any open DBs first. */ - if (makeDBError(err)) { - if (self->myenvobj) { - Py_DECREF(self->myenvobj); - self->myenvobj = NULL; - } - Py_DECREF(self); - self = NULL; - } - return self; -} - - -/* Forward declaration */ -static PyObject *DB_close_internal(DBObject* self, int flags, int do_not_close); - -static void -DB_dealloc(DBObject* self) -{ - PyObject *dummy; - - if (self->db != NULL) { - dummy=DB_close_internal(self, 0, 0); - /* - ** Raising exceptions while doing - ** garbage collection is a fatal error. - */ - if (dummy) - Py_DECREF(dummy); - else - PyErr_Clear(); - } - if (self->in_weakreflist != NULL) { - PyObject_ClearWeakRefs((PyObject *) self); - } - if (self->myenvobj) { - Py_DECREF(self->myenvobj); - self->myenvobj = NULL; - } - if (self->associateCallback != NULL) { - Py_DECREF(self->associateCallback); - self->associateCallback = NULL; - } - if (self->btCompareCallback != NULL) { - Py_DECREF(self->btCompareCallback); - self->btCompareCallback = NULL; - } - Py_DECREF(self->private_obj); - PyObject_Del(self); -} - -static DBCursorObject* -newDBCursorObject(DBC* dbc, DBTxnObject *txn, DBObject* db) -{ - DBCursorObject* self = PyObject_New(DBCursorObject, &DBCursor_Type); - if (self == NULL) - return NULL; - - self->dbc = dbc; - self->mydb = db; - - INSERT_IN_DOUBLE_LINKED_LIST(self->mydb->children_cursors,self); - if (txn && ((PyObject *)txn!=Py_None)) { - INSERT_IN_DOUBLE_LINKED_LIST_TXN(txn->children_cursors,self); - self->txn=txn; - } else { - self->txn=NULL; - } - - self->in_weakreflist = NULL; - Py_INCREF(self->mydb); - return self; -} - - -/* Forward declaration */ -static PyObject *DBC_close_internal(DBCursorObject* self); - -static void -DBCursor_dealloc(DBCursorObject* self) -{ - PyObject *dummy; - - if (self->dbc != NULL) { - dummy=DBC_close_internal(self); - /* - ** Raising exceptions while doing - ** garbage collection is a fatal error. - */ - if (dummy) - Py_DECREF(dummy); - else - PyErr_Clear(); - } - if (self->in_weakreflist != NULL) { - PyObject_ClearWeakRefs((PyObject *) self); - } - Py_DECREF(self->mydb); - PyObject_Del(self); -} - - -static DBLogCursorObject* -newDBLogCursorObject(DB_LOGC* dblogc, DBEnvObject* env) -{ - DBLogCursorObject* self; - - self = PyObject_New(DBLogCursorObject, &DBLogCursor_Type); - - if (self == NULL) - return NULL; - - self->logc = dblogc; - self->env = env; - - INSERT_IN_DOUBLE_LINKED_LIST(self->env->children_logcursors, self); - - self->in_weakreflist = NULL; - Py_INCREF(self->env); - return self; -} - - -/* Forward declaration */ -static PyObject *DBLogCursor_close_internal(DBLogCursorObject* self); - -static void -DBLogCursor_dealloc(DBLogCursorObject* self) -{ - PyObject *dummy; - - if (self->logc != NULL) { - dummy = DBLogCursor_close_internal(self); - /* - ** Raising exceptions while doing - ** garbage collection is a fatal error. - */ - if (dummy) - Py_DECREF(dummy); - else - PyErr_Clear(); - } - if (self->in_weakreflist != NULL) { - PyObject_ClearWeakRefs((PyObject *) self); - } - Py_DECREF(self->env); - PyObject_Del(self); -} - - -static DBEnvObject* -newDBEnvObject(int flags) -{ - int err; - DBEnvObject* self = PyObject_New(DBEnvObject, &DBEnv_Type); - if (self == NULL) - return NULL; - - self->db_env = NULL; - self->closed = 1; - self->flags = flags; - self->moduleFlags.getReturnsNone = DEFAULT_GET_RETURNS_NONE; - self->moduleFlags.cursorSetReturnsNone = DEFAULT_CURSOR_SET_RETURNS_NONE; - self->children_dbs = NULL; - self->children_txns = NULL; - self->children_logcursors = NULL ; - Py_INCREF(Py_None); - self->private_obj = Py_None; - Py_INCREF(Py_None); - self->rep_transport = Py_None; - self->in_weakreflist = NULL; - self->event_notifyCallback = NULL; - - MYDB_BEGIN_ALLOW_THREADS; - err = db_env_create(&self->db_env, flags); - MYDB_END_ALLOW_THREADS; - if (makeDBError(err)) { - Py_DECREF(self); - self = NULL; - } - else { - self->db_env->set_errcall(self->db_env, _db_errorCallback); - self->db_env->app_private = self; - } - return self; -} - -/* Forward declaration */ -static PyObject *DBEnv_close_internal(DBEnvObject* self, int flags); - -static void -DBEnv_dealloc(DBEnvObject* self) -{ - PyObject *dummy; - - if (self->db_env) { - dummy=DBEnv_close_internal(self, 0); - /* - ** Raising exceptions while doing - ** garbage collection is a fatal error. - */ - if (dummy) - Py_DECREF(dummy); - else - PyErr_Clear(); - } - - Py_XDECREF(self->event_notifyCallback); - self->event_notifyCallback = NULL; - - if (self->in_weakreflist != NULL) { - PyObject_ClearWeakRefs((PyObject *) self); - } - Py_DECREF(self->private_obj); - Py_DECREF(self->rep_transport); - PyObject_Del(self); -} - - -static DBTxnObject* -newDBTxnObject(DBEnvObject* myenv, DBTxnObject *parent, DB_TXN *txn, int flags) -{ - int err; - DB_TXN *parent_txn = NULL; - - DBTxnObject* self = PyObject_New(DBTxnObject, &DBTxn_Type); - if (self == NULL) - return NULL; - - self->in_weakreflist = NULL; - self->children_txns = NULL; - self->children_dbs = NULL; - self->children_cursors = NULL; - self->children_sequences = NULL; - self->flag_prepare = 0; - self->parent_txn = NULL; - self->env = NULL; - /* We initialize just in case "txn_begin" fails */ - self->txn = NULL; - - if (parent && ((PyObject *)parent!=Py_None)) { - parent_txn = parent->txn; - } - - if (txn) { - self->txn = txn; - } else { - MYDB_BEGIN_ALLOW_THREADS; - err = myenv->db_env->txn_begin(myenv->db_env, parent_txn, &(self->txn), flags); - MYDB_END_ALLOW_THREADS; - - if (makeDBError(err)) { - /* Free object half initialized */ - Py_DECREF(self); - return NULL; - } - } - - /* Can't use 'parent' because could be 'parent==Py_None' */ - if (parent_txn) { - self->parent_txn = parent; - Py_INCREF(parent); - self->env = NULL; - INSERT_IN_DOUBLE_LINKED_LIST(parent->children_txns, self); - } else { - self->parent_txn = NULL; - Py_INCREF(myenv); - self->env = myenv; - INSERT_IN_DOUBLE_LINKED_LIST(myenv->children_txns, self); - } - - return self; -} - -/* Forward declaration */ -static PyObject * -DBTxn_abort_discard_internal(DBTxnObject* self, int discard); - -static void -DBTxn_dealloc(DBTxnObject* self) -{ - PyObject *dummy; - - if (self->txn) { - int flag_prepare = self->flag_prepare; - - dummy=DBTxn_abort_discard_internal(self, 0); - /* - ** Raising exceptions while doing - ** garbage collection is a fatal error. - */ - if (dummy) - Py_DECREF(dummy); - else - PyErr_Clear(); - - if (!flag_prepare) { - PyErr_Warn(PyExc_RuntimeWarning, - "DBTxn aborted in destructor. No prior commit() or abort()."); - } - } - - if (self->in_weakreflist != NULL) { - PyObject_ClearWeakRefs((PyObject *) self); - } - - if (self->env) { - Py_DECREF(self->env); - } else { - /* - ** We can have "self->env==NULL" and "self->parent_txn==NULL" - ** if something happens when creating the transaction object - ** and we abort the object while half done. - */ - Py_XDECREF(self->parent_txn); - } - PyObject_Del(self); -} - - -static DBLockObject* -newDBLockObject(DBEnvObject* myenv, u_int32_t locker, DBT* obj, - db_lockmode_t lock_mode, int flags) -{ - int err; - DBLockObject* self = PyObject_New(DBLockObject, &DBLock_Type); - if (self == NULL) - return NULL; - self->in_weakreflist = NULL; - self->lock_initialized = 0; /* Just in case the call fails */ - - MYDB_BEGIN_ALLOW_THREADS; - err = myenv->db_env->lock_get(myenv->db_env, locker, flags, obj, lock_mode, - &self->lock); - MYDB_END_ALLOW_THREADS; - if (makeDBError(err)) { - Py_DECREF(self); - self = NULL; - } else { - self->lock_initialized = 1; - } - - return self; -} - - -static void -DBLock_dealloc(DBLockObject* self) -{ - if (self->in_weakreflist != NULL) { - PyObject_ClearWeakRefs((PyObject *) self); - } - /* TODO: is this lock held? should we release it? */ - /* CAUTION: The lock can be not initialized if the creation has failed */ - - PyObject_Del(self); -} - - -#if (DBVER >= 43) -static DBSequenceObject* -newDBSequenceObject(DBObject* mydb, int flags) -{ - int err; - DBSequenceObject* self = PyObject_New(DBSequenceObject, &DBSequence_Type); - if (self == NULL) - return NULL; - Py_INCREF(mydb); - self->mydb = mydb; - - INSERT_IN_DOUBLE_LINKED_LIST(self->mydb->children_sequences,self); - self->txn = NULL; - - self->in_weakreflist = NULL; - self->sequence = NULL; /* Just in case the call fails */ - - MYDB_BEGIN_ALLOW_THREADS; - err = db_sequence_create(&self->sequence, self->mydb->db, flags); - MYDB_END_ALLOW_THREADS; - if (makeDBError(err)) { - Py_DECREF(self); - self = NULL; - } - - return self; -} - -/* Forward declaration */ -static PyObject -*DBSequence_close_internal(DBSequenceObject* self, int flags, int do_not_close); - -static void -DBSequence_dealloc(DBSequenceObject* self) -{ - PyObject *dummy; - - if (self->sequence != NULL) { - dummy=DBSequence_close_internal(self,0,0); - /* - ** Raising exceptions while doing - ** garbage collection is a fatal error. - */ - if (dummy) - Py_DECREF(dummy); - else - PyErr_Clear(); - } - - if (self->in_weakreflist != NULL) { - PyObject_ClearWeakRefs((PyObject *) self); - } - - Py_DECREF(self->mydb); - PyObject_Del(self); -} -#endif - -/* --------------------------------------------------------------------- */ -/* DB methods */ - -static PyObject* -DB_append(DBObject* self, PyObject* args, PyObject* kwargs) -{ - PyObject* txnobj = NULL; - PyObject* dataobj; - db_recno_t recno; - DBT key, data; - DB_TXN *txn = NULL; - static char* kwnames[] = { "data", "txn", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O:append", kwnames, - &dataobj, &txnobj)) - return NULL; - - CHECK_DB_NOT_CLOSED(self); - - /* make a dummy key out of a recno */ - recno = 0; - CLEAR_DBT(key); - key.data = &recno; - key.size = sizeof(recno); - key.ulen = key.size; - key.flags = DB_DBT_USERMEM; - - if (!make_dbt(dataobj, &data)) return NULL; - if (!checkTxnObj(txnobj, &txn)) return NULL; - - if (-1 == _DB_put(self, txn, &key, &data, DB_APPEND)) - return NULL; - - return NUMBER_FromLong(recno); -} - - -static int -_db_associateCallback(DB* db, const DBT* priKey, const DBT* priData, - DBT* secKey) -{ - int retval = DB_DONOTINDEX; - DBObject* secondaryDB = (DBObject*)db->app_private; - PyObject* callback = secondaryDB->associateCallback; - int type = secondaryDB->primaryDBType; - PyObject* args; - PyObject* result = NULL; - - - if (callback != NULL) { - MYDB_BEGIN_BLOCK_THREADS; - - if (type == DB_RECNO || type == DB_QUEUE) - args = BuildValue_LS(*((db_recno_t*)priKey->data), priData->data, priData->size); - else - args = BuildValue_SS(priKey->data, priKey->size, priData->data, priData->size); - if (args != NULL) { - result = PyEval_CallObject(callback, args); - } - if (args == NULL || result == NULL) { - PyErr_Print(); - } - else if (result == Py_None) { - retval = DB_DONOTINDEX; - } - else if (NUMBER_Check(result)) { - retval = NUMBER_AsLong(result); - } - else if (PyBytes_Check(result)) { - char* data; - Py_ssize_t size; - - CLEAR_DBT(*secKey); - PyBytes_AsStringAndSize(result, &data, &size); - secKey->flags = DB_DBT_APPMALLOC; /* DB will free */ - secKey->data = malloc(size); /* TODO, check this */ - if (secKey->data) { - memcpy(secKey->data, data, size); - secKey->size = size; - retval = 0; - } - else { - PyErr_SetString(PyExc_MemoryError, - "malloc failed in _db_associateCallback"); - PyErr_Print(); - } - } -#if (DBVER >= 46) - else if (PyList_Check(result)) - { - char* data; - Py_ssize_t size; - int i, listlen; - DBT* dbts; - - listlen = PyList_Size(result); - - dbts = (DBT *)malloc(sizeof(DBT) * listlen); - - for (i=0; i<listlen; i++) - { - if (!PyBytes_Check(PyList_GetItem(result, i))) - { - PyErr_SetString( - PyExc_TypeError, -#if (PY_VERSION_HEX < 0x03000000) -"The list returned by DB->associate callback should be a list of strings."); -#else -"The list returned by DB->associate callback should be a list of bytes."); -#endif - PyErr_Print(); - } - - PyBytes_AsStringAndSize( - PyList_GetItem(result, i), - &data, &size); - - CLEAR_DBT(dbts[i]); - dbts[i].data = malloc(size); /* TODO, check this */ - - if (dbts[i].data) - { - memcpy(dbts[i].data, data, size); - dbts[i].size = size; - dbts[i].ulen = dbts[i].size; - dbts[i].flags = DB_DBT_APPMALLOC; /* DB will free */ - } - else - { - PyErr_SetString(PyExc_MemoryError, - "malloc failed in _db_associateCallback (list)"); - PyErr_Print(); - } - } - - CLEAR_DBT(*secKey); - - secKey->data = dbts; - secKey->size = listlen; - secKey->flags = DB_DBT_APPMALLOC | DB_DBT_MULTIPLE; - retval = 0; - } -#endif - else { - PyErr_SetString( - PyExc_TypeError, -#if (PY_VERSION_HEX < 0x03000000) -"DB associate callback should return DB_DONOTINDEX/string/list of strings."); -#else -"DB associate callback should return DB_DONOTINDEX/bytes/list of bytes."); -#endif - PyErr_Print(); - } - - Py_XDECREF(args); - Py_XDECREF(result); - - MYDB_END_BLOCK_THREADS; - } - return retval; -} - - -static PyObject* -DB_associate(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags=0; - DBObject* secondaryDB; - PyObject* callback; - PyObject *txnobj = NULL; - DB_TXN *txn = NULL; - static char* kwnames[] = {"secondaryDB", "callback", "flags", "txn", - NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iO:associate", kwnames, - &secondaryDB, &callback, &flags, - &txnobj)) { - return NULL; - } - - if (!checkTxnObj(txnobj, &txn)) return NULL; - - CHECK_DB_NOT_CLOSED(self); - if (!DBObject_Check(secondaryDB)) { - makeTypeError("DB", (PyObject*)secondaryDB); - return NULL; - } - CHECK_DB_NOT_CLOSED(secondaryDB); - if (callback == Py_None) { - callback = NULL; - } - else if (!PyCallable_Check(callback)) { - makeTypeError("Callable", callback); - return NULL; - } - - /* Save a reference to the callback in the secondary DB. */ - Py_XDECREF(secondaryDB->associateCallback); - Py_XINCREF(callback); - secondaryDB->associateCallback = callback; - secondaryDB->primaryDBType = _DB_get_type(self); - - /* PyEval_InitThreads is called here due to a quirk in python 1.5 - * - 2.2.1 (at least) according to Russell Williamson <merel@wt.net>: - * The global interepreter lock is not initialized until the first - * thread is created using thread.start_new_thread() or fork() is - * called. that would cause the ALLOW_THREADS here to segfault due - * to a null pointer reference if no threads or child processes - * have been created. This works around that and is a no-op if - * threads have already been initialized. - * (see pybsddb-users mailing list post on 2002-08-07) - */ -#ifdef WITH_THREAD - PyEval_InitThreads(); -#endif - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->associate(self->db, - txn, - secondaryDB->db, - _db_associateCallback, - flags); - MYDB_END_ALLOW_THREADS; - - if (err) { - Py_XDECREF(secondaryDB->associateCallback); - secondaryDB->associateCallback = NULL; - secondaryDB->primaryDBType = 0; - } - - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DB_close_internal(DBObject* self, int flags, int do_not_close) -{ - PyObject *dummy; - int err = 0; - - if (self->db != NULL) { - /* Can be NULL if db is not in an environment */ - EXTRACT_FROM_DOUBLE_LINKED_LIST_MAYBE_NULL(self); - - if (self->txn) { - EXTRACT_FROM_DOUBLE_LINKED_LIST_TXN(self); - self->txn=NULL; - } - - while(self->children_cursors) { - dummy=DBC_close_internal(self->children_cursors); - Py_XDECREF(dummy); - } - -#if (DBVER >= 43) - while(self->children_sequences) { - dummy=DBSequence_close_internal(self->children_sequences,0,0); - Py_XDECREF(dummy); - } -#endif - - /* - ** "do_not_close" is used to dispose all related objects in the - ** tree, without actually releasing the "root" object. - ** This is done, for example, because function calls like - ** "DB.verify()" implicitly close the underlying handle. So - ** the handle doesn't need to be closed, but related objects - ** must be cleaned up. - */ - if (!do_not_close) { - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->close(self->db, flags); - MYDB_END_ALLOW_THREADS; - self->db = NULL; - } - RETURN_IF_ERR(); - } - RETURN_NONE(); -} - -static PyObject* -DB_close(DBObject* self, PyObject* args) -{ - int flags=0; - if (!PyArg_ParseTuple(args,"|i:close", &flags)) - return NULL; - return DB_close_internal(self, flags, 0); -} - - -static PyObject* -_DB_consume(DBObject* self, PyObject* args, PyObject* kwargs, int consume_flag) -{ - int err, flags=0, type; - PyObject* txnobj = NULL; - PyObject* retval = NULL; - DBT key, data; - DB_TXN *txn = NULL; - static char* kwnames[] = { "txn", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:consume", kwnames, - &txnobj, &flags)) - return NULL; - - CHECK_DB_NOT_CLOSED(self); - type = _DB_get_type(self); - if (type == -1) - return NULL; - if (type != DB_QUEUE) { - PyErr_SetString(PyExc_TypeError, - "Consume methods only allowed for Queue DB's"); - return NULL; - } - if (!checkTxnObj(txnobj, &txn)) - return NULL; - - CLEAR_DBT(key); - CLEAR_DBT(data); - if (CHECK_DBFLAG(self, DB_THREAD)) { - /* Tell Berkeley DB to malloc the return value (thread safe) */ - data.flags = DB_DBT_MALLOC; - key.flags = DB_DBT_MALLOC; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get(self->db, txn, &key, &data, flags|consume_flag); - MYDB_END_ALLOW_THREADS; - - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->moduleFlags.getReturnsNone) { - err = 0; - Py_INCREF(Py_None); - retval = Py_None; - } - else if (!err) { - retval = BuildValue_SS(key.data, key.size, data.data, data.size); - FREE_DBT(key); - FREE_DBT(data); - } - - RETURN_IF_ERR(); - return retval; -} - -static PyObject* -DB_consume(DBObject* self, PyObject* args, PyObject* kwargs, int consume_flag) -{ - return _DB_consume(self, args, kwargs, DB_CONSUME); -} - -static PyObject* -DB_consume_wait(DBObject* self, PyObject* args, PyObject* kwargs, - int consume_flag) -{ - return _DB_consume(self, args, kwargs, DB_CONSUME_WAIT); -} - - -static PyObject* -DB_cursor(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags=0; - DBC* dbc; - PyObject* txnobj = NULL; - DB_TXN *txn = NULL; - static char* kwnames[] = { "txn", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:cursor", kwnames, - &txnobj, &flags)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - if (!checkTxnObj(txnobj, &txn)) - return NULL; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->cursor(self->db, txn, &dbc, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return (PyObject*) newDBCursorObject(dbc, (DBTxnObject *)txnobj, self); -} - - -static PyObject* -DB_delete(DBObject* self, PyObject* args, PyObject* kwargs) -{ - PyObject* txnobj = NULL; - int flags = 0; - PyObject* keyobj; - DBT key; - DB_TXN *txn = NULL; - static char* kwnames[] = { "key", "txn", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|Oi:delete", kwnames, - &keyobj, &txnobj, &flags)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - if (!make_key_dbt(self, keyobj, &key, NULL)) - return NULL; - if (!checkTxnObj(txnobj, &txn)) { - FREE_DBT(key); - return NULL; - } - - if (-1 == _DB_delete(self, txn, &key, 0)) { - FREE_DBT(key); - return NULL; - } - - FREE_DBT(key); - RETURN_NONE(); -} - - -#if (DBVER >= 47) -/* -** This function is available since Berkeley DB 4.4, -** but 4.6 version is so buggy that we only support -** it from BDB 4.7 and newer. -*/ -static PyObject* -DB_compact(DBObject* self, PyObject* args, PyObject* kwargs) -{ - PyObject* txnobj = NULL; - PyObject *startobj = NULL, *stopobj = NULL; - int flags = 0; - DB_TXN *txn = NULL; - DBT *start_p = NULL, *stop_p = NULL; - DBT start, stop; - int err; - DB_COMPACT c_data = { 0 }; - static char* kwnames[] = { "txn", "start", "stop", "flags", - "compact_fillpercent", "compact_pages", - "compact_timeout", NULL }; - - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOOiiiI:compact", kwnames, - &txnobj, &startobj, &stopobj, &flags, - &c_data.compact_fillpercent, - &c_data.compact_pages, - &c_data.compact_timeout)) - return NULL; - - CHECK_DB_NOT_CLOSED(self); - if (!checkTxnObj(txnobj, &txn)) { - return NULL; - } - - if (startobj && make_key_dbt(self, startobj, &start, NULL)) { - start_p = &start; - } - if (stopobj && make_key_dbt(self, stopobj, &stop, NULL)) { - stop_p = &stop; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->compact(self->db, txn, start_p, stop_p, &c_data, - flags, NULL); - MYDB_END_ALLOW_THREADS; - - if (startobj) - FREE_DBT(start); - if (stopobj) - FREE_DBT(stop); - - RETURN_IF_ERR(); - - return PyLong_FromUnsignedLong(c_data.compact_pages_truncated); -} -#endif - - -static PyObject* -DB_fd(DBObject* self) -{ - int err, the_fd; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->fd(self->db, &the_fd); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(the_fd); -} - - -#if (DBVER >= 46) -static PyObject* -DB_exists(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags=0; - PyObject* txnobj = NULL; - PyObject* keyobj; - DBT key; - DB_TXN *txn; - - static char* kwnames[] = {"key", "txn", "flags", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|Oi:exists", kwnames, - &keyobj, &txnobj, &flags)) - return NULL; - - CHECK_DB_NOT_CLOSED(self); - if (!make_key_dbt(self, keyobj, &key, NULL)) - return NULL; - if (!checkTxnObj(txnobj, &txn)) { - FREE_DBT(key); - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->exists(self->db, txn, &key, flags); - MYDB_END_ALLOW_THREADS; - - FREE_DBT(key); - - if (!err) { - Py_INCREF(Py_True); - return Py_True; - } - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)) { - Py_INCREF(Py_False); - return Py_False; - } - - /* - ** If we reach there, there was an error. The - ** "return" should be unreachable. - */ - RETURN_IF_ERR(); - assert(0); /* This coude SHOULD be unreachable */ - return NULL; -} -#endif - -static PyObject* -DB_get(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags=0; - PyObject* txnobj = NULL; - PyObject* keyobj; - PyObject* dfltobj = NULL; - PyObject* retval = NULL; - int dlen = -1; - int doff = -1; - DBT key, data; - DB_TXN *txn = NULL; - static char* kwnames[] = {"key", "default", "txn", "flags", "dlen", - "doff", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOiii:get", kwnames, - &keyobj, &dfltobj, &txnobj, &flags, &dlen, - &doff)) - return NULL; - - CHECK_DB_NOT_CLOSED(self); - if (!make_key_dbt(self, keyobj, &key, &flags)) - return NULL; - if (!checkTxnObj(txnobj, &txn)) { - FREE_DBT(key); - return NULL; - } - - CLEAR_DBT(data); - if (CHECK_DBFLAG(self, DB_THREAD)) { - /* Tell Berkeley DB to malloc the return value (thread safe) */ - data.flags = DB_DBT_MALLOC; - } - if (!add_partial_dbt(&data, dlen, doff)) { - FREE_DBT(key); - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get(self->db, txn, &key, &data, flags); - MYDB_END_ALLOW_THREADS; - - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) && (dfltobj != NULL)) { - err = 0; - Py_INCREF(dfltobj); - retval = dfltobj; - } - else if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->moduleFlags.getReturnsNone) { - err = 0; - Py_INCREF(Py_None); - retval = Py_None; - } - else if (!err) { - if (flags & DB_SET_RECNO) /* return both key and data */ - retval = BuildValue_SS(key.data, key.size, data.data, data.size); - else /* return just the data */ - retval = Build_PyString(data.data, data.size); - FREE_DBT(data); - } - FREE_DBT(key); - - RETURN_IF_ERR(); - return retval; -} - -static PyObject* -DB_pget(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags=0; - PyObject* txnobj = NULL; - PyObject* keyobj; - PyObject* dfltobj = NULL; - PyObject* retval = NULL; - int dlen = -1; - int doff = -1; - DBT key, pkey, data; - DB_TXN *txn = NULL; - static char* kwnames[] = {"key", "default", "txn", "flags", "dlen", - "doff", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOiii:pget", kwnames, - &keyobj, &dfltobj, &txnobj, &flags, &dlen, - &doff)) - return NULL; - - CHECK_DB_NOT_CLOSED(self); - if (!make_key_dbt(self, keyobj, &key, &flags)) - return NULL; - if (!checkTxnObj(txnobj, &txn)) { - FREE_DBT(key); - return NULL; - } - - CLEAR_DBT(data); - if (CHECK_DBFLAG(self, DB_THREAD)) { - /* Tell Berkeley DB to malloc the return value (thread safe) */ - data.flags = DB_DBT_MALLOC; - } - if (!add_partial_dbt(&data, dlen, doff)) { - FREE_DBT(key); - return NULL; - } - - CLEAR_DBT(pkey); - pkey.flags = DB_DBT_MALLOC; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->pget(self->db, txn, &key, &pkey, &data, flags); - MYDB_END_ALLOW_THREADS; - - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) && (dfltobj != NULL)) { - err = 0; - Py_INCREF(dfltobj); - retval = dfltobj; - } - else if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->moduleFlags.getReturnsNone) { - err = 0; - Py_INCREF(Py_None); - retval = Py_None; - } - else if (!err) { - PyObject *pkeyObj; - PyObject *dataObj; - dataObj = Build_PyString(data.data, data.size); - - if (self->primaryDBType == DB_RECNO || - self->primaryDBType == DB_QUEUE) - pkeyObj = NUMBER_FromLong(*(int *)pkey.data); - else - pkeyObj = Build_PyString(pkey.data, pkey.size); - - if (flags & DB_SET_RECNO) /* return key , pkey and data */ - { - PyObject *keyObj; - int type = _DB_get_type(self); - if (type == DB_RECNO || type == DB_QUEUE) - keyObj = NUMBER_FromLong(*(int *)key.data); - else - keyObj = Build_PyString(key.data, key.size); -#if (PY_VERSION_HEX >= 0x02040000) - retval = PyTuple_Pack(3, keyObj, pkeyObj, dataObj); -#else - retval = Py_BuildValue("OOO", keyObj, pkeyObj, dataObj); -#endif - Py_DECREF(keyObj); - } - else /* return just the pkey and data */ - { -#if (PY_VERSION_HEX >= 0x02040000) - retval = PyTuple_Pack(2, pkeyObj, dataObj); -#else - retval = Py_BuildValue("OO", pkeyObj, dataObj); -#endif - } - Py_DECREF(dataObj); - Py_DECREF(pkeyObj); - FREE_DBT(pkey); - FREE_DBT(data); - } - FREE_DBT(key); - - RETURN_IF_ERR(); - return retval; -} - - -/* Return size of entry */ -static PyObject* -DB_get_size(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags=0; - PyObject* txnobj = NULL; - PyObject* keyobj; - PyObject* retval = NULL; - DBT key, data; - DB_TXN *txn = NULL; - static char* kwnames[] = { "key", "txn", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O:get_size", kwnames, - &keyobj, &txnobj)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - if (!make_key_dbt(self, keyobj, &key, &flags)) - return NULL; - if (!checkTxnObj(txnobj, &txn)) { - FREE_DBT(key); - return NULL; - } - CLEAR_DBT(data); - - /* We don't allocate any memory, forcing a DB_BUFFER_SMALL error and - thus getting the record size. */ - data.flags = DB_DBT_USERMEM; - data.ulen = 0; - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get(self->db, txn, &key, &data, flags); - MYDB_END_ALLOW_THREADS; - if (err == DB_BUFFER_SMALL) { - retval = NUMBER_FromLong((long)data.size); - err = 0; - } - - FREE_DBT(key); - FREE_DBT(data); - RETURN_IF_ERR(); - return retval; -} - - -static PyObject* -DB_get_both(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags=0; - PyObject* txnobj = NULL; - PyObject* keyobj; - PyObject* dataobj; - PyObject* retval = NULL; - DBT key, data; - void *orig_data; - DB_TXN *txn = NULL; - static char* kwnames[] = { "key", "data", "txn", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|Oi:get_both", kwnames, - &keyobj, &dataobj, &txnobj, &flags)) - return NULL; - - CHECK_DB_NOT_CLOSED(self); - if (!make_key_dbt(self, keyobj, &key, NULL)) - return NULL; - if ( !make_dbt(dataobj, &data) || - !checkTxnObj(txnobj, &txn) ) - { - FREE_DBT(key); - return NULL; - } - - flags |= DB_GET_BOTH; - orig_data = data.data; - - if (CHECK_DBFLAG(self, DB_THREAD)) { - /* Tell Berkeley DB to malloc the return value (thread safe) */ - /* XXX(nnorwitz): At least 4.4.20 and 4.5.20 require this flag. */ - data.flags = DB_DBT_MALLOC; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get(self->db, txn, &key, &data, flags); - MYDB_END_ALLOW_THREADS; - - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->moduleFlags.getReturnsNone) { - err = 0; - Py_INCREF(Py_None); - retval = Py_None; - } - else if (!err) { - /* XXX(nnorwitz): can we do: retval = dataobj; Py_INCREF(retval); */ - retval = Build_PyString(data.data, data.size); - - /* Even though the flags require DB_DBT_MALLOC, data is not always - allocated. 4.4: allocated, 4.5: *not* allocated. :-( */ - if (data.data != orig_data) - FREE_DBT(data); - } - - FREE_DBT(key); - RETURN_IF_ERR(); - return retval; -} - - -static PyObject* -DB_get_byteswapped(DBObject* self) -{ - int err = 0; - int retval = -1; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_byteswapped(self->db, &retval); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(retval); -} - - -static PyObject* -DB_get_type(DBObject* self) -{ - int type; - - CHECK_DB_NOT_CLOSED(self); - - type = _DB_get_type(self); - if (type == -1) - return NULL; - return NUMBER_FromLong(type); -} - - -static PyObject* -DB_join(DBObject* self, PyObject* args) -{ - int err, flags=0; - int length, x; - PyObject* cursorsObj; - DBC** cursors; - DBC* dbc; - - if (!PyArg_ParseTuple(args,"O|i:join", &cursorsObj, &flags)) - return NULL; - - CHECK_DB_NOT_CLOSED(self); - - if (!PySequence_Check(cursorsObj)) { - PyErr_SetString(PyExc_TypeError, - "Sequence of DBCursor objects expected"); - return NULL; - } - - length = PyObject_Length(cursorsObj); - cursors = malloc((length+1) * sizeof(DBC*)); - if (!cursors) { - PyErr_NoMemory(); - return NULL; - } - - cursors[length] = NULL; - for (x=0; x<length; x++) { - PyObject* item = PySequence_GetItem(cursorsObj, x); - if (item == NULL) { - free(cursors); - return NULL; - } - if (!DBCursorObject_Check(item)) { - PyErr_SetString(PyExc_TypeError, - "Sequence of DBCursor objects expected"); - free(cursors); - return NULL; - } - cursors[x] = ((DBCursorObject*)item)->dbc; - Py_DECREF(item); - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->join(self->db, cursors, &dbc, flags); - MYDB_END_ALLOW_THREADS; - free(cursors); - RETURN_IF_ERR(); - - /* FIXME: this is a buggy interface. The returned cursor - contains internal references to the passed in cursors - but does not hold python references to them or prevent - them from being closed prematurely. This can cause - python to crash when things are done in the wrong order. */ - return (PyObject*) newDBCursorObject(dbc, NULL, self); -} - - -static PyObject* -DB_key_range(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags=0; - PyObject* txnobj = NULL; - PyObject* keyobj; - DBT key; - DB_TXN *txn = NULL; - DB_KEY_RANGE range; - static char* kwnames[] = { "key", "txn", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|Oi:key_range", kwnames, - &keyobj, &txnobj, &flags)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - if (!make_dbt(keyobj, &key)) - /* BTree only, don't need to allow for an int key */ - return NULL; - if (!checkTxnObj(txnobj, &txn)) - return NULL; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->key_range(self->db, txn, &key, &range, flags); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - return Py_BuildValue("ddd", range.less, range.equal, range.greater); -} - - -static PyObject* -DB_open(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, type = DB_UNKNOWN, flags=0, mode=0660; - char* filename = NULL; - char* dbname = NULL; - PyObject *txnobj = NULL; - DB_TXN *txn = NULL; - /* with dbname */ - static char* kwnames[] = { - "filename", "dbname", "dbtype", "flags", "mode", "txn", NULL}; - /* without dbname */ - static char* kwnames_basic[] = { - "filename", "dbtype", "flags", "mode", "txn", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "z|ziiiO:open", kwnames, - &filename, &dbname, &type, &flags, &mode, - &txnobj)) - { - PyErr_Clear(); - type = DB_UNKNOWN; flags = 0; mode = 0660; - filename = NULL; dbname = NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwargs,"z|iiiO:open", - kwnames_basic, - &filename, &type, &flags, &mode, - &txnobj)) - return NULL; - } - - if (!checkTxnObj(txnobj, &txn)) return NULL; - - if (NULL == self->db) { - PyObject *t = Py_BuildValue("(is)", 0, - "Cannot call open() twice for DB object"); - if (t) { - PyErr_SetObject(DBError, t); - Py_DECREF(t); - } - return NULL; - } - - if (txn) { /* Can't use 'txnobj' because could be 'txnobj==Py_None' */ - INSERT_IN_DOUBLE_LINKED_LIST_TXN(((DBTxnObject *)txnobj)->children_dbs,self); - self->txn=(DBTxnObject *)txnobj; - } else { - self->txn=NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->open(self->db, txn, filename, dbname, type, flags, mode); - MYDB_END_ALLOW_THREADS; - - if (makeDBError(err)) { - PyObject *dummy; - - dummy=DB_close_internal(self, 0, 0); - Py_XDECREF(dummy); - return NULL; - } - -#if (DBVER >= 42) - self->db->get_flags(self->db, &self->setflags); -#endif - - self->flags = flags; - - RETURN_NONE(); -} - - -static PyObject* -DB_put(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int flags=0; - PyObject* txnobj = NULL; - int dlen = -1; - int doff = -1; - PyObject* keyobj, *dataobj, *retval; - DBT key, data; - DB_TXN *txn = NULL; - static char* kwnames[] = { "key", "data", "txn", "flags", "dlen", - "doff", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|Oiii:put", kwnames, - &keyobj, &dataobj, &txnobj, &flags, &dlen, &doff)) - return NULL; - - CHECK_DB_NOT_CLOSED(self); - if (!make_key_dbt(self, keyobj, &key, NULL)) - return NULL; - if ( !make_dbt(dataobj, &data) || - !add_partial_dbt(&data, dlen, doff) || - !checkTxnObj(txnobj, &txn) ) - { - FREE_DBT(key); - return NULL; - } - - if (-1 == _DB_put(self, txn, &key, &data, flags)) { - FREE_DBT(key); - return NULL; - } - - if (flags & DB_APPEND) - retval = NUMBER_FromLong(*((db_recno_t*)key.data)); - else { - retval = Py_None; - Py_INCREF(retval); - } - FREE_DBT(key); - return retval; -} - - - -static PyObject* -DB_remove(DBObject* self, PyObject* args, PyObject* kwargs) -{ - char* filename; - char* database = NULL; - int err, flags=0; - static char* kwnames[] = { "filename", "dbname", "flags", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|zi:remove", kwnames, - &filename, &database, &flags)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - EXTRACT_FROM_DOUBLE_LINKED_LIST_MAYBE_NULL(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->remove(self->db, filename, database, flags); - MYDB_END_ALLOW_THREADS; - - self->db = NULL; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - - -static PyObject* -DB_rename(DBObject* self, PyObject* args) -{ - char* filename; - char* database; - char* newname; - int err, flags=0; - - if (!PyArg_ParseTuple(args, "sss|i:rename", &filename, &database, &newname, - &flags)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->rename(self->db, filename, database, newname, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DB_get_private(DBObject* self) -{ - /* We can give out the private field even if db is closed */ - Py_INCREF(self->private_obj); - return self->private_obj; -} - -static PyObject* -DB_set_private(DBObject* self, PyObject* private_obj) -{ - /* We can set the private field even if db is closed */ - Py_DECREF(self->private_obj); - Py_INCREF(private_obj); - self->private_obj = private_obj; - RETURN_NONE(); -} - -#if (DBVER >= 46) -static PyObject* -DB_set_priority(DBObject* self, PyObject* args) -{ - int err, priority; - - if (!PyArg_ParseTuple(args,"i:set_priority", &priority)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_priority(self->db, priority); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DB_get_priority(DBObject* self) -{ - int err = 0; - DB_CACHE_PRIORITY priority; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_priority(self->db, &priority); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(priority); -} -#endif - -static PyObject* -DB_set_q_extentsize(DBObject* self, PyObject* args) -{ - int err; - u_int32_t extentsize; - - if (!PyArg_ParseTuple(args,"i:set_q_extentsize", &extentsize)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_q_extentsize(self->db, extentsize); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_q_extentsize(DBObject* self) -{ - int err = 0; - u_int32_t extentsize; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_q_extentsize(self->db, &extentsize); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(extentsize); -} -#endif - -static PyObject* -DB_set_bt_minkey(DBObject* self, PyObject* args) -{ - int err, minkey; - - if (!PyArg_ParseTuple(args,"i:set_bt_minkey", &minkey)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_bt_minkey(self->db, minkey); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_bt_minkey(DBObject* self) -{ - int err; - u_int32_t bt_minkey; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_bt_minkey(self->db, &bt_minkey); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(bt_minkey); -} -#endif - -static int -_default_cmp(const DBT *leftKey, - const DBT *rightKey) -{ - int res; - int lsize = leftKey->size, rsize = rightKey->size; - - res = memcmp(leftKey->data, rightKey->data, - lsize < rsize ? lsize : rsize); - - if (res == 0) { - if (lsize < rsize) { - res = -1; - } - else if (lsize > rsize) { - res = 1; - } - } - return res; -} - -static int -_db_compareCallback(DB* db, - const DBT *leftKey, - const DBT *rightKey) -{ - int res = 0; - PyObject *args; - PyObject *result = NULL; - DBObject *self = (DBObject *)db->app_private; - - if (self == NULL || self->btCompareCallback == NULL) { - MYDB_BEGIN_BLOCK_THREADS; - PyErr_SetString(PyExc_TypeError, - (self == 0 - ? "DB_bt_compare db is NULL." - : "DB_bt_compare callback is NULL.")); - /* we're in a callback within the DB code, we can't raise */ - PyErr_Print(); - res = _default_cmp(leftKey, rightKey); - MYDB_END_BLOCK_THREADS; - } else { - MYDB_BEGIN_BLOCK_THREADS; - - args = BuildValue_SS(leftKey->data, leftKey->size, rightKey->data, rightKey->size); - if (args != NULL) { - result = PyEval_CallObject(self->btCompareCallback, args); - } - if (args == NULL || result == NULL) { - /* we're in a callback within the DB code, we can't raise */ - PyErr_Print(); - res = _default_cmp(leftKey, rightKey); - } else if (NUMBER_Check(result)) { - res = NUMBER_AsLong(result); - } else { - PyErr_SetString(PyExc_TypeError, - "DB_bt_compare callback MUST return an int."); - /* we're in a callback within the DB code, we can't raise */ - PyErr_Print(); - res = _default_cmp(leftKey, rightKey); - } - - Py_XDECREF(args); - Py_XDECREF(result); - - MYDB_END_BLOCK_THREADS; - } - return res; -} - -static PyObject* -DB_set_bt_compare(DBObject* self, PyObject* comparator) -{ - int err; - PyObject *tuple, *result; - - CHECK_DB_NOT_CLOSED(self); - - if (!PyCallable_Check(comparator)) { - makeTypeError("Callable", comparator); - return NULL; - } - - /* - * Perform a test call of the comparator function with two empty - * string objects here. verify that it returns an int (0). - * err if not. - */ - tuple = Py_BuildValue("(ss)", "", ""); - result = PyEval_CallObject(comparator, tuple); - Py_DECREF(tuple); - if (result == NULL) - return NULL; - if (!NUMBER_Check(result)) { - Py_DECREF(result); - PyErr_SetString(PyExc_TypeError, - "callback MUST return an int"); - return NULL; - } else if (NUMBER_AsLong(result) != 0) { - Py_DECREF(result); - PyErr_SetString(PyExc_TypeError, - "callback failed to return 0 on two empty strings"); - return NULL; - } - Py_DECREF(result); - - /* We don't accept multiple set_bt_compare operations, in order to - * simplify the code. This would have no real use, as one cannot - * change the function once the db is opened anyway */ - if (self->btCompareCallback != NULL) { - PyErr_SetString(PyExc_RuntimeError, "set_bt_compare() cannot be called more than once"); - return NULL; - } - - Py_INCREF(comparator); - self->btCompareCallback = comparator; - - /* This is to workaround a problem with un-initialized threads (see - comment in DB_associate) */ -#ifdef WITH_THREAD - PyEval_InitThreads(); -#endif - - err = self->db->set_bt_compare(self->db, _db_compareCallback); - - if (err) { - /* restore the old state in case of error */ - Py_DECREF(comparator); - self->btCompareCallback = NULL; - } - - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DB_set_cachesize(DBObject* self, PyObject* args) -{ - int err; - int gbytes = 0, bytes = 0, ncache = 0; - - if (!PyArg_ParseTuple(args,"ii|i:set_cachesize", - &gbytes,&bytes,&ncache)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_cachesize(self->db, gbytes, bytes, ncache); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_cachesize(DBObject* self) -{ - int err; - u_int32_t gbytes, bytes; - int ncache; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_cachesize(self->db, &gbytes, &bytes, &ncache); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return Py_BuildValue("(iii)", gbytes, bytes, ncache); -} -#endif - -static PyObject* -DB_set_flags(DBObject* self, PyObject* args) -{ - int err, flags; - - if (!PyArg_ParseTuple(args,"i:set_flags", &flags)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_flags(self->db, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - self->setflags |= flags; - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_flags(DBObject* self) -{ - int err; - u_int32_t flags; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_flags(self->db, &flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(flags); -} -#endif - -static PyObject* -DB_set_h_ffactor(DBObject* self, PyObject* args) -{ - int err, ffactor; - - if (!PyArg_ParseTuple(args,"i:set_h_ffactor", &ffactor)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_h_ffactor(self->db, ffactor); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_h_ffactor(DBObject* self) -{ - int err; - u_int32_t ffactor; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_h_ffactor(self->db, &ffactor); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(ffactor); -} -#endif - -static PyObject* -DB_set_h_nelem(DBObject* self, PyObject* args) -{ - int err, nelem; - - if (!PyArg_ParseTuple(args,"i:set_h_nelem", &nelem)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_h_nelem(self->db, nelem); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_h_nelem(DBObject* self) -{ - int err; - u_int32_t nelem; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_h_nelem(self->db, &nelem); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(nelem); -} -#endif - -static PyObject* -DB_set_lorder(DBObject* self, PyObject* args) -{ - int err, lorder; - - if (!PyArg_ParseTuple(args,"i:set_lorder", &lorder)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_lorder(self->db, lorder); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_lorder(DBObject* self) -{ - int err; - int lorder; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_lorder(self->db, &lorder); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(lorder); -} -#endif - -static PyObject* -DB_set_pagesize(DBObject* self, PyObject* args) -{ - int err, pagesize; - - if (!PyArg_ParseTuple(args,"i:set_pagesize", &pagesize)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_pagesize(self->db, pagesize); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_pagesize(DBObject* self) -{ - int err; - u_int32_t pagesize; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_pagesize(self->db, &pagesize); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(pagesize); -} -#endif - -static PyObject* -DB_set_re_delim(DBObject* self, PyObject* args) -{ - int err; - char delim; - - if (!PyArg_ParseTuple(args,"b:set_re_delim", &delim)) { - PyErr_Clear(); - if (!PyArg_ParseTuple(args,"c:set_re_delim", &delim)) - return NULL; - } - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_re_delim(self->db, delim); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_re_delim(DBObject* self) -{ - int err, re_delim; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_re_delim(self->db, &re_delim); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(re_delim); -} -#endif - -static PyObject* -DB_set_re_len(DBObject* self, PyObject* args) -{ - int err, len; - - if (!PyArg_ParseTuple(args,"i:set_re_len", &len)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_re_len(self->db, len); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_re_len(DBObject* self) -{ - int err; - u_int32_t re_len; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_re_len(self->db, &re_len); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(re_len); -} -#endif - -static PyObject* -DB_set_re_pad(DBObject* self, PyObject* args) -{ - int err; - char pad; - - if (!PyArg_ParseTuple(args,"b:set_re_pad", &pad)) { - PyErr_Clear(); - if (!PyArg_ParseTuple(args,"c:set_re_pad", &pad)) - return NULL; - } - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_re_pad(self->db, pad); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_re_pad(DBObject* self) -{ - int err, re_pad; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_re_pad(self->db, &re_pad); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(re_pad); -} -#endif - -static PyObject* -DB_set_re_source(DBObject* self, PyObject* args) -{ - int err; - char *source; - - if (!PyArg_ParseTuple(args,"s:set_re_source", &source)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_re_source(self->db, source); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_re_source(DBObject* self) -{ - int err; - const char *source; - - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_re_source(self->db, &source); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return PyBytes_FromString(source); -} -#endif - -static PyObject* -DB_stat(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags = 0, type; - void* sp; - PyObject* d; -#if (DBVER >= 43) - PyObject* txnobj = NULL; - DB_TXN *txn = NULL; - static char* kwnames[] = { "flags", "txn", NULL }; -#else - static char* kwnames[] = { "flags", NULL }; -#endif - -#if (DBVER >= 43) - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iO:stat", kwnames, - &flags, &txnobj)) - return NULL; - if (!checkTxnObj(txnobj, &txn)) - return NULL; -#else - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:stat", kwnames, &flags)) - return NULL; -#endif - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; -#if (DBVER >= 43) - err = self->db->stat(self->db, txn, &sp, flags); -#else - err = self->db->stat(self->db, &sp, flags); -#endif - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - /* Turn the stat structure into a dictionary */ - type = _DB_get_type(self); - if ((type == -1) || ((d = PyDict_New()) == NULL)) { - free(sp); - return NULL; - } - -#define MAKE_HASH_ENTRY(name) _addIntToDict(d, #name, ((DB_HASH_STAT*)sp)->hash_##name) -#define MAKE_BT_ENTRY(name) _addIntToDict(d, #name, ((DB_BTREE_STAT*)sp)->bt_##name) -#define MAKE_QUEUE_ENTRY(name) _addIntToDict(d, #name, ((DB_QUEUE_STAT*)sp)->qs_##name) - - switch (type) { - case DB_HASH: - MAKE_HASH_ENTRY(magic); - MAKE_HASH_ENTRY(version); - MAKE_HASH_ENTRY(nkeys); - MAKE_HASH_ENTRY(ndata); -#if (DBVER >= 46) - MAKE_HASH_ENTRY(pagecnt); -#endif - MAKE_HASH_ENTRY(pagesize); - MAKE_HASH_ENTRY(ffactor); - MAKE_HASH_ENTRY(buckets); - MAKE_HASH_ENTRY(free); - MAKE_HASH_ENTRY(bfree); - MAKE_HASH_ENTRY(bigpages); - MAKE_HASH_ENTRY(big_bfree); - MAKE_HASH_ENTRY(overflows); - MAKE_HASH_ENTRY(ovfl_free); - MAKE_HASH_ENTRY(dup); - MAKE_HASH_ENTRY(dup_free); - break; - - case DB_BTREE: - case DB_RECNO: - MAKE_BT_ENTRY(magic); - MAKE_BT_ENTRY(version); - MAKE_BT_ENTRY(nkeys); - MAKE_BT_ENTRY(ndata); -#if (DBVER >= 46) - MAKE_BT_ENTRY(pagecnt); -#endif - MAKE_BT_ENTRY(pagesize); - MAKE_BT_ENTRY(minkey); - MAKE_BT_ENTRY(re_len); - MAKE_BT_ENTRY(re_pad); - MAKE_BT_ENTRY(levels); - MAKE_BT_ENTRY(int_pg); - MAKE_BT_ENTRY(leaf_pg); - MAKE_BT_ENTRY(dup_pg); - MAKE_BT_ENTRY(over_pg); -#if (DBVER >= 43) - MAKE_BT_ENTRY(empty_pg); -#endif - MAKE_BT_ENTRY(free); - MAKE_BT_ENTRY(int_pgfree); - MAKE_BT_ENTRY(leaf_pgfree); - MAKE_BT_ENTRY(dup_pgfree); - MAKE_BT_ENTRY(over_pgfree); - break; - - case DB_QUEUE: - MAKE_QUEUE_ENTRY(magic); - MAKE_QUEUE_ENTRY(version); - MAKE_QUEUE_ENTRY(nkeys); - MAKE_QUEUE_ENTRY(ndata); - MAKE_QUEUE_ENTRY(pagesize); - MAKE_QUEUE_ENTRY(extentsize); - MAKE_QUEUE_ENTRY(pages); - MAKE_QUEUE_ENTRY(re_len); - MAKE_QUEUE_ENTRY(re_pad); - MAKE_QUEUE_ENTRY(pgfree); -#if (DBVER == 31) - MAKE_QUEUE_ENTRY(start); -#endif - MAKE_QUEUE_ENTRY(first_recno); - MAKE_QUEUE_ENTRY(cur_recno); - break; - - default: - PyErr_SetString(PyExc_TypeError, "Unknown DB type, unable to stat"); - Py_DECREF(d); - d = NULL; - } - -#undef MAKE_HASH_ENTRY -#undef MAKE_BT_ENTRY -#undef MAKE_QUEUE_ENTRY - - free(sp); - return d; -} - -#if (DBVER >= 43) -static PyObject* -DB_stat_print(DBObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:stat_print", - kwnames, &flags)) - { - return NULL; - } - CHECK_DB_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->stat_print(self->db, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -static PyObject* -DB_sync(DBObject* self, PyObject* args) -{ - int err; - int flags = 0; - - if (!PyArg_ParseTuple(args,"|i:sync", &flags )) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->sync(self->db, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DB_truncate(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags=0; - u_int32_t count=0; - PyObject* txnobj = NULL; - DB_TXN *txn = NULL; - static char* kwnames[] = { "txn", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:cursor", kwnames, - &txnobj, &flags)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - if (!checkTxnObj(txnobj, &txn)) - return NULL; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->truncate(self->db, txn, &count, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(count); -} - - -static PyObject* -DB_upgrade(DBObject* self, PyObject* args) -{ - int err, flags=0; - char *filename; - - if (!PyArg_ParseTuple(args,"s|i:upgrade", &filename, &flags)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->upgrade(self->db, filename, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DB_verify(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags=0; - char* fileName; - char* dbName=NULL; - char* outFileName=NULL; - FILE* outFile=NULL; - static char* kwnames[] = { "filename", "dbname", "outfile", "flags", - NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|zzi:verify", kwnames, - &fileName, &dbName, &outFileName, &flags)) - return NULL; - - CHECK_DB_NOT_CLOSED(self); - if (outFileName) - outFile = fopen(outFileName, "w"); - /* XXX(nnorwitz): it should probably be an exception if outFile - can't be opened. */ - - { /* DB.verify acts as a DB handle destructor (like close) */ - PyObject *error; - - error=DB_close_internal(self, 0, 1); - if (error) { - return error; - } - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->verify(self->db, fileName, dbName, outFile, flags); - MYDB_END_ALLOW_THREADS; - - self->db = NULL; /* Implicit close; related objects already released */ - - if (outFile) - fclose(outFile); - - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DB_set_get_returns_none(DBObject* self, PyObject* args) -{ - int flags=0; - int oldValue=0; - - if (!PyArg_ParseTuple(args,"i:set_get_returns_none", &flags)) - return NULL; - CHECK_DB_NOT_CLOSED(self); - - if (self->moduleFlags.getReturnsNone) - ++oldValue; - if (self->moduleFlags.cursorSetReturnsNone) - ++oldValue; - self->moduleFlags.getReturnsNone = (flags >= 1); - self->moduleFlags.cursorSetReturnsNone = (flags >= 2); - return NUMBER_FromLong(oldValue); -} - -static PyObject* -DB_set_encrypt(DBObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - u_int32_t flags=0; - char *passwd = NULL; - static char* kwnames[] = { "passwd", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i:set_encrypt", kwnames, - &passwd, &flags)) { - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->set_encrypt(self->db, passwd, flags); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DB_get_encrypt_flags(DBObject* self) -{ - int err; - u_int32_t flags; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get_encrypt_flags(self->db, &flags); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return NUMBER_FromLong(flags); -} -#endif - - - -/*-------------------------------------------------------------- */ -/* Mapping and Dictionary-like access routines */ - -Py_ssize_t DB_length(PyObject* _self) -{ - int err; - Py_ssize_t size = 0; - void* sp; - DBObject* self = (DBObject*)_self; - - if (self->db == NULL) { - PyObject *t = Py_BuildValue("(is)", 0, "DB object has been closed"); - if (t) { - PyErr_SetObject(DBError, t); - Py_DECREF(t); - } - return -1; - } - - MYDB_BEGIN_ALLOW_THREADS; -#if (DBVER >= 43) - err = self->db->stat(self->db, /*txnid*/ NULL, &sp, 0); -#else - err = self->db->stat(self->db, &sp, 0); -#endif - MYDB_END_ALLOW_THREADS; - - /* All the stat structures have matching fields upto the ndata field, - so we can use any of them for the type cast */ - size = ((DB_BTREE_STAT*)sp)->bt_ndata; - - if (err) - return -1; - - free(sp); - return size; -} - - -PyObject* DB_subscript(DBObject* self, PyObject* keyobj) -{ - int err; - PyObject* retval; - DBT key; - DBT data; - - CHECK_DB_NOT_CLOSED(self); - if (!make_key_dbt(self, keyobj, &key, NULL)) - return NULL; - - CLEAR_DBT(data); - if (CHECK_DBFLAG(self, DB_THREAD)) { - /* Tell Berkeley DB to malloc the return value (thread safe) */ - data.flags = DB_DBT_MALLOC; - } - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get(self->db, NULL, &key, &data, 0); - MYDB_END_ALLOW_THREADS; - if (err == DB_NOTFOUND || err == DB_KEYEMPTY) { - PyErr_SetObject(PyExc_KeyError, keyobj); - retval = NULL; - } - else if (makeDBError(err)) { - retval = NULL; - } - else { - retval = Build_PyString(data.data, data.size); - FREE_DBT(data); - } - - FREE_DBT(key); - return retval; -} - - -static int -DB_ass_sub(DBObject* self, PyObject* keyobj, PyObject* dataobj) -{ - DBT key, data; - int retval; - int flags = 0; - - if (self->db == NULL) { - PyObject *t = Py_BuildValue("(is)", 0, "DB object has been closed"); - if (t) { - PyErr_SetObject(DBError, t); - Py_DECREF(t); - } - return -1; - } - - if (!make_key_dbt(self, keyobj, &key, NULL)) - return -1; - - if (dataobj != NULL) { - if (!make_dbt(dataobj, &data)) - retval = -1; - else { - if (self->setflags & (DB_DUP|DB_DUPSORT)) - /* dictionaries shouldn't have duplicate keys */ - flags = DB_NOOVERWRITE; - retval = _DB_put(self, NULL, &key, &data, flags); - - if ((retval == -1) && (self->setflags & (DB_DUP|DB_DUPSORT))) { - /* try deleting any old record that matches and then PUT it - * again... */ - _DB_delete(self, NULL, &key, 0); - PyErr_Clear(); - retval = _DB_put(self, NULL, &key, &data, flags); - } - } - } - else { - /* dataobj == NULL, so delete the key */ - retval = _DB_delete(self, NULL, &key, 0); - } - FREE_DBT(key); - return retval; -} - - -static PyObject* -_DB_has_key(DBObject* self, PyObject* keyobj, PyObject* txnobj) -{ - int err; - DBT key; - DB_TXN *txn = NULL; - - CHECK_DB_NOT_CLOSED(self); - if (!make_key_dbt(self, keyobj, &key, NULL)) - return NULL; - if (!checkTxnObj(txnobj, &txn)) { - FREE_DBT(key); - return NULL; - } - -#if (DBVER < 46) - /* This causes DB_BUFFER_SMALL to be returned when the db has the key because - it has a record but can't allocate a buffer for the data. This saves - having to deal with data we won't be using. - */ - { - DBT data ; - CLEAR_DBT(data); - data.flags = DB_DBT_USERMEM; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->get(self->db, txn, &key, &data, 0); - MYDB_END_ALLOW_THREADS; - } -#else - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->exists(self->db, txn, &key, 0); - MYDB_END_ALLOW_THREADS; -#endif - - FREE_DBT(key); - - /* - ** DB_BUFFER_SMALL is only used if we use "get". - ** We can drop it when we only use "exists", - ** when we drop suport for Berkeley DB < 4.6. - */ - if (err == DB_BUFFER_SMALL || err == 0) { - Py_INCREF(Py_True); - return Py_True; - } else if (err == DB_NOTFOUND || err == DB_KEYEMPTY) { - Py_INCREF(Py_False); - return Py_False; - } - - makeDBError(err); - return NULL; -} - -static PyObject* -DB_has_key(DBObject* self, PyObject* args, PyObject* kwargs) -{ - PyObject* keyobj; - PyObject* txnobj = NULL; - static char* kwnames[] = {"key","txn", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O:has_key", kwnames, - &keyobj, &txnobj)) - return NULL; - - return _DB_has_key(self, keyobj, txnobj); -} - - -static int DB_contains(DBObject* self, PyObject* keyobj) -{ - PyObject* result; - int result2 = 0; - - result = _DB_has_key(self, keyobj, NULL) ; - if (result == NULL) { - return -1; /* Propague exception */ - } - if (result != Py_False) { - result2 = 1; - } - - Py_DECREF(result); - return result2; -} - - -#define _KEYS_LIST 1 -#define _VALUES_LIST 2 -#define _ITEMS_LIST 3 - -static PyObject* -_DB_make_list(DBObject* self, DB_TXN* txn, int type) -{ - int err, dbtype; - DBT key; - DBT data; - DBC *cursor; - PyObject* list; - PyObject* item = NULL; - - CHECK_DB_NOT_CLOSED(self); - CLEAR_DBT(key); - CLEAR_DBT(data); - - dbtype = _DB_get_type(self); - if (dbtype == -1) - return NULL; - - list = PyList_New(0); - if (list == NULL) - return NULL; - - /* get a cursor */ - MYDB_BEGIN_ALLOW_THREADS; - err = self->db->cursor(self->db, txn, &cursor, 0); - MYDB_END_ALLOW_THREADS; - if (makeDBError(err)) { - Py_DECREF(list); - return NULL; - } - - while (1) { /* use the cursor to traverse the DB, collecting items */ - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_get(cursor, &key, &data, DB_NEXT); - MYDB_END_ALLOW_THREADS; - - if (err) { - /* for any error, break out of the loop */ - break; - } - - switch (type) { - case _KEYS_LIST: - switch(dbtype) { - case DB_BTREE: - case DB_HASH: - default: - item = Build_PyString(key.data, key.size); - break; - case DB_RECNO: - case DB_QUEUE: - item = NUMBER_FromLong(*((db_recno_t*)key.data)); - break; - } - break; - - case _VALUES_LIST: - item = Build_PyString(data.data, data.size); - break; - - case _ITEMS_LIST: - switch(dbtype) { - case DB_BTREE: - case DB_HASH: - default: - item = BuildValue_SS(key.data, key.size, data.data, data.size); - break; - case DB_RECNO: - case DB_QUEUE: - item = BuildValue_IS(*((db_recno_t*)key.data), data.data, data.size); - break; - } - break; - default: - PyErr_Format(PyExc_ValueError, "Unknown key type 0x%x", type); - item = NULL; - break; - } - if (item == NULL) { - Py_DECREF(list); - list = NULL; - goto done; - } - if (PyList_Append(list, item)) { - Py_DECREF(list); - Py_DECREF(item); - list = NULL; - goto done; - } - Py_DECREF(item); - } - - /* DB_NOTFOUND || DB_KEYEMPTY is okay, it means we got to the end */ - if (err != DB_NOTFOUND && err != DB_KEYEMPTY && makeDBError(err)) { - Py_DECREF(list); - list = NULL; - } - - done: - MYDB_BEGIN_ALLOW_THREADS; - _DBC_close(cursor); - MYDB_END_ALLOW_THREADS; - return list; -} - - -static PyObject* -DB_keys(DBObject* self, PyObject* args) -{ - PyObject* txnobj = NULL; - DB_TXN *txn = NULL; - - if (!PyArg_UnpackTuple(args, "keys", 0, 1, &txnobj)) - return NULL; - if (!checkTxnObj(txnobj, &txn)) - return NULL; - return _DB_make_list(self, txn, _KEYS_LIST); -} - - -static PyObject* -DB_items(DBObject* self, PyObject* args) -{ - PyObject* txnobj = NULL; - DB_TXN *txn = NULL; - - if (!PyArg_UnpackTuple(args, "items", 0, 1, &txnobj)) - return NULL; - if (!checkTxnObj(txnobj, &txn)) - return NULL; - return _DB_make_list(self, txn, _ITEMS_LIST); -} - - -static PyObject* -DB_values(DBObject* self, PyObject* args) -{ - PyObject* txnobj = NULL; - DB_TXN *txn = NULL; - - if (!PyArg_UnpackTuple(args, "values", 0, 1, &txnobj)) - return NULL; - if (!checkTxnObj(txnobj, &txn)) - return NULL; - return _DB_make_list(self, txn, _VALUES_LIST); -} - -/* --------------------------------------------------------------------- */ -/* DBLogCursor methods */ - - -static PyObject* -DBLogCursor_close_internal(DBLogCursorObject* self) -{ - int err = 0; - - if (self->logc != NULL) { - EXTRACT_FROM_DOUBLE_LINKED_LIST(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->logc->close(self->logc, 0); - MYDB_END_ALLOW_THREADS; - self->logc = NULL; - } - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBLogCursor_close(DBLogCursorObject* self) -{ - return DBLogCursor_close_internal(self); -} - - -static PyObject* -_DBLogCursor_get(DBLogCursorObject* self, int flag, DB_LSN *lsn2) -{ - int err; - DBT data; - DB_LSN lsn = {0, 0}; - PyObject *dummy, *retval; - - CLEAR_DBT(data); - data.flags = DB_DBT_MALLOC; /* Berkeley DB must do the malloc */ - - CHECK_LOGCURSOR_NOT_CLOSED(self); - - if (lsn2) - lsn = *lsn2; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->logc->get(self->logc, &lsn, &data, flag); - MYDB_END_ALLOW_THREADS; - - if (err == DB_NOTFOUND) { - Py_INCREF(Py_None); - retval = Py_None; - } - else if (makeDBError(err)) { - retval = NULL; - } - else { - retval = dummy = BuildValue_S(data.data, data.size); - if (dummy) { - retval = Py_BuildValue("(ii)O", lsn.file, lsn.offset, dummy); - Py_DECREF(dummy); - } - } - - FREE_DBT(data); - return retval; -} - -static PyObject* -DBLogCursor_current(DBLogCursorObject* self) -{ - return _DBLogCursor_get(self, DB_CURRENT, NULL); -} - -static PyObject* -DBLogCursor_first(DBLogCursorObject* self) -{ - return _DBLogCursor_get(self, DB_FIRST, NULL); -} - -static PyObject* -DBLogCursor_last(DBLogCursorObject* self) -{ - return _DBLogCursor_get(self, DB_LAST, NULL); -} - -static PyObject* -DBLogCursor_next(DBLogCursorObject* self) -{ - return _DBLogCursor_get(self, DB_NEXT, NULL); -} - -static PyObject* -DBLogCursor_prev(DBLogCursorObject* self) -{ - return _DBLogCursor_get(self, DB_PREV, NULL); -} - -static PyObject* -DBLogCursor_set(DBLogCursorObject* self, PyObject* args) -{ - DB_LSN lsn; - - if (!PyArg_ParseTuple(args, "(ii):set", &lsn.file, &lsn.offset)) - return NULL; - - return _DBLogCursor_get(self, DB_SET, &lsn); -} - - - -/* --------------------------------------------------------------------- */ -/* DBCursor methods */ - - -static PyObject* -DBC_close_internal(DBCursorObject* self) -{ - int err = 0; - - if (self->dbc != NULL) { - EXTRACT_FROM_DOUBLE_LINKED_LIST(self); - if (self->txn) { - EXTRACT_FROM_DOUBLE_LINKED_LIST_TXN(self); - self->txn=NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_close(self->dbc); - MYDB_END_ALLOW_THREADS; - self->dbc = NULL; - } - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBC_close(DBCursorObject* self) -{ - return DBC_close_internal(self); -} - - -static PyObject* -DBC_count(DBCursorObject* self, PyObject* args) -{ - int err = 0; - db_recno_t count; - int flags = 0; - - if (!PyArg_ParseTuple(args, "|i:count", &flags)) - return NULL; - - CHECK_CURSOR_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_count(self->dbc, &count, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - return NUMBER_FromLong(count); -} - - -static PyObject* -DBC_current(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - return _DBCursor_get(self,DB_CURRENT,args,kwargs,"|iii:current"); -} - - -static PyObject* -DBC_delete(DBCursorObject* self, PyObject* args) -{ - int err, flags=0; - - if (!PyArg_ParseTuple(args, "|i:delete", &flags)) - return NULL; - - CHECK_CURSOR_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_del(self->dbc, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - RETURN_NONE(); -} - - -static PyObject* -DBC_dup(DBCursorObject* self, PyObject* args) -{ - int err, flags =0; - DBC* dbc = NULL; - - if (!PyArg_ParseTuple(args, "|i:dup", &flags)) - return NULL; - - CHECK_CURSOR_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_dup(self->dbc, &dbc, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - return (PyObject*) newDBCursorObject(dbc, self->txn, self->mydb); -} - -static PyObject* -DBC_first(DBCursorObject* self, PyObject* args, PyObject* kwargs) -{ - return _DBCursor_get(self,DB_FIRST,args,kwargs,"|iii:first"); -} - - -static PyObject* -DBC_get(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - int err, flags=0; - PyObject* keyobj = NULL; - PyObject* dataobj = NULL; - PyObject* retval = NULL; - int dlen = -1; - int doff = -1; - DBT key, data; - static char* kwnames[] = { "key","data", "flags", "dlen", "doff", - NULL }; - - CLEAR_DBT(key); - CLEAR_DBT(data); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii:get", &kwnames[2], - &flags, &dlen, &doff)) - { - PyErr_Clear(); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi|ii:get", - &kwnames[1], - &keyobj, &flags, &dlen, &doff)) - { - PyErr_Clear(); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOi|ii:get", - kwnames, &keyobj, &dataobj, - &flags, &dlen, &doff)) - { - return NULL; - } - } - } - - CHECK_CURSOR_NOT_CLOSED(self); - - if (keyobj && !make_key_dbt(self->mydb, keyobj, &key, NULL)) - return NULL; - if ( (dataobj && !make_dbt(dataobj, &data)) || - (!add_partial_dbt(&data, dlen, doff)) ) - { - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_get(self->dbc, &key, &data, flags); - MYDB_END_ALLOW_THREADS; - - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->mydb->moduleFlags.getReturnsNone) { - Py_INCREF(Py_None); - retval = Py_None; - } - else if (makeDBError(err)) { - retval = NULL; - } - else { - switch (_DB_get_type(self->mydb)) { - case -1: - retval = NULL; - break; - case DB_BTREE: - case DB_HASH: - default: - retval = BuildValue_SS(key.data, key.size, data.data, data.size); - break; - case DB_RECNO: - case DB_QUEUE: - retval = BuildValue_IS(*((db_recno_t*)key.data), data.data, data.size); - break; - } - } - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - return retval; -} - -static PyObject* -DBC_pget(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - int err, flags=0; - PyObject* keyobj = NULL; - PyObject* dataobj = NULL; - PyObject* retval = NULL; - int dlen = -1; - int doff = -1; - DBT key, pkey, data; - static char* kwnames_keyOnly[] = { "key", "flags", "dlen", "doff", NULL }; - static char* kwnames[] = { "key", "data", "flags", "dlen", "doff", NULL }; - - CLEAR_DBT(key); - CLEAR_DBT(data); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii:pget", &kwnames[2], - &flags, &dlen, &doff)) - { - PyErr_Clear(); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi|ii:pget", - kwnames_keyOnly, - &keyobj, &flags, &dlen, &doff)) - { - PyErr_Clear(); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOi|ii:pget", - kwnames, &keyobj, &dataobj, - &flags, &dlen, &doff)) - { - return NULL; - } - } - } - - CHECK_CURSOR_NOT_CLOSED(self); - - if (keyobj && !make_key_dbt(self->mydb, keyobj, &key, NULL)) - return NULL; - if ( (dataobj && !make_dbt(dataobj, &data)) || - (!add_partial_dbt(&data, dlen, doff)) ) { - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - return NULL; - } - - CLEAR_DBT(pkey); - pkey.flags = DB_DBT_MALLOC; - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_pget(self->dbc, &key, &pkey, &data, flags); - MYDB_END_ALLOW_THREADS; - - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->mydb->moduleFlags.getReturnsNone) { - Py_INCREF(Py_None); - retval = Py_None; - } - else if (makeDBError(err)) { - retval = NULL; - } - else { - PyObject *pkeyObj; - PyObject *dataObj; - dataObj = Build_PyString(data.data, data.size); - - if (self->mydb->primaryDBType == DB_RECNO || - self->mydb->primaryDBType == DB_QUEUE) - pkeyObj = NUMBER_FromLong(*(int *)pkey.data); - else - pkeyObj = Build_PyString(pkey.data, pkey.size); - - if (key.data && key.size) /* return key, pkey and data */ - { - PyObject *keyObj; - int type = _DB_get_type(self->mydb); - if (type == DB_RECNO || type == DB_QUEUE) - keyObj = NUMBER_FromLong(*(int *)key.data); - else - keyObj = Build_PyString(key.data, key.size); -#if (PY_VERSION_HEX >= 0x02040000) - retval = PyTuple_Pack(3, keyObj, pkeyObj, dataObj); -#else - retval = Py_BuildValue("OOO", keyObj, pkeyObj, dataObj); -#endif - Py_DECREF(keyObj); - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - } - else /* return just the pkey and data */ - { -#if (PY_VERSION_HEX >= 0x02040000) - retval = PyTuple_Pack(2, pkeyObj, dataObj); -#else - retval = Py_BuildValue("OO", pkeyObj, dataObj); -#endif - } - Py_DECREF(dataObj); - Py_DECREF(pkeyObj); - FREE_DBT(pkey); - } - /* the only time REALLOC should be set is if we used an integer - * key that make_key_dbt malloc'd for us. always free these. */ - if (key.flags & DB_DBT_REALLOC) { /* 'make_key_dbt' could do a 'malloc' */ - FREE_DBT(key); - } - return retval; -} - - -static PyObject* -DBC_get_recno(DBCursorObject* self) -{ - int err; - db_recno_t recno; - DBT key; - DBT data; - - CHECK_CURSOR_NOT_CLOSED(self); - - CLEAR_DBT(key); - CLEAR_DBT(data); - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_get(self->dbc, &key, &data, DB_GET_RECNO); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - recno = *((db_recno_t*)data.data); - return NUMBER_FromLong(recno); -} - - -static PyObject* -DBC_last(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - return _DBCursor_get(self,DB_LAST,args,kwargs,"|iii:last"); -} - - -static PyObject* -DBC_next(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - return _DBCursor_get(self,DB_NEXT,args,kwargs,"|iii:next"); -} - - -static PyObject* -DBC_prev(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - return _DBCursor_get(self,DB_PREV,args,kwargs,"|iii:prev"); -} - - -static PyObject* -DBC_put(DBCursorObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags = 0; - PyObject* keyobj, *dataobj; - DBT key, data; - static char* kwnames[] = { "key", "data", "flags", "dlen", "doff", - NULL }; - int dlen = -1; - int doff = -1; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iii:put", kwnames, - &keyobj, &dataobj, &flags, &dlen, &doff)) - return NULL; - - CHECK_CURSOR_NOT_CLOSED(self); - - if (!make_key_dbt(self->mydb, keyobj, &key, NULL)) - return NULL; - if (!make_dbt(dataobj, &data) || - !add_partial_dbt(&data, dlen, doff) ) - { - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_put(self->dbc, &key, &data, flags); - MYDB_END_ALLOW_THREADS; - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DBC_set(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - int err, flags = 0; - DBT key, data; - PyObject* retval, *keyobj; - static char* kwnames[] = { "key", "flags", "dlen", "doff", NULL }; - int dlen = -1; - int doff = -1; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|iii:set", kwnames, - &keyobj, &flags, &dlen, &doff)) - return NULL; - - CHECK_CURSOR_NOT_CLOSED(self); - - if (!make_key_dbt(self->mydb, keyobj, &key, NULL)) - return NULL; - - CLEAR_DBT(data); - if (!add_partial_dbt(&data, dlen, doff)) { - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_get(self->dbc, &key, &data, flags|DB_SET); - MYDB_END_ALLOW_THREADS; - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->mydb->moduleFlags.cursorSetReturnsNone) { - Py_INCREF(Py_None); - retval = Py_None; - } - else if (makeDBError(err)) { - retval = NULL; - } - else { - switch (_DB_get_type(self->mydb)) { - case -1: - retval = NULL; - break; - case DB_BTREE: - case DB_HASH: - default: - retval = BuildValue_SS(key.data, key.size, data.data, data.size); - break; - case DB_RECNO: - case DB_QUEUE: - retval = BuildValue_IS(*((db_recno_t*)key.data), data.data, data.size); - break; - } - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - } - /* the only time REALLOC should be set is if we used an integer - * key that make_key_dbt malloc'd for us. always free these. */ - if (key.flags & DB_DBT_REALLOC) { - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - } - - return retval; -} - - -static PyObject* -DBC_set_range(DBCursorObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags = 0; - DBT key, data; - PyObject* retval, *keyobj; - static char* kwnames[] = { "key", "flags", "dlen", "doff", NULL }; - int dlen = -1; - int doff = -1; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|iii:set_range", kwnames, - &keyobj, &flags, &dlen, &doff)) - return NULL; - - CHECK_CURSOR_NOT_CLOSED(self); - - if (!make_key_dbt(self->mydb, keyobj, &key, NULL)) - return NULL; - - CLEAR_DBT(data); - if (!add_partial_dbt(&data, dlen, doff)) { - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - return NULL; - } - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_get(self->dbc, &key, &data, flags|DB_SET_RANGE); - MYDB_END_ALLOW_THREADS; - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->mydb->moduleFlags.cursorSetReturnsNone) { - Py_INCREF(Py_None); - retval = Py_None; - } - else if (makeDBError(err)) { - retval = NULL; - } - else { - switch (_DB_get_type(self->mydb)) { - case -1: - retval = NULL; - break; - case DB_BTREE: - case DB_HASH: - default: - retval = BuildValue_SS(key.data, key.size, data.data, data.size); - break; - case DB_RECNO: - case DB_QUEUE: - retval = BuildValue_IS(*((db_recno_t*)key.data), data.data, data.size); - break; - } - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - } - /* the only time REALLOC should be set is if we used an integer - * key that make_key_dbt malloc'd for us. always free these. */ - if (key.flags & DB_DBT_REALLOC) { - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - } - - return retval; -} - -static PyObject* -_DBC_get_set_both(DBCursorObject* self, PyObject* keyobj, PyObject* dataobj, - int flags, unsigned int returnsNone) -{ - int err; - DBT key, data; - PyObject* retval; - - /* the caller did this: CHECK_CURSOR_NOT_CLOSED(self); */ - if (!make_key_dbt(self->mydb, keyobj, &key, NULL)) - return NULL; - if (!make_dbt(dataobj, &data)) { - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_get(self->dbc, &key, &data, flags|DB_GET_BOTH); - MYDB_END_ALLOW_THREADS; - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) && returnsNone) { - Py_INCREF(Py_None); - retval = Py_None; - } - else if (makeDBError(err)) { - retval = NULL; - } - else { - switch (_DB_get_type(self->mydb)) { - case -1: - retval = NULL; - break; - case DB_BTREE: - case DB_HASH: - default: - retval = BuildValue_SS(key.data, key.size, data.data, data.size); - break; - case DB_RECNO: - case DB_QUEUE: - retval = BuildValue_IS(*((db_recno_t*)key.data), data.data, data.size); - break; - } - } - - FREE_DBT(key); /* 'make_key_dbt' could do a 'malloc' */ - return retval; -} - -static PyObject* -DBC_get_both(DBCursorObject* self, PyObject* args) -{ - int flags=0; - PyObject *keyobj, *dataobj; - - if (!PyArg_ParseTuple(args, "OO|i:get_both", &keyobj, &dataobj, &flags)) - return NULL; - - /* if the cursor is closed, self->mydb may be invalid */ - CHECK_CURSOR_NOT_CLOSED(self); - - return _DBC_get_set_both(self, keyobj, dataobj, flags, - self->mydb->moduleFlags.getReturnsNone); -} - -/* Return size of entry */ -static PyObject* -DBC_get_current_size(DBCursorObject* self) -{ - int err, flags=DB_CURRENT; - PyObject* retval = NULL; - DBT key, data; - - CHECK_CURSOR_NOT_CLOSED(self); - CLEAR_DBT(key); - CLEAR_DBT(data); - - /* We don't allocate any memory, forcing a DB_BUFFER_SMALL error and thus - getting the record size. */ - data.flags = DB_DBT_USERMEM; - data.ulen = 0; - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_get(self->dbc, &key, &data, flags); - MYDB_END_ALLOW_THREADS; - if (err == DB_BUFFER_SMALL || !err) { - /* DB_BUFFER_SMALL means positive size, !err means zero length value */ - retval = NUMBER_FromLong((long)data.size); - err = 0; - } - - RETURN_IF_ERR(); - return retval; -} - -static PyObject* -DBC_set_both(DBCursorObject* self, PyObject* args) -{ - int flags=0; - PyObject *keyobj, *dataobj; - - if (!PyArg_ParseTuple(args, "OO|i:set_both", &keyobj, &dataobj, &flags)) - return NULL; - - /* if the cursor is closed, self->mydb may be invalid */ - CHECK_CURSOR_NOT_CLOSED(self); - - return _DBC_get_set_both(self, keyobj, dataobj, flags, - self->mydb->moduleFlags.cursorSetReturnsNone); -} - - -static PyObject* -DBC_set_recno(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - int err, irecno, flags=0; - db_recno_t recno; - DBT key, data; - PyObject* retval; - int dlen = -1; - int doff = -1; - static char* kwnames[] = { "recno","flags", "dlen", "doff", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|iii:set_recno", kwnames, - &irecno, &flags, &dlen, &doff)) - return NULL; - - CHECK_CURSOR_NOT_CLOSED(self); - - CLEAR_DBT(key); - recno = (db_recno_t) irecno; - /* use allocated space so DB will be able to realloc room for the real - * key */ - key.data = malloc(sizeof(db_recno_t)); - if (key.data == NULL) { - PyErr_SetString(PyExc_MemoryError, "Key memory allocation failed"); - return NULL; - } - key.size = sizeof(db_recno_t); - key.ulen = key.size; - memcpy(key.data, &recno, sizeof(db_recno_t)); - key.flags = DB_DBT_REALLOC; - - CLEAR_DBT(data); - if (!add_partial_dbt(&data, dlen, doff)) { - FREE_DBT(key); - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_get(self->dbc, &key, &data, flags|DB_SET_RECNO); - MYDB_END_ALLOW_THREADS; - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->mydb->moduleFlags.cursorSetReturnsNone) { - Py_INCREF(Py_None); - retval = Py_None; - } - else if (makeDBError(err)) { - retval = NULL; - } - else { /* Can only be used for BTrees, so no need to return int key */ - retval = BuildValue_SS(key.data, key.size, data.data, data.size); - } - FREE_DBT(key); - - return retval; -} - - -static PyObject* -DBC_consume(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - return _DBCursor_get(self,DB_CONSUME,args,kwargs,"|iii:consume"); -} - - -static PyObject* -DBC_next_dup(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - return _DBCursor_get(self,DB_NEXT_DUP,args,kwargs,"|iii:next_dup"); -} - - -static PyObject* -DBC_next_nodup(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - return _DBCursor_get(self,DB_NEXT_NODUP,args,kwargs,"|iii:next_nodup"); -} - -#if (DBVER >= 46) -static PyObject* -DBC_prev_dup(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - return _DBCursor_get(self,DB_PREV_DUP,args,kwargs,"|iii:prev_dup"); -} -#endif - -static PyObject* -DBC_prev_nodup(DBCursorObject* self, PyObject* args, PyObject *kwargs) -{ - return _DBCursor_get(self,DB_PREV_NODUP,args,kwargs,"|iii:prev_nodup"); -} - - -static PyObject* -DBC_join_item(DBCursorObject* self, PyObject* args) -{ - int err, flags=0; - DBT key, data; - PyObject* retval; - - if (!PyArg_ParseTuple(args, "|i:join_item", &flags)) - return NULL; - - CHECK_CURSOR_NOT_CLOSED(self); - - CLEAR_DBT(key); - CLEAR_DBT(data); - - MYDB_BEGIN_ALLOW_THREADS; - err = _DBC_get(self->dbc, &key, &data, flags | DB_JOIN_ITEM); - MYDB_END_ALLOW_THREADS; - if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) - && self->mydb->moduleFlags.getReturnsNone) { - Py_INCREF(Py_None); - retval = Py_None; - } - else if (makeDBError(err)) { - retval = NULL; - } - else { - retval = BuildValue_S(key.data, key.size); - } - - return retval; -} - - -#if (DBVER >= 46) -static PyObject* -DBC_set_priority(DBCursorObject* self, PyObject* args, PyObject* kwargs) -{ - int err, priority; - static char* kwnames[] = { "priority", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:set_priority", kwnames, - &priority)) - return NULL; - - CHECK_CURSOR_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->dbc->set_priority(self->dbc, priority); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DBC_get_priority(DBCursorObject* self) -{ - int err; - DB_CACHE_PRIORITY priority; - - CHECK_CURSOR_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->dbc->get_priority(self->dbc, &priority); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(priority); -} -#endif - - - -/* --------------------------------------------------------------------- */ -/* DBEnv methods */ - - -static PyObject* -DBEnv_close_internal(DBEnvObject* self, int flags) -{ - PyObject *dummy; - int err; - - if (!self->closed) { /* Don't close more than once */ - while(self->children_txns) { - dummy = DBTxn_abort_discard_internal(self->children_txns, 0); - Py_XDECREF(dummy); - } - while(self->children_dbs) { - dummy = DB_close_internal(self->children_dbs, 0, 0); - Py_XDECREF(dummy); - } - while(self->children_logcursors) { - dummy = DBLogCursor_close_internal(self->children_logcursors); - Py_XDECREF(dummy); - } - } - - self->closed = 1; - if (self->db_env) { - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->close(self->db_env, flags); - MYDB_END_ALLOW_THREADS; - /* after calling DBEnv->close, regardless of error, this DBEnv - * may not be accessed again (Berkeley DB docs). */ - self->db_env = NULL; - RETURN_IF_ERR(); - } - RETURN_NONE(); -} - -static PyObject* -DBEnv_close(DBEnvObject* self, PyObject* args) -{ - int flags = 0; - - if (!PyArg_ParseTuple(args, "|i:close", &flags)) - return NULL; - return DBEnv_close_internal(self, flags); -} - - -static PyObject* -DBEnv_open(DBEnvObject* self, PyObject* args) -{ - int err, flags=0, mode=0660; - char *db_home; - - if (!PyArg_ParseTuple(args, "z|ii:open", &db_home, &flags, &mode)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->open(self->db_env, db_home, flags, mode); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - self->closed = 0; - self->flags = flags; - RETURN_NONE(); -} - - -static PyObject* -DBEnv_memp_stat(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - DB_MPOOL_STAT *gsp; - DB_MPOOL_FSTAT **fsp, **fsp2; - PyObject* d = NULL, *d2, *d3, *r; - u_int32_t flags = 0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:memp_stat", - kwnames, &flags)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->memp_stat(self->db_env, &gsp, &fsp, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - /* Turn the stat structure into a dictionary */ - d = PyDict_New(); - if (d == NULL) { - if (gsp) - free(gsp); - return NULL; - } - -#define MAKE_ENTRY(name) _addIntToDict(d, #name, gsp->st_##name) - - MAKE_ENTRY(gbytes); - MAKE_ENTRY(ncache); -#if (DBVER >= 46) - MAKE_ENTRY(max_ncache); -#endif - MAKE_ENTRY(regsize); -#if (DBVER >= 43) - MAKE_ENTRY(mmapsize); - MAKE_ENTRY(maxopenfd); - MAKE_ENTRY(maxwrite); - MAKE_ENTRY(maxwrite_sleep); -#endif - MAKE_ENTRY(map); - MAKE_ENTRY(cache_hit); - MAKE_ENTRY(cache_miss); - MAKE_ENTRY(page_create); - MAKE_ENTRY(page_in); - MAKE_ENTRY(page_out); - MAKE_ENTRY(ro_evict); - MAKE_ENTRY(rw_evict); - MAKE_ENTRY(page_trickle); - MAKE_ENTRY(pages); - MAKE_ENTRY(page_clean); - MAKE_ENTRY(page_dirty); - MAKE_ENTRY(hash_buckets); - MAKE_ENTRY(hash_searches); - MAKE_ENTRY(hash_longest); - MAKE_ENTRY(hash_examined); - MAKE_ENTRY(hash_nowait); - MAKE_ENTRY(hash_wait); -#if (DBVER >= 45) - MAKE_ENTRY(hash_max_nowait); -#endif - MAKE_ENTRY(hash_max_wait); - MAKE_ENTRY(region_wait); - MAKE_ENTRY(region_nowait); -#if (DBVER >= 45) - MAKE_ENTRY(mvcc_frozen); - MAKE_ENTRY(mvcc_thawed); - MAKE_ENTRY(mvcc_freed); -#endif - MAKE_ENTRY(alloc); - MAKE_ENTRY(alloc_buckets); - MAKE_ENTRY(alloc_max_buckets); - MAKE_ENTRY(alloc_pages); - MAKE_ENTRY(alloc_max_pages); -#if (DBVER >= 45) - MAKE_ENTRY(io_wait); -#endif -#if (DBVER >= 48) - MAKE_ENTRY(sync_interrupted); -#endif - -#undef MAKE_ENTRY - free(gsp); - - d2 = PyDict_New(); - if (d2 == NULL) { - Py_DECREF(d); - if (fsp) - free(fsp); - return NULL; - } -#define MAKE_ENTRY(name) _addIntToDict(d3, #name, (*fsp2)->st_##name) - for(fsp2=fsp;*fsp2; fsp2++) { - d3 = PyDict_New(); - if (d3 == NULL) { - Py_DECREF(d); - Py_DECREF(d2); - if (fsp) - free(fsp); - return NULL; - } - MAKE_ENTRY(pagesize); - MAKE_ENTRY(cache_hit); - MAKE_ENTRY(cache_miss); - MAKE_ENTRY(map); - MAKE_ENTRY(page_create); - MAKE_ENTRY(page_in); - MAKE_ENTRY(page_out); - if(PyDict_SetItemString(d2, (*fsp2)->file_name, d3)) { - Py_DECREF(d); - Py_DECREF(d2); - Py_DECREF(d3); - if (fsp) - free(fsp); - return NULL; - } - Py_DECREF(d3); - } - -#undef MAKE_ENTRY - free(fsp); - - r = Py_BuildValue("(OO)", d, d2); - Py_DECREF(d); - Py_DECREF(d2); - return r; -} - -#if (DBVER >= 43) -static PyObject* -DBEnv_memp_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:memp_stat_print", - kwnames, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->memp_stat_print(self->db_env, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -static PyObject* -DBEnv_memp_trickle(DBEnvObject* self, PyObject* args) -{ - int err, percent, nwrotep; - - if (!PyArg_ParseTuple(args, "i:memp_trickle", &percent)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->memp_trickle(self->db_env, percent, &nwrotep); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(nwrotep); -} - -static PyObject* -DBEnv_memp_sync(DBEnvObject* self, PyObject* args) -{ - int err; - DB_LSN lsn = {0, 0}; - DB_LSN *lsn_p = NULL; - - if (!PyArg_ParseTuple(args, "|(ii):memp_sync", &lsn.file, &lsn.offset)) - return NULL; - if ((lsn.file!=0) || (lsn.offset!=0)) { - lsn_p = &lsn; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->memp_sync(self->db_env, lsn_p); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_remove(DBEnvObject* self, PyObject* args) -{ - int err, flags=0; - char *db_home; - - if (!PyArg_ParseTuple(args, "s|i:remove", &db_home, &flags)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->remove(self->db_env, db_home, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_dbremove(DBEnvObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - u_int32_t flags=0; - char *file = NULL; - char *database = NULL; - PyObject *txnobj = NULL; - DB_TXN *txn = NULL; - static char* kwnames[] = { "file", "database", "txn", "flags", - NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|zOi:dbremove", kwnames, - &file, &database, &txnobj, &flags)) { - return NULL; - } - if (!checkTxnObj(txnobj, &txn)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->dbremove(self->db_env, txn, file, database, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_dbrename(DBEnvObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - u_int32_t flags=0; - char *file = NULL; - char *database = NULL; - char *newname = NULL; - PyObject *txnobj = NULL; - DB_TXN *txn = NULL; - static char* kwnames[] = { "file", "database", "newname", "txn", - "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "szs|Oi:dbrename", kwnames, - &file, &database, &newname, &txnobj, &flags)) { - return NULL; - } - if (!checkTxnObj(txnobj, &txn)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->dbrename(self->db_env, txn, file, database, newname, - flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - - -static PyObject* -DBEnv_set_encrypt(DBEnvObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - u_int32_t flags=0; - char *passwd = NULL; - static char* kwnames[] = { "passwd", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i:set_encrypt", kwnames, - &passwd, &flags)) { - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_encrypt(self->db_env, passwd, flags); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_encrypt_flags(DBEnvObject* self) -{ - int err; - u_int32_t flags; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_encrypt_flags(self->db_env, &flags); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return NUMBER_FromLong(flags); -} - -static PyObject* -DBEnv_get_timeout(DBEnvObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - int flag; - u_int32_t timeout; - static char* kwnames[] = {"flag", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:get_timeout", kwnames, - &flag)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_timeout(self->db_env, &timeout, flag); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(timeout); -} -#endif - - -static PyObject* -DBEnv_set_timeout(DBEnvObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - u_int32_t flags=0; - u_int32_t timeout = 0; - static char* kwnames[] = { "timeout", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii:set_timeout", kwnames, - &timeout, &flags)) { - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_timeout(self->db_env, (db_timeout_t)timeout, flags); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_set_shm_key(DBEnvObject* self, PyObject* args) -{ - int err; - long shm_key = 0; - - if (!PyArg_ParseTuple(args, "l:set_shm_key", &shm_key)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - err = self->db_env->set_shm_key(self->db_env, shm_key); - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_shm_key(DBEnvObject* self) -{ - int err; - long shm_key; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_shm_key(self->db_env, &shm_key); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return NUMBER_FromLong(shm_key); -} -#endif - -#if (DBVER >= 46) -static PyObject* -DBEnv_set_cache_max(DBEnvObject* self, PyObject* args) -{ - int err, gbytes, bytes; - - if (!PyArg_ParseTuple(args, "ii:set_cache_max", - &gbytes, &bytes)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_cache_max(self->db_env, gbytes, bytes); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_get_cache_max(DBEnvObject* self) -{ - int err; - u_int32_t gbytes, bytes; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_cache_max(self->db_env, &gbytes, &bytes); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return Py_BuildValue("(ii)", gbytes, bytes); -} -#endif - -#if (DBVER >= 46) -static PyObject* -DBEnv_set_thread_count(DBEnvObject* self, PyObject* args) -{ - int err; - u_int32_t count; - - if (!PyArg_ParseTuple(args, "i:set_thread_count", &count)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_thread_count(self->db_env, count); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_get_thread_count(DBEnvObject* self) -{ - int err; - u_int32_t count; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_thread_count(self->db_env, &count); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(count); -} -#endif - -static PyObject* -DBEnv_set_cachesize(DBEnvObject* self, PyObject* args) -{ - int err, gbytes=0, bytes=0, ncache=0; - - if (!PyArg_ParseTuple(args, "ii|i:set_cachesize", - &gbytes, &bytes, &ncache)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_cachesize(self->db_env, gbytes, bytes, ncache); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_cachesize(DBEnvObject* self) -{ - int err; - u_int32_t gbytes, bytes; - int ncache; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_cachesize(self->db_env, &gbytes, &bytes, &ncache); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return Py_BuildValue("(iii)", gbytes, bytes, ncache); -} -#endif - - -static PyObject* -DBEnv_set_flags(DBEnvObject* self, PyObject* args) -{ - int err, flags=0, onoff=0; - - if (!PyArg_ParseTuple(args, "ii:set_flags", - &flags, &onoff)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_flags(self->db_env, flags, onoff); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_flags(DBEnvObject* self) -{ - int err; - u_int32_t flags; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_flags(self->db_env, &flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(flags); -} -#endif - -#if (DBVER >= 47) -static PyObject* -DBEnv_log_set_config(DBEnvObject* self, PyObject* args) -{ - int err, flags, onoff; - - if (!PyArg_ParseTuple(args, "ii:log_set_config", - &flags, &onoff)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->log_set_config(self->db_env, flags, onoff); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_log_get_config(DBEnvObject* self, PyObject* args) -{ - int err, flag, onoff; - - if (!PyArg_ParseTuple(args, "i:log_get_config", &flag)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->log_get_config(self->db_env, flag, &onoff); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return PyBool_FromLong(onoff); -} -#endif /* DBVER >= 47 */ - -#if (DBVER >= 44) -static PyObject* -DBEnv_mutex_set_max(DBEnvObject* self, PyObject* args) -{ - int err; - int value; - - if (!PyArg_ParseTuple(args, "i:mutex_set_max", &value)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->mutex_set_max(self->db_env, value); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_mutex_get_max(DBEnvObject* self) -{ - int err; - u_int32_t value; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->mutex_get_max(self->db_env, &value); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return NUMBER_FromLong(value); -} - -static PyObject* -DBEnv_mutex_set_align(DBEnvObject* self, PyObject* args) -{ - int err; - int align; - - if (!PyArg_ParseTuple(args, "i:mutex_set_align", &align)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->mutex_set_align(self->db_env, align); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_mutex_get_align(DBEnvObject* self) -{ - int err; - u_int32_t align; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->mutex_get_align(self->db_env, &align); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return NUMBER_FromLong(align); -} - -static PyObject* -DBEnv_mutex_set_increment(DBEnvObject* self, PyObject* args) -{ - int err; - int increment; - - if (!PyArg_ParseTuple(args, "i:mutex_set_increment", &increment)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->mutex_set_increment(self->db_env, increment); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_mutex_get_increment(DBEnvObject* self) -{ - int err; - u_int32_t increment; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->mutex_get_increment(self->db_env, &increment); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return NUMBER_FromLong(increment); -} - -static PyObject* -DBEnv_mutex_set_tas_spins(DBEnvObject* self, PyObject* args) -{ - int err; - int tas_spins; - - if (!PyArg_ParseTuple(args, "i:mutex_set_tas_spins", &tas_spins)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->mutex_set_tas_spins(self->db_env, tas_spins); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_mutex_get_tas_spins(DBEnvObject* self) -{ - int err; - u_int32_t tas_spins; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->mutex_get_tas_spins(self->db_env, &tas_spins); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return NUMBER_FromLong(tas_spins); -} -#endif - -static PyObject* -DBEnv_set_data_dir(DBEnvObject* self, PyObject* args) -{ - int err; - char *dir; - - if (!PyArg_ParseTuple(args, "s:set_data_dir", &dir)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_data_dir(self->db_env, dir); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_data_dirs(DBEnvObject* self) -{ - int err; - PyObject *tuple; - PyObject *item; - const char **dirpp; - int size, i; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_data_dirs(self->db_env, &dirpp); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - /* - ** Calculate size. Python C API - ** actually allows for tuple resizing, - ** but this is simple enough. - */ - for (size=0; *(dirpp+size) ; size++); - - tuple = PyTuple_New(size); - if (!tuple) - return NULL; - - for (i=0; i<size; i++) { - item = PyBytes_FromString (*(dirpp+i)); - if (item == NULL) { - Py_DECREF(tuple); - tuple = NULL; - break; - } - PyTuple_SET_ITEM(tuple, i, item); - } - return tuple; -} -#endif - -#if (DBVER >= 44) -static PyObject* -DBEnv_set_lg_filemode(DBEnvObject* self, PyObject* args) -{ - int err, filemode; - - if (!PyArg_ParseTuple(args, "i:set_lg_filemode", &filemode)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lg_filemode(self->db_env, filemode); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_get_lg_filemode(DBEnvObject* self) -{ - int err, filemode; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_lg_filemode(self->db_env, &filemode); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(filemode); -} -#endif - -static PyObject* -DBEnv_set_lg_bsize(DBEnvObject* self, PyObject* args) -{ - int err, lg_bsize; - - if (!PyArg_ParseTuple(args, "i:set_lg_bsize", &lg_bsize)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lg_bsize(self->db_env, lg_bsize); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_lg_bsize(DBEnvObject* self) -{ - int err; - u_int32_t lg_bsize; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_lg_bsize(self->db_env, &lg_bsize); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(lg_bsize); -} -#endif - -static PyObject* -DBEnv_set_lg_dir(DBEnvObject* self, PyObject* args) -{ - int err; - char *dir; - - if (!PyArg_ParseTuple(args, "s:set_lg_dir", &dir)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lg_dir(self->db_env, dir); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_lg_dir(DBEnvObject* self) -{ - int err; - const char *dirp; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_lg_dir(self->db_env, &dirp); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return PyBytes_FromString(dirp); -} -#endif - -static PyObject* -DBEnv_set_lg_max(DBEnvObject* self, PyObject* args) -{ - int err, lg_max; - - if (!PyArg_ParseTuple(args, "i:set_lg_max", &lg_max)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lg_max(self->db_env, lg_max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_lg_max(DBEnvObject* self) -{ - int err; - u_int32_t lg_max; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_lg_max(self->db_env, &lg_max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(lg_max); -} -#endif - - -static PyObject* -DBEnv_set_lg_regionmax(DBEnvObject* self, PyObject* args) -{ - int err, lg_max; - - if (!PyArg_ParseTuple(args, "i:set_lg_regionmax", &lg_max)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lg_regionmax(self->db_env, lg_max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_lg_regionmax(DBEnvObject* self) -{ - int err; - u_int32_t lg_regionmax; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_lg_regionmax(self->db_env, &lg_regionmax); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(lg_regionmax); -} -#endif - -#if (DBVER >= 47) -static PyObject* -DBEnv_set_lk_partitions(DBEnvObject* self, PyObject* args) -{ - int err, lk_partitions; - - if (!PyArg_ParseTuple(args, "i:set_lk_partitions", &lk_partitions)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lk_partitions(self->db_env, lk_partitions); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_get_lk_partitions(DBEnvObject* self) -{ - int err; - u_int32_t lk_partitions; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_lk_partitions(self->db_env, &lk_partitions); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(lk_partitions); -} -#endif - -static PyObject* -DBEnv_set_lk_detect(DBEnvObject* self, PyObject* args) -{ - int err, lk_detect; - - if (!PyArg_ParseTuple(args, "i:set_lk_detect", &lk_detect)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lk_detect(self->db_env, lk_detect); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_lk_detect(DBEnvObject* self) -{ - int err; - u_int32_t lk_detect; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_lk_detect(self->db_env, &lk_detect); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(lk_detect); -} -#endif - - -#if (DBVER < 45) -static PyObject* -DBEnv_set_lk_max(DBEnvObject* self, PyObject* args) -{ - int err, max; - - if (!PyArg_ParseTuple(args, "i:set_lk_max", &max)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lk_max(self->db_env, max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - - -static PyObject* -DBEnv_set_lk_max_locks(DBEnvObject* self, PyObject* args) -{ - int err, max; - - if (!PyArg_ParseTuple(args, "i:set_lk_max_locks", &max)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lk_max_locks(self->db_env, max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_lk_max_locks(DBEnvObject* self) -{ - int err; - u_int32_t lk_max; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_lk_max_locks(self->db_env, &lk_max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(lk_max); -} -#endif - -static PyObject* -DBEnv_set_lk_max_lockers(DBEnvObject* self, PyObject* args) -{ - int err, max; - - if (!PyArg_ParseTuple(args, "i:set_lk_max_lockers", &max)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lk_max_lockers(self->db_env, max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_lk_max_lockers(DBEnvObject* self) -{ - int err; - u_int32_t lk_max; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_lk_max_lockers(self->db_env, &lk_max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(lk_max); -} -#endif - -static PyObject* -DBEnv_set_lk_max_objects(DBEnvObject* self, PyObject* args) -{ - int err, max; - - if (!PyArg_ParseTuple(args, "i:set_lk_max_objects", &max)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_lk_max_objects(self->db_env, max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_lk_max_objects(DBEnvObject* self) -{ - int err; - u_int32_t lk_max; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_lk_max_objects(self->db_env, &lk_max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(lk_max); -} -#endif - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_mp_mmapsize(DBEnvObject* self) -{ - int err; - size_t mmapsize; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_mp_mmapsize(self->db_env, &mmapsize); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(mmapsize); -} -#endif - - -static PyObject* -DBEnv_set_mp_mmapsize(DBEnvObject* self, PyObject* args) -{ - int err, mp_mmapsize; - - if (!PyArg_ParseTuple(args, "i:set_mp_mmapsize", &mp_mmapsize)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_mp_mmapsize(self->db_env, mp_mmapsize); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DBEnv_set_tmp_dir(DBEnvObject* self, PyObject* args) -{ - int err; - char *dir; - - if (!PyArg_ParseTuple(args, "s:set_tmp_dir", &dir)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_tmp_dir(self->db_env, dir); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_tmp_dir(DBEnvObject* self) -{ - int err; - const char *dirpp; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_tmp_dir(self->db_env, &dirpp); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - - return PyBytes_FromString(dirpp); -} -#endif - - -static PyObject* -DBEnv_txn_recover(DBEnvObject* self) -{ - int flags = DB_FIRST; - int err, i; - PyObject *list, *tuple, *gid; - DBTxnObject *txn; -#define PREPLIST_LEN 16 - DB_PREPLIST preplist[PREPLIST_LEN]; -#if (DBVER < 48) - long retp; -#else - u_int32_t retp; -#endif - - CHECK_ENV_NOT_CLOSED(self); - - list=PyList_New(0); - if (!list) - return NULL; - while (!0) { - MYDB_BEGIN_ALLOW_THREADS - err=self->db_env->txn_recover(self->db_env, - preplist, PREPLIST_LEN, &retp, flags); -#undef PREPLIST_LEN - MYDB_END_ALLOW_THREADS - if (err) { - Py_DECREF(list); - RETURN_IF_ERR(); - } - if (!retp) break; - flags=DB_NEXT; /* Prepare for next loop pass */ - for (i=0; i<retp; i++) { - gid=PyBytes_FromStringAndSize((char *)(preplist[i].gid), - DB_GID_SIZE); - if (!gid) { - Py_DECREF(list); - return NULL; - } - txn=newDBTxnObject(self, NULL, preplist[i].txn, 0); - if (!txn) { - Py_DECREF(list); - Py_DECREF(gid); - return NULL; - } - txn->flag_prepare=1; /* Recover state */ - tuple=PyTuple_New(2); - if (!tuple) { - Py_DECREF(list); - Py_DECREF(gid); - Py_DECREF(txn); - return NULL; - } - if (PyTuple_SetItem(tuple, 0, gid)) { - Py_DECREF(list); - Py_DECREF(gid); - Py_DECREF(txn); - Py_DECREF(tuple); - return NULL; - } - if (PyTuple_SetItem(tuple, 1, (PyObject *)txn)) { - Py_DECREF(list); - Py_DECREF(txn); - Py_DECREF(tuple); /* This delete the "gid" also */ - return NULL; - } - if (PyList_Append(list, tuple)) { - Py_DECREF(list); - Py_DECREF(tuple);/* This delete the "gid" and the "txn" also */ - return NULL; - } - Py_DECREF(tuple); - } - } - return list; -} - -static PyObject* -DBEnv_txn_begin(DBEnvObject* self, PyObject* args, PyObject* kwargs) -{ - int flags = 0; - PyObject* txnobj = NULL; - DB_TXN *txn = NULL; - static char* kwnames[] = { "parent", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:txn_begin", kwnames, - &txnobj, &flags)) - return NULL; - - if (!checkTxnObj(txnobj, &txn)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - return (PyObject*)newDBTxnObject(self, (DBTxnObject *)txnobj, NULL, flags); -} - - -static PyObject* -DBEnv_txn_checkpoint(DBEnvObject* self, PyObject* args) -{ - int err, kbyte=0, min=0, flags=0; - - if (!PyArg_ParseTuple(args, "|iii:txn_checkpoint", &kbyte, &min, &flags)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->txn_checkpoint(self->db_env, kbyte, min, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_tx_max(DBEnvObject* self) -{ - int err; - u_int32_t max; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_tx_max(self->db_env, &max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return PyLong_FromUnsignedLong(max); -} -#endif - - -static PyObject* -DBEnv_set_tx_max(DBEnvObject* self, PyObject* args) -{ - int err, max; - - if (!PyArg_ParseTuple(args, "i:set_tx_max", &max)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_tx_max(self->db_env, max); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_tx_timestamp(DBEnvObject* self) -{ - int err; - time_t timestamp; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_tx_timestamp(self->db_env, ×tamp); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(timestamp); -} -#endif - -static PyObject* -DBEnv_set_tx_timestamp(DBEnvObject* self, PyObject* args) -{ - int err; - long stamp; - time_t timestamp; - - if (!PyArg_ParseTuple(args, "l:set_tx_timestamp", &stamp)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - timestamp = (time_t)stamp; - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_tx_timestamp(self->db_env, ×tamp); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DBEnv_lock_detect(DBEnvObject* self, PyObject* args) -{ - int err, atype, flags=0; - int aborted = 0; - - if (!PyArg_ParseTuple(args, "i|i:lock_detect", &atype, &flags)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->lock_detect(self->db_env, flags, atype, &aborted); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(aborted); -} - - -static PyObject* -DBEnv_lock_get(DBEnvObject* self, PyObject* args) -{ - int flags=0; - int locker, lock_mode; - DBT obj; - PyObject* objobj; - - if (!PyArg_ParseTuple(args, "iOi|i:lock_get", &locker, &objobj, &lock_mode, &flags)) - return NULL; - - - if (!make_dbt(objobj, &obj)) - return NULL; - - return (PyObject*)newDBLockObject(self, locker, &obj, lock_mode, flags); -} - - -static PyObject* -DBEnv_lock_id(DBEnvObject* self) -{ - int err; - u_int32_t theID; - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->lock_id(self->db_env, &theID); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - return NUMBER_FromLong((long)theID); -} - -static PyObject* -DBEnv_lock_id_free(DBEnvObject* self, PyObject* args) -{ - int err; - u_int32_t theID; - - if (!PyArg_ParseTuple(args, "I:lock_id_free", &theID)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->lock_id_free(self->db_env, theID); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_lock_put(DBEnvObject* self, PyObject* args) -{ - int err; - DBLockObject* dblockobj; - - if (!PyArg_ParseTuple(args, "O!:lock_put", &DBLock_Type, &dblockobj)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->lock_put(self->db_env, &dblockobj->lock); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 44) -static PyObject* -DBEnv_fileid_reset(DBEnvObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - char *file; - u_int32_t flags = 0; - static char* kwnames[] = { "file", "flags", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "z|i:fileid_reset", kwnames, - &file, &flags)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->fileid_reset(self->db_env, file, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_lsn_reset(DBEnvObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - char *file; - u_int32_t flags = 0; - static char* kwnames[] = { "file", "flags", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "z|i:lsn_reset", kwnames, - &file, &flags)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->lsn_reset(self->db_env, file, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif /* DBVER >= 4.4 */ - - -#if (DBVER >= 43) -static PyObject* -DBEnv_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:stat_print", - kwnames, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->stat_print(self->db_env, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -static PyObject* -DBEnv_log_stat(DBEnvObject* self, PyObject* args) -{ - int err; - DB_LOG_STAT* statp = NULL; - PyObject* d = NULL; - u_int32_t flags = 0; - - if (!PyArg_ParseTuple(args, "|i:log_stat", &flags)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->log_stat(self->db_env, &statp, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - /* Turn the stat structure into a dictionary */ - d = PyDict_New(); - if (d == NULL) { - if (statp) - free(statp); - return NULL; - } - -#define MAKE_ENTRY(name) _addIntToDict(d, #name, statp->st_##name) - - MAKE_ENTRY(magic); - MAKE_ENTRY(version); - MAKE_ENTRY(mode); - MAKE_ENTRY(lg_bsize); -#if (DBVER >= 44) - MAKE_ENTRY(lg_size); - MAKE_ENTRY(record); -#endif - MAKE_ENTRY(w_mbytes); - MAKE_ENTRY(w_bytes); - MAKE_ENTRY(wc_mbytes); - MAKE_ENTRY(wc_bytes); - MAKE_ENTRY(wcount); - MAKE_ENTRY(wcount_fill); -#if (DBVER >= 44) - MAKE_ENTRY(rcount); -#endif - MAKE_ENTRY(scount); - MAKE_ENTRY(cur_file); - MAKE_ENTRY(cur_offset); - MAKE_ENTRY(disk_file); - MAKE_ENTRY(disk_offset); - MAKE_ENTRY(maxcommitperflush); - MAKE_ENTRY(mincommitperflush); - MAKE_ENTRY(regsize); - MAKE_ENTRY(region_wait); - MAKE_ENTRY(region_nowait); - -#undef MAKE_ENTRY - free(statp); - return d; -} /* DBEnv_log_stat */ - - -#if (DBVER >= 43) -static PyObject* -DBEnv_log_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:log_stat_print", - kwnames, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->log_stat_print(self->db_env, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -static PyObject* -DBEnv_lock_stat(DBEnvObject* self, PyObject* args) -{ - int err; - DB_LOCK_STAT* sp; - PyObject* d = NULL; - u_int32_t flags = 0; - - if (!PyArg_ParseTuple(args, "|i:lock_stat", &flags)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->lock_stat(self->db_env, &sp, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - /* Turn the stat structure into a dictionary */ - d = PyDict_New(); - if (d == NULL) { - free(sp); - return NULL; - } - -#define MAKE_ENTRY(name) _addIntToDict(d, #name, sp->st_##name) - - MAKE_ENTRY(id); - MAKE_ENTRY(cur_maxid); - MAKE_ENTRY(nmodes); - MAKE_ENTRY(maxlocks); - MAKE_ENTRY(maxlockers); - MAKE_ENTRY(maxobjects); - MAKE_ENTRY(nlocks); - MAKE_ENTRY(maxnlocks); - MAKE_ENTRY(nlockers); - MAKE_ENTRY(maxnlockers); - MAKE_ENTRY(nobjects); - MAKE_ENTRY(maxnobjects); - MAKE_ENTRY(nrequests); - MAKE_ENTRY(nreleases); -#if (DBVER >= 44) - MAKE_ENTRY(nupgrade); - MAKE_ENTRY(ndowngrade); -#endif -#if (DBVER < 44) - MAKE_ENTRY(nnowaits); /* these were renamed in 4.4 */ - MAKE_ENTRY(nconflicts); -#else - MAKE_ENTRY(lock_nowait); - MAKE_ENTRY(lock_wait); -#endif - MAKE_ENTRY(ndeadlocks); - MAKE_ENTRY(locktimeout); - MAKE_ENTRY(txntimeout); - MAKE_ENTRY(nlocktimeouts); - MAKE_ENTRY(ntxntimeouts); -#if (DBVER >= 46) - MAKE_ENTRY(objs_wait); - MAKE_ENTRY(objs_nowait); - MAKE_ENTRY(lockers_wait); - MAKE_ENTRY(lockers_nowait); -#if (DBVER >= 47) - MAKE_ENTRY(lock_wait); - MAKE_ENTRY(lock_nowait); -#else - MAKE_ENTRY(locks_wait); - MAKE_ENTRY(locks_nowait); -#endif - MAKE_ENTRY(hash_len); -#endif - MAKE_ENTRY(regsize); - MAKE_ENTRY(region_wait); - MAKE_ENTRY(region_nowait); - -#undef MAKE_ENTRY - free(sp); - return d; -} - -#if (DBVER >= 43) -static PyObject* -DBEnv_lock_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:lock_stat_print", - kwnames, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->lock_stat_print(self->db_env, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -static PyObject* -DBEnv_log_cursor(DBEnvObject* self) -{ - int err; - DB_LOGC* dblogc; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->log_cursor(self->db_env, &dblogc, 0); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return (PyObject*) newDBLogCursorObject(dblogc, self); -} - - -static PyObject* -DBEnv_log_flush(DBEnvObject* self) -{ - int err; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS - err = self->db_env->log_flush(self->db_env, NULL); - MYDB_END_ALLOW_THREADS - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_log_file(DBEnvObject* self, PyObject* args) -{ - int err; - DB_LSN lsn = {0, 0}; - int size = 20; - char *name = NULL; - PyObject *retval; - - if (!PyArg_ParseTuple(args, "(ii):log_file", &lsn.file, &lsn.offset)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - - do { - name = malloc(size); - if (!name) { - PyErr_NoMemory(); - return NULL; - } - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->log_file(self->db_env, &lsn, name, size); - MYDB_END_ALLOW_THREADS; - if (err == EINVAL) { - free(name); - size *= 2; - } else if (err) { - free(name); - RETURN_IF_ERR(); - assert(0); /* Unreachable... supposely */ - return NULL; - } -/* -** If the final buffer we try is too small, we will -** get this exception: -** DBInvalidArgError: -** (22, 'Invalid argument -- DB_ENV->log_file: name buffer is too short') -*/ - } while ((err == EINVAL) && (size<(1<<17))); - - RETURN_IF_ERR(); /* Maybe the size is not the problem */ - - retval = Py_BuildValue("s", name); - free(name); - return retval; -} - - -#if (DBVER >= 44) -static PyObject* -DBEnv_log_printf(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - char *string; - PyObject *txnobj = NULL; - DB_TXN *txn = NULL; - static char* kwnames[] = {"string", "txn", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|O:log_printf", kwnames, - &string, &txnobj)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - - if (!checkTxnObj(txnobj, &txn)) - return NULL; - - /* - ** Do not use the format string directly, to avoid attacks. - */ - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->log_printf(self->db_env, txn, "%s", string); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -static PyObject* -DBEnv_log_archive(DBEnvObject* self, PyObject* args) -{ - int flags=0; - int err; - char **log_list = NULL; - PyObject* list; - PyObject* item = NULL; - - if (!PyArg_ParseTuple(args, "|i:log_archive", &flags)) - return NULL; - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->log_archive(self->db_env, &log_list, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - list = PyList_New(0); - if (list == NULL) { - if (log_list) - free(log_list); - return NULL; - } - - if (log_list) { - char **log_list_start; - for (log_list_start = log_list; *log_list != NULL; ++log_list) { - item = PyBytes_FromString (*log_list); - if (item == NULL) { - Py_DECREF(list); - list = NULL; - break; - } - if (PyList_Append(list, item)) { - Py_DECREF(list); - list = NULL; - Py_DECREF(item); - break; - } - Py_DECREF(item); - } - free(log_list_start); - } - return list; -} - - -#if (DBVER >= 44) -static PyObject* -DBEnv_mutex_stat(DBEnvObject* self, PyObject* args) -{ - int err; - DB_MUTEX_STAT* statp = NULL; - PyObject* d = NULL; - u_int32_t flags = 0; - - if (!PyArg_ParseTuple(args, "|i:mutex_stat", &flags)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->mutex_stat(self->db_env, &statp, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - /* Turn the stat structure into a dictionary */ - d = PyDict_New(); - if (d == NULL) { - if (statp) - free(statp); - return NULL; - } - -#define MAKE_ENTRY(name) _addIntToDict(d, #name, statp->st_##name) - - MAKE_ENTRY(mutex_align); - MAKE_ENTRY(mutex_tas_spins); - MAKE_ENTRY(mutex_cnt); - MAKE_ENTRY(mutex_free); - MAKE_ENTRY(mutex_inuse); - MAKE_ENTRY(mutex_inuse_max); - MAKE_ENTRY(regsize); - MAKE_ENTRY(region_wait); - MAKE_ENTRY(region_nowait); - -#undef MAKE_ENTRY - free(statp); - return d; -} -#endif - - -#if (DBVER >= 44) -static PyObject* -DBEnv_mutex_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:mutex_stat_print", - kwnames, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->mutex_stat_print(self->db_env, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -#if (DBVER >= 43) -static PyObject* -DBEnv_txn_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:stat_print", - kwnames, &flags)) - { - return NULL; - } - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->txn_stat_print(self->db_env, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -static PyObject* -DBEnv_txn_stat(DBEnvObject* self, PyObject* args) -{ - int err; - DB_TXN_STAT* sp; - PyObject* d = NULL; - u_int32_t flags=0; - - if (!PyArg_ParseTuple(args, "|i:txn_stat", &flags)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->txn_stat(self->db_env, &sp, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - /* Turn the stat structure into a dictionary */ - d = PyDict_New(); - if (d == NULL) { - free(sp); - return NULL; - } - -#define MAKE_ENTRY(name) _addIntToDict(d, #name, sp->st_##name) -#define MAKE_TIME_T_ENTRY(name) _addTimeTToDict(d, #name, sp->st_##name) -#define MAKE_DB_LSN_ENTRY(name) _addDB_lsnToDict(d, #name, sp->st_##name) - - MAKE_DB_LSN_ENTRY(last_ckp); - MAKE_TIME_T_ENTRY(time_ckp); - MAKE_ENTRY(last_txnid); - MAKE_ENTRY(maxtxns); - MAKE_ENTRY(nactive); - MAKE_ENTRY(maxnactive); -#if (DBVER >= 45) - MAKE_ENTRY(nsnapshot); - MAKE_ENTRY(maxnsnapshot); -#endif - MAKE_ENTRY(nbegins); - MAKE_ENTRY(naborts); - MAKE_ENTRY(ncommits); - MAKE_ENTRY(nrestores); - MAKE_ENTRY(regsize); - MAKE_ENTRY(region_wait); - MAKE_ENTRY(region_nowait); - -#undef MAKE_DB_LSN_ENTRY -#undef MAKE_ENTRY -#undef MAKE_TIME_T_ENTRY - free(sp); - return d; -} - - -static PyObject* -DBEnv_set_get_returns_none(DBEnvObject* self, PyObject* args) -{ - int flags=0; - int oldValue=0; - - if (!PyArg_ParseTuple(args,"i:set_get_returns_none", &flags)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - if (self->moduleFlags.getReturnsNone) - ++oldValue; - if (self->moduleFlags.cursorSetReturnsNone) - ++oldValue; - self->moduleFlags.getReturnsNone = (flags >= 1); - self->moduleFlags.cursorSetReturnsNone = (flags >= 2); - return NUMBER_FromLong(oldValue); -} - -static PyObject* -DBEnv_get_private(DBEnvObject* self) -{ - /* We can give out the private field even if dbenv is closed */ - Py_INCREF(self->private_obj); - return self->private_obj; -} - -static PyObject* -DBEnv_set_private(DBEnvObject* self, PyObject* private_obj) -{ - /* We can set the private field even if dbenv is closed */ - Py_DECREF(self->private_obj); - Py_INCREF(private_obj); - self->private_obj = private_obj; - RETURN_NONE(); -} - - -#if (DBVER < 48) -static PyObject* -DBEnv_set_rpc_server(DBEnvObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - char *host; - long cl_timeout=0, sv_timeout=0; - - static char* kwnames[] = { "host", "cl_timeout", "sv_timeout", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|ll:set_rpc_server", kwnames, - &host, &cl_timeout, &sv_timeout)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_rpc_server(self->db_env, NULL, host, cl_timeout, - sv_timeout, 0); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - -#if (DBVER >= 43) -static PyObject* -DBEnv_set_mp_max_openfd(DBEnvObject* self, PyObject* args) -{ - int err; - int maxopenfd; - - if (!PyArg_ParseTuple(args, "i:set_mp_max_openfd", &maxopenfd)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_mp_max_openfd(self->db_env, maxopenfd); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_get_mp_max_openfd(DBEnvObject* self) -{ - int err; - int maxopenfd; - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_mp_max_openfd(self->db_env, &maxopenfd); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(maxopenfd); -} - - -static PyObject* -DBEnv_set_mp_max_write(DBEnvObject* self, PyObject* args) -{ - int err; - int maxwrite, maxwrite_sleep; - - if (!PyArg_ParseTuple(args, "ii:set_mp_max_write", &maxwrite, - &maxwrite_sleep)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_mp_max_write(self->db_env, maxwrite, - maxwrite_sleep); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_get_mp_max_write(DBEnvObject* self) -{ - int err; - int maxwrite; -#if (DBVER >= 46) - db_timeout_t maxwrite_sleep; -#else - int maxwrite_sleep; -#endif - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_mp_max_write(self->db_env, &maxwrite, - &maxwrite_sleep); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - return Py_BuildValue("(ii)", maxwrite, (int)maxwrite_sleep); -} -#endif - - -static PyObject* -DBEnv_set_verbose(DBEnvObject* self, PyObject* args) -{ - int err; - int which, onoff; - - if (!PyArg_ParseTuple(args, "ii:set_verbose", &which, &onoff)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_verbose(self->db_env, which, onoff); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 42) -static PyObject* -DBEnv_get_verbose(DBEnvObject* self, PyObject* args) -{ - int err; - int which; - int verbose; - - if (!PyArg_ParseTuple(args, "i:get_verbose", &which)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->get_verbose(self->db_env, which, &verbose); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return PyBool_FromLong(verbose); -} -#endif - -#if (DBVER >= 45) -static void -_dbenv_event_notifyCallback(DB_ENV* db_env, u_int32_t event, void *event_info) -{ - DBEnvObject *dbenv; - PyObject* callback; - PyObject* args; - PyObject* result = NULL; - - MYDB_BEGIN_BLOCK_THREADS; - dbenv = (DBEnvObject *)db_env->app_private; - callback = dbenv->event_notifyCallback; - if (callback) { - if (event == DB_EVENT_REP_NEWMASTER) { - args = Py_BuildValue("(Oii)", dbenv, event, *((int *)event_info)); - } else { - args = Py_BuildValue("(OiO)", dbenv, event, Py_None); - } - if (args) { - result = PyEval_CallObject(callback, args); - } - if ((!args) || (!result)) { - PyErr_Print(); - } - Py_XDECREF(args); - Py_XDECREF(result); - } - MYDB_END_BLOCK_THREADS; -} -#endif - -#if (DBVER >= 45) -static PyObject* -DBEnv_set_event_notify(DBEnvObject* self, PyObject* notifyFunc) -{ - int err; - - CHECK_ENV_NOT_CLOSED(self); - - if (!PyCallable_Check(notifyFunc)) { - makeTypeError("Callable", notifyFunc); - return NULL; - } - - Py_XDECREF(self->event_notifyCallback); - Py_INCREF(notifyFunc); - self->event_notifyCallback = notifyFunc; - - /* This is to workaround a problem with un-initialized threads (see - comment in DB_associate) */ -#ifdef WITH_THREAD - PyEval_InitThreads(); -#endif - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->set_event_notify(self->db_env, _dbenv_event_notifyCallback); - MYDB_END_ALLOW_THREADS; - - if (err) { - Py_DECREF(notifyFunc); - self->event_notifyCallback = NULL; - } - - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -/* --------------------------------------------------------------------- */ -/* REPLICATION METHODS: Base Replication */ - - -static PyObject* -DBEnv_rep_process_message(DBEnvObject* self, PyObject* args) -{ - int err; - PyObject *control_py, *rec_py; - DBT control, rec; - int envid; -#if (DBVER >= 42) - DB_LSN lsn; -#endif - - if (!PyArg_ParseTuple(args, "OOi:rep_process_message", &control_py, - &rec_py, &envid)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - if (!make_dbt(control_py, &control)) - return NULL; - if (!make_dbt(rec_py, &rec)) - return NULL; - - MYDB_BEGIN_ALLOW_THREADS; -#if (DBVER >= 46) - err = self->db_env->rep_process_message(self->db_env, &control, &rec, - envid, &lsn); -#else -#if (DBVER >= 42) - err = self->db_env->rep_process_message(self->db_env, &control, &rec, - &envid, &lsn); -#else - err = self->db_env->rep_process_message(self->db_env, &control, &rec, - &envid); -#endif -#endif - MYDB_END_ALLOW_THREADS; - switch (err) { - case DB_REP_NEWMASTER : - return Py_BuildValue("(iO)", envid, Py_None); - break; - - case DB_REP_DUPMASTER : - case DB_REP_HOLDELECTION : -#if (DBVER >= 44) - case DB_REP_IGNORE : - case DB_REP_JOIN_FAILURE : -#endif - return Py_BuildValue("(iO)", err, Py_None); - break; - case DB_REP_NEWSITE : - { - PyObject *tmp, *r; - - if (!(tmp = PyBytes_FromStringAndSize(rec.data, rec.size))) { - return NULL; - } - - r = Py_BuildValue("(iO)", err, tmp); - Py_DECREF(tmp); - return r; - break; - } -#if (DBVER >= 42) - case DB_REP_NOTPERM : - case DB_REP_ISPERM : - return Py_BuildValue("(i(ll))", err, lsn.file, lsn.offset); - break; -#endif - } - RETURN_IF_ERR(); - return Py_BuildValue("(OO)", Py_None, Py_None); -} - -static int -_DBEnv_rep_transportCallback(DB_ENV* db_env, const DBT* control, const DBT* rec, - const DB_LSN *lsn, int envid, u_int32_t flags) -{ - DBEnvObject *dbenv; - PyObject* rep_transport; - PyObject* args; - PyObject *a, *b; - PyObject* result = NULL; - int ret=0; - - MYDB_BEGIN_BLOCK_THREADS; - dbenv = (DBEnvObject *)db_env->app_private; - rep_transport = dbenv->rep_transport; - - /* - ** The errors in 'a' or 'b' are detected in "Py_BuildValue". - */ - a = PyBytes_FromStringAndSize(control->data, control->size); - b = PyBytes_FromStringAndSize(rec->data, rec->size); - - args = Py_BuildValue( -#if (PY_VERSION_HEX >= 0x02040000) - "(OOO(ll)iI)", -#else - "(OOO(ll)ii)", -#endif - dbenv, - a, b, - lsn->file, lsn->offset, envid, flags); - if (args) { - result = PyEval_CallObject(rep_transport, args); - } - - if ((!args) || (!result)) { - PyErr_Print(); - ret = -1; - } - Py_XDECREF(a); - Py_XDECREF(b); - Py_XDECREF(args); - Py_XDECREF(result); - MYDB_END_BLOCK_THREADS; - return ret; -} - -#if (DBVER <= 41) -static int -_DBEnv_rep_transportCallbackOLD(DB_ENV* db_env, const DBT* control, const DBT* rec, - int envid, u_int32_t flags) -{ - DB_LSN lsn; - - lsn.file = -1; /* Dummy values */ - lsn.offset = -1; - return _DBEnv_rep_transportCallback(db_env, control, rec, &lsn, envid, - flags); -} -#endif - -static PyObject* -DBEnv_rep_set_transport(DBEnvObject* self, PyObject* args) -{ - int err; - int envid; - PyObject *rep_transport; - - if (!PyArg_ParseTuple(args, "iO:rep_set_transport", &envid, &rep_transport)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - if (!PyCallable_Check(rep_transport)) { - makeTypeError("Callable", rep_transport); - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; -#if (DBVER >=45) - err = self->db_env->rep_set_transport(self->db_env, envid, - &_DBEnv_rep_transportCallback); -#else -#if (DBVER >= 42) - err = self->db_env->set_rep_transport(self->db_env, envid, - &_DBEnv_rep_transportCallback); -#else - err = self->db_env->set_rep_transport(self->db_env, envid, - &_DBEnv_rep_transportCallbackOLD); -#endif -#endif - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - Py_DECREF(self->rep_transport); - Py_INCREF(rep_transport); - self->rep_transport = rep_transport; - RETURN_NONE(); -} - -#if (DBVER >= 47) -static PyObject* -DBEnv_rep_set_request(DBEnvObject* self, PyObject* args) -{ - int err; - unsigned int minimum, maximum; - - if (!PyArg_ParseTuple(args,"II:rep_set_request", &minimum, &maximum)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_set_request(self->db_env, minimum, maximum); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_rep_get_request(DBEnvObject* self) -{ - int err; - u_int32_t minimum, maximum; - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_get_request(self->db_env, &minimum, &maximum); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); -#if (PY_VERSION_HEX >= 0x02040000) - return Py_BuildValue("II", minimum, maximum); -#else - return Py_BuildValue("ii", minimum, maximum); -#endif -} -#endif - -#if (DBVER >= 45) -static PyObject* -DBEnv_rep_set_limit(DBEnvObject* self, PyObject* args) -{ - int err; - int limit; - - if (!PyArg_ParseTuple(args,"i:rep_set_limit", &limit)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_set_limit(self->db_env, 0, limit); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_rep_get_limit(DBEnvObject* self) -{ - int err; - u_int32_t gbytes, bytes; - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_get_limit(self->db_env, &gbytes, &bytes); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(bytes); -} -#endif - -#if (DBVER >= 44) -static PyObject* -DBEnv_rep_set_config(DBEnvObject* self, PyObject* args) -{ - int err; - int which; - int onoff; - - if (!PyArg_ParseTuple(args,"ii:rep_set_config", &which, &onoff)) - return NULL; - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_set_config(self->db_env, which, onoff); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_rep_get_config(DBEnvObject* self, PyObject* args) -{ - int err; - int which; - int onoff; - - if (!PyArg_ParseTuple(args, "i:rep_get_config", &which)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_get_config(self->db_env, which, &onoff); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return PyBool_FromLong(onoff); -} -#endif - -#if (DBVER >= 46) -static PyObject* -DBEnv_rep_elect(DBEnvObject* self, PyObject* args) -{ - int err; - u_int32_t nsites, nvotes; - - if (!PyArg_ParseTuple(args, "II:rep_elect", &nsites, &nvotes)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_elect(self->db_env, nsites, nvotes, 0); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - -static PyObject* -DBEnv_rep_start(DBEnvObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - PyObject *cdata_py = Py_None; - DBT cdata; - int flags; - static char* kwnames[] = {"flags","cdata", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "i|O:rep_start", kwnames, &flags, &cdata_py)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - - if (!make_dbt(cdata_py, &cdata)) - return NULL; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_start(self->db_env, cdata.size ? &cdata : NULL, - flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -#if (DBVER >= 44) -static PyObject* -DBEnv_rep_sync(DBEnvObject* self) -{ - int err; - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_sync(self->db_env, 0); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -#if (DBVER >= 45) -static PyObject* -DBEnv_rep_set_nsites(DBEnvObject* self, PyObject* args) -{ - int err; - int nsites; - - if (!PyArg_ParseTuple(args, "i:rep_set_nsites", &nsites)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_set_nsites(self->db_env, nsites); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_rep_get_nsites(DBEnvObject* self) -{ - int err; -#if (DBVER >= 47) - u_int32_t nsites; -#else - int nsites; -#endif - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_get_nsites(self->db_env, &nsites); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(nsites); -} - -static PyObject* -DBEnv_rep_set_priority(DBEnvObject* self, PyObject* args) -{ - int err; - int priority; - - if (!PyArg_ParseTuple(args, "i:rep_set_priority", &priority)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_set_priority(self->db_env, priority); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_rep_get_priority(DBEnvObject* self) -{ - int err; -#if (DBVER >= 47) - u_int32_t priority; -#else - int priority; -#endif - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_get_priority(self->db_env, &priority); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(priority); -} - -static PyObject* -DBEnv_rep_set_timeout(DBEnvObject* self, PyObject* args) -{ - int err; - int which, timeout; - - if (!PyArg_ParseTuple(args, "ii:rep_set_timeout", &which, &timeout)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_set_timeout(self->db_env, which, timeout); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_rep_get_timeout(DBEnvObject* self, PyObject* args) -{ - int err; - int which; - u_int32_t timeout; - - if (!PyArg_ParseTuple(args, "i:rep_get_timeout", &which)) { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_get_timeout(self->db_env, which, &timeout); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(timeout); -} -#endif - - -#if (DBVER >= 47) -static PyObject* -DBEnv_rep_set_clockskew(DBEnvObject* self, PyObject* args) -{ - int err; - unsigned int fast, slow; - -#if (PY_VERSION_HEX >= 0x02040000) - if (!PyArg_ParseTuple(args,"II:rep_set_clockskew", &fast, &slow)) - return NULL; -#else - if (!PyArg_ParseTuple(args,"ii:rep_set_clockskew", &fast, &slow)) - return NULL; -#endif - - CHECK_ENV_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_set_clockskew(self->db_env, fast, slow); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_rep_get_clockskew(DBEnvObject* self) -{ - int err; - unsigned int fast, slow; - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_get_clockskew(self->db_env, &fast, &slow); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); -#if (PY_VERSION_HEX >= 0x02040000) - return Py_BuildValue("(II)", fast, slow); -#else - return Py_BuildValue("(ii)", fast, slow); -#endif -} -#endif - -#if (DBVER >= 43) -static PyObject* -DBEnv_rep_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:rep_stat_print", - kwnames, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_stat_print(self->db_env, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - -static PyObject* -DBEnv_rep_stat(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - DB_REP_STAT *statp; - PyObject *stats; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:rep_stat", - kwnames, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->rep_stat(self->db_env, &statp, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - stats=PyDict_New(); - if (stats == NULL) { - free(statp); - return NULL; - } - -#define MAKE_ENTRY(name) _addIntToDict(stats, #name, statp->st_##name) -#define MAKE_DB_LSN_ENTRY(name) _addDB_lsnToDict(stats , #name, statp->st_##name) - -#if (DBVER >= 44) - MAKE_ENTRY(bulk_fills); - MAKE_ENTRY(bulk_overflows); - MAKE_ENTRY(bulk_records); - MAKE_ENTRY(bulk_transfers); - MAKE_ENTRY(client_rerequests); - MAKE_ENTRY(client_svc_miss); - MAKE_ENTRY(client_svc_req); -#endif - MAKE_ENTRY(dupmasters); -#if (DBVER >= 43) - MAKE_ENTRY(egen); - MAKE_ENTRY(election_nvotes); - MAKE_ENTRY(startup_complete); - MAKE_ENTRY(pg_duplicated); - MAKE_ENTRY(pg_records); - MAKE_ENTRY(pg_requested); - MAKE_ENTRY(next_pg); - MAKE_ENTRY(waiting_pg); -#endif - MAKE_ENTRY(election_cur_winner); - MAKE_ENTRY(election_gen); - MAKE_DB_LSN_ENTRY(election_lsn); - MAKE_ENTRY(election_nsites); - MAKE_ENTRY(election_priority); -#if (DBVER >= 44) - MAKE_ENTRY(election_sec); - MAKE_ENTRY(election_usec); -#endif - MAKE_ENTRY(election_status); - MAKE_ENTRY(election_tiebreaker); - MAKE_ENTRY(election_votes); - MAKE_ENTRY(elections); - MAKE_ENTRY(elections_won); - MAKE_ENTRY(env_id); - MAKE_ENTRY(env_priority); - MAKE_ENTRY(gen); - MAKE_ENTRY(log_duplicated); - MAKE_ENTRY(log_queued); - MAKE_ENTRY(log_queued_max); - MAKE_ENTRY(log_queued_total); - MAKE_ENTRY(log_records); - MAKE_ENTRY(log_requested); - MAKE_ENTRY(master); - MAKE_ENTRY(master_changes); -#if (DBVER >= 47) - MAKE_ENTRY(max_lease_sec); - MAKE_ENTRY(max_lease_usec); - MAKE_DB_LSN_ENTRY(max_perm_lsn); -#endif - MAKE_ENTRY(msgs_badgen); - MAKE_ENTRY(msgs_processed); - MAKE_ENTRY(msgs_recover); - MAKE_ENTRY(msgs_send_failures); - MAKE_ENTRY(msgs_sent); - MAKE_ENTRY(newsites); - MAKE_DB_LSN_ENTRY(next_lsn); - MAKE_ENTRY(nsites); - MAKE_ENTRY(nthrottles); - MAKE_ENTRY(outdated); -#if (DBVER >= 46) - MAKE_ENTRY(startsync_delayed); -#endif - MAKE_ENTRY(status); - MAKE_ENTRY(txns_applied); - MAKE_DB_LSN_ENTRY(waiting_lsn); - -#undef MAKE_DB_LSN_ENTRY -#undef MAKE_ENTRY - - free(statp); - return stats; -} - -/* --------------------------------------------------------------------- */ -/* REPLICATION METHODS: Replication Manager */ - -#if (DBVER >= 45) -static PyObject* -DBEnv_repmgr_start(DBEnvObject* self, PyObject* args, PyObject* - kwargs) -{ - int err; - int nthreads, flags; - static char* kwnames[] = {"nthreads","flags", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "ii:repmgr_start", kwnames, &nthreads, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->repmgr_start(self->db_env, nthreads, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_repmgr_set_local_site(DBEnvObject* self, PyObject* args, PyObject* - kwargs) -{ - int err; - char *host; - int port; - int flags = 0; - static char* kwnames[] = {"host", "port", "flags", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "si|i:repmgr_set_local_site", kwnames, &host, &port, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->repmgr_set_local_site(self->db_env, host, port, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_repmgr_add_remote_site(DBEnvObject* self, PyObject* args, PyObject* - kwargs) -{ - int err; - char *host; - int port; - int flags = 0; - int eidp; - static char* kwnames[] = {"host", "port", "flags", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "si|i:repmgr_add_remote_site", kwnames, &host, &port, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->repmgr_add_remote_site(self->db_env, host, port, &eidp, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(eidp); -} - -static PyObject* -DBEnv_repmgr_set_ack_policy(DBEnvObject* self, PyObject* args) -{ - int err; - int ack_policy; - - if (!PyArg_ParseTuple(args, "i:repmgr_set_ack_policy", &ack_policy)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->repmgr_set_ack_policy(self->db_env, ack_policy); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_repmgr_get_ack_policy(DBEnvObject* self) -{ - int err; - int ack_policy; - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->repmgr_get_ack_policy(self->db_env, &ack_policy); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - return NUMBER_FromLong(ack_policy); -} - -static PyObject* -DBEnv_repmgr_site_list(DBEnvObject* self) -{ - int err; - unsigned int countp; - DB_REPMGR_SITE *listp; - PyObject *stats, *key, *tuple; - - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->repmgr_site_list(self->db_env, &countp, &listp); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - stats=PyDict_New(); - if (stats == NULL) { - free(listp); - return NULL; - } - - for(;countp--;) { - key=NUMBER_FromLong(listp[countp].eid); - if(!key) { - Py_DECREF(stats); - free(listp); - return NULL; - } -#if (PY_VERSION_HEX >= 0x02040000) - tuple=Py_BuildValue("(sII)", listp[countp].host, - listp[countp].port, listp[countp].status); -#else - tuple=Py_BuildValue("(sii)", listp[countp].host, - listp[countp].port, listp[countp].status); -#endif - if(!tuple) { - Py_DECREF(key); - Py_DECREF(stats); - free(listp); - return NULL; - } - if(PyDict_SetItem(stats, key, tuple)) { - Py_DECREF(key); - Py_DECREF(tuple); - Py_DECREF(stats); - free(listp); - return NULL; - } - Py_DECREF(key); - Py_DECREF(tuple); - } - free(listp); - return stats; -} -#endif - -#if (DBVER >= 46) -static PyObject* -DBEnv_repmgr_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:repmgr_stat_print", - kwnames, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->repmgr_stat_print(self->db_env, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBEnv_repmgr_stat(DBEnvObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - DB_REPMGR_STAT *statp; - PyObject *stats; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:repmgr_stat", - kwnames, &flags)) - { - return NULL; - } - CHECK_ENV_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; - err = self->db_env->repmgr_stat(self->db_env, &statp, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - stats=PyDict_New(); - if (stats == NULL) { - free(statp); - return NULL; - } - -#define MAKE_ENTRY(name) _addIntToDict(stats, #name, statp->st_##name) - - MAKE_ENTRY(perm_failed); - MAKE_ENTRY(msgs_queued); - MAKE_ENTRY(msgs_dropped); - MAKE_ENTRY(connection_drop); - MAKE_ENTRY(connect_fail); - -#undef MAKE_ENTRY - - free(statp); - return stats; -} -#endif - - -/* --------------------------------------------------------------------- */ -/* DBTxn methods */ - - -static void _close_transaction_cursors(DBTxnObject* txn) -{ - PyObject *dummy; - - while(txn->children_cursors) { - PyErr_Warn(PyExc_RuntimeWarning, - "Must close cursors before resolving a transaction."); - dummy=DBC_close_internal(txn->children_cursors); - Py_XDECREF(dummy); - } -} - -static void _promote_transaction_dbs_and_sequences(DBTxnObject *txn) -{ - DBObject *db; -#if (DBVER >= 43) - DBSequenceObject *dbs; -#endif - - while (txn->children_dbs) { - db=txn->children_dbs; - EXTRACT_FROM_DOUBLE_LINKED_LIST_TXN(db); - if (txn->parent_txn) { - INSERT_IN_DOUBLE_LINKED_LIST_TXN(txn->parent_txn->children_dbs,db); - db->txn=txn->parent_txn; - } else { - /* The db is already linked to its environment, - ** so nothing to do. - */ - db->txn=NULL; - } - } - -#if (DBVER >= 43) - while (txn->children_sequences) { - dbs=txn->children_sequences; - EXTRACT_FROM_DOUBLE_LINKED_LIST_TXN(dbs); - if (txn->parent_txn) { - INSERT_IN_DOUBLE_LINKED_LIST_TXN(txn->parent_txn->children_sequences,dbs); - dbs->txn=txn->parent_txn; - } else { - /* The sequence is already linked to its - ** parent db. Nothing to do. - */ - dbs->txn=NULL; - } - } -#endif -} - - -static PyObject* -DBTxn_commit(DBTxnObject* self, PyObject* args) -{ - int flags=0, err; - DB_TXN *txn; - - if (!PyArg_ParseTuple(args, "|i:commit", &flags)) - return NULL; - - _close_transaction_cursors(self); - - if (!self->txn) { - PyObject *t = Py_BuildValue("(is)", 0, "DBTxn must not be used " - "after txn_commit, txn_abort " - "or txn_discard"); - if (t) { - PyErr_SetObject(DBError, t); - Py_DECREF(t); - } - return NULL; - } - self->flag_prepare=0; - txn = self->txn; - self->txn = NULL; /* this DB_TXN is no longer valid after this call */ - - EXTRACT_FROM_DOUBLE_LINKED_LIST(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = txn->commit(txn, flags); - MYDB_END_ALLOW_THREADS; - - _promote_transaction_dbs_and_sequences(self); - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBTxn_prepare(DBTxnObject* self, PyObject* args) -{ - int err; - char* gid=NULL; - int gid_size=0; - - if (!PyArg_ParseTuple(args, "s#:prepare", &gid, &gid_size)) - return NULL; - - if (gid_size != DB_GID_SIZE) { - PyErr_SetString(PyExc_TypeError, - "gid must be DB_GID_SIZE bytes long"); - return NULL; - } - - if (!self->txn) { - PyObject *t = Py_BuildValue("(is)", 0,"DBTxn must not be used " - "after txn_commit, txn_abort " - "or txn_discard"); - if (t) { - PyErr_SetObject(DBError, t); - Py_DECREF(t); - } - return NULL; - } - self->flag_prepare=1; /* Prepare state */ - MYDB_BEGIN_ALLOW_THREADS; - err = self->txn->prepare(self->txn, (u_int8_t*)gid); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -static PyObject* -DBTxn_abort_discard_internal(DBTxnObject* self, int discard) -{ - PyObject *dummy; - int err=0; - DB_TXN *txn; - - if (!self->txn) { - PyObject *t = Py_BuildValue("(is)", 0, "DBTxn must not be used " - "after txn_commit, txn_abort " - "or txn_discard"); - if (t) { - PyErr_SetObject(DBError, t); - Py_DECREF(t); - } - return NULL; - } - txn = self->txn; - self->txn = NULL; /* this DB_TXN is no longer valid after this call */ - - _close_transaction_cursors(self); -#if (DBVER >= 43) - while (self->children_sequences) { - dummy=DBSequence_close_internal(self->children_sequences,0,0); - Py_XDECREF(dummy); - } -#endif - while (self->children_dbs) { - dummy=DB_close_internal(self->children_dbs, 0, 0); - Py_XDECREF(dummy); - } - - EXTRACT_FROM_DOUBLE_LINKED_LIST(self); - - MYDB_BEGIN_ALLOW_THREADS; - if (discard) { - assert(!self->flag_prepare); - err = txn->discard(txn,0); - } else { - /* - ** If the transaction is in the "prepare" or "recover" state, - ** we better do not implicitly abort it. - */ - if (!self->flag_prepare) { - err = txn->abort(txn); - } - } - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBTxn_abort(DBTxnObject* self) -{ - self->flag_prepare=0; - _close_transaction_cursors(self); - - return DBTxn_abort_discard_internal(self,0); -} - -static PyObject* -DBTxn_discard(DBTxnObject* self) -{ - self->flag_prepare=0; - _close_transaction_cursors(self); - - return DBTxn_abort_discard_internal(self,1); -} - - -static PyObject* -DBTxn_id(DBTxnObject* self) -{ - int id; - - if (!self->txn) { - PyObject *t = Py_BuildValue("(is)", 0, "DBTxn must not be used " - "after txn_commit, txn_abort " - "or txn_discard"); - if (t) { - PyErr_SetObject(DBError, t); - Py_DECREF(t); - } - return NULL; - } - MYDB_BEGIN_ALLOW_THREADS; - id = self->txn->id(self->txn); - MYDB_END_ALLOW_THREADS; - return NUMBER_FromLong(id); -} - - -static PyObject* -DBTxn_set_timeout(DBTxnObject* self, PyObject* args, PyObject* kwargs) -{ - int err; - u_int32_t flags=0; - u_int32_t timeout = 0; - static char* kwnames[] = { "timeout", "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii:set_timeout", kwnames, - &timeout, &flags)) { - return NULL; - } - - MYDB_BEGIN_ALLOW_THREADS; - err = self->txn->set_timeout(self->txn, (db_timeout_t)timeout, flags); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - RETURN_NONE(); -} - - -#if (DBVER >= 44) -static PyObject* -DBTxn_set_name(DBTxnObject* self, PyObject* args) -{ - int err; - const char *name; - - if (!PyArg_ParseTuple(args, "s:set_name", &name)) - return NULL; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->txn->set_name(self->txn, name); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); - RETURN_NONE(); -} -#endif - - -#if (DBVER >= 44) -static PyObject* -DBTxn_get_name(DBTxnObject* self) -{ - int err; - const char *name; - - MYDB_BEGIN_ALLOW_THREADS; - err = self->txn->get_name(self->txn, &name); - MYDB_END_ALLOW_THREADS; - - RETURN_IF_ERR(); -#if (PY_VERSION_HEX < 0x03000000) - if (!name) { - return PyString_FromString(""); - } - return PyString_FromString(name); -#else - if (!name) { - return PyUnicode_FromString(""); - } - return PyUnicode_FromString(name); -#endif -} -#endif - - -#if (DBVER >= 43) -/* --------------------------------------------------------------------- */ -/* DBSequence methods */ - - -static PyObject* -DBSequence_close_internal(DBSequenceObject* self, int flags, int do_not_close) -{ - int err=0; - - if (self->sequence!=NULL) { - EXTRACT_FROM_DOUBLE_LINKED_LIST(self); - if (self->txn) { - EXTRACT_FROM_DOUBLE_LINKED_LIST_TXN(self); - self->txn=NULL; - } - - /* - ** "do_not_close" is used to dispose all related objects in the - ** tree, without actually releasing the "root" object. - ** This is done, for example, because function calls like - ** "DBSequence.remove()" implicitly close the underlying handle. So - ** the handle doesn't need to be closed, but related objects - ** must be cleaned up. - */ - if (!do_not_close) { - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->close(self->sequence, flags); - MYDB_END_ALLOW_THREADS - } - self->sequence = NULL; - - RETURN_IF_ERR(); - } - - RETURN_NONE(); -} - -static PyObject* -DBSequence_close(DBSequenceObject* self, PyObject* args) -{ - int flags=0; - if (!PyArg_ParseTuple(args,"|i:close", &flags)) - return NULL; - - return DBSequence_close_internal(self,flags,0); -} - -static PyObject* -DBSequence_get(DBSequenceObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags = 0; - int delta = 1; - db_seq_t value; - PyObject *txnobj = NULL; - DB_TXN *txn = NULL; - static char* kwnames[] = {"delta", "txn", "flags", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iOi:get", kwnames, &delta, &txnobj, &flags)) - return NULL; - CHECK_SEQUENCE_NOT_CLOSED(self) - - if (!checkTxnObj(txnobj, &txn)) - return NULL; - - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->get(self->sequence, txn, delta, &value, flags); - MYDB_END_ALLOW_THREADS - - RETURN_IF_ERR(); - return PyLong_FromLongLong(value); -} - -static PyObject* -DBSequence_get_dbp(DBSequenceObject* self) -{ - CHECK_SEQUENCE_NOT_CLOSED(self) - Py_INCREF(self->mydb); - return (PyObject* )self->mydb; -} - -static PyObject* -DBSequence_get_key(DBSequenceObject* self) -{ - int err; - DBT key; - PyObject *retval = NULL; - - key.flags = DB_DBT_MALLOC; - CHECK_SEQUENCE_NOT_CLOSED(self) - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->get_key(self->sequence, &key); - MYDB_END_ALLOW_THREADS - - if (!err) - retval = Build_PyString(key.data, key.size); - - FREE_DBT(key); - RETURN_IF_ERR(); - - return retval; -} - -static PyObject* -DBSequence_initial_value(DBSequenceObject* self, PyObject* args) -{ - int err; - PY_LONG_LONG value; - db_seq_t value2; - if (!PyArg_ParseTuple(args,"L:initial_value", &value)) - return NULL; - CHECK_SEQUENCE_NOT_CLOSED(self) - - value2=value; /* If truncation, compiler should show a warning */ - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->initial_value(self->sequence, value2); - MYDB_END_ALLOW_THREADS - - RETURN_IF_ERR(); - - RETURN_NONE(); -} - -static PyObject* -DBSequence_open(DBSequenceObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags = 0; - PyObject* keyobj; - PyObject *txnobj = NULL; - DB_TXN *txn = NULL; - DBT key; - - static char* kwnames[] = {"key", "txn", "flags", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|Oi:open", kwnames, &keyobj, &txnobj, &flags)) - return NULL; - - if (!checkTxnObj(txnobj, &txn)) - return NULL; - - if (!make_key_dbt(self->mydb, keyobj, &key, NULL)) - return NULL; - - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->open(self->sequence, txn, &key, flags); - MYDB_END_ALLOW_THREADS - - FREE_DBT(key); - RETURN_IF_ERR(); - - if (txn) { - INSERT_IN_DOUBLE_LINKED_LIST_TXN(((DBTxnObject *)txnobj)->children_sequences,self); - self->txn=(DBTxnObject *)txnobj; - } - - RETURN_NONE(); -} - -static PyObject* -DBSequence_remove(DBSequenceObject* self, PyObject* args, PyObject* kwargs) -{ - PyObject *dummy; - int err, flags = 0; - PyObject *txnobj = NULL; - DB_TXN *txn = NULL; - - static char* kwnames[] = {"txn", "flags", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:remove", kwnames, &txnobj, &flags)) - return NULL; - - if (!checkTxnObj(txnobj, &txn)) - return NULL; - - CHECK_SEQUENCE_NOT_CLOSED(self) - - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->remove(self->sequence, txn, flags); - MYDB_END_ALLOW_THREADS - - dummy=DBSequence_close_internal(self,flags,1); - Py_XDECREF(dummy); - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBSequence_set_cachesize(DBSequenceObject* self, PyObject* args) -{ - int err, size; - if (!PyArg_ParseTuple(args,"i:set_cachesize", &size)) - return NULL; - CHECK_SEQUENCE_NOT_CLOSED(self) - - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->set_cachesize(self->sequence, size); - MYDB_END_ALLOW_THREADS - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBSequence_get_cachesize(DBSequenceObject* self) -{ - int err, size; - - CHECK_SEQUENCE_NOT_CLOSED(self) - - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->get_cachesize(self->sequence, &size); - MYDB_END_ALLOW_THREADS - - RETURN_IF_ERR(); - return NUMBER_FromLong(size); -} - -static PyObject* -DBSequence_set_flags(DBSequenceObject* self, PyObject* args) -{ - int err, flags = 0; - if (!PyArg_ParseTuple(args,"i:set_flags", &flags)) - return NULL; - CHECK_SEQUENCE_NOT_CLOSED(self) - - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->set_flags(self->sequence, flags); - MYDB_END_ALLOW_THREADS - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBSequence_get_flags(DBSequenceObject* self) -{ - unsigned int flags; - int err; - - CHECK_SEQUENCE_NOT_CLOSED(self) - - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->get_flags(self->sequence, &flags); - MYDB_END_ALLOW_THREADS - - RETURN_IF_ERR(); - return NUMBER_FromLong((int)flags); -} - -static PyObject* -DBSequence_set_range(DBSequenceObject* self, PyObject* args) -{ - int err; - PY_LONG_LONG min, max; - db_seq_t min2, max2; - if (!PyArg_ParseTuple(args,"(LL):set_range", &min, &max)) - return NULL; - CHECK_SEQUENCE_NOT_CLOSED(self) - - min2=min; /* If truncation, compiler should show a warning */ - max2=max; - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->set_range(self->sequence, min2, max2); - MYDB_END_ALLOW_THREADS - - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBSequence_get_range(DBSequenceObject* self) -{ - int err; - PY_LONG_LONG min, max; - db_seq_t min2, max2; - - CHECK_SEQUENCE_NOT_CLOSED(self) - - MYDB_BEGIN_ALLOW_THREADS - err = self->sequence->get_range(self->sequence, &min2, &max2); - MYDB_END_ALLOW_THREADS - - RETURN_IF_ERR(); - min=min2; /* If truncation, compiler should show a warning */ - max=max2; - return Py_BuildValue("(LL)", min, max); -} - - -static PyObject* -DBSequence_stat_print(DBSequenceObject* self, PyObject* args, PyObject *kwargs) -{ - int err; - int flags=0; - static char* kwnames[] = { "flags", NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:stat_print", - kwnames, &flags)) - { - return NULL; - } - - CHECK_SEQUENCE_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->sequence->stat_print(self->sequence, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - RETURN_NONE(); -} - -static PyObject* -DBSequence_stat(DBSequenceObject* self, PyObject* args, PyObject* kwargs) -{ - int err, flags = 0; - DB_SEQUENCE_STAT* sp = NULL; - PyObject* dict_stat; - static char* kwnames[] = {"flags", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:stat", kwnames, &flags)) - return NULL; - CHECK_SEQUENCE_NOT_CLOSED(self); - - MYDB_BEGIN_ALLOW_THREADS; - err = self->sequence->stat(self->sequence, &sp, flags); - MYDB_END_ALLOW_THREADS; - RETURN_IF_ERR(); - - if ((dict_stat = PyDict_New()) == NULL) { - free(sp); - return NULL; - } - - -#define MAKE_INT_ENTRY(name) _addIntToDict(dict_stat, #name, sp->st_##name) -#define MAKE_LONG_LONG_ENTRY(name) _addDb_seq_tToDict(dict_stat, #name, sp->st_##name) - - MAKE_INT_ENTRY(wait); - MAKE_INT_ENTRY(nowait); - MAKE_LONG_LONG_ENTRY(current); - MAKE_LONG_LONG_ENTRY(value); - MAKE_LONG_LONG_ENTRY(last_value); - MAKE_LONG_LONG_ENTRY(min); - MAKE_LONG_LONG_ENTRY(max); - MAKE_INT_ENTRY(cache_size); - MAKE_INT_ENTRY(flags); - -#undef MAKE_INT_ENTRY -#undef MAKE_LONG_LONG_ENTRY - - free(sp); - return dict_stat; -} -#endif - - -/* --------------------------------------------------------------------- */ -/* Method definition tables and type objects */ - -static PyMethodDef DB_methods[] = { - {"append", (PyCFunction)DB_append, METH_VARARGS|METH_KEYWORDS}, - {"associate", (PyCFunction)DB_associate, METH_VARARGS|METH_KEYWORDS}, - {"close", (PyCFunction)DB_close, METH_VARARGS}, -#if (DBVER >= 47) - {"compact", (PyCFunction)DB_compact, METH_VARARGS|METH_KEYWORDS}, -#endif - {"consume", (PyCFunction)DB_consume, METH_VARARGS|METH_KEYWORDS}, - {"consume_wait", (PyCFunction)DB_consume_wait, METH_VARARGS|METH_KEYWORDS}, - {"cursor", (PyCFunction)DB_cursor, METH_VARARGS|METH_KEYWORDS}, - {"delete", (PyCFunction)DB_delete, METH_VARARGS|METH_KEYWORDS}, - {"fd", (PyCFunction)DB_fd, METH_NOARGS}, -#if (DBVER >= 46) - {"exists", (PyCFunction)DB_exists, - METH_VARARGS|METH_KEYWORDS}, -#endif - {"get", (PyCFunction)DB_get, METH_VARARGS|METH_KEYWORDS}, - {"pget", (PyCFunction)DB_pget, METH_VARARGS|METH_KEYWORDS}, - {"get_both", (PyCFunction)DB_get_both, METH_VARARGS|METH_KEYWORDS}, - {"get_byteswapped", (PyCFunction)DB_get_byteswapped,METH_NOARGS}, - {"get_size", (PyCFunction)DB_get_size, METH_VARARGS|METH_KEYWORDS}, - {"get_type", (PyCFunction)DB_get_type, METH_NOARGS}, - {"join", (PyCFunction)DB_join, METH_VARARGS}, - {"key_range", (PyCFunction)DB_key_range, METH_VARARGS|METH_KEYWORDS}, - {"has_key", (PyCFunction)DB_has_key, METH_VARARGS|METH_KEYWORDS}, - {"items", (PyCFunction)DB_items, METH_VARARGS}, - {"keys", (PyCFunction)DB_keys, METH_VARARGS}, - {"open", (PyCFunction)DB_open, METH_VARARGS|METH_KEYWORDS}, - {"put", (PyCFunction)DB_put, METH_VARARGS|METH_KEYWORDS}, - {"remove", (PyCFunction)DB_remove, METH_VARARGS|METH_KEYWORDS}, - {"rename", (PyCFunction)DB_rename, METH_VARARGS}, - {"set_bt_minkey", (PyCFunction)DB_set_bt_minkey, METH_VARARGS}, -#if (DBVER >= 42) - {"get_bt_minkey", (PyCFunction)DB_get_bt_minkey, METH_NOARGS}, -#endif - {"set_bt_compare", (PyCFunction)DB_set_bt_compare, METH_O}, - {"set_cachesize", (PyCFunction)DB_set_cachesize, METH_VARARGS}, -#if (DBVER >= 42) - {"get_cachesize", (PyCFunction)DB_get_cachesize, METH_NOARGS}, -#endif - {"set_encrypt", (PyCFunction)DB_set_encrypt, METH_VARARGS|METH_KEYWORDS}, -#if (DBVER >= 42) - {"get_encrypt_flags", (PyCFunction)DB_get_encrypt_flags, METH_NOARGS}, -#endif - - {"set_flags", (PyCFunction)DB_set_flags, METH_VARARGS}, -#if (DBVER >= 42) - {"get_flags", (PyCFunction)DB_get_flags, METH_NOARGS}, -#endif - {"set_h_ffactor", (PyCFunction)DB_set_h_ffactor, METH_VARARGS}, -#if (DBVER >= 42) - {"get_h_ffactor", (PyCFunction)DB_get_h_ffactor, METH_NOARGS}, -#endif - {"set_h_nelem", (PyCFunction)DB_set_h_nelem, METH_VARARGS}, -#if (DBVER >= 42) - {"get_h_nelem", (PyCFunction)DB_get_h_nelem, METH_NOARGS}, -#endif - {"set_lorder", (PyCFunction)DB_set_lorder, METH_VARARGS}, -#if (DBVER >= 42) - {"get_lorder", (PyCFunction)DB_get_lorder, METH_NOARGS}, -#endif - {"set_pagesize", (PyCFunction)DB_set_pagesize, METH_VARARGS}, -#if (DBVER >= 42) - {"get_pagesize", (PyCFunction)DB_get_pagesize, METH_NOARGS}, -#endif - {"set_re_delim", (PyCFunction)DB_set_re_delim, METH_VARARGS}, -#if (DBVER >= 42) - {"get_re_delim", (PyCFunction)DB_get_re_delim, METH_NOARGS}, -#endif - {"set_re_len", (PyCFunction)DB_set_re_len, METH_VARARGS}, -#if (DBVER >= 42) - {"get_re_len", (PyCFunction)DB_get_re_len, METH_NOARGS}, -#endif - {"set_re_pad", (PyCFunction)DB_set_re_pad, METH_VARARGS}, -#if (DBVER >= 42) - {"get_re_pad", (PyCFunction)DB_get_re_pad, METH_NOARGS}, -#endif - {"set_re_source", (PyCFunction)DB_set_re_source, METH_VARARGS}, -#if (DBVER >= 42) - {"get_re_source", (PyCFunction)DB_get_re_source, METH_NOARGS}, -#endif - {"set_q_extentsize",(PyCFunction)DB_set_q_extentsize, METH_VARARGS}, -#if (DBVER >= 42) - {"get_q_extentsize",(PyCFunction)DB_get_q_extentsize, METH_NOARGS}, -#endif - {"set_private", (PyCFunction)DB_set_private, METH_O}, - {"get_private", (PyCFunction)DB_get_private, METH_NOARGS}, -#if (DBVER >= 46) - {"set_priority", (PyCFunction)DB_set_priority, METH_VARARGS}, - {"get_priority", (PyCFunction)DB_get_priority, METH_NOARGS}, -#endif - {"stat", (PyCFunction)DB_stat, METH_VARARGS|METH_KEYWORDS}, -#if (DBVER >= 43) - {"stat_print", (PyCFunction)DB_stat_print, - METH_VARARGS|METH_KEYWORDS}, -#endif - {"sync", (PyCFunction)DB_sync, METH_VARARGS}, - {"truncate", (PyCFunction)DB_truncate, METH_VARARGS|METH_KEYWORDS}, - {"type", (PyCFunction)DB_get_type, METH_NOARGS}, - {"upgrade", (PyCFunction)DB_upgrade, METH_VARARGS}, - {"values", (PyCFunction)DB_values, METH_VARARGS}, - {"verify", (PyCFunction)DB_verify, METH_VARARGS|METH_KEYWORDS}, - {"set_get_returns_none",(PyCFunction)DB_set_get_returns_none, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - - -/* We need this to support __contains__() */ -static PySequenceMethods DB_sequence = { - 0, /* sq_length, mapping wins here */ - 0, /* sq_concat */ - 0, /* sq_repeat */ - 0, /* sq_item */ - 0, /* sq_slice */ - 0, /* sq_ass_item */ - 0, /* sq_ass_slice */ - (objobjproc)DB_contains, /* sq_contains */ - 0, /* sq_inplace_concat */ - 0, /* sq_inplace_repeat */ -}; - -static PyMappingMethods DB_mapping = { - DB_length, /*mp_length*/ - (binaryfunc)DB_subscript, /*mp_subscript*/ - (objobjargproc)DB_ass_sub, /*mp_ass_subscript*/ -}; - - -static PyMethodDef DBCursor_methods[] = { - {"close", (PyCFunction)DBC_close, METH_NOARGS}, - {"count", (PyCFunction)DBC_count, METH_VARARGS}, - {"current", (PyCFunction)DBC_current, METH_VARARGS|METH_KEYWORDS}, - {"delete", (PyCFunction)DBC_delete, METH_VARARGS}, - {"dup", (PyCFunction)DBC_dup, METH_VARARGS}, - {"first", (PyCFunction)DBC_first, METH_VARARGS|METH_KEYWORDS}, - {"get", (PyCFunction)DBC_get, METH_VARARGS|METH_KEYWORDS}, - {"pget", (PyCFunction)DBC_pget, METH_VARARGS|METH_KEYWORDS}, - {"get_recno", (PyCFunction)DBC_get_recno, METH_NOARGS}, - {"last", (PyCFunction)DBC_last, METH_VARARGS|METH_KEYWORDS}, - {"next", (PyCFunction)DBC_next, METH_VARARGS|METH_KEYWORDS}, - {"prev", (PyCFunction)DBC_prev, METH_VARARGS|METH_KEYWORDS}, - {"put", (PyCFunction)DBC_put, METH_VARARGS|METH_KEYWORDS}, - {"set", (PyCFunction)DBC_set, METH_VARARGS|METH_KEYWORDS}, - {"set_range", (PyCFunction)DBC_set_range, METH_VARARGS|METH_KEYWORDS}, - {"get_both", (PyCFunction)DBC_get_both, METH_VARARGS}, - {"get_current_size",(PyCFunction)DBC_get_current_size, METH_NOARGS}, - {"set_both", (PyCFunction)DBC_set_both, METH_VARARGS}, - {"set_recno", (PyCFunction)DBC_set_recno, METH_VARARGS|METH_KEYWORDS}, - {"consume", (PyCFunction)DBC_consume, METH_VARARGS|METH_KEYWORDS}, - {"next_dup", (PyCFunction)DBC_next_dup, METH_VARARGS|METH_KEYWORDS}, - {"next_nodup", (PyCFunction)DBC_next_nodup, METH_VARARGS|METH_KEYWORDS}, -#if (DBVER >= 46) - {"prev_dup", (PyCFunction)DBC_prev_dup, - METH_VARARGS|METH_KEYWORDS}, -#endif - {"prev_nodup", (PyCFunction)DBC_prev_nodup, METH_VARARGS|METH_KEYWORDS}, - {"join_item", (PyCFunction)DBC_join_item, METH_VARARGS}, -#if (DBVER >= 46) - {"set_priority", (PyCFunction)DBC_set_priority, - METH_VARARGS|METH_KEYWORDS}, - {"get_priority", (PyCFunction)DBC_get_priority, METH_NOARGS}, -#endif - {NULL, NULL} /* sentinel */ -}; - - -static PyMethodDef DBLogCursor_methods[] = { - {"close", (PyCFunction)DBLogCursor_close, METH_NOARGS}, - {"current", (PyCFunction)DBLogCursor_current, METH_NOARGS}, - {"first", (PyCFunction)DBLogCursor_first, METH_NOARGS}, - {"last", (PyCFunction)DBLogCursor_last, METH_NOARGS}, - {"next", (PyCFunction)DBLogCursor_next, METH_NOARGS}, - {"prev", (PyCFunction)DBLogCursor_prev, METH_NOARGS}, - {"set", (PyCFunction)DBLogCursor_set, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - - -static PyMethodDef DBEnv_methods[] = { - {"close", (PyCFunction)DBEnv_close, METH_VARARGS}, - {"open", (PyCFunction)DBEnv_open, METH_VARARGS}, - {"remove", (PyCFunction)DBEnv_remove, METH_VARARGS}, - {"dbremove", (PyCFunction)DBEnv_dbremove, METH_VARARGS|METH_KEYWORDS}, - {"dbrename", (PyCFunction)DBEnv_dbrename, METH_VARARGS|METH_KEYWORDS}, -#if (DBVER >= 46) - {"set_thread_count", (PyCFunction)DBEnv_set_thread_count, METH_VARARGS}, - {"get_thread_count", (PyCFunction)DBEnv_get_thread_count, METH_NOARGS}, -#endif - {"set_encrypt", (PyCFunction)DBEnv_set_encrypt, METH_VARARGS|METH_KEYWORDS}, -#if (DBVER >= 42) - {"get_encrypt_flags", (PyCFunction)DBEnv_get_encrypt_flags, METH_NOARGS}, - {"get_timeout", (PyCFunction)DBEnv_get_timeout, - METH_VARARGS|METH_KEYWORDS}, -#endif - {"set_timeout", (PyCFunction)DBEnv_set_timeout, METH_VARARGS|METH_KEYWORDS}, - {"set_shm_key", (PyCFunction)DBEnv_set_shm_key, METH_VARARGS}, -#if (DBVER >= 42) - {"get_shm_key", (PyCFunction)DBEnv_get_shm_key, METH_NOARGS}, -#endif -#if (DBVER >= 46) - {"set_cache_max", (PyCFunction)DBEnv_set_cache_max, METH_VARARGS}, - {"get_cache_max", (PyCFunction)DBEnv_get_cache_max, METH_NOARGS}, -#endif - {"set_cachesize", (PyCFunction)DBEnv_set_cachesize, METH_VARARGS}, -#if (DBVER >= 42) - {"get_cachesize", (PyCFunction)DBEnv_get_cachesize, METH_NOARGS}, -#endif - {"memp_trickle", (PyCFunction)DBEnv_memp_trickle, METH_VARARGS}, - {"memp_sync", (PyCFunction)DBEnv_memp_sync, METH_VARARGS}, - {"memp_stat", (PyCFunction)DBEnv_memp_stat, - METH_VARARGS|METH_KEYWORDS}, -#if (DBVER >= 43) - {"memp_stat_print", (PyCFunction)DBEnv_memp_stat_print, - METH_VARARGS|METH_KEYWORDS}, -#endif -#if (DBVER >= 44) - {"mutex_set_max", (PyCFunction)DBEnv_mutex_set_max, METH_VARARGS}, - {"mutex_get_max", (PyCFunction)DBEnv_mutex_get_max, METH_NOARGS}, - {"mutex_set_align", (PyCFunction)DBEnv_mutex_set_align, METH_VARARGS}, - {"mutex_get_align", (PyCFunction)DBEnv_mutex_get_align, METH_NOARGS}, - {"mutex_set_increment", (PyCFunction)DBEnv_mutex_set_increment, - METH_VARARGS}, - {"mutex_get_increment", (PyCFunction)DBEnv_mutex_get_increment, - METH_NOARGS}, - {"mutex_set_tas_spins", (PyCFunction)DBEnv_mutex_set_tas_spins, - METH_VARARGS}, - {"mutex_get_tas_spins", (PyCFunction)DBEnv_mutex_get_tas_spins, - METH_NOARGS}, - {"mutex_stat", (PyCFunction)DBEnv_mutex_stat, METH_VARARGS}, -#if (DBVER >= 44) - {"mutex_stat_print", (PyCFunction)DBEnv_mutex_stat_print, - METH_VARARGS|METH_KEYWORDS}, -#endif -#endif - {"set_data_dir", (PyCFunction)DBEnv_set_data_dir, METH_VARARGS}, -#if (DBVER >= 42) - {"get_data_dirs", (PyCFunction)DBEnv_get_data_dirs, METH_NOARGS}, -#endif -#if (DBVER >= 42) - {"get_flags", (PyCFunction)DBEnv_get_flags, METH_NOARGS}, -#endif - {"set_flags", (PyCFunction)DBEnv_set_flags, METH_VARARGS}, -#if (DBVER >= 47) - {"log_set_config", (PyCFunction)DBEnv_log_set_config, METH_VARARGS}, - {"log_get_config", (PyCFunction)DBEnv_log_get_config, METH_VARARGS}, -#endif - {"set_lg_bsize", (PyCFunction)DBEnv_set_lg_bsize, METH_VARARGS}, -#if (DBVER >= 42) - {"get_lg_bsize", (PyCFunction)DBEnv_get_lg_bsize, METH_NOARGS}, -#endif - {"set_lg_dir", (PyCFunction)DBEnv_set_lg_dir, METH_VARARGS}, -#if (DBVER >= 42) - {"get_lg_dir", (PyCFunction)DBEnv_get_lg_dir, METH_NOARGS}, -#endif - {"set_lg_max", (PyCFunction)DBEnv_set_lg_max, METH_VARARGS}, -#if (DBVER >= 42) - {"get_lg_max", (PyCFunction)DBEnv_get_lg_max, METH_NOARGS}, -#endif - {"set_lg_regionmax",(PyCFunction)DBEnv_set_lg_regionmax, METH_VARARGS}, -#if (DBVER >= 42) - {"get_lg_regionmax",(PyCFunction)DBEnv_get_lg_regionmax, METH_NOARGS}, -#endif -#if (DBVER >= 44) - {"set_lg_filemode", (PyCFunction)DBEnv_set_lg_filemode, METH_VARARGS}, - {"get_lg_filemode", (PyCFunction)DBEnv_get_lg_filemode, METH_NOARGS}, -#endif -#if (DBVER >= 47) - {"set_lk_partitions", (PyCFunction)DBEnv_set_lk_partitions, METH_VARARGS}, - {"get_lk_partitions", (PyCFunction)DBEnv_get_lk_partitions, METH_NOARGS}, -#endif - {"set_lk_detect", (PyCFunction)DBEnv_set_lk_detect, METH_VARARGS}, -#if (DBVER >= 42) - {"get_lk_detect", (PyCFunction)DBEnv_get_lk_detect, METH_NOARGS}, -#endif -#if (DBVER < 45) - {"set_lk_max", (PyCFunction)DBEnv_set_lk_max, METH_VARARGS}, -#endif - {"set_lk_max_locks", (PyCFunction)DBEnv_set_lk_max_locks, METH_VARARGS}, -#if (DBVER >= 42) - {"get_lk_max_locks", (PyCFunction)DBEnv_get_lk_max_locks, METH_NOARGS}, -#endif - {"set_lk_max_lockers", (PyCFunction)DBEnv_set_lk_max_lockers, METH_VARARGS}, -#if (DBVER >= 42) - {"get_lk_max_lockers", (PyCFunction)DBEnv_get_lk_max_lockers, METH_NOARGS}, -#endif - {"set_lk_max_objects", (PyCFunction)DBEnv_set_lk_max_objects, METH_VARARGS}, -#if (DBVER >= 42) - {"get_lk_max_objects", (PyCFunction)DBEnv_get_lk_max_objects, METH_NOARGS}, -#endif -#if (DBVER >= 43) - {"stat_print", (PyCFunction)DBEnv_stat_print, - METH_VARARGS|METH_KEYWORDS}, -#endif - {"set_mp_mmapsize", (PyCFunction)DBEnv_set_mp_mmapsize, METH_VARARGS}, -#if (DBVER >= 42) - {"get_mp_mmapsize", (PyCFunction)DBEnv_get_mp_mmapsize, METH_NOARGS}, -#endif - {"set_tmp_dir", (PyCFunction)DBEnv_set_tmp_dir, METH_VARARGS}, -#if (DBVER >= 42) - {"get_tmp_dir", (PyCFunction)DBEnv_get_tmp_dir, METH_NOARGS}, -#endif - {"txn_begin", (PyCFunction)DBEnv_txn_begin, METH_VARARGS|METH_KEYWORDS}, - {"txn_checkpoint", (PyCFunction)DBEnv_txn_checkpoint, METH_VARARGS}, - {"txn_stat", (PyCFunction)DBEnv_txn_stat, METH_VARARGS}, -#if (DBVER >= 43) - {"txn_stat_print", (PyCFunction)DBEnv_txn_stat_print, - METH_VARARGS|METH_KEYWORDS}, -#endif -#if (DBVER >= 42) - {"get_tx_max", (PyCFunction)DBEnv_get_tx_max, METH_NOARGS}, - {"get_tx_timestamp", (PyCFunction)DBEnv_get_tx_timestamp, METH_NOARGS}, -#endif - {"set_tx_max", (PyCFunction)DBEnv_set_tx_max, METH_VARARGS}, - {"set_tx_timestamp", (PyCFunction)DBEnv_set_tx_timestamp, METH_VARARGS}, - {"lock_detect", (PyCFunction)DBEnv_lock_detect, METH_VARARGS}, - {"lock_get", (PyCFunction)DBEnv_lock_get, METH_VARARGS}, - {"lock_id", (PyCFunction)DBEnv_lock_id, METH_NOARGS}, - {"lock_id_free", (PyCFunction)DBEnv_lock_id_free, METH_VARARGS}, - {"lock_put", (PyCFunction)DBEnv_lock_put, METH_VARARGS}, - {"lock_stat", (PyCFunction)DBEnv_lock_stat, METH_VARARGS}, -#if (DBVER >= 43) - {"lock_stat_print", (PyCFunction)DBEnv_lock_stat_print, - METH_VARARGS|METH_KEYWORDS}, -#endif - {"log_cursor", (PyCFunction)DBEnv_log_cursor, METH_NOARGS}, - {"log_file", (PyCFunction)DBEnv_log_file, METH_VARARGS}, -#if (DBVER >= 44) - {"log_printf", (PyCFunction)DBEnv_log_printf, - METH_VARARGS|METH_KEYWORDS}, -#endif - {"log_archive", (PyCFunction)DBEnv_log_archive, METH_VARARGS}, - {"log_flush", (PyCFunction)DBEnv_log_flush, METH_NOARGS}, - {"log_stat", (PyCFunction)DBEnv_log_stat, METH_VARARGS}, -#if (DBVER >= 43) - {"log_stat_print", (PyCFunction)DBEnv_log_stat_print, - METH_VARARGS|METH_KEYWORDS}, -#endif -#if (DBVER >= 44) - {"fileid_reset", (PyCFunction)DBEnv_fileid_reset, METH_VARARGS|METH_KEYWORDS}, - {"lsn_reset", (PyCFunction)DBEnv_lsn_reset, METH_VARARGS|METH_KEYWORDS}, -#endif - {"set_get_returns_none",(PyCFunction)DBEnv_set_get_returns_none, METH_VARARGS}, - {"txn_recover", (PyCFunction)DBEnv_txn_recover, METH_NOARGS}, -#if (DBVER < 48) - {"set_rpc_server", (PyCFunction)DBEnv_set_rpc_server, - METH_VARARGS|METH_KEYWORDS}, -#endif -#if (DBVER >= 43) - {"set_mp_max_openfd", (PyCFunction)DBEnv_set_mp_max_openfd, METH_VARARGS}, - {"get_mp_max_openfd", (PyCFunction)DBEnv_get_mp_max_openfd, METH_NOARGS}, - {"set_mp_max_write", (PyCFunction)DBEnv_set_mp_max_write, METH_VARARGS}, - {"get_mp_max_write", (PyCFunction)DBEnv_get_mp_max_write, METH_NOARGS}, -#endif - {"set_verbose", (PyCFunction)DBEnv_set_verbose, METH_VARARGS}, -#if (DBVER >= 42) - {"get_verbose", (PyCFunction)DBEnv_get_verbose, METH_VARARGS}, -#endif - {"set_private", (PyCFunction)DBEnv_set_private, METH_O}, - {"get_private", (PyCFunction)DBEnv_get_private, METH_NOARGS}, - {"rep_start", (PyCFunction)DBEnv_rep_start, - METH_VARARGS|METH_KEYWORDS}, - {"rep_set_transport", (PyCFunction)DBEnv_rep_set_transport, METH_VARARGS}, - {"rep_process_message", (PyCFunction)DBEnv_rep_process_message, - METH_VARARGS}, -#if (DBVER >= 46) - {"rep_elect", (PyCFunction)DBEnv_rep_elect, METH_VARARGS}, -#endif -#if (DBVER >= 44) - {"rep_set_config", (PyCFunction)DBEnv_rep_set_config, METH_VARARGS}, - {"rep_get_config", (PyCFunction)DBEnv_rep_get_config, METH_VARARGS}, - {"rep_sync", (PyCFunction)DBEnv_rep_sync, METH_NOARGS}, -#endif -#if (DBVER >= 45) - {"rep_set_limit", (PyCFunction)DBEnv_rep_set_limit, METH_VARARGS}, - {"rep_get_limit", (PyCFunction)DBEnv_rep_get_limit, METH_NOARGS}, -#endif -#if (DBVER >= 47) - {"rep_set_request", (PyCFunction)DBEnv_rep_set_request, METH_VARARGS}, - {"rep_get_request", (PyCFunction)DBEnv_rep_get_request, METH_NOARGS}, -#endif -#if (DBVER >= 45) - {"set_event_notify", (PyCFunction)DBEnv_set_event_notify, METH_O}, -#endif -#if (DBVER >= 45) - {"rep_set_nsites", (PyCFunction)DBEnv_rep_set_nsites, METH_VARARGS}, - {"rep_get_nsites", (PyCFunction)DBEnv_rep_get_nsites, METH_NOARGS}, - {"rep_set_priority", (PyCFunction)DBEnv_rep_set_priority, METH_VARARGS}, - {"rep_get_priority", (PyCFunction)DBEnv_rep_get_priority, METH_NOARGS}, - {"rep_set_timeout", (PyCFunction)DBEnv_rep_set_timeout, METH_VARARGS}, - {"rep_get_timeout", (PyCFunction)DBEnv_rep_get_timeout, METH_VARARGS}, -#endif -#if (DBVER >= 47) - {"rep_set_clockskew", (PyCFunction)DBEnv_rep_set_clockskew, METH_VARARGS}, - {"rep_get_clockskew", (PyCFunction)DBEnv_rep_get_clockskew, METH_VARARGS}, -#endif - {"rep_stat", (PyCFunction)DBEnv_rep_stat, - METH_VARARGS|METH_KEYWORDS}, -#if (DBVER >= 43) - {"rep_stat_print", (PyCFunction)DBEnv_rep_stat_print, - METH_VARARGS|METH_KEYWORDS}, -#endif - -#if (DBVER >= 45) - {"repmgr_start", (PyCFunction)DBEnv_repmgr_start, - METH_VARARGS|METH_KEYWORDS}, - {"repmgr_set_local_site", (PyCFunction)DBEnv_repmgr_set_local_site, - METH_VARARGS|METH_KEYWORDS}, - {"repmgr_add_remote_site", (PyCFunction)DBEnv_repmgr_add_remote_site, - METH_VARARGS|METH_KEYWORDS}, - {"repmgr_set_ack_policy", (PyCFunction)DBEnv_repmgr_set_ack_policy, - METH_VARARGS}, - {"repmgr_get_ack_policy", (PyCFunction)DBEnv_repmgr_get_ack_policy, - METH_NOARGS}, - {"repmgr_site_list", (PyCFunction)DBEnv_repmgr_site_list, - METH_NOARGS}, -#endif -#if (DBVER >= 46) - {"repmgr_stat", (PyCFunction)DBEnv_repmgr_stat, - METH_VARARGS|METH_KEYWORDS}, - {"repmgr_stat_print", (PyCFunction)DBEnv_repmgr_stat_print, - METH_VARARGS|METH_KEYWORDS}, -#endif - {NULL, NULL} /* sentinel */ -}; - - -static PyMethodDef DBTxn_methods[] = { - {"commit", (PyCFunction)DBTxn_commit, METH_VARARGS}, - {"prepare", (PyCFunction)DBTxn_prepare, METH_VARARGS}, - {"discard", (PyCFunction)DBTxn_discard, METH_NOARGS}, - {"abort", (PyCFunction)DBTxn_abort, METH_NOARGS}, - {"id", (PyCFunction)DBTxn_id, METH_NOARGS}, - {"set_timeout", (PyCFunction)DBTxn_set_timeout, - METH_VARARGS|METH_KEYWORDS}, -#if (DBVER >= 44) - {"set_name", (PyCFunction)DBTxn_set_name, METH_VARARGS}, - {"get_name", (PyCFunction)DBTxn_get_name, METH_NOARGS}, -#endif - {NULL, NULL} /* sentinel */ -}; - - -#if (DBVER >= 43) -static PyMethodDef DBSequence_methods[] = { - {"close", (PyCFunction)DBSequence_close, METH_VARARGS}, - {"get", (PyCFunction)DBSequence_get, METH_VARARGS|METH_KEYWORDS}, - {"get_dbp", (PyCFunction)DBSequence_get_dbp, METH_NOARGS}, - {"get_key", (PyCFunction)DBSequence_get_key, METH_NOARGS}, - {"initial_value", (PyCFunction)DBSequence_initial_value, METH_VARARGS}, - {"open", (PyCFunction)DBSequence_open, METH_VARARGS|METH_KEYWORDS}, - {"remove", (PyCFunction)DBSequence_remove, METH_VARARGS|METH_KEYWORDS}, - {"set_cachesize", (PyCFunction)DBSequence_set_cachesize, METH_VARARGS}, - {"get_cachesize", (PyCFunction)DBSequence_get_cachesize, METH_NOARGS}, - {"set_flags", (PyCFunction)DBSequence_set_flags, METH_VARARGS}, - {"get_flags", (PyCFunction)DBSequence_get_flags, METH_NOARGS}, - {"set_range", (PyCFunction)DBSequence_set_range, METH_VARARGS}, - {"get_range", (PyCFunction)DBSequence_get_range, METH_NOARGS}, - {"stat", (PyCFunction)DBSequence_stat, METH_VARARGS|METH_KEYWORDS}, - {"stat_print", (PyCFunction)DBSequence_stat_print, - METH_VARARGS|METH_KEYWORDS}, - {NULL, NULL} /* sentinel */ -}; -#endif - - -static PyObject* -DBEnv_db_home_get(DBEnvObject* self) -{ - const char *home = NULL; - - CHECK_ENV_NOT_CLOSED(self); - -#if (DBVER >= 42) - MYDB_BEGIN_ALLOW_THREADS; - self->db_env->get_home(self->db_env, &home); - MYDB_END_ALLOW_THREADS; -#else - home=self->db_env->db_home; -#endif - - if (home == NULL) { - RETURN_NONE(); - } - return PyBytes_FromString(home); -} - -static PyGetSetDef DBEnv_getsets[] = { - {"db_home", (getter)DBEnv_db_home_get, NULL,}, - {NULL} -}; - - -statichere PyTypeObject DB_Type = { -#if (PY_VERSION_HEX < 0x03000000) - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ -#else - PyVarObject_HEAD_INIT(NULL, 0) -#endif - "DB", /*tp_name*/ - sizeof(DBObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)DB_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - &DB_sequence,/*tp_as_sequence*/ - &DB_mapping,/*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ -#if (PY_VERSION_HEX < 0x03000000) - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ -#else - Py_TPFLAGS_DEFAULT, /* tp_flags */ -#endif - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(DBObject, in_weakreflist), /* tp_weaklistoffset */ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - DB_methods, /*tp_methods*/ - 0, /*tp_members*/ -}; - - -statichere PyTypeObject DBCursor_Type = { -#if (PY_VERSION_HEX < 0x03000000) - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ -#else - PyVarObject_HEAD_INIT(NULL, 0) -#endif - "DBCursor", /*tp_name*/ - sizeof(DBCursorObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)DBCursor_dealloc,/*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 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*/ -#if (PY_VERSION_HEX < 0x03000000) - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ -#else - Py_TPFLAGS_DEFAULT, /* tp_flags */ -#endif - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(DBCursorObject, in_weakreflist), /* tp_weaklistoffset */ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - DBCursor_methods, /*tp_methods*/ - 0, /*tp_members*/ -}; - - -statichere PyTypeObject DBLogCursor_Type = { -#if (PY_VERSION_HEX < 0x03000000) - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ -#else - PyVarObject_HEAD_INIT(NULL, 0) -#endif - "DBLogCursor", /*tp_name*/ - sizeof(DBLogCursorObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)DBLogCursor_dealloc,/*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 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*/ -#if (PY_VERSION_HEX < 0x03000000) - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ -#else - Py_TPFLAGS_DEFAULT, /* tp_flags */ -#endif - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(DBLogCursorObject, in_weakreflist), /* tp_weaklistoffset */ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - DBLogCursor_methods, /*tp_methods*/ - 0, /*tp_members*/ -}; - - -statichere PyTypeObject DBEnv_Type = { -#if (PY_VERSION_HEX < 0x03000000) - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ -#else - PyVarObject_HEAD_INIT(NULL, 0) -#endif - "DBEnv", /*tp_name*/ - sizeof(DBEnvObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)DBEnv_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 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 */ -#if (PY_VERSION_HEX < 0x03000000) - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ -#else - Py_TPFLAGS_DEFAULT, /* tp_flags */ -#endif - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(DBEnvObject, in_weakreflist), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - DBEnv_methods, /* tp_methods */ - 0, /* tp_members */ - DBEnv_getsets, /* tp_getsets */ -}; - -statichere PyTypeObject DBTxn_Type = { -#if (PY_VERSION_HEX < 0x03000000) - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ -#else - PyVarObject_HEAD_INIT(NULL, 0) -#endif - "DBTxn", /*tp_name*/ - sizeof(DBTxnObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)DBTxn_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 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 */ -#if (PY_VERSION_HEX < 0x03000000) - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ -#else - Py_TPFLAGS_DEFAULT, /* tp_flags */ -#endif - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(DBTxnObject, in_weakreflist), /* tp_weaklistoffset */ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - DBTxn_methods, /*tp_methods*/ - 0, /*tp_members*/ -}; - - -statichere PyTypeObject DBLock_Type = { -#if (PY_VERSION_HEX < 0x03000000) - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ -#else - PyVarObject_HEAD_INIT(NULL, 0) -#endif - "DBLock", /*tp_name*/ - sizeof(DBLockObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)DBLock_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 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 */ -#if (PY_VERSION_HEX < 0x03000000) - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ -#else - Py_TPFLAGS_DEFAULT, /* tp_flags */ -#endif - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(DBLockObject, in_weakreflist), /* tp_weaklistoffset */ -}; - -#if (DBVER >= 43) -statichere PyTypeObject DBSequence_Type = { -#if (PY_VERSION_HEX < 0x03000000) - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ -#else - PyVarObject_HEAD_INIT(NULL, 0) -#endif - "DBSequence", /*tp_name*/ - sizeof(DBSequenceObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)DBSequence_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 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 */ -#if (PY_VERSION_HEX < 0x03000000) - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ -#else - Py_TPFLAGS_DEFAULT, /* tp_flags */ -#endif - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(DBSequenceObject, in_weakreflist), /* tp_weaklistoffset */ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - DBSequence_methods, /*tp_methods*/ - 0, /*tp_members*/ -}; -#endif - -/* --------------------------------------------------------------------- */ -/* Module-level functions */ - -static PyObject* -DB_construct(PyObject* self, PyObject* args, PyObject* kwargs) -{ - PyObject* dbenvobj = NULL; - int flags = 0; - static char* kwnames[] = { "dbEnv", "flags", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:DB", kwnames, - &dbenvobj, &flags)) - return NULL; - if (dbenvobj == Py_None) - dbenvobj = NULL; - else if (dbenvobj && !DBEnvObject_Check(dbenvobj)) { - makeTypeError("DBEnv", dbenvobj); - return NULL; - } - - return (PyObject* )newDBObject((DBEnvObject*)dbenvobj, flags); -} - - -static PyObject* -DBEnv_construct(PyObject* self, PyObject* args) -{ - int flags = 0; - if (!PyArg_ParseTuple(args, "|i:DbEnv", &flags)) return NULL; - return (PyObject* )newDBEnvObject(flags); -} - -#if (DBVER >= 43) -static PyObject* -DBSequence_construct(PyObject* self, PyObject* args, PyObject* kwargs) -{ - PyObject* dbobj; - int flags = 0; - static char* kwnames[] = { "db", "flags", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|i:DBSequence", kwnames, &dbobj, &flags)) - return NULL; - if (!DBObject_Check(dbobj)) { - makeTypeError("DB", dbobj); - return NULL; - } - return (PyObject* )newDBSequenceObject((DBObject*)dbobj, flags); -} -#endif - -static char bsddb_version_doc[] = -"Returns a tuple of major, minor, and patch release numbers of the\n\ -underlying DB library."; - -static PyObject* -bsddb_version(PyObject* self) -{ - int major, minor, patch; - - db_version(&major, &minor, &patch); - return Py_BuildValue("(iii)", major, minor, patch); -} - - -/* List of functions defined in the module */ -static PyMethodDef bsddb_methods[] = { - {"DB", (PyCFunction)DB_construct, METH_VARARGS | METH_KEYWORDS }, - {"DBEnv", (PyCFunction)DBEnv_construct, METH_VARARGS}, -#if (DBVER >= 43) - {"DBSequence", (PyCFunction)DBSequence_construct, METH_VARARGS | METH_KEYWORDS }, -#endif - {"version", (PyCFunction)bsddb_version, METH_NOARGS, bsddb_version_doc}, - {NULL, NULL} /* sentinel */ -}; - - -/* API structure */ -static BSDDB_api bsddb_api; - - -/* --------------------------------------------------------------------- */ -/* Module initialization */ - - -/* Convenience routine to export an integer value. - * Errors are silently ignored, for better or for worse... - */ -#define ADD_INT(dict, NAME) _addIntToDict(dict, #NAME, NAME) - -#define MODULE_NAME_MAX_LEN 11 -static char _bsddbModuleName[MODULE_NAME_MAX_LEN+1] = "_bsddb"; - -#if (PY_VERSION_HEX >= 0x03000000) -static struct PyModuleDef bsddbmodule = { - PyModuleDef_HEAD_INIT, - _bsddbModuleName, /* Name of module */ - NULL, /* module documentation, may be NULL */ - -1, /* size of per-interpreter state of the module, - or -1 if the module keeps state in global variables. */ - bsddb_methods, - NULL, /* Reload */ - NULL, /* Traverse */ - NULL, /* Clear */ - NULL /* Free */ -}; -#endif - - -#if (PY_VERSION_HEX < 0x03000000) -DL_EXPORT(void) init_bsddb(void) -#else -PyMODINIT_FUNC PyInit__bsddb(void) /* Note the two underscores */ -#endif -{ - PyObject* m; - PyObject* d; - PyObject* py_api; - PyObject* pybsddb_version_s; - PyObject* db_version_s; - PyObject* cvsid_s; - -#if (PY_VERSION_HEX < 0x03000000) - pybsddb_version_s = PyString_FromString(PY_BSDDB_VERSION); - db_version_s = PyString_FromString(DB_VERSION_STRING); - cvsid_s = PyString_FromString(rcs_id); -#else - /* This data should be ascii, so UTF-8 conversion is fine */ - pybsddb_version_s = PyUnicode_FromString(PY_BSDDB_VERSION); - db_version_s = PyUnicode_FromString(DB_VERSION_STRING); - cvsid_s = PyUnicode_FromString(rcs_id); -#endif - - /* Initialize object types */ - if ((PyType_Ready(&DB_Type) < 0) - || (PyType_Ready(&DBCursor_Type) < 0) - || (PyType_Ready(&DBLogCursor_Type) < 0) - || (PyType_Ready(&DBEnv_Type) < 0) - || (PyType_Ready(&DBTxn_Type) < 0) - || (PyType_Ready(&DBLock_Type) < 0) -#if (DBVER >= 43) - || (PyType_Ready(&DBSequence_Type) < 0) -#endif - ) { -#if (PY_VERSION_HEX < 0x03000000) - return; -#else - return NULL; -#endif - } - -#if defined(WITH_THREAD) && !defined(MYDB_USE_GILSTATE) - /* Save the current interpreter, so callbacks can do the right thing. */ - _db_interpreterState = PyThreadState_GET()->interp; -#endif - - /* Create the module and add the functions */ -#if (PY_VERSION_HEX < 0x03000000) - m = Py_InitModule(_bsddbModuleName, bsddb_methods); -#else - m=PyModule_Create(&bsddbmodule); -#endif - if (m == NULL) { -#if (PY_VERSION_HEX < 0x03000000) - return; -#else - return NULL; -#endif - } - - /* Add some symbolic constants to the module */ - d = PyModule_GetDict(m); - PyDict_SetItemString(d, "__version__", pybsddb_version_s); - PyDict_SetItemString(d, "cvsid", cvsid_s); - PyDict_SetItemString(d, "DB_VERSION_STRING", db_version_s); - Py_DECREF(pybsddb_version_s); - pybsddb_version_s = NULL; - Py_DECREF(cvsid_s); - cvsid_s = NULL; - Py_DECREF(db_version_s); - db_version_s = NULL; - - ADD_INT(d, DB_VERSION_MAJOR); - ADD_INT(d, DB_VERSION_MINOR); - ADD_INT(d, DB_VERSION_PATCH); - - ADD_INT(d, DB_MAX_PAGES); - ADD_INT(d, DB_MAX_RECORDS); - -#if (DBVER < 48) -#if (DBVER >= 42) - ADD_INT(d, DB_RPCCLIENT); -#else - ADD_INT(d, DB_CLIENT); - /* allow apps to be written using DB_RPCCLIENT on older Berkeley DB */ - _addIntToDict(d, "DB_RPCCLIENT", DB_CLIENT); -#endif -#endif - -#if (DBVER < 48) - ADD_INT(d, DB_XA_CREATE); -#endif - - ADD_INT(d, DB_CREATE); - ADD_INT(d, DB_NOMMAP); - ADD_INT(d, DB_THREAD); -#if (DBVER >= 45) - ADD_INT(d, DB_MULTIVERSION); -#endif - - ADD_INT(d, DB_FORCE); - ADD_INT(d, DB_INIT_CDB); - ADD_INT(d, DB_INIT_LOCK); - ADD_INT(d, DB_INIT_LOG); - ADD_INT(d, DB_INIT_MPOOL); - ADD_INT(d, DB_INIT_TXN); - ADD_INT(d, DB_JOINENV); - -#if (DBVER >= 48) - ADD_INT(d, DB_GID_SIZE); -#else - ADD_INT(d, DB_XIDDATASIZE); - /* Allow new code to work in old BDB releases */ - _addIntToDict(d, "DB_GID_SIZE", DB_XIDDATASIZE); -#endif - - ADD_INT(d, DB_RECOVER); - ADD_INT(d, DB_RECOVER_FATAL); - ADD_INT(d, DB_TXN_NOSYNC); - ADD_INT(d, DB_USE_ENVIRON); - ADD_INT(d, DB_USE_ENVIRON_ROOT); - - ADD_INT(d, DB_LOCKDOWN); - ADD_INT(d, DB_PRIVATE); - ADD_INT(d, DB_SYSTEM_MEM); - - ADD_INT(d, DB_TXN_SYNC); - ADD_INT(d, DB_TXN_NOWAIT); - -#if (DBVER >= 46) - ADD_INT(d, DB_TXN_WAIT); -#endif - - ADD_INT(d, DB_EXCL); - ADD_INT(d, DB_FCNTL_LOCKING); - ADD_INT(d, DB_ODDFILESIZE); - ADD_INT(d, DB_RDWRMASTER); - ADD_INT(d, DB_RDONLY); - ADD_INT(d, DB_TRUNCATE); - ADD_INT(d, DB_EXTENT); - ADD_INT(d, DB_CDB_ALLDB); - ADD_INT(d, DB_VERIFY); - ADD_INT(d, DB_UPGRADE); - - ADD_INT(d, DB_PRINTABLE); - ADD_INT(d, DB_AGGRESSIVE); - ADD_INT(d, DB_NOORDERCHK); - ADD_INT(d, DB_ORDERCHKONLY); - ADD_INT(d, DB_PR_PAGE); - - ADD_INT(d, DB_PR_RECOVERYTEST); - ADD_INT(d, DB_SALVAGE); - - ADD_INT(d, DB_LOCK_NORUN); - ADD_INT(d, DB_LOCK_DEFAULT); - ADD_INT(d, DB_LOCK_OLDEST); - ADD_INT(d, DB_LOCK_RANDOM); - ADD_INT(d, DB_LOCK_YOUNGEST); - ADD_INT(d, DB_LOCK_MAXLOCKS); - ADD_INT(d, DB_LOCK_MINLOCKS); - ADD_INT(d, DB_LOCK_MINWRITE); - - ADD_INT(d, DB_LOCK_EXPIRE); -#if (DBVER >= 43) - ADD_INT(d, DB_LOCK_MAXWRITE); -#endif - - _addIntToDict(d, "DB_LOCK_CONFLICT", 0); - - ADD_INT(d, DB_LOCK_DUMP); - ADD_INT(d, DB_LOCK_GET); - ADD_INT(d, DB_LOCK_INHERIT); - ADD_INT(d, DB_LOCK_PUT); - ADD_INT(d, DB_LOCK_PUT_ALL); - ADD_INT(d, DB_LOCK_PUT_OBJ); - - ADD_INT(d, DB_LOCK_NG); - ADD_INT(d, DB_LOCK_READ); - ADD_INT(d, DB_LOCK_WRITE); - ADD_INT(d, DB_LOCK_NOWAIT); - ADD_INT(d, DB_LOCK_WAIT); - ADD_INT(d, DB_LOCK_IWRITE); - ADD_INT(d, DB_LOCK_IREAD); - ADD_INT(d, DB_LOCK_IWR); -#if (DBVER < 44) - ADD_INT(d, DB_LOCK_DIRTY); -#else - ADD_INT(d, DB_LOCK_READ_UNCOMMITTED); /* renamed in 4.4 */ -#endif - ADD_INT(d, DB_LOCK_WWRITE); - - ADD_INT(d, DB_LOCK_RECORD); - ADD_INT(d, DB_LOCK_UPGRADE); - ADD_INT(d, DB_LOCK_SWITCH); - ADD_INT(d, DB_LOCK_UPGRADE_WRITE); - - ADD_INT(d, DB_LOCK_NOWAIT); - ADD_INT(d, DB_LOCK_RECORD); - ADD_INT(d, DB_LOCK_UPGRADE); - - ADD_INT(d, DB_LSTAT_ABORTED); -#if (DBVER < 43) - ADD_INT(d, DB_LSTAT_ERR); -#endif - ADD_INT(d, DB_LSTAT_FREE); - ADD_INT(d, DB_LSTAT_HELD); - - ADD_INT(d, DB_LSTAT_PENDING); - ADD_INT(d, DB_LSTAT_WAITING); - - ADD_INT(d, DB_ARCH_ABS); - ADD_INT(d, DB_ARCH_DATA); - ADD_INT(d, DB_ARCH_LOG); -#if (DBVER >= 42) - ADD_INT(d, DB_ARCH_REMOVE); -#endif - - ADD_INT(d, DB_BTREE); - ADD_INT(d, DB_HASH); - ADD_INT(d, DB_RECNO); - ADD_INT(d, DB_QUEUE); - ADD_INT(d, DB_UNKNOWN); - - ADD_INT(d, DB_DUP); - ADD_INT(d, DB_DUPSORT); - ADD_INT(d, DB_RECNUM); - ADD_INT(d, DB_RENUMBER); - ADD_INT(d, DB_REVSPLITOFF); - ADD_INT(d, DB_SNAPSHOT); - -#if (DBVER >= 43) - ADD_INT(d, DB_INORDER); -#endif - - ADD_INT(d, DB_JOIN_NOSORT); - - ADD_INT(d, DB_AFTER); - ADD_INT(d, DB_APPEND); - ADD_INT(d, DB_BEFORE); -#if (DBVER < 45) - ADD_INT(d, DB_CACHED_COUNTS); -#endif - -#if (DBVER <= 41) - ADD_INT(d, DB_COMMIT); -#endif - ADD_INT(d, DB_CONSUME); - ADD_INT(d, DB_CONSUME_WAIT); - ADD_INT(d, DB_CURRENT); - ADD_INT(d, DB_FAST_STAT); - ADD_INT(d, DB_FIRST); - ADD_INT(d, DB_FLUSH); - ADD_INT(d, DB_GET_BOTH); - ADD_INT(d, DB_GET_BOTH_RANGE); - ADD_INT(d, DB_GET_RECNO); - ADD_INT(d, DB_JOIN_ITEM); - ADD_INT(d, DB_KEYFIRST); - ADD_INT(d, DB_KEYLAST); - ADD_INT(d, DB_LAST); - ADD_INT(d, DB_NEXT); - ADD_INT(d, DB_NEXT_DUP); - ADD_INT(d, DB_NEXT_NODUP); - ADD_INT(d, DB_NODUPDATA); - ADD_INT(d, DB_NOOVERWRITE); - ADD_INT(d, DB_NOSYNC); - ADD_INT(d, DB_POSITION); - ADD_INT(d, DB_PREV); - ADD_INT(d, DB_PREV_NODUP); -#if (DBVER >= 46) - ADD_INT(d, DB_PREV_DUP); -#endif -#if (DBVER < 45) - ADD_INT(d, DB_RECORDCOUNT); -#endif - ADD_INT(d, DB_SET); - ADD_INT(d, DB_SET_RANGE); - ADD_INT(d, DB_SET_RECNO); - ADD_INT(d, DB_WRITECURSOR); - - ADD_INT(d, DB_OPFLAGS_MASK); - ADD_INT(d, DB_RMW); - ADD_INT(d, DB_DIRTY_READ); - ADD_INT(d, DB_MULTIPLE); - ADD_INT(d, DB_MULTIPLE_KEY); - -#if (DBVER >= 44) - ADD_INT(d, DB_IMMUTABLE_KEY); - ADD_INT(d, DB_READ_UNCOMMITTED); /* replaces DB_DIRTY_READ in 4.4 */ - ADD_INT(d, DB_READ_COMMITTED); -#endif - -#if (DBVER >= 44) - ADD_INT(d, DB_FREELIST_ONLY); - ADD_INT(d, DB_FREE_SPACE); -#endif - - ADD_INT(d, DB_DONOTINDEX); - - ADD_INT(d, DB_KEYEMPTY); - ADD_INT(d, DB_KEYEXIST); - ADD_INT(d, DB_LOCK_DEADLOCK); - ADD_INT(d, DB_LOCK_NOTGRANTED); - ADD_INT(d, DB_NOSERVER); - ADD_INT(d, DB_NOSERVER_HOME); - ADD_INT(d, DB_NOSERVER_ID); - ADD_INT(d, DB_NOTFOUND); - ADD_INT(d, DB_OLD_VERSION); - ADD_INT(d, DB_RUNRECOVERY); - ADD_INT(d, DB_VERIFY_BAD); - ADD_INT(d, DB_PAGE_NOTFOUND); - ADD_INT(d, DB_SECONDARY_BAD); - ADD_INT(d, DB_STAT_CLEAR); - ADD_INT(d, DB_REGION_INIT); - ADD_INT(d, DB_NOLOCKING); - ADD_INT(d, DB_YIELDCPU); - ADD_INT(d, DB_PANIC_ENVIRONMENT); - ADD_INT(d, DB_NOPANIC); - - ADD_INT(d, DB_OVERWRITE); - -#if (DBVER >= 43) - ADD_INT(d, DB_STAT_SUBSYSTEM); - ADD_INT(d, DB_STAT_MEMP_HASH); -#endif - -#if (DBVER >= 48) - ADD_INT(d, DB_OVERWRITE_DUP); -#endif - -#if (DBVER >= 47) - ADD_INT(d, DB_FOREIGN_ABORT); - ADD_INT(d, DB_FOREIGN_CASCADE); - ADD_INT(d, DB_FOREIGN_NULLIFY); -#endif - -#if (DBVER >= 44) - ADD_INT(d, DB_REGISTER); -#endif - - ADD_INT(d, DB_EID_INVALID); - ADD_INT(d, DB_EID_BROADCAST); - -#if (DBVER >= 42) - ADD_INT(d, DB_TIME_NOTGRANTED); - ADD_INT(d, DB_TXN_NOT_DURABLE); - ADD_INT(d, DB_TXN_WRITE_NOSYNC); - ADD_INT(d, DB_DIRECT_DB); - ADD_INT(d, DB_INIT_REP); - ADD_INT(d, DB_ENCRYPT); - ADD_INT(d, DB_CHKSUM); -#endif - -#if (DBVER >= 42) && (DBVER < 47) - ADD_INT(d, DB_LOG_AUTOREMOVE); - ADD_INT(d, DB_DIRECT_LOG); -#endif - -#if (DBVER >= 47) - ADD_INT(d, DB_LOG_DIRECT); - ADD_INT(d, DB_LOG_DSYNC); - ADD_INT(d, DB_LOG_IN_MEMORY); - ADD_INT(d, DB_LOG_AUTO_REMOVE); - ADD_INT(d, DB_LOG_ZERO); -#endif - -#if (DBVER >= 44) - ADD_INT(d, DB_DSYNC_DB); -#endif - -#if (DBVER >= 45) - ADD_INT(d, DB_TXN_SNAPSHOT); -#endif - - ADD_INT(d, DB_VERB_DEADLOCK); -#if (DBVER >= 46) - ADD_INT(d, DB_VERB_FILEOPS); - ADD_INT(d, DB_VERB_FILEOPS_ALL); -#endif - ADD_INT(d, DB_VERB_RECOVERY); -#if (DBVER >= 44) - ADD_INT(d, DB_VERB_REGISTER); -#endif - ADD_INT(d, DB_VERB_REPLICATION); - ADD_INT(d, DB_VERB_WAITSFOR); - -#if (DBVER >= 45) - ADD_INT(d, DB_EVENT_PANIC); - ADD_INT(d, DB_EVENT_REP_CLIENT); -#if (DBVER >= 46) - ADD_INT(d, DB_EVENT_REP_ELECTED); -#endif - ADD_INT(d, DB_EVENT_REP_MASTER); - ADD_INT(d, DB_EVENT_REP_NEWMASTER); -#if (DBVER >= 46) - ADD_INT(d, DB_EVENT_REP_PERM_FAILED); -#endif - ADD_INT(d, DB_EVENT_REP_STARTUPDONE); - ADD_INT(d, DB_EVENT_WRITE_FAILED); -#endif - - ADD_INT(d, DB_REP_DUPMASTER); - ADD_INT(d, DB_REP_HOLDELECTION); -#if (DBVER >= 44) - ADD_INT(d, DB_REP_IGNORE); - ADD_INT(d, DB_REP_JOIN_FAILURE); -#endif -#if (DBVER >= 42) - ADD_INT(d, DB_REP_ISPERM); - ADD_INT(d, DB_REP_NOTPERM); -#endif - ADD_INT(d, DB_REP_NEWSITE); - - ADD_INT(d, DB_REP_MASTER); - ADD_INT(d, DB_REP_CLIENT); - - ADD_INT(d, DB_REP_PERMANENT); - -#if (DBVER >= 44) - ADD_INT(d, DB_REP_CONF_NOAUTOINIT); - ADD_INT(d, DB_REP_CONF_DELAYCLIENT); - ADD_INT(d, DB_REP_CONF_BULK); - ADD_INT(d, DB_REP_CONF_NOWAIT); - ADD_INT(d, DB_REP_ANYWHERE); - ADD_INT(d, DB_REP_REREQUEST); -#endif - -#if (DBVER >= 42) - ADD_INT(d, DB_REP_NOBUFFER); -#endif - -#if (DBVER >= 46) - ADD_INT(d, DB_REP_LEASE_EXPIRED); - ADD_INT(d, DB_IGNORE_LEASE); -#endif - -#if (DBVER >= 47) - ADD_INT(d, DB_REP_CONF_LEASE); - ADD_INT(d, DB_REPMGR_CONF_2SITE_STRICT); -#endif - -#if (DBVER >= 45) - ADD_INT(d, DB_REP_ELECTION); - - ADD_INT(d, DB_REP_ACK_TIMEOUT); - ADD_INT(d, DB_REP_CONNECTION_RETRY); - ADD_INT(d, DB_REP_ELECTION_TIMEOUT); - ADD_INT(d, DB_REP_ELECTION_RETRY); -#endif -#if (DBVER >= 46) - ADD_INT(d, DB_REP_CHECKPOINT_DELAY); - ADD_INT(d, DB_REP_FULL_ELECTION_TIMEOUT); - ADD_INT(d, DB_REP_LEASE_TIMEOUT); -#endif -#if (DBVER >= 47) - ADD_INT(d, DB_REP_HEARTBEAT_MONITOR); - ADD_INT(d, DB_REP_HEARTBEAT_SEND); -#endif - -#if (DBVER >= 45) - ADD_INT(d, DB_REPMGR_PEER); - ADD_INT(d, DB_REPMGR_ACKS_ALL); - ADD_INT(d, DB_REPMGR_ACKS_ALL_PEERS); - ADD_INT(d, DB_REPMGR_ACKS_NONE); - ADD_INT(d, DB_REPMGR_ACKS_ONE); - ADD_INT(d, DB_REPMGR_ACKS_ONE_PEER); - ADD_INT(d, DB_REPMGR_ACKS_QUORUM); - ADD_INT(d, DB_REPMGR_CONNECTED); - ADD_INT(d, DB_REPMGR_DISCONNECTED); - ADD_INT(d, DB_STAT_ALL); -#endif - -#if (DBVER >= 43) - ADD_INT(d, DB_BUFFER_SMALL); - ADD_INT(d, DB_SEQ_DEC); - ADD_INT(d, DB_SEQ_INC); - ADD_INT(d, DB_SEQ_WRAP); -#endif - -#if (DBVER >= 43) && (DBVER < 47) - ADD_INT(d, DB_LOG_INMEMORY); - ADD_INT(d, DB_DSYNC_LOG); -#endif - - ADD_INT(d, DB_ENCRYPT_AES); - ADD_INT(d, DB_AUTO_COMMIT); - ADD_INT(d, DB_PRIORITY_VERY_LOW); - ADD_INT(d, DB_PRIORITY_LOW); - ADD_INT(d, DB_PRIORITY_DEFAULT); - ADD_INT(d, DB_PRIORITY_HIGH); - ADD_INT(d, DB_PRIORITY_VERY_HIGH); - -#if (DBVER >= 46) - ADD_INT(d, DB_PRIORITY_UNCHANGED); -#endif - - ADD_INT(d, EINVAL); - ADD_INT(d, EACCES); - ADD_INT(d, ENOSPC); - ADD_INT(d, ENOMEM); - ADD_INT(d, EAGAIN); - ADD_INT(d, EBUSY); - ADD_INT(d, EEXIST); - ADD_INT(d, ENOENT); - ADD_INT(d, EPERM); - - ADD_INT(d, DB_SET_LOCK_TIMEOUT); - ADD_INT(d, DB_SET_TXN_TIMEOUT); - - /* The exception name must be correct for pickled exception * - * objects to unpickle properly. */ -#ifdef PYBSDDB_STANDALONE /* different value needed for standalone pybsddb */ -#define PYBSDDB_EXCEPTION_BASE "bsddb3.db." -#else -#define PYBSDDB_EXCEPTION_BASE "bsddb.db." -#endif - - /* All the rest of the exceptions derive only from DBError */ -#define MAKE_EX(name) name = PyErr_NewException(PYBSDDB_EXCEPTION_BASE #name, DBError, NULL); \ - PyDict_SetItemString(d, #name, name) - - /* The base exception class is DBError */ - DBError = NULL; /* used in MAKE_EX so that it derives from nothing */ - MAKE_EX(DBError); - -#if (PY_VERSION_HEX < 0x03000000) - /* Some magic to make DBNotFoundError and DBKeyEmptyError derive - * from both DBError and KeyError, since the API only supports - * using one base class. */ - PyDict_SetItemString(d, "KeyError", PyExc_KeyError); - PyRun_String("class DBNotFoundError(DBError, KeyError): pass\n" - "class DBKeyEmptyError(DBError, KeyError): pass", - Py_file_input, d, d); - DBNotFoundError = PyDict_GetItemString(d, "DBNotFoundError"); - DBKeyEmptyError = PyDict_GetItemString(d, "DBKeyEmptyError"); - PyDict_DelItemString(d, "KeyError"); -#else - /* Since Python 2.5, PyErr_NewException() accepts a tuple, to be able to - ** derive from several classes. We use this new API only for Python 3.0, - ** though. - */ - { - PyObject* bases; - - bases = PyTuple_Pack(2, DBError, PyExc_KeyError); - -#define MAKE_EX2(name) name = PyErr_NewException(PYBSDDB_EXCEPTION_BASE #name, bases, NULL); \ - PyDict_SetItemString(d, #name, name) - MAKE_EX2(DBNotFoundError); - MAKE_EX2(DBKeyEmptyError); - -#undef MAKE_EX2 - - Py_XDECREF(bases); - } -#endif - - MAKE_EX(DBCursorClosedError); - MAKE_EX(DBKeyExistError); - MAKE_EX(DBLockDeadlockError); - MAKE_EX(DBLockNotGrantedError); - MAKE_EX(DBOldVersionError); - MAKE_EX(DBRunRecoveryError); - MAKE_EX(DBVerifyBadError); - MAKE_EX(DBNoServerError); - MAKE_EX(DBNoServerHomeError); - MAKE_EX(DBNoServerIDError); - MAKE_EX(DBPageNotFoundError); - MAKE_EX(DBSecondaryBadError); - - MAKE_EX(DBInvalidArgError); - MAKE_EX(DBAccessError); - MAKE_EX(DBNoSpaceError); - MAKE_EX(DBNoMemoryError); - MAKE_EX(DBAgainError); - MAKE_EX(DBBusyError); - MAKE_EX(DBFileExistsError); - MAKE_EX(DBNoSuchFileError); - MAKE_EX(DBPermissionsError); - -#if (DBVER >= 42) - MAKE_EX(DBRepHandleDeadError); -#endif -#if (DBVER >= 44) - MAKE_EX(DBRepLockoutError); -#endif - - MAKE_EX(DBRepUnavailError); - -#if (DBVER >= 46) - MAKE_EX(DBRepLeaseExpiredError); -#endif - -#if (DBVER >= 47) - MAKE_EX(DBForeignConflictError); -#endif - -#undef MAKE_EX - - /* Initialise the C API structure and add it to the module */ - bsddb_api.db_type = &DB_Type; - bsddb_api.dbcursor_type = &DBCursor_Type; - bsddb_api.dblogcursor_type = &DBLogCursor_Type; - bsddb_api.dbenv_type = &DBEnv_Type; - bsddb_api.dbtxn_type = &DBTxn_Type; - bsddb_api.dblock_type = &DBLock_Type; -#if (DBVER >= 43) - bsddb_api.dbsequence_type = &DBSequence_Type; -#endif - bsddb_api.makeDBError = makeDBError; - - /* - ** Capsules exist from Python 3.1, but I - ** don't want to break the API compatibility - ** for already published Python versions. - */ -#if (PY_VERSION_HEX < 0x03020000) - py_api = PyCObject_FromVoidPtr((void*)&bsddb_api, NULL); -#else - { - char py_api_name[250]; - - strcpy(py_api_name, _bsddbModuleName); - strcat(py_api_name, ".api"); - - py_api = PyCapsule_New((void*)&bsddb_api, py_api_name, NULL); - } -#endif - - /* Check error control */ - /* - ** PyErr_NoMemory(); - ** py_api = NULL; - */ - - if (py_api) { - PyDict_SetItemString(d, "api", py_api); - Py_DECREF(py_api); - } else { /* Something bad happened */ - PyErr_WriteUnraisable(m); - if(PyErr_Warn(PyExc_RuntimeWarning, - "_bsddb/_pybsddb C API will be not available")) { - PyErr_WriteUnraisable(m); - } - PyErr_Clear(); - } - - /* Check for errors */ - if (PyErr_Occurred()) { - PyErr_Print(); - Py_FatalError("can't initialize module _bsddb/_pybsddb"); - Py_DECREF(m); - m = NULL; - } -#if (PY_VERSION_HEX < 0x03000000) - return; -#else - return m; -#endif -} - -/* allow this module to be named _pybsddb so that it can be installed - * and imported on top of python >= 2.3 that includes its own older - * copy of the library named _bsddb without importing the old version. */ -#if (PY_VERSION_HEX < 0x03000000) -DL_EXPORT(void) init_pybsddb(void) -#else -PyMODINIT_FUNC PyInit__pybsddb(void) /* Note the two underscores */ -#endif -{ - strncpy(_bsddbModuleName, "_pybsddb", MODULE_NAME_MAX_LEN); -#if (PY_VERSION_HEX < 0x03000000) - init_bsddb(); -#else - return PyInit__bsddb(); /* Note the two underscores */ -#endif -} diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c index 11d7cd0ad59..eb740f95fdc 100644 --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -94,15 +94,8 @@ codec_encode(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "O|ss:encode", &v, &encoding, &errors)) return NULL; -#ifdef Py_USING_UNICODE if (encoding == NULL) encoding = PyUnicode_GetDefaultEncoding(); -#else - if (encoding == NULL) { - PyErr_SetString(PyExc_ValueError, "no encoding specified"); - return NULL; - } -#endif /* Encode via the codec registry */ return PyCodec_Encode(v, encoding, errors); @@ -128,15 +121,8 @@ codec_decode(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "O|ss:decode", &v, &encoding, &errors)) return NULL; -#ifdef Py_USING_UNICODE if (encoding == NULL) encoding = PyUnicode_GetDefaultEncoding(); -#else - if (encoding == NULL) { - PyErr_SetString(PyExc_ValueError, "no encoding specified"); - return NULL; - } -#endif /* Decode via the codec registry */ return PyCodec_Decode(v, encoding, errors); @@ -168,7 +154,7 @@ escape_decode(PyObject *self, if (!PyArg_ParseTuple(args, "s#|z:escape_decode", &data, &size, &errors)) return NULL; - return codec_tuple(PyString_DecodeEscape(data, size, errors, 0, NULL), + return codec_tuple(PyBytes_DecodeEscape(data, size, errors, 0, NULL), size); } @@ -176,31 +162,64 @@ static PyObject * escape_encode(PyObject *self, PyObject *args) { + static const char *hexdigits = "0123456789abcdef"; PyObject *str; + Py_ssize_t size; + Py_ssize_t newsize; const char *errors = NULL; - char *buf; - Py_ssize_t consumed, len; + PyObject *v; - if (!PyArg_ParseTuple(args, "S|z:escape_encode", - &str, &errors)) + if (!PyArg_ParseTuple(args, "O!|z:escape_encode", + &PyBytes_Type, &str, &errors)) return NULL; - consumed = PyString_GET_SIZE(str); - str = PyString_Repr(str, 0); - if (!str) - return NULL; + size = PyBytes_GET_SIZE(str); + newsize = 4*size; + if (newsize > PY_SSIZE_T_MAX || newsize / 4 != size) { + PyErr_SetString(PyExc_OverflowError, + "string is too large to encode"); + return NULL; + } + v = PyBytes_FromStringAndSize(NULL, newsize); - /* The string will be quoted. Unquote, similar to unicode-escape. */ - buf = PyString_AS_STRING (str); - len = PyString_GET_SIZE (str); - memmove(buf, buf+1, len-2); - if (_PyString_Resize(&str, len-2) < 0) + if (v == NULL) { return NULL; + } + else { + register Py_ssize_t i; + register char c; + register char *p = PyBytes_AS_STRING(v); + + for (i = 0; i < size; i++) { + /* There's at least enough room for a hex escape */ + assert(newsize - (p - PyBytes_AS_STRING(v)) >= 4); + c = PyBytes_AS_STRING(str)[i]; + if (c == '\'' || c == '\\') + *p++ = '\\', *p++ = c; + else if (c == '\t') + *p++ = '\\', *p++ = 't'; + else if (c == '\n') + *p++ = '\\', *p++ = 'n'; + else if (c == '\r') + *p++ = '\\', *p++ = 'r'; + else if (c < ' ' || c >= 0x7f) { + *p++ = '\\'; + *p++ = 'x'; + *p++ = hexdigits[(c & 0xf0) >> 4]; + *p++ = hexdigits[c & 0xf]; + } + else + *p++ = c; + } + *p = '\0'; + if (_PyBytes_Resize(&v, (p - PyBytes_AS_STRING(v)))) { + return NULL; + } + } - return codec_tuple(str, consumed); + return codec_tuple(v, size); } -#ifdef Py_USING_UNICODE /* --- Decoder ------------------------------------------------------------ */ static PyObject * @@ -239,7 +258,7 @@ utf_7_decode(PyObject *self, Py_ssize_t consumed; PyObject *decoded = NULL; - if (!PyArg_ParseTuple(args, "s*|zi:utf_7_decode", + if (!PyArg_ParseTuple(args, "y*|zi:utf_7_decode", &pbuf, &errors, &final)) return NULL; consumed = pbuf.len; @@ -262,7 +281,7 @@ utf_8_decode(PyObject *self, Py_ssize_t consumed; PyObject *decoded = NULL; - if (!PyArg_ParseTuple(args, "s*|zi:utf_8_decode", + if (!PyArg_ParseTuple(args, "y*|zi:utf_8_decode", &pbuf, &errors, &final)) return NULL; consumed = pbuf.len; @@ -286,7 +305,7 @@ utf_16_decode(PyObject *self, Py_ssize_t consumed; PyObject *decoded; - if (!PyArg_ParseTuple(args, "s*|zi:utf_16_decode", + if (!PyArg_ParseTuple(args, "y*|zi:utf_16_decode", &pbuf, &errors, &final)) return NULL; consumed = pbuf.len; /* This is overwritten unless final is true. */ @@ -309,7 +328,7 @@ utf_16_le_decode(PyObject *self, Py_ssize_t consumed; PyObject *decoded = NULL; - if (!PyArg_ParseTuple(args, "s*|zi:utf_16_le_decode", + if (!PyArg_ParseTuple(args, "y*|zi:utf_16_le_decode", &pbuf, &errors, &final)) return NULL; @@ -333,7 +352,7 @@ utf_16_be_decode(PyObject *self, Py_ssize_t consumed; PyObject *decoded = NULL; - if (!PyArg_ParseTuple(args, "s*|zi:utf_16_be_decode", + if (!PyArg_ParseTuple(args, "y*|zi:utf_16_be_decode", &pbuf, &errors, &final)) return NULL; @@ -365,7 +384,7 @@ utf_16_ex_decode(PyObject *self, int final = 0; Py_ssize_t consumed; - if (!PyArg_ParseTuple(args, "s*|zii:utf_16_ex_decode", + if (!PyArg_ParseTuple(args, "y*|zii:utf_16_ex_decode", &pbuf, &errors, &byteorder, &final)) return NULL; consumed = pbuf.len; /* This is overwritten unless final is true. */ @@ -390,7 +409,7 @@ utf_32_decode(PyObject *self, Py_ssize_t consumed; PyObject *decoded; - if (!PyArg_ParseTuple(args, "s*|zi:utf_32_decode", + if (!PyArg_ParseTuple(args, "y*|zi:utf_32_decode", &pbuf, &errors, &final)) return NULL; consumed = pbuf.len; /* This is overwritten unless final is true. */ @@ -413,7 +432,7 @@ utf_32_le_decode(PyObject *self, Py_ssize_t consumed; PyObject *decoded; - if (!PyArg_ParseTuple(args, "s*|zi:utf_32_le_decode", + if (!PyArg_ParseTuple(args, "y*|zi:utf_32_le_decode", &pbuf, &errors, &final)) return NULL; consumed = pbuf.len; /* This is overwritten unless final is true. */ @@ -436,7 +455,7 @@ utf_32_be_decode(PyObject *self, Py_ssize_t consumed; PyObject *decoded; - if (!PyArg_ParseTuple(args, "s*|zi:utf_32_be_decode", + if (!PyArg_ParseTuple(args, "y*|zi:utf_32_be_decode", &pbuf, &errors, &final)) return NULL; consumed = pbuf.len; /* This is overwritten unless final is true. */ @@ -467,7 +486,7 @@ utf_32_ex_decode(PyObject *self, int final = 0; Py_ssize_t consumed; - if (!PyArg_ParseTuple(args, "s*|zii:utf_32_ex_decode", + if (!PyArg_ParseTuple(args, "y*|zii:utf_32_ex_decode", &pbuf, &errors, &byteorder, &final)) return NULL; consumed = pbuf.len; /* This is overwritten unless final is true. */ @@ -523,7 +542,7 @@ latin_1_decode(PyObject *self, PyObject *unicode; const char *errors = NULL; - if (!PyArg_ParseTuple(args, "s*|z:latin_1_decode", + if (!PyArg_ParseTuple(args, "y*|z:latin_1_decode", &pbuf, &errors)) return NULL; @@ -540,7 +559,7 @@ ascii_decode(PyObject *self, PyObject *unicode; const char *errors = NULL; - if (!PyArg_ParseTuple(args, "s*|z:ascii_decode", + if (!PyArg_ParseTuple(args, "y*|z:ascii_decode", &pbuf, &errors)) return NULL; @@ -558,7 +577,7 @@ charmap_decode(PyObject *self, const char *errors = NULL; PyObject *mapping = NULL; - if (!PyArg_ParseTuple(args, "s*|zO:charmap_decode", + if (!PyArg_ParseTuple(args, "y*|zO:charmap_decode", &pbuf, &errors, &mapping)) return NULL; if (mapping == Py_None) @@ -581,7 +600,7 @@ mbcs_decode(PyObject *self, Py_ssize_t consumed; PyObject *decoded = NULL; - if (!PyArg_ParseTuple(args, "s*|zi:mbcs_decode", + if (!PyArg_ParseTuple(args, "y*|zi:mbcs_decode", &pbuf, &errors, &final)) return NULL; consumed = pbuf.len; @@ -602,32 +621,21 @@ static PyObject * readbuffer_encode(PyObject *self, PyObject *args) { + Py_buffer pdata; const char *data; Py_ssize_t size; const char *errors = NULL; + PyObject *result; - if (!PyArg_ParseTuple(args, "s#|z:readbuffer_encode", - &data, &size, &errors)) - return NULL; - - return codec_tuple(PyString_FromStringAndSize(data, size), - size); -} - -static PyObject * -charbuffer_encode(PyObject *self, - PyObject *args) -{ - const char *data; - Py_ssize_t size; - const char *errors = NULL; - - if (!PyArg_ParseTuple(args, "t#|z:charbuffer_encode", - &data, &size, &errors)) + if (!PyArg_ParseTuple(args, "s*|z:readbuffer_encode", + &pdata, &errors)) return NULL; + data = pdata.buf; + size = pdata.len; - return codec_tuple(PyString_FromStringAndSize(data, size), - size); + result = PyBytes_FromStringAndSize(data, size); + PyBuffer_Release(&pdata); + return codec_tuple(result, size); } static PyObject * @@ -646,14 +654,13 @@ unicode_internal_encode(PyObject *self, if (PyUnicode_Check(obj)) { data = PyUnicode_AS_DATA(obj); size = PyUnicode_GET_DATA_SIZE(obj); - return codec_tuple(PyString_FromStringAndSize(data, size), + return codec_tuple(PyBytes_FromStringAndSize(data, size), PyUnicode_GET_SIZE(obj)); } else { if (PyObject_AsReadBuffer(obj, (const void **)&data, &size)) return NULL; - return codec_tuple(PyString_FromStringAndSize(data, size), - size); + return codec_tuple(PyBytes_FromStringAndSize(data, size), size); } } @@ -1008,7 +1015,6 @@ mbcs_encode(PyObject *self, } #endif /* MS_WINDOWS */ -#endif /* Py_USING_UNICODE */ /* --- Error handler registry --------------------------------------------- */ @@ -1063,7 +1069,6 @@ static PyMethodDef _codecs_functions[] = { decode__doc__}, {"escape_encode", escape_encode, METH_VARARGS}, {"escape_decode", escape_decode, METH_VARARGS}, -#ifdef Py_USING_UNICODE {"utf_8_encode", utf_8_encode, METH_VARARGS}, {"utf_8_decode", utf_8_decode, METH_VARARGS}, {"utf_7_encode", utf_7_encode, METH_VARARGS}, @@ -1096,12 +1101,10 @@ static PyMethodDef _codecs_functions[] = { {"charmap_decode", charmap_decode, METH_VARARGS}, {"charmap_build", charmap_build, METH_VARARGS}, {"readbuffer_encode", readbuffer_encode, METH_VARARGS}, - {"charbuffer_encode", charbuffer_encode, METH_VARARGS}, #if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T) {"mbcs_encode", mbcs_encode, METH_VARARGS}, {"mbcs_decode", mbcs_decode, METH_VARARGS}, #endif -#endif /* Py_USING_UNICODE */ {"register_error", register_error, METH_VARARGS, register_error__doc__}, {"lookup_error", lookup_error, METH_VARARGS, @@ -1109,8 +1112,20 @@ static PyMethodDef _codecs_functions[] = { {NULL, NULL} /* sentinel */ }; +static struct PyModuleDef codecsmodule = { + PyModuleDef_HEAD_INIT, + "_codecs", + NULL, + -1, + _codecs_functions, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_codecs(void) +PyInit__codecs(void) { - Py_InitModule("_codecs", _codecs_functions); + return PyModule_Create(&codecsmodule); } diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 242abf2afd0..54c1343e2a5 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -541,7 +541,7 @@ deque_count(dequeobject *deque, PyObject *v) leftindex = 0; } } - return PyInt_FromSsize_t(count); + return PyLong_FromSsize_t(count); } PyDoc_STRVAR(count_doc, @@ -797,14 +797,14 @@ PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); static PyObject * deque_repr(PyObject *deque) { - PyObject *aslist, *result, *fmt; + PyObject *aslist, *result; int i; i = Py_ReprEnter(deque); if (i != 0) { if (i < 0) return NULL; - return PyString_FromString("[...]"); + return PyUnicode_FromString("[...]"); } aslist = PySequence_List(deque); @@ -813,74 +813,16 @@ deque_repr(PyObject *deque) return NULL; } if (((dequeobject *)deque)->maxlen != -1) - fmt = PyString_FromFormat("deque(%%r, maxlen=%zd)", - ((dequeobject *)deque)->maxlen); + + result = PyUnicode_FromFormat("deque(%R, maxlen=%zd)", + aslist, ((dequeobject *)deque)->maxlen); else - fmt = PyString_FromString("deque(%r)"); - if (fmt == NULL) { - Py_DECREF(aslist); - Py_ReprLeave(deque); - return NULL; - } - result = PyString_Format(fmt, aslist); - Py_DECREF(fmt); + result = PyUnicode_FromFormat("deque(%R)", aslist); Py_DECREF(aslist); Py_ReprLeave(deque); return result; } -static int -deque_tp_print(PyObject *deque, FILE *fp, int flags) -{ - PyObject *it, *item; - char *emit = ""; /* No separator emitted on first pass */ - char *separator = ", "; - int i; - - i = Py_ReprEnter(deque); - if (i != 0) { - if (i < 0) - return i; - Py_BEGIN_ALLOW_THREADS - fputs("[...]", fp); - Py_END_ALLOW_THREADS - return 0; - } - - it = PyObject_GetIter(deque); - if (it == NULL) - return -1; - - Py_BEGIN_ALLOW_THREADS - fputs("deque([", fp); - Py_END_ALLOW_THREADS - while ((item = PyIter_Next(it)) != NULL) { - Py_BEGIN_ALLOW_THREADS - fputs(emit, fp); - Py_END_ALLOW_THREADS - emit = separator; - if (PyObject_Print(item, fp, 0) != 0) { - Py_DECREF(item); - Py_DECREF(it); - Py_ReprLeave(deque); - return -1; - } - Py_DECREF(item); - } - Py_ReprLeave(deque); - Py_DECREF(it); - if (PyErr_Occurred()) - return -1; - - Py_BEGIN_ALLOW_THREADS - if (((dequeobject *)deque)->maxlen == -1) - fputs("])", fp); - else - fprintf(fp, "], maxlen=%" PY_FORMAT_SIZE_T "d)", ((dequeobject *)deque)->maxlen); - Py_END_ALLOW_THREADS - return 0; -} - static PyObject * deque_richcompare(PyObject *v, PyObject *w, int op) { @@ -971,7 +913,7 @@ deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs) if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj)) return -1; if (maxlenobj != NULL && maxlenobj != Py_None) { - maxlen = PyInt_AsSsize_t(maxlenobj); + maxlen = PyLong_AsSsize_t(maxlenobj); if (maxlen == -1 && PyErr_Occurred()) return -1; if (maxlen < 0) { @@ -1012,7 +954,7 @@ deque_get_maxlen(dequeobject *deque) { if (deque->maxlen == -1) Py_RETURN_NONE; - return PyInt_FromSsize_t(deque->maxlen); + return PyLong_FromSsize_t(deque->maxlen); } static PyGetSetDef deque_getset[] = { @@ -1088,32 +1030,32 @@ static PyTypeObject deque_type = { 0, /* tp_itemsize */ /* methods */ (destructor)deque_dealloc, /* tp_dealloc */ - deque_tp_print, /* tp_print */ + 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ deque_repr, /* tp_repr */ 0, /* tp_as_number */ &deque_as_sequence, /* tp_as_sequence */ 0, /* tp_as_mapping */ - (hashfunc)PyObject_HashNotImplemented, /* tp_hash */ + PyObject_HashNotImplemented, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | - Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + /* tp_flags */ deque_doc, /* tp_doc */ (traverseproc)deque_traverse, /* tp_traverse */ (inquiry)deque_clear, /* tp_clear */ (richcmpfunc)deque_richcompare, /* tp_richcompare */ - offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/ + offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/ (getiterfunc)deque_iter, /* tp_iter */ 0, /* tp_iternext */ deque_methods, /* tp_methods */ 0, /* tp_members */ - deque_getset, /* tp_getset */ + deque_getset, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ @@ -1201,7 +1143,7 @@ dequeiter_next(dequeiterobject *it) static PyObject * dequeiter_len(dequeiterobject *it) { - return PyInt_FromLong(it->counter); + return PyLong_FromSsize_t(it->counter); } PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it))."); @@ -1221,7 +1163,7 @@ static PyTypeObject dequeiter_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1304,7 +1246,7 @@ static PyTypeObject dequereviter_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1410,6 +1352,7 @@ defdict_reduce(defdictobject *dd) */ PyObject *args; PyObject *items; + PyObject *iter; PyObject *result; if (dd->default_factory == NULL || dd->default_factory == Py_None) args = PyTuple_New(0); @@ -1417,13 +1360,20 @@ defdict_reduce(defdictobject *dd) args = PyTuple_Pack(1, dd->default_factory); if (args == NULL) return NULL; - items = PyObject_CallMethod((PyObject *)dd, "iteritems", "()"); + items = PyObject_CallMethod((PyObject *)dd, "items", "()"); if (items == NULL) { Py_DECREF(args); return NULL; } + iter = PyObject_GetIter(items); + if (iter == NULL) { + Py_DECREF(items); + Py_DECREF(args); + return NULL; + } result = PyTuple_Pack(5, Py_TYPE(dd), args, - Py_None, Py_None, items); + Py_None, Py_None, iter); + Py_DECREF(iter); Py_DECREF(items); Py_DECREF(args); return result; @@ -1455,41 +1405,17 @@ defdict_dealloc(defdictobject *dd) PyDict_Type.tp_dealloc((PyObject *)dd); } -static int -defdict_print(defdictobject *dd, FILE *fp, int flags) -{ - int sts; - Py_BEGIN_ALLOW_THREADS - fprintf(fp, "defaultdict("); - Py_END_ALLOW_THREADS - if (dd->default_factory == NULL) { - Py_BEGIN_ALLOW_THREADS - fprintf(fp, "None"); - Py_END_ALLOW_THREADS - } else { - PyObject_Print(dd->default_factory, fp, 0); - } - Py_BEGIN_ALLOW_THREADS - fprintf(fp, ", "); - Py_END_ALLOW_THREADS - sts = PyDict_Type.tp_print((PyObject *)dd, fp, 0); - Py_BEGIN_ALLOW_THREADS - fprintf(fp, ")"); - Py_END_ALLOW_THREADS - return sts; -} - static PyObject * defdict_repr(defdictobject *dd) { - PyObject *defrepr; PyObject *baserepr; + PyObject *defrepr; PyObject *result; baserepr = PyDict_Type.tp_repr((PyObject *)dd); if (baserepr == NULL) return NULL; if (dd->default_factory == NULL) - defrepr = PyString_FromString("None"); + defrepr = PyUnicode_FromString("None"); else { int status = Py_ReprEnter(dd->default_factory); @@ -1498,7 +1424,7 @@ defdict_repr(defdictobject *dd) Py_DECREF(baserepr); return NULL; } - defrepr = PyString_FromString("..."); + defrepr = PyUnicode_FromString("..."); } else defrepr = PyObject_Repr(dd->default_factory); @@ -1508,9 +1434,8 @@ defdict_repr(defdictobject *dd) Py_DECREF(baserepr); return NULL; } - result = PyString_FromFormat("defaultdict(%s, %s)", - PyString_AS_STRING(defrepr), - PyString_AS_STRING(baserepr)); + result = PyUnicode_FromFormat("defaultdict(%U, %U)", + defrepr, baserepr); Py_DECREF(defrepr); Py_DECREF(baserepr); return result; @@ -1580,10 +1505,10 @@ static PyTypeObject defdict_type = { 0, /* tp_itemsize */ /* methods */ (destructor)defdict_dealloc, /* tp_dealloc */ - (printfunc)defdict_print, /* tp_print */ + 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)defdict_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1594,8 +1519,8 @@ static PyTypeObject defdict_type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | - Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + /* tp_flags */ defdict_doc, /* tp_doc */ defdict_traverse, /* tp_traverse */ (inquiry)defdict_tp_clear, /* tp_clear */ @@ -1617,6 +1542,95 @@ static PyTypeObject defdict_type = { PyObject_GC_Del, /* tp_free */ }; +/* helper function for Counter *********************************************/ + +PyDoc_STRVAR(_count_elements_doc, +"_count_elements(mapping, iterable) -> None\n\ +\n\ +Count elements in the iterable, updating the mappping"); + +static PyObject * +_count_elements(PyObject *self, PyObject *args) +{ + PyObject *it, *iterable, *mapping, *oldval; + PyObject *newval = NULL; + PyObject *key = NULL; + PyObject *one = NULL; + + if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable)) + return NULL; + + it = PyObject_GetIter(iterable); + if (it == NULL) + return NULL; + + one = PyLong_FromLong(1); + if (one == NULL) { + Py_DECREF(it); + return NULL; + } + + if (PyDict_CheckExact(mapping)) { + while (1) { + key = PyIter_Next(it); + if (key == NULL) { + if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) + PyErr_Clear(); + else + break; + } + oldval = PyDict_GetItem(mapping, key); + if (oldval == NULL) { + if (PyDict_SetItem(mapping, key, one) == -1) + break; + } else { + newval = PyNumber_Add(oldval, one); + if (newval == NULL) + break; + if (PyDict_SetItem(mapping, key, newval) == -1) + break; + Py_CLEAR(newval); + } + Py_DECREF(key); + } + } else { + while (1) { + key = PyIter_Next(it); + if (key == NULL) { + if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) + PyErr_Clear(); + else + break; + } + oldval = PyObject_GetItem(mapping, key); + if (oldval == NULL) { + if (!PyErr_Occurred() || !PyErr_ExceptionMatches(PyExc_KeyError)) + break; + PyErr_Clear(); + Py_INCREF(one); + newval = one; + } else { + newval = PyNumber_Add(oldval, one); + Py_DECREF(oldval); + if (newval == NULL) + break; + } + if (PyObject_SetItem(mapping, key, newval) == -1) + break; + Py_CLEAR(newval); + Py_DECREF(key); + } + } + + Py_DECREF(it); + Py_XDECREF(key); + Py_XDECREF(newval); + Py_DECREF(one); + if (PyErr_Occurred()) + return NULL; + Py_RETURN_NONE; +} + /* module level code ********************************************************/ PyDoc_STRVAR(module_doc, @@ -1625,31 +1639,48 @@ PyDoc_STRVAR(module_doc, - defaultdict: dict subclass with a default value factory\n\ "); +static struct PyMethodDef module_functions[] = { + {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc}, + {NULL, NULL} /* sentinel */ +}; + +static struct PyModuleDef _collectionsmodule = { + PyModuleDef_HEAD_INIT, + "_collections", + module_doc, + -1, + module_functions, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_collections(void) +PyInit__collections(void) { PyObject *m; - m = Py_InitModule3("_collections", NULL, module_doc); + m = PyModule_Create(&_collectionsmodule); if (m == NULL) - return; + return NULL; if (PyType_Ready(&deque_type) < 0) - return; + return NULL; Py_INCREF(&deque_type); PyModule_AddObject(m, "deque", (PyObject *)&deque_type); defdict_type.tp_base = &PyDict_Type; if (PyType_Ready(&defdict_type) < 0) - return; + return NULL; Py_INCREF(&defdict_type); PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type); if (PyType_Ready(&dequeiter_type) < 0) - return; + return NULL; if (PyType_Ready(&dequereviter_type) < 0) - return; + return NULL; - return; + return m; } diff --git a/Modules/_csv.c b/Modules/_csv.c index fd6121fccfc..88d4f9774fa 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -6,10 +6,6 @@ This module provides the low-level underpinnings of a CSV reading/writing module. Users should not use this module directly, but import the csv.py module instead. -**** For people modifying this code, please note that as of this writing -**** (2003-03-23), it is intended that this code should work with Python -**** 2.2. - */ #define MODULE_VERSION "1.0" @@ -17,52 +13,8 @@ module instead. #include "Python.h" #include "structmember.h" - -/* begin 2.2 compatibility macros */ -#ifndef PyDoc_STRVAR -/* Define macros for inline documentation. */ -#define PyDoc_VAR(name) static char name[] -#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str) -#ifdef WITH_DOC_STRINGS -#define PyDoc_STR(str) str -#else -#define PyDoc_STR(str) "" -#endif -#endif /* ifndef PyDoc_STRVAR */ - -#ifndef PyMODINIT_FUNC -# if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" void -# else /* __cplusplus */ -# define PyMODINIT_FUNC void -# endif /* __cplusplus */ -#endif - -#ifndef Py_CLEAR -#define Py_CLEAR(op) \ - do { \ - if (op) { \ - PyObject *tmp = (PyObject *)(op); \ - (op) = NULL; \ - Py_DECREF(tmp); \ - } \ - } while (0) -#endif -#ifndef Py_VISIT -#define Py_VISIT(op) \ - do { \ - if (op) { \ - int vret = visit((PyObject *)(op), arg); \ - if (vret) \ - return vret; \ - } \ - } while (0) -#endif - -/* end 2.2 compatibility macros */ - #define IS_BASESTRING(o) \ - PyObject_TypeCheck(o, &PyBaseString_Type) + PyUnicode_Check(o) static PyObject *error_obj; /* CSV exception */ static PyObject *dialects; /* Dialect registry */ @@ -95,9 +47,9 @@ typedef struct { PyObject_HEAD int doublequote; /* is " represented by ""? */ - char delimiter; /* field separator */ - char quotechar; /* quote character */ - char escapechar; /* escape character */ + Py_UNICODE delimiter; /* field separator */ + Py_UNICODE quotechar; /* quote character */ + Py_UNICODE escapechar; /* escape character */ int skipinitialspace; /* ignore spaces following delimiter? */ PyObject *lineterminator; /* string to write between records */ int quoting; /* style of quoting to write */ @@ -105,7 +57,7 @@ typedef struct { int strict; /* raise exception on bad CSV */ } DialectObj; -staticforward PyTypeObject Dialect_Type; +static PyTypeObject Dialect_Type; typedef struct { PyObject_HEAD @@ -116,14 +68,14 @@ typedef struct { PyObject *fields; /* field list for current record */ ParserState state; /* current CSV parse state */ - char *field; /* build current field in here */ - int field_size; /* size of allocated buffer */ - int field_len; /* length of current field */ + Py_UNICODE *field; /* build current field in here */ + Py_ssize_t field_size; /* size of allocated buffer */ + Py_ssize_t field_len; /* length of current field */ int numeric_field; /* treat field as numeric */ unsigned long line_num; /* Source-file line number */ } ReaderObj; -staticforward PyTypeObject Reader_Type; +static PyTypeObject Reader_Type; #define ReaderObject_Check(v) (Py_TYPE(v) == &Reader_Type) @@ -134,13 +86,13 @@ typedef struct { DialectObj *dialect; /* parsing dialect */ - char *rec; /* buffer for parser.join */ - int rec_size; /* size of allocated record */ - int rec_len; /* length of record */ + Py_UNICODE *rec; /* buffer for parser.join */ + Py_ssize_t rec_size; /* size of allocated record */ + Py_ssize_t rec_len; /* length of record */ int num_fields; /* number of fields in record */ } WriterObj; -staticforward PyTypeObject Writer_Type; +static PyTypeObject Writer_Type; /* * DIALECT class @@ -169,14 +121,14 @@ get_string(PyObject *str) } static PyObject * -get_nullchar_as_None(char c) +get_nullchar_as_None(Py_UNICODE c) { if (c == '\0') { Py_INCREF(Py_None); return Py_None; } else - return PyString_FromStringAndSize((char*)&c, 1); + return PyUnicode_FromUnicode((Py_UNICODE *)&c, 1); } static PyObject * @@ -186,6 +138,12 @@ Dialect_get_lineterminator(DialectObj *self) } static PyObject * +Dialect_get_delimiter(DialectObj *self) +{ + return get_nullchar_as_None(self->delimiter); +} + +static PyObject * Dialect_get_escapechar(DialectObj *self) { return get_nullchar_as_None(self->escapechar); @@ -200,7 +158,7 @@ Dialect_get_quotechar(DialectObj *self) static PyObject * Dialect_get_quoting(DialectObj *self) { - return PyInt_FromLong(self->quoting); + return PyLong_FromLong(self->quoting); } static int @@ -223,35 +181,47 @@ _set_int(const char *name, int *target, PyObject *src, int dflt) if (src == NULL) *target = dflt; else { - if (!PyInt_Check(src)) { + long value; + if (!PyLong_CheckExact(src)) { PyErr_Format(PyExc_TypeError, "\"%s\" must be an integer", name); return -1; } - *target = PyInt_AsLong(src); + value = PyLong_AsLong(src); + if (value == -1 && PyErr_Occurred()) + return -1; +#if SIZEOF_LONG > SIZEOF_INT + if (value > INT_MAX || value < INT_MIN) { + PyErr_Format(PyExc_ValueError, + "integer out of range for \"%s\"", name); + return -1; + } +#endif + *target = (int)value; } return 0; } static int -_set_char(const char *name, char *target, PyObject *src, char dflt) +_set_char(const char *name, Py_UNICODE *target, PyObject *src, Py_UNICODE dflt) { if (src == NULL) *target = dflt; else { - if (src == Py_None || PyString_Size(src) == 0) - *target = '\0'; - else if (!PyString_Check(src) || PyString_Size(src) != 1) { - PyErr_Format(PyExc_TypeError, - "\"%s\" must be an 1-character string", - name); - return -1; - } - else { - char *s = PyString_AsString(src); - if (s == NULL) + *target = '\0'; + if (src != Py_None) { + Py_UNICODE *buf; + Py_ssize_t len; + buf = PyUnicode_AsUnicode(src); + len = PyUnicode_GetSize(src); + if (buf == NULL || len > 1) { + PyErr_Format(PyExc_TypeError, + "\"%s\" must be an 1-character string", + name); return -1; - *target = s[0]; + } + if (len > 0) + *target = buf[0]; } } return 0; @@ -261,13 +231,13 @@ static int _set_str(const char *name, PyObject **target, PyObject *src, const char *dflt) { if (src == NULL) - *target = PyString_FromString(dflt); + *target = PyUnicode_DecodeASCII(dflt, strlen(dflt), NULL); else { if (src == Py_None) *target = NULL; else if (!IS_BASESTRING(src)) { PyErr_Format(PyExc_TypeError, - "\"%s\" must be an string", name); + "\"%s\" must be a string", name); return -1; } else { @@ -282,7 +252,7 @@ _set_str(const char *name, PyObject **target, PyObject *src, const char *dflt) static int dialect_check_quoting(int quoting) { - StyleDesc *qs = quote_styles; + StyleDesc *qs; for (qs = quote_styles; qs->name; qs++) { if (qs->style == quoting) @@ -295,7 +265,6 @@ dialect_check_quoting(int quoting) #define D_OFF(x) offsetof(DialectObj, x) static struct PyMemberDef Dialect_memberlist[] = { - { "delimiter", T_CHAR, D_OFF(delimiter), READONLY }, { "skipinitialspace", T_INT, D_OFF(skipinitialspace), READONLY }, { "doublequote", T_INT, D_OFF(doublequote), READONLY }, { "strict", T_INT, D_OFF(strict), READONLY }, @@ -303,6 +272,7 @@ static struct PyMemberDef Dialect_memberlist[] = { }; static PyGetSetDef Dialect_getsetlist[] = { + { "delimiter", (getter)Dialect_get_delimiter}, { "escapechar", (getter)Dialect_get_escapechar}, { "lineterminator", (getter)Dialect_get_lineterminator}, { "quotechar", (getter)Dialect_get_quotechar}, @@ -473,7 +443,7 @@ static PyTypeObject Dialect_Type = { (printfunc)0, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ - (cmpfunc)0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -532,7 +502,7 @@ parse_save_field(ReaderObj *self) { PyObject *field; - field = PyString_FromStringAndSize(self->field, self->field_len); + field = PyUnicode_FromUnicode(self->field, self->field_len); if (field == NULL) return -1; self->field_len = 0; @@ -560,15 +530,16 @@ parse_grow_buff(ReaderObj *self) self->field_size = 4096; if (self->field != NULL) PyMem_Free(self->field); - self->field = PyMem_Malloc(self->field_size); + self->field = PyMem_New(Py_UNICODE, self->field_size); } else { - if (self->field_size > INT_MAX / 2) { + if (self->field_size > PY_SSIZE_T_MAX / 2) { PyErr_NoMemory(); return 0; } self->field_size *= 2; - self->field = PyMem_Realloc(self->field, self->field_size); + self->field = PyMem_Resize(self->field, Py_UNICODE, + self->field_size); } if (self->field == NULL) { PyErr_NoMemory(); @@ -578,7 +549,7 @@ parse_grow_buff(ReaderObj *self) } static int -parse_add_char(ReaderObj *self, char c) +parse_add_char(ReaderObj *self, Py_UNICODE c) { if (self->field_len >= field_limit) { PyErr_Format(error_obj, "field larger than field limit (%ld)", @@ -592,7 +563,7 @@ parse_add_char(ReaderObj *self, char c) } static int -parse_process_char(ReaderObj *self, char c) +parse_process_char(ReaderObj *self, Py_UNICODE c) { DialectObj *dialect = self->dialect; @@ -779,8 +750,8 @@ Reader_iternext(ReaderObj *self) { PyObject *lineobj; PyObject *fields = NULL; - char *line, c; - int linelen; + Py_UNICODE *line, c; + Py_ssize_t linelen; if (parse_reset(self) < 0) return NULL; @@ -792,16 +763,24 @@ Reader_iternext(ReaderObj *self) self->state == IN_QUOTED_FIELD)) { if (self->dialect->strict) PyErr_SetString(error_obj, "unexpected end of data"); - else if (parse_save_field(self) >= 0 ) + else if (parse_save_field(self) >= 0) break; } return NULL; } + if (!PyUnicode_Check(lineobj)) { + PyErr_Format(error_obj, + "iterator should return strings, " + "not %.200s " + "(did you open the file in text mode?)", + lineobj->ob_type->tp_name + ); + Py_DECREF(lineobj); + return NULL; + } ++self->line_num; - - line = PyString_AsString(lineobj); - linelen = PyString_Size(lineobj); - + line = PyUnicode_AsUnicode(lineobj); + linelen = PyUnicode_GetSize(lineobj); if (line == NULL || linelen < 0) { Py_DECREF(lineobj); return NULL; @@ -873,8 +852,8 @@ static struct PyMethodDef Reader_methods[] = { #define R_OFF(x) offsetof(ReaderObj, x) static struct PyMemberDef Reader_memberlist[] = { - { "dialect", T_OBJECT, R_OFF(dialect), RO }, - { "line_num", T_ULONG, R_OFF(line_num), RO }, + { "dialect", T_OBJECT, R_OFF(dialect), READONLY }, + { "line_num", T_ULONG, R_OFF(line_num), READONLY }, { NULL } }; @@ -889,7 +868,7 @@ static PyTypeObject Reader_Type = { (printfunc)0, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ + 0, /*tp_reserved*/ (reprfunc)0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -973,13 +952,14 @@ join_reset(WriterObj *self) /* Calculate new record length or append field to record. Return new * record length. */ -static int -join_append_data(WriterObj *self, char *field, int quote_empty, +static Py_ssize_t +join_append_data(WriterObj *self, Py_UNICODE *field, int quote_empty, int *quoted, int copy_phase) { DialectObj *dialect = self->dialect; - int i, rec_len; - char *lineterm; + int i; + Py_ssize_t rec_len; + Py_UNICODE *lineterm; #define ADDCH(c) \ do {\ @@ -988,7 +968,7 @@ join_append_data(WriterObj *self, char *field, int quote_empty, rec_len++;\ } while(0) - lineterm = PyString_AsString(dialect->lineterminator); + lineterm = PyUnicode_AsUnicode(dialect->lineterminator); if (lineterm == NULL) return -1; @@ -1003,8 +983,9 @@ join_append_data(WriterObj *self, char *field, int quote_empty, ADDCH(dialect->quotechar); /* Copy/count field data */ - for (i = 0;; i++) { - char c = field[i]; + /* If field is null just pass over */ + for (i = 0; field; i++) { + Py_UNICODE c = field[i]; int want_escape = 0; if (c == '\0') @@ -1012,8 +993,8 @@ join_append_data(WriterObj *self, char *field, int quote_empty, if (c == dialect->delimiter || c == dialect->escapechar || - c == dialect->quotechar || - strchr(lineterm, c)) { + c == dialect->quotechar || + Py_UNICODE_strchr(lineterm, c)) { if (dialect->quoting == QUOTE_NONE) want_escape = 1; else { @@ -1045,7 +1026,7 @@ join_append_data(WriterObj *self, char *field, int quote_empty, if (i == 0 && quote_empty) { if (dialect->quoting == QUOTE_NONE) { PyErr_Format(error_obj, - "single empty field record must be quoted"); + "single empty field record must be quoted"); return -1; } else @@ -1063,10 +1044,10 @@ join_append_data(WriterObj *self, char *field, int quote_empty, } static int -join_check_rec_size(WriterObj *self, int rec_len) +join_check_rec_size(WriterObj *self, Py_ssize_t rec_len) { - if (rec_len < 0 || rec_len > INT_MAX - MEM_INCR) { + if (rec_len < 0 || rec_len > PY_SSIZE_T_MAX - MEM_INCR) { PyErr_NoMemory(); return 0; } @@ -1076,13 +1057,14 @@ join_check_rec_size(WriterObj *self, int rec_len) self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR; if (self->rec != NULL) PyMem_Free(self->rec); - self->rec = PyMem_Malloc(self->rec_size); + self->rec = PyMem_New(Py_UNICODE, self->rec_size); } else { - char *old_rec = self->rec; + Py_UNICODE* old_rec = self->rec; self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR; - self->rec = PyMem_Realloc(self->rec, self->rec_size); + self->rec = PyMem_Resize(self->rec, Py_UNICODE, + self->rec_size); if (self->rec == NULL) PyMem_Free(old_rec); } @@ -1095,9 +1077,9 @@ join_check_rec_size(WriterObj *self, int rec_len) } static int -join_append(WriterObj *self, char *field, int *quoted, int quote_empty) +join_append(WriterObj *self, Py_UNICODE *field, int *quoted, int quote_empty) { - int rec_len; + Py_ssize_t rec_len; rec_len = join_append_data(self, field, quote_empty, quoted, 0); if (rec_len < 0) @@ -1116,10 +1098,10 @@ join_append(WriterObj *self, char *field, int *quoted, int quote_empty) static int join_append_lineterminator(WriterObj *self) { - int terminator_len; - char *terminator; + Py_ssize_t terminator_len; + Py_UNICODE *terminator; - terminator_len = PyString_Size(self->dialect->lineterminator); + terminator_len = PyUnicode_GetSize(self->dialect->lineterminator); if (terminator_len == -1) return 0; @@ -1127,10 +1109,11 @@ join_append_lineterminator(WriterObj *self) if (!join_check_rec_size(self, self->rec_len + terminator_len)) return 0; - terminator = PyString_AsString(self->dialect->lineterminator); + terminator = PyUnicode_AsUnicode(self->dialect->lineterminator); if (terminator == NULL) return 0; - memmove(self->rec + self->rec_len, terminator, terminator_len); + memmove(self->rec + self->rec_len, terminator, + sizeof(Py_UNICODE)*terminator_len); self->rec_len += terminator_len; return 1; @@ -1146,7 +1129,7 @@ static PyObject * csv_writerow(WriterObj *self, PyObject *seq) { DialectObj *dialect = self->dialect; - int len, i; + Py_ssize_t len, i; if (!PySequence_Check(seq)) return PyErr_Format(error_obj, "sequence expected"); @@ -1179,29 +1162,26 @@ csv_writerow(WriterObj *self, PyObject *seq) break; } - if (PyString_Check(field)) { + if (PyUnicode_Check(field)) { append_ok = join_append(self, - PyString_AS_STRING(field), + PyUnicode_AS_UNICODE(field), "ed, len == 1); Py_DECREF(field); } else if (field == Py_None) { - append_ok = join_append(self, "", "ed, len == 1); + append_ok = join_append(self, NULL, + "ed, len == 1); Py_DECREF(field); } else { PyObject *str; - if (PyFloat_Check(field)) { - str = PyObject_Repr(field); - } else { - str = PyObject_Str(field); - } + str = PyObject_Str(field); Py_DECREF(field); if (str == NULL) return NULL; - - append_ok = join_append(self, PyString_AS_STRING(str), + append_ok = join_append(self, + PyUnicode_AS_UNICODE(str), "ed, len == 1); Py_DECREF(str); } @@ -1215,7 +1195,8 @@ csv_writerow(WriterObj *self, PyObject *seq) return 0; return PyObject_CallFunction(self->writeline, - "(s#)", self->rec, self->rec_len); + "(u#)", self->rec, + self->rec_len); } PyDoc_STRVAR(csv_writerows_doc, @@ -1261,7 +1242,7 @@ static struct PyMethodDef Writer_methods[] = { #define W_OFF(x) offsetof(WriterObj, x) static struct PyMemberDef Writer_memberlist[] = { - { "dialect", T_OBJECT, W_OFF(dialect), RO }, + { "dialect", T_OBJECT, W_OFF(dialect), READONLY }, { NULL } }; @@ -1309,7 +1290,7 @@ static PyTypeObject Writer_Type = { (printfunc)0, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ + 0, /*tp_reserved*/ (reprfunc)0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -1429,14 +1410,18 @@ csv_field_size_limit(PyObject *module, PyObject *args) if (!PyArg_UnpackTuple(args, "field_size_limit", 0, 1, &new_limit)) return NULL; if (new_limit != NULL) { - if (!PyInt_Check(new_limit)) { + if (!PyLong_CheckExact(new_limit)) { PyErr_Format(PyExc_TypeError, "limit must be an integer"); return NULL; } - field_limit = PyInt_AsLong(new_limit); + field_limit = PyLong_AsLong(new_limit); + if (field_limit == -1 && PyErr_Occurred()) { + field_limit = old_limit; + return NULL; + } } - return PyInt_FromLong(old_limit); + return PyLong_FromLong(old_limit); } /* @@ -1571,53 +1556,67 @@ static struct PyMethodDef csv_methods[] = { { NULL, NULL } }; + +static struct PyModuleDef _csvmodule = { + PyModuleDef_HEAD_INIT, + "_csv", + csv_module_doc, + -1, + csv_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_csv(void) +PyInit__csv(void) { PyObject *module; StyleDesc *style; if (PyType_Ready(&Dialect_Type) < 0) - return; + return NULL; if (PyType_Ready(&Reader_Type) < 0) - return; + return NULL; if (PyType_Ready(&Writer_Type) < 0) - return; + return NULL; /* Create the module and add the functions */ - module = Py_InitModule3("_csv", csv_methods, csv_module_doc); + module = PyModule_Create(&_csvmodule); if (module == NULL) - return; + return NULL; /* Add version to the module. */ if (PyModule_AddStringConstant(module, "__version__", MODULE_VERSION) == -1) - return; + return NULL; /* Add _dialects dictionary */ dialects = PyDict_New(); if (dialects == NULL) - return; + return NULL; if (PyModule_AddObject(module, "_dialects", dialects)) - return; + return NULL; /* Add quote styles into dictionary */ for (style = quote_styles; style->name; style++) { if (PyModule_AddIntConstant(module, style->name, style->style) == -1) - return; + return NULL; } /* Add the Dialect type */ Py_INCREF(&Dialect_Type); if (PyModule_AddObject(module, "Dialect", (PyObject *)&Dialect_Type)) - return; + return NULL; /* Add the CSV exception object to the module. */ error_obj = PyErr_NewException("_csv.Error", NULL, NULL); if (error_obj == NULL) - return; + return NULL; PyModule_AddObject(module, "Error", error_obj); + return module; } diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index e8920302451..73ab2fdc422 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1,8 +1,3 @@ -/***************************************************************** - This file should be kept compatible with Python 2.3, see PEP 291. - *****************************************************************/ - - /* ToDo: @@ -137,37 +132,7 @@ static PyTypeObject Simple_Type; /* a callable object used for unpickling */ static PyObject *_unpickle; -char *_ctypes_conversion_encoding = NULL; -char *_ctypes_conversion_errors = NULL; - - -/****************************************************************/ - -#if (PY_VERSION_HEX < 0x02040000) -/* Only in Python 2.4 and up */ -static PyObject * -PyTuple_Pack(int n, ...) -{ - int i; - PyObject *o; - PyObject *result; - PyObject **items; - va_list vargs; - va_start(vargs, n); - result = PyTuple_New(n); - if (result == NULL) - return NULL; - items = ((PyTupleObject *)result)->ob_item; - for (i = 0; i < n; i++) { - o = va_arg(vargs, PyObject *); - Py_INCREF(o); - items[i] = o; - } - va_end(vargs); - return result; -} -#endif /****************************************************************/ @@ -212,7 +177,7 @@ static PyTypeObject DictRemover_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -436,7 +401,7 @@ static PyObject * CDataType_from_address(PyObject *type, PyObject *value) { void *buf; - if (!PyInt_Check(value) && !PyLong_Check(value)) { + if (!PyLong_Check(value)) { PyErr_SetString(PyExc_TypeError, "integer expected"); return NULL; @@ -528,7 +493,7 @@ CDataType_from_buffer_copy(PyObject *type, PyObject *args) &obj, &offset)) return NULL; - if (-1 == PyObject_AsReadBuffer(obj, &buffer, &buffer_len)) + if (-1 == PyObject_AsReadBuffer(obj, (const void**)&buffer, &buffer_len)) return NULL; if (offset < 0) { @@ -574,7 +539,7 @@ CDataType_in_dll(PyObject *type, PyObject *args) obj = PyObject_GetAttrString(dll, "_handle"); if (!obj) return NULL; - if (!PyInt_Check(obj) && !PyLong_Check(obj)) { + if (!PyLong_Check(obj)) { PyErr_SetString(PyExc_TypeError, "the _handle attribute of the second argument must be an integer"); Py_DECREF(obj); @@ -679,11 +644,7 @@ CDataType_repeat(PyObject *self, Py_ssize_t length) { if (length < 0) return PyErr_Format(PyExc_ValueError, -#if (PY_VERSION_HEX < 0x02050000) - "Array length must be >= 0, not %d", -#else "Array length must be >= 0, not %zd", -#endif length); return PyCArrayType_from_ctype(self, length); } @@ -727,8 +688,9 @@ PyCStructType_setattro(PyObject *self, PyObject *key, PyObject *value) if (-1 == PyType_Type.tp_setattro(self, key, value)) return -1; - if (value && PyString_Check(key) && - 0 == strcmp(PyString_AS_STRING(key), "_fields_")) + if (value && PyUnicode_Check(key) && + /* XXX struni _PyUnicode_AsString can fail (also in other places)! */ + 0 == strcmp(_PyUnicode_AsString(key), "_fields_")) return PyCStructUnionType_update_stgdict(self, value, 1); return 0; } @@ -741,8 +703,8 @@ UnionType_setattro(PyObject *self, PyObject *key, PyObject *value) if (-1 == PyObject_GenericSetAttr(self, key, value)) return -1; - if (PyString_Check(key) && - 0 == strcmp(PyString_AS_STRING(key), "_fields_")) + if (PyUnicode_Check(key) && + 0 == strcmp(_PyUnicode_AsString(key), "_fields_")) return PyCStructUnionType_update_stgdict(self, value, 0); return 0; } @@ -757,7 +719,7 @@ PyTypeObject PyCStructType_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -799,7 +761,7 @@ static PyTypeObject UnionType_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -972,7 +934,7 @@ PyCPointerType_set_type(PyTypeObject *self, PyObject *type) return Py_None; } -staticforward PyObject *_byref(PyObject *); +static PyObject *_byref(PyObject *); static PyObject * PyCPointerType_from_param(PyObject *type, PyObject *value) @@ -1034,7 +996,7 @@ PyTypeObject PyCPointerType_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -1082,24 +1044,12 @@ CharArray_set_raw(CDataObject *self, PyObject *value) { char *ptr; Py_ssize_t size; -#if (PY_VERSION_HEX >= 0x02060000) - Py_buffer view = { 0 }; -#endif - if (PyBuffer_Check(value)) { - size = Py_TYPE(value)->tp_as_buffer->bf_getreadbuffer(value, 0, (void *)&ptr); - if (size < 0) - goto fail; - } else { -#if (PY_VERSION_HEX >= 0x02060000) - if (PyObject_GetBuffer(value, &view, PyBUF_SIMPLE) < 0) - goto fail; - size = view.len; - ptr = view.buf; -#else - if (-1 == PyString_AsStringAndSize(value, &ptr, &size)) - goto fail; -#endif - } + Py_buffer view; + + if (PyObject_GetBuffer(value, &view, PyBUF_SIMPLE) < 0) + return -1; + size = view.len; + ptr = view.buf; if (size > self->b_size) { PyErr_SetString(PyExc_ValueError, "string too long"); @@ -1108,22 +1058,17 @@ CharArray_set_raw(CDataObject *self, PyObject *value) memcpy(self->b_ptr, ptr, size); -#if (PY_VERSION_HEX >= 0x02060000) PyBuffer_Release(&view); -#endif return 0; - fail: - -#if (PY_VERSION_HEX >= 0x02060000) + fail: PyBuffer_Release(&view); -#endif return -1; } static PyObject * CharArray_get_raw(CDataObject *self) { - return PyString_FromStringAndSize(self->b_ptr, self->b_size); + return PyBytes_FromStringAndSize(self->b_ptr, self->b_size); } static PyObject * @@ -1134,7 +1079,7 @@ CharArray_get_value(CDataObject *self) for (i = 0; i < self->b_size; ++i) if (*ptr++ == '\0') break; - return PyString_FromStringAndSize(self->b_ptr, i); + return PyBytes_FromStringAndSize(self->b_ptr, i); } static int @@ -1149,20 +1094,14 @@ CharArray_set_value(CDataObject *self, PyObject *value) return -1; } - if (PyUnicode_Check(value)) { - value = PyUnicode_AsEncodedString(value, - _ctypes_conversion_encoding, - _ctypes_conversion_errors); - if (!value) - return -1; - } else if (!PyString_Check(value)) { + if (!PyBytes_Check(value)) { PyErr_Format(PyExc_TypeError, - "string expected instead of %s instance", + "bytes expected instead of %s instance", Py_TYPE(value)->tp_name); return -1; } else Py_INCREF(value); - size = PyString_GET_SIZE(value); + size = PyBytes_GET_SIZE(value); if (size > self->b_size) { PyErr_SetString(PyExc_ValueError, "string too long"); @@ -1170,7 +1109,7 @@ CharArray_set_value(CDataObject *self, PyObject *value) return -1; } - ptr = PyString_AS_STRING(value); + ptr = PyBytes_AS_STRING(value); memcpy(self->b_ptr, ptr, size); if (size < self->b_size) self->b_ptr[size] = '\0'; @@ -1209,13 +1148,7 @@ WCharArray_set_value(CDataObject *self, PyObject *value) "can't delete attribute"); return -1; } - if (PyString_Check(value)) { - value = PyUnicode_FromEncodedObject(value, - _ctypes_conversion_encoding, - _ctypes_conversion_errors); - if (!value) - return -1; - } else if (!PyUnicode_Check(value)) { + if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", Py_TYPE(value)->tp_name); @@ -1228,7 +1161,7 @@ WCharArray_set_value(CDataObject *self, PyObject *value) result = -1; goto done; } - result = PyUnicode_AsWideChar((PyUnicodeObject *)value, + result = PyUnicode_AsWideChar(value, (wchar_t *)self->b_ptr, self->b_size/sizeof(wchar_t)); if (result >= 0 && (size_t)result < self->b_size/sizeof(wchar_t)) @@ -1323,44 +1256,57 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyTypeObject *result; StgDictObject *stgdict; StgDictObject *itemdict; - PyObject *proto; - PyObject *typedict; + PyObject *length_attr, *type_attr; long length; - + int overflow; Py_ssize_t itemsize, itemalign; char buf[32]; - typedict = PyTuple_GetItem(args, 2); - if (!typedict) + /* create the new instance (which is a class, + since we are a metatype!) */ + result = (PyTypeObject *)PyType_Type.tp_new(type, args, kwds); + if (result == NULL) return NULL; - proto = PyDict_GetItemString(typedict, "_length_"); /* Borrowed ref */ - if (!proto || !PyInt_Check(proto)) { + /* Initialize these variables to NULL so that we can simplify error + handling by using Py_XDECREF. */ + stgdict = NULL; + type_attr = NULL; + + length_attr = PyObject_GetAttrString((PyObject *)result, "_length_"); + if (!length_attr || !PyLong_Check(length_attr)) { PyErr_SetString(PyExc_AttributeError, "class must define a '_length_' attribute, " "which must be a positive integer"); - return NULL; + Py_XDECREF(length_attr); + goto error; } - length = PyInt_AS_LONG(proto); + length = PyLong_AsLongAndOverflow(length_attr, &overflow); + if (overflow) { + PyErr_SetString(PyExc_OverflowError, + "The '_length_' attribute is too large"); + Py_DECREF(length_attr); + goto error; + } + Py_DECREF(length_attr); - proto = PyDict_GetItemString(typedict, "_type_"); /* Borrowed ref */ - if (!proto) { + type_attr = PyObject_GetAttrString((PyObject *)result, "_type_"); + if (!type_attr) { PyErr_SetString(PyExc_AttributeError, "class must define a '_type_' attribute"); - return NULL; + goto error; } stgdict = (StgDictObject *)PyObject_CallObject( (PyObject *)&PyCStgDict_Type, NULL); if (!stgdict) - return NULL; + goto error; - itemdict = PyType_stgdict(proto); + itemdict = PyType_stgdict(type_attr); if (!itemdict) { PyErr_SetString(PyExc_TypeError, "_type_ must have storage info"); - Py_DECREF((PyObject *)stgdict); - return NULL; + goto error; } assert(itemdict->format); @@ -1371,16 +1317,12 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) sprintf(buf, "(%ld)", length); stgdict->format = _ctypes_alloc_format_string(buf, itemdict->format); } - if (stgdict->format == NULL) { - Py_DECREF((PyObject *)stgdict); - return NULL; - } + if (stgdict->format == NULL) + goto error; stgdict->ndim = itemdict->ndim + 1; stgdict->shape = PyMem_Malloc(sizeof(Py_ssize_t *) * stgdict->ndim); - if (stgdict->shape == NULL) { - Py_DECREF((PyObject *)stgdict); - return NULL; - } + if (stgdict->shape == NULL) + goto error; stgdict->shape[0] = length; memmove(&stgdict->shape[1], itemdict->shape, sizeof(Py_ssize_t) * (stgdict->ndim - 1)); @@ -1389,7 +1331,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (length * itemsize < 0) { PyErr_SetString(PyExc_OverflowError, "array too large"); - return NULL; + goto error; } itemalign = itemdict->align; @@ -1400,26 +1342,16 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) stgdict->size = itemsize * length; stgdict->align = itemalign; stgdict->length = length; - Py_INCREF(proto); - stgdict->proto = proto; + stgdict->proto = type_attr; stgdict->paramfunc = &PyCArrayType_paramfunc; /* Arrays are passed as pointers to function calls. */ stgdict->ffi_type_pointer = ffi_type_pointer; - /* create the new instance (which is a class, - since we are a metatype!) */ - result = (PyTypeObject *)PyType_Type.tp_new(type, args, kwds); - if (result == NULL) - return NULL; - /* replace the class dict by our updated spam dict */ - if (-1 == PyDict_Update((PyObject *)stgdict, result->tp_dict)) { - Py_DECREF(result); - Py_DECREF((PyObject *)stgdict); - return NULL; - } + if (-1 == PyDict_Update((PyObject *)stgdict, result->tp_dict)) + goto error; Py_DECREF(result->tp_dict); result->tp_dict = (PyObject *)stgdict; @@ -1428,15 +1360,20 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) */ if (itemdict->getfunc == _ctypes_get_fielddesc("c")->getfunc) { if (-1 == add_getset(result, CharArray_getsets)) - return NULL; + goto error; #ifdef CTYPES_UNICODE } else if (itemdict->getfunc == _ctypes_get_fielddesc("u")->getfunc) { if (-1 == add_getset(result, WCharArray_getsets)) - return NULL; + goto error; #endif } return (PyObject *)result; +error: + Py_XDECREF((PyObject*)stgdict); + Py_XDECREF(type_attr); + Py_DECREF(result); + return NULL; } PyTypeObject PyCArrayType_Type = { @@ -1448,7 +1385,7 @@ PyTypeObject PyCArrayType_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -1500,14 +1437,11 @@ c_wchar_p_from_param(PyObject *type, PyObject *value) { PyObject *as_parameter; int res; -#if (PYTHON_API_VERSION < 1012) -# error not supported -#endif if (value == Py_None) { Py_INCREF(Py_None); return Py_None; } - if (PyUnicode_Check(value) || PyString_Check(value)) { + if (PyUnicode_Check(value) || PyBytes_Check(value)) { PyCArgObject *parg; struct fielddesc *fd = _ctypes_get_fielddesc("Z"); @@ -1568,14 +1502,11 @@ c_char_p_from_param(PyObject *type, PyObject *value) { PyObject *as_parameter; int res; -#if (PYTHON_API_VERSION < 1012) -# error not supported -#endif if (value == Py_None) { Py_INCREF(Py_None); return Py_None; } - if (PyString_Check(value) || PyUnicode_Check(value)) { + if (PyBytes_Check(value)) { PyCArgObject *parg; struct fielddesc *fd = _ctypes_get_fielddesc("z"); @@ -1637,9 +1568,6 @@ c_void_p_from_param(PyObject *type, PyObject *value) StgDictObject *stgd; PyObject *as_parameter; int res; -#if (PYTHON_API_VERSION < 1012) -# error not supported -#endif /* None */ if (value == Py_None) { @@ -1648,7 +1576,7 @@ c_void_p_from_param(PyObject *type, PyObject *value) } /* Should probably allow buffer interface as well */ /* int, long */ - if (PyInt_Check(value) || PyLong_Check(value)) { + if (PyLong_Check(value)) { PyCArgObject *parg; struct fielddesc *fd = _ctypes_get_fielddesc("P"); @@ -1664,8 +1592,26 @@ c_void_p_from_param(PyObject *type, PyObject *value) } return (PyObject *)parg; } + /* XXX struni: remove later */ /* string */ - if (PyString_Check(value)) { + if (PyBytes_Check(value)) { + PyCArgObject *parg; + struct fielddesc *fd = _ctypes_get_fielddesc("z"); + + parg = PyCArgObject_new(); + if (parg == NULL) + return NULL; + parg->pffi_type = &ffi_type_pointer; + parg->tag = 'z'; + parg->obj = fd->setfunc(&parg->value, value, 0); + if (parg->obj == NULL) { + Py_DECREF(parg); + return NULL; + } + return (PyObject *)parg; + } +/* bytes */ + if (PyByteArray_Check(value)) { PyCArgObject *parg; struct fielddesc *fd = _ctypes_get_fielddesc("z"); @@ -1739,10 +1685,10 @@ c_void_p_from_param(PyObject *type, PyObject *value) } /* c_char_p, c_wchar_p */ stgd = PyObject_stgdict(value); - if (stgd && CDataObject_Check(value) && stgd->proto && PyString_Check(stgd->proto)) { + if (stgd && CDataObject_Check(value) && stgd->proto && PyUnicode_Check(stgd->proto)) { PyCArgObject *parg; - switch (PyString_AS_STRING(stgd->proto)[0]) { + switch (_PyUnicode_AsString(stgd->proto)[0]) { case 'z': /* c_char_p */ case 'Z': /* c_wchar_p */ parg = PyCArgObject_new(); @@ -1769,26 +1715,18 @@ c_void_p_from_param(PyObject *type, PyObject *value) "wrong type"); return NULL; } -#if (PYTHON_API_VERSION >= 1012) static PyMethodDef c_void_p_method = { "from_param", c_void_p_from_param, METH_O }; static PyMethodDef c_char_p_method = { "from_param", c_char_p_from_param, METH_O }; static PyMethodDef c_wchar_p_method = { "from_param", c_wchar_p_from_param, METH_O }; -#else -#error -static PyMethodDef c_void_p_method = { "from_param", c_void_p_from_param, METH_VARARGS }; -static PyMethodDef c_char_p_method = { "from_param", c_char_p_from_param, METH_VARARGS }; -static PyMethodDef c_wchar_p_method = { "from_param", c_wchar_p_from_param, METH_VARARGS }; - -#endif - static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject *kwds, PyObject *proto, struct fielddesc *fmt) { PyTypeObject *result; StgDictObject *stgdict; PyObject *name = PyTuple_GET_ITEM(args, 0); + PyObject *newname; PyObject *swapped_args; static PyObject *suffix; Py_ssize_t i; @@ -1799,17 +1737,17 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject if (suffix == NULL) #ifdef WORDS_BIGENDIAN - suffix = PyString_InternFromString("_le"); + suffix = PyUnicode_InternFromString("_le"); #else - suffix = PyString_InternFromString("_be"); + suffix = PyUnicode_InternFromString("_be"); #endif - Py_INCREF(name); - PyString_Concat(&name, suffix); - if (name == NULL) + newname = PyUnicode_Concat(name, suffix); + if (newname == NULL) { return NULL; + } - PyTuple_SET_ITEM(swapped_args, 0, name); + PyTuple_SET_ITEM(swapped_args, 0, newname); for (i=1; i<PyTuple_GET_SIZE(args); ++i) { PyObject *v = PyTuple_GET_ITEM(args, i); Py_INCREF(v); @@ -1860,7 +1798,7 @@ PyCSimpleType_paramfunc(CDataObject *self) dict = PyObject_stgdict((PyObject *)self); assert(dict); /* Cannot be NULL for CDataObject instances */ - fmt = PyString_AsString(dict->proto); + fmt = _PyUnicode_AsString(dict->proto); assert(fmt); fd = _ctypes_get_fielddesc(fmt); @@ -1904,9 +1842,12 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_XDECREF(result); return NULL; } - if (PyString_Check(proto)) { - proto_str = PyString_AS_STRING(proto); - proto_len = PyString_GET_SIZE(proto); + if (PyUnicode_Check(proto)) { + PyObject *v = _PyUnicode_AsDefaultEncodedString(proto, NULL); + if (!v) + goto error; + proto_str = PyBytes_AS_STRING(v); + proto_len = PyBytes_GET_SIZE(v); } else { PyErr_SetString(PyExc_TypeError, "class must define a '_type_' string attribute"); @@ -1925,11 +1866,10 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) SIMPLE_TYPE_CHARS); goto error; } - fmt = _ctypes_get_fielddesc(PyString_AS_STRING(proto)); + fmt = _ctypes_get_fielddesc(proto_str); if (fmt == NULL) { PyErr_Format(PyExc_ValueError, - "_type_ '%s' not supported", - PyString_AS_STRING(proto)); + "_type_ '%s' not supported", proto_str); goto error; } @@ -1980,7 +1920,7 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Overrides the PyCSimpleType_from_param generic method. */ if (result->tp_base == &Simple_Type) { - switch (PyString_AS_STRING(proto)[0]) { + switch (*proto_str) { case 'z': /* c_char_p */ ml = &c_char_p_method; stgdict->flags |= TYPEFLAG_ISPOINTER; @@ -2005,27 +1945,11 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } if (ml) { -#if (PYTHON_API_VERSION >= 1012) PyObject *meth; int x; meth = PyDescr_NewClassMethod(result, ml); if (!meth) return NULL; -#else -#error - PyObject *meth, *func; - int x; - func = PyCFunction_New(ml, NULL); - if (!func) - return NULL; - meth = PyObject_CallFunctionObjArgs( - (PyObject *)&PyClassMethod_Type, - func, NULL); - Py_DECREF(func); - if (!meth) { - return NULL; - } -#endif x = PyDict_SetItemString(result->tp_dict, ml->ml_name, meth); @@ -2099,7 +2023,7 @@ PyCSimpleType_from_param(PyObject *type, PyObject *value) assert(dict); /* I think we can rely on this being a one-character string */ - fmt = PyString_AsString(dict->proto); + fmt = _PyUnicode_AsString(dict->proto); assert(fmt); fd = _ctypes_get_fielddesc(fmt); @@ -2151,7 +2075,7 @@ PyTypeObject PyCSimpleType_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -2227,11 +2151,7 @@ converters_from_argtypes(PyObject *ob) Py_XDECREF(converters); Py_DECREF(ob); PyErr_Format(PyExc_TypeError, -#if (PY_VERSION_HEX < 0x02050000) - "item %d in _argtypes_ has no from_param method", -#else "item %zd in _argtypes_ has no from_param method", -#endif i+1); return NULL; } @@ -2250,12 +2170,12 @@ make_funcptrtype_dict(StgDictObject *stgdict) stgdict->ffi_type_pointer = ffi_type_pointer; ob = PyDict_GetItemString((PyObject *)stgdict, "_flags_"); - if (!ob || !PyInt_Check(ob)) { + if (!ob || !PyLong_Check(ob)) { PyErr_SetString(PyExc_TypeError, "class must define _flags_ which must be an integer"); return -1; } - stgdict->flags = PyInt_AS_LONG(ob) | TYPEFLAG_ISPOINTER; + stgdict->flags = PyLong_AS_LONG(ob) | TYPEFLAG_ISPOINTER; /* _argtypes_ is optional... */ ob = PyDict_GetItemString((PyObject *)stgdict, "_argtypes_"); @@ -2373,7 +2293,7 @@ PyTypeObject PyCFuncPtrType_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ &CDataType_as_sequence, /* tp_as_sequence */ @@ -2441,11 +2361,7 @@ unique_key(CDataObject *target, Py_ssize_t index) size_t bytes_left; assert(sizeof(string) - 1 > sizeof(Py_ssize_t) * 2); -#if (PY_VERSION_HEX < 0x02050000) - cp += sprintf(cp, "%x", index); -#else cp += sprintf(cp, "%x", Py_SAFE_DOWNCAST(index, Py_ssize_t, int)); -#endif while (target->b_base) { bytes_left = sizeof(string) - (cp - string) - 1; /* Hex format needs 2 characters per byte */ @@ -2454,14 +2370,10 @@ unique_key(CDataObject *target, Py_ssize_t index) "ctypes object structure too deep"); return NULL; } -#if (PY_VERSION_HEX < 0x02050000) - cp += sprintf(cp, ":%x", (int)target->b_index); -#else cp += sprintf(cp, ":%x", Py_SAFE_DOWNCAST(target->b_index, Py_ssize_t, int)); -#endif target = target->b_base; } - return PyString_FromStringAndSize(string, cp-string); + return PyUnicode_FromStringAndSize(string, cp-string); } /* @@ -2555,7 +2467,6 @@ static PyMemberDef PyCData_members[] = { { NULL }, }; -#if (PY_VERSION_HEX >= 0x02060000) static int PyCData_NewGetBuffer(PyObject *_self, Py_buffer *view, int flags) { CDataObject *self = (CDataObject *)_self; @@ -2584,41 +2495,16 @@ static int PyCData_NewGetBuffer(PyObject *_self, Py_buffer *view, int flags) view->internal = NULL; return 0; } -#endif - -static Py_ssize_t PyCData_GetSegcount(PyObject *_self, Py_ssize_t *lenp) -{ - if (lenp) - *lenp = 1; - return 1; -} - -static Py_ssize_t PyCData_GetBuffer(PyObject *_self, Py_ssize_t seg, void **pptr) -{ - CDataObject *self = (CDataObject *)_self; - if (seg != 0) { - /* Hm. Must this set an exception? */ - return -1; - } - *pptr = self->b_ptr; - return self->b_size; -} static PyBufferProcs PyCData_as_buffer = { - (readbufferproc)PyCData_GetBuffer, - (writebufferproc)PyCData_GetBuffer, - (segcountproc)PyCData_GetSegcount, - (charbufferproc)NULL, -#if (PY_VERSION_HEX >= 0x02060000) - (getbufferproc)PyCData_NewGetBuffer, - (releasebufferproc)NULL, -#endif + PyCData_NewGetBuffer, + NULL, }; /* * CData objects are mutable, so they cannot be hashable! */ -static long +static Py_hash_t PyCData_nohash(PyObject *self) { PyErr_SetString(PyExc_TypeError, "unhashable type"); @@ -2639,7 +2525,7 @@ PyCData_reduce(PyObject *_self, PyObject *args) _unpickle, Py_TYPE(_self), PyObject_GetAttrString(_self, "__dict__"), - PyString_FromStringAndSize(self->b_ptr, self->b_size)); + PyBytes_FromStringAndSize(self->b_ptr, self->b_size)); } static PyObject * @@ -2690,7 +2576,7 @@ PyTypeObject PyCData_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2701,7 +2587,7 @@ PyTypeObject PyCData_Type = { 0, /* tp_getattro */ 0, /* tp_setattro */ &PyCData_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ "XXX to be provided", /* tp_doc */ (traverseproc)PyCData_traverse, /* tp_traverse */ (inquiry)PyCData_clear, /* tp_clear */ @@ -3192,9 +3078,9 @@ _check_outarg_type(PyObject *arg, Py_ssize_t index) dict = PyType_stgdict(arg); if (dict /* simple pointer types, c_void_p, c_wchar_p, BSTR, ... */ - && PyString_Check(dict->proto) + && PyUnicode_Check(dict->proto) /* We only allow c_void_p, c_char_p and c_wchar_p as a simple output parameter type */ - && (strchr("PzZ", PyString_AS_STRING(dict->proto)[0]))) { + && (strchr("PzZ", _PyUnicode_AsString(dict->proto)[0]))) { return 1; } @@ -3241,7 +3127,7 @@ _validate_paramflags(PyTypeObject *type, PyObject *paramflags) char *name; PyObject *defval; PyObject *typ; - if (!PyArg_ParseTuple(item, "i|zO", &flag, &name, &defval)) { + if (!PyArg_ParseTuple(item, "i|ZO", &flag, &name, &defval)) { PyErr_SetString(PyExc_TypeError, "paramflags must be a sequence of (int [,string [,value]]) tuples"); return 0; @@ -3271,16 +3157,20 @@ static int _get_name(PyObject *obj, char **pname) { #ifdef MS_WIN32 - if (PyInt_Check(obj) || PyLong_Check(obj)) { + if (PyLong_Check(obj)) { /* We have to use MAKEINTRESOURCEA for Windows CE. Works on Windows as well, of course. */ - *pname = MAKEINTRESOURCEA(PyInt_AsUnsignedLongMask(obj) & 0xFFFF); + *pname = MAKEINTRESOURCEA(PyLong_AsUnsignedLongMask(obj) & 0xFFFF); return 1; } #endif - if (PyString_Check(obj) || PyUnicode_Check(obj)) { - *pname = PyString_AsString(obj); + if (PyBytes_Check(obj)) { + *pname = PyBytes_AS_STRING(obj); + return *pname ? 1 : 0; + } + if (PyUnicode_Check(obj)) { + *pname = _PyUnicode_AsString(obj); return *pname ? 1 : 0; } PyErr_SetString(PyExc_TypeError, @@ -3308,7 +3198,7 @@ PyCFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds) obj = PyObject_GetAttrString(dll, "_handle"); if (!obj) return NULL; - if (!PyInt_Check(obj) && !PyLong_Check(obj)) { + if (!PyLong_Check(obj)) { PyErr_SetString(PyExc_TypeError, "the _handle attribute of the second argument must be an integer"); Py_DECREF(obj); @@ -3429,13 +3319,12 @@ PyCFuncPtr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return PyCFuncPtr_FromDll(type, args, kwds); #ifdef MS_WIN32 - if (2 <= PyTuple_GET_SIZE(args) && PyInt_Check(PyTuple_GET_ITEM(args, 0))) + if (2 <= PyTuple_GET_SIZE(args) && PyLong_Check(PyTuple_GET_ITEM(args, 0))) return PyCFuncPtr_FromVtblIndex(type, args, kwds); #endif if (1 == PyTuple_GET_SIZE(args) - && (PyInt_Check(PyTuple_GET_ITEM(args, 0)) - || PyLong_Check(PyTuple_GET_ITEM(args, 0)))) { + && (PyLong_Check(PyTuple_GET_ITEM(args, 0)))) { CDataObject *ob; void *ptr = PyLong_AsVoidPtr(PyTuple_GET_ITEM(args, 0)); if (ptr == NULL && PyErr_Occurred()) @@ -3532,7 +3421,7 @@ _byref(PyObject *obj) } static PyObject * -_get_arg(int *pindex, char *name, PyObject *defval, PyObject *inargs, PyObject *kwds) +_get_arg(int *pindex, PyObject *name, PyObject *defval, PyObject *inargs, PyObject *kwds) { PyObject *v; @@ -3542,7 +3431,7 @@ _get_arg(int *pindex, char *name, PyObject *defval, PyObject *inargs, PyObject * Py_INCREF(v); return v; } - if (kwds && (v = PyDict_GetItemString(kwds, name))) { + if (kwds && (v = PyDict_GetItem(kwds, name))) { ++*pindex; Py_INCREF(v); return v; @@ -3554,7 +3443,7 @@ _get_arg(int *pindex, char *name, PyObject *defval, PyObject *inargs, PyObject * /* we can't currently emit a better error message */ if (name) PyErr_Format(PyExc_TypeError, - "required argument '%s' missing", name); + "required argument '%S' missing", name); else PyErr_Format(PyExc_TypeError, "not enough arguments"); @@ -3623,15 +3512,15 @@ _build_callargs(PyCFuncPtrObject *self, PyObject *argtypes, PyObject *item = PyTuple_GET_ITEM(paramflags, i); PyObject *ob; int flag; - char *name = NULL; + PyObject *name = NULL; PyObject *defval = NULL; /* This way seems to be ~2 us faster than the PyArg_ParseTuple calls below. */ - /* We HAVE already checked that the tuple can be parsed with "i|zO", so... */ + /* We HAVE already checked that the tuple can be parsed with "i|ZO", so... */ Py_ssize_t tsize = PyTuple_GET_SIZE(item); - flag = PyInt_AS_LONG(PyTuple_GET_ITEM(item, 0)); - name = tsize > 1 ? PyString_AS_STRING(PyTuple_GET_ITEM(item, 1)) : NULL; + flag = PyLong_AS_LONG(PyTuple_GET_ITEM(item, 0)); + name = tsize > 1 ? PyTuple_GET_ITEM(item, 1) : NULL; defval = tsize > 2 ? PyTuple_GET_ITEM(item, 2) : NULL; switch (flag & (PARAMFLAG_FIN | PARAMFLAG_FOUT | PARAMFLAG_FLCID)) { @@ -3639,7 +3528,7 @@ _build_callargs(PyCFuncPtrObject *self, PyObject *argtypes, /* ['in', 'lcid'] parameter. Always taken from defval, if given, else the integer 0. */ if (defval == NULL) { - defval = PyInt_FromLong(0); + defval = PyLong_FromLong(0); if (defval == NULL) goto error; } else @@ -3685,7 +3574,7 @@ _build_callargs(PyCFuncPtrObject *self, PyObject *argtypes, "NULL stgdict unexpected"); goto error; } - if (PyString_Check(dict->proto)) { + if (PyUnicode_Check(dict->proto)) { PyErr_Format( PyExc_TypeError, "%s 'out' parameter must be passed as default value", @@ -3729,11 +3618,7 @@ _build_callargs(PyCFuncPtrObject *self, PyObject *argtypes, message is misleading. See unittests/test_paramflags.py */ PyErr_Format(PyExc_TypeError, -#if (PY_VERSION_HEX < 0x02050000) - "call takes exactly %d arguments (%d given)", -#else "call takes exactly %d arguments (%zd given)", -#endif inargs_index, actual_args); goto error; } @@ -3983,18 +3868,18 @@ PyCFuncPtr_repr(PyCFuncPtrObject *self) { #ifdef MS_WIN32 if (self->index) - return PyString_FromFormat("<COM method offset %d: %s at %p>", + return PyUnicode_FromFormat("<COM method offset %d: %s at %p>", self->index - 0x1000, Py_TYPE(self)->tp_name, self); #endif - return PyString_FromFormat("<%s object at %p>", + return PyUnicode_FromFormat("<%s object at %p>", Py_TYPE(self)->tp_name, self); } static int -PyCFuncPtr_nonzero(PyCFuncPtrObject *self) +PyCFuncPtr_bool(PyCFuncPtrObject *self) { return ((*(void **)self->b_ptr != NULL) #ifdef MS_WIN32 @@ -4007,14 +3892,13 @@ static PyNumberMethods PyCFuncPtr_as_number = { 0, /* nb_add */ 0, /* nb_subtract */ 0, /* nb_multiply */ - 0, /* nb_divide */ 0, /* nb_remainder */ 0, /* nb_divmod */ 0, /* nb_power */ 0, /* nb_negative */ 0, /* nb_positive */ 0, /* nb_absolute */ - (inquiry)PyCFuncPtr_nonzero, /* nb_nonzero */ + (inquiry)PyCFuncPtr_bool, /* nb_bool */ }; PyTypeObject PyCFuncPtr_Type = { @@ -4026,7 +3910,7 @@ PyTypeObject PyCFuncPtr_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)PyCFuncPtr_repr, /* tp_repr */ &PyCFuncPtr_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4037,7 +3921,7 @@ PyTypeObject PyCFuncPtr_Type = { 0, /* tp_getattro */ 0, /* tp_setattro */ &PyCData_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ "Function Pointer", /* tp_doc */ (traverseproc)PyCFuncPtr_traverse, /* tp_traverse */ (inquiry)PyCFuncPtr_clear, /* tp_clear */ @@ -4071,14 +3955,14 @@ PyTypeObject PyCFuncPtr_Type = { Returns -1 on error, or the index of next argument on success. */ -static int +static Py_ssize_t _init_pos_args(PyObject *self, PyTypeObject *type, PyObject *args, PyObject *kwds, - int index) + Py_ssize_t index) { StgDictObject *dict; PyObject *fields; - int i; + Py_ssize_t i; if (PyType_stgdict((PyObject *)type->tp_base)) { index = _init_pos_args(self, type->tp_base, @@ -4108,7 +3992,7 @@ _init_pos_args(PyObject *self, PyTypeObject *type, } val = PyTuple_GET_ITEM(args, i + index); if (kwds && PyDict_GetItem(kwds, name)) { - char *field = PyString_AsString(name); + char *field = PyBytes_AsString(name); if (field == NULL) { PyErr_Clear(); field = "???"; @@ -4173,7 +4057,7 @@ static PyTypeObject Struct_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4184,7 +4068,7 @@ static PyTypeObject Struct_Type = { 0, /* tp_getattro */ 0, /* tp_setattro */ &PyCData_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ "Structure base class", /* tp_doc */ (traverseproc)PyCData_traverse, /* tp_traverse */ (inquiry)PyCData_clear, /* tp_clear */ @@ -4215,7 +4099,7 @@ static PyTypeObject Union_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4226,7 +4110,7 @@ static PyTypeObject Union_Type = { 0, /* tp_getattro */ 0, /* tp_setattro */ &PyCData_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ "Union base class", /* tp_doc */ (traverseproc)PyCData_traverse, /* tp_traverse */ (inquiry)PyCData_clear, /* tp_clear */ @@ -4301,52 +4185,6 @@ Array_item(PyObject *_self, Py_ssize_t index) } static PyObject * -Array_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh) -{ - CDataObject *self = (CDataObject *)_self; - StgDictObject *stgdict, *itemdict; - PyObject *proto; - PyListObject *np; - Py_ssize_t i, len; - - if (ilow < 0) - ilow = 0; - else if (ilow > self->b_length) - ilow = self->b_length; - if (ihigh < ilow) - ihigh = ilow; - else if (ihigh > self->b_length) - ihigh = self->b_length; - len = ihigh - ilow; - - stgdict = PyObject_stgdict((PyObject *)self); - assert(stgdict); /* Cannot be NULL for array object instances */ - proto = stgdict->proto; - itemdict = PyType_stgdict(proto); - assert(itemdict); /* proto is the item type of the array, a ctypes - type, so this cannot be NULL */ - if (itemdict->getfunc == _ctypes_get_fielddesc("c")->getfunc) { - char *ptr = (char *)self->b_ptr; - return PyString_FromStringAndSize(ptr + ilow, len); -#ifdef CTYPES_UNICODE - } else if (itemdict->getfunc == _ctypes_get_fielddesc("u")->getfunc) { - wchar_t *ptr = (wchar_t *)self->b_ptr; - return PyUnicode_FromWideChar(ptr + ilow, len); -#endif - } - - np = (PyListObject *) PyList_New(len); - if (np == NULL) - return NULL; - - for (i = 0; i < len; i++) { - PyObject *v = Array_item(_self, i+ilow); - PyList_SET_ITEM(np, i, v); - } - return (PyObject *)np; -} - -static PyObject * Array_subscript(PyObject *_self, PyObject *item) { CDataObject *self = (CDataObject *)_self; @@ -4366,7 +4204,7 @@ Array_subscript(PyObject *_self, PyObject *item) PyObject *np; Py_ssize_t start, stop, step, slicelen, cur, i; - if (PySlice_GetIndicesEx((PySliceObject *)item, + if (PySlice_GetIndicesEx(item, self->b_length, &start, &stop, &step, &slicelen) < 0) { return NULL; @@ -4384,10 +4222,10 @@ Array_subscript(PyObject *_self, PyObject *item) char *dest; if (slicelen <= 0) - return PyString_FromString(""); + return PyBytes_FromStringAndSize("", 0); if (step == 1) { - return PyString_FromStringAndSize(ptr + start, - slicelen); + return PyBytes_FromStringAndSize(ptr + start, + slicelen); } dest = (char *)PyMem_Malloc(slicelen); @@ -4399,7 +4237,7 @@ Array_subscript(PyObject *_self, PyObject *item) dest[i] = ptr[cur]; } - np = PyString_FromStringAndSize(dest, slicelen); + np = PyBytes_FromStringAndSize(dest, slicelen); PyMem_Free(dest); return np; } @@ -4478,48 +4316,6 @@ Array_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value) } static int -Array_ass_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *value) -{ - CDataObject *self = (CDataObject *)_self; - Py_ssize_t i, len; - - if (value == NULL) { - PyErr_SetString(PyExc_TypeError, - "Array does not support item deletion"); - return -1; - } - - if (ilow < 0) - ilow = 0; - else if (ilow > self->b_length) - ilow = self->b_length; - if (ihigh < 0) - ihigh = 0; - if (ihigh < ilow) - ihigh = ilow; - else if (ihigh > self->b_length) - ihigh = self->b_length; - - len = PySequence_Length(value); - if (len != ihigh - ilow) { - PyErr_SetString(PyExc_ValueError, - "Can only assign sequence of same size"); - return -1; - } - for (i = 0; i < len; i++) { - PyObject *item = PySequence_GetItem(value, i); - int result; - if (item == NULL) - return -1; - result = Array_ass_item(_self, i+ilow, item); - Py_DECREF(item); - if (result == -1) - return -1; - } - return 0; -} - -static int Array_ass_subscript(PyObject *_self, PyObject *item, PyObject *value) { CDataObject *self = (CDataObject *)_self; @@ -4542,7 +4338,7 @@ Array_ass_subscript(PyObject *_self, PyObject *item, PyObject *value) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelen, otherlen, i, cur; - if (PySlice_GetIndicesEx((PySliceObject *)item, + if (PySlice_GetIndicesEx(item, self->b_length, &start, &stop, &step, &slicelen) < 0) { return -1; @@ -4588,9 +4384,9 @@ static PySequenceMethods Array_as_sequence = { 0, /* sq_concat; */ 0, /* sq_repeat; */ Array_item, /* sq_item; */ - Array_slice, /* sq_slice; */ + 0, /* sq_slice; */ Array_ass_item, /* sq_ass_item; */ - Array_ass_slice, /* sq_ass_slice; */ + 0, /* sq_ass_slice; */ 0, /* sq_contains; */ 0, /* sq_inplace_concat; */ @@ -4612,7 +4408,7 @@ PyTypeObject PyCArray_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ &Array_as_sequence, /* tp_as_sequence */ @@ -4623,7 +4419,7 @@ PyTypeObject PyCArray_Type = { 0, /* tp_getattro */ 0, /* tp_setattro */ &PyCData_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ "XXX to be provided", /* tp_doc */ (traverseproc)PyCData_traverse, /* tp_traverse */ (inquiry)PyCData_clear, /* tp_clear */ @@ -4659,7 +4455,7 @@ PyCArrayType_from_ctype(PyObject *itemtype, Py_ssize_t length) if (cache == NULL) return NULL; } - len = PyInt_FromSsize_t(length); + len = PyLong_FromSsize_t(length); if (len == NULL) return NULL; key = PyTuple_Pack(2, itemtype, len); @@ -4688,11 +4484,7 @@ PyCArrayType_from_ctype(PyObject *itemtype, Py_ssize_t length) #endif result = PyObject_CallFunction((PyObject *)&PyCArrayType_Type, -#if (PY_VERSION_HEX < 0x02050000) - "s(O){s:i,s:O}", -#else "s(O){s:n,s:O}", -#endif name, &PyCArray_Type, "_length_", @@ -4783,7 +4575,7 @@ static PyMethodDef Simple_methods[] = { { NULL, NULL }, }; -static int Simple_nonzero(CDataObject *self) +static int Simple_bool(CDataObject *self) { return memcmp(self->b_ptr, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", self->b_size); } @@ -4792,14 +4584,13 @@ static PyNumberMethods Simple_as_number = { 0, /* nb_add */ 0, /* nb_subtract */ 0, /* nb_multiply */ - 0, /* nb_divide */ 0, /* nb_remainder */ 0, /* nb_divmod */ 0, /* nb_power */ 0, /* nb_negative */ 0, /* nb_positive */ 0, /* nb_absolute */ - (inquiry)Simple_nonzero, /* nb_nonzero */ + (inquiry)Simple_bool, /* nb_bool */ }; /* "%s(%s)" % (self.__class__.__name__, self.value) */ @@ -4810,12 +4601,12 @@ Simple_repr(CDataObject *self) static PyObject *format; if (Py_TYPE(self)->tp_base != &Simple_Type) { - return PyString_FromFormat("<%s object at %p>", + return PyUnicode_FromFormat("<%s object at %p>", Py_TYPE(self)->tp_name, self); } if (format == NULL) { - format = PyString_InternFromString("%s(%r)"); + format = PyUnicode_InternFromString("%s(%r)"); if (format == NULL) return NULL; } @@ -4824,7 +4615,7 @@ Simple_repr(CDataObject *self) if (val == NULL) return NULL; - name = PyString_FromString(Py_TYPE(self)->tp_name); + name = PyUnicode_FromString(Py_TYPE(self)->tp_name); if (name == NULL) { Py_DECREF(val); return NULL; @@ -4836,7 +4627,7 @@ Simple_repr(CDataObject *self) if (args == NULL) return NULL; - result = PyString_Format(format, args); + result = PyUnicode_Format(format, args); Py_DECREF(args); return result; } @@ -4850,7 +4641,7 @@ static PyTypeObject Simple_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)&Simple_repr, /* tp_repr */ &Simple_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4861,7 +4652,7 @@ static PyTypeObject Simple_Type = { 0, /* tp_getattro */ 0, /* tp_setattro */ &PyCData_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ "XXX to be provided", /* tp_doc */ (traverseproc)PyCData_traverse, /* tp_traverse */ (inquiry)PyCData_clear, /* tp_clear */ @@ -5051,48 +4842,6 @@ Pointer_new(PyTypeObject *type, PyObject *args, PyObject *kw) } static PyObject * -Pointer_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh) -{ - CDataObject *self = (CDataObject *)_self; - PyListObject *np; - StgDictObject *stgdict, *itemdict; - PyObject *proto; - Py_ssize_t i, len; - - if (ilow < 0) - ilow = 0; - if (ihigh < ilow) - ihigh = ilow; - len = ihigh - ilow; - - stgdict = PyObject_stgdict((PyObject *)self); - assert(stgdict); /* Cannot be NULL fr pointer instances */ - proto = stgdict->proto; - assert(proto); - itemdict = PyType_stgdict(proto); - assert(itemdict); - if (itemdict->getfunc == _ctypes_get_fielddesc("c")->getfunc) { - char *ptr = *(char **)self->b_ptr; - return PyString_FromStringAndSize(ptr + ilow, len); -#ifdef CTYPES_UNICODE - } else if (itemdict->getfunc == _ctypes_get_fielddesc("u")->getfunc) { - wchar_t *ptr = *(wchar_t **)self->b_ptr; - return PyUnicode_FromWideChar(ptr + ilow, len); -#endif - } - - np = (PyListObject *) PyList_New(len); - if (np == NULL) - return NULL; - - for (i = 0; i < len; i++) { - PyObject *v = Pointer_item(_self, i+ilow); - PyList_SET_ITEM(np, i, v); - } - return (PyObject *)np; -} - -static PyObject * Pointer_subscript(PyObject *_self, PyObject *item) { CDataObject *self = (CDataObject *)_self; @@ -5170,10 +4919,10 @@ Pointer_subscript(PyObject *_self, PyObject *item) char *dest; if (len <= 0) - return PyString_FromString(""); + return PyBytes_FromStringAndSize("", 0); if (step == 1) { - return PyString_FromStringAndSize(ptr + start, - len); + return PyBytes_FromStringAndSize(ptr + start, + len); } dest = (char *)PyMem_Malloc(len); if (dest == NULL) @@ -5181,7 +4930,7 @@ Pointer_subscript(PyObject *_self, PyObject *item) for (cur = start, i = 0; i < len; cur += step, i++) { dest[i] = ptr[cur]; } - np = PyString_FromStringAndSize(dest, len); + np = PyBytes_FromStringAndSize(dest, len); PyMem_Free(dest); return np; } @@ -5230,7 +4979,7 @@ static PySequenceMethods Pointer_as_sequence = { 0, /* binaryfunc sq_concat; */ 0, /* intargfunc sq_repeat; */ Pointer_item, /* intargfunc sq_item; */ - Pointer_slice, /* intintargfunc sq_slice; */ + 0, /* intintargfunc sq_slice; */ Pointer_ass_item, /* intobjargproc sq_ass_item; */ 0, /* intintobjargproc sq_ass_slice; */ 0, /* objobjproc sq_contains; */ @@ -5245,7 +4994,7 @@ static PyMappingMethods Pointer_as_mapping = { }; static int -Pointer_nonzero(CDataObject *self) +Pointer_bool(CDataObject *self) { return (*(void **)self->b_ptr != NULL); } @@ -5254,14 +5003,13 @@ static PyNumberMethods Pointer_as_number = { 0, /* nb_add */ 0, /* nb_subtract */ 0, /* nb_multiply */ - 0, /* nb_divide */ 0, /* nb_remainder */ 0, /* nb_divmod */ 0, /* nb_power */ 0, /* nb_negative */ 0, /* nb_positive */ 0, /* nb_absolute */ - (inquiry)Pointer_nonzero, /* nb_nonzero */ + (inquiry)Pointer_bool, /* nb_bool */ }; PyTypeObject PyCPointer_Type = { @@ -5273,7 +5021,7 @@ PyTypeObject PyCPointer_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ &Pointer_as_number, /* tp_as_number */ &Pointer_as_sequence, /* tp_as_sequence */ @@ -5284,7 +5032,7 @@ PyTypeObject PyCPointer_Type = { 0, /* tp_getattro */ 0, /* tp_setattro */ &PyCData_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ "XXX to be provided", /* tp_doc */ (traverseproc)PyCData_traverse, /* tp_traverse */ (inquiry)PyCData_clear, /* tp_clear */ @@ -5312,93 +5060,103 @@ PyTypeObject PyCPointer_Type = { * Module initialization. */ -static char *module_docs = +static const char module_docs[] = "Create and manipulate C compatible data types in Python."; #ifdef MS_WIN32 static char comerror_doc[] = "Raised when a COM method call failed."; -static PyObject * -comerror_init(PyObject *self, PyObject *args) +int +comerror_init(PyObject *self, PyObject *args, PyObject *kwds) { PyObject *hresult, *text, *details; + PyBaseExceptionObject *bself; PyObject *a; int status; - if (!PyArg_ParseTuple(args, "OOOO:COMError", &self, &hresult, &text, &details)) - return NULL; + if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds)) + return -1; + + if (!PyArg_ParseTuple(args, "OOO:COMError", &hresult, &text, &details)) + return -1; a = PySequence_GetSlice(args, 1, PySequence_Size(args)); if (!a) - return NULL; + return -1; status = PyObject_SetAttrString(self, "args", a); Py_DECREF(a); if (status < 0) - return NULL; + return -1; if (PyObject_SetAttrString(self, "hresult", hresult) < 0) - return NULL; + return -1; if (PyObject_SetAttrString(self, "text", text) < 0) - return NULL; + return -1; if (PyObject_SetAttrString(self, "details", details) < 0) - return NULL; + return -1; - Py_INCREF(Py_None); - return Py_None; + bself = (PyBaseExceptionObject *)self; + Py_DECREF(bself->args); + bself->args = args; + Py_INCREF(bself->args); + + return 0; } -static PyMethodDef comerror_methods[] = { - { "__init__", comerror_init, METH_VARARGS }, - { NULL, NULL }, +static PyTypeObject PyComError_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_ctypes.COMError", /* tp_name */ + sizeof(PyBaseExceptionObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + 0, /* 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 | Py_TPFLAGS_BASETYPE, /* tp_flags */ + PyDoc_STR(comerror_doc), /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)comerror_init, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ }; + static int create_comerror(void) { - PyObject *dict = PyDict_New(); - PyMethodDef *methods = comerror_methods; - PyObject *s; - int status; - - if (dict == NULL) + PyComError_Type.tp_base = (PyTypeObject*)PyExc_Exception; + if (PyType_Ready(&PyComError_Type) < 0) return -1; - - while (methods->ml_name) { - /* get a wrapper for the built-in function */ - PyObject *func = PyCFunction_New(methods, NULL); - PyObject *meth; - if (func == NULL) - goto error; - meth = PyMethod_New(func, NULL, ComError); - Py_DECREF(func); - if (meth == NULL) - goto error; - PyDict_SetItemString(dict, methods->ml_name, meth); - Py_DECREF(meth); - ++methods; - } - - s = PyString_FromString(comerror_doc); - if (s == NULL) - goto error; - status = PyDict_SetItemString(dict, "__doc__", s); - Py_DECREF(s); - if (status == -1) - goto error; - - ComError = PyErr_NewException("_ctypes.COMError", - NULL, - dict); - if (ComError == NULL) - goto error; - + Py_INCREF(&PyComError_Type); + ComError = (PyObject*)&PyComError_Type; return 0; - error: - Py_DECREF(dict); - return -1; } #endif @@ -5407,8 +5165,8 @@ static PyObject * string_at(const char *ptr, int size) { if (size == -1) - return PyString_FromString(ptr); - return PyString_FromStringAndSize(ptr, size); + return PyBytes_FromStringAndSize(ptr, strlen(ptr)); + return PyBytes_FromStringAndSize(ptr, size); } static int @@ -5422,8 +5180,8 @@ cast_check_pointertype(PyObject *arg) return 1; dict = PyType_stgdict(arg); if (dict) { - if (PyString_Check(dict->proto) - && (strchr("sPzUZXO", PyString_AS_STRING(dict->proto)[0]))) { + if (PyUnicode_Check(dict->proto) + && (strchr("sPzUZXO", _PyUnicode_AsString(dict->proto)[0]))) { /* simple pointer types, c_void_p, c_wchar_p, BSTR, ... */ return 1; } @@ -5498,8 +5256,21 @@ wstring_at(const wchar_t *ptr, int size) } #endif + +static struct PyModuleDef _ctypesmodule = { + PyModuleDef_HEAD_INIT, + "_ctypes", + module_docs, + -1, + _ctypes_module_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_ctypes(void) +PyInit__ctypes(void) { PyObject *m; @@ -5510,30 +5281,30 @@ init_ctypes(void) #ifdef WITH_THREAD PyEval_InitThreads(); #endif - m = Py_InitModule3("_ctypes", _ctypes_module_methods, module_docs); + m = PyModule_Create(&_ctypesmodule); if (!m) - return; + return NULL; _ctypes_ptrtype_cache = PyDict_New(); if (_ctypes_ptrtype_cache == NULL) - return; + return NULL; PyModule_AddObject(m, "_pointer_type_cache", (PyObject *)_ctypes_ptrtype_cache); _unpickle = PyObject_GetAttrString(m, "_unpickle"); if (_unpickle == NULL) - return; + return NULL; if (PyType_Ready(&PyCArg_Type) < 0) - return; + return NULL; if (PyType_Ready(&PyCThunk_Type) < 0) - return; + return NULL; /* StgDict is derived from PyDict_Type */ PyCStgDict_Type.tp_base = &PyDict_Type; if (PyType_Ready(&PyCStgDict_Type) < 0) - return; + return NULL; /************************************************* * @@ -5542,27 +5313,27 @@ init_ctypes(void) PyCStructType_Type.tp_base = &PyType_Type; if (PyType_Ready(&PyCStructType_Type) < 0) - return; + return NULL; UnionType_Type.tp_base = &PyType_Type; if (PyType_Ready(&UnionType_Type) < 0) - return; + return NULL; PyCPointerType_Type.tp_base = &PyType_Type; if (PyType_Ready(&PyCPointerType_Type) < 0) - return; + return NULL; PyCArrayType_Type.tp_base = &PyType_Type; if (PyType_Ready(&PyCArrayType_Type) < 0) - return; + return NULL; PyCSimpleType_Type.tp_base = &PyType_Type; if (PyType_Ready(&PyCSimpleType_Type) < 0) - return; + return NULL; PyCFuncPtrType_Type.tp_base = &PyType_Type; if (PyType_Ready(&PyCFuncPtrType_Type) < 0) - return; + return NULL; /************************************************* * @@ -5570,47 +5341,47 @@ init_ctypes(void) */ if (PyType_Ready(&PyCData_Type) < 0) - return; + return NULL; Py_TYPE(&Struct_Type) = &PyCStructType_Type; Struct_Type.tp_base = &PyCData_Type; if (PyType_Ready(&Struct_Type) < 0) - return; + return NULL; Py_INCREF(&Struct_Type); PyModule_AddObject(m, "Structure", (PyObject *)&Struct_Type); Py_TYPE(&Union_Type) = &UnionType_Type; Union_Type.tp_base = &PyCData_Type; if (PyType_Ready(&Union_Type) < 0) - return; + return NULL; Py_INCREF(&Union_Type); PyModule_AddObject(m, "Union", (PyObject *)&Union_Type); Py_TYPE(&PyCPointer_Type) = &PyCPointerType_Type; PyCPointer_Type.tp_base = &PyCData_Type; if (PyType_Ready(&PyCPointer_Type) < 0) - return; + return NULL; Py_INCREF(&PyCPointer_Type); PyModule_AddObject(m, "_Pointer", (PyObject *)&PyCPointer_Type); Py_TYPE(&PyCArray_Type) = &PyCArrayType_Type; PyCArray_Type.tp_base = &PyCData_Type; if (PyType_Ready(&PyCArray_Type) < 0) - return; + return NULL; Py_INCREF(&PyCArray_Type); PyModule_AddObject(m, "Array", (PyObject *)&PyCArray_Type); Py_TYPE(&Simple_Type) = &PyCSimpleType_Type; Simple_Type.tp_base = &PyCData_Type; if (PyType_Ready(&Simple_Type) < 0) - return; + return NULL; Py_INCREF(&Simple_Type); PyModule_AddObject(m, "_SimpleCData", (PyObject *)&Simple_Type); Py_TYPE(&PyCFuncPtr_Type) = &PyCFuncPtrType_Type; PyCFuncPtr_Type.tp_base = &PyCData_Type; if (PyType_Ready(&PyCFuncPtr_Type) < 0) - return; + return NULL; Py_INCREF(&PyCFuncPtr_Type); PyModule_AddObject(m, "CFuncPtr", (PyObject *)&PyCFuncPtr_Type); @@ -5621,7 +5392,7 @@ init_ctypes(void) /* PyCField_Type is derived from PyBaseObject_Type */ if (PyType_Ready(&PyCField_Type) < 0) - return; + return NULL; /************************************************* * @@ -5630,20 +5401,20 @@ init_ctypes(void) DictRemover_Type.tp_new = PyType_GenericNew; if (PyType_Ready(&DictRemover_Type) < 0) - return; + return NULL; #ifdef MS_WIN32 if (create_comerror() < 0) - return; + return NULL; PyModule_AddObject(m, "COMError", ComError); - PyModule_AddObject(m, "FUNCFLAG_HRESULT", PyInt_FromLong(FUNCFLAG_HRESULT)); - PyModule_AddObject(m, "FUNCFLAG_STDCALL", PyInt_FromLong(FUNCFLAG_STDCALL)); + PyModule_AddObject(m, "FUNCFLAG_HRESULT", PyLong_FromLong(FUNCFLAG_HRESULT)); + PyModule_AddObject(m, "FUNCFLAG_STDCALL", PyLong_FromLong(FUNCFLAG_STDCALL)); #endif - PyModule_AddObject(m, "FUNCFLAG_CDECL", PyInt_FromLong(FUNCFLAG_CDECL)); - PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyInt_FromLong(FUNCFLAG_USE_ERRNO)); - PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyInt_FromLong(FUNCFLAG_USE_LASTERROR)); - PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyInt_FromLong(FUNCFLAG_PYTHONAPI)); + PyModule_AddObject(m, "FUNCFLAG_CDECL", PyLong_FromLong(FUNCFLAG_CDECL)); + PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); + PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); + PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); PyModule_AddStringConstant(m, "__version__", "1.1.0"); PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); @@ -5666,83 +5437,17 @@ init_ctypes(void) #define RTLD_GLOBAL RTLD_LOCAL #endif - PyModule_AddObject(m, "RTLD_LOCAL", PyInt_FromLong(RTLD_LOCAL)); - PyModule_AddObject(m, "RTLD_GLOBAL", PyInt_FromLong(RTLD_GLOBAL)); + PyModule_AddObject(m, "RTLD_LOCAL", PyLong_FromLong(RTLD_LOCAL)); + PyModule_AddObject(m, "RTLD_GLOBAL", PyLong_FromLong(RTLD_GLOBAL)); PyExc_ArgError = PyErr_NewException("ctypes.ArgumentError", NULL, NULL); if (PyExc_ArgError) { Py_INCREF(PyExc_ArgError); PyModule_AddObject(m, "ArgumentError", PyExc_ArgError); } + return m; } -/***************************************************************** - * replacements for broken Python api functions (in Python 2.3). - * See #1047269 Buffer overwrite in PyUnicode_AsWideChar - */ - -#if (PY_VERSION_HEX < 0x02040000) -#ifdef HAVE_WCHAR_H - -PyObject *My_PyUnicode_FromWideChar(register const wchar_t *w, - Py_ssize_t size) -{ - PyUnicodeObject *unicode; - - if (w == NULL) { - PyErr_BadInternalCall(); - return NULL; - } - - unicode = (PyUnicodeObject *)PyUnicode_FromUnicode(NULL, size); - if (!unicode) - return NULL; - - /* Copy the wchar_t data into the new object */ -#ifdef HAVE_USABLE_WCHAR_T - memcpy(unicode->str, w, size * sizeof(wchar_t)); -#else - { - register Py_UNICODE *u; - register int i; - u = PyUnicode_AS_UNICODE(unicode); - /* In Python, the following line has a one-off error */ - for (i = size; i > 0; i--) - *u++ = *w++; - } -#endif - - return (PyObject *)unicode; -} - -Py_ssize_t My_PyUnicode_AsWideChar(PyUnicodeObject *unicode, - register wchar_t *w, - Py_ssize_t size) -{ - if (unicode == NULL) { - PyErr_BadInternalCall(); - return -1; - } - if (size > PyUnicode_GET_SIZE(unicode)) - size = PyUnicode_GET_SIZE(unicode); -#ifdef HAVE_USABLE_WCHAR_T - memcpy(w, unicode->str, size * sizeof(wchar_t)); -#else - { - register Py_UNICODE *u; - register int i; - u = PyUnicode_AS_UNICODE(unicode); - /* In Python, the following line has a one-off error */ - for (i = size; i > 0; i--) - *w++ = *u++; - } -#endif - - return size; -} -#endif -#endif - /* Local Variables: compile-command: "cd .. && python setup.py -q build -g && python setup.py -q build install --home ~" diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 27561875869..3a6845f39bb 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -1,18 +1,5 @@ -/***************************************************************** - This file should be kept compatible with Python 2.3, see PEP 291. - *****************************************************************/ - - #include <Python.h> -/* - Backwards compatibility: - Python2.2 used LONG_LONG instead of PY_LONG_LONG -*/ -#if defined(HAVE_LONG_LONG) && !defined(PY_LONG_LONG) -#define PY_LONG_LONG LONG_LONG -#endif - #ifdef MS_WIN32 #include <windows.h> #endif @@ -387,7 +374,7 @@ struct BITS { short M: 1, N: 2, O: 3, P: 4, Q: 5, R: 6, S: 7; }; -DL_EXPORT(void) set_bitfields(struct BITS *bits, char name, int value) +EXPORT(void) set_bitfields(struct BITS *bits, char name, int value) { switch (name) { case 'A': bits->A = value; break; @@ -410,7 +397,7 @@ DL_EXPORT(void) set_bitfields(struct BITS *bits, char name, int value) } } -DL_EXPORT(int) unpack_bitfields(struct BITS *bits, char name) +EXPORT(int) unpack_bitfields(struct BITS *bits, char name) { switch (name) { case 'A': return bits->A; @@ -609,8 +596,21 @@ EXPORT (HRESULT) KeepObject(IUnknown *punk) #endif -DL_EXPORT(void) -init_ctypes_test(void) + +static struct PyModuleDef _ctypes_testmodule = { + PyModuleDef_HEAD_INIT, + "_ctypes_test", + NULL, + -1, + module_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit__ctypes_test(void) { - Py_InitModule("_ctypes_test", module_methods); + return PyModule_Create(&_ctypes_testmodule); } diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index 47dbe05a515..34c46ad7a7e 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -1,9 +1,4 @@ -/***************************************************************** - This file should be kept compatible with Python 2.3, see PEP 291. - *****************************************************************/ - #include "Python.h" -#include "compile.h" /* required only for 2.3, as it seems */ #include "frameobject.h" #include <ffi.h> @@ -56,7 +51,7 @@ PyTypeObject PyCThunk_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -91,60 +86,11 @@ PrintError(char *msg, ...) va_start(marker, msg); vsnprintf(buf, sizeof(buf), msg, marker); va_end(marker); - if (f) + if (f != NULL && f != Py_None) PyFile_WriteString(buf, f); PyErr_Print(); } -#if (PY_VERSION_HEX < 0x02070000) -PyCodeObject * -PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) -{ - static PyObject *emptystring = NULL; - static PyObject *nulltuple = NULL; - PyObject *filename_ob = NULL; - PyObject *funcname_ob = NULL; - PyCodeObject *result = NULL; - if (emptystring == NULL) { - emptystring = PyString_FromString(""); - if (emptystring == NULL) - goto failed; - } - if (nulltuple == NULL) { - nulltuple = PyTuple_New(0); - if (nulltuple == NULL) - goto failed; - } - funcname_ob = PyString_FromString(funcname); - if (funcname_ob == NULL) - goto failed; - filename_ob = PyString_FromString(filename); - if (filename_ob == NULL) - goto failed; - - result = PyCode_New(0, /* argcount */ - 0, /* nlocals */ - 0, /* stacksize */ - 0, /* flags */ - emptystring, /* code */ - nulltuple, /* consts */ - nulltuple, /* names */ - nulltuple, /* varnames */ - nulltuple, /* freevars */ - nulltuple, /* cellvars */ - filename_ob, /* filename */ - funcname_ob, /* name */ - firstlineno, /* firstlineno */ - emptystring /* lnotab */ - ); - -failed: - Py_XDECREF(funcname_ob); - Py_XDECREF(filename_ob); - return result; -} -#endif - /* after code that pyrex generates */ void _ctypes_add_traceback(char *funcname, char *filename, int lineno) @@ -352,8 +298,9 @@ if (x == NULL) _ctypes_add_traceback(what, "_ctypes/callbacks.c", __LINE__ - 1), else if (keep == Py_None) /* Nothing to keep */ Py_DECREF(keep); else if (setfunc != _ctypes_get_fielddesc("O")->setfunc) { - if (-1 == PyErr_Warn(PyExc_RuntimeWarning, - "memory leak in callback function.")) + if (-1 == PyErr_WarnEx(PyExc_RuntimeWarning, + "memory leak in callback function.", + 1)) PyErr_WriteUnraisable(callable); } } @@ -421,10 +368,10 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, if (p == NULL) return NULL; - assert(CThunk_CheckExact(p)); + assert(CThunk_CheckExact((PyObject *)p)); p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure), - &p->pcl_exec); + &p->pcl_exec); if (p->pcl_write == NULL) { PyErr_NoMemory(); goto error; @@ -515,7 +462,7 @@ long Call_GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) static PyObject *context; if (context == NULL) - context = PyString_InternFromString("_ctypes.DllGetClassObject"); + context = PyUnicode_InternFromString("_ctypes.DllGetClassObject"); mod = PyImport_ImportModuleNoBlock("ctypes"); if (!mod) { @@ -558,7 +505,7 @@ long Call_GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) return E_FAIL; } - retval = PyInt_AsLong(result); + retval = PyLong_AsLong(result); if (PyErr_Occurred()) { PyErr_WriteUnraisable(context ? context : Py_None); retval = E_FAIL; @@ -594,7 +541,7 @@ long Call_CanUnloadNow(void) static PyObject *context; if (context == NULL) - context = PyString_InternFromString("_ctypes.DllCanUnloadNow"); + context = PyUnicode_InternFromString("_ctypes.DllCanUnloadNow"); mod = PyImport_ImportModuleNoBlock("ctypes"); if (!mod) { @@ -619,7 +566,7 @@ long Call_CanUnloadNow(void) return E_FAIL; } - retval = PyInt_AsLong(result); + retval = PyLong_AsLong(result); if (PyErr_Occurred()) { PyErr_WriteUnraisable(context ? context : Py_None); retval = E_FAIL; diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 23825a7110d..ef14e910814 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1,8 +1,3 @@ -/***************************************************************** - This file should be kept compatible with Python 2.3, see PEP 291. - *****************************************************************/ - - /* * History: First version dated from 3/97, derived from my SCMLIB version * for win16. @@ -83,12 +78,15 @@ #define DONT_USE_SEH #endif +#define CTYPES_CAPSULE_NAME_PYMEM "_ctypes pymem" -#define CTYPES_CAPSULE_ERROROBJ "_ctypes/callproc.c error object" -CTYPES_CAPSULE_INSTANTIATE_DESTRUCTOR(CTYPES_CAPSULE_ERROROBJ) - -#define CTYPES_CAPSULE_WCHAR_T "_ctypes/callproc.c wchar_t buffer from unicode" -CTYPES_CAPSULE_INSTANTIATE_DESTRUCTOR(CTYPES_CAPSULE_WCHAR_T) +static void pymem_destructor(PyObject *ptr) +{ + void *p = PyCapsule_GetPointer(ptr, CTYPES_CAPSULE_NAME_PYMEM); + if (p) { + PyMem_Free(p); + } +} /* ctypes maintains thread-local storage that has space for two error numbers: @@ -136,19 +134,17 @@ _ctypes_get_errobj(int **pspace) return NULL; } if (error_object_name == NULL) { - error_object_name = PyString_InternFromString("ctypes.error_object"); + error_object_name = PyUnicode_InternFromString("ctypes.error_object"); if (error_object_name == NULL) return NULL; } errobj = PyDict_GetItem(dict, error_object_name); if (errobj) { -#ifdef CTYPES_USING_CAPSULE - if (!PyCapsule_IsValid(errobj, CTYPES_CAPSULE_ERROROBJ)) { + if (!PyCapsule_IsValid(errobj, CTYPES_CAPSULE_NAME_PYMEM)) { PyErr_SetString(PyExc_RuntimeError, "ctypes.error_object is an invalid capsule"); return NULL; } -#endif /* CTYPES_USING_CAPSULE */ Py_INCREF(errobj); } else { @@ -156,7 +152,7 @@ _ctypes_get_errobj(int **pspace) if (space == NULL) return NULL; memset(space, 0, sizeof(int) * 2); - errobj = CAPSULE_NEW(space, CTYPES_CAPSULE_ERROROBJ); + errobj = PyCapsule_New(space, CTYPES_CAPSULE_NAME_PYMEM, pymem_destructor); if (errobj == NULL) return NULL; if (-1 == PyDict_SetItem(dict, error_object_name, @@ -165,7 +161,7 @@ _ctypes_get_errobj(int **pspace) return NULL; } } - *pspace = (int *)CAPSULE_DEREFERENCE(errobj, CTYPES_CAPSULE_ERROROBJ); + *pspace = (int *)PyCapsule_GetPointer(errobj, CTYPES_CAPSULE_NAME_PYMEM); return errobj; } @@ -178,7 +174,7 @@ get_error_internal(PyObject *self, PyObject *args, int index) if (errobj == NULL) return NULL; - result = PyInt_FromLong(space[index]); + result = PyLong_FromLong(space[index]); Py_DECREF(errobj); return result; } @@ -198,7 +194,7 @@ set_error_internal(PyObject *self, PyObject *args, int index) old_errno = space[index]; space[index] = new_errno; Py_DECREF(errobj); - return PyInt_FromLong(old_errno); + return PyLong_FromLong(old_errno); } static PyObject * @@ -229,21 +225,21 @@ set_last_error(PyObject *self, PyObject *args) PyObject *ComError; -static TCHAR *FormatError(DWORD code) +static WCHAR *FormatError(DWORD code) { - TCHAR *lpMsgBuf; + WCHAR *lpMsgBuf; DWORD n; - n = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - code, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ - (LPTSTR) &lpMsgBuf, - 0, - NULL); + n = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + code, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ + (LPWSTR) &lpMsgBuf, + 0, + NULL); if (n) { - while (_istspace(lpMsgBuf[n-1])) + while (iswspace(lpMsgBuf[n-1])) --n; - lpMsgBuf[n] = _T('\0'); /* rstrip() */ + lpMsgBuf[n] = L'\0'; /* rstrip() */ } return lpMsgBuf; } @@ -413,7 +409,7 @@ check_hresult(PyObject *self, PyObject *args) return NULL; if (FAILED(hr)) return PyErr_SetFromWindowsErr(hr); - return PyInt_FromLong(hr); + return PyLong_FromLong(hr); } #endif @@ -509,7 +505,7 @@ PyCArg_repr(PyCArgObject *self) self->tag, self); break; } - return PyString_FromString(buffer); + return PyUnicode_FromString(buffer); } static PyMemberDef PyCArgType_members[] = { @@ -528,7 +524,7 @@ PyTypeObject PyCArg_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)PyCArg_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -637,12 +633,6 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa) return 0; } - if (PyInt_Check(obj)) { - pa->ffi_type = &ffi_type_sint; - pa->value.i = PyInt_AS_LONG(obj); - return 0; - } - if (PyLong_Check(obj)) { pa->ffi_type = &ffi_type_sint; pa->value.i = (long)PyLong_AsUnsignedLong(obj); @@ -658,9 +648,9 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa) return 0; } - if (PyString_Check(obj)) { + if (PyBytes_Check(obj)) { pa->ffi_type = &ffi_type_pointer; - pa->value.p = PyString_AS_STRING(obj); + pa->value.p = PyBytes_AsString(obj); Py_INCREF(obj); pa->keep = obj; return 0; @@ -668,31 +658,22 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa) #ifdef CTYPES_UNICODE if (PyUnicode_Check(obj)) { -#ifdef HAVE_USABLE_WCHAR_T +#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T pa->ffi_type = &ffi_type_pointer; pa->value.p = PyUnicode_AS_UNICODE(obj); Py_INCREF(obj); pa->keep = obj; return 0; #else - int size = PyUnicode_GET_SIZE(obj); pa->ffi_type = &ffi_type_pointer; - size += 1; /* terminating NUL */ - size *= sizeof(wchar_t); - pa->value.p = PyMem_Malloc(size); - if (!pa->value.p) { - PyErr_NoMemory(); + pa->value.p = PyUnicode_AsWideCharString(obj, NULL); + if (pa->value.p == NULL) return -1; - } - memset(pa->value.p, 0, size); - pa->keep = CAPSULE_NEW(pa->value.p, CTYPES_CAPSULE_WCHAR_T); + pa->keep = PyCapsule_New(pa->value.p, CTYPES_CAPSULE_NAME_PYMEM, pymem_destructor); if (!pa->keep) { PyMem_Free(pa->value.p); return -1; } - if (-1 == PyUnicode_AsWideChar((PyUnicodeObject *)obj, - pa->value.p, PyUnicode_GET_SIZE(obj))) - return -1; return 0; #endif } @@ -907,7 +888,7 @@ static PyObject *GetResult(PyObject *restype, void *result, PyObject *checker) PyObject *retval, *v; if (restype == NULL) - return PyInt_FromLong(*(int *)result); + return PyLong_FromLong(*(int *)result); if (restype == Py_None) { Py_INCREF(Py_None); @@ -950,7 +931,7 @@ void _ctypes_extend_error(PyObject *exc_class, char *fmt, ...) PyObject *tp, *v, *tb, *s, *cls_str, *msg_str; va_start(vargs, fmt); - s = PyString_FromFormatV(fmt, vargs); + s = PyUnicode_FromFormatV(fmt, vargs); va_end(vargs); if (!s) return; @@ -959,18 +940,18 @@ void _ctypes_extend_error(PyObject *exc_class, char *fmt, ...) PyErr_NormalizeException(&tp, &v, &tb); cls_str = PyObject_Str(tp); if (cls_str) { - PyString_ConcatAndDel(&s, cls_str); - PyString_ConcatAndDel(&s, PyString_FromString(": ")); + PyUnicode_AppendAndDel(&s, cls_str); + PyUnicode_AppendAndDel(&s, PyUnicode_FromString(": ")); if (s == NULL) goto error; } else PyErr_Clear(); msg_str = PyObject_Str(v); if (msg_str) - PyString_ConcatAndDel(&s, msg_str); + PyUnicode_AppendAndDel(&s, msg_str); else { PyErr_Clear(); - PyString_ConcatAndDel(&s, PyString_FromString("???")); + PyUnicode_AppendAndDel(&s, PyUnicode_FromString("???")); if (s == NULL) goto error; } @@ -996,7 +977,7 @@ GetComError(HRESULT errcode, GUID *riid, IUnknown *pIunk) DWORD helpcontext=0; LPOLESTR progid; PyObject *obj; - TCHAR *text; + LPOLESTR text; /* We absolutely have to release the GIL during COM method calls, otherwise we may get a deadlock! @@ -1036,11 +1017,7 @@ GetComError(HRESULT errcode, GUID *riid, IUnknown *pIunk) text = FormatError(errcode); obj = Py_BuildValue( -#ifdef _UNICODE "iu(uuuiu)", -#else - "is(uuuiu)", -#endif errcode, text, descr, source, helpfile, helpcontext, @@ -1161,7 +1138,7 @@ PyObject *_ctypes_callproc(PPROC pProc, } for (i = 0; i < argcount; ++i) { atypes[i] = args[i].ffi_type; - if (atypes[i]->type == FFI_TYPE_STRUCT + if (atypes[i]->type == FFI_TYPE_STRUCT #ifdef _WIN64 && atypes[i]->size <= sizeof(void *) #endif @@ -1200,12 +1177,12 @@ PyObject *_ctypes_callproc(PPROC pProc, if (*(int *)resbuf & 0x80000000) retval = GetComError(*(HRESULT *)resbuf, iid, pIunk); else - retval = PyInt_FromLong(*(int *)resbuf); + retval = PyLong_FromLong(*(int *)resbuf); } else if (flags & FUNCFLAG_HRESULT) { if (*(int *)resbuf & 0x80000000) retval = PyErr_SetFromWindowsErr(*(int *)resbuf); else - retval = PyInt_FromLong(*(int *)resbuf); + retval = PyLong_FromLong(*(int *)resbuf); } else #endif retval = GetResult(restype, resbuf, checker); @@ -1226,15 +1203,6 @@ _parse_voidp(PyObject *obj, void **address) #ifdef MS_WIN32 -#ifdef _UNICODE -# define PYBUILD_TSTR "u" -#else -# define PYBUILD_TSTR "s" -# ifndef _T -# define _T(text) text -# endif -#endif - static char format_error_doc[] = "FormatError([integer]) -> string\n\ \n\ @@ -1243,7 +1211,7 @@ given, the return value of a call to GetLastError() is used.\n"; static PyObject *format_error(PyObject *self, PyObject *args) { PyObject *result; - TCHAR *lpMsgBuf; + wchar_t *lpMsgBuf; DWORD code = 0; if (!PyArg_ParseTuple(args, "|i:FormatError", &code)) return NULL; @@ -1251,10 +1219,10 @@ static PyObject *format_error(PyObject *self, PyObject *args) code = GetLastError(); lpMsgBuf = FormatError(code); if (lpMsgBuf) { - result = Py_BuildValue(PYBUILD_TSTR, lpMsgBuf); + result = PyUnicode_FromWideChar(lpMsgBuf, wcslen(lpMsgBuf)); LocalFree(lpMsgBuf); } else { - result = Py_BuildValue("s", "<no description>"); + result = PyUnicode_FromString("<no description>"); } return result; } @@ -1267,34 +1235,18 @@ The handle may be used to locate exported functions in this\n\ module.\n"; static PyObject *load_library(PyObject *self, PyObject *args) { - TCHAR *name; + WCHAR *name; PyObject *nameobj; PyObject *ignored; HMODULE hMod; if (!PyArg_ParseTuple(args, "O|O:LoadLibrary", &nameobj, &ignored)) return NULL; -#ifdef _UNICODE - name = alloca((PyString_Size(nameobj) + 1) * sizeof(WCHAR)); - if (!name) { - PyErr_NoMemory(); - return NULL; - } - { - int r; - char *aname = PyString_AsString(nameobj); - if(!aname) - return NULL; - r = MultiByteToWideChar(CP_ACP, 0, aname, -1, name, PyString_Size(nameobj) + 1); - name[r] = 0; - } -#else - name = PyString_AsString(nameobj); - if(!name) + name = PyUnicode_AsUnicode(nameobj); + if (!name) return NULL; -#endif - hMod = LoadLibrary(name); + hMod = LoadLibraryW(name); if (!hMod) return PyErr_SetFromWindowsErr(GetLastError()); #ifdef _WIN64 @@ -1394,12 +1346,12 @@ copy_com_pointer(PyObject *self, PyObject *args) pdst = (IUnknown **)b.value.p; if (pdst == NULL) - r = PyInt_FromLong(E_POINTER); + r = PyLong_FromLong(E_POINTER); else { if (src) src->lpVtbl->AddRef(src); *pdst = src; - r = PyInt_FromLong(S_OK); + r = PyLong_FromLong(S_OK); } done: Py_XDECREF(a.keep); @@ -1410,7 +1362,8 @@ copy_com_pointer(PyObject *self, PyObject *args) static PyObject *py_dl_open(PyObject *self, PyObject *args) { - char *name; + PyObject *name, *name2; + char *name_str; void * handle; #ifdef RTLD_LOCAL int mode = RTLD_NOW | RTLD_LOCAL; @@ -1418,10 +1371,22 @@ static PyObject *py_dl_open(PyObject *self, PyObject *args) /* cygwin doesn't define RTLD_LOCAL */ int mode = RTLD_NOW; #endif - if (!PyArg_ParseTuple(args, "z|i:dlopen", &name, &mode)) + if (!PyArg_ParseTuple(args, "O|i:dlopen", &name, &mode)) return NULL; mode |= RTLD_NOW; - handle = ctypes_dlopen(name, mode); + if (name != Py_None) { + if (PyUnicode_FSConverter(name, &name2) == 0) + return NULL; + if (PyBytes_Check(name2)) + name_str = PyBytes_AS_STRING(name2); + else + name_str = PyByteArray_AS_STRING(name2); + } else { + name_str = NULL; + name2 = NULL; + } + handle = ctypes_dlopen(name_str, mode); + Py_XDECREF(name2); if (!handle) { char *errmsg = ctypes_dlerror(); if (!errmsg) @@ -1544,10 +1509,10 @@ sizeof_func(PyObject *self, PyObject *obj) dict = PyType_stgdict(obj); if (dict) - return PyInt_FromSsize_t(dict->size); + return PyLong_FromSsize_t(dict->size); if (CDataObject_Check(obj)) - return PyInt_FromSsize_t(((CDataObject *)obj)->b_size); + return PyLong_FromSsize_t(((CDataObject *)obj)->b_size); PyErr_SetString(PyExc_TypeError, "this type has no size"); return NULL; @@ -1565,11 +1530,11 @@ align_func(PyObject *self, PyObject *obj) dict = PyType_stgdict(obj); if (dict) - return PyInt_FromSsize_t(dict->align); + return PyLong_FromSsize_t(dict->align); dict = PyObject_stgdict(obj); if (dict) - return PyInt_FromSsize_t(dict->align); + return PyLong_FromSsize_t(dict->align); PyErr_SetString(PyExc_TypeError, "no alignment info"); @@ -1667,37 +1632,6 @@ My_Py_DECREF(PyObject *self, PyObject *arg) return arg; } -#ifdef CTYPES_UNICODE - -static char set_conversion_mode_doc[] = -"set_conversion_mode(encoding, errors) -> (previous-encoding, previous-errors)\n\ -\n\ -Set the encoding and error handling ctypes uses when converting\n\ -between unicode and strings. Returns the previous values.\n"; - -static PyObject * -set_conversion_mode(PyObject *self, PyObject *args) -{ - char *coding, *mode; - PyObject *result; - - if (!PyArg_ParseTuple(args, "zs:set_conversion_mode", &coding, &mode)) - return NULL; - result = Py_BuildValue("(zz)", _ctypes_conversion_encoding, _ctypes_conversion_errors); - if (coding) { - PyMem_Free(_ctypes_conversion_encoding); - _ctypes_conversion_encoding = PyMem_Malloc(strlen(coding) + 1); - strcpy(_ctypes_conversion_encoding, coding); - } else { - _ctypes_conversion_encoding = NULL; - } - PyMem_Free(_ctypes_conversion_errors); - _ctypes_conversion_errors = PyMem_Malloc(strlen(mode) + 1); - strcpy(_ctypes_conversion_errors, mode); - return result; -} -#endif - static PyObject * resize(PyObject *self, PyObject *args) { @@ -1706,11 +1640,7 @@ resize(PyObject *self, PyObject *args) Py_ssize_t size; if (!PyArg_ParseTuple(args, -#if (PY_VERSION_HEX < 0x02050000) - "Oi:resize", -#else "On:resize", -#endif &obj, &size)) return NULL; @@ -1722,11 +1652,7 @@ resize(PyObject *self, PyObject *args) } if (size < dict->size) { PyErr_Format(PyExc_ValueError, -#if PY_VERSION_HEX < 0x02050000 - "minimum size is %d", -#else "minimum size is %zd", -#endif dict->size); return NULL; } @@ -1797,9 +1723,10 @@ POINTER(PyObject *self, PyObject *cls) Py_INCREF(result); return result; } - if (PyString_CheckExact(cls)) { - buf = alloca(strlen(PyString_AS_STRING(cls)) + 3 + 1); - sprintf(buf, "LP_%s", PyString_AS_STRING(cls)); + if (PyUnicode_CheckExact(cls)) { + char *name = _PyUnicode_AsString(cls); + buf = alloca(strlen(name) + 3 + 1); + sprintf(buf, "LP_%s", name); result = PyObject_CallFunction((PyObject *)Py_TYPE(&PyCPointer_Type), "s(O){}", buf, @@ -1883,12 +1810,8 @@ PyMethodDef _ctypes_module_methods[] = { {"POINTER", POINTER, METH_O }, {"pointer", pointer, METH_O }, {"_unpickle", unpickle, METH_VARARGS }, - {"_buffer_info", buffer_info, METH_O, - "Return buffer interface information (for testing only)"}, + {"buffer_info", buffer_info, METH_O, "Return buffer interface information"}, {"resize", resize, METH_VARARGS, "Resize the memory buffer of a ctypes instance"}, -#ifdef CTYPES_UNICODE - {"set_conversion_mode", set_conversion_mode, METH_VARARGS, set_conversion_mode_doc}, -#endif #ifdef MS_WIN32 {"get_last_error", get_last_error, METH_NOARGS}, {"set_last_error", set_last_error, METH_VARARGS}, diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 5e0fc759ff1..9da890dbdc5 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1,7 +1,3 @@ -/***************************************************************** - This file should be kept compatible with Python 2.3, see PEP 291. - *****************************************************************/ - #include "Python.h" #include <ffi.h> @@ -11,8 +7,17 @@ #include "ctypes.h" -#define CTYPES_CAPSULE_WCHAR_T "_ctypes/cfield.c wchar_t buffer from unicode" -CTYPES_CAPSULE_INSTANTIATE_DESTRUCTOR(CTYPES_CAPSULE_WCHAR_T) +#define CTYPES_CFIELD_CAPSULE_NAME_PYMEM "_ctypes/cfield.c pymem" + +#if Py_UNICODE_SIZE != SIZEOF_WCHAR_T +static void pymem_destructor(PyObject *ptr) +{ + void *p = PyCapsule_GetPointer(ptr, CTYPES_CFIELD_CAPSULE_NAME_PYMEM); + if (p) { + PyMem_Free(p); + } +} +#endif /******************************************************************/ @@ -232,13 +237,13 @@ PyCField_get(CFieldObject *self, PyObject *inst, PyTypeObject *type) static PyObject * PyCField_get_offset(PyObject *self, void *data) { - return PyInt_FromSsize_t(((CFieldObject *)self)->offset); + return PyLong_FromSsize_t(((CFieldObject *)self)->offset); } static PyObject * PyCField_get_size(PyObject *self, void *data) { - return PyInt_FromSsize_t(((CFieldObject *)self)->size); + return PyLong_FromSsize_t(((CFieldObject *)self)->size); } static PyGetSetDef PyCField_getset[] = { @@ -279,20 +284,12 @@ PyCField_repr(CFieldObject *self) name = ((PyTypeObject *)self->proto)->tp_name; if (bits) - result = PyString_FromFormat( -#if (PY_VERSION_HEX < 0x02050000) - "<Field type=%s, ofs=%d:%d, bits=%d>", -#else + result = PyUnicode_FromFormat( "<Field type=%s, ofs=%zd:%zd, bits=%zd>", -#endif name, self->offset, size, bits); else - result = PyString_FromFormat( -#if (PY_VERSION_HEX < 0x02050000) - "<Field type=%s, ofs=%d, size=%d>", -#else + result = PyUnicode_FromFormat( "<Field type=%s, ofs=%zd, size=%zd>", -#endif name, self->offset, size); return result; } @@ -306,7 +303,7 @@ PyTypeObject PyCField_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)PyCField_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -353,12 +350,13 @@ static int get_long(PyObject *v, long *p) { long x; + if (PyFloat_Check(v)) { PyErr_SetString(PyExc_TypeError, "int expected instead of float"); return -1; } - x = PyInt_AsUnsignedLongMask(v); + x = PyLong_AsUnsignedLongMask(v); if (x == -1 && PyErr_Occurred()) return -1; *p = x; @@ -371,12 +369,13 @@ static int get_ulong(PyObject *v, unsigned long *p) { unsigned long x; + if (PyFloat_Check(v)) { PyErr_SetString(PyExc_TypeError, "int expected instead of float"); return -1; } - x = PyInt_AsUnsignedLongMask(v); + x = PyLong_AsUnsignedLongMask(v); if (x == (unsigned long)-1 && PyErr_Occurred()) return -1; *p = x; @@ -396,7 +395,7 @@ get_longlong(PyObject *v, PY_LONG_LONG *p) "int expected instead of float"); return -1; } - x = PyInt_AsUnsignedLongLongMask(v); + x = PyLong_AsUnsignedLongLongMask(v); if (x == -1 && PyErr_Occurred()) return -1; *p = x; @@ -414,7 +413,7 @@ get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p) "int expected instead of float"); return -1; } - x = PyInt_AsUnsignedLongLongMask(v); + x = PyLong_AsUnsignedLongLongMask(v); if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) return -1; *p = x; @@ -529,7 +528,7 @@ b_get(void *ptr, Py_ssize_t size) { signed char val = *(signed char *)ptr; GET_BITFIELD(val, size); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * @@ -548,7 +547,7 @@ B_get(void *ptr, Py_ssize_t size) { unsigned char val = *(unsigned char *)ptr; GET_BITFIELD(val, size); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * @@ -586,7 +585,7 @@ h_get(void *ptr, Py_ssize_t size) short val; memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); - return PyInt_FromLong((long)val); + return PyLong_FromLong((long)val); } static PyObject * @@ -596,7 +595,7 @@ h_get_sw(void *ptr, Py_ssize_t size) memcpy(&val, ptr, sizeof(val)); val = SWAP_2(val); GET_BITFIELD(val, size); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * @@ -634,7 +633,7 @@ H_get(void *ptr, Py_ssize_t size) unsigned short val; memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * @@ -644,7 +643,7 @@ H_get_sw(void *ptr, Py_ssize_t size) memcpy(&val, ptr, sizeof(val)); val = SWAP_2(val); GET_BITFIELD(val, size); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * @@ -682,7 +681,7 @@ i_get(void *ptr, Py_ssize_t size) int val; memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * @@ -692,7 +691,7 @@ i_get_sw(void *ptr, Py_ssize_t size) memcpy(&val, ptr, sizeof(val)); val = SWAP_INT(val); GET_BITFIELD(val, size); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } #ifdef MS_WIN32 @@ -830,7 +829,7 @@ l_get(void *ptr, Py_ssize_t size) long val; memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * @@ -840,7 +839,7 @@ l_get_sw(void *ptr, Py_ssize_t size) memcpy(&val, ptr, sizeof(val)); val = SWAP_LONG(val); GET_BITFIELD(val, size); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * @@ -1146,20 +1145,33 @@ O_set(void *ptr, PyObject *value, Py_ssize_t size) static PyObject * c_set(void *ptr, PyObject *value, Py_ssize_t size) { - if (!PyString_Check(value) || (1 != PyString_Size(value))) { - PyErr_Format(PyExc_TypeError, - "one character string expected"); - return NULL; + if (PyBytes_Check(value) && PyBytes_GET_SIZE(value) == 1) { + *(char *)ptr = PyBytes_AS_STRING(value)[0]; + _RET(value); } - *(char *)ptr = PyString_AS_STRING(value)[0]; - _RET(value); + if (PyByteArray_Check(value) && PyByteArray_GET_SIZE(value) == 1) { + *(char *)ptr = PyByteArray_AS_STRING(value)[0]; + _RET(value); + } + if (PyLong_Check(value)) + { + long longval = PyLong_AS_LONG(value); + if (longval < 0 || longval >= 256) + goto error; + *(char *)ptr = (char)longval; + _RET(value); + } + error: + PyErr_Format(PyExc_TypeError, + "one character string expected"); + return NULL; } static PyObject * c_get(void *ptr, Py_ssize_t size) { - return PyString_FromStringAndSize((char *)ptr, 1); + return PyBytes_FromStringAndSize((char *)ptr, 1); } #ifdef CTYPES_UNICODE @@ -1168,14 +1180,8 @@ static PyObject * u_set(void *ptr, PyObject *value, Py_ssize_t size) { Py_ssize_t len; - - if (PyString_Check(value)) { - value = PyUnicode_FromEncodedObject(value, - _ctypes_conversion_encoding, - _ctypes_conversion_errors); - if (!value) - return NULL; - } else if (!PyUnicode_Check(value)) { + wchar_t chars[2]; + if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", value->ob_type->tp_name); @@ -1183,7 +1189,7 @@ u_set(void *ptr, PyObject *value, Py_ssize_t size) } else Py_INCREF(value); - len = PyUnicode_GET_SIZE(value); + len = PyUnicode_AsWideChar(value, chars, 2); if (len != 1) { Py_DECREF(value); PyErr_SetString(PyExc_TypeError, @@ -1191,7 +1197,7 @@ u_set(void *ptr, PyObject *value, Py_ssize_t size) return NULL; } - *(wchar_t *)ptr = PyUnicode_AS_UNICODE(value)[0]; + *(wchar_t *)ptr = chars[0]; Py_DECREF(value); _RET(value); @@ -1244,13 +1250,7 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length) /* It's easier to calculate in characters than in bytes */ length /= sizeof(wchar_t); - if (PyString_Check(value)) { - value = PyUnicode_FromEncodedObject(value, - _ctypes_conversion_encoding, - _ctypes_conversion_errors); - if (!value) - return NULL; - } else if (!PyUnicode_Check(value)) { + if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", value->ob_type->tp_name); @@ -1260,18 +1260,14 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length) size = PyUnicode_GET_SIZE(value); if (size > length) { PyErr_Format(PyExc_ValueError, -#if (PY_VERSION_HEX < 0x02050000) - "string too long (%d, maximum length %d)", -#else "string too long (%zd, maximum length %zd)", -#endif size, length); Py_DECREF(value); return NULL; } else if (size < length-1) /* copy terminating NUL character if there is space */ size += 1; - PyUnicode_AsWideChar((PyUnicodeObject *)value, (wchar_t *)ptr, size); + PyUnicode_AsWideChar(value, (wchar_t *)ptr, size); return value; } @@ -1280,24 +1276,16 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length) static PyObject * s_get(void *ptr, Py_ssize_t size) { - PyObject *result; - size_t slen; + Py_ssize_t i; + char *p; - result = PyString_FromString((char *)ptr); - if (!result) - return NULL; - /* chop off at the first NUL character, if any. - * On error, result will be deallocated and set to NULL. - */ - slen = strlen(PyString_AS_STRING(result)); - size = min(size, (Py_ssize_t)slen); - if (result->ob_refcnt == 1) { - /* shorten the result */ - _PyString_Resize(&result, size); - return result; - } else - /* cannot shorten the result */ - return PyString_FromStringAndSize(ptr, size); + p = (char *)ptr; + for (i = 0; i < size; ++i) { + if (*p++ == '\0') + break; + } + + return PyBytes_FromStringAndSize((char *)ptr, (Py_ssize_t)i); } static PyObject * @@ -1306,10 +1294,19 @@ s_set(void *ptr, PyObject *value, Py_ssize_t length) char *data; Py_ssize_t size; - data = PyString_AsString(value); + if(PyBytes_Check(value)) { + Py_INCREF(value); + } else { + PyErr_Format(PyExc_TypeError, + "expected string, %s found", + value->ob_type->tp_name); + return NULL; + } + + data = PyBytes_AS_STRING(value); if (!data) return NULL; - size = strlen(data); + size = strlen(data); /* XXX Why not Py_SIZE(value)? */ if (size < length) { /* This will copy the leading NUL character * if there is space for it. @@ -1317,16 +1314,15 @@ s_set(void *ptr, PyObject *value, Py_ssize_t length) ++size; } else if (size > length) { PyErr_Format(PyExc_ValueError, -#if (PY_VERSION_HEX < 0x02050000) - "string too long (%d, maximum length %d)", -#else "string too long (%zd, maximum length %zd)", -#endif size, length); + Py_DECREF(value); return NULL; } /* Also copy the terminating NUL character if there is space */ memcpy((char *)ptr, data, size); + + Py_DECREF(value); _RET(value); } @@ -1338,28 +1334,20 @@ z_set(void *ptr, PyObject *value, Py_ssize_t size) Py_INCREF(value); return value; } - if (PyString_Check(value)) { - *(char **)ptr = PyString_AS_STRING(value); + if (PyBytes_Check(value)) { + *(char **)ptr = PyBytes_AsString(value); Py_INCREF(value); return value; - } else if (PyUnicode_Check(value)) { - PyObject *str = PyUnicode_AsEncodedString(value, - _ctypes_conversion_encoding, - _ctypes_conversion_errors); - if (str == NULL) - return NULL; - *(char **)ptr = PyString_AS_STRING(str); - return str; - } else if (PyInt_Check(value) || PyLong_Check(value)) { + } else if (PyLong_Check(value)) { #if SIZEOF_VOID_P == SIZEOF_LONG_LONG - *(char **)ptr = (char *)PyInt_AsUnsignedLongLongMask(value); + *(char **)ptr = (char *)PyLong_AsUnsignedLongLongMask(value); #else - *(char **)ptr = (char *)PyInt_AsUnsignedLongMask(value); + *(char **)ptr = (char *)PyLong_AsUnsignedLongMask(value); #endif _RET(value); } PyErr_Format(PyExc_TypeError, - "string or integer address expected instead of %s instance", + "bytes or integer address expected instead of %s instance", value->ob_type->tp_name); return NULL; } @@ -1377,7 +1365,8 @@ z_get(void *ptr, Py_ssize_t size) return NULL; } #endif - return PyString_FromString(*(char **)ptr); + return PyBytes_FromStringAndSize(*(char **)ptr, + strlen(*(char **)ptr)); } else { Py_INCREF(Py_None); return Py_None; @@ -1393,33 +1382,27 @@ Z_set(void *ptr, PyObject *value, Py_ssize_t size) Py_INCREF(value); return value; } - if (PyString_Check(value)) { - value = PyUnicode_FromEncodedObject(value, - _ctypes_conversion_encoding, - _ctypes_conversion_errors); - if (!value) - return NULL; - } else if (PyInt_Check(value) || PyLong_Check(value)) { + if (PyLong_Check(value) || PyLong_Check(value)) { #if SIZEOF_VOID_P == SIZEOF_LONG_LONG - *(wchar_t **)ptr = (wchar_t *)PyInt_AsUnsignedLongLongMask(value); + *(wchar_t **)ptr = (wchar_t *)PyLong_AsUnsignedLongLongMask(value); #else - *(wchar_t **)ptr = (wchar_t *)PyInt_AsUnsignedLongMask(value); + *(wchar_t **)ptr = (wchar_t *)PyLong_AsUnsignedLongMask(value); #endif Py_INCREF(Py_None); return Py_None; - } else if (!PyUnicode_Check(value)) { + } + if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string or integer address expected instead of %s instance", value->ob_type->tp_name); return NULL; } else Py_INCREF(value); -#ifdef HAVE_USABLE_WCHAR_T - /* HAVE_USABLE_WCHAR_T means that Py_UNICODE and wchar_t is the same - type. So we can copy directly. Hm, are unicode objects always NUL +#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T + /* We can copy directly. Hm, are unicode objects always NUL terminated in Python, internally? */ - *(wchar_t **)ptr = PyUnicode_AS_UNICODE(value); + *(wchar_t **)ptr = (wchar_t *) PyUnicode_AS_UNICODE(value); return value; #else { @@ -1428,28 +1411,18 @@ Z_set(void *ptr, PyObject *value, Py_ssize_t size) PyObject *keep; wchar_t *buffer; - int size = PyUnicode_GET_SIZE(value); - size += 1; /* terminating NUL */ - size *= sizeof(wchar_t); - buffer = (wchar_t *)PyMem_Malloc(size); + buffer = PyUnicode_AsWideCharString(value, NULL); if (!buffer) { Py_DECREF(value); - return PyErr_NoMemory(); + return NULL; } - memset(buffer, 0, size); - keep = CAPSULE_NEW(buffer, CTYPES_CAPSULE_WCHAR_T); + keep = PyCapsule_New(buffer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM, pymem_destructor); if (!keep) { Py_DECREF(value); PyMem_Free(buffer); return NULL; } *(wchar_t **)ptr = (wchar_t *)buffer; - if (-1 == PyUnicode_AsWideChar((PyUnicodeObject *)value, - buffer, PyUnicode_GET_SIZE(value))) { - Py_DECREF(value); - Py_DECREF(keep); - return NULL; - } Py_DECREF(value); return keep; } @@ -1487,12 +1460,6 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size) /* convert value into a PyUnicodeObject or NULL */ if (Py_None == value) { value = NULL; - } else if (PyString_Check(value)) { - value = PyUnicode_FromEncodedObject(value, - _ctypes_conversion_encoding, - _ctypes_conversion_errors); - if (!value) - return NULL; } else if (PyUnicode_Check(value)) { Py_INCREF(value); /* for the descref below */ } else { @@ -1553,21 +1520,21 @@ P_set(void *ptr, PyObject *value, Py_ssize_t size) _RET(value); } - if (!PyInt_Check(value) && !PyLong_Check(value)) { + if (!PyLong_Check(value) && !PyLong_Check(value)) { PyErr_SetString(PyExc_TypeError, "cannot be converted to pointer"); return NULL; } #if SIZEOF_VOID_P <= SIZEOF_LONG - v = (void *)PyInt_AsUnsignedLongMask(value); + v = (void *)PyLong_AsUnsignedLongMask(value); #else #ifndef HAVE_LONG_LONG # error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long" #elif SIZEOF_LONG_LONG < SIZEOF_VOID_P # error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)" #endif - v = (void *)PyInt_AsUnsignedLongLongMask(value); + v = (void *)PyLong_AsUnsignedLongLongMask(value); #endif if (PyErr_Occurred()) @@ -1650,7 +1617,7 @@ static struct fielddesc formattable[] = { */ struct fielddesc * -_ctypes_get_fielddesc(char *fmt) +_ctypes_get_fielddesc(const char *fmt) { static int initialized = 0; struct fielddesc *table = formattable; diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index 141b34b0419..5237ac23d6d 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -1,36 +1,7 @@ -/***************************************************************** - This file should be kept compatible with Python 2.3, see PEP 291. - *****************************************************************/ - #if defined (__SVR4) && defined (__sun) # include <alloca.h> #endif -#if (PY_VERSION_HEX < 0x02040000) -#define PyDict_CheckExact(ob) (Py_TYPE(ob) == &PyDict_Type) -#endif - -#if (PY_VERSION_HEX < 0x02050000) -typedef int Py_ssize_t; -#define PyInt_FromSsize_t PyInt_FromLong -#define PyNumber_AsSsize_t(ob, exc) PyInt_AsLong(ob) -#define PyIndex_Check(ob) PyInt_Check(ob) -typedef Py_ssize_t (*readbufferproc)(PyObject *, Py_ssize_t, void **); -typedef Py_ssize_t (*writebufferproc)(PyObject *, Py_ssize_t, void **); -typedef Py_ssize_t (*segcountproc)(PyObject *, Py_ssize_t *); -typedef Py_ssize_t (*charbufferproc)(PyObject *, Py_ssize_t, char **); -#endif - -#if (PY_VERSION_HEX < 0x02060000) -#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) -#define PyVarObject_HEAD_INIT(type, size) \ - PyObject_HEAD_INIT(type) size, -#define PyImport_ImportModuleNoBlock PyImport_ImportModule -#define PyLong_FromSsize_t PyInt_FromLong -#define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif - - #ifndef MS_WIN32 #define max(a, b) ((a) > (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b)) @@ -40,14 +11,6 @@ typedef Py_ssize_t (*charbufferproc)(PyObject *, Py_ssize_t, char **); #define PARAMFLAG_FLCID 0x4 #endif -/* - Backwards compatibility: - Python2.2 used LONG_LONG instead of PY_LONG_LONG -*/ -#if defined(HAVE_LONG_LONG) && !defined(PY_LONG_LONG) -#define PY_LONG_LONG LONG_LONG -#endif - typedef struct tagPyCArgObject PyCArgObject; typedef struct tagCDataObject CDataObject; typedef PyObject *(* GETFUNC)(void *, Py_ssize_t size); @@ -160,7 +123,7 @@ extern PyTypeObject PyCSimpleType_Type; #define PyCSimpleTypeObject_Check(v) PyObject_TypeCheck(v, &PyCSimpleType_Type) extern PyTypeObject PyCField_Type; -extern struct fielddesc *_ctypes_get_fielddesc(char *fmt); +extern struct fielddesc *_ctypes_get_fielddesc(const char *fmt); extern PyObject * @@ -382,53 +345,13 @@ extern PyObject *PyExc_ArgError; extern char *_ctypes_conversion_encoding; extern char *_ctypes_conversion_errors; -/* Python 2.4 macros, which are not available in Python 2.3 */ - -#ifndef Py_CLEAR -#define Py_CLEAR(op) \ - do { \ - if (op) { \ - PyObject *tmp = (PyObject *)(op); \ - (op) = NULL; \ - Py_DECREF(tmp); \ - } \ - } while (0) -#endif - -#ifndef Py_VISIT -/* Utility macro to help write tp_traverse functions. - * To use this macro, the tp_traverse function must name its arguments - * "visit" and "arg". This is intended to keep tp_traverse functions - * looking as much alike as possible. - */ -#define Py_VISIT(op) \ - do { \ - if (op) { \ - int vret = visit((op), arg); \ - if (vret) \ - return vret; \ - } \ - } while (0) -#endif - -/* Python's PyUnicode_*WideChar functions are broken ... */ -#if defined(Py_USING_UNICODE) && defined(HAVE_WCHAR_H) +#if defined(HAVE_WCHAR_H) # define CTYPES_UNICODE #endif -#if (PY_VERSION_HEX < 0x02040000) -#ifdef CTYPES_UNICODE -# undef PyUnicode_FromWideChar -# define PyUnicode_FromWideChar PyUnicode_FromWideChar_fixed - -# undef PyUnicode_AsWideChar -# define PyUnicode_AsWideChar PyUnicode_AsWideChar_fixed - -extern PyObject *PyUnicode_FromWideChar_fixed(const wchar_t *, Py_ssize_t); -extern Py_ssize_t PyUnicode_AsWideChar_fixed(PyUnicodeObject *, wchar_t *, Py_ssize_t); -#endif -#endif +extern void _ctypes_free_closure(void *); +extern void *_ctypes_alloc_closure(void); extern void _ctypes_add_traceback(char *, char *, int); @@ -444,40 +367,6 @@ PyObject *_ctypes_get_errobj(int **pspace); extern PyObject *ComError; #endif -#if PY_VERSION_HEX >= 0x020700A4 -/* Use PyCapsule for 2.7 */ - -#define CTYPES_USING_CAPSULE - -#define CTYPES_CAPSULE_INSTANTIATE_DESTRUCTOR(name) \ -static void capsule_destructor_ ## name(PyObject *ptr) \ -{ \ - void *p = PyCapsule_GetPointer(ptr, name); \ - if (p) { \ - PyMem_Free(p); \ - } \ -} \ - -#define CAPSULE_NEW(pointer, name) \ - (PyCapsule_New(pointer, name, capsule_destructor_ ## name)) - -#define CAPSULE_DEREFERENCE(capsule, name) \ - (PyCapsule_GetPointer(capsule, name)) - -#else /* PY_VERSION_HEX >= 0x020700A4 */ -/* Use CObject for 2.6 and before */ - -#define CTYPES_CAPSULE_INSTANTIATE_DESTRUCTOR(name) - -#define CAPSULE_NEW(pointer, name) \ - (PyCObject_FromVoidPtr(pointer, PyMem_Free)) - -#define CAPSULE_DEREFERENCE(capsule, name) \ - (PyCObject_AsVoidPtr(capsule)) - -#endif /* PY_VERSION_HEX >= 0x020700A4 */ - - /* Local Variables: compile-command: "python setup.py -q build install --home ~" diff --git a/Modules/_ctypes/libffi_msvc/ffi.c b/Modules/_ctypes/libffi_msvc/ffi.c index fb2e45efde1..6e595e9fe74 100644 --- a/Modules/_ctypes/libffi_msvc/ffi.c +++ b/Modules/_ctypes/libffi_msvc/ffi.c @@ -110,7 +110,7 @@ void ffi_prep_args(char *stack, extended_cif *ecif) argp += z; } - if (argp - stack > ecif->cif->bytes) + if (argp >= stack && (unsigned)(argp - stack) > ecif->cif->bytes) { Py_FatalError("FFI BUG: not enough stack space for arguments"); } diff --git a/Modules/_ctypes/malloc_closure.c b/Modules/_ctypes/malloc_closure.c index b98d43b6d05..248c6a67022 100644 --- a/Modules/_ctypes/malloc_closure.c +++ b/Modules/_ctypes/malloc_closure.c @@ -1,7 +1,3 @@ -/***************************************************************** - This file should be kept compatible with Python 2.3, see PEP 291. - *****************************************************************/ - #include <Python.h> #include <ffi.h> #ifdef MS_WIN32 diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c index 773233fe6ff..262d0b4897a 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -1,7 +1,3 @@ -/***************************************************************** - This file should be kept compatible with Python 2.3, see PEP 291. - *****************************************************************/ - #include "Python.h" #include <ffi.h> #ifdef MS_WIN32 @@ -115,7 +111,7 @@ PyTypeObject PyCStgDict_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -157,8 +153,6 @@ PyType_stgdict(PyObject *obj) if (!PyType_Check(obj)) return NULL; type = (PyTypeObject *)obj; - if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_CLASS)) - return NULL; if (!type->tp_dict || !PyCStgDict_CheckExact(type->tp_dict)) return NULL; return (StgDictObject *)type->tp_dict; @@ -173,8 +167,6 @@ StgDictObject * PyObject_stgdict(PyObject *self) { PyTypeObject *type = self->ob_type; - if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_CLASS)) - return NULL; if (!type->tp_dict || !PyCStgDict_CheckExact(type->tp_dict)) return NULL; return (StgDictObject *)type->tp_dict; @@ -343,7 +335,7 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct isPacked = PyObject_GetAttrString(type, "_pack_"); if (isPacked) { - pack = PyInt_AsLong(isPacked); + pack = PyLong_AsLong(isPacked); if (pack < 0 || PyErr_Occurred()) { Py_XDECREF(isPacked); PyErr_SetString(PyExc_ValueError, @@ -444,11 +436,7 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct if (dict == NULL) { Py_DECREF(pair); PyErr_Format(PyExc_TypeError, -#if (PY_VERSION_HEX < 0x02050000) - "second item in _fields_ tuple (index %d) must be a C type", -#else "second item in _fields_ tuple (index %zd) must be a C type", -#endif i); return -1; } @@ -492,7 +480,7 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct bitsize = 0; if (isStruct && !isPacked) { char *fieldfmt = dict->format ? dict->format : "B"; - char *fieldname = PyString_AsString(name); + char *fieldname = _PyUnicode_AsString(name); char *ptr; Py_ssize_t len; char *buf; diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c index 04a0a28a885..8561a2e70c2 100644 --- a/Modules/_curses_panel.c +++ b/Modules/_curses_panel.c @@ -332,12 +332,6 @@ static PyMethodDef PyCursesPanel_Methods[] = { {NULL, NULL} /* sentinel */ }; -static PyObject * -PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) -{ - return Py_FindMethod(PyCursesPanel_Methods, (PyObject *)self, name); -} - /* -------------------------------------------------------*/ PyTypeObject PyCursesPanel_Type = { @@ -348,14 +342,28 @@ PyTypeObject PyCursesPanel_Type = { /* methods */ (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)PyCursesPanel_GetAttr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - 0, /*tp_compare*/ + 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*/ + PyCursesPanel_Methods, /*tp_methods*/ }; /* Wrapper for panel_above(NULL). This function returns the bottom @@ -454,20 +462,34 @@ static PyMethodDef PyCurses_methods[] = { /* Initialization function for the module */ + +static struct PyModuleDef _curses_panelmodule = { + PyModuleDef_HEAD_INIT, + "_curses_panel", + NULL, + -1, + PyCurses_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_curses_panel(void) +PyInit__curses_panel(void) { PyObject *m, *d, *v; /* Initialize object type */ - Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; + if (PyType_Ready(&PyCursesPanel_Type) < 0) + return NULL; import_curses(); /* Create the module and add the functions */ - m = Py_InitModule("_curses_panel", PyCurses_methods); + m = PyModule_Create(&_curses_panelmodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); /* For exception _curses_panel.error */ @@ -475,8 +497,9 @@ init_curses_panel(void) PyDict_SetItemString(d, "error", PyCursesError); /* Make the version available */ - v = PyString_FromString(PyCursesVersion); + v = PyUnicode_FromString(PyCursesVersion); PyDict_SetItemString(d, "version", v); PyDict_SetItemString(d, "__version__", v); Py_DECREF(v); + return m; } diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 5f26c7fa81b..5e1afa9894a 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -100,8 +100,11 @@ char *PyCursesVersion = "2.2"; /* Includes */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" + #ifdef __osf__ #define STRICT_SYSV_CURSES /* Don't use ncurses extensions */ #endif @@ -194,11 +197,18 @@ PyCursesCheckERR(int code, char *fname) static int PyCurses_ConvertToChtype(PyObject *obj, chtype *ch) { - if (PyInt_Check(obj)) { - *ch = (chtype) PyInt_AsLong(obj); - } else if(PyString_Check(obj) - && (PyString_Size(obj) == 1)) { - *ch = (chtype) *PyString_AsString(obj); + if (PyLong_CheckExact(obj)) { + int overflow; + /* XXX should the truncation by the cast also be reported + as an error? */ + *ch = (chtype) PyLong_AsLongAndOverflow(obj, &overflow); + if (overflow) + return 0; + } else if(PyBytes_Check(obj) + && (PyBytes_Size(obj) == 1)) { + *ch = (chtype) *PyBytes_AsString(obj); + } else if (PyUnicode_Check(obj) && PyUnicode_GetSize(obj) == 1) { + *ch = (chtype) *PyUnicode_AS_UNICODE(obj); } else { return 0; } @@ -824,14 +834,14 @@ PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args) if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x)) return NULL; - return PyInt_FromLong( wenclose(self->win,y,x) ); + return PyLong_FromLong( wenclose(self->win,y,x) ); } #endif static PyObject * PyCursesWindow_GetBkgd(PyCursesWindowObject *self) { - return PyInt_FromLong((long) getbkgd(self->win)); + return PyLong_FromLong((long) getbkgd(self->win)); } static PyObject * @@ -857,7 +867,7 @@ PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args) PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments"); return NULL; } - return PyInt_FromLong((long)rtn); + return PyLong_FromLong((long)rtn); } static PyObject * @@ -888,7 +898,7 @@ PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args) PyErr_SetString(PyCursesError, "no input"); return NULL; } else if (rtn<=255) { - return Py_BuildValue("c", rtn); + return Py_BuildValue("C", rtn); } else { const char *knp; #if defined(__NetBSD__) @@ -896,7 +906,7 @@ PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args) #else knp = keyname(rtn); #endif - return PyString_FromString((knp == NULL) ? "" : knp); + return PyUnicode_FromString((knp == NULL) ? "" : knp); } } @@ -951,7 +961,7 @@ PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args) } if (rtn2 == ERR) rtn[0] = 0; - return PyString_FromString(rtn); + return PyBytes_FromString(rtn); } static PyObject * @@ -1068,7 +1078,7 @@ PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args) PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments"); return NULL; } - return PyInt_FromLong((long) rtn); + return PyLong_FromLong((long) rtn); } static PyObject * @@ -1103,7 +1113,7 @@ PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args) } if (rtn2 == ERR) rtn[0] = 0; - return PyString_FromString(rtn); + return PyBytes_FromString(rtn); } static PyObject * @@ -1346,18 +1356,45 @@ PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args) } static PyObject * -PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *args) +PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream) { - PyObject *temp; - - if (!PyArg_ParseTuple(args, "O;fileobj", &temp)) - return NULL; - if (!PyFile_Check(temp)) { - PyErr_SetString(PyExc_TypeError, "argument must be a file object"); - return NULL; - } - return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)), - "putwin"); + /* We have to simulate this by writing to a temporary FILE*, + then reading back, then writing to the argument stream. */ + char fn[100]; + int fd; + FILE *fp; + PyObject *res; + + strcpy(fn, "/tmp/py.curses.putwin.XXXXXX"); + fd = mkstemp(fn); + if (fd < 0) + return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn); + fp = fdopen(fd, "wb+"); + if (fp == NULL) { + close(fd); + remove(fn); + return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn); + } + res = PyCursesCheckERR(putwin(self->win, fp), "putwin"); + if (res == NULL) { + fclose(fp); + remove(fn); + return res; + } + fseek(fp, 0, 0); + while (1) { + char buf[BUFSIZ]; + Py_ssize_t n = fread(buf, 1, BUFSIZ, fp); + if (n <= 0) + break; + Py_DECREF(res); + res = PyObject_CallMethod(stream, "write", "y#", buf, n); + if (res == NULL) + break; + } + fclose(fp); + remove(fn); + return res; } static PyObject * @@ -1601,7 +1638,7 @@ static PyMethodDef PyCursesWindow_Methods[] = { {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS}, {"overwrite", (PyCFunction)PyCursesWindow_Overwrite, METH_VARARGS}, - {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_VARARGS}, + {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O}, {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS}, {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS}, {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS}, @@ -1626,12 +1663,6 @@ static PyMethodDef PyCursesWindow_Methods[] = { {NULL, NULL} /* sentinel */ }; -static PyObject * -PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name) -{ - return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name); -} - /* -------------------------------------------------------*/ PyTypeObject PyCursesWindow_Type = { @@ -1642,14 +1673,28 @@ PyTypeObject PyCursesWindow_Type = { /* methods */ (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - 0, /*tp_compare*/ + (getattrfunc)0, /*tp_getattr*/ + (setattrfunc)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*/ + PyCursesWindow_Methods, /*tp_methods*/ }; /********************************************************************* @@ -1728,7 +1773,7 @@ PyCurses_color_pair(PyObject *self, PyObject *args) PyCursesInitialisedColor; if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL; - return PyInt_FromLong((long) (n << 8)); + return PyLong_FromLong((long) (n << 8)); } static PyObject * @@ -1743,7 +1788,7 @@ PyCurses_Curs_Set(PyObject *self, PyObject *args) erg = curs_set(vis); if (erg == ERR) return PyCursesCheckERR(erg, "curs_set"); - return PyInt_FromLong((long) erg); + return PyLong_FromLong((long) erg); } static PyObject * @@ -1767,7 +1812,7 @@ PyCurses_EraseChar(PyObject *self) ch = erasechar(); - return PyString_FromStringAndSize(&ch, 1); + return PyBytes_FromStringAndSize(&ch, 1); } static PyObject * @@ -1820,24 +1865,58 @@ PyCurses_UngetMouse(PyObject *self, PyObject *args) #endif static PyObject * -PyCurses_GetWin(PyCursesWindowObject *self, PyObject *temp) +PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream) { + char fn[100]; + int fd; + FILE *fp; + PyObject *data; + size_t datalen; WINDOW *win; PyCursesInitialised; - if (!PyFile_Check(temp)) { - PyErr_SetString(PyExc_TypeError, "argument must be a file object"); - return NULL; - } - - win = getwin(PyFile_AsFile(temp)); - + strcpy(fn, "/tmp/py.curses.getwin.XXXXXX"); + fd = mkstemp(fn); + if (fd < 0) + return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn); + fp = fdopen(fd, "wb+"); + if (fp == NULL) { + close(fd); + remove(fn); + return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn); + } + data = PyObject_CallMethod(stream, "read", ""); + if (data == NULL) { + fclose(fp); + remove(fn); + return NULL; + } + if (!PyBytes_Check(data)) { + PyErr_Format(PyExc_TypeError, + "f.read() returned %.100s instead of bytes", + data->ob_type->tp_name); + Py_DECREF(data); + fclose(fp); + remove(fn); + return NULL; + } + datalen = PyBytes_GET_SIZE(data); + if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) { + Py_DECREF(data); + fclose(fp); + remove(fn); + return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn); + } + Py_DECREF(data); + fseek(fp, 0, 0); + win = getwin(fp); + fclose(fp); + remove(fn); if (win == NULL) { PyErr_SetString(PyCursesError, catchall_NULL); return NULL; } - return PyCursesWindow_New(win); } @@ -1935,7 +2014,7 @@ PyCurses_InitScr(PyObject *self) where they're not defined until you've called initscr() */ #define SetDictInt(string,ch) \ do { \ - PyObject *o = PyInt_FromLong((long) (ch)); \ + PyObject *o = PyLong_FromLong((long) (ch)); \ if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \ Py_DECREF(o); \ } \ @@ -2033,7 +2112,7 @@ PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds) sys_stdout = PySys_GetObject("stdout"); - if (sys_stdout == NULL) { + if (sys_stdout == NULL || sys_stdout == Py_None) { PyErr_SetString( PyCursesError, "lost sys.stdout"); @@ -2125,7 +2204,7 @@ PyCurses_KeyName(PyObject *self, PyObject *args) } knp = keyname(ch); - return PyString_FromString((knp == NULL) ? "" : (char *)knp); + return PyBytes_FromString((knp == NULL) ? "" : (char *)knp); } #endif @@ -2136,7 +2215,7 @@ PyCurses_KillChar(PyObject *self) ch = killchar(); - return PyString_FromStringAndSize(&ch, 1); + return PyBytes_FromStringAndSize(&ch, 1); } static PyObject * @@ -2292,7 +2371,7 @@ PyCurses_pair_number(PyObject *self, PyObject *args) return NULL; } - return PyInt_FromLong((long) ((n & A_COLOR) >> 8)); + return PyLong_FromLong((long) ((n & A_COLOR) >> 8)); } static PyObject * @@ -2300,7 +2379,8 @@ PyCurses_Putp(PyObject *self, PyObject *args) { char *str; - if (!PyArg_ParseTuple(args,"s;str", &str)) return NULL; + if (!PyArg_ParseTuple(args,"y;str", &str)) + return NULL; return PyCursesCheckERR(putp(str), "putp"); } @@ -2340,7 +2420,7 @@ update_lines_cols(void) if (!m) return 0; - o = PyInt_FromLong(LINES); + o = PyLong_FromLong(LINES); if (!o) { Py_DECREF(m); return 0; @@ -2356,7 +2436,7 @@ update_lines_cols(void) return 0; } Py_DECREF(o); - o = PyInt_FromLong(COLS); + o = PyLong_FromLong(COLS); if (!o) { Py_DECREF(m); return 0; @@ -2454,10 +2534,10 @@ PyCurses_Start_Color(PyObject *self) code = start_color(); if (code != ERR) { initialisedcolors = TRUE; - c = PyInt_FromLong((long) COLORS); + c = PyLong_FromLong((long) COLORS); PyDict_SetItemString(ModDict, "COLORS", c); Py_DECREF(c); - cp = PyInt_FromLong((long) COLOR_PAIRS); + cp = PyLong_FromLong((long) COLOR_PAIRS); PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp); Py_DECREF(cp); Py_INCREF(Py_None); @@ -2478,7 +2558,7 @@ PyCurses_tigetflag(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "s", &capname)) return NULL; - return PyInt_FromLong( (long) tigetflag( capname ) ); + return PyLong_FromLong( (long) tigetflag( capname ) ); } static PyObject * @@ -2491,7 +2571,7 @@ PyCurses_tigetnum(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "s", &capname)) return NULL; - return PyInt_FromLong( (long) tigetnum( capname ) ); + return PyLong_FromLong( (long) tigetnum( capname ) ); } static PyObject * @@ -2509,7 +2589,7 @@ PyCurses_tigetstr(PyObject *self, PyObject *args) Py_INCREF(Py_None); return Py_None; } - return PyString_FromString( capname ); + return PyBytes_FromString( capname ); } static PyObject * @@ -2521,7 +2601,7 @@ PyCurses_tparm(PyObject *self, PyObject *args) PyCursesSetupTermCalled; - if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm", + if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm", &fmt, &i1, &i2, &i3, &i4, &i5, &i6, &i7, &i8, &i9)) { return NULL; @@ -2533,7 +2613,7 @@ PyCurses_tparm(PyObject *self, PyObject *args) return NULL; } - return PyString_FromString(result); + return PyBytes_FromString(result); } static PyObject * @@ -2558,33 +2638,25 @@ PyCurses_UnCtrl(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL; - if (PyInt_Check(temp)) - ch = (chtype) PyInt_AsLong(temp); - else if (PyString_Check(temp)) - ch = (chtype) *PyString_AsString(temp); - else { + if (!PyCurses_ConvertToChtype(temp, &ch)) { PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int"); return NULL; } - return PyString_FromString(unctrl(ch)); + return PyBytes_FromString(unctrl(ch)); } static PyObject * PyCurses_UngetCh(PyObject *self, PyObject *args) { PyObject *temp; - int ch; + chtype ch; PyCursesInitialised; if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL; - if (PyInt_Check(temp)) - ch = (int) PyInt_AsLong(temp); - else if (PyString_Check(temp)) - ch = (int) *PyString_AsString(temp); - else { + if (!PyCurses_ConvertToChtype(temp, &ch)) { PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int"); return NULL; } @@ -2728,14 +2800,28 @@ static PyMethodDef PyCurses_methods[] = { /* Initialization function for the module */ + +static struct PyModuleDef _cursesmodule = { + PyModuleDef_HEAD_INIT, + "_curses", + NULL, + -1, + PyCurses_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_curses(void) +PyInit__curses(void) { PyObject *m, *d, *v, *c_api_object; static void *PyCurses_API[PyCurses_API_pointers]; /* Initialize object type */ - Py_TYPE(&PyCursesWindow_Type) = &PyType_Type; + if (PyType_Ready(&PyCursesWindow_Type) < 0) + return NULL; /* Initialize the C API pointer array */ PyCurses_API[0] = (void *)&PyCursesWindow_Type; @@ -2744,14 +2830,14 @@ init_curses(void) PyCurses_API[3] = (void *)func_PyCursesInitialisedColor; /* Create the module and add the functions */ - m = Py_InitModule("_curses", PyCurses_methods); + m = PyModule_Create(&_cursesmodule); if (m == NULL) - return; + return NULL; /* Add some symbolic constants to the module */ d = PyModule_GetDict(m); if (d == NULL) - return; + return NULL; ModDict = d; /* For PyCurses_InitScr to use later */ /* Add a capsule for the C API */ @@ -2764,7 +2850,7 @@ init_curses(void) PyDict_SetItemString(d, "error", PyCursesError); /* Make the version available */ - v = PyString_FromString(PyCursesVersion); + v = PyBytes_FromString(PyCursesVersion); PyDict_SetItemString(d, "version", v); PyDict_SetItemString(d, "__version__", v); Py_DECREF(v); @@ -2889,4 +2975,5 @@ init_curses(void) SetDictInt("KEY_MIN", KEY_MIN); SetDictInt("KEY_MAX", KEY_MAX); } + return m; } diff --git a/Modules/datetimemodule.c b/Modules/_datetimemodule.c index f733fa1900f..ef2f7b306a0 100644 --- a/Modules/datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -2,15 +2,12 @@ * http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage */ -#define PY_SSIZE_T_CLEAN - #include "Python.h" -#include "modsupport.h" #include "structmember.h" #include <time.h> -#include "timefuncs.h" +#include "_time.h" /* Differentiate between building the core module and building extension * modules. @@ -27,7 +24,7 @@ * final result fits in a C int (this can be an issue on 64-bit boxes). */ #if SIZEOF_INT < 4 -# error "datetime.c requires that C int have at least 32 bits" +# error "_datetime.c requires that C int have at least 32 bits" #endif #define MINYEAR 1 @@ -90,8 +87,11 @@ /* p is a pointer to a time or a datetime object; HASTZINFO(p) returns * p->hastzinfo. */ -#define HASTZINFO(p) (((_PyDateTime_BaseTZInfo *)(p))->hastzinfo) - +#define HASTZINFO(p) (((_PyDateTime_BaseTZInfo *)(p))->hastzinfo) +#define GET_TIME_TZINFO(p) (HASTZINFO(p) ? \ + ((PyDateTime_Time *)(p))->tzinfo : Py_None) +#define GET_DT_TZINFO(p) (HASTZINFO(p) ? \ + ((PyDateTime_DateTime *)(p))->tzinfo : Py_None) /* M is a char or int claiming to be a valid month. The macro is equivalent * to the two-sided Python test * 1 <= M <= 12 @@ -104,6 +104,7 @@ static PyTypeObject PyDateTime_DateTimeType; static PyTypeObject PyDateTime_DeltaType; static PyTypeObject PyDateTime_TimeType; static PyTypeObject PyDateTime_TZInfoType; +static PyTypeObject PyDateTime_TimeZoneType; /* --------------------------------------------------------------------------- * Math utilities. @@ -154,6 +155,25 @@ round_to_long(double x) return (long)x; } +/* Nearest integer to m / n for integers m and n. Half-integer results + * are rounded to even. + */ +static PyObject * +divide_nearest(PyObject *m, PyObject *n) +{ + PyObject *result; + PyObject *temp; + + temp = _PyLong_DivmodNear(m, n); + if (temp == NULL) + return NULL; + result = PyTuple_GET_ITEM(temp, 0); + Py_INCREF(result); + Py_DECREF(temp); + + return result; +} + /* --------------------------------------------------------------------------- * General calendrical helper functions */ @@ -220,16 +240,10 @@ days_before_year(int year) int y = year - 1; /* This is incorrect if year <= 0; we really want the floor * here. But so long as MINYEAR is 1, the smallest year this - * can see is 0 (this can happen in some normalization endcases), - * so we'll just special-case that. + * can see is 1. */ - assert (year >= 0); - if (y >= 0) - return y*365 + y/4 - y/100 + y/400; - else { - assert(y == -1); - return -366; - } + assert (year >= 1); + return y*365 + y/4 - y/100 + y/400; } /* Number of days in 4, 100, and 400 year cycles. That these have @@ -488,20 +502,10 @@ normalize_y_m_d(int *y, int *m, int *d) { int dim; /* # of days in month */ - /* This gets muddy: the proper range for day can't be determined - * without knowing the correct month and year, but if day is, e.g., - * plus or minus a million, the current month and year values make - * no sense (and may also be out of bounds themselves). - * Saying 12 months == 1 year should be non-controversial. + /* In actual use, m is always the month component extracted from a + * date/datetime object. Therefore it is always in [1, 12] range. */ - if (*m < 1 || *m > 12) { - --*m; - normalize_pair(y, m, 12); - ++*m; - /* |y| can't be bigger than about - * |original y| + |original m|/12 now. - */ - } + assert(1 <= *m && *m <= 12); /* Now only day can be out of bounds (year may also be out of bounds @@ -754,6 +758,71 @@ new_delta_ex(int days, int seconds, int microseconds, int normalize, #define new_delta(d, s, us, normalize) \ new_delta_ex(d, s, us, normalize, &PyDateTime_DeltaType) + +typedef struct +{ + PyObject_HEAD + PyObject *offset; + PyObject *name; +} PyDateTime_TimeZone; + +/* The interned UTC timezone instance */ +static PyObject *PyDateTime_TimeZone_UTC; + +/* Create new timezone instance checking offset range. This + function does not check the name argument. Caller must assure + that offset is a timedelta instance and name is either NULL + or a unicode object. */ +static PyObject * +create_timezone(PyObject *offset, PyObject *name) +{ + PyDateTime_TimeZone *self; + PyTypeObject *type = &PyDateTime_TimeZoneType; + + assert(offset != NULL); + assert(PyDelta_Check(offset)); + assert(name == NULL || PyUnicode_Check(name)); + + self = (PyDateTime_TimeZone *)(type->tp_alloc(type, 0)); + if (self == NULL) { + return NULL; + } + Py_INCREF(offset); + self->offset = offset; + Py_XINCREF(name); + self->name = name; + return (PyObject *)self; +} + +static int delta_bool(PyDateTime_Delta *self); + +static PyObject * +new_timezone(PyObject *offset, PyObject *name) +{ + assert(offset != NULL); + assert(PyDelta_Check(offset)); + assert(name == NULL || PyUnicode_Check(name)); + + if (name == NULL && delta_bool((PyDateTime_Delta *)offset) == 0) { + Py_INCREF(PyDateTime_TimeZone_UTC); + return PyDateTime_TimeZone_UTC; + } + if (GET_TD_MICROSECONDS(offset) != 0 || GET_TD_SECONDS(offset) % 60 != 0) { + PyErr_Format(PyExc_ValueError, "offset must be a timedelta" + " representing a whole number of minutes"); + return NULL; + } + if ((GET_TD_DAYS(offset) == -1 && GET_TD_SECONDS(offset) == 0) || + GET_TD_DAYS(offset) < -1 || GET_TD_DAYS(offset) >= 1) { + PyErr_Format(PyExc_ValueError, "offset must be a timedelta" + " strictly between -timedelta(hours=24) and" + " timedelta(hours=24)."); + return NULL; + } + + return create_timezone(offset, name); +} + /* --------------------------------------------------------------------------- * tzinfo helpers. */ @@ -773,25 +842,6 @@ check_tzinfo_subclass(PyObject *p) return -1; } -/* Return tzinfo.methname(tzinfoarg), without any checking of results. - * If tzinfo is None, returns None. - */ -static PyObject * -call_tzinfo_method(PyObject *tzinfo, char *methname, PyObject *tzinfoarg) -{ - PyObject *result; - - assert(tzinfo && methname && tzinfoarg); - assert(check_tzinfo_subclass(tzinfo) >= 0); - if (tzinfo == Py_None) { - result = Py_None; - Py_INCREF(result); - } - else - result = PyObject_CallMethod(tzinfo, methname, "O", tzinfoarg); - return result; -} - /* If self has a tzinfo member, return a BORROWED reference to it. Else * return NULL, which is NOT AN ERROR. There are no error returns here, * and the caller must not decref the result. @@ -809,69 +859,53 @@ get_tzinfo_member(PyObject *self) return tzinfo; } -/* Call getattr(tzinfo, name)(tzinfoarg), and extract an int from the - * result. tzinfo must be an instance of the tzinfo class. If the method - * returns None, this returns 0 and sets *none to 1. If the method doesn't - * return None or timedelta, TypeError is raised and this returns -1. If it - * returnsa timedelta and the value is out of range or isn't a whole number - * of minutes, ValueError is raised and this returns -1. - * Else *none is set to 0 and the integer method result is returned. +/* Call getattr(tzinfo, name)(tzinfoarg), and check the result. tzinfo must + * be an instance of the tzinfo class. If the method returns None, this + * returns None. If the method doesn't return None or timedelta, TypeError is + * raised and this returns NULL. If it returns a timedelta and the value is + * out of range or isn't a whole number of minutes, ValueError is raised and + * this returns NULL. Else result is returned. */ -static int -call_utc_tzinfo_method(PyObject *tzinfo, char *name, PyObject *tzinfoarg, - int *none) +static PyObject * +call_tzinfo_method(PyObject *tzinfo, char *name, PyObject *tzinfoarg) { - PyObject *u; - int result = -1; + PyObject *offset; assert(tzinfo != NULL); - assert(PyTZInfo_Check(tzinfo)); + assert(PyTZInfo_Check(tzinfo) || tzinfo == Py_None); assert(tzinfoarg != NULL); - *none = 0; - u = call_tzinfo_method(tzinfo, name, tzinfoarg); - if (u == NULL) - return -1; - - else if (u == Py_None) { - result = 0; - *none = 1; - } - else if (PyDelta_Check(u)) { - const int days = GET_TD_DAYS(u); - if (days < -1 || days > 0) - result = 24*60; /* trigger ValueError below */ - else { - /* next line can't overflow because we know days - * is -1 or 0 now - */ - int ss = days * 24 * 3600 + GET_TD_SECONDS(u); - result = divmod(ss, 60, &ss); - if (ss || GET_TD_MICROSECONDS(u)) { - PyErr_Format(PyExc_ValueError, - "tzinfo.%s() must return a " - "whole number of minutes", - name); - result = -1; - } + if (tzinfo == Py_None) + Py_RETURN_NONE; + offset = PyObject_CallMethod(tzinfo, name, "O", tzinfoarg); + if (offset == Py_None || offset == NULL) + return offset; + if (PyDelta_Check(offset)) { + if (GET_TD_MICROSECONDS(offset) != 0 || GET_TD_SECONDS(offset) % 60 != 0) { + Py_DECREF(offset); + PyErr_Format(PyExc_ValueError, "offset must be a timedelta" + " representing a whole number of minutes"); + return NULL; + } + if ((GET_TD_DAYS(offset) == -1 && GET_TD_SECONDS(offset) == 0) || + GET_TD_DAYS(offset) < -1 || GET_TD_DAYS(offset) >= 1) { + Py_DECREF(offset); + PyErr_Format(PyExc_ValueError, "offset must be a timedelta" + " strictly between -timedelta(hours=24) and" + " timedelta(hours=24)."); + return NULL; } } else { + Py_DECREF(offset); PyErr_Format(PyExc_TypeError, "tzinfo.%s() must return None or " - "timedelta, not '%s'", - name, Py_TYPE(u)->tp_name); + "timedelta, not '%.200s'", + name, Py_TYPE(offset)->tp_name); + return NULL; } - Py_DECREF(u); - if (result < -1439 || result > 1439) { - PyErr_Format(PyExc_ValueError, - "tzinfo.%s() returned %d; must be in " - "-1439 .. 1439", - name, result); - result = -1; - } - return result; + return offset; } /* Call tzinfo.utcoffset(tzinfoarg), and extract an integer from the @@ -882,37 +916,10 @@ call_utc_tzinfo_method(PyObject *tzinfo, char *name, PyObject *tzinfoarg, * # of minutes), ValueError is raised and this returns -1. Else *none is * set to 0 and the offset is returned (as int # of minutes east of UTC). */ -static int -call_utcoffset(PyObject *tzinfo, PyObject *tzinfoarg, int *none) -{ - return call_utc_tzinfo_method(tzinfo, "utcoffset", tzinfoarg, none); -} - -/* Call tzinfo.name(tzinfoarg), and return the offset as a timedelta or None. - */ static PyObject * -offset_as_timedelta(PyObject *tzinfo, char *name, PyObject *tzinfoarg) { - PyObject *result; - - assert(tzinfo && name && tzinfoarg); - if (tzinfo == Py_None) { - result = Py_None; - Py_INCREF(result); - } - else { - int none; - int offset = call_utc_tzinfo_method(tzinfo, name, tzinfoarg, - &none); - if (offset < 0 && PyErr_Occurred()) - return NULL; - if (none) { - result = Py_None; - Py_INCREF(result); - } - else - result = new_delta(0, offset * 60, 0, 1); - } - return result; +call_utcoffset(PyObject *tzinfo, PyObject *tzinfoarg) +{ + return call_tzinfo_method(tzinfo, "utcoffset", tzinfoarg); } /* Call tzinfo.dst(tzinfoarg), and extract an integer from the @@ -923,16 +930,17 @@ offset_as_timedelta(PyObject *tzinfo, char *name, PyObject *tzinfoarg) { * ValueError is raised and this returns -1. Else *none is set to 0 and * the offset is returned (as an int # of minutes east of UTC). */ -static int -call_dst(PyObject *tzinfo, PyObject *tzinfoarg, int *none) +static PyObject * +call_dst(PyObject *tzinfo, PyObject *tzinfoarg) { - return call_utc_tzinfo_method(tzinfo, "dst", tzinfoarg, none); + return call_tzinfo_method(tzinfo, "dst", tzinfoarg); } /* Call tzinfo.tzname(tzinfoarg), and return the result. tzinfo must be * an instance of the tzinfo class or None. If tzinfo isn't None, and * tzname() doesn't return None or a string, TypeError is raised and this - * returns NULL. + * returns NULL. If the result is a string, we ensure it is a Unicode + * string. */ static PyObject * call_tzname(PyObject *tzinfo, PyObject *tzinfoarg) @@ -943,100 +951,23 @@ call_tzname(PyObject *tzinfo, PyObject *tzinfoarg) assert(check_tzinfo_subclass(tzinfo) >= 0); assert(tzinfoarg != NULL); - if (tzinfo == Py_None) { - result = Py_None; - Py_INCREF(result); - } - else - result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg); + if (tzinfo == Py_None) + Py_RETURN_NONE; + + result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg); + + if (result == NULL || result == Py_None) + return result; - if (result != NULL && result != Py_None && ! PyString_Check(result)) { + if (!PyUnicode_Check(result)) { PyErr_Format(PyExc_TypeError, "tzinfo.tzname() must " "return None or a string, not '%s'", Py_TYPE(result)->tp_name); Py_DECREF(result); result = NULL; } - return result; -} -typedef enum { - /* an exception has been set; the caller should pass it on */ - OFFSET_ERROR, - - /* type isn't date, datetime, or time subclass */ - OFFSET_UNKNOWN, - - /* date, - * datetime with !hastzinfo - * datetime with None tzinfo, - * datetime where utcoffset() returns None - * time with !hastzinfo - * time with None tzinfo, - * time where utcoffset() returns None - */ - OFFSET_NAIVE, - - /* time or datetime where utcoffset() doesn't return None */ - OFFSET_AWARE -} naivety; - -/* Classify an object as to whether it's naive or offset-aware. See - * the "naivety" typedef for details. If the type is aware, *offset is set - * to minutes east of UTC (as returned by the tzinfo.utcoffset() method). - * If the type is offset-naive (or unknown, or error), *offset is set to 0. - * tzinfoarg is the argument to pass to the tzinfo.utcoffset() method. - */ -static naivety -classify_utcoffset(PyObject *op, PyObject *tzinfoarg, int *offset) -{ - int none; - PyObject *tzinfo; - - assert(tzinfoarg != NULL); - *offset = 0; - tzinfo = get_tzinfo_member(op); /* NULL means no tzinfo, not error */ - if (tzinfo == Py_None) - return OFFSET_NAIVE; - if (tzinfo == NULL) { - /* note that a datetime passes the PyDate_Check test */ - return (PyTime_Check(op) || PyDate_Check(op)) ? - OFFSET_NAIVE : OFFSET_UNKNOWN; - } - *offset = call_utcoffset(tzinfo, tzinfoarg, &none); - if (*offset == -1 && PyErr_Occurred()) - return OFFSET_ERROR; - return none ? OFFSET_NAIVE : OFFSET_AWARE; -} - -/* Classify two objects as to whether they're naive or offset-aware. - * This isn't quite the same as calling classify_utcoffset() twice: for - * binary operations (comparison and subtraction), we generally want to - * ignore the tzinfo members if they're identical. This is by design, - * so that results match "naive" expectations when mixing objects from a - * single timezone. So in that case, this sets both offsets to 0 and - * both naiveties to OFFSET_NAIVE. - * The function returns 0 if everything's OK, and -1 on error. - */ -static int -classify_two_utcoffsets(PyObject *o1, int *offset1, naivety *n1, - PyObject *tzinfoarg1, - PyObject *o2, int *offset2, naivety *n2, - PyObject *tzinfoarg2) -{ - if (get_tzinfo_member(o1) == get_tzinfo_member(o2)) { - *offset1 = *offset2 = 0; - *n1 = *n2 = OFFSET_NAIVE; - } - else { - *n1 = classify_utcoffset(o1, tzinfoarg1, offset1); - if (*n1 == OFFSET_ERROR) - return -1; - *n2 = classify_utcoffset(o2, tzinfoarg2, offset2); - if (*n2 == OFFSET_ERROR) - return -1; - } - return 0; + return result; } /* repr is like "someclass(arg1, arg2)". If tzinfo isn't None, @@ -1049,27 +980,19 @@ append_keyword_tzinfo(PyObject *repr, PyObject *tzinfo) { PyObject *temp; - assert(PyString_Check(repr)); + assert(PyUnicode_Check(repr)); assert(tzinfo); if (tzinfo == Py_None) return repr; /* Get rid of the trailing ')'. */ - assert(PyString_AsString(repr)[PyString_Size(repr)-1] == ')'); - temp = PyString_FromStringAndSize(PyString_AsString(repr), - PyString_Size(repr) - 1); + assert(PyUnicode_AS_UNICODE(repr)[PyUnicode_GET_SIZE(repr)-1] == ')'); + temp = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(repr), + PyUnicode_GET_SIZE(repr) - 1); Py_DECREF(repr); if (temp == NULL) return NULL; - repr = temp; - - /* Append ", tzinfo=". */ - PyString_ConcatAndDel(&repr, PyString_FromString(", tzinfo=")); - - /* Append repr(tzinfo). */ - PyString_ConcatAndDel(&repr, PyObject_Repr(tzinfo)); - - /* Add a closing paren. */ - PyString_ConcatAndDel(&repr, PyString_FromString(")")); + repr = PyUnicode_FromFormat("%U, tzinfo=%R)", temp, tzinfo); + Py_DECREF(temp); return repr; } @@ -1088,16 +1011,16 @@ format_ctime(PyDateTime_Date *date, int hours, int minutes, int seconds) "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - char buffer[128]; int wday = weekday(GET_YEAR(date), GET_MONTH(date), GET_DAY(date)); - PyOS_snprintf(buffer, sizeof(buffer), "%s %s %2d %02d:%02d:%02d %04d", - DayNames[wday], MonthNames[GET_MONTH(date) - 1], - GET_DAY(date), hours, minutes, seconds, - GET_YEAR(date)); - return PyString_FromString(buffer); + return PyUnicode_FromFormat("%s %s %2d %02d:%02d:%02d %04d", + DayNames[wday], MonthNames[GET_MONTH(date)-1], + GET_DAY(date), hours, minutes, seconds, + GET_YEAR(date)); } +static PyObject *delta_negative(PyDateTime_Delta *self); + /* Add an hours & minutes UTC offset string to buf. buf has no more than * buflen bytes remaining. The UTC offset is gotten by calling * tzinfo.uctoffset(tzinfoarg). If that returns None, \0 is stored into @@ -1112,32 +1035,87 @@ static int format_utcoffset(char *buf, size_t buflen, const char *sep, PyObject *tzinfo, PyObject *tzinfoarg) { - int offset; - int hours; - int minutes; + PyObject *offset; + int hours, minutes, seconds; char sign; - int none; assert(buflen >= 1); - offset = call_utcoffset(tzinfo, tzinfoarg, &none); - if (offset == -1 && PyErr_Occurred()) + offset = call_utcoffset(tzinfo, tzinfoarg); + if (offset == NULL) return -1; - if (none) { + if (offset == Py_None) { + Py_DECREF(offset); *buf = '\0'; return 0; } - sign = '+'; - if (offset < 0) { + /* Offset is normalized, so it is negative if days < 0 */ + if (GET_TD_DAYS(offset) < 0) { + PyObject *temp = offset; sign = '-'; - offset = - offset; + offset = delta_negative((PyDateTime_Delta *)offset); + Py_DECREF(temp); + if (offset == NULL) + return -1; + } + else { + sign = '+'; } - hours = divmod(offset, 60, &minutes); + /* Offset is not negative here. */ + seconds = GET_TD_SECONDS(offset); + Py_DECREF(offset); + minutes = divmod(seconds, 60, &seconds); + hours = divmod(minutes, 60, &minutes); + assert(seconds == 0); + /* XXX ignore sub-minute data, curently not allowed. */ PyOS_snprintf(buf, buflen, "%c%02d%s%02d", sign, hours, sep, minutes); + return 0; } static PyObject * +make_Zreplacement(PyObject *object, PyObject *tzinfoarg) +{ + PyObject *temp; + PyObject *tzinfo = get_tzinfo_member(object); + PyObject *Zreplacement = PyUnicode_FromStringAndSize(NULL, 0); + if (Zreplacement == NULL) + return NULL; + if (tzinfo == Py_None || tzinfo == NULL) + return Zreplacement; + + assert(tzinfoarg != NULL); + temp = call_tzname(tzinfo, tzinfoarg); + if (temp == NULL) + goto Error; + if (temp == Py_None) { + Py_DECREF(temp); + return Zreplacement; + } + + assert(PyUnicode_Check(temp)); + /* Since the tzname is getting stuffed into the + * format, we have to double any % signs so that + * strftime doesn't treat them as format codes. + */ + Py_DECREF(Zreplacement); + Zreplacement = PyObject_CallMethod(temp, "replace", "ss", "%", "%%"); + Py_DECREF(temp); + if (Zreplacement == NULL) + return NULL; + if (!PyUnicode_Check(Zreplacement)) { + PyErr_SetString(PyExc_TypeError, + "tzname.replace() did not return a string"); + goto Error; + } + return Zreplacement; + + Error: + Py_DECREF(Zreplacement); + return NULL; +} + +static PyObject * make_freplacement(PyObject *object) { char freplacement[64]; @@ -1148,7 +1126,7 @@ make_freplacement(PyObject *object) else sprintf(freplacement, "%06d", 0); - return PyString_FromStringAndSize(freplacement, strlen(freplacement)); + return PyBytes_FromStringAndSize(freplacement, strlen(freplacement)); } /* I sure don't want to reproduce the strftime code from the time module, @@ -1159,8 +1137,8 @@ make_freplacement(PyObject *object) * needed. */ static PyObject * -wrap_strftime(PyObject *object, const char *format, size_t format_len, - PyObject *timetuple, PyObject *tzinfoarg) +wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, + PyObject *tzinfoarg) { PyObject *result = NULL; /* guilty until proved innocent */ @@ -1169,6 +1147,7 @@ wrap_strftime(PyObject *object, const char *format, size_t format_len, PyObject *freplacement = NULL; /* py string, replacement for %f */ const char *pin; /* pointer to next char in input format */ + Py_ssize_t flen; /* length of input format */ char ch; /* next char in input format */ PyObject *newfmt = NULL; /* py string, the output format */ @@ -1178,14 +1157,19 @@ wrap_strftime(PyObject *object, const char *format, size_t format_len, size_t usednew; /* number bytes used so far in output format buffer */ const char *ptoappend; /* ptr to string to append to output buffer */ - size_t ntoappend; /* # of bytes to append to output buffer */ + Py_ssize_t ntoappend; /* # of bytes to append to output buffer */ assert(object && format && timetuple); + assert(PyUnicode_Check(format)); + /* Convert the input format to a C string and size */ + pin = _PyUnicode_AsStringAndSize(format, &flen); + if (!pin) + return NULL; - /* Give up if the year is before 1900. + /* Give up if the year is before 1000. * Python strftime() plays games with the year, and different * games depending on whether envar PYTHON2K is set. This makes - * years before 1900 a nightmare, even if the platform strftime + * years before 1000 a nightmare, even if the platform strftime * supports them (and not all do). * We could get a lot farther here by avoiding Python's strftime * wrapper and calling the C strftime() directly, but that isn't @@ -1195,13 +1179,13 @@ wrap_strftime(PyObject *object, const char *format, size_t format_len, long year; PyObject *pyyear = PySequence_GetItem(timetuple, 0); if (pyyear == NULL) return NULL; - assert(PyInt_Check(pyyear)); - year = PyInt_AsLong(pyyear); + assert(PyLong_Check(pyyear)); + year = PyLong_AsLong(pyyear); Py_DECREF(pyyear); - if (year < 1900) { + if (year < 1000) { PyErr_Format(PyExc_ValueError, "year=%ld is before " - "1900; the datetime strftime() " - "methods require year >= 1900", + "1000; the datetime strftime() " + "methods require year >= 1000", year); return NULL; } @@ -1211,18 +1195,17 @@ wrap_strftime(PyObject *object, const char *format, size_t format_len, * a new format. Since computing the replacements for those codes * is expensive, don't unless they're actually used. */ - if (format_len > INT_MAX - 1) { + if (flen > INT_MAX - 1) { PyErr_NoMemory(); goto Done; } - totalnew = format_len + 1; /* realistic if no %z/%Z/%f */ - newfmt = PyString_FromStringAndSize(NULL, totalnew); + totalnew = flen + 1; /* realistic if no %z/%Z */ + newfmt = PyBytes_FromStringAndSize(NULL, totalnew); if (newfmt == NULL) goto Done; - pnew = PyString_AsString(newfmt); + pnew = PyBytes_AsString(newfmt); usednew = 0; - pin = format; while ((ch = *pin++) != '\0') { if (ch != '%') { ptoappend = pin - 1; @@ -1240,7 +1223,7 @@ wrap_strftime(PyObject *object, const char *format, size_t format_len, /* format utcoffset */ char buf[100]; PyObject *tzinfo = get_tzinfo_member(object); - zreplacement = PyString_FromString(""); + zreplacement = PyBytes_FromStringAndSize("", 0); if (zreplacement == NULL) goto Done; if (tzinfo != Py_None && tzinfo != NULL) { assert(tzinfoarg != NULL); @@ -1251,52 +1234,31 @@ wrap_strftime(PyObject *object, const char *format, size_t format_len, tzinfoarg) < 0) goto Done; Py_DECREF(zreplacement); - zreplacement = PyString_FromString(buf); - if (zreplacement == NULL) goto Done; + zreplacement = + PyBytes_FromStringAndSize(buf, + strlen(buf)); + if (zreplacement == NULL) + goto Done; } } assert(zreplacement != NULL); - ptoappend = PyString_AS_STRING(zreplacement); - ntoappend = PyString_GET_SIZE(zreplacement); + ptoappend = PyBytes_AS_STRING(zreplacement); + ntoappend = PyBytes_GET_SIZE(zreplacement); } else if (ch == 'Z') { /* format tzname */ if (Zreplacement == NULL) { - PyObject *tzinfo = get_tzinfo_member(object); - Zreplacement = PyString_FromString(""); - if (Zreplacement == NULL) goto Done; - if (tzinfo != Py_None && tzinfo != NULL) { - PyObject *temp; - assert(tzinfoarg != NULL); - temp = call_tzname(tzinfo, tzinfoarg); - if (temp == NULL) goto Done; - if (temp != Py_None) { - assert(PyString_Check(temp)); - /* Since the tzname is getting - * stuffed into the format, we - * have to double any % signs - * so that strftime doesn't - * treat them as format codes. - */ - Py_DECREF(Zreplacement); - Zreplacement = PyObject_CallMethod( - temp, "replace", - "ss", "%", "%%"); - Py_DECREF(temp); - if (Zreplacement == NULL) - goto Done; - if (!PyString_Check(Zreplacement)) { - PyErr_SetString(PyExc_TypeError, "tzname.replace() did not return a string"); - goto Done; - } - } - else - Py_DECREF(temp); - } + Zreplacement = make_Zreplacement(object, + tzinfoarg); + if (Zreplacement == NULL) + goto Done; } assert(Zreplacement != NULL); - ptoappend = PyString_AS_STRING(Zreplacement); - ntoappend = PyString_GET_SIZE(Zreplacement); + assert(PyUnicode_Check(Zreplacement)); + ptoappend = _PyUnicode_AsStringAndSize(Zreplacement, + &ntoappend); + if (ptoappend == NULL) + goto Done; } else if (ch == 'f') { /* format microseconds */ @@ -1306,9 +1268,9 @@ wrap_strftime(PyObject *object, const char *format, size_t format_len, goto Done; } assert(freplacement != NULL); - assert(PyString_Check(freplacement)); - ptoappend = PyString_AS_STRING(freplacement); - ntoappend = PyString_GET_SIZE(freplacement); + assert(PyBytes_Check(freplacement)); + ptoappend = PyBytes_AS_STRING(freplacement); + ntoappend = PyBytes_GET_SIZE(freplacement); } else { /* percent followed by neither z nor Z */ @@ -1319,20 +1281,20 @@ wrap_strftime(PyObject *object, const char *format, size_t format_len, /* Append the ntoappend chars starting at ptoappend to * the new format. */ - assert(ptoappend != NULL); - assert(ntoappend >= 0); if (ntoappend == 0) continue; + assert(ptoappend != NULL); + assert(ntoappend > 0); while (usednew + ntoappend > totalnew) { size_t bigger = totalnew << 1; if ((bigger >> 1) != totalnew) { /* overflow */ PyErr_NoMemory(); goto Done; } - if (_PyString_Resize(&newfmt, bigger) < 0) + if (_PyBytes_Resize(&newfmt, bigger) < 0) goto Done; totalnew = bigger; - pnew = PyString_AsString(newfmt) + usednew; + pnew = PyBytes_AsString(newfmt) + usednew; } memcpy(pnew, ptoappend, ntoappend); pnew += ntoappend; @@ -1340,14 +1302,19 @@ wrap_strftime(PyObject *object, const char *format, size_t format_len, assert(usednew <= totalnew); } /* end while() */ - if (_PyString_Resize(&newfmt, usednew) < 0) + if (_PyBytes_Resize(&newfmt, usednew) < 0) goto Done; { + PyObject *format; PyObject *time = PyImport_ImportModuleNoBlock("time"); if (time == NULL) goto Done; - result = PyObject_CallMethod(time, "strftime", "OO", - newfmt, timetuple); + format = PyUnicode_FromString(PyBytes_AS_STRING(newfmt)); + if (format != NULL) { + result = PyObject_CallMethod(time, "strftime", "OO", + format, timetuple, NULL); + Py_DECREF(format); + } Py_DECREF(time); } Done: @@ -1358,35 +1325,6 @@ wrap_strftime(PyObject *object, const char *format, size_t format_len, return result; } -static char * -isoformat_date(PyDateTime_Date *dt, char buffer[], int bufflen) -{ - int x; - x = PyOS_snprintf(buffer, bufflen, - "%04d-%02d-%02d", - GET_YEAR(dt), GET_MONTH(dt), GET_DAY(dt)); - assert(bufflen >= x); - return buffer + x; -} - -static char * -isoformat_time(PyDateTime_DateTime *dt, char buffer[], int bufflen) -{ - int x; - int us = DATE_GET_MICROSECOND(dt); - - x = PyOS_snprintf(buffer, bufflen, - "%02d:%02d:%02d", - DATE_GET_HOUR(dt), - DATE_GET_MINUTE(dt), - DATE_GET_SECOND(dt)); - assert(bufflen >= x); - if (us) - x += PyOS_snprintf(buffer + x, bufflen - x, ".%06d", us); - assert(bufflen >= x); - return buffer + x; -} - /* --------------------------------------------------------------------------- * Wrap functions from the time module. These aren't directly available * from C. Perhaps they should be. @@ -1433,7 +1371,7 @@ build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag) * Miscellaneous helpers. */ -/* For obscure reasons, we need to use tp_richcompare instead of tp_compare. +/* For various reasons, we need to use tp_richcompare instead of tp_reserved. * The comparisons here all most naturally compute a cmp()-like result. * This little helper turns that into a bool result for rich comparisons. */ @@ -1505,7 +1443,7 @@ delta_to_microseconds(PyDateTime_Delta *self) PyObject *x3 = NULL; PyObject *result = NULL; - x1 = PyInt_FromLong(GET_TD_DAYS(self)); + x1 = PyLong_FromLong(GET_TD_DAYS(self)); if (x1 == NULL) goto Done; x2 = PyNumber_Multiply(x1, seconds_per_day); /* days in seconds */ @@ -1515,7 +1453,7 @@ delta_to_microseconds(PyDateTime_Delta *self) x1 = NULL; /* x2 has days in seconds */ - x1 = PyInt_FromLong(GET_TD_SECONDS(self)); /* seconds */ + x1 = PyLong_FromLong(GET_TD_SECONDS(self)); /* seconds */ if (x1 == NULL) goto Done; x3 = PyNumber_Add(x1, x2); /* days and seconds in seconds */ @@ -1523,7 +1461,7 @@ delta_to_microseconds(PyDateTime_Delta *self) goto Done; Py_DECREF(x1); Py_DECREF(x2); - x2 = NULL; + x1 = x2 = NULL; /* x3 has days+seconds in seconds */ x1 = PyNumber_Multiply(x3, us_per_second); /* us */ @@ -1533,7 +1471,7 @@ delta_to_microseconds(PyDateTime_Delta *self) x3 = NULL; /* x1 has days+seconds in us */ - x2 = PyInt_FromLong(GET_TD_MICROSECONDS(self)); + x2 = PyLong_FromLong(GET_TD_MICROSECONDS(self)); if (x2 == NULL) goto Done; result = PyNumber_Add(x1, x2); @@ -1651,6 +1589,37 @@ multiply_int_timedelta(PyObject *intobj, PyDateTime_Delta *delta) } static PyObject * +multiply_float_timedelta(PyObject *floatobj, PyDateTime_Delta *delta) +{ + PyObject *result = NULL; + PyObject *pyus_in = NULL, *temp, *pyus_out; + PyObject *ratio = NULL; + + pyus_in = delta_to_microseconds(delta); + if (pyus_in == NULL) + return NULL; + ratio = PyObject_CallMethod(floatobj, "as_integer_ratio", NULL); + if (ratio == NULL) + goto error; + temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, 0)); + Py_DECREF(pyus_in); + pyus_in = NULL; + if (temp == NULL) + goto error; + pyus_out = divide_nearest(temp, PyTuple_GET_ITEM(ratio, 1)); + Py_DECREF(temp); + if (pyus_out == NULL) + goto error; + result = microseconds_to_delta(pyus_out); + Py_DECREF(pyus_out); + error: + Py_XDECREF(pyus_in); + Py_XDECREF(ratio); + + return result; +} + +static PyObject * divide_timedelta_int(PyDateTime_Delta *delta, PyObject *intobj) { PyObject *pyus_in; @@ -1672,6 +1641,101 @@ divide_timedelta_int(PyDateTime_Delta *delta, PyObject *intobj) } static PyObject * +divide_timedelta_timedelta(PyDateTime_Delta *left, PyDateTime_Delta *right) +{ + PyObject *pyus_left; + PyObject *pyus_right; + PyObject *result; + + pyus_left = delta_to_microseconds(left); + if (pyus_left == NULL) + return NULL; + + pyus_right = delta_to_microseconds(right); + if (pyus_right == NULL) { + Py_DECREF(pyus_left); + return NULL; + } + + result = PyNumber_FloorDivide(pyus_left, pyus_right); + Py_DECREF(pyus_left); + Py_DECREF(pyus_right); + return result; +} + +static PyObject * +truedivide_timedelta_timedelta(PyDateTime_Delta *left, PyDateTime_Delta *right) +{ + PyObject *pyus_left; + PyObject *pyus_right; + PyObject *result; + + pyus_left = delta_to_microseconds(left); + if (pyus_left == NULL) + return NULL; + + pyus_right = delta_to_microseconds(right); + if (pyus_right == NULL) { + Py_DECREF(pyus_left); + return NULL; + } + + result = PyNumber_TrueDivide(pyus_left, pyus_right); + Py_DECREF(pyus_left); + Py_DECREF(pyus_right); + return result; +} + +static PyObject * +truedivide_timedelta_float(PyDateTime_Delta *delta, PyObject *f) +{ + PyObject *result = NULL; + PyObject *pyus_in = NULL, *temp, *pyus_out; + PyObject *ratio = NULL; + + pyus_in = delta_to_microseconds(delta); + if (pyus_in == NULL) + return NULL; + ratio = PyObject_CallMethod(f, "as_integer_ratio", NULL); + if (ratio == NULL) + goto error; + temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, 1)); + Py_DECREF(pyus_in); + pyus_in = NULL; + if (temp == NULL) + goto error; + pyus_out = divide_nearest(temp, PyTuple_GET_ITEM(ratio, 0)); + Py_DECREF(temp); + if (pyus_out == NULL) + goto error; + result = microseconds_to_delta(pyus_out); + Py_DECREF(pyus_out); + error: + Py_XDECREF(pyus_in); + Py_XDECREF(ratio); + + return result; +} + +static PyObject * +truedivide_timedelta_int(PyDateTime_Delta *delta, PyObject *i) +{ + PyObject *result; + PyObject *pyus_in, *pyus_out; + pyus_in = delta_to_microseconds(delta); + if (pyus_in == NULL) + return NULL; + pyus_out = divide_nearest(pyus_in, i); + Py_DECREF(pyus_in); + if (pyus_out == NULL) + return NULL; + result = microseconds_to_delta(pyus_out); + Py_DECREF(pyus_out); + + return result; +} + +static PyObject * delta_add(PyObject *left, PyObject *right) { PyObject *result = Py_NotImplemented; @@ -1752,36 +1816,35 @@ delta_subtract(PyObject *left, PyObject *right) return result; } -/* This is more natural as a tp_compare, but doesn't work then: for whatever - * reason, Python's try_3way_compare ignores tp_compare unless - * PyInstance_Check returns true, but these aren't old-style classes. - */ -static PyObject * -delta_richcompare(PyDateTime_Delta *self, PyObject *other, int op) +static int +delta_cmp(PyObject *self, PyObject *other) { - int diff = 42; /* nonsense */ + int diff = GET_TD_DAYS(self) - GET_TD_DAYS(other); + if (diff == 0) { + diff = GET_TD_SECONDS(self) - GET_TD_SECONDS(other); + if (diff == 0) + diff = GET_TD_MICROSECONDS(self) - + GET_TD_MICROSECONDS(other); + } + return diff; +} +static PyObject * +delta_richcompare(PyObject *self, PyObject *other, int op) +{ if (PyDelta_Check(other)) { - diff = GET_TD_DAYS(self) - GET_TD_DAYS(other); - if (diff == 0) { - diff = GET_TD_SECONDS(self) - GET_TD_SECONDS(other); - if (diff == 0) - diff = GET_TD_MICROSECONDS(self) - - GET_TD_MICROSECONDS(other); - } + int diff = delta_cmp(self, other); + return diff_to_bool(diff, op); + } + else { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; } - else if (op == Py_EQ || op == Py_NE) - diff = 1; /* any non-zero value will do */ - - else /* stop this from falling back to address comparison */ - return cmperror((PyObject *)self, other); - - return diff_to_bool(diff, op); } static PyObject *delta_getstate(PyDateTime_Delta *self); -static long +static Py_hash_t delta_hash(PyDateTime_Delta *self) { if (self->hashcode == -1) { @@ -1801,13 +1864,19 @@ delta_multiply(PyObject *left, PyObject *right) if (PyDelta_Check(left)) { /* delta * ??? */ - if (PyInt_Check(right) || PyLong_Check(right)) + if (PyLong_Check(right)) result = multiply_int_timedelta(right, (PyDateTime_Delta *) left); + else if (PyFloat_Check(right)) + result = multiply_float_timedelta(right, + (PyDateTime_Delta *) left); } - else if (PyInt_Check(left) || PyLong_Check(left)) + else if (PyLong_Check(left)) result = multiply_int_timedelta(left, - (PyDateTime_Delta *) right); + (PyDateTime_Delta *) right); + else if (PyFloat_Check(left)) + result = multiply_float_timedelta(left, + (PyDateTime_Delta *) right); if (result == Py_NotImplemented) Py_INCREF(result); @@ -1821,10 +1890,37 @@ delta_divide(PyObject *left, PyObject *right) if (PyDelta_Check(left)) { /* delta * ??? */ - if (PyInt_Check(right) || PyLong_Check(right)) + if (PyLong_Check(right)) result = divide_timedelta_int( (PyDateTime_Delta *)left, right); + else if (PyDelta_Check(right)) + result = divide_timedelta_timedelta( + (PyDateTime_Delta *)left, + (PyDateTime_Delta *)right); + } + + if (result == Py_NotImplemented) + Py_INCREF(result); + return result; +} + +static PyObject * +delta_truedivide(PyObject *left, PyObject *right) +{ + PyObject *result = Py_NotImplemented; + + if (PyDelta_Check(left)) { + if (PyDelta_Check(right)) + result = truedivide_timedelta_timedelta( + (PyDateTime_Delta *)left, + (PyDateTime_Delta *)right); + else if (PyFloat_Check(right)) + result = truedivide_timedelta_float( + (PyDateTime_Delta *)left, right); + else if (PyLong_Check(right)) + result = truedivide_timedelta_int( + (PyDateTime_Delta *)left, right); } if (result == Py_NotImplemented) @@ -1832,6 +1928,85 @@ delta_divide(PyObject *left, PyObject *right) return result; } +static PyObject * +delta_remainder(PyObject *left, PyObject *right) +{ + PyObject *pyus_left; + PyObject *pyus_right; + PyObject *pyus_remainder; + PyObject *remainder; + + if (!PyDelta_Check(left) || !PyDelta_Check(right)) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + + pyus_left = delta_to_microseconds((PyDateTime_Delta *)left); + if (pyus_left == NULL) + return NULL; + + pyus_right = delta_to_microseconds((PyDateTime_Delta *)right); + if (pyus_right == NULL) { + Py_DECREF(pyus_left); + return NULL; + } + + pyus_remainder = PyNumber_Remainder(pyus_left, pyus_right); + Py_DECREF(pyus_left); + Py_DECREF(pyus_right); + if (pyus_remainder == NULL) + return NULL; + + remainder = microseconds_to_delta(pyus_remainder); + Py_DECREF(pyus_remainder); + if (remainder == NULL) + return NULL; + + return remainder; +} + +static PyObject * +delta_divmod(PyObject *left, PyObject *right) +{ + PyObject *pyus_left; + PyObject *pyus_right; + PyObject *divmod; + PyObject *delta; + PyObject *result; + + if (!PyDelta_Check(left) || !PyDelta_Check(right)) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + + pyus_left = delta_to_microseconds((PyDateTime_Delta *)left); + if (pyus_left == NULL) + return NULL; + + pyus_right = delta_to_microseconds((PyDateTime_Delta *)right); + if (pyus_right == NULL) { + Py_DECREF(pyus_left); + return NULL; + } + + divmod = PyNumber_Divmod(pyus_left, pyus_right); + Py_DECREF(pyus_left); + Py_DECREF(pyus_right); + if (divmod == NULL) + return NULL; + + assert(PyTuple_Size(divmod) == 2); + delta = microseconds_to_delta(PyTuple_GET_ITEM(divmod, 1)); + if (delta == NULL) { + Py_DECREF(divmod); + return NULL; + } + result = PyTuple_Pack(2, PyTuple_GET_ITEM(divmod, 0), delta); + Py_DECREF(delta); + Py_DECREF(divmod); + return result; +} + /* Fold in the value of the tag ("seconds", "weeks", etc) component of a * timedelta constructor. sofar is the # of microseconds accounted for * so far, and there are factor microseconds per current unit, the number @@ -1850,7 +2025,7 @@ accum(const char* tag, PyObject *sofar, PyObject *num, PyObject *factor, assert(num != NULL); - if (PyInt_Check(num) || PyLong_Check(num)) { + if (PyLong_Check(num)) { prod = PyNumber_Multiply(num, factor); if (prod == NULL) return NULL; @@ -1898,11 +2073,8 @@ accum(const char* tag, PyObject *sofar, PyObject *num, PyObject *factor, * fractional part requires float arithmetic, and may * lose a little info. */ - assert(PyInt_Check(factor) || PyLong_Check(factor)); - if (PyInt_Check(factor)) - dnum = (double)PyInt_AsLong(factor); - else - dnum = PyLong_AsDouble(factor); + assert(PyLong_Check(factor)); + dnum = PyLong_AsDouble(factor); dnum *= fracpart; fracpart = modf(dnum, &intpart); @@ -1954,7 +2126,7 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw) &ms, &minute, &hour, &week) == 0) goto Done; - x = PyInt_FromLong(0); + x = PyLong_FromLong(0); if (x == NULL) goto Done; @@ -2013,7 +2185,7 @@ Done: } static int -delta_nonzero(PyDateTime_Delta *self) +delta_bool(PyDateTime_Delta *self) { return (GET_TD_DAYS(self) != 0 || GET_TD_SECONDS(self) != 0 @@ -2024,66 +2196,49 @@ static PyObject * delta_repr(PyDateTime_Delta *self) { if (GET_TD_MICROSECONDS(self) != 0) - return PyString_FromFormat("%s(%d, %d, %d)", - Py_TYPE(self)->tp_name, - GET_TD_DAYS(self), - GET_TD_SECONDS(self), - GET_TD_MICROSECONDS(self)); + return PyUnicode_FromFormat("%s(%d, %d, %d)", + Py_TYPE(self)->tp_name, + GET_TD_DAYS(self), + GET_TD_SECONDS(self), + GET_TD_MICROSECONDS(self)); if (GET_TD_SECONDS(self) != 0) - return PyString_FromFormat("%s(%d, %d)", - Py_TYPE(self)->tp_name, - GET_TD_DAYS(self), - GET_TD_SECONDS(self)); + return PyUnicode_FromFormat("%s(%d, %d)", + Py_TYPE(self)->tp_name, + GET_TD_DAYS(self), + GET_TD_SECONDS(self)); - return PyString_FromFormat("%s(%d)", - Py_TYPE(self)->tp_name, - GET_TD_DAYS(self)); + return PyUnicode_FromFormat("%s(%d)", + Py_TYPE(self)->tp_name, + GET_TD_DAYS(self)); } static PyObject * delta_str(PyDateTime_Delta *self) { - int days = GET_TD_DAYS(self); - int seconds = GET_TD_SECONDS(self); int us = GET_TD_MICROSECONDS(self); - int hours; - int minutes; - char buf[100]; - char *pbuf = buf; - size_t buflen = sizeof(buf); - int n; - - minutes = divmod(seconds, 60, &seconds); - hours = divmod(minutes, 60, &minutes); + int seconds = GET_TD_SECONDS(self); + int minutes = divmod(seconds, 60, &seconds); + int hours = divmod(minutes, 60, &minutes); + int days = GET_TD_DAYS(self); if (days) { - n = PyOS_snprintf(pbuf, buflen, "%d day%s, ", days, - (days == 1 || days == -1) ? "" : "s"); - if (n < 0 || (size_t)n >= buflen) - goto Fail; - pbuf += n; - buflen -= (size_t)n; - } - - n = PyOS_snprintf(pbuf, buflen, "%d:%02d:%02d", - hours, minutes, seconds); - if (n < 0 || (size_t)n >= buflen) - goto Fail; - pbuf += n; - buflen -= (size_t)n; - - if (us) { - n = PyOS_snprintf(pbuf, buflen, ".%06d", us); - if (n < 0 || (size_t)n >= buflen) - goto Fail; - pbuf += n; + if (us) + return PyUnicode_FromFormat("%d day%s, %d:%02d:%02d.%06d", + days, (days == 1 || days == -1) ? "" : "s", + hours, minutes, seconds, us); + else + return PyUnicode_FromFormat("%d day%s, %d:%02d:%02d", + days, (days == 1 || days == -1) ? "" : "s", + hours, minutes, seconds); + } else { + if (us) + return PyUnicode_FromFormat("%d:%02d:%02d.%06d", + hours, minutes, seconds, us); + else + return PyUnicode_FromFormat("%d:%02d:%02d", + hours, minutes, seconds); } - return PyString_FromStringAndSize(buf, pbuf - buf); - - Fail: - PyErr_SetString(PyExc_SystemError, "goofy result from PyOS_snprintf"); - return NULL; } /* Pickle support, a simple use of __reduce__. */ @@ -2159,30 +2314,25 @@ static PyNumberMethods delta_as_number = { delta_add, /* nb_add */ delta_subtract, /* nb_subtract */ delta_multiply, /* nb_multiply */ - delta_divide, /* nb_divide */ - 0, /* nb_remainder */ - 0, /* nb_divmod */ + delta_remainder, /* nb_remainder */ + delta_divmod, /* nb_divmod */ 0, /* nb_power */ (unaryfunc)delta_negative, /* nb_negative */ (unaryfunc)delta_positive, /* nb_positive */ (unaryfunc)delta_abs, /* nb_absolute */ - (inquiry)delta_nonzero, /* nb_nonzero */ + (inquiry)delta_bool, /* nb_bool */ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ - 0, /*nb_coerce*/ 0, /*nb_int*/ - 0, /*nb_long*/ + 0, /*nb_reserved*/ 0, /*nb_float*/ - 0, /*nb_oct*/ - 0, /*nb_hex*/ 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ - 0, /*nb_inplace_divide*/ 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ @@ -2191,7 +2341,7 @@ static PyNumberMethods delta_as_number = { 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ delta_divide, /* nb_floor_divide */ - 0, /* nb_true_divide */ + delta_truedivide, /* nb_true_divide */ 0, /* nb_inplace_floor_divide */ 0, /* nb_inplace_true_divide */ }; @@ -2205,7 +2355,7 @@ static PyTypeObject PyDateTime_DeltaType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)delta_repr, /* tp_repr */ &delta_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2216,12 +2366,11 @@ static PyTypeObject PyDateTime_DeltaType = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | - Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ delta_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ - (richcmpfunc)delta_richcompare, /* tp_richcompare */ + delta_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ @@ -2248,19 +2397,19 @@ static PyTypeObject PyDateTime_DeltaType = { static PyObject * date_year(PyDateTime_Date *self, void *unused) { - return PyInt_FromLong(GET_YEAR(self)); + return PyLong_FromLong(GET_YEAR(self)); } static PyObject * date_month(PyDateTime_Date *self, void *unused) { - return PyInt_FromLong(GET_MONTH(self)); + return PyLong_FromLong(GET_MONTH(self)); } static PyObject * date_day(PyDateTime_Date *self, void *unused) { - return PyInt_FromLong(GET_DAY(self)); + return PyLong_FromLong(GET_DAY(self)); } static PyGetSetDef date_getset[] = { @@ -2285,15 +2434,15 @@ date_new(PyTypeObject *type, PyObject *args, PyObject *kw) /* Check for invocation from pickle with __getstate__ state */ if (PyTuple_GET_SIZE(args) == 1 && - PyString_Check(state = PyTuple_GET_ITEM(args, 0)) && - PyString_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE && - MONTH_IS_SANE(PyString_AS_STRING(state)[2])) + PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) && + PyBytes_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE && + MONTH_IS_SANE(PyBytes_AS_STRING(state)[2])) { PyDateTime_Date *me; me = (PyDateTime_Date *) (type->tp_alloc(type, 0)); if (me != NULL) { - char *pdata = PyString_AS_STRING(state); + char *pdata = PyBytes_AS_STRING(state); memcpy(me->data, pdata, _PyDateTime_DATE_DATASIZE); me->hashcode = -1; } @@ -2483,24 +2632,16 @@ date_subtract(PyObject *left, PyObject *right) static PyObject * date_repr(PyDateTime_Date *self) { - char buffer[1028]; - const char *type_name; - - type_name = Py_TYPE(self)->tp_name; - PyOS_snprintf(buffer, sizeof(buffer), "%s(%d, %d, %d)", - type_name, - GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); - - return PyString_FromString(buffer); + return PyUnicode_FromFormat("%s(%d, %d, %d)", + Py_TYPE(self)->tp_name, + GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); } static PyObject * date_isoformat(PyDateTime_Date *self) { - char buffer[128]; - - isoformat_date(self, buffer, sizeof(buffer)); - return PyString_FromString(buffer); + return PyUnicode_FromFormat("%04d-%02d-%02d", + GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); } /* str() calls the appropriate isoformat() method. */ @@ -2525,18 +2666,17 @@ date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw) */ PyObject *result; PyObject *tuple; - const char *format; - Py_ssize_t format_len; + PyObject *format; static char *keywords[] = {"format", NULL}; - if (! PyArg_ParseTupleAndKeywords(args, kw, "s#:strftime", keywords, - &format, &format_len)) + if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords, + &format)) return NULL; tuple = PyObject_CallMethod((PyObject *)self, "timetuple", "()"); if (tuple == NULL) return NULL; - result = wrap_strftime((PyObject *)self, format, format_len, tuple, + result = wrap_strftime((PyObject *)self, format, tuple, (PyObject *)self); Py_DECREF(tuple); return result; @@ -2547,24 +2687,13 @@ date_format(PyDateTime_Date *self, PyObject *args) { PyObject *format; - if (!PyArg_ParseTuple(args, "O:__format__", &format)) + if (!PyArg_ParseTuple(args, "U:__format__", &format)) return NULL; - /* Check for str or unicode */ - if (PyString_Check(format)) { - /* If format is zero length, return str(self) */ - if (PyString_GET_SIZE(format) == 0) - return PyObject_Str((PyObject *)self); - } else if (PyUnicode_Check(format)) { - /* If format is zero length, return str(self) */ - if (PyUnicode_GET_SIZE(format) == 0) - return PyObject_Unicode((PyObject *)self); - } else { - PyErr_Format(PyExc_ValueError, - "__format__ expects str or unicode, not %.200s", - Py_TYPE(format)->tp_name); - return NULL; - } + /* if the format is zero length, return str(self) */ + if (PyUnicode_GetSize(format) == 0) + return PyObject_Str((PyObject *)self); + return PyObject_CallMethod((PyObject *)self, "strftime", "O", format); } @@ -2575,7 +2704,7 @@ date_isoweekday(PyDateTime_Date *self) { int dow = weekday(GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); - return PyInt_FromLong(dow + 1); + return PyLong_FromLong(dow + 1); } static PyObject * @@ -2602,31 +2731,19 @@ date_isocalendar(PyDateTime_Date *self) /* Miscellaneous methods. */ -/* This is more natural as a tp_compare, but doesn't work then: for whatever - * reason, Python's try_3way_compare ignores tp_compare unless - * PyInstance_Check returns true, but these aren't old-style classes. - */ static PyObject * -date_richcompare(PyDateTime_Date *self, PyObject *other, int op) +date_richcompare(PyObject *self, PyObject *other, int op) { - int diff = 42; /* nonsense */ - - if (PyDate_Check(other)) - diff = memcmp(self->data, ((PyDateTime_Date *)other)->data, - _PyDateTime_DATE_DATASIZE); - - else if (PyObject_HasAttrString(other, "timetuple")) { - /* A hook for other kinds of date objects. */ + if (PyDate_Check(other)) { + int diff = memcmp(((PyDateTime_Date *)self)->data, + ((PyDateTime_Date *)other)->data, + _PyDateTime_DATE_DATASIZE); + return diff_to_bool(diff, op); + } + else { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } - else if (op == Py_EQ || op == Py_NE) - diff = 1; /* any non-zero value will do */ - - else /* stop this from falling back to address comparison */ - return cmperror((PyObject *)self, other); - - return diff_to_bool(diff, op); } static PyObject * @@ -2658,25 +2775,46 @@ date_replace(PyDateTime_Date *self, PyObject *args, PyObject *kw) return clone; } +/* + Borrowed from stringobject.c, originally it was string_hash() +*/ +static Py_hash_t +generic_hash(unsigned char *data, int len) +{ + register unsigned char *p; + register Py_hash_t x; + + assert(_Py_HashSecret_Initialized); + p = (unsigned char *) data; + x = _Py_HashSecret.prefix; + x ^= *p << 7; + while (--len >= 0) + x = (1000003*x) ^ *p++; + x ^= len; + x ^= _Py_HashSecret.suffix; + if (x == -1) + x = -2; + + return x; +} + + static PyObject *date_getstate(PyDateTime_Date *self); -static long +static Py_hash_t date_hash(PyDateTime_Date *self) { - if (self->hashcode == -1) { - PyObject *temp = date_getstate(self); - if (temp != NULL) { - self->hashcode = PyObject_Hash(temp); - Py_DECREF(temp); - } - } + if (self->hashcode == -1) + self->hashcode = generic_hash( + (unsigned char *)self->data, _PyDateTime_DATE_DATASIZE); + return self->hashcode; } static PyObject * date_toordinal(PyDateTime_Date *self) { - return PyInt_FromLong(ymd_to_ord(GET_YEAR(self), GET_MONTH(self), + return PyLong_FromLong(ymd_to_ord(GET_YEAR(self), GET_MONTH(self), GET_DAY(self))); } @@ -2685,7 +2823,7 @@ date_weekday(PyDateTime_Date *self) { int dow = weekday(GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); - return PyInt_FromLong(dow); + return PyLong_FromLong(dow); } /* Pickle support, a simple use of __reduce__. */ @@ -2694,10 +2832,10 @@ date_weekday(PyDateTime_Date *self) static PyObject * date_getstate(PyDateTime_Date *self) { - return Py_BuildValue( - "(N)", - PyString_FromStringAndSize((char *)self->data, - _PyDateTime_DATE_DATASIZE)); + PyObject* field; + field = PyBytes_FromStringAndSize((char*)self->data, + _PyDateTime_DATE_DATASIZE); + return Py_BuildValue("(N)", field); } static PyObject * @@ -2773,14 +2911,13 @@ static PyNumberMethods date_as_number = { date_add, /* nb_add */ date_subtract, /* nb_subtract */ 0, /* nb_multiply */ - 0, /* nb_divide */ 0, /* nb_remainder */ 0, /* nb_divmod */ 0, /* nb_power */ 0, /* nb_negative */ 0, /* nb_positive */ 0, /* nb_absolute */ - 0, /* nb_nonzero */ + 0, /* nb_bool */ }; static PyTypeObject PyDateTime_DateType = { @@ -2792,7 +2929,7 @@ static PyTypeObject PyDateTime_DateType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)date_repr, /* tp_repr */ &date_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2803,12 +2940,11 @@ static PyTypeObject PyDateTime_DateType = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | - Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ date_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ - (richcmpfunc)date_richcompare, /* tp_richcompare */ + date_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ @@ -2872,76 +3008,73 @@ tzinfo_dst(PyDateTime_TZInfo *self, PyObject *dt) return tzinfo_nogo("dst"); } + +static PyObject *add_datetime_timedelta(PyDateTime_DateTime *date, + PyDateTime_Delta *delta, + int factor); +static PyObject *datetime_utcoffset(PyObject *self, PyObject *); +static PyObject *datetime_dst(PyObject *self, PyObject *); + static PyObject * -tzinfo_fromutc(PyDateTime_TZInfo *self, PyDateTime_DateTime *dt) +tzinfo_fromutc(PyDateTime_TZInfo *self, PyObject *dt) { - int y, m, d, hh, mm, ss, us; - - PyObject *result; - int off, dst; - int none; - int delta; + PyObject *result = NULL; + PyObject *off = NULL, *dst = NULL; + PyDateTime_Delta *delta = NULL; - if (! PyDateTime_Check(dt)) { + if (!PyDateTime_Check(dt)) { PyErr_SetString(PyExc_TypeError, "fromutc: argument must be a datetime"); return NULL; } - if (! HASTZINFO(dt) || dt->tzinfo != (PyObject *)self) { + if (GET_DT_TZINFO(dt) != (PyObject *)self) { PyErr_SetString(PyExc_ValueError, "fromutc: dt.tzinfo " "is not self"); return NULL; } - off = call_utcoffset(dt->tzinfo, (PyObject *)dt, &none); - if (off == -1 && PyErr_Occurred()) + off = datetime_utcoffset(dt, NULL); + if (off == NULL) return NULL; - if (none) { + if (off == Py_None) { PyErr_SetString(PyExc_ValueError, "fromutc: non-None " "utcoffset() result required"); - return NULL; + goto Fail; } - dst = call_dst(dt->tzinfo, (PyObject *)dt, &none); - if (dst == -1 && PyErr_Occurred()) - return NULL; - if (none) { + dst = datetime_dst(dt, NULL); + if (dst == NULL) + goto Fail; + if (dst == Py_None) { PyErr_SetString(PyExc_ValueError, "fromutc: non-None " "dst() result required"); - return NULL; + goto Fail; } - y = GET_YEAR(dt); - m = GET_MONTH(dt); - d = GET_DAY(dt); - hh = DATE_GET_HOUR(dt); - mm = DATE_GET_MINUTE(dt); - ss = DATE_GET_SECOND(dt); - us = DATE_GET_MICROSECOND(dt); - - delta = off - dst; - mm += delta; - if ((mm < 0 || mm >= 60) && - normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0) - return NULL; - result = new_datetime(y, m, d, hh, mm, ss, us, dt->tzinfo); + delta = (PyDateTime_Delta *)delta_subtract(off, dst); + if (delta == NULL) + goto Fail; + result = add_datetime_timedelta((PyDateTime_DateTime *)dt, delta, 1); if (result == NULL) - return result; - - dst = call_dst(dt->tzinfo, result, &none); - if (dst == -1 && PyErr_Occurred()) goto Fail; - if (none) - goto Inconsistent; - if (dst == 0) - return result; - mm += dst; - if ((mm < 0 || mm >= 60) && - normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0) + Py_DECREF(dst); + dst = call_dst(GET_DT_TZINFO(dt), result); + if (dst == NULL) goto Fail; - Py_DECREF(result); - result = new_datetime(y, m, d, hh, mm, ss, us, dt->tzinfo); + if (dst == Py_None) + goto Inconsistent; + if (delta_bool(delta) != 0) { + PyObject *temp = result; + result = add_datetime_timedelta((PyDateTime_DateTime *)result, + (PyDateTime_Delta *)dst, 1); + Py_DECREF(temp); + if (result == NULL) + goto Fail; + } + Py_DECREF(delta); + Py_DECREF(dst); + Py_DECREF(off); return result; Inconsistent: @@ -2950,7 +3083,10 @@ Inconsistent: /* fall thru to failure */ Fail: - Py_DECREF(result); + Py_XDECREF(off); + Py_XDECREF(dst); + Py_XDECREF(delta); + Py_XDECREF(result); return NULL; } @@ -3020,8 +3156,8 @@ static PyMethodDef tzinfo_methods[] = { PyDoc_STR("datetime -> string name of time zone.")}, {"utcoffset", (PyCFunction)tzinfo_utcoffset, METH_O, - PyDoc_STR("datetime -> minutes east of UTC (negative for " - "west of UTC).")}, + PyDoc_STR("datetime -> timedelta showing offset from UTC, negative " + "values indicating West of UTC")}, {"dst", (PyCFunction)tzinfo_dst, METH_O, PyDoc_STR("datetime -> DST offset in minutes east of UTC.")}, @@ -3038,9 +3174,8 @@ static PyMethodDef tzinfo_methods[] = { static char tzinfo_doc[] = PyDoc_STR("Abstract base class for time zone info objects."); -statichere PyTypeObject PyDateTime_TZInfoType = { - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ +static PyTypeObject PyDateTime_TZInfoType = { + PyVarObject_HEAD_INIT(NULL, 0) "datetime.tzinfo", /* tp_name */ sizeof(PyDateTime_TZInfo), /* tp_basicsize */ 0, /* tp_itemsize */ @@ -3048,7 +3183,7 @@ statichere PyTypeObject PyDateTime_TZInfoType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3059,8 +3194,7 @@ statichere PyTypeObject PyDateTime_TZInfoType = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | - Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ tzinfo_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ @@ -3082,6 +3216,237 @@ statichere PyTypeObject PyDateTime_TZInfoType = { 0, /* tp_free */ }; +static char *timezone_kws[] = {"offset", "name", NULL}; + +static PyObject * +timezone_new(PyTypeObject *type, PyObject *args, PyObject *kw) +{ + PyObject *offset; + PyObject *name = NULL; + if (PyArg_ParseTupleAndKeywords(args, kw, "O!|O!:timezone", timezone_kws, + &PyDateTime_DeltaType, &offset, + &PyUnicode_Type, &name)) + return new_timezone(offset, name); + + return NULL; +} + +static void +timezone_dealloc(PyDateTime_TimeZone *self) +{ + Py_CLEAR(self->offset); + Py_CLEAR(self->name); + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyObject * +timezone_richcompare(PyDateTime_TimeZone *self, + PyDateTime_TimeZone *other, int op) +{ + if (op != Py_EQ && op != Py_NE) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + if (Py_TYPE(other) != &PyDateTime_TimeZoneType) { + if (op == Py_EQ) + Py_RETURN_FALSE; + else + Py_RETURN_TRUE; + } + return delta_richcompare(self->offset, other->offset, op); +} + +static Py_hash_t +timezone_hash(PyDateTime_TimeZone *self) +{ + return delta_hash((PyDateTime_Delta *)self->offset); +} + +/* Check argument type passed to tzname, utcoffset, or dst methods. + Returns 0 for good argument. Returns -1 and sets exception info + otherwise. + */ +static int +_timezone_check_argument(PyObject *dt, const char *meth) +{ + if (dt == Py_None || PyDateTime_Check(dt)) + return 0; + PyErr_Format(PyExc_TypeError, "%s(dt) argument must be a datetime instance" + " or None, not %.200s", meth, Py_TYPE(dt)->tp_name); + return -1; +} + +static PyObject * +timezone_repr(PyDateTime_TimeZone *self) +{ + /* Note that although timezone is not subclassable, it is convenient + to use Py_TYPE(self)->tp_name here. */ + const char *type_name = Py_TYPE(self)->tp_name; + + if (((PyObject *)self) == PyDateTime_TimeZone_UTC) + return PyUnicode_FromFormat("%s.utc", type_name); + + if (self->name == NULL) + return PyUnicode_FromFormat("%s(%R)", type_name, self->offset); + + return PyUnicode_FromFormat("%s(%R, %R)", type_name, self->offset, + self->name); +} + + +static PyObject * +timezone_str(PyDateTime_TimeZone *self) +{ + char buf[10]; + int hours, minutes, seconds; + PyObject *offset; + char sign; + + if (self->name != NULL) { + Py_INCREF(self->name); + return self->name; + } + /* Offset is normalized, so it is negative if days < 0 */ + if (GET_TD_DAYS(self->offset) < 0) { + sign = '-'; + offset = delta_negative((PyDateTime_Delta *)self->offset); + if (offset == NULL) + return NULL; + } + else { + sign = '+'; + offset = self->offset; + Py_INCREF(offset); + } + /* Offset is not negative here. */ + seconds = GET_TD_SECONDS(offset); + Py_DECREF(offset); + minutes = divmod(seconds, 60, &seconds); + hours = divmod(minutes, 60, &minutes); + assert(seconds == 0); + /* XXX ignore sub-minute data, curently not allowed. */ + PyOS_snprintf(buf, sizeof(buf), "UTC%c%02d:%02d", sign, hours, minutes); + + return PyUnicode_FromString(buf); +} + +static PyObject * +timezone_tzname(PyDateTime_TimeZone *self, PyObject *dt) +{ + if (_timezone_check_argument(dt, "tzname") == -1) + return NULL; + + return timezone_str(self); +} + +static PyObject * +timezone_utcoffset(PyDateTime_TimeZone *self, PyObject *dt) +{ + if (_timezone_check_argument(dt, "utcoffset") == -1) + return NULL; + + Py_INCREF(self->offset); + return self->offset; +} + +static PyObject * +timezone_dst(PyObject *self, PyObject *dt) +{ + if (_timezone_check_argument(dt, "dst") == -1) + return NULL; + + Py_RETURN_NONE; +} + +static PyObject * +timezone_fromutc(PyDateTime_TimeZone *self, PyDateTime_DateTime *dt) +{ + if (!PyDateTime_Check(dt)) { + PyErr_SetString(PyExc_TypeError, + "fromutc: argument must be a datetime"); + return NULL; + } + if (!HASTZINFO(dt) || dt->tzinfo != (PyObject *)self) { + PyErr_SetString(PyExc_ValueError, "fromutc: dt.tzinfo " + "is not self"); + return NULL; + } + + return add_datetime_timedelta(dt, (PyDateTime_Delta *)self->offset, 1); +} + +static PyObject * +timezone_getinitargs(PyDateTime_TimeZone *self) +{ + if (self->name == NULL) + return Py_BuildValue("(O)", self->offset); + return Py_BuildValue("(OO)", self->offset, self->name); +} + +static PyMethodDef timezone_methods[] = { + {"tzname", (PyCFunction)timezone_tzname, METH_O, + PyDoc_STR("If name is specified when timezone is created, returns the name." + " Otherwise returns offset as 'UTC(+|-)HH:MM'.")}, + + {"utcoffset", (PyCFunction)timezone_utcoffset, METH_O, + PyDoc_STR("Return fixed offset.")}, + + {"dst", (PyCFunction)timezone_dst, METH_O, + PyDoc_STR("Return None.")}, + + {"fromutc", (PyCFunction)timezone_fromutc, METH_O, + PyDoc_STR("datetime in UTC -> datetime in local time.")}, + + {"__getinitargs__", (PyCFunction)timezone_getinitargs, METH_NOARGS, + PyDoc_STR("pickle support")}, + + {NULL, NULL} +}; + +static char timezone_doc[] = +PyDoc_STR("Fixed offset from UTC implementation of tzinfo."); + +static PyTypeObject PyDateTime_TimeZoneType = { + PyVarObject_HEAD_INIT(NULL, 0) + "datetime.timezone", /* tp_name */ + sizeof(PyDateTime_TimeZone), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)timezone_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_reserved */ + (reprfunc)timezone_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)timezone_hash, /* tp_hash */ + 0, /* tp_call */ + (reprfunc)timezone_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + timezone_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + (richcmpfunc)timezone_richcompare,/* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + timezone_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + &PyDateTime_TZInfoType, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + timezone_new, /* tp_new */ +}; + /* * PyDateTime_Time implementation. */ @@ -3092,26 +3457,26 @@ statichere PyTypeObject PyDateTime_TZInfoType = { static PyObject * time_hour(PyDateTime_Time *self, void *unused) { - return PyInt_FromLong(TIME_GET_HOUR(self)); + return PyLong_FromLong(TIME_GET_HOUR(self)); } static PyObject * time_minute(PyDateTime_Time *self, void *unused) { - return PyInt_FromLong(TIME_GET_MINUTE(self)); + return PyLong_FromLong(TIME_GET_MINUTE(self)); } /* The name time_second conflicted with some platform header file. */ static PyObject * py_time_second(PyDateTime_Time *self, void *unused) { - return PyInt_FromLong(TIME_GET_SECOND(self)); + return PyLong_FromLong(TIME_GET_SECOND(self)); } static PyObject * time_microsecond(PyDateTime_Time *self, void *unused) { - return PyInt_FromLong(TIME_GET_MICROSECOND(self)); + return PyLong_FromLong(TIME_GET_MICROSECOND(self)); } static PyObject * @@ -3152,9 +3517,9 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw) /* Check for invocation from pickle with __getstate__ state */ if (PyTuple_GET_SIZE(args) >= 1 && PyTuple_GET_SIZE(args) <= 2 && - PyString_Check(state = PyTuple_GET_ITEM(args, 0)) && - PyString_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE && - ((unsigned char) (PyString_AS_STRING(state)[0])) < 24) + PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) && + PyBytes_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE && + ((unsigned char) (PyBytes_AS_STRING(state)[0])) < 24) { PyDateTime_Time *me; char aware; @@ -3170,7 +3535,7 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw) aware = (char)(tzinfo != Py_None); me = (PyDateTime_Time *) (type->tp_alloc(type, aware)); if (me != NULL) { - char *pdata = PyString_AS_STRING(state); + char *pdata = PyBytes_AS_STRING(state); memcpy(me->data, pdata, _PyDateTime_TIME_DATASIZE); me->hashcode = -1; @@ -3215,21 +3580,18 @@ time_dealloc(PyDateTime_Time *self) /* These are all METH_NOARGS, so don't need to check the arglist. */ static PyObject * -time_utcoffset(PyDateTime_Time *self, PyObject *unused) { - return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None, - "utcoffset", Py_None); +time_utcoffset(PyObject *self, PyObject *unused) { + return call_utcoffset(GET_TIME_TZINFO(self), Py_None); } static PyObject * -time_dst(PyDateTime_Time *self, PyObject *unused) { - return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None, - "dst", Py_None); +time_dst(PyObject *self, PyObject *unused) { + return call_dst(GET_TIME_TZINFO(self), Py_None); } static PyObject * time_tzname(PyDateTime_Time *self, PyObject *unused) { - return call_tzname(HASTZINFO(self) ? self->tzinfo : Py_None, - Py_None); + return call_tzname(GET_TIME_TZINFO(self), Py_None); } /* @@ -3239,7 +3601,6 @@ time_tzname(PyDateTime_Time *self, PyObject *unused) { static PyObject * time_repr(PyDateTime_Time *self) { - char buffer[100]; const char *type_name = Py_TYPE(self)->tp_name; int h = TIME_GET_HOUR(self); int m = TIME_GET_MINUTE(self); @@ -3248,15 +3609,13 @@ time_repr(PyDateTime_Time *self) PyObject *result = NULL; if (us) - PyOS_snprintf(buffer, sizeof(buffer), - "%s(%d, %d, %d, %d)", type_name, h, m, s, us); + result = PyUnicode_FromFormat("%s(%d, %d, %d, %d)", + type_name, h, m, s, us); else if (s) - PyOS_snprintf(buffer, sizeof(buffer), - "%s(%d, %d, %d)", type_name, h, m, s); + result = PyUnicode_FromFormat("%s(%d, %d, %d)", + type_name, h, m, s); else - PyOS_snprintf(buffer, sizeof(buffer), - "%s(%d, %d)", type_name, h, m); - result = PyString_FromString(buffer); + result = PyUnicode_FromFormat("%s(%d, %d)", type_name, h, m); if (result != NULL && HASTZINFO(self)) result = append_keyword_tzinfo(result, self->tzinfo); return result; @@ -3273,18 +3632,21 @@ time_isoformat(PyDateTime_Time *self, PyObject *unused) { char buf[100]; PyObject *result; - /* Reuse the time format code from the datetime type. */ - PyDateTime_DateTime datetime; - PyDateTime_DateTime *pdatetime = &datetime; - - /* Copy over just the time bytes. */ - memcpy(pdatetime->data + _PyDateTime_DATE_DATASIZE, - self->data, - _PyDateTime_TIME_DATASIZE); - - isoformat_time(pdatetime, buf, sizeof(buf)); - result = PyString_FromString(buf); - if (result == NULL || ! HASTZINFO(self) || self->tzinfo == Py_None) + int us = TIME_GET_MICROSECOND(self);; + + if (us) + result = PyUnicode_FromFormat("%02d:%02d:%02d.%06d", + TIME_GET_HOUR(self), + TIME_GET_MINUTE(self), + TIME_GET_SECOND(self), + us); + else + result = PyUnicode_FromFormat("%02d:%02d:%02d", + TIME_GET_HOUR(self), + TIME_GET_MINUTE(self), + TIME_GET_SECOND(self)); + + if (result == NULL || !HASTZINFO(self) || self->tzinfo == Py_None) return result; /* We need to append the UTC offset. */ @@ -3293,7 +3655,7 @@ time_isoformat(PyDateTime_Time *self, PyObject *unused) Py_DECREF(result); return NULL; } - PyString_ConcatAndDel(&result, PyString_FromString(buf)); + PyUnicode_AppendAndDel(&result, PyUnicode_FromString(buf)); return result; } @@ -3302,17 +3664,16 @@ time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw) { PyObject *result; PyObject *tuple; - const char *format; - Py_ssize_t format_len; + PyObject *format; static char *keywords[] = {"format", NULL}; - if (! PyArg_ParseTupleAndKeywords(args, kw, "s#:strftime", keywords, - &format, &format_len)) + if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords, + &format)) return NULL; /* Python's strftime does insane things with the year part of the * timetuple. The year is forced to (the otherwise nonsensical) - * 1900 to worm around that. + * 1900 to work around that. */ tuple = Py_BuildValue("iiiiiiiii", 1900, 1, 1, /* year, month, day */ @@ -3323,7 +3684,7 @@ time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw) if (tuple == NULL) return NULL; assert(PyTuple_Size(tuple) == 9); - result = wrap_strftime((PyObject *)self, format, format_len, tuple, + result = wrap_strftime((PyObject *)self, format, tuple, Py_None); Py_DECREF(tuple); return result; @@ -3333,107 +3694,111 @@ time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw) * Miscellaneous methods. */ -/* This is more natural as a tp_compare, but doesn't work then: for whatever - * reason, Python's try_3way_compare ignores tp_compare unless - * PyInstance_Check returns true, but these aren't old-style classes. - */ static PyObject * -time_richcompare(PyDateTime_Time *self, PyObject *other, int op) +time_richcompare(PyObject *self, PyObject *other, int op) { + PyObject *result = NULL; + PyObject *offset1, *offset2; int diff; - naivety n1, n2; - int offset1, offset2; if (! PyTime_Check(other)) { - if (op == Py_EQ || op == Py_NE) { - PyObject *result = op == Py_EQ ? Py_False : Py_True; - Py_INCREF(result); - return result; - } - /* Stop this from falling back to address comparison. */ - return cmperror((PyObject *)self, other); + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + + if (GET_TIME_TZINFO(self) == GET_TIME_TZINFO(other)) { + diff = memcmp(((PyDateTime_Time *)self)->data, + ((PyDateTime_Time *)other)->data, + _PyDateTime_TIME_DATASIZE); + return diff_to_bool(diff, op); } - if (classify_two_utcoffsets((PyObject *)self, &offset1, &n1, Py_None, - other, &offset2, &n2, Py_None) < 0) + offset1 = time_utcoffset(self, NULL); + if (offset1 == NULL) return NULL; - assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN); + offset2 = time_utcoffset(other, NULL); + if (offset2 == NULL) + goto done; /* If they're both naive, or both aware and have the same offsets, * we get off cheap. Note that if they're both naive, offset1 == - * offset2 == 0 at this point. + * offset2 == Py_None at this point. */ - if (n1 == n2 && offset1 == offset2) { - diff = memcmp(self->data, ((PyDateTime_Time *)other)->data, + if ((offset1 == offset2) || + (PyDelta_Check(offset1) && PyDelta_Check(offset2) && + delta_cmp(offset1, offset2) == 0)) { + diff = memcmp(((PyDateTime_Time *)self)->data, + ((PyDateTime_Time *)other)->data, _PyDateTime_TIME_DATASIZE); - return diff_to_bool(diff, op); + result = diff_to_bool(diff, op); } - - if (n1 == OFFSET_AWARE && n2 == OFFSET_AWARE) { - assert(offset1 != offset2); /* else last "if" handled it */ - /* Convert everything except microseconds to seconds. These - * can't overflow (no more than the # of seconds in 2 days). - */ - offset1 = TIME_GET_HOUR(self) * 3600 + - (TIME_GET_MINUTE(self) - offset1) * 60 + - TIME_GET_SECOND(self); - offset2 = TIME_GET_HOUR(other) * 3600 + - (TIME_GET_MINUTE(other) - offset2) * 60 + - TIME_GET_SECOND(other); - diff = offset1 - offset2; + /* The hard case: both aware with different UTC offsets */ + else if (offset1 != Py_None && offset2 != Py_None) { + int offsecs1, offsecs2; + assert(offset1 != offset2); /* else last "if" handled it */ + offsecs1 = TIME_GET_HOUR(self) * 3600 + + TIME_GET_MINUTE(self) * 60 + + TIME_GET_SECOND(self) - + GET_TD_DAYS(offset1) * 86400 - + GET_TD_SECONDS(offset1); + offsecs2 = TIME_GET_HOUR(other) * 3600 + + TIME_GET_MINUTE(other) * 60 + + TIME_GET_SECOND(other) - + GET_TD_DAYS(offset2) * 86400 - + GET_TD_SECONDS(offset2); + diff = offsecs1 - offsecs2; if (diff == 0) diff = TIME_GET_MICROSECOND(self) - TIME_GET_MICROSECOND(other); - return diff_to_bool(diff, op); + result = diff_to_bool(diff, op); } - - assert(n1 != n2); - PyErr_SetString(PyExc_TypeError, - "can't compare offset-naive and " - "offset-aware times"); - return NULL; + else { + PyErr_SetString(PyExc_TypeError, + "can't compare offset-naive and " + "offset-aware times"); + } + done: + Py_DECREF(offset1); + Py_XDECREF(offset2); + return result; } -static long +static Py_hash_t time_hash(PyDateTime_Time *self) { if (self->hashcode == -1) { - naivety n; - int offset; - PyObject *temp; + PyObject *offset; - n = classify_utcoffset((PyObject *)self, Py_None, &offset); - assert(n != OFFSET_UNKNOWN); - if (n == OFFSET_ERROR) + offset = time_utcoffset((PyObject *)self, NULL); + + if (offset == NULL) return -1; /* Reduce this to a hash of another object. */ - if (offset == 0) - temp = PyString_FromStringAndSize((char *)self->data, - _PyDateTime_TIME_DATASIZE); + if (offset == Py_None) + self->hashcode = generic_hash( + (unsigned char *)self->data, _PyDateTime_TIME_DATASIZE); else { - int hour; - int minute; - - assert(n == OFFSET_AWARE); + PyObject *temp1, *temp2; + int seconds, microseconds; assert(HASTZINFO(self)); - hour = divmod(TIME_GET_HOUR(self) * 60 + - TIME_GET_MINUTE(self) - offset, - 60, - &minute); - if (0 <= hour && hour < 24) - temp = new_time(hour, minute, - TIME_GET_SECOND(self), - TIME_GET_MICROSECOND(self), - Py_None); - else - temp = Py_BuildValue("iiii", - hour, minute, - TIME_GET_SECOND(self), - TIME_GET_MICROSECOND(self)); - } - if (temp != NULL) { - self->hashcode = PyObject_Hash(temp); - Py_DECREF(temp); + seconds = TIME_GET_HOUR(self) * 3600 + + TIME_GET_MINUTE(self) * 60 + + TIME_GET_SECOND(self); + microseconds = TIME_GET_MICROSECOND(self); + temp1 = new_delta(0, seconds, microseconds, 1); + if (temp1 == NULL) { + Py_DECREF(offset); + return -1; + } + temp2 = delta_subtract(temp1, offset); + Py_DECREF(temp1); + if (temp2 == NULL) { + Py_DECREF(offset); + return -1; + } + self->hashcode = PyObject_Hash(temp2); + Py_DECREF(temp2); } + Py_DECREF(offset); } return self->hashcode; } @@ -3462,10 +3827,10 @@ time_replace(PyDateTime_Time *self, PyObject *args, PyObject *kw) } static int -time_nonzero(PyDateTime_Time *self) +time_bool(PyObject *self) { - int offset; - int none; + PyObject *offset, *tzinfo; + int offsecs = 0; if (TIME_GET_SECOND(self) || TIME_GET_MICROSECOND(self)) { /* Since utcoffset is in whole minutes, nothing can @@ -3473,13 +3838,15 @@ time_nonzero(PyDateTime_Time *self) */ return 1; } - offset = 0; - if (HASTZINFO(self) && self->tzinfo != Py_None) { - offset = call_utcoffset(self->tzinfo, Py_None, &none); - if (offset == -1 && PyErr_Occurred()) + tzinfo = GET_TIME_TZINFO(self); + if (tzinfo != Py_None) { + offset = call_utcoffset(tzinfo, Py_None); + if (offset == NULL) return -1; + offsecs = GET_TD_DAYS(offset)*86400 + GET_TD_SECONDS(offset); + Py_DECREF(offset); } - return (TIME_GET_MINUTE(self) - offset + TIME_GET_HOUR(self)*60) != 0; + return (TIME_GET_MINUTE(self)*60 - offsecs + TIME_GET_HOUR(self)*3600) != 0; } /* Pickle support, a simple use of __reduce__. */ @@ -3495,7 +3862,7 @@ time_getstate(PyDateTime_Time *self) PyObject *basestate; PyObject *result = NULL; - basestate = PyString_FromStringAndSize((char *)self->data, + basestate = PyBytes_FromStringAndSize((char *)self->data, _PyDateTime_TIME_DATASIZE); if (basestate != NULL) { if (! HASTZINFO(self) || self->tzinfo == Py_None) @@ -3553,19 +3920,17 @@ static PyNumberMethods time_as_number = { 0, /* nb_add */ 0, /* nb_subtract */ 0, /* nb_multiply */ - 0, /* nb_divide */ 0, /* nb_remainder */ 0, /* nb_divmod */ 0, /* nb_power */ 0, /* nb_negative */ 0, /* nb_positive */ 0, /* nb_absolute */ - (inquiry)time_nonzero, /* nb_nonzero */ + (inquiry)time_bool, /* nb_bool */ }; -statichere PyTypeObject PyDateTime_TimeType = { - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ +static PyTypeObject PyDateTime_TimeType = { + PyVarObject_HEAD_INIT(NULL, 0) "datetime.time", /* tp_name */ sizeof(PyDateTime_Time), /* tp_basicsize */ 0, /* tp_itemsize */ @@ -3573,7 +3938,7 @@ statichere PyTypeObject PyDateTime_TimeType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)time_repr, /* tp_repr */ &time_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3584,12 +3949,11 @@ statichere PyTypeObject PyDateTime_TimeType = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | - Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ time_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ - (richcmpfunc)time_richcompare, /* tp_richcompare */ + time_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ @@ -3618,25 +3982,25 @@ statichere PyTypeObject PyDateTime_TimeType = { static PyObject * datetime_hour(PyDateTime_DateTime *self, void *unused) { - return PyInt_FromLong(DATE_GET_HOUR(self)); + return PyLong_FromLong(DATE_GET_HOUR(self)); } static PyObject * datetime_minute(PyDateTime_DateTime *self, void *unused) { - return PyInt_FromLong(DATE_GET_MINUTE(self)); + return PyLong_FromLong(DATE_GET_MINUTE(self)); } static PyObject * datetime_second(PyDateTime_DateTime *self, void *unused) { - return PyInt_FromLong(DATE_GET_SECOND(self)); + return PyLong_FromLong(DATE_GET_SECOND(self)); } static PyObject * datetime_microsecond(PyDateTime_DateTime *self, void *unused) { - return PyInt_FromLong(DATE_GET_MICROSECOND(self)); + return PyLong_FromLong(DATE_GET_MICROSECOND(self)); } static PyObject * @@ -3682,9 +4046,9 @@ datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw) /* Check for invocation from pickle with __getstate__ state */ if (PyTuple_GET_SIZE(args) >= 1 && PyTuple_GET_SIZE(args) <= 2 && - PyString_Check(state = PyTuple_GET_ITEM(args, 0)) && - PyString_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE && - MONTH_IS_SANE(PyString_AS_STRING(state)[2])) + PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) && + PyBytes_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE && + MONTH_IS_SANE(PyBytes_AS_STRING(state)[2])) { PyDateTime_DateTime *me; char aware; @@ -3700,7 +4064,7 @@ datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw) aware = (char)(tzinfo != Py_None); me = (PyDateTime_DateTime *) (type->tp_alloc(type , aware)); if (me != NULL) { - char *pdata = PyString_AS_STRING(state); + char *pdata = PyBytes_AS_STRING(state); memcpy(me->data, pdata, _PyDateTime_DATETIME_DATASIZE); me->hashcode = -1; @@ -3813,37 +4177,10 @@ datetime_from_timestamp(PyObject *cls, TM_FUNC f, double timestamp, static PyObject * datetime_best_possible(PyObject *cls, TM_FUNC f, PyObject *tzinfo) { -#ifdef HAVE_GETTIMEOFDAY - struct timeval t; - -#ifdef GETTIMEOFDAY_NO_TZ - gettimeofday(&t); -#else - gettimeofday(&t, (struct timezone *)NULL); -#endif + _PyTime_timeval t; + _PyTime_gettimeofday(&t); return datetime_from_timet_and_us(cls, f, t.tv_sec, (int)t.tv_usec, tzinfo); - -#else /* ! HAVE_GETTIMEOFDAY */ - /* No flavor of gettimeofday exists on this platform. Python's - * time.time() does a lot of other platform tricks to get the - * best time it can on the platform, and we're not going to do - * better than that (if we could, the better code would belong - * in time.time()!) We're limited by the precision of a double, - * though. - */ - PyObject *time; - double dtime; - - time = time_time(); - if (time == NULL) - return NULL; - dtime = PyFloat_AsDouble(time); - Py_DECREF(time); - if (dtime == -1.0 && PyErr_Occurred()) - return NULL; - return datetime_from_timestamp(cls, f, dtime, tzinfo); -#endif /* ! HAVE_GETTIMEOFDAY */ } /* Return best possible local time -- this isn't constrained by the @@ -3924,74 +4261,23 @@ datetime_utcfromtimestamp(PyObject *cls, PyObject *args) return result; } -/* Return new datetime from time.strptime(). */ +/* Return new datetime from _strptime.strptime_datetime(). */ static PyObject * datetime_strptime(PyObject *cls, PyObject *args) { static PyObject *module = NULL; - PyObject *result = NULL, *obj, *st = NULL, *frac = NULL; - const char *string, *format; + const Py_UNICODE *string, *format; - if (!PyArg_ParseTuple(args, "ss:strptime", &string, &format)) + if (!PyArg_ParseTuple(args, "uu:strptime", &string, &format)) return NULL; - if (module == NULL && - (module = PyImport_ImportModuleNoBlock("_strptime")) == NULL) - return NULL; - - /* _strptime._strptime returns a two-element tuple. The first - element is a time.struct_time object. The second is the - microseconds (which are not defined for time.struct_time). */ - obj = PyObject_CallMethod(module, "_strptime", "ss", string, format); - if (obj != NULL) { - int i, good_timetuple = 1; - long int ia[7]; - if (PySequence_Check(obj) && PySequence_Size(obj) == 2) { - st = PySequence_GetItem(obj, 0); - frac = PySequence_GetItem(obj, 1); - if (st == NULL || frac == NULL) - good_timetuple = 0; - /* copy y/m/d/h/m/s values out of the - time.struct_time */ - if (good_timetuple && - PySequence_Check(st) && - PySequence_Size(st) >= 6) { - for (i=0; i < 6; i++) { - PyObject *p = PySequence_GetItem(st, i); - if (p == NULL) { - good_timetuple = 0; - break; - } - if (PyInt_Check(p)) - ia[i] = PyInt_AsLong(p); - else - good_timetuple = 0; - Py_DECREF(p); - } - } - else - good_timetuple = 0; - /* follow that up with a little dose of microseconds */ - if (good_timetuple && PyInt_Check(frac)) - ia[6] = PyInt_AsLong(frac); - else - good_timetuple = 0; - } - else - good_timetuple = 0; - if (good_timetuple) - result = PyObject_CallFunction(cls, "iiiiiii", - ia[0], ia[1], ia[2], - ia[3], ia[4], ia[5], - ia[6]); - else - PyErr_SetString(PyExc_ValueError, - "unexpected value from _strptime._strptime"); + if (module == NULL) { + module = PyImport_ImportModuleNoBlock("_strptime"); + if (module == NULL) + return NULL; } - Py_XDECREF(obj); - Py_XDECREF(st); - Py_XDECREF(frac); - return result; + return PyObject_CallMethod(module, "_strptime_datetime", "Ouu", + cls, string, format); } /* Return new datetime from date/datetime and time arguments. */ @@ -4042,21 +4328,18 @@ datetime_dealloc(PyDateTime_DateTime *self) /* These are all METH_NOARGS, so don't need to check the arglist. */ static PyObject * -datetime_utcoffset(PyDateTime_DateTime *self, PyObject *unused) { - return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None, - "utcoffset", (PyObject *)self); +datetime_utcoffset(PyObject *self, PyObject *unused) { + return call_utcoffset(GET_DT_TZINFO(self), self); } static PyObject * -datetime_dst(PyDateTime_DateTime *self, PyObject *unused) { - return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None, - "dst", (PyObject *)self); +datetime_dst(PyObject *self, PyObject *unused) { + return call_dst(GET_DT_TZINFO(self), self); } static PyObject * -datetime_tzname(PyDateTime_DateTime *self, PyObject *unused) { - return call_tzname(HASTZINFO(self) ? self->tzinfo : Py_None, - (PyObject *)self); +datetime_tzname(PyObject *self, PyObject *unused) { + return call_tzname(GET_DT_TZINFO(self), self); } /* @@ -4123,21 +4406,43 @@ datetime_subtract(PyObject *left, PyObject *right) /* datetime - ??? */ if (PyDateTime_Check(right)) { /* datetime - datetime */ - naivety n1, n2; - int offset1, offset2; + PyObject *offset1, *offset2, *offdiff = NULL; int delta_d, delta_s, delta_us; - if (classify_two_utcoffsets(left, &offset1, &n1, left, - right, &offset2, &n2, - right) < 0) - return NULL; - assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN); - if (n1 != n2) { - PyErr_SetString(PyExc_TypeError, - "can't subtract offset-naive and " - "offset-aware datetimes"); - return NULL; + if (GET_DT_TZINFO(left) == GET_DT_TZINFO(right)) { + offset2 = offset1 = Py_None; + Py_INCREF(offset1); + Py_INCREF(offset2); } + else { + offset1 = datetime_utcoffset(left, NULL); + if (offset1 == NULL) + return NULL; + offset2 = datetime_utcoffset(right, NULL); + if (offset2 == NULL) { + Py_DECREF(offset1); + return NULL; + } + if ((offset1 != Py_None) != (offset2 != Py_None)) { + PyErr_SetString(PyExc_TypeError, + "can't subtract offset-naive and " + "offset-aware datetimes"); + Py_DECREF(offset1); + Py_DECREF(offset2); + return NULL; + } + } + if ((offset1 != offset2) && + delta_cmp(offset1, offset2) != 0) { + offdiff = delta_subtract(offset1, offset2); + if (offdiff == NULL) { + Py_DECREF(offset1); + Py_DECREF(offset2); + return NULL; + } + } + Py_DECREF(offset1); + Py_DECREF(offset2); delta_d = ymd_to_ord(GET_YEAR(left), GET_MONTH(left), GET_DAY(left)) - @@ -4156,11 +4461,13 @@ datetime_subtract(PyObject *left, PyObject *right) DATE_GET_SECOND(right)); delta_us = DATE_GET_MICROSECOND(left) - DATE_GET_MICROSECOND(right); - /* (left - offset1) - (right - offset2) = - * (left - right) + (offset2 - offset1) - */ - delta_s += (offset2 - offset1) * 60; result = new_delta(delta_d, delta_s, delta_us, 1); + if (offdiff != NULL) { + PyObject *temp = result; + result = delta_subtract(result, offdiff); + Py_DECREF(temp); + Py_DECREF(offdiff); + } } else if (PyDelta_Check(right)) { /* datetime - delta */ @@ -4181,12 +4488,11 @@ datetime_subtract(PyObject *left, PyObject *right) static PyObject * datetime_repr(PyDateTime_DateTime *self) { - char buffer[1000]; const char *type_name = Py_TYPE(self)->tp_name; PyObject *baserepr; if (DATE_GET_MICROSECOND(self)) { - PyOS_snprintf(buffer, sizeof(buffer), + baserepr = PyUnicode_FromFormat( "%s(%d, %d, %d, %d, %d, %d, %d)", type_name, GET_YEAR(self), GET_MONTH(self), GET_DAY(self), @@ -4195,7 +4501,7 @@ datetime_repr(PyDateTime_DateTime *self) DATE_GET_MICROSECOND(self)); } else if (DATE_GET_SECOND(self)) { - PyOS_snprintf(buffer, sizeof(buffer), + baserepr = PyUnicode_FromFormat( "%s(%d, %d, %d, %d, %d, %d)", type_name, GET_YEAR(self), GET_MONTH(self), GET_DAY(self), @@ -4203,13 +4509,12 @@ datetime_repr(PyDateTime_DateTime *self) DATE_GET_SECOND(self)); } else { - PyOS_snprintf(buffer, sizeof(buffer), + baserepr = PyUnicode_FromFormat( "%s(%d, %d, %d, %d, %d)", type_name, GET_YEAR(self), GET_MONTH(self), GET_DAY(self), DATE_GET_HOUR(self), DATE_GET_MINUTE(self)); } - baserepr = PyString_FromString(buffer); if (baserepr == NULL || ! HASTZINFO(self)) return baserepr; return append_keyword_tzinfo(baserepr, self->tzinfo); @@ -4224,21 +4529,28 @@ datetime_str(PyDateTime_DateTime *self) static PyObject * datetime_isoformat(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) { - char sep = 'T'; + int sep = 'T'; static char *keywords[] = {"sep", NULL}; char buffer[100]; - char *cp; PyObject *result; + int us = DATE_GET_MICROSECOND(self); - if (!PyArg_ParseTupleAndKeywords(args, kw, "|c:isoformat", keywords, - &sep)) + if (!PyArg_ParseTupleAndKeywords(args, kw, "|C:isoformat", keywords, &sep)) return NULL; - cp = isoformat_date((PyDateTime_Date *)self, buffer, sizeof(buffer)); - assert(cp != NULL); - *cp++ = sep; - cp = isoformat_time(self, cp, sizeof(buffer) - (cp - buffer)); - result = PyString_FromStringAndSize(buffer, cp - buffer); - if (result == NULL || ! HASTZINFO(self)) + if (us) + result = PyUnicode_FromFormat("%04d-%02d-%02d%c%02d:%02d:%02d.%06d", + GET_YEAR(self), GET_MONTH(self), + GET_DAY(self), (int)sep, + DATE_GET_HOUR(self), DATE_GET_MINUTE(self), + DATE_GET_SECOND(self), us); + else + result = PyUnicode_FromFormat("%04d-%02d-%02d%c%02d:%02d:%02d", + GET_YEAR(self), GET_MONTH(self), + GET_DAY(self), (int)sep, + DATE_GET_HOUR(self), DATE_GET_MINUTE(self), + DATE_GET_SECOND(self)); + + if (!result || !HASTZINFO(self)) return result; /* We need to append the UTC offset. */ @@ -4247,7 +4559,7 @@ datetime_isoformat(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) Py_DECREF(result); return NULL; } - PyString_ConcatAndDel(&result, PyString_FromString(buffer)); + PyUnicode_AppendAndDel(&result, PyUnicode_FromString(buffer)); return result; } @@ -4262,121 +4574,125 @@ datetime_ctime(PyDateTime_DateTime *self) /* Miscellaneous methods. */ -/* This is more natural as a tp_compare, but doesn't work then: for whatever - * reason, Python's try_3way_compare ignores tp_compare unless - * PyInstance_Check returns true, but these aren't old-style classes. - */ static PyObject * -datetime_richcompare(PyDateTime_DateTime *self, PyObject *other, int op) +datetime_richcompare(PyObject *self, PyObject *other, int op) { + PyObject *result = NULL; + PyObject *offset1, *offset2; int diff; - naivety n1, n2; - int offset1, offset2; if (! PyDateTime_Check(other)) { - /* If other has a "timetuple" attr, that's an advertised - * hook for other classes to ask to get comparison control. - * However, date instances have a timetuple attr, and we - * don't want to allow that comparison. Because datetime - * is a subclass of date, when mixing date and datetime - * in a comparison, Python gives datetime the first shot - * (it's the more specific subtype). So we can stop that - * combination here reliably. - */ - if (PyObject_HasAttrString(other, "timetuple") && - ! PyDate_Check(other)) { - /* A hook for other kinds of datetime objects. */ - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; - } - if (op == Py_EQ || op == Py_NE) { - PyObject *result = op == Py_EQ ? Py_False : Py_True; - Py_INCREF(result); - return result; + if (PyDate_Check(other)) { + /* Prevent invocation of date_richcompare. We want to + return NotImplemented here to give the other object + a chance. But since DateTime is a subclass of + Date, if the other object is a Date, it would + compute an ordering based on the date part alone, + and we don't want that. So force unequal or + uncomparable here in that case. */ + if (op == Py_EQ) + Py_RETURN_FALSE; + if (op == Py_NE) + Py_RETURN_TRUE; + return cmperror(self, other); } - /* Stop this from falling back to address comparison. */ - return cmperror((PyObject *)self, other); + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; } - if (classify_two_utcoffsets((PyObject *)self, &offset1, &n1, - (PyObject *)self, - other, &offset2, &n2, - other) < 0) + if (GET_DT_TZINFO(self) == GET_DT_TZINFO(other)) { + diff = memcmp(((PyDateTime_DateTime *)self)->data, + ((PyDateTime_DateTime *)other)->data, + _PyDateTime_DATETIME_DATASIZE); + return diff_to_bool(diff, op); + } + offset1 = datetime_utcoffset(self, NULL); + if (offset1 == NULL) return NULL; - assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN); + offset2 = datetime_utcoffset(other, NULL); + if (offset2 == NULL) + goto done; /* If they're both naive, or both aware and have the same offsets, * we get off cheap. Note that if they're both naive, offset1 == - * offset2 == 0 at this point. + * offset2 == Py_None at this point. */ - if (n1 == n2 && offset1 == offset2) { - diff = memcmp(self->data, ((PyDateTime_DateTime *)other)->data, + if ((offset1 == offset2) || + (PyDelta_Check(offset1) && PyDelta_Check(offset2) && + delta_cmp(offset1, offset2) == 0)) { + diff = memcmp(((PyDateTime_DateTime *)self)->data, + ((PyDateTime_DateTime *)other)->data, _PyDateTime_DATETIME_DATASIZE); - return diff_to_bool(diff, op); + result = diff_to_bool(diff, op); } - - if (n1 == OFFSET_AWARE && n2 == OFFSET_AWARE) { + else if (offset1 != Py_None && offset2 != Py_None) { PyDateTime_Delta *delta; - assert(offset1 != offset2); /* else last "if" handled it */ + assert(offset1 != offset2); /* else last "if" handled it */ delta = (PyDateTime_Delta *)datetime_subtract((PyObject *)self, other); if (delta == NULL) - return NULL; + goto done; diff = GET_TD_DAYS(delta); if (diff == 0) diff = GET_TD_SECONDS(delta) | GET_TD_MICROSECONDS(delta); Py_DECREF(delta); - return diff_to_bool(diff, op); + result = diff_to_bool(diff, op); } - - assert(n1 != n2); - PyErr_SetString(PyExc_TypeError, - "can't compare offset-naive and " - "offset-aware datetimes"); - return NULL; + else { + PyErr_SetString(PyExc_TypeError, + "can't compare offset-naive and " + "offset-aware datetimes"); + } + done: + Py_DECREF(offset1); + Py_XDECREF(offset2); + return result; } -static long +static Py_hash_t datetime_hash(PyDateTime_DateTime *self) { if (self->hashcode == -1) { - naivety n; - int offset; - PyObject *temp; - - n = classify_utcoffset((PyObject *)self, (PyObject *)self, - &offset); - assert(n != OFFSET_UNKNOWN); - if (n == OFFSET_ERROR) + PyObject *offset; + + offset = datetime_utcoffset((PyObject *)self, NULL); + + if (offset == NULL) return -1; /* Reduce this to a hash of another object. */ - if (n == OFFSET_NAIVE) - temp = PyString_FromStringAndSize( - (char *)self->data, - _PyDateTime_DATETIME_DATASIZE); + if (offset == Py_None) + self->hashcode = generic_hash( + (unsigned char *)self->data, _PyDateTime_DATETIME_DATASIZE); else { - int days; - int seconds; + PyObject *temp1, *temp2; + int days, seconds; - assert(n == OFFSET_AWARE); assert(HASTZINFO(self)); days = ymd_to_ord(GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); seconds = DATE_GET_HOUR(self) * 3600 + - (DATE_GET_MINUTE(self) - offset) * 60 + + DATE_GET_MINUTE(self) * 60 + DATE_GET_SECOND(self); - temp = new_delta(days, - seconds, - DATE_GET_MICROSECOND(self), - 1); - } - if (temp != NULL) { - self->hashcode = PyObject_Hash(temp); - Py_DECREF(temp); + temp1 = new_delta(days, seconds, + DATE_GET_MICROSECOND(self), + 1); + if (temp1 == NULL) { + Py_DECREF(offset); + return -1; + } + temp2 = delta_subtract(temp1, offset); + Py_DECREF(temp1); + if (temp2 == NULL) { + Py_DECREF(offset); + return -1; + } + self->hashcode = PyObject_Hash(temp2); + Py_DECREF(temp2); } + Py_DECREF(offset); } return self->hashcode; } @@ -4411,10 +4727,9 @@ datetime_replace(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) static PyObject * datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) { - int y, m, d, hh, mm, ss, us; PyObject *result; - int offset, none; - + PyObject *offset; + PyObject *temp; PyObject *tzinfo; static char *keywords[] = {"tz", NULL}; @@ -4432,39 +4747,35 @@ datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) } /* Convert self to UTC. */ - offset = call_utcoffset(self->tzinfo, (PyObject *)self, &none); - if (offset == -1 && PyErr_Occurred()) + offset = datetime_utcoffset((PyObject *)self, NULL); + if (offset == NULL) return NULL; - if (none) - goto NeedAware; + if (offset == Py_None) { + Py_DECREF(offset); + NeedAware: + PyErr_SetString(PyExc_ValueError, "astimezone() cannot be applied to " + "a naive datetime"); + return NULL; + } - y = GET_YEAR(self); - m = GET_MONTH(self); - d = GET_DAY(self); - hh = DATE_GET_HOUR(self); - mm = DATE_GET_MINUTE(self); - ss = DATE_GET_SECOND(self); - us = DATE_GET_MICROSECOND(self); - - mm -= offset; - if ((mm < 0 || mm >= 60) && - normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0) + /* result = self - offset */ + result = add_datetime_timedelta(self, + (PyDateTime_Delta *)offset, -1); + Py_DECREF(offset); + if (result == NULL) return NULL; /* Attach new tzinfo and let fromutc() do the rest. */ - result = new_datetime(y, m, d, hh, mm, ss, us, tzinfo); - if (result != NULL) { - PyObject *temp = result; + temp = ((PyDateTime_DateTime *)result)->tzinfo; + ((PyDateTime_DateTime *)result)->tzinfo = tzinfo; + Py_INCREF(tzinfo); + Py_DECREF(temp); - result = PyObject_CallMethod(tzinfo, "fromutc", "O", temp); - Py_DECREF(temp); - } - return result; + temp = result; + result = PyObject_CallMethod(tzinfo, "fromutc", "O", temp); + Py_DECREF(temp); -NeedAware: - PyErr_SetString(PyExc_ValueError, "astimezone() cannot be applied to " - "a naive datetime"); - return NULL; + return result; } static PyObject * @@ -4473,17 +4784,15 @@ datetime_timetuple(PyDateTime_DateTime *self) int dstflag = -1; if (HASTZINFO(self) && self->tzinfo != Py_None) { - int none; + PyObject * dst; - dstflag = call_dst(self->tzinfo, (PyObject *)self, &none); - if (dstflag == -1 && PyErr_Occurred()) + dst = call_dst(self->tzinfo, (PyObject *)self); + if (dst == NULL) return NULL; - if (none) - dstflag = -1; - else if (dstflag != 0) - dstflag = 1; - + if (dst != Py_None) + dstflag = delta_bool((PyDateTime_Delta *)dst); + Py_DECREF(dst); } return build_struct_time(GET_YEAR(self), GET_MONTH(self), @@ -4519,47 +4828,47 @@ datetime_gettimetz(PyDateTime_DateTime *self) DATE_GET_MINUTE(self), DATE_GET_SECOND(self), DATE_GET_MICROSECOND(self), - HASTZINFO(self) ? self->tzinfo : Py_None); + GET_DT_TZINFO(self)); } static PyObject * datetime_utctimetuple(PyDateTime_DateTime *self) { - int y = GET_YEAR(self); - int m = GET_MONTH(self); - int d = GET_DAY(self); - int hh = DATE_GET_HOUR(self); - int mm = DATE_GET_MINUTE(self); - int ss = DATE_GET_SECOND(self); - int us = 0; /* microseconds are ignored in a timetuple */ - int offset = 0; - - if (HASTZINFO(self) && self->tzinfo != Py_None) { - int none; + int y, m, d, hh, mm, ss; + PyObject *tzinfo; + PyDateTime_DateTime *utcself; - offset = call_utcoffset(self->tzinfo, (PyObject *)self, &none); - if (offset == -1 && PyErr_Occurred()) - return NULL; + tzinfo = GET_DT_TZINFO(self); + if (tzinfo == Py_None) { + utcself = self; + Py_INCREF(utcself); } - /* Even if offset is 0, don't call timetuple() -- tm_isdst should be - * 0 in a UTC timetuple regardless of what dst() says. - */ - if (offset) { - /* Subtract offset minutes & normalize. */ - int stat; - - mm -= offset; - stat = normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us); - if (stat < 0) { - /* At the edges, it's possible we overflowed - * beyond MINYEAR or MAXYEAR. - */ - if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_Clear(); - else + else { + PyObject *offset; + offset = call_utcoffset(tzinfo, (PyObject *)self); + if (offset == NULL) + return NULL; + if (offset == Py_None) { + Py_DECREF(offset); + utcself = self; + Py_INCREF(utcself); + } + else { + utcself = (PyDateTime_DateTime *)add_datetime_timedelta(self, + (PyDateTime_Delta *)offset, -1); + Py_DECREF(offset); + if (utcself == NULL) return NULL; } } + y = GET_YEAR(utcself); + m = GET_MONTH(utcself); + d = GET_DAY(utcself); + hh = DATE_GET_HOUR(utcself); + mm = DATE_GET_MINUTE(utcself); + ss = DATE_GET_SECOND(utcself); + + Py_DECREF(utcself); return build_struct_time(y, m, d, hh, mm, ss, 0); } @@ -4576,8 +4885,8 @@ datetime_getstate(PyDateTime_DateTime *self) PyObject *basestate; PyObject *result = NULL; - basestate = PyString_FromStringAndSize((char *)self->data, - _PyDateTime_DATETIME_DATASIZE); + basestate = PyBytes_FromStringAndSize((char *)self->data, + _PyDateTime_DATETIME_DATASIZE); if (basestate != NULL) { if (! HASTZINFO(self) || self->tzinfo == Py_None) result = PyTuple_Pack(1, basestate); @@ -4681,19 +4990,17 @@ static PyNumberMethods datetime_as_number = { datetime_add, /* nb_add */ datetime_subtract, /* nb_subtract */ 0, /* nb_multiply */ - 0, /* nb_divide */ 0, /* nb_remainder */ 0, /* nb_divmod */ 0, /* nb_power */ 0, /* nb_negative */ 0, /* nb_positive */ 0, /* nb_absolute */ - 0, /* nb_nonzero */ + 0, /* nb_bool */ }; -statichere PyTypeObject PyDateTime_DateTimeType = { - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ +static PyTypeObject PyDateTime_DateTimeType = { + PyVarObject_HEAD_INIT(NULL, 0) "datetime.datetime", /* tp_name */ sizeof(PyDateTime_DateTime), /* tp_basicsize */ 0, /* tp_itemsize */ @@ -4701,7 +5008,7 @@ statichere PyTypeObject PyDateTime_DateTimeType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)datetime_repr, /* tp_repr */ &datetime_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -4712,12 +5019,11 @@ statichere PyTypeObject PyDateTime_DateTimeType = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | - Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ datetime_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ - (richcmpfunc)datetime_richcompare, /* tp_richcompare */ + datetime_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ @@ -4761,45 +5067,60 @@ static PyDateTime_CAPI CAPI = { }; + +static struct PyModuleDef datetimemodule = { + PyModuleDef_HEAD_INIT, + "_datetime", + "Fast implementation of the datetime type.", + -1, + module_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initdatetime(void) +PyInit__datetime(void) { PyObject *m; /* a module object */ PyObject *d; /* its dict */ PyObject *x; + PyObject *delta; - m = Py_InitModule3("datetime", module_methods, - "Fast implementation of the datetime type."); + m = PyModule_Create(&datetimemodule); if (m == NULL) - return; + return NULL; if (PyType_Ready(&PyDateTime_DateType) < 0) - return; + return NULL; if (PyType_Ready(&PyDateTime_DateTimeType) < 0) - return; + return NULL; if (PyType_Ready(&PyDateTime_DeltaType) < 0) - return; + return NULL; if (PyType_Ready(&PyDateTime_TimeType) < 0) - return; + return NULL; if (PyType_Ready(&PyDateTime_TZInfoType) < 0) - return; + return NULL; + if (PyType_Ready(&PyDateTime_TimeZoneType) < 0) + return NULL; /* timedelta values */ d = PyDateTime_DeltaType.tp_dict; x = new_delta(0, 0, 1, 0); if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) - return; + return NULL; Py_DECREF(x); x = new_delta(-MAX_DELTA_DAYS, 0, 0, 0); if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) - return; + return NULL; Py_DECREF(x); x = new_delta(MAX_DELTA_DAYS, 24*3600-1, 1000000-1, 0); if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) - return; + return NULL; Py_DECREF(x); /* date values */ @@ -4807,17 +5128,17 @@ initdatetime(void) x = new_date(1, 1, 1); if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) - return; + return NULL; Py_DECREF(x); x = new_date(MAXYEAR, 12, 31); if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) - return; + return NULL; Py_DECREF(x); x = new_delta(1, 0, 0, 0); if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) - return; + return NULL; Py_DECREF(x); /* time values */ @@ -4825,17 +5146,17 @@ initdatetime(void) x = new_time(0, 0, 0, 0, Py_None); if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) - return; + return NULL; Py_DECREF(x); x = new_time(23, 59, 59, 999999, Py_None); if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) - return; + return NULL; Py_DECREF(x); x = new_delta(0, 0, 1, 0); if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) - return; + return NULL; Py_DECREF(x); /* datetime values */ @@ -4843,17 +5164,47 @@ initdatetime(void) x = new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None); if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) - return; + return NULL; Py_DECREF(x); x = new_datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, Py_None); if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) - return; + return NULL; Py_DECREF(x); x = new_delta(0, 0, 1, 0); if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) - return; + return NULL; + Py_DECREF(x); + + /* timezone values */ + d = PyDateTime_TimeZoneType.tp_dict; + + delta = new_delta(0, 0, 0, 0); + if (delta == NULL) + return NULL; + x = create_timezone(delta, NULL); + Py_DECREF(delta); + if (x == NULL || PyDict_SetItemString(d, "utc", x) < 0) + return NULL; + PyDateTime_TimeZone_UTC = x; + + delta = new_delta(-1, 60, 0, 1); /* -23:59 */ + if (delta == NULL) + return NULL; + x = create_timezone(delta, NULL); + Py_DECREF(delta); + if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) + return NULL; + Py_DECREF(x); + + delta = new_delta(0, (23 * 60 + 59) * 60, 0, 0); /* +23:59 */ + if (delta == NULL) + return NULL; + x = create_timezone(delta, NULL); + Py_DECREF(delta); + if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) + return NULL; Py_DECREF(x); /* module initialization */ @@ -4876,9 +5227,12 @@ initdatetime(void) Py_INCREF(&PyDateTime_TZInfoType); PyModule_AddObject(m, "tzinfo", (PyObject *) &PyDateTime_TZInfoType); + Py_INCREF(&PyDateTime_TimeZoneType); + PyModule_AddObject(m, "timezone", (PyObject *) &PyDateTime_TimeZoneType); + x = PyCapsule_New(&CAPI, PyDateTime_CAPSULE_NAME, NULL); if (x == NULL) - return; + return NULL; PyModule_AddObject(m, "datetime_CAPI", x); /* A 4-year cycle has an extra leap day over what we'd get from @@ -4899,14 +5253,14 @@ initdatetime(void) assert(DI100Y == 25 * DI4Y - 1); assert(DI100Y == days_before_year(100+1)); - us_per_us = PyInt_FromLong(1); - us_per_ms = PyInt_FromLong(1000); - us_per_second = PyInt_FromLong(1000000); - us_per_minute = PyInt_FromLong(60000000); - seconds_per_day = PyInt_FromLong(24 * 3600); + us_per_us = 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 || us_per_minute == NULL || seconds_per_day == NULL) - return; + return NULL; /* The rest are too big for 32-bit ints, but even * us_per_week fits in 40 bits, so doubles should be exact. @@ -4915,7 +5269,8 @@ initdatetime(void) us_per_day = PyLong_FromDouble(86400000000.0); us_per_week = PyLong_FromDouble(604800000000.0); if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL) - return; + return NULL; + return m; } /* --------------------------------------------------------------------------- diff --git a/Modules/dbmmodule.c b/Modules/_dbmmodule.c index f9c99a8b8f0..827acce895b 100644 --- a/Modules/dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -2,6 +2,7 @@ /* DBM module using dictionary interface */ +#define PY_SSIZE_T_CLEAN #include "Python.h" #include <sys/types.h> @@ -97,7 +98,7 @@ static PyObject * dbm_subscript(dbmobject *dp, register PyObject *key) { datum drec, krec; - int tmp_size; + Py_ssize_t tmp_size; if (!PyArg_Parse(key, "s#", &krec.dptr, &tmp_size) ) return NULL; @@ -106,8 +107,7 @@ dbm_subscript(dbmobject *dp, register PyObject *key) check_dbmobject_open(dp); drec = dbm_fetch(dp->di_dbm, krec); if ( drec.dptr == 0 ) { - PyErr_SetString(PyExc_KeyError, - PyString_AS_STRING((PyStringObject *)key)); + PyErr_SetObject(PyExc_KeyError, key); return NULL; } if ( dbm_error(dp->di_dbm) ) { @@ -115,18 +115,18 @@ dbm_subscript(dbmobject *dp, register PyObject *key) PyErr_SetString(DbmError, ""); return NULL; } - return PyString_FromStringAndSize(drec.dptr, drec.dsize); + return PyBytes_FromStringAndSize(drec.dptr, drec.dsize); } static int dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w) { datum krec, drec; - int tmp_size; + Py_ssize_t tmp_size; if ( !PyArg_Parse(v, "s#", &krec.dptr, &tmp_size) ) { PyErr_SetString(PyExc_TypeError, - "dbm mappings have string indices only"); + "dbm mappings have bytes or string keys only"); return -1; } krec.dsize = tmp_size; @@ -138,14 +138,13 @@ dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w) if (w == NULL) { if ( dbm_delete(dp->di_dbm, krec) < 0 ) { dbm_clearerr(dp->di_dbm); - PyErr_SetString(PyExc_KeyError, - PyString_AS_STRING((PyStringObject *)v)); + PyErr_SetObject(PyExc_KeyError, v); return -1; } } else { if ( !PyArg_Parse(w, "s#", &drec.dptr, &tmp_size) ) { PyErr_SetString(PyExc_TypeError, - "dbm mappings have string elements only"); + "dbm mappings have byte or string elements only"); return -1; } drec.dsize = tmp_size; @@ -164,38 +163,6 @@ dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w) return 0; } -static int -dbm_contains(register dbmobject *dp, PyObject *v) -{ - datum key, val; - - if (PyString_AsStringAndSize(v, (char **)&key.dptr, - (Py_ssize_t *)&key.dsize)) { - return -1; - } - - /* Expand check_dbmobject_open to return -1 */ - if (dp->di_dbm == NULL) { - PyErr_SetString(DbmError, "DBM object has already been closed"); - return -1; - } - val = dbm_fetch(dp->di_dbm, key); - return val.dptr != NULL; -} - -static PySequenceMethods dbm_as_sequence = { - (lenfunc)dbm_length, /*_length*/ - 0, /*sq_concat*/ - 0, /*sq_repeat*/ - 0, /*sq_item*/ - 0, /*sq_slice*/ - 0, /*sq_ass_item*/ - 0, /*sq_ass_slice*/ - (objobjproc)dbm_contains, /*sq_contains*/ - 0, /*sq_inplace_concat*/ - 0 /*sq_inplace_repeat*/ -}; - static PyMappingMethods dbm_as_mapping = { (lenfunc)dbm_length, /*mp_length*/ (binaryfunc)dbm_subscript, /*mp_subscript*/ @@ -225,7 +192,7 @@ dbm_keys(register dbmobject *dp, PyObject *unused) return NULL; for (key = dbm_firstkey(dp->di_dbm); key.dptr; key = dbm_nextkey(dp->di_dbm)) { - item = PyString_FromStringAndSize(key.dptr, key.dsize); + item = PyBytes_FromStringAndSize(key.dptr, key.dsize); if (item == NULL) { Py_DECREF(v); return NULL; @@ -240,29 +207,54 @@ dbm_keys(register dbmobject *dp, PyObject *unused) return v; } -static PyObject * -dbm_has_key(register dbmobject *dp, PyObject *args) +static int +dbm_contains(PyObject *self, PyObject *arg) { - char *tmp_ptr; + dbmobject *dp = (dbmobject *)self; datum key, val; - int tmp_size; - if (!PyArg_ParseTuple(args, "s#:has_key", &tmp_ptr, &tmp_size)) - return NULL; - key.dptr = tmp_ptr; - key.dsize = tmp_size; - check_dbmobject_open(dp); + if ((dp)->di_dbm == NULL) { + PyErr_SetString(DbmError, + "DBM object has already been closed"); + return -1; + } + if (PyUnicode_Check(arg)) { + arg = _PyUnicode_AsDefaultEncodedString(arg, NULL); + if (arg == NULL) + return -1; + } + if (!PyBytes_Check(arg)) { + PyErr_Format(PyExc_TypeError, + "dbm key must be string, not %.100s", + arg->ob_type->tp_name); + return -1; + } + key.dptr = PyBytes_AS_STRING(arg); + key.dsize = PyBytes_GET_SIZE(arg); val = dbm_fetch(dp->di_dbm, key); - return PyInt_FromLong(val.dptr != NULL); + return val.dptr != NULL; } +static PySequenceMethods dbm_as_sequence = { + 0, /* sq_length */ + 0, /* sq_concat */ + 0, /* sq_repeat */ + 0, /* sq_item */ + 0, /* sq_slice */ + 0, /* sq_ass_item */ + 0, /* sq_ass_slice */ + dbm_contains, /* sq_contains */ + 0, /* sq_inplace_concat */ + 0, /* sq_inplace_repeat */ +}; + static PyObject * dbm_get(register dbmobject *dp, PyObject *args) { datum key, val; PyObject *defvalue = Py_None; char *tmp_ptr; - int tmp_size; + Py_ssize_t tmp_size; if (!PyArg_ParseTuple(args, "s#|O:get", &tmp_ptr, &tmp_size, &defvalue)) @@ -272,7 +264,7 @@ dbm_get(register dbmobject *dp, PyObject *args) check_dbmobject_open(dp); val = dbm_fetch(dp->di_dbm, key); if (val.dptr != NULL) - return PyString_FromStringAndSize(val.dptr, val.dsize); + return PyBytes_FromStringAndSize(val.dptr, val.dsize); else { Py_INCREF(defvalue); return defvalue; @@ -285,9 +277,9 @@ dbm_setdefault(register dbmobject *dp, PyObject *args) datum key, val; PyObject *defvalue = NULL; char *tmp_ptr; - int tmp_size; + Py_ssize_t tmp_size; - if (!PyArg_ParseTuple(args, "s#|S:setdefault", + if (!PyArg_ParseTuple(args, "s#|O:setdefault", &tmp_ptr, &tmp_size, &defvalue)) return NULL; key.dptr = tmp_ptr; @@ -295,19 +287,27 @@ dbm_setdefault(register dbmobject *dp, PyObject *args) check_dbmobject_open(dp); val = dbm_fetch(dp->di_dbm, key); if (val.dptr != NULL) - return PyString_FromStringAndSize(val.dptr, val.dsize); + return PyBytes_FromStringAndSize(val.dptr, val.dsize); if (defvalue == NULL) { - defvalue = PyString_FromStringAndSize(NULL, 0); + defvalue = PyBytes_FromStringAndSize(NULL, 0); if (defvalue == NULL) return NULL; + val.dptr = NULL; + val.dsize = 0; } - else + else { + if ( !PyArg_Parse(defvalue, "s#", &val.dptr, &tmp_size) ) { + PyErr_SetString(PyExc_TypeError, + "dbm mappings have byte string elements only"); + return NULL; + } + val.dsize = tmp_size; Py_INCREF(defvalue); - val.dptr = PyString_AS_STRING(defvalue); - val.dsize = PyString_GET_SIZE(defvalue); + } if (dbm_store(dp->di_dbm, key, val, DBM_INSERT) < 0) { dbm_clearerr(dp->di_dbm); PyErr_SetString(DbmError, "cannot add item to database"); + Py_DECREF(defvalue); return NULL; } return defvalue; @@ -318,8 +318,6 @@ static PyMethodDef dbm_methods[] = { "close()\nClose the database."}, {"keys", (PyCFunction)dbm_keys, METH_NOARGS, "keys() -> list\nReturn a list of all keys in the database."}, - {"has_key", (PyCFunction)dbm_has_key, METH_VARARGS, - "has_key(key} -> boolean\nReturn true iff key is in the database."}, {"get", (PyCFunction)dbm_get, METH_VARARGS, "get(key[, default]) -> value\n" "Return the value for key if present, otherwise default."}, @@ -330,25 +328,19 @@ static PyMethodDef dbm_methods[] = { {NULL, NULL} /* sentinel */ }; -static PyObject * -dbm_getattr(dbmobject *dp, char *name) -{ - return Py_FindMethod(dbm_methods, (PyObject *)dp, name); -} - static PyTypeObject Dbmtype = { PyVarObject_HEAD_INIT(NULL, 0) - "dbm.dbm", + "_dbm.dbm", sizeof(dbmobject), 0, (destructor)dbm_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)dbm_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ - &dbm_as_sequence, /*tp_as_sequence*/ + &dbm_as_sequence, /*tp_as_sequence*/ &dbm_as_mapping, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ @@ -356,7 +348,15 @@ static PyTypeObject Dbmtype = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_xxx4*/ + 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*/ + dbm_methods, /*tp_methods*/ }; /* ----------------------------------------------------------------- */ @@ -396,22 +396,42 @@ static PyMethodDef dbmmodule_methods[] = { { 0, 0 }, }; + +static struct PyModuleDef _dbmmodule = { + PyModuleDef_HEAD_INIT, + "_dbm", + NULL, + -1, + dbmmodule_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initdbm(void) { +PyInit__dbm(void) { PyObject *m, *d, *s; - Dbmtype.ob_type = &PyType_Type; - m = Py_InitModule("dbm", dbmmodule_methods); + if (PyType_Ready(&Dbmtype) < 0) + return NULL; + m = PyModule_Create(&_dbmmodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); if (DbmError == NULL) - DbmError = PyErr_NewException("dbm.error", NULL, NULL); - s = PyString_FromString(which_dbm); + DbmError = PyErr_NewException("_dbm.error", + PyExc_IOError, NULL); + s = PyUnicode_FromString(which_dbm); if (s != NULL) { PyDict_SetItemString(d, "library", s); Py_DECREF(s); } if (DbmError != NULL) PyDict_SetItemString(d, "error", DbmError); + if (PyErr_Occurred()) { + Py_DECREF(m); + m = NULL; + } + return m; } diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 379aa01d0a5..c36af5d1261 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -174,7 +174,7 @@ list_join(PyObject* list) switch (PyList_GET_SIZE(list)) { case 0: Py_DECREF(list); - return PyString_FromString(""); + return PyBytes_FromString(""); case 1: result = PyList_GET_ITEM(list, 0); Py_INCREF(result); @@ -251,7 +251,7 @@ typedef struct { } ElementObject; -staticforward PyTypeObject Element_Type; +static PyTypeObject Element_Type; #define Element_CheckExact(op) (Py_TYPE(op) == &Element_Type) @@ -693,7 +693,7 @@ element_deepcopy(ElementObject* self, PyObject* args) } /* add object to memo dictionary (so deepcopy won't visit it again) */ - id = PyInt_FromLong((Py_uintptr_t) self); + id = PyLong_FromLong((Py_uintptr_t) self); if (!id) goto error; @@ -722,7 +722,6 @@ checkpath(PyObject* tag) #define PATHCHAR(ch) \ (ch == '/' || ch == '*' || ch == '[' || ch == '@' || ch == '.') -#if defined(Py_USING_UNICODE) if (PyUnicode_Check(tag)) { Py_UNICODE *p = PyUnicode_AS_UNICODE(tag); for (i = 0; i < PyUnicode_GET_SIZE(tag); i++) { @@ -735,10 +734,9 @@ checkpath(PyObject* tag) } return 0; } -#endif - if (PyString_Check(tag)) { - char *p = PyString_AS_STRING(tag); - for (i = 0; i < PyString_GET_SIZE(tag); i++) { + if (PyBytes_Check(tag)) { + char *p = PyBytes_AS_STRING(tag); + for (i = 0; i < PyBytes_GET_SIZE(tag); i++) { if (p[i] == '{') check = 0; else if (p[i] == '}') @@ -806,7 +804,7 @@ element_find(ElementObject* self, PyObject* args) for (i = 0; i < self->extra->length; i++) { PyObject* item = self->extra->children[i]; if (Element_CheckExact(item) && - PyObject_Compare(((ElementObject*)item)->tag, tag) == 0) { + PyObject_RichCompareBool(((ElementObject*)item)->tag, tag, Py_EQ) == 1) { Py_INCREF(item); return item; } @@ -838,10 +836,11 @@ element_findtext(ElementObject* self, PyObject* args) for (i = 0; i < self->extra->length; i++) { ElementObject* item = (ElementObject*) self->extra->children[i]; - if (Element_CheckExact(item) && !PyObject_Compare(item->tag, tag)) { + if (Element_CheckExact(item) && (PyObject_RichCompareBool(item->tag, tag, Py_EQ) == 1)) { + PyObject* text = element_get_text(item); if (text == Py_None) - return PyString_FromString(""); + return PyBytes_FromString(""); Py_XINCREF(text); return text; } @@ -877,7 +876,7 @@ element_findall(ElementObject* self, PyObject* args) for (i = 0; i < self->extra->length; i++) { PyObject* item = self->extra->children[i]; if (Element_CheckExact(item) && - PyObject_Compare(((ElementObject*)item)->tag, tag) == 0) { + PyObject_RichCompareBool(((ElementObject*)item)->tag, tag, Py_EQ) == 1) { if (PyList_Append(out, item) < 0) { Py_DECREF(out); return NULL; @@ -1164,7 +1163,7 @@ element_remove(ElementObject* self, PyObject* args) for (i = 0; i < self->extra->length; i++) { if (self->extra->children[i] == element) break; - if (PyObject_Compare(self->extra->children[i], element) == 0) + if (PyObject_RichCompareBool(self->extra->children[i], element, Py_EQ) == 1) break; } @@ -1190,18 +1189,7 @@ element_remove(ElementObject* self, PyObject* args) static PyObject* element_repr(ElementObject* self) { - PyObject *repr, *tag; - - tag = PyObject_Repr(self->tag); - if (!tag) - return NULL; - - repr = PyString_FromFormat("<Element %s at %p>", - PyString_AS_STRING(tag), self); - - Py_DECREF(tag); - - return repr; + return PyUnicode_FromFormat("<Element %R at %p>", self->tag, self); } static PyObject* @@ -1284,7 +1272,7 @@ element_subscr(PyObject* self_, PyObject* item) if (!self->extra) return PyList_New(0); - if (PySlice_GetIndicesEx((PySliceObject *)item, + if (PySlice_GetIndicesEx(item, self->extra->length, &start, &stop, &step, &slicelen) < 0) { return NULL; @@ -1343,7 +1331,7 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) if (!self->extra) element_new_extra(self, NULL); - if (PySlice_GetIndicesEx((PySliceObject *)item, + if (PySlice_GetIndicesEx(item, self->extra->length, &start, &stop, &step, &slicelen) < 0) { return -1; @@ -1487,10 +1475,17 @@ static PyMethodDef element_methods[] = { {NULL, NULL} }; -static PyObject* -element_getattr(ElementObject* self, char* name) +static PyObject* +element_getattro(ElementObject* self, PyObject* nameobj) { PyObject* res; + char *name = ""; + + if (PyUnicode_Check(nameobj)) + name = _PyUnicode_AsString(nameobj); + + if (name == NULL) + return NULL; /* handle common attributes first */ if (strcmp(name, "tag") == 0) { @@ -1504,22 +1499,19 @@ element_getattr(ElementObject* self, char* name) } /* methods */ - res = Py_FindMethod(element_methods, (PyObject*) self, name); + res = PyObject_GenericGetAttr((PyObject*) self, nameobj); if (res) return res; - PyErr_Clear(); - /* less common attributes */ if (strcmp(name, "tail") == 0) { + PyErr_Clear(); res = element_get_tail(self); } else if (strcmp(name, "attrib") == 0) { + PyErr_Clear(); if (!self->extra) element_new_extra(self, NULL); res = element_get_attrib(self); - } else { - PyErr_SetString(PyExc_AttributeError, name); - return NULL; } if (!res) @@ -1582,19 +1574,35 @@ static PyMappingMethods element_as_mapping = { (objobjargproc) element_ass_subscr, }; -statichere PyTypeObject Element_Type = { - PyObject_HEAD_INIT(NULL) - 0, "Element", sizeof(ElementObject), 0, +static PyTypeObject Element_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "Element", sizeof(ElementObject), 0, /* methods */ (destructor)element_dealloc, /* tp_dealloc */ 0, /* tp_print */ - (getattrfunc)element_getattr, /* tp_getattr */ + 0, /* tp_getattr */ (setattrfunc)element_setattr, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)element_repr, /* tp_repr */ 0, /* tp_as_number */ &element_as_sequence, /* tp_as_sequence */ &element_as_mapping, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + (getattrofunc)element_getattro, /* 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 */ + element_methods, /* tp_methods */ + 0, /* tp_members */ }; /* ==================================================================== */ @@ -1622,7 +1630,7 @@ typedef struct { } TreeBuilderObject; -staticforward PyTypeObject TreeBuilder_Type; +static PyTypeObject TreeBuilder_Type; #define TreeBuilder_CheckExact(op) (Py_TYPE(op) == &TreeBuilder_Type) @@ -1791,14 +1799,14 @@ treebuilder_handle_data(TreeBuilderObject* self, PyObject* data) Py_INCREF(data); self->data = data; } else { /* more than one item; use a list to collect items */ - if (PyString_CheckExact(self->data) && Py_REFCNT(self->data) == 1 && - PyString_CheckExact(data) && PyString_GET_SIZE(data) == 1) { + if (PyBytes_CheckExact(self->data) && Py_REFCNT(self->data) == 1 && + PyBytes_CheckExact(data) && PyBytes_GET_SIZE(data) == 1) { /* expat often generates single character data sections; handle the most common case by resizing the existing string... */ - Py_ssize_t size = PyString_GET_SIZE(self->data); - if (_PyString_Resize(&self->data, size + 1) < 0) + Py_ssize_t size = PyBytes_GET_SIZE(self->data); + if (_PyBytes_Resize(&self->data, size + 1) < 0) return NULL; - PyString_AS_STRING(self->data)[size] = PyString_AS_STRING(data)[0]; + PyBytes_AS_STRING(self->data)[size] = PyBytes_AS_STRING(data)[0]; } else if (PyList_CheckExact(self->data)) { if (PyList_Append(self->data, data) < 0) return NULL; @@ -1989,19 +1997,35 @@ static PyMethodDef treebuilder_methods[] = { {NULL, NULL} }; -static PyObject* -treebuilder_getattr(TreeBuilderObject* self, char* name) -{ - return Py_FindMethod(treebuilder_methods, (PyObject*) self, name); -} - -statichere PyTypeObject TreeBuilder_Type = { - PyObject_HEAD_INIT(NULL) - 0, "TreeBuilder", sizeof(TreeBuilderObject), 0, +static PyTypeObject TreeBuilder_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "TreeBuilder", sizeof(TreeBuilderObject), 0, /* methods */ (destructor)treebuilder_dealloc, /* tp_dealloc */ 0, /* tp_print */ - (getattrfunc)treebuilder_getattr, /* tp_getattr */ + 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 */ + treebuilder_methods, /* tp_methods */ + 0, /* tp_members */ }; /* ==================================================================== */ @@ -2042,39 +2066,10 @@ typedef struct { } XMLParserObject; -staticforward PyTypeObject XMLParser_Type; +static PyTypeObject XMLParser_Type; /* helpers */ -#if defined(Py_USING_UNICODE) -LOCAL(int) -checkstring(const char* string, int size) -{ - int i; - - /* check if an 8-bit string contains UTF-8 characters */ - for (i = 0; i < size; i++) - if (string[i] & 0x80) - return 1; - - return 0; -} -#endif - -LOCAL(PyObject*) -makestring(const char* string, int size) -{ - /* convert a UTF-8 string to either a 7-bit ascii string or a - Unicode string */ - -#if defined(Py_USING_UNICODE) - if (checkstring(string, size)) - return PyUnicode_DecodeUTF8(string, size, "strict"); -#endif - - return PyString_FromStringAndSize(string, size); -} - LOCAL(PyObject*) makeuniversal(XMLParserObject* self, const char* string) { @@ -2086,7 +2081,7 @@ makeuniversal(XMLParserObject* self, const char* string) PyObject* value; /* look the 'raw' name up in the names dictionary */ - key = PyString_FromStringAndSize(string, size); + key = PyBytes_FromStringAndSize(string, size); if (!key) return NULL; @@ -2108,8 +2103,8 @@ makeuniversal(XMLParserObject* self, const char* string) break; if (i != size) { /* convert to universal name */ - tag = PyString_FromStringAndSize(NULL, size+1); - p = PyString_AS_STRING(tag); + tag = PyBytes_FromStringAndSize(NULL, size+1); + p = PyBytes_AS_STRING(tag); p[0] = '{'; memcpy(p+1, string, size); size++; @@ -2120,20 +2115,13 @@ makeuniversal(XMLParserObject* self, const char* string) } /* decode universal name */ -#if defined(Py_USING_UNICODE) - /* inline makestring, to avoid duplicating the source string if - it's not an utf-8 string */ - p = PyString_AS_STRING(tag); - if (checkstring(p, size)) { - value = PyUnicode_DecodeUTF8(p, size, "strict"); - Py_DECREF(tag); - if (!value) { - Py_DECREF(key); - return NULL; - } - } else -#endif - value = tag; /* use tag as is */ + p = PyBytes_AS_STRING(tag); + value = PyUnicode_DecodeUTF8(p, size, "strict"); + Py_DECREF(tag); + if (!value) { + Py_DECREF(key); + return NULL; + } /* add to names dictionary */ if (PyDict_SetItem(self->names, key, value) < 0) { @@ -2154,7 +2142,7 @@ expat_set_error(const char* message, int line, int column) PyObject *position; char buffer[256]; - sprintf(buffer, "%s: line %d, column %d", message, line, column); + sprintf(buffer, "%.100s: line %d, column %d", message, line, column); error = PyObject_CallFunction(elementtree_parseerror_obj, "s", buffer); if (!error) @@ -2191,7 +2179,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in, if (data_len < 2 || data_in[0] != '&') return; - key = makestring(data_in + 1, data_len - 2); + key = PyUnicode_DecodeUTF8(data_in + 1, data_len - 2, "strict"); if (!key) return; @@ -2209,8 +2197,8 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in, Py_XDECREF(res); } else if (!PyErr_Occurred()) { /* Report the first error, not the last */ - char message[128]; - sprintf(message, "undefined entity &%.100s;", PyString_AS_STRING(key)); + char message[128] = "undefined entity "; + strncat(message, data_in, data_len < 100?data_len:100); expat_set_error( message, EXPAT(GetErrorLineNumber)(self->parser), @@ -2242,7 +2230,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, return; while (attrib_in[0] && attrib_in[1]) { PyObject* key = makeuniversal(self, attrib_in[0]); - PyObject* value = makestring(attrib_in[1], strlen(attrib_in[1])); + PyObject* value = PyUnicode_DecodeUTF8(attrib_in[1], strlen(attrib_in[1]), "strict"); if (!key || !value) { Py_XDECREF(value); Py_XDECREF(key); @@ -2291,7 +2279,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in, PyObject* data; PyObject* res; - data = makestring(data_in, data_len); + data = PyUnicode_DecodeUTF8(data_in, data_len, "strict"); if (!data) return; /* parser will look for errors */ @@ -2338,14 +2326,14 @@ expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix, PyObject* sprefix = NULL; PyObject* suri = NULL; - suri = makestring(uri, strlen(uri)); + suri = PyUnicode_DecodeUTF8(uri, strlen(uri), "strict"); if (!suri) return; if (prefix) - sprefix = makestring(prefix, strlen(prefix)); + sprefix = PyUnicode_DecodeUTF8(prefix, strlen(prefix), "strict"); else - sprefix = PyString_FromStringAndSize("", 0); + sprefix = PyUnicode_FromString(""); if (!sprefix) { Py_DECREF(suri); return; @@ -2374,7 +2362,7 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) PyObject* res; if (self->handle_comment) { - comment = makestring(comment_in, strlen(comment_in)); + comment = PyUnicode_DecodeUTF8(comment_in, strlen(comment_in), "strict"); if (comment) { res = PyObject_CallFunction(self->handle_comment, "O", comment); Py_XDECREF(res); @@ -2392,8 +2380,8 @@ expat_pi_handler(XMLParserObject* self, const XML_Char* target_in, PyObject* res; if (self->handle_pi) { - target = makestring(target_in, strlen(target_in)); - data = makestring(data_in, strlen(data_in)); + target = PyUnicode_DecodeUTF8(target_in, strlen(target_in), "strict"); + data = PyUnicode_DecodeUTF8(data_in, strlen(data_in), "strict"); if (target && data) { res = PyObject_CallFunction(self->handle_pi, "OO", target, data); Py_XDECREF(res); @@ -2406,7 +2394,6 @@ expat_pi_handler(XMLParserObject* self, const XML_Char* target_in, } } -#if defined(Py_USING_UNICODE) static int expat_unknown_encoding_handler(XMLParserObject *self, const XML_Char *name, XML_Encoding *info) @@ -2443,7 +2430,6 @@ expat_unknown_encoding_handler(XMLParserObject *self, const XML_Char *name, return XML_STATUS_OK; } -#endif /* -------------------------------------------------------------------- */ /* constructor and destructor */ @@ -2550,12 +2536,10 @@ xmlparser(PyObject* self_, PyObject* args, PyObject* kw) self->parser, (XML_ProcessingInstructionHandler) expat_pi_handler ); -#if defined(Py_USING_UNICODE) EXPAT(SetUnknownEncodingHandler)( self->parser, (XML_UnknownEncodingHandler) expat_unknown_encoding_handler, NULL ); -#endif ALLOC(sizeof(XMLParserObject), "create expatparser"); @@ -2673,13 +2657,13 @@ xmlparser_parse(XMLParserObject* self, PyObject* args) return NULL; } - if (!PyString_CheckExact(buffer) || PyString_GET_SIZE(buffer) == 0) { + if (!PyBytes_CheckExact(buffer) || PyBytes_GET_SIZE(buffer) == 0) { Py_DECREF(buffer); break; } res = expat_parse( - self, PyString_AS_STRING(buffer), PyString_GET_SIZE(buffer), 0 + self, PyBytes_AS_STRING(buffer), PyBytes_GET_SIZE(buffer), 0 ); Py_DECREF(buffer); @@ -2741,7 +2725,7 @@ xmlparser_setevents(XMLParserObject* self, PyObject* args) if (event_set == Py_None) { /* default is "end" only */ - target->end_event_obj = PyString_FromString("end"); + target->end_event_obj = PyUnicode_FromString("end"); Py_RETURN_NONE; } @@ -2751,9 +2735,15 @@ xmlparser_setevents(XMLParserObject* self, PyObject* args) for (i = 0; i < PyTuple_GET_SIZE(event_set); i++) { PyObject* item = PyTuple_GET_ITEM(event_set, i); char* event; - if (!PyString_Check(item)) + 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; - event = PyString_AS_STRING(item); + } if (strcmp(event, "start") == 0) { Py_INCREF(item); target->start_event_obj = item; @@ -2807,41 +2797,58 @@ static PyMethodDef xmlparser_methods[] = { }; static PyObject* -xmlparser_getattr(XMLParserObject* self, char* name) +xmlparser_getattro(XMLParserObject* self, PyObject* nameobj) { - PyObject* res; + if (PyUnicode_Check(nameobj)) { + PyObject* res; + if (PyUnicode_CompareWithASCIIString(nameobj, "entity") == 0) + res = self->entity; + else if (PyUnicode_CompareWithASCIIString(nameobj, "target") == 0) + res = self->target; + else if (PyUnicode_CompareWithASCIIString(nameobj, "version") == 0) { + return PyUnicode_FromFormat( + "Expat %d.%d.%d", XML_MAJOR_VERSION, + XML_MINOR_VERSION, XML_MICRO_VERSION); + } + else + goto generic; - res = Py_FindMethod(xmlparser_methods, (PyObject*) self, name); - if (res) + Py_INCREF(res); return res; - - PyErr_Clear(); - - if (strcmp(name, "entity") == 0) - res = self->entity; - else if (strcmp(name, "target") == 0) - res = self->target; - else if (strcmp(name, "version") == 0) { - char buffer[100]; - sprintf(buffer, "Expat %d.%d.%d", XML_MAJOR_VERSION, - XML_MINOR_VERSION, XML_MICRO_VERSION); - return PyString_FromString(buffer); - } else { - PyErr_SetString(PyExc_AttributeError, name); - return NULL; } - - Py_INCREF(res); - return res; + generic: + return PyObject_GenericGetAttr((PyObject*) self, nameobj); } -statichere PyTypeObject XMLParser_Type = { - PyObject_HEAD_INIT(NULL) - 0, "XMLParser", sizeof(XMLParserObject), 0, +static PyTypeObject XMLParser_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "XMLParser", sizeof(XMLParserObject), 0, /* methods */ (destructor)xmlparser_dealloc, /* tp_dealloc */ 0, /* tp_print */ - (getattrfunc)xmlparser_getattr, /* tp_getattr */ + 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 */ + (getattrofunc)xmlparser_getattro, /* 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 */ + xmlparser_methods, /* tp_methods */ + 0, /* tp_members */ }; #endif @@ -2860,28 +2867,51 @@ static PyMethodDef _functions[] = { {NULL, NULL} }; -DL_EXPORT(void) -init_elementtree(void) + +static struct PyModuleDef _elementtreemodule = { + PyModuleDef_HEAD_INIT, + "_elementtree", + NULL, + -1, + _functions, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit__elementtree(void) { PyObject* m; PyObject* g; char* bootstrap; - /* Patch object type */ - Py_TYPE(&Element_Type) = Py_TYPE(&TreeBuilder_Type) = &PyType_Type; + /* Initialize object types */ + if (PyType_Ready(&TreeBuilder_Type) < 0) + return NULL; + if (PyType_Ready(&Element_Type) < 0) + return NULL; #if defined(USE_EXPAT) - Py_TYPE(&XMLParser_Type) = &PyType_Type; + if (PyType_Ready(&XMLParser_Type) < 0) + return NULL; #endif - m = Py_InitModule("_elementtree", _functions); + m = PyModule_Create(&_elementtreemodule); if (!m) - return; + return NULL; + + /* The code below requires that the module gets already added + to sys.modules. */ + PyDict_SetItemString(PyImport_GetModuleDict(), + _elementtreemodule.m_name, + m); /* python glue code */ g = PyDict_New(); if (!g) - return; + return NULL; PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins()); @@ -2909,8 +2939,8 @@ init_elementtree(void) " element = cElementTree.Element(ET.Comment)\n" " element.text = text\n" " return element\n" - " def __cmp__(self, other):\n" - " return cmp(ET.Comment, other)\n" + " def __eq__(self, other):\n" + " return ET.Comment == other\n" "cElementTree.Comment = CommentProxy()\n" "class ElementTree(ET.ElementTree):\n" /* public */ @@ -2918,7 +2948,7 @@ init_elementtree(void) " close_source = False\n" " if not hasattr(source, 'read'):\n" " source = open(source, 'rb')\n" - " close_source = False\n" + " close_source = True\n" " try:\n" " if parser is not None:\n" " while 1:\n" @@ -2960,7 +2990,7 @@ init_elementtree(void) " return tree\n" "cElementTree.parse = parse\n" - "class iterparse(object):\n" + "class iterparse:\n" " root = None\n" " def __init__(self, file, events=None):\n" " self._close_file = False\n" @@ -2975,7 +3005,7 @@ init_elementtree(void) " b = cElementTree.TreeBuilder()\n" " self._parser = cElementTree.XMLParser(b)\n" " self._parser._setevents(self._events, events)\n" - " def next(self):\n" + " def __next__(self):\n" " while 1:\n" " try:\n" " item = self._events[self._index]\n" @@ -3015,8 +3045,8 @@ init_elementtree(void) " if text:\n" " element.text = element.text + ' ' + text\n" " return element\n" - " def __cmp__(self, other):\n" - " return cmp(ET.PI, other)\n" + " def __eq__(self, other):\n" + " return ET.PI == other\n" "cElementTree.PI = cElementTree.ProcessingInstruction = PIProxy()\n" "def XML(text):\n" /* public */ @@ -3055,7 +3085,7 @@ init_elementtree(void) ); if (!PyRun_String(bootstrap, Py_file_input, g, NULL)) - return; + return NULL; elementpath_obj = PyDict_GetItemString(g, "ElementPath"); @@ -3084,8 +3114,13 @@ init_elementtree(void) expat_capi->size < sizeof(struct PyExpat_CAPI) || expat_capi->MAJOR_VERSION != XML_MAJOR_VERSION || expat_capi->MINOR_VERSION != XML_MINOR_VERSION || - expat_capi->MICRO_VERSION != XML_MICRO_VERSION) - expat_capi = NULL; + expat_capi->MICRO_VERSION != XML_MICRO_VERSION) { + PyErr_SetString(PyExc_ImportError, + "pyexpat version is incompatible"); + return NULL; + } + } else { + return NULL; } #endif @@ -3094,4 +3129,6 @@ init_elementtree(void) ); Py_INCREF(elementtree_parseerror_obj); PyModule_AddObject(m, "ParseError", elementtree_parseerror_obj); + + return m; } diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index aa9eaee9e12..d8a283bcec6 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -9,84 +9,6 @@ All rights reserved. */ -/* reduce() *************************************************************/ - -static PyObject * -functools_reduce(PyObject *self, PyObject *args) -{ - PyObject *seq, *func, *result = NULL, *it; - - if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result)) - return NULL; - if (result != NULL) - Py_INCREF(result); - - it = PyObject_GetIter(seq); - if (it == NULL) { - PyErr_SetString(PyExc_TypeError, - "reduce() arg 2 must support iteration"); - Py_XDECREF(result); - return NULL; - } - - if ((args = PyTuple_New(2)) == NULL) - goto Fail; - - for (;;) { - PyObject *op2; - - if (args->ob_refcnt > 1) { - Py_DECREF(args); - if ((args = PyTuple_New(2)) == NULL) - goto Fail; - } - - op2 = PyIter_Next(it); - if (op2 == NULL) { - if (PyErr_Occurred()) - goto Fail; - break; - } - - if (result == NULL) - result = op2; - else { - PyTuple_SetItem(args, 0, result); - PyTuple_SetItem(args, 1, op2); - if ((result = PyEval_CallObject(func, args)) == NULL) - goto Fail; - } - } - - Py_DECREF(args); - - if (result == NULL) - PyErr_SetString(PyExc_TypeError, - "reduce() of empty sequence with no initial value"); - - Py_DECREF(it); - return result; - -Fail: - Py_XDECREF(args); - Py_XDECREF(result); - Py_DECREF(it); - return NULL; -} - -PyDoc_STRVAR(reduce_doc, -"reduce(function, sequence[, initial]) -> value\n\ -\n\ -Apply a function of two arguments cumulatively to the items of a sequence,\n\ -from left to right, so as to reduce the sequence to a single value.\n\ -For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\ -((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\ -of the sequence in the calculation, and serves as a default when the\n\ -sequence is empty."); - - - - /* partial object **********************************************************/ typedef struct { @@ -274,6 +196,48 @@ static PyGetSetDef partial_getsetlist[] = { {NULL} /* Sentinel */ }; +static PyObject * +partial_repr(partialobject *pto) +{ + PyObject *result; + PyObject *arglist; + PyObject *tmp; + Py_ssize_t i, n; + + arglist = PyUnicode_FromString(""); + if (arglist == NULL) { + return NULL; + } + /* Pack positional arguments */ + assert (PyTuple_Check(pto->args)); + n = PyTuple_GET_SIZE(pto->args); + for (i = 0; i < n; i++) { + tmp = PyUnicode_FromFormat("%U, %R", arglist, + PyTuple_GET_ITEM(pto->args, i)); + Py_DECREF(arglist); + if (tmp == NULL) + return NULL; + arglist = tmp; + } + /* Pack keyword arguments */ + assert (pto->kw == Py_None || PyDict_Check(pto->kw)); + if (pto->kw != Py_None) { + PyObject *key, *value; + for (i = 0; PyDict_Next(pto->kw, &i, &key, &value);) { + tmp = PyUnicode_FromFormat("%U, %U=%R", arglist, + key, value); + Py_DECREF(arglist); + if (tmp == NULL) + return NULL; + arglist = tmp; + } + } + result = PyUnicode_FromFormat("%s(%R%U)", Py_TYPE(pto)->tp_name, + pto->fn, arglist); + Py_DECREF(arglist); + return result; +} + /* Pickle strategy: __reduce__ by itself doesn't support getting kwargs in the unpickle operation so we define a __setstate__ that replaces all the information @@ -281,7 +245,7 @@ static PyGetSetDef partial_getsetlist[] = { it as a hook to do strange things. */ -PyObject * +static PyObject * partial_reduce(partialobject *pto, PyObject *unused) { return Py_BuildValue("O(O)(OOOO)", Py_TYPE(pto), pto->fn, pto->fn, @@ -289,7 +253,7 @@ partial_reduce(partialobject *pto, PyObject *unused) pto->dict ? pto->dict : Py_None); } -PyObject * +static PyObject * partial_setstate(partialobject *pto, PyObject *args) { PyObject *fn, *fnargs, *kw, *dict; @@ -331,8 +295,8 @@ static PyTypeObject partial_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ + 0, /* tp_reserved */ + (reprfunc)partial_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ @@ -343,7 +307,7 @@ static PyTypeObject partial_type = { PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ + Py_TPFLAGS_BASETYPE, /* tp_flags */ partial_doc, /* tp_doc */ (traverseproc)partial_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -366,18 +330,107 @@ static PyTypeObject partial_type = { }; +/* reduce (used to be a builtin) ********************************************/ + +static PyObject * +functools_reduce(PyObject *self, PyObject *args) +{ + PyObject *seq, *func, *result = NULL, *it; + + if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result)) + return NULL; + if (result != NULL) + Py_INCREF(result); + + it = PyObject_GetIter(seq); + if (it == NULL) { + if (PyErr_ExceptionMatches(PyExc_TypeError)) + PyErr_SetString(PyExc_TypeError, + "reduce() arg 2 must support iteration"); + Py_XDECREF(result); + return NULL; + } + + if ((args = PyTuple_New(2)) == NULL) + goto Fail; + + for (;;) { + PyObject *op2; + + if (args->ob_refcnt > 1) { + Py_DECREF(args); + if ((args = PyTuple_New(2)) == NULL) + goto Fail; + } + + op2 = PyIter_Next(it); + if (op2 == NULL) { + if (PyErr_Occurred()) + goto Fail; + break; + } + + if (result == NULL) + result = op2; + else { + PyTuple_SetItem(args, 0, result); + PyTuple_SetItem(args, 1, op2); + if ((result = PyEval_CallObject(func, args)) == NULL) + goto Fail; + } + } + + Py_DECREF(args); + + if (result == NULL) + PyErr_SetString(PyExc_TypeError, + "reduce() of empty sequence with no initial value"); + + Py_DECREF(it); + return result; + +Fail: + Py_XDECREF(args); + Py_XDECREF(result); + Py_DECREF(it); + return NULL; +} + +PyDoc_STRVAR(functools_reduce_doc, +"reduce(function, sequence[, initial]) -> value\n\ +\n\ +Apply a function of two arguments cumulatively to the items of a sequence,\n\ +from left to right, so as to reduce the sequence to a single value.\n\ +For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\ +((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\ +of the sequence in the calculation, and serves as a default when the\n\ +sequence is empty."); + /* module level code ********************************************************/ PyDoc_STRVAR(module_doc, "Tools that operate on functions."); static PyMethodDef module_methods[] = { - {"reduce", functools_reduce, METH_VARARGS, reduce_doc}, + {"reduce", functools_reduce, METH_VARARGS, functools_reduce_doc}, {NULL, NULL} /* sentinel */ }; + +static struct PyModuleDef _functoolsmodule = { + PyModuleDef_HEAD_INIT, + "_functools", + module_doc, + -1, + module_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_functools(void) +PyInit__functools(void) { int i; PyObject *m; @@ -387,16 +440,19 @@ init_functools(void) NULL }; - m = Py_InitModule3("_functools", module_methods, module_doc); + m = PyModule_Create(&_functoolsmodule); if (m == NULL) - return; + return NULL; for (i=0 ; typelist[i] != NULL ; i++) { - if (PyType_Ready(typelist[i]) < 0) - return; + if (PyType_Ready(typelist[i]) < 0) { + Py_DECREF(m); + return NULL; + } name = strchr(typelist[i]->tp_name, '.'); assert (name != NULL); Py_INCREF(typelist[i]); PyModule_AddObject(m, name+1, (PyObject *)typelist[i]); } + return m; } diff --git a/Modules/gdbmmodule.c b/Modules/_gdbmmodule.c index 04b3332bb89..474561b235f 100644 --- a/Modules/gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -30,7 +30,7 @@ supported."); typedef struct { PyObject_HEAD - int di_size; /* -1 means recompute */ + int di_size; /* -1 means recompute */ GDBM_FILE di_dbm; } dbmobject; @@ -90,8 +90,8 @@ static Py_ssize_t dbm_length(dbmobject *dp) { if (dp->di_dbm == NULL) { - PyErr_SetString(DbmError, "GDBM object has already been closed"); - return -1; + PyErr_SetString(DbmError, "GDBM object has already been closed"); + return -1; } if (dp->di_size < 0) { datum key,okey; @@ -127,15 +127,36 @@ dbm_subscript(dbmobject *dp, register PyObject *key) } drec = gdbm_fetch(dp->di_dbm, krec); if (drec.dptr == 0) { - PyErr_SetString(PyExc_KeyError, - PyString_AS_STRING((PyStringObject *)key)); + PyErr_SetObject(PyExc_KeyError, key); return NULL; } - v = PyString_FromStringAndSize(drec.dptr, drec.dsize); + v = PyBytes_FromStringAndSize(drec.dptr, drec.dsize); free(drec.dptr); return v; } +PyDoc_STRVAR(dbm_get__doc__, +"get(key[, default]) -> value\n\ +Get the value for key, or default if not present; if not given,\n\ +default is None."); + +static PyObject * +dbm_get(dbmobject *dp, PyObject *args) +{ + PyObject *v, *res; + PyObject *def = Py_None; + + if (!PyArg_UnpackTuple(args, "get", 1, 2, &v, &def)) + return NULL; + res = dbm_subscript(dp, v); + if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) { + PyErr_Clear(); + Py_INCREF(def); + return def; + } + return res; +} + static int dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w) { @@ -143,26 +164,25 @@ dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w) if (!PyArg_Parse(v, "s#", &krec.dptr, &krec.dsize) ) { PyErr_SetString(PyExc_TypeError, - "gdbm mappings have string indices only"); + "gdbm mappings have bytes or string indices only"); return -1; } if (dp->di_dbm == NULL) { PyErr_SetString(DbmError, - "GDBM object has already been closed"); - return -1; + "GDBM object has already been closed"); + return -1; } dp->di_size = -1; if (w == NULL) { if (gdbm_delete(dp->di_dbm, krec) < 0) { - PyErr_SetString(PyExc_KeyError, - PyString_AS_STRING((PyStringObject *)v)); + PyErr_SetObject(PyExc_KeyError, v); return -1; } } else { if (!PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize)) { PyErr_SetString(PyExc_TypeError, - "gdbm mappings have string elements only"); + "gdbm mappings have byte or string elements only"); return -1; } errno = 0; @@ -178,42 +198,31 @@ dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w) return 0; } -static int -dbm_contains(register dbmobject *dp, PyObject *arg) +PyDoc_STRVAR(dbm_setdefault__doc__, +"setdefault(key[, default]) -> value\n\ +Get value for key, or set it to default and return default if not present;\n\ +if not given, default is None."); + +static PyObject * +dbm_setdefault(dbmobject *dp, PyObject *args) { - datum key; + PyObject *v, *res; + PyObject *def = Py_None; - if ((dp)->di_dbm == NULL) { - PyErr_SetString(DbmError, - "GDBM object has already been closed"); - return -1; - } - if (!PyString_Check(arg)) { - PyErr_Format(PyExc_TypeError, - "gdbm key must be string, not %.100s", - arg->ob_type->tp_name); - return -1; + if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &v, &def)) + return NULL; + res = dbm_subscript(dp, v); + if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) { + PyErr_Clear(); + if (dbm_ass_sub(dp, v, def) < 0) + return NULL; + return dbm_subscript(dp, v); } - key.dptr = PyString_AS_STRING(arg); - key.dsize = PyString_GET_SIZE(arg); - return gdbm_exists(dp->di_dbm, key); + return res; } -static PySequenceMethods dbm_as_sequence = { - (lenfunc)dbm_length, /*_length*/ - 0, /*sq_concat*/ - 0, /*sq_repeat*/ - 0, /*sq_item*/ - 0, /*sq_slice*/ - 0, /*sq_ass_item*/ - 0, /*sq_ass_slice*/ - (objobjproc)dbm_contains, /*sq_contains*/ - 0, /*sq_inplace_concat*/ - 0 /*sq_inplace_repeat*/ -}; - static PyMappingMethods dbm_as_mapping = { - (lenfunc)dbm_length, /*mp_length*/ + (lenfunc)dbm_length, /*mp_length*/ (binaryfunc)dbm_subscript, /*mp_subscript*/ (objobjargproc)dbm_ass_sub, /*mp_ass_subscript*/ }; @@ -232,6 +241,7 @@ dbm_close(register dbmobject *dp, PyObject *unused) return Py_None; } +/* XXX Should return a set or a set view */ PyDoc_STRVAR(dbm_keys__doc__, "keys() -> list_of_keys\n\ Get a list of all keys in the database."); @@ -255,7 +265,7 @@ dbm_keys(register dbmobject *dp, PyObject *unused) key = gdbm_firstkey(dp->di_dbm); while (key.dptr) { - item = PyString_FromStringAndSize(key.dptr, key.dsize); + item = PyBytes_FromStringAndSize(key.dptr, key.dsize); if (item == NULL) { free(key.dptr); Py_DECREF(v); @@ -275,21 +285,41 @@ dbm_keys(register dbmobject *dp, PyObject *unused) return v; } -PyDoc_STRVAR(dbm_has_key__doc__, -"has_key(key) -> boolean\n\ -Find out whether or not the database contains a given key."); - -static PyObject * -dbm_has_key(register dbmobject *dp, PyObject *args) +static int +dbm_contains(PyObject *self, PyObject *arg) { + dbmobject *dp = (dbmobject *)self; datum key; - if (!PyArg_ParseTuple(args, "s#:has_key", &key.dptr, &key.dsize)) - return NULL; - check_dbmobject_open(dp); - return PyInt_FromLong((long) gdbm_exists(dp->di_dbm, key)); + if ((dp)->di_dbm == NULL) { + PyErr_SetString(DbmError, + "GDBM object has already been closed"); + return -1; + } + if (!PyBytes_Check(arg)) { + PyErr_Format(PyExc_TypeError, + "gdbm key must be bytes, not %.100s", + arg->ob_type->tp_name); + return -1; + } + key.dptr = PyBytes_AS_STRING(arg); + key.dsize = PyBytes_GET_SIZE(arg); + return gdbm_exists(dp->di_dbm, key); } +static PySequenceMethods dbm_as_sequence = { + 0, /* sq_length */ + 0, /* sq_concat */ + 0, /* sq_repeat */ + 0, /* sq_item */ + 0, /* sq_slice */ + 0, /* sq_ass_item */ + 0, /* sq_ass_slice */ + dbm_contains, /* sq_contains */ + 0, /* sq_inplace_concat */ + 0, /* sq_inplace_repeat */ +}; + PyDoc_STRVAR(dbm_firstkey__doc__, "firstkey() -> key\n\ It's possible to loop over every key in the database using this method\n\ @@ -306,7 +336,7 @@ dbm_firstkey(register dbmobject *dp, PyObject *unused) check_dbmobject_open(dp); key = gdbm_firstkey(dp->di_dbm); if (key.dptr) { - v = PyString_FromStringAndSize(key.dptr, key.dsize); + v = PyBytes_FromStringAndSize(key.dptr, key.dsize); free(key.dptr); return v; } @@ -338,7 +368,7 @@ dbm_nextkey(register dbmobject *dp, PyObject *args) check_dbmobject_open(dp); nextkey = gdbm_nextkey(dp->di_dbm, key); if (nextkey.dptr) { - v = PyString_FromStringAndSize(nextkey.dptr, nextkey.dsize); + v = PyBytes_FromStringAndSize(nextkey.dptr, nextkey.dsize); free(nextkey.dptr); return v; } @@ -387,32 +417,27 @@ dbm_sync(register dbmobject *dp, PyObject *unused) } static PyMethodDef dbm_methods[] = { - {"close", (PyCFunction)dbm_close, METH_NOARGS, dbm_close__doc__}, - {"keys", (PyCFunction)dbm_keys, METH_NOARGS, dbm_keys__doc__}, - {"has_key", (PyCFunction)dbm_has_key, METH_VARARGS, dbm_has_key__doc__}, + {"close", (PyCFunction)dbm_close, METH_NOARGS, dbm_close__doc__}, + {"keys", (PyCFunction)dbm_keys, METH_NOARGS, dbm_keys__doc__}, {"firstkey", (PyCFunction)dbm_firstkey,METH_NOARGS, dbm_firstkey__doc__}, - {"nextkey", (PyCFunction)dbm_nextkey, METH_VARARGS, dbm_nextkey__doc__}, + {"nextkey", (PyCFunction)dbm_nextkey, METH_VARARGS, dbm_nextkey__doc__}, {"reorganize",(PyCFunction)dbm_reorganize,METH_NOARGS, dbm_reorganize__doc__}, {"sync", (PyCFunction)dbm_sync, METH_NOARGS, dbm_sync__doc__}, - {NULL, NULL} /* sentinel */ + {"get", (PyCFunction)dbm_get, METH_VARARGS, dbm_get__doc__}, + {"setdefault",(PyCFunction)dbm_setdefault,METH_VARARGS, dbm_setdefault__doc__}, + {NULL, NULL} /* sentinel */ }; -static PyObject * -dbm_getattr(dbmobject *dp, char *name) -{ - return Py_FindMethod(dbm_methods, (PyObject *)dp, name); -} - static PyTypeObject Dbmtype = { PyVarObject_HEAD_INIT(0, 0) - "gdbm.gdbm", + "_gdbm.gdbm", sizeof(dbmobject), 0, (destructor)dbm_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)dbm_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ &dbm_as_sequence, /*tp_as_sequence*/ @@ -425,6 +450,13 @@ static PyTypeObject Dbmtype = { 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_xxx4*/ gdbm_object__doc__, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + dbm_methods, /*tp_methods*/ }; /* ----------------------------------------------------------------- */ @@ -501,7 +533,7 @@ dbmopen(PyObject *self, PyObject *args) #endif default: PyOS_snprintf(buf, sizeof(buf), "Flag '%c' is not supported.", - *flags); + *flags); PyErr_SetString(DbmError, buf); return NULL; } @@ -527,22 +559,35 @@ static PyMethodDef dbmmodule_methods[] = { { 0, 0 }, }; + +static struct PyModuleDef _gdbmmodule = { + PyModuleDef_HEAD_INIT, + "_gdbm", + gdbmmodule__doc__, + -1, + dbmmodule_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initgdbm(void) { +PyInit__gdbm(void) { PyObject *m, *d, *s; - Dbmtype.ob_type = &PyType_Type; - m = Py_InitModule4("gdbm", dbmmodule_methods, - gdbmmodule__doc__, (PyObject *)NULL, - PYTHON_API_VERSION); + if (PyType_Ready(&Dbmtype) < 0) + return NULL; + m = PyModule_Create(&_gdbmmodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); - DbmError = PyErr_NewException("gdbm.error", NULL, NULL); + DbmError = PyErr_NewException("_gdbm.error", PyExc_IOError, NULL); if (DbmError != NULL) { PyDict_SetItemString(d, "error", DbmError); - s = PyString_FromString(dbmmodule_open_flags); + s = PyUnicode_FromString(dbmmodule_open_flags); PyDict_SetItemString(d, "open_flags", s); Py_DECREF(s); } + return m; } diff --git a/Modules/_gestalt.c b/Modules/_gestalt.c new file mode 100644 index 00000000000..a45780fe795 --- /dev/null +++ b/Modules/_gestalt.c @@ -0,0 +1,84 @@ +/*********************************************************** +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_GetSize(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 7f016d4bdcb..dd4317fca04 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -15,6 +15,7 @@ #include "Python.h" #include "structmember.h" +#include "hashlib.h" #ifdef WITH_THREAD #include "pythread.h" @@ -37,6 +38,8 @@ /* EVP is the preferred interface to hashing in OpenSSL */ #include <openssl/evp.h> +/* We use the object interface to discover what hashes OpenSSL supports. */ +#include <openssl/objects.h> #define MUNCH_SIZE INT_MAX @@ -56,9 +59,9 @@ typedef struct { PyObject_HEAD PyObject *name; /* name of this hash algorithm */ - EVP_MD_CTX ctx; /* OpenSSL message digest context */ + EVP_MD_CTX ctx; /* OpenSSL message digest context */ #ifdef WITH_THREAD - PyThread_type_lock lock; /* OpenSSL context lock */ + PyThread_type_lock lock; /* OpenSSL context lock */ #endif } EVPobject; @@ -103,8 +106,7 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len) { unsigned int process; const unsigned char *cp = (const unsigned char *)vp; - while (0 < len) - { + while (0 < len) { if (len > (Py_ssize_t)MUNCH_SIZE) process = MUNCH_SIZE; else @@ -168,7 +170,7 @@ EVP_digest(EVPobject *self, PyObject *unused) digest_size = EVP_MD_CTX_size(&temp_ctx); EVP_DigestFinal(&temp_ctx, digest, NULL); - retval = PyString_FromStringAndSize((const char *)digest, digest_size); + retval = PyBytes_FromStringAndSize((const char *)digest, digest_size); EVP_MD_CTX_cleanup(&temp_ctx); return retval; } @@ -192,17 +194,10 @@ EVP_hexdigest(EVPobject *self, PyObject *unused) EVP_MD_CTX_cleanup(&temp_ctx); - /* Create a new string */ - /* NOTE: not thread safe! modifying an already created string object */ - /* (not a problem because we hold the GIL by default) */ - retval = PyString_FromStringAndSize(NULL, digest_size * 2); - if (!retval) - return NULL; - hex_digest = PyString_AsString(retval); - if (!hex_digest) { - Py_DECREF(retval); - return NULL; - } + /* Allocate a new buffer */ + hex_digest = PyMem_Malloc(digest_size * 2 + 1); + if (!hex_digest) + return PyErr_NoMemory(); /* Make hex version of the digest */ for(i=j=0; i<digest_size; i++) { @@ -214,6 +209,8 @@ EVP_hexdigest(EVPobject *self, PyObject *unused) c = (c>9) ? c+'a'-10 : c + '0'; hex_digest[j++] = c; } + retval = PyUnicode_FromStringAndSize(hex_digest, digest_size * 2); + PyMem_Free(hex_digest); return retval; } @@ -223,11 +220,14 @@ PyDoc_STRVAR(EVP_update__doc__, static PyObject * EVP_update(EVPobject *self, PyObject *args) { + PyObject *obj; Py_buffer view; - if (!PyArg_ParseTuple(args, "s*:update", &view)) + if (!PyArg_ParseTuple(args, "O:update", &obj)) return NULL; + GET_BUFFER_VIEW_OR_ERROUT(obj, &view); + #ifdef WITH_THREAD if (self->lock == NULL && view.len >= HASHLIB_GIL_MINSIZE) { self->lock = PyThread_allocate_lock(); @@ -240,15 +240,14 @@ EVP_update(EVPobject *self, PyObject *args) EVP_hash(self, view.buf, view.len); PyThread_release_lock(self->lock); Py_END_ALLOW_THREADS - } - else -#endif - { + } else { EVP_hash(self, view.buf, view.len); } +#else + EVP_hash(self, view.buf, view.len); +#endif PyBuffer_Release(&view); - Py_RETURN_NONE; } @@ -257,7 +256,7 @@ static PyMethodDef EVP_methods[] = { {"digest", (PyCFunction)EVP_digest, METH_NOARGS, EVP_digest__doc__}, {"hexdigest", (PyCFunction)EVP_hexdigest, METH_NOARGS, EVP_hexdigest__doc__}, {"copy", (PyCFunction)EVP_copy, METH_NOARGS, EVP_copy__doc__}, - {NULL, NULL} /* sentinel */ + {NULL, NULL} /* sentinel */ }; static PyObject * @@ -290,23 +289,14 @@ static PyGetSetDef EVP_getseters[] = { (getter)EVP_get_block_size, NULL, NULL, NULL}, - /* the old md5 and sha modules support 'digest_size' as in PEP 247. - * the old sha module also supported 'digestsize'. ugh. */ - {"digestsize", - (getter)EVP_get_digest_size, NULL, - NULL, - NULL}, {NULL} /* Sentinel */ }; static PyObject * -EVP_repr(PyObject *self) +EVP_repr(EVPobject *self) { - char buf[100]; - PyOS_snprintf(buf, sizeof(buf), "<%s HASH object @ %p>", - PyString_AsString(((EVPobject *)self)->name), self); - return PyString_FromString(buf); + return PyUnicode_FromFormat("<%U HASH object @ %p>", self->name, self); } #if HASH_OBJ_CONSTRUCTOR @@ -315,25 +305,31 @@ EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"name", "string", NULL}; PyObject *name_obj = NULL; - Py_buffer view = { 0 }; + PyObject *data_obj = NULL; + Py_buffer view; char *nameStr; const EVP_MD *digest; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s*:HASH", kwlist, - &name_obj, &view)) { + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:HASH", kwlist, + &name_obj, &data_obj)) { return -1; } + if (data_obj) + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); + if (!PyArg_Parse(name_obj, "s", &nameStr)) { PyErr_SetString(PyExc_TypeError, "name must be a string"); - PyBuffer_Release(&view); + if (data_obj) + PyBuffer_Release(&view); return -1; } digest = EVP_get_digestbyname(nameStr); if (!digest) { PyErr_SetString(PyExc_ValueError, "unknown hash function"); - PyBuffer_Release(&view); + if (data_obj) + PyBuffer_Release(&view); return -1; } EVP_DigestInit(&self->ctx, digest); @@ -341,7 +337,7 @@ EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds) self->name = name_obj; Py_INCREF(self->name); - if (view.obj) { + if (data_obj) { if (view.len >= HASHLIB_GIL_MINSIZE) { Py_BEGIN_ALLOW_THREADS EVP_hash(self, view.buf, view.len); @@ -379,12 +375,12 @@ static PyTypeObject EVPtype = { sizeof(EVPobject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ - (destructor)EVP_dealloc, /*tp_dealloc*/ + (destructor)EVP_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ - EVP_repr, /*tp_repr*/ + 0, /*tp_reserved*/ + (reprfunc)EVP_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ @@ -466,31 +462,90 @@ EVP_new(PyObject *self, PyObject *args, PyObject *kwdict) { static char *kwlist[] = {"name", "string", NULL}; PyObject *name_obj = NULL; + PyObject *data_obj = NULL; Py_buffer view = { 0 }; PyObject *ret_obj; char *name; const EVP_MD *digest; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "O|s*:new", kwlist, - &name_obj, &view)) { + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "O|O:new", kwlist, + &name_obj, &data_obj)) { return NULL; } if (!PyArg_Parse(name_obj, "s", &name)) { - PyBuffer_Release(&view); PyErr_SetString(PyExc_TypeError, "name must be a string"); return NULL; } + if (data_obj) + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); + digest = EVP_get_digestbyname(name); - ret_obj = EVPnew(name_obj, digest, NULL, (unsigned char*)view.buf, - view.len); - PyBuffer_Release(&view); + ret_obj = EVPnew(name_obj, digest, NULL, (unsigned char*)view.buf, view.len); + if (data_obj) + PyBuffer_Release(&view); return ret_obj; } + +/* State for our callback function so that it can accumulate a result. */ +typedef struct _internal_name_mapper_state { + PyObject *set; + int error; +} _InternalNameMapperState; + + +/* A callback function to pass to OpenSSL's OBJ_NAME_do_all(...) */ +static void +_openssl_hash_name_mapper(const OBJ_NAME *openssl_obj_name, void *arg) +{ + _InternalNameMapperState *state = (_InternalNameMapperState *)arg; + PyObject *py_name; + + assert(state != NULL); + if (openssl_obj_name == NULL) + return; + /* Ignore aliased names, they pollute the list and OpenSSL appears to + * have a its own definition of alias as the resulting list still + * contains duplicate and alternate names for several algorithms. */ + if (openssl_obj_name->alias) + return; + + py_name = PyUnicode_FromString(openssl_obj_name->name); + if (py_name == NULL) { + state->error = 1; + } else { + if (PySet_Add(state->set, py_name) != 0) { + Py_DECREF(py_name); + state->error = 1; + } + } +} + + +/* Ask OpenSSL for a list of supported ciphers, filling in a Python set. */ +static PyObject* +generate_hash_name_list(void) +{ + _InternalNameMapperState state; + state.set = PyFrozenSet_New(NULL); + if (state.set == NULL) + return NULL; + state.error = 0; + + OBJ_NAME_do_all(OBJ_NAME_TYPE_MD_METH, &_openssl_hash_name_mapper, &state); + + if (state.error) { + Py_DECREF(state.set); + return NULL; + } + return state.set; +} + + /* * This macro generates constructor function definitions for specific * hash algorithms. These constructors are much faster than calling @@ -502,19 +557,26 @@ EVP_new(PyObject *self, PyObject *args, PyObject *kwdict) static PyObject * \ EVP_new_ ## NAME (PyObject *self, PyObject *args) \ { \ + PyObject *data_obj = NULL; \ Py_buffer view = { 0 }; \ PyObject *ret_obj; \ \ - if (!PyArg_ParseTuple(args, "|s*:" #NAME , &view)) { \ + if (!PyArg_ParseTuple(args, "|O:" #NAME , &data_obj)) { \ return NULL; \ } \ \ + if (data_obj) \ + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); \ + \ ret_obj = EVPnew( \ CONST_ ## NAME ## _name_obj, \ NULL, \ CONST_new_ ## NAME ## _ctx_p, \ - (unsigned char*)view.buf, view.len); \ - PyBuffer_Release(&view); \ + (unsigned char*)view.buf, \ + view.len); \ + \ + if (data_obj) \ + PyBuffer_Release(&view); \ return ret_obj; \ } @@ -527,7 +589,7 @@ EVP_new(PyObject *self, PyObject *args, PyObject *kwdict) /* used in the init function to setup a constructor */ #define INIT_CONSTRUCTOR_CONSTANTS(NAME) do { \ - CONST_ ## NAME ## _name_obj = PyString_FromString(#NAME); \ + CONST_ ## NAME ## _name_obj = PyUnicode_FromString(#NAME); \ if (EVP_get_digestbyname(#NAME)) { \ CONST_new_ ## NAME ## _ctx_p = &CONST_new_ ## NAME ## _ctx; \ EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME)); \ @@ -561,10 +623,23 @@ static struct PyMethodDef EVP_functions[] = { /* Initialize this module. */ + +static struct PyModuleDef _hashlibmodule = { + PyModuleDef_HEAD_INIT, + "_hashlib", + NULL, + -1, + EVP_functions, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_hashlib(void) +PyInit__hashlib(void) { - PyObject *m; + PyObject *m, *openssl_md_meth_names; OpenSSL_add_all_digests(); @@ -575,11 +650,21 @@ init_hashlib(void) Py_TYPE(&EVPtype) = &PyType_Type; if (PyType_Ready(&EVPtype) < 0) - return; + return NULL; - m = Py_InitModule("_hashlib", EVP_functions); + m = PyModule_Create(&_hashlibmodule); if (m == NULL) - return; + return NULL; + + openssl_md_meth_names = generate_hash_name_list(); + if (openssl_md_meth_names == NULL) { + Py_DECREF(m); + return NULL; + } + if (PyModule_AddObject(m, "openssl_md_meth_names", openssl_md_meth_names)) { + Py_DECREF(m); + return NULL; + } #if HASH_OBJ_CONSTRUCTOR Py_INCREF(&EVPtype); @@ -595,4 +680,5 @@ init_hashlib(void) INIT_CONSTRUCTOR_CONSTANTS(sha384); INIT_CONSTRUCTOR_CONSTANTS(sha512); #endif + return m; } diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c index 495114b9a19..1066f94b002 100644 --- a/Modules/_heapqmodule.c +++ b/Modules/_heapqmodule.c @@ -8,30 +8,6 @@ annotated by François Pinard, and converted to C by Raymond Hettinger. #include "Python.h" -/* Older implementations of heapq used Py_LE for comparisons. Now, it uses - Py_LT so it will match min(), sorted(), and bisect(). Unfortunately, some - client code (Twisted for example) relied on Py_LE, so this little function - restores compatibility by trying both. -*/ -static int -cmp_lt(PyObject *x, PyObject *y) -{ - int cmp; - static PyObject *lt = NULL; - - if (lt == NULL) { - lt = PyString_FromString("__lt__"); - if (lt == NULL) - return -1; - } - if (PyObject_HasAttr(x, lt)) - return PyObject_RichCompareBool(x, y, Py_LT); - cmp = PyObject_RichCompareBool(y, x, Py_LE); - if (cmp != -1) - cmp = 1 - cmp; - return cmp; -} - static int _siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) { @@ -52,7 +28,7 @@ _siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos){ parentpos = (pos - 1) >> 1; parent = PyList_GET_ITEM(heap, parentpos); - cmp = cmp_lt(newitem, parent); + cmp = PyObject_RichCompareBool(newitem, parent, Py_LT); if (cmp == -1) { Py_DECREF(newitem); return -1; @@ -92,9 +68,10 @@ _siftup(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ rightpos = childpos + 1; if (rightpos < endpos) { - cmp = cmp_lt( + cmp = PyObject_RichCompareBool( PyList_GET_ITEM(heap, childpos), - PyList_GET_ITEM(heap, rightpos)); + PyList_GET_ITEM(heap, rightpos), + Py_LT); if (cmp == -1) { Py_DECREF(newitem); return -1; @@ -237,7 +214,7 @@ heappushpop(PyObject *self, PyObject *args) return item; } - cmp = cmp_lt(PyList_GET_ITEM(heap, 0), item); + cmp = PyObject_RichCompareBool(PyList_GET_ITEM(heap, 0), item, Py_LT); if (cmp == -1) return NULL; if (cmp == 0) { @@ -336,7 +313,7 @@ nlargest(PyObject *self, PyObject *args) else goto sortit; } - cmp = cmp_lt(sol, elem); + cmp = PyObject_RichCompareBool(sol, elem, Py_LT); if (cmp == -1) { Py_DECREF(elem); goto fail; @@ -391,7 +368,7 @@ _siftdownmax(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos){ parentpos = (pos - 1) >> 1; parent = PyList_GET_ITEM(heap, parentpos); - cmp = cmp_lt(parent, newitem); + cmp = PyObject_RichCompareBool(parent, newitem, Py_LT); if (cmp == -1) { Py_DECREF(newitem); return -1; @@ -431,9 +408,10 @@ _siftupmax(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ rightpos = childpos + 1; if (rightpos < endpos) { - cmp = cmp_lt( + cmp = PyObject_RichCompareBool( PyList_GET_ITEM(heap, rightpos), - PyList_GET_ITEM(heap, childpos)); + PyList_GET_ITEM(heap, childpos), + Py_LT); if (cmp == -1) { Py_DECREF(newitem); return -1; @@ -506,7 +484,7 @@ nsmallest(PyObject *self, PyObject *args) else goto sortit; } - cmp = cmp_lt(elem, los); + cmp = PyObject_RichCompareBool(elem, los, Py_LT); if (cmp == -1) { Py_DECREF(elem); goto fail; @@ -593,7 +571,7 @@ maintains the heap invariant!\n"); PyDoc_STRVAR(__about__, "Heap queues\n\ \n\ -[explanation by François Pinard]\n\ +[explanation by Fran\xc3\xa7ois Pinard]\n\ \n\ Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for\n\ all k, counting elements from 0. For the sake of comparison,\n\ @@ -684,14 +662,29 @@ backwards, and this was also used to avoid the rewinding time.\n\ Believe me, real good tape sorts were quite spectacular to watch!\n\ From all times, sorting has always been a Great Art! :-)\n"); + +static struct PyModuleDef _heapqmodule = { + PyModuleDef_HEAD_INIT, + "_heapq", + module_doc, + -1, + heapq_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_heapq(void) +PyInit__heapq(void) { - PyObject *m; + PyObject *m, *about; - m = Py_InitModule3("_heapq", heapq_methods, module_doc); + m = PyModule_Create(&_heapqmodule); if (m == NULL) - return; - PyModule_AddObject(m, "__about__", PyString_FromString(__about__)); + return NULL; + about = PyUnicode_DecodeUTF8(__about__, strlen(__about__), NULL); + PyModule_AddObject(m, "__about__", about); + return m; } diff --git a/Modules/_hotshot.c b/Modules/_hotshot.c deleted file mode 100644 index df8a7f94cd4..00000000000 --- a/Modules/_hotshot.c +++ /dev/null @@ -1,1643 +0,0 @@ -/* - * This is the High Performance Python Profiler portion of HotShot. - */ - -#include "Python.h" -#include "code.h" -#include "eval.h" -#include "frameobject.h" -#include "structmember.h" - -/* - * Which timer to use should be made more configurable, but that should not - * be difficult. This will do for now. - */ -#ifdef MS_WINDOWS -#include <windows.h> - -#ifdef HAVE_DIRECT_H -#include <direct.h> /* for getcwd() */ -#endif - -typedef __int64 hs_time; -#define GETTIMEOFDAY(P_HS_TIME) \ - { LARGE_INTEGER _temp; \ - QueryPerformanceCounter(&_temp); \ - *(P_HS_TIME) = _temp.QuadPart; } - - -#else -#ifndef HAVE_GETTIMEOFDAY -#error "This module requires gettimeofday() on non-Windows platforms!" -#endif -#if (defined(PYOS_OS2) && defined(PYCC_GCC)) || defined(__QNX__) -#include <sys/time.h> -#else -#include <sys/resource.h> -#include <sys/times.h> -#endif -typedef struct timeval hs_time; -#endif - -#if !defined(__cplusplus) && !defined(inline) -#ifdef __GNUC__ -#define inline __inline -#endif -#endif - -#ifndef inline -#define inline -#endif - -#define BUFFERSIZE 10240 - -#if defined(PYOS_OS2) && defined(PYCC_GCC) -#define PATH_MAX 260 -#endif - -#if defined(__sgi) && _COMPILER_VERSION>700 && !defined(PATH_MAX) -/* fix PATH_MAX not being defined with MIPSPro 7.x - if mode is ANSI C (default) */ -#define PATH_MAX 1024 -#endif - -#ifndef PATH_MAX -# ifdef MAX_PATH -# define PATH_MAX MAX_PATH -# elif defined (_POSIX_PATH_MAX) -# define PATH_MAX _POSIX_PATH_MAX -# else -# error "Need a defn. for PATH_MAX in _hotshot.c" -# endif -#endif - -typedef struct { - PyObject_HEAD - PyObject *filemap; - PyObject *logfilename; - Py_ssize_t index; - unsigned char buffer[BUFFERSIZE]; - FILE *logfp; - int lineevents; - int linetimings; - int frametimings; - /* size_t filled; */ - int active; - int next_fileno; - hs_time prev_timeofday; -} ProfilerObject; - -typedef struct { - PyObject_HEAD - PyObject *info; - FILE *logfp; - int linetimings; - int frametimings; -} LogReaderObject; - -static PyObject * ProfilerError = NULL; - - -#ifndef MS_WINDOWS -#ifdef GETTIMEOFDAY_NO_TZ -#define GETTIMEOFDAY(ptv) gettimeofday((ptv)) -#else -#define GETTIMEOFDAY(ptv) gettimeofday((ptv), (struct timezone *)NULL) -#endif -#endif - - -/* The log reader... */ - -PyDoc_STRVAR(logreader_close__doc__, -"close()\n" -"Close the log file, preventing additional records from being read."); - -static PyObject * -logreader_close(LogReaderObject *self, PyObject *args) -{ - if (self->logfp != NULL) { - fclose(self->logfp); - self->logfp = NULL; - } - Py_INCREF(Py_None); - - return Py_None; -} - -PyDoc_STRVAR(logreader_fileno__doc__, -"fileno() -> file descriptor\n" -"Returns the file descriptor for the log file, if open.\n" -"Raises ValueError if the log file is closed."); - -static PyObject * -logreader_fileno(LogReaderObject *self) -{ - if (self->logfp == NULL) { - PyErr_SetString(PyExc_ValueError, - "logreader's file object already closed"); - return NULL; - } - return PyInt_FromLong(fileno(self->logfp)); -} - - -/* Log File Format - * --------------- - * - * The log file consists of a sequence of variable-length records. - * Each record is identified with a record type identifier in two - * bits of the first byte. The two bits are the "least significant" - * bits of the byte. - * - * Low bits: Opcode: Meaning: - * 0x00 ENTER enter a frame - * 0x01 EXIT exit a frame - * 0x02 LINENO execution moved onto a different line - * 0x03 OTHER more bits are needed to deecode - * - * If the type is OTHER, the record is not packed so tightly, and the - * remaining bits are used to disambiguate the record type. These - * records are not used as frequently so compaction is not an issue. - * Each of the first three record types has a highly tailored - * structure that allows it to be packed tightly. - * - * The OTHER records have the following identifiers: - * - * First byte: Opcode: Meaning: - * 0x13 ADD_INFO define a key/value pair - * 0x23 DEFINE_FILE define an int->filename mapping - * 0x33 LINE_TIMES indicates if LINENO events have tdeltas - * 0x43 DEFINE_FUNC define a (fileno,lineno)->funcname mapping - * 0x53 FRAME_TIMES indicates if ENTER/EXIT events have tdeltas - * - * Packed Integers - * - * "Packed integers" are non-negative integer values encoded as a - * sequence of bytes. Each byte is encoded such that the most - * significant bit is set if the next byte is also part of the - * integer. Each byte provides bits to the least-significant end of - * the result; the accumulated value must be shifted up to place the - * new bits into the result. - * - * "Modified packed integers" are packed integers where only a portion - * of the first byte is used. In the rest of the specification, these - * are referred to as "MPI(n,name)", where "n" is the number of bits - * discarded from the least-signicant positions of the byte, and - * "name" is a name being given to those "discarded" bits, since they - * are a field themselves. - * - * ENTER records: - * - * MPI(2,type) fileno -- type is 0x00 - * PI lineno - * PI tdelta -- iff frame times are enabled - * - * EXIT records - * - * MPI(2,type) tdelta -- type is 0x01; tdelta will be 0 - * if frame times are disabled - * - * LINENO records - * - * MPI(2,type) lineno -- type is 0x02 - * PI tdelta -- iff LINENO includes it - * - * ADD_INFO records - * - * BYTE type -- always 0x13 - * PI len1 -- length of first string - * BYTE string1[len1] -- len1 bytes of string data - * PI len2 -- length of second string - * BYTE string2[len2] -- len2 bytes of string data - * - * DEFINE_FILE records - * - * BYTE type -- always 0x23 - * PI fileno - * PI len -- length of filename - * BYTE filename[len] -- len bytes of string data - * - * DEFINE_FUNC records - * - * BYTE type -- always 0x43 - * PI fileno - * PI lineno - * PI len -- length of funcname - * BYTE funcname[len] -- len bytes of string data - * - * LINE_TIMES records - * - * This record can be used only before the start of ENTER/EXIT/LINENO - * records. If have_tdelta is true, LINENO records will include the - * tdelta field, otherwise it will be omitted. If this record is not - * given, LINENO records will not contain the tdelta field. - * - * BYTE type -- always 0x33 - * BYTE have_tdelta -- 0 if LINENO does *not* have - * timing information - * FRAME_TIMES records - * - * This record can be used only before the start of ENTER/EXIT/LINENO - * records. If have_tdelta is true, ENTER and EXIT records will - * include the tdelta field, otherwise it will be omitted. If this - * record is not given, ENTER and EXIT records will contain the tdelta - * field. - * - * BYTE type -- always 0x53 - * BYTE have_tdelta -- 0 if ENTER/EXIT do *not* have - * timing information - */ - -#define WHAT_ENTER 0x00 -#define WHAT_EXIT 0x01 -#define WHAT_LINENO 0x02 -#define WHAT_OTHER 0x03 /* only used in decoding */ -#define WHAT_ADD_INFO 0x13 -#define WHAT_DEFINE_FILE 0x23 -#define WHAT_LINE_TIMES 0x33 -#define WHAT_DEFINE_FUNC 0x43 -#define WHAT_FRAME_TIMES 0x53 - -#define ERR_NONE 0 -#define ERR_EOF -1 -#define ERR_EXCEPTION -2 -#define ERR_BAD_RECTYPE -3 - -#define PISIZE (sizeof(int) + 1) -#define MPISIZE (PISIZE + 1) - -/* Maximum size of "normal" events -- nothing that contains string data */ -#define MAXEVENTSIZE (MPISIZE + PISIZE*2) - - -/* Unpack a packed integer; if "discard" is non-zero, unpack a modified - * packed integer with "discard" discarded bits. - */ -static int -unpack_packed_int(LogReaderObject *self, int *pvalue, int discard) -{ - int c; - int accum = 0; - int bits = 0; - int cont; - - do { - /* read byte */ - if ((c = fgetc(self->logfp)) == EOF) - return ERR_EOF; - accum |= ((c & 0x7F) >> discard) << bits; - bits += (7 - discard); - cont = c & 0x80; - discard = 0; - } while (cont); - - *pvalue = accum; - - return 0; -} - -/* Unpack a string, which is encoded as a packed integer giving the - * length of the string, followed by the string data. - */ -static int -unpack_string(LogReaderObject *self, PyObject **pvalue) -{ - int i; - int len; - int err; - int ch; - char *buf; - - if ((err = unpack_packed_int(self, &len, 0))) - return err; - - buf = (char *)malloc(len); - if (!buf) { - PyErr_NoMemory(); - return ERR_EXCEPTION; - } - - for (i=0; i < len; i++) { - ch = fgetc(self->logfp); - buf[i] = ch; - if (ch == EOF) { - free(buf); - return ERR_EOF; - } - } - *pvalue = PyString_FromStringAndSize(buf, len); - free(buf); - if (*pvalue == NULL) { - return ERR_EXCEPTION; - } - return 0; -} - - -static int -unpack_add_info(LogReaderObject *self) -{ - PyObject *key; - PyObject *value = NULL; - int err; - - err = unpack_string(self, &key); - if (!err) { - err = unpack_string(self, &value); - if (err) - Py_DECREF(key); - else { - PyObject *list = PyDict_GetItem(self->info, key); - if (list == NULL) { - list = PyList_New(0); - if (list == NULL) { - err = ERR_EXCEPTION; - goto finally; - } - if (PyDict_SetItem(self->info, key, list)) { - Py_DECREF(list); - err = ERR_EXCEPTION; - goto finally; - } - Py_DECREF(list); - } - if (PyList_Append(list, value)) - err = ERR_EXCEPTION; - } - } - finally: - Py_XDECREF(key); - Py_XDECREF(value); - return err; -} - - -static void -eof_error(LogReaderObject *self) -{ - fclose(self->logfp); - self->logfp = NULL; - PyErr_SetString(PyExc_EOFError, - "end of file with incomplete profile record"); -} - -static PyObject * -logreader_tp_iternext(LogReaderObject *self) -{ - int c; - int what; - int err = ERR_NONE; - int lineno = -1; - int fileno = -1; - int tdelta = -1; - PyObject *s1 = NULL, *s2 = NULL; - PyObject *result = NULL; -#if 0 - unsigned char b0, b1; -#endif - - if (self->logfp == NULL) { - PyErr_SetString(ProfilerError, - "cannot iterate over closed LogReader object"); - return NULL; - } - -restart: - /* decode the record type */ - if ((c = fgetc(self->logfp)) == EOF) { - fclose(self->logfp); - self->logfp = NULL; - return NULL; - } - what = c & WHAT_OTHER; - if (what == WHAT_OTHER) - what = c; /* need all the bits for type */ - else - ungetc(c, self->logfp); /* type byte includes packed int */ - - switch (what) { - case WHAT_ENTER: - err = unpack_packed_int(self, &fileno, 2); - if (!err) { - err = unpack_packed_int(self, &lineno, 0); - if (self->frametimings && !err) - err = unpack_packed_int(self, &tdelta, 0); - } - break; - case WHAT_EXIT: - err = unpack_packed_int(self, &tdelta, 2); - break; - case WHAT_LINENO: - err = unpack_packed_int(self, &lineno, 2); - if (self->linetimings && !err) - err = unpack_packed_int(self, &tdelta, 0); - break; - case WHAT_ADD_INFO: - err = unpack_add_info(self); - break; - case WHAT_DEFINE_FILE: - err = unpack_packed_int(self, &fileno, 0); - if (!err) { - err = unpack_string(self, &s1); - if (!err) { - Py_INCREF(Py_None); - s2 = Py_None; - } - } - break; - case WHAT_DEFINE_FUNC: - err = unpack_packed_int(self, &fileno, 0); - if (!err) { - err = unpack_packed_int(self, &lineno, 0); - if (!err) - err = unpack_string(self, &s1); - } - break; - case WHAT_LINE_TIMES: - if ((c = fgetc(self->logfp)) == EOF) - err = ERR_EOF; - else { - self->linetimings = c ? 1 : 0; - goto restart; - } - break; - case WHAT_FRAME_TIMES: - if ((c = fgetc(self->logfp)) == EOF) - err = ERR_EOF; - else { - self->frametimings = c ? 1 : 0; - goto restart; - } - break; - default: - err = ERR_BAD_RECTYPE; - } - if (err == ERR_BAD_RECTYPE) { - PyErr_SetString(PyExc_ValueError, - "unknown record type in log file"); - } - else if (err == ERR_EOF) { - eof_error(self); - } - else if (!err) { - result = PyTuple_New(4); - if (result == NULL) - return NULL; - PyTuple_SET_ITEM(result, 0, PyInt_FromLong(what)); - PyTuple_SET_ITEM(result, 2, PyInt_FromLong(fileno)); - if (s1 == NULL) - PyTuple_SET_ITEM(result, 1, PyInt_FromLong(tdelta)); - else - PyTuple_SET_ITEM(result, 1, s1); - if (s2 == NULL) - PyTuple_SET_ITEM(result, 3, PyInt_FromLong(lineno)); - else - PyTuple_SET_ITEM(result, 3, s2); - } - /* The only other case is err == ERR_EXCEPTION, in which case the - * exception is already set. - */ -#if 0 - b0 = self->buffer[self->index]; - b1 = self->buffer[self->index + 1]; - if (b0 & 1) { - /* This is a line-number event. */ - what = PyTrace_LINE; - lineno = ((b0 & ~1) << 7) + b1; - self->index += 2; - } - else { - what = (b0 & 0x0E) >> 1; - tdelta = ((b0 & 0xF0) << 4) + b1; - if (what == PyTrace_CALL) { - /* we know there's a 2-byte file ID & 2-byte line number */ - fileno = ((self->buffer[self->index + 2] << 8) - + self->buffer[self->index + 3]); - lineno = ((self->buffer[self->index + 4] << 8) - + self->buffer[self->index + 5]); - self->index += 6; - } - else - self->index += 2; - } -#endif - return result; -} - -static void -logreader_dealloc(LogReaderObject *self) -{ - if (self->logfp != NULL) { - fclose(self->logfp); - self->logfp = NULL; - } - Py_XDECREF(self->info); - PyObject_Del(self); -} - -static PyObject * -logreader_sq_item(LogReaderObject *self, Py_ssize_t index) -{ - PyObject *result = logreader_tp_iternext(self); - if (result == NULL && !PyErr_Occurred()) { - PyErr_SetString(PyExc_IndexError, "no more events in log"); - return NULL; - } - return result; -} - -static void -do_stop(ProfilerObject *self); - -static int -flush_data(ProfilerObject *self) -{ - /* Need to dump data to the log file... */ - size_t written = fwrite(self->buffer, 1, self->index, self->logfp); - if (written == (size_t)self->index) - self->index = 0; - else { - memmove(self->buffer, &self->buffer[written], - self->index - written); - self->index -= written; - if (written == 0) { - char *s = PyString_AsString(self->logfilename); - PyErr_SetFromErrnoWithFilename(PyExc_IOError, s); - do_stop(self); - return -1; - } - } - if (written > 0) { - if (fflush(self->logfp)) { - char *s = PyString_AsString(self->logfilename); - PyErr_SetFromErrnoWithFilename(PyExc_IOError, s); - do_stop(self); - return -1; - } - } - return 0; -} - -static inline int -pack_packed_int(ProfilerObject *self, int value) -{ - unsigned char partial; - - do { - partial = value & 0x7F; - value >>= 7; - if (value) - partial |= 0x80; - self->buffer[self->index] = partial; - self->index++; - } while (value); - return 0; -} - -/* Encode a modified packed integer, with a subfield of modsize bits - * containing the value "subfield". The value of subfield is not - * checked to ensure it actually fits in modsize bits. - */ -static inline int -pack_modified_packed_int(ProfilerObject *self, int value, - int modsize, int subfield) -{ - const int maxvalues[] = {-1, 1, 3, 7, 15, 31, 63, 127}; - - int bits = 7 - modsize; - int partial = value & maxvalues[bits]; - unsigned char b = subfield | (partial << modsize); - - if (partial != value) { - b |= 0x80; - self->buffer[self->index] = b; - self->index++; - return pack_packed_int(self, value >> bits); - } - self->buffer[self->index] = b; - self->index++; - return 0; -} - -static int -pack_string(ProfilerObject *self, const char *s, Py_ssize_t len) -{ - if (len + PISIZE + self->index >= BUFFERSIZE) { - if (flush_data(self) < 0) - return -1; - } - assert(len < INT_MAX); - if (pack_packed_int(self, (int)len) < 0) - return -1; - memcpy(self->buffer + self->index, s, len); - self->index += len; - return 0; -} - -static int -pack_add_info(ProfilerObject *self, const char *s1, const char *s2) -{ - Py_ssize_t len1 = strlen(s1); - Py_ssize_t len2 = strlen(s2); - - if (len1 + len2 + PISIZE*2 + 1 + self->index >= BUFFERSIZE) { - if (flush_data(self) < 0) - return -1; - } - self->buffer[self->index] = WHAT_ADD_INFO; - self->index++; - if (pack_string(self, s1, len1) < 0) - return -1; - return pack_string(self, s2, len2); -} - -static int -pack_define_file(ProfilerObject *self, int fileno, const char *filename) -{ - Py_ssize_t len = strlen(filename); - - if (len + PISIZE*2 + 1 + self->index >= BUFFERSIZE) { - if (flush_data(self) < 0) - return -1; - } - self->buffer[self->index] = WHAT_DEFINE_FILE; - self->index++; - if (pack_packed_int(self, fileno) < 0) - return -1; - return pack_string(self, filename, len); -} - -static int -pack_define_func(ProfilerObject *self, int fileno, int lineno, - const char *funcname) -{ - Py_ssize_t len = strlen(funcname); - - if (len + PISIZE*3 + 1 + self->index >= BUFFERSIZE) { - if (flush_data(self) < 0) - return -1; - } - self->buffer[self->index] = WHAT_DEFINE_FUNC; - self->index++; - if (pack_packed_int(self, fileno) < 0) - return -1; - if (pack_packed_int(self, lineno) < 0) - return -1; - return pack_string(self, funcname, len); -} - -static int -pack_line_times(ProfilerObject *self) -{ - if (2 + self->index >= BUFFERSIZE) { - if (flush_data(self) < 0) - return -1; - } - self->buffer[self->index] = WHAT_LINE_TIMES; - self->buffer[self->index + 1] = self->linetimings ? 1 : 0; - self->index += 2; - return 0; -} - -static int -pack_frame_times(ProfilerObject *self) -{ - if (2 + self->index >= BUFFERSIZE) { - if (flush_data(self) < 0) - return -1; - } - self->buffer[self->index] = WHAT_FRAME_TIMES; - self->buffer[self->index + 1] = self->frametimings ? 1 : 0; - self->index += 2; - return 0; -} - -static inline int -pack_enter(ProfilerObject *self, int fileno, int tdelta, int lineno) -{ - if (MPISIZE + PISIZE*2 + self->index >= BUFFERSIZE) { - if (flush_data(self) < 0) - return -1; - } - pack_modified_packed_int(self, fileno, 2, WHAT_ENTER); - pack_packed_int(self, lineno); - if (self->frametimings) - return pack_packed_int(self, tdelta); - else - return 0; -} - -static inline int -pack_exit(ProfilerObject *self, int tdelta) -{ - if (MPISIZE + self->index >= BUFFERSIZE) { - if (flush_data(self) < 0) - return -1; - } - if (self->frametimings) - return pack_modified_packed_int(self, tdelta, 2, WHAT_EXIT); - self->buffer[self->index] = WHAT_EXIT; - self->index++; - return 0; -} - -static inline int -pack_lineno(ProfilerObject *self, int lineno) -{ - if (MPISIZE + self->index >= BUFFERSIZE) { - if (flush_data(self) < 0) - return -1; - } - return pack_modified_packed_int(self, lineno, 2, WHAT_LINENO); -} - -static inline int -pack_lineno_tdelta(ProfilerObject *self, int lineno, int tdelta) -{ - if (MPISIZE + PISIZE + self->index >= BUFFERSIZE) { - if (flush_data(self) < 0) - return 0; - } - if (pack_modified_packed_int(self, lineno, 2, WHAT_LINENO) < 0) - return -1; - return pack_packed_int(self, tdelta); -} - -static inline int -get_fileno(ProfilerObject *self, PyCodeObject *fcode) -{ - /* This is only used for ENTER events. */ - - PyObject *obj; - PyObject *dict; - int fileno; - - obj = PyDict_GetItem(self->filemap, fcode->co_filename); - if (obj == NULL) { - /* first sighting of this file */ - dict = PyDict_New(); - if (dict == NULL) { - return -1; - } - fileno = self->next_fileno; - obj = Py_BuildValue("iN", fileno, dict); - if (obj == NULL) { - return -1; - } - if (PyDict_SetItem(self->filemap, fcode->co_filename, obj)) { - Py_DECREF(obj); - return -1; - } - self->next_fileno++; - Py_DECREF(obj); - if (pack_define_file(self, fileno, - PyString_AS_STRING(fcode->co_filename)) < 0) - return -1; - } - else { - /* already know this ID */ - fileno = PyInt_AS_LONG(PyTuple_GET_ITEM(obj, 0)); - dict = PyTuple_GET_ITEM(obj, 1); - } - /* make sure we save a function name for this (fileno, lineno) */ - obj = PyInt_FromLong(fcode->co_firstlineno); - if (obj == NULL) { - /* We just won't have it saved; too bad. */ - PyErr_Clear(); - } - else { - PyObject *name = PyDict_GetItem(dict, obj); - if (name == NULL) { - if (pack_define_func(self, fileno, fcode->co_firstlineno, - PyString_AS_STRING(fcode->co_name)) < 0) { - Py_DECREF(obj); - return -1; - } - if (PyDict_SetItem(dict, obj, fcode->co_name)) { - Py_DECREF(obj); - return -1; - } - } - Py_DECREF(obj); - } - return fileno; -} - -static inline int -get_tdelta(ProfilerObject *self) -{ - int tdelta; -#ifdef MS_WINDOWS - hs_time tv; - hs_time diff; - - GETTIMEOFDAY(&tv); - diff = tv - self->prev_timeofday; - tdelta = (int)diff; -#else - struct timeval tv; - - GETTIMEOFDAY(&tv); - - tdelta = tv.tv_usec - self->prev_timeofday.tv_usec; - if (tv.tv_sec != self->prev_timeofday.tv_sec) - tdelta += (tv.tv_sec - self->prev_timeofday.tv_sec) * 1000000; -#endif - /* time can go backwards on some multiprocessor systems or by NTP */ - if (tdelta < 0) - return 0; - - self->prev_timeofday = tv; - return tdelta; -} - - -/* The workhorse: the profiler callback function. */ - -static int -tracer_callback(ProfilerObject *self, PyFrameObject *frame, int what, - PyObject *arg) -{ - int fileno; - - switch (what) { - case PyTrace_CALL: - fileno = get_fileno(self, frame->f_code); - if (fileno < 0) - return -1; - return pack_enter(self, fileno, - self->frametimings ? get_tdelta(self) : -1, - frame->f_code->co_firstlineno); - - case PyTrace_RETURN: - return pack_exit(self, get_tdelta(self)); - - case PyTrace_LINE: /* we only get these events if we asked for them */ - if (self->linetimings) - return pack_lineno_tdelta(self, frame->f_lineno, - get_tdelta(self)); - else - return pack_lineno(self, frame->f_lineno); - - default: - /* ignore PyTrace_EXCEPTION */ - break; - } - return 0; -} - - -/* A couple of useful helper functions. */ - -#ifdef MS_WINDOWS -static LARGE_INTEGER frequency = {0, 0}; -#endif - -static unsigned long timeofday_diff = 0; -static unsigned long rusage_diff = 0; - -static void -calibrate(void) -{ - hs_time tv1, tv2; - -#ifdef MS_WINDOWS - hs_time diff; - QueryPerformanceFrequency(&frequency); -#endif - - GETTIMEOFDAY(&tv1); - while (1) { - GETTIMEOFDAY(&tv2); -#ifdef MS_WINDOWS - diff = tv2 - tv1; - if (diff != 0) { - timeofday_diff = (unsigned long)diff; - break; - } -#else - if (tv1.tv_sec != tv2.tv_sec || tv1.tv_usec != tv2.tv_usec) { - if (tv1.tv_sec == tv2.tv_sec) - timeofday_diff = tv2.tv_usec - tv1.tv_usec; - else - timeofday_diff = (1000000 - tv1.tv_usec) + tv2.tv_usec; - break; - } -#endif - } -#if defined(MS_WINDOWS) || defined(PYOS_OS2) || \ - defined(__VMS) || defined (__QNX__) - rusage_diff = -1; -#else - { - struct rusage ru1, ru2; - - getrusage(RUSAGE_SELF, &ru1); - while (1) { - getrusage(RUSAGE_SELF, &ru2); - if (ru1.ru_utime.tv_sec != ru2.ru_utime.tv_sec) { - rusage_diff = ((1000000 - ru1.ru_utime.tv_usec) - + ru2.ru_utime.tv_usec); - break; - } - else if (ru1.ru_utime.tv_usec != ru2.ru_utime.tv_usec) { - rusage_diff = ru2.ru_utime.tv_usec - ru1.ru_utime.tv_usec; - break; - } - else if (ru1.ru_stime.tv_sec != ru2.ru_stime.tv_sec) { - rusage_diff = ((1000000 - ru1.ru_stime.tv_usec) - + ru2.ru_stime.tv_usec); - break; - } - else if (ru1.ru_stime.tv_usec != ru2.ru_stime.tv_usec) { - rusage_diff = ru2.ru_stime.tv_usec - ru1.ru_stime.tv_usec; - break; - } - } - } -#endif -} - -static void -do_start(ProfilerObject *self) -{ - self->active = 1; - GETTIMEOFDAY(&self->prev_timeofday); - if (self->lineevents) - PyEval_SetTrace((Py_tracefunc) tracer_callback, (PyObject *)self); - else - PyEval_SetProfile((Py_tracefunc) tracer_callback, (PyObject *)self); -} - -static void -do_stop(ProfilerObject *self) -{ - if (self->active) { - self->active = 0; - if (self->lineevents) - PyEval_SetTrace(NULL, NULL); - else - PyEval_SetProfile(NULL, NULL); - } - if (self->index > 0) { - /* Best effort to dump out any remaining data. */ - flush_data(self); - } -} - -static int -is_available(ProfilerObject *self) -{ - if (self->active) { - PyErr_SetString(ProfilerError, "profiler already active"); - return 0; - } - if (self->logfp == NULL) { - PyErr_SetString(ProfilerError, "profiler already closed"); - return 0; - } - return 1; -} - - -/* Profiler object interface methods. */ - -PyDoc_STRVAR(addinfo__doc__, -"addinfo(key, value)\n" -"Insert an ADD_INFO record into the log."); - -static PyObject * -profiler_addinfo(ProfilerObject *self, PyObject *args) -{ - PyObject *result = NULL; - char *key, *value; - - if (PyArg_ParseTuple(args, "ss:addinfo", &key, &value)) { - if (self->logfp == NULL) - PyErr_SetString(ProfilerError, "profiler already closed"); - else { - if (pack_add_info(self, key, value) == 0) { - result = Py_None; - Py_INCREF(result); - } - } - } - return result; -} - -PyDoc_STRVAR(close__doc__, -"close()\n" -"Shut down this profiler and close the log files, even if its active."); - -static PyObject * -profiler_close(ProfilerObject *self) -{ - do_stop(self); - if (self->logfp != NULL) { - fclose(self->logfp); - self->logfp = NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -#define fileno__doc__ logreader_fileno__doc__ - -static PyObject * -profiler_fileno(ProfilerObject *self) -{ - if (self->logfp == NULL) { - PyErr_SetString(PyExc_ValueError, - "profiler's file object already closed"); - return NULL; - } - return PyInt_FromLong(fileno(self->logfp)); -} - -PyDoc_STRVAR(runcall__doc__, -"runcall(callable[, args[, kw]]) -> callable()\n" -"Profile a specific function call, returning the result of that call."); - -static PyObject * -profiler_runcall(ProfilerObject *self, PyObject *args) -{ - PyObject *result = NULL; - PyObject *callargs = NULL; - PyObject *callkw = NULL; - PyObject *callable; - - if (PyArg_UnpackTuple(args, "runcall", 1, 3, - &callable, &callargs, &callkw)) { - if (is_available(self)) { - do_start(self); - result = PyEval_CallObjectWithKeywords(callable, callargs, callkw); - do_stop(self); - } - } - return result; -} - -PyDoc_STRVAR(runcode__doc__, -"runcode(code, globals[, locals])\n" -"Execute a code object while collecting profile data. If locals is\n" -"omitted, globals is used for the locals as well."); - -static PyObject * -profiler_runcode(ProfilerObject *self, PyObject *args) -{ - PyObject *result = NULL; - PyCodeObject *code; - PyObject *globals; - PyObject *locals = NULL; - - if (PyArg_ParseTuple(args, "O!O!|O:runcode", - &PyCode_Type, &code, - &PyDict_Type, &globals, - &locals)) { - if (is_available(self)) { - if (locals == NULL || locals == Py_None) - locals = globals; - else if (!PyDict_Check(locals)) { - PyErr_SetString(PyExc_TypeError, - "locals must be a dictionary or None"); - return NULL; - } - do_start(self); - result = PyEval_EvalCode(code, globals, locals); - do_stop(self); -#if 0 - if (!PyErr_Occurred()) { - result = Py_None; - Py_INCREF(result); - } -#endif - } - } - return result; -} - -PyDoc_STRVAR(start__doc__, -"start()\n" -"Install this profiler for the current thread."); - -static PyObject * -profiler_start(ProfilerObject *self, PyObject *args) -{ - PyObject *result = NULL; - - if (is_available(self)) { - do_start(self); - result = Py_None; - Py_INCREF(result); - } - return result; -} - -PyDoc_STRVAR(stop__doc__, -"stop()\n" -"Remove this profiler from the current thread."); - -static PyObject * -profiler_stop(ProfilerObject *self, PyObject *args) -{ - PyObject *result = NULL; - - if (!self->active) - PyErr_SetString(ProfilerError, "profiler not active"); - else { - do_stop(self); - result = Py_None; - Py_INCREF(result); - } - return result; -} - - -/* Python API support. */ - -static void -profiler_dealloc(ProfilerObject *self) -{ - do_stop(self); - if (self->logfp != NULL) - fclose(self->logfp); - Py_XDECREF(self->filemap); - Py_XDECREF(self->logfilename); - PyObject_Del((PyObject *)self); -} - -static PyMethodDef profiler_methods[] = { - {"addinfo", (PyCFunction)profiler_addinfo, METH_VARARGS, addinfo__doc__}, - {"close", (PyCFunction)profiler_close, METH_NOARGS, close__doc__}, - {"fileno", (PyCFunction)profiler_fileno, METH_NOARGS, fileno__doc__}, - {"runcall", (PyCFunction)profiler_runcall, METH_VARARGS, runcall__doc__}, - {"runcode", (PyCFunction)profiler_runcode, METH_VARARGS, runcode__doc__}, - {"start", (PyCFunction)profiler_start, METH_NOARGS, start__doc__}, - {"stop", (PyCFunction)profiler_stop, METH_NOARGS, stop__doc__}, - {NULL, NULL} -}; - -static PyMemberDef profiler_members[] = { - {"frametimings", T_LONG, offsetof(ProfilerObject, linetimings), READONLY}, - {"lineevents", T_LONG, offsetof(ProfilerObject, lineevents), READONLY}, - {"linetimings", T_LONG, offsetof(ProfilerObject, linetimings), READONLY}, - {NULL} -}; - -static PyObject * -profiler_get_closed(ProfilerObject *self, void *closure) -{ - PyObject *result = (self->logfp == NULL) ? Py_True : Py_False; - Py_INCREF(result); - return result; -} - -static PyGetSetDef profiler_getsets[] = { - {"closed", (getter)profiler_get_closed, NULL, - PyDoc_STR("True if the profiler's output file has already been closed.")}, - {NULL} -}; - - -PyDoc_STRVAR(profiler_object__doc__, -"High-performance profiler object.\n" -"\n" -"Methods:\n" -"\n" -"close(): Stop the profiler and close the log files.\n" -"fileno(): Returns the file descriptor of the log file.\n" -"runcall(): Run a single function call with profiling enabled.\n" -"runcode(): Execute a code object with profiling enabled.\n" -"start(): Install the profiler and return.\n" -"stop(): Remove the profiler.\n" -"\n" -"Attributes (read-only):\n" -"\n" -"closed: True if the profiler has already been closed.\n" -"frametimings: True if ENTER/EXIT events collect timing information.\n" -"lineevents: True if line events are reported to the profiler.\n" -"linetimings: True if line events collect timing information."); - -static PyTypeObject ProfilerType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_hotshot.ProfilerType", /* tp_name */ - (int) sizeof(ProfilerObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)profiler_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 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, /* tp_flags */ - profiler_object__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - profiler_methods, /* tp_methods */ - profiler_members, /* tp_members */ - profiler_getsets, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ -}; - - -static PyMethodDef logreader_methods[] = { - {"close", (PyCFunction)logreader_close, METH_NOARGS, - logreader_close__doc__}, - {"fileno", (PyCFunction)logreader_fileno, METH_NOARGS, - logreader_fileno__doc__}, - {NULL, NULL} -}; - -static PyMemberDef logreader_members[] = { - {"info", T_OBJECT, offsetof(LogReaderObject, info), RO, - PyDoc_STR("Dictionary mapping informational keys to lists of values.")}, - {NULL} -}; - - -PyDoc_STRVAR(logreader__doc__, -"logreader(filename) --> log-iterator\n\ -Create a log-reader for the timing information file."); - -static PySequenceMethods logreader_as_sequence = { - 0, /* sq_length */ - 0, /* sq_concat */ - 0, /* sq_repeat */ - (ssizeargfunc)logreader_sq_item, /* sq_item */ - 0, /* sq_slice */ - 0, /* sq_ass_item */ - 0, /* sq_ass_slice */ - 0, /* sq_contains */ - 0, /* sq_inplace_concat */ - 0, /* sq_inplace_repeat */ -}; - -static PyObject * -logreader_get_closed(LogReaderObject *self, void *closure) -{ - PyObject *result = (self->logfp == NULL) ? Py_True : Py_False; - Py_INCREF(result); - return result; -} - -static PyGetSetDef logreader_getsets[] = { - {"closed", (getter)logreader_get_closed, NULL, - PyDoc_STR("True if the logreader's input file has already been closed.")}, - {NULL} -}; - -static PyTypeObject LogReaderType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_hotshot.LogReaderType", /* tp_name */ - (int) sizeof(LogReaderObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)logreader_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - &logreader_as_sequence, /* 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, /* tp_flags */ - logreader__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)logreader_tp_iternext,/* tp_iternext */ - logreader_methods, /* tp_methods */ - logreader_members, /* tp_members */ - logreader_getsets, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ -}; - -static PyObject * -hotshot_logreader(PyObject *unused, PyObject *args) -{ - LogReaderObject *self = NULL; - char *filename; - int c; - int err = 0; - - if (PyArg_ParseTuple(args, "s:logreader", &filename)) { - self = PyObject_New(LogReaderObject, &LogReaderType); - if (self != NULL) { - self->frametimings = 1; - self->linetimings = 0; - self->info = NULL; - self->logfp = fopen(filename, "rb"); - if (self->logfp == NULL) { - PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename); - goto error; - } - self->info = PyDict_New(); - if (self->info == NULL) - goto error; - /* read initial info */ - for (;;) { - if ((c = fgetc(self->logfp)) == EOF) { - eof_error(self); - goto error; - } - if (c != WHAT_ADD_INFO) { - ungetc(c, self->logfp); - break; - } - err = unpack_add_info(self); - if (err) { - if (err == ERR_EOF) - eof_error(self); - else - PyErr_SetString(PyExc_RuntimeError, - "unexpected error"); - goto error; - } - } - } - } - return (PyObject *) self; - error: - Py_DECREF(self); - return NULL; -} - - -/* Return a Python string that represents the version number without the - * extra cruft added by revision control, even if the right options were - * given to the "cvs export" command to make it not include the extra - * cruft. - */ -static char * -get_version_string(void) -{ - static char *rcsid = "$Revision$"; - char *rev = rcsid; - char *buffer; - int i = 0; - - while (*rev && !isdigit(Py_CHARMASK(*rev))) - ++rev; - while (rev[i] != ' ' && rev[i] != '\0') - ++i; - buffer = (char *)malloc(i + 1); - if (buffer != NULL) { - memmove(buffer, rev, i); - buffer[i] = '\0'; - } - return buffer; -} - -/* Write out a RFC 822-style header with various useful bits of - * information to make the output easier to manage. - */ -static int -write_header(ProfilerObject *self) -{ - char *buffer; - char cwdbuffer[PATH_MAX]; - PyObject *temp; - Py_ssize_t i, len; - - buffer = get_version_string(); - if (buffer == NULL) { - PyErr_NoMemory(); - return -1; - } - pack_add_info(self, "hotshot-version", buffer); - pack_add_info(self, "requested-frame-timings", - (self->frametimings ? "yes" : "no")); - pack_add_info(self, "requested-line-events", - (self->lineevents ? "yes" : "no")); - pack_add_info(self, "requested-line-timings", - (self->linetimings ? "yes" : "no")); - pack_add_info(self, "platform", Py_GetPlatform()); - pack_add_info(self, "executable", Py_GetProgramFullPath()); - free(buffer); - buffer = (char *) Py_GetVersion(); - if (buffer == NULL) - PyErr_Clear(); - else - pack_add_info(self, "executable-version", buffer); - -#ifdef MS_WINDOWS - PyOS_snprintf(cwdbuffer, sizeof(cwdbuffer), "%I64d", frequency.QuadPart); - pack_add_info(self, "reported-performance-frequency", cwdbuffer); -#else - PyOS_snprintf(cwdbuffer, sizeof(cwdbuffer), "%lu", rusage_diff); - pack_add_info(self, "observed-interval-getrusage", cwdbuffer); - PyOS_snprintf(cwdbuffer, sizeof(cwdbuffer), "%lu", timeofday_diff); - pack_add_info(self, "observed-interval-gettimeofday", cwdbuffer); -#endif - - pack_add_info(self, "current-directory", - getcwd(cwdbuffer, sizeof cwdbuffer)); - - temp = PySys_GetObject("path"); - if (temp == NULL || !PyList_Check(temp)) { - PyErr_SetString(PyExc_RuntimeError, "sys.path must be a list"); - return -1; - } - len = PyList_GET_SIZE(temp); - for (i = 0; i < len; ++i) { - PyObject *item = PyList_GET_ITEM(temp, i); - buffer = PyString_AsString(item); - if (buffer == NULL) { - pack_add_info(self, "sys-path-entry", "<non-string-path-entry>"); - PyErr_Clear(); - } - else { - pack_add_info(self, "sys-path-entry", buffer); - } - } - pack_frame_times(self); - pack_line_times(self); - - return 0; -} - -PyDoc_STRVAR(profiler__doc__, -"profiler(logfilename[, lineevents[, linetimes]]) -> profiler\n\ -Create a new profiler object."); - -static PyObject * -hotshot_profiler(PyObject *unused, PyObject *args) -{ - char *logfilename; - ProfilerObject *self = NULL; - int lineevents = 0; - int linetimings = 1; - - if (PyArg_ParseTuple(args, "s|ii:profiler", &logfilename, - &lineevents, &linetimings)) { - self = PyObject_New(ProfilerObject, &ProfilerType); - if (self == NULL) - return NULL; - self->frametimings = 1; - self->lineevents = lineevents ? 1 : 0; - self->linetimings = (lineevents && linetimings) ? 1 : 0; - self->index = 0; - self->active = 0; - self->next_fileno = 0; - self->logfp = NULL; - self->logfilename = PyTuple_GET_ITEM(args, 0); - Py_INCREF(self->logfilename); - self->filemap = PyDict_New(); - if (self->filemap == NULL) { - Py_DECREF(self); - return NULL; - } - self->logfp = fopen(logfilename, "wb"); - if (self->logfp == NULL) { - Py_DECREF(self); - PyErr_SetFromErrnoWithFilename(PyExc_IOError, logfilename); - return NULL; - } - if (timeofday_diff == 0) { - /* Run this several times since sometimes the first - * doesn't give the lowest values, and we're really trying - * to determine the lowest. - */ - calibrate(); - calibrate(); - calibrate(); - } - if (write_header(self)) { - /* some error occurred, exception has been set */ - Py_DECREF(self); - self = NULL; - } - } - return (PyObject *) self; -} - -PyDoc_STRVAR(coverage__doc__, -"coverage(logfilename) -> profiler\n\ -Returns a profiler that doesn't collect any timing information, which is\n\ -useful in building a coverage analysis tool."); - -static PyObject * -hotshot_coverage(PyObject *unused, PyObject *args) -{ - char *logfilename; - PyObject *result = NULL; - - if (PyArg_ParseTuple(args, "s:coverage", &logfilename)) { - result = hotshot_profiler(unused, args); - if (result != NULL) { - ProfilerObject *self = (ProfilerObject *) result; - self->frametimings = 0; - self->linetimings = 0; - self->lineevents = 1; - } - } - return result; -} - -PyDoc_VAR(resolution__doc__) = -#ifdef MS_WINDOWS -PyDoc_STR( -"resolution() -> (performance-counter-ticks, update-frequency)\n" -"Return the resolution of the timer provided by the QueryPerformanceCounter()\n" -"function. The first value is the smallest observed change, and the second\n" -"is the result of QueryPerformanceFrequency()." -) -#else -PyDoc_STR( -"resolution() -> (gettimeofday-usecs, getrusage-usecs)\n" -"Return the resolution of the timers provided by the gettimeofday() and\n" -"getrusage() system calls, or -1 if the call is not supported." -) -#endif -; - -static PyObject * -hotshot_resolution(PyObject *self, PyObject *unused) -{ - if (timeofday_diff == 0) { - calibrate(); - calibrate(); - calibrate(); - } -#ifdef MS_WINDOWS - return Py_BuildValue("ii", timeofday_diff, frequency.LowPart); -#else - return Py_BuildValue("ii", timeofday_diff, rusage_diff); -#endif -} - - -static PyMethodDef functions[] = { - {"coverage", hotshot_coverage, METH_VARARGS, coverage__doc__}, - {"profiler", hotshot_profiler, METH_VARARGS, profiler__doc__}, - {"logreader", hotshot_logreader, METH_VARARGS, logreader__doc__}, - {"resolution", hotshot_resolution, METH_NOARGS, resolution__doc__}, - {NULL, NULL} -}; - - -void -init_hotshot(void) -{ - PyObject *module; - - Py_TYPE(&LogReaderType) = &PyType_Type; - Py_TYPE(&ProfilerType) = &PyType_Type; - module = Py_InitModule("_hotshot", functions); - if (module != NULL) { - char *s = get_version_string(); - - PyModule_AddStringConstant(module, "__version__", s); - free(s); - Py_INCREF(&LogReaderType); - PyModule_AddObject(module, "LogReaderType", - (PyObject *)&LogReaderType); - Py_INCREF(&ProfilerType); - PyModule_AddObject(module, "ProfilerType", - (PyObject *)&ProfilerType); - - if (ProfilerError == NULL) - ProfilerError = PyErr_NewException("hotshot.ProfilerError", - NULL, NULL); - if (ProfilerError != NULL) { - Py_INCREF(ProfilerError); - PyModule_AddObject(module, "ProfilerError", ProfilerError); - } - PyModule_AddIntConstant(module, "WHAT_ENTER", WHAT_ENTER); - PyModule_AddIntConstant(module, "WHAT_EXIT", WHAT_EXIT); - PyModule_AddIntConstant(module, "WHAT_LINENO", WHAT_LINENO); - PyModule_AddIntConstant(module, "WHAT_OTHER", WHAT_OTHER); - PyModule_AddIntConstant(module, "WHAT_ADD_INFO", WHAT_ADD_INFO); - PyModule_AddIntConstant(module, "WHAT_DEFINE_FILE", WHAT_DEFINE_FILE); - PyModule_AddIntConstant(module, "WHAT_DEFINE_FUNC", WHAT_DEFINE_FUNC); - PyModule_AddIntConstant(module, "WHAT_LINE_TIMES", WHAT_LINE_TIMES); - } -} diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index d73dff2746f..cec06710c4e 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -176,6 +176,9 @@ PyObject *PyExc_BlockingIOError = (PyObject *)&_PyExc_BlockingIOError; * The main open() function */ PyDoc_STRVAR(open_doc, +"open(file, mode='r', buffering=-1, encoding=None,\n" +" errors=None, newline=None, closefd=True) -> file object\n" +"\n" "Open file and return a stream. Raise IOError upon failure.\n" "\n" "file is either a text or byte string giving the name (and the path\n" @@ -261,9 +264,9 @@ PyDoc_STRVAR(open_doc, "\n" "* On output, if newline is None, any '\\n' characters written are\n" " translated to the system default line separator, os.linesep. If\n" -" newline is '', no translation takes place. If newline is any of the\n" -" other legal values, any '\\n' characters written are translated to\n" -" the given string.\n" +" newline is '' or '\\n', no translation takes place. If newline is any\n" +" of the other legal values, any '\\n' characters written are translated\n" +" to the given string.\n" "\n" "If closefd is False, the underlying file descriptor will be kept open\n" "when the file is closed. This does not work when a file name is given\n" @@ -314,12 +317,7 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds) if (!PyUnicode_Check(file) && !PyBytes_Check(file) && !PyNumber_Check(file)) { - PyObject *repr = PyObject_Repr(file); - if (repr != NULL) { - PyErr_Format(PyExc_TypeError, "invalid file: %s", - PyString_AS_STRING(repr)); - Py_DECREF(repr); - } + PyErr_Format(PyExc_TypeError, "invalid file: %R", file); return NULL; } @@ -448,7 +446,7 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds) if (res == NULL) goto error; - fileno = PyInt_AsLong(res); + fileno = PyLong_AsLong(res); Py_DECREF(res); if (fileno == -1 && PyErr_Occurred()) goto error; @@ -541,12 +539,6 @@ PyNumber_AsOff_t(PyObject *item, PyObject *err) if (value == NULL) return -1; - if (PyInt_Check(value)) { - /* We assume a long always fits in a Py_off_t... */ - result = (Py_off_t) PyInt_AS_LONG(value); - goto finish; - } - /* We're done if PyLong_AsSsize_t() returns without error. */ result = PyLong_AsOff_t(value); if (result != -1 || !(runerr = PyErr_Occurred())) @@ -606,30 +598,72 @@ _PyIO_ConvertSsize_t(PyObject *obj, void *result) { } +static int +iomodule_traverse(PyObject *mod, visitproc visit, void *arg) { + _PyIO_State *state = IO_MOD_STATE(mod); + if (!state->initialized) + return 0; + Py_VISIT(state->os_module); + if (state->locale_module != NULL) { + Py_VISIT(state->locale_module); + } + Py_VISIT(state->unsupported_operation); + return 0; +} + + +static int +iomodule_clear(PyObject *mod) { + _PyIO_State *state = IO_MOD_STATE(mod); + if (!state->initialized) + return 0; + Py_CLEAR(state->os_module); + if (state->locale_module != NULL) + Py_CLEAR(state->locale_module); + Py_CLEAR(state->unsupported_operation); + return 0; +} + +static void +iomodule_free(PyObject *mod) { + iomodule_clear(mod); +} + + /* * Module definition */ -PyObject *_PyIO_os_module = NULL; -PyObject *_PyIO_locale_module = NULL; -PyObject *_PyIO_unsupported_operation = NULL; - static PyMethodDef module_methods[] = { {"open", (PyCFunction)io_open, METH_VARARGS|METH_KEYWORDS, open_doc}, {NULL, NULL} }; +struct PyModuleDef _PyIO_Module = { + PyModuleDef_HEAD_INIT, + "io", + module_doc, + sizeof(_PyIO_State), + module_methods, + NULL, + iomodule_traverse, + iomodule_clear, + (freefunc)iomodule_free, +}; + PyMODINIT_FUNC -init_io(void) +PyInit__io(void) { - PyObject *m = Py_InitModule4("_io", module_methods, - module_doc, NULL, PYTHON_API_VERSION); + PyObject *m = PyModule_Create(&_PyIO_Module); + _PyIO_State *state = NULL; if (m == NULL) - return; + return NULL; + state = IO_MOD_STATE(m); + state->initialized = 0; /* put os in the module state */ - _PyIO_os_module = PyImport_ImportModule("os"); - if (_PyIO_os_module == NULL) + state->os_module = PyImport_ImportModule("os"); + if (state->os_module == NULL) goto fail; #define ADD_TYPE(type, name) \ @@ -646,14 +680,14 @@ init_io(void) goto fail; /* UnsupportedOperation inherits from ValueError and IOError */ - _PyIO_unsupported_operation = PyObject_CallFunction( + state->unsupported_operation = PyObject_CallFunction( (PyObject *)&PyType_Type, "s(OO){}", "UnsupportedOperation", PyExc_ValueError, PyExc_IOError); - if (_PyIO_unsupported_operation == NULL) + if (state->unsupported_operation == NULL) goto fail; - Py_INCREF(_PyIO_unsupported_operation); + Py_INCREF(state->unsupported_operation); if (PyModule_AddObject(m, "UnsupportedOperation", - _PyIO_unsupported_operation) < 0) + state->unsupported_operation) < 0) goto fail; /* BlockingIOError */ @@ -676,6 +710,8 @@ init_io(void) /* BytesIO */ PyBytesIO_Type.tp_base = &PyBufferedIOBase_Type; ADD_TYPE(&PyBytesIO_Type, "BytesIO"); + if (PyType_Ready(&_PyBytesIOBuffer_Type) < 0) + goto fail; /* StringIO */ PyStringIO_Type.tp_base = &PyTextIOBase_Type; @@ -705,64 +741,55 @@ init_io(void) ADD_TYPE(&PyIncrementalNewlineDecoder_Type, "IncrementalNewlineDecoder"); /* Interned strings */ - if (!(_PyIO_str_close = PyString_InternFromString("close"))) - goto fail; - if (!(_PyIO_str_closed = PyString_InternFromString("closed"))) +#define ADD_INTERNED(name) \ + if (!_PyIO_str_ ## name && \ + !(_PyIO_str_ ## name = PyUnicode_InternFromString(# name))) \ goto fail; - if (!(_PyIO_str_decode = PyString_InternFromString("decode"))) - goto fail; - if (!(_PyIO_str_encode = PyString_InternFromString("encode"))) - goto fail; - if (!(_PyIO_str_fileno = PyString_InternFromString("fileno"))) - goto fail; - if (!(_PyIO_str_flush = PyString_InternFromString("flush"))) - goto fail; - if (!(_PyIO_str_getstate = PyString_InternFromString("getstate"))) - goto fail; - if (!(_PyIO_str_isatty = PyString_InternFromString("isatty"))) - goto fail; - if (!(_PyIO_str_newlines = PyString_InternFromString("newlines"))) - goto fail; - if (!(_PyIO_str_nl = PyString_InternFromString("\n"))) - goto fail; - if (!(_PyIO_str_read = PyString_InternFromString("read"))) - goto fail; - if (!(_PyIO_str_read1 = PyString_InternFromString("read1"))) - goto fail; - if (!(_PyIO_str_readable = PyString_InternFromString("readable"))) - goto fail; - if (!(_PyIO_str_readinto = PyString_InternFromString("readinto"))) - goto fail; - if (!(_PyIO_str_readline = PyString_InternFromString("readline"))) - goto fail; - if (!(_PyIO_str_reset = PyString_InternFromString("reset"))) - goto fail; - if (!(_PyIO_str_seek = PyString_InternFromString("seek"))) - goto fail; - if (!(_PyIO_str_seekable = PyString_InternFromString("seekable"))) - goto fail; - if (!(_PyIO_str_setstate = PyString_InternFromString("setstate"))) - goto fail; - if (!(_PyIO_str_tell = PyString_InternFromString("tell"))) - goto fail; - if (!(_PyIO_str_truncate = PyString_InternFromString("truncate"))) - goto fail; - if (!(_PyIO_str_write = PyString_InternFromString("write"))) - goto fail; - if (!(_PyIO_str_writable = PyString_InternFromString("writable"))) + + ADD_INTERNED(close) + ADD_INTERNED(closed) + ADD_INTERNED(decode) + ADD_INTERNED(encode) + ADD_INTERNED(fileno) + ADD_INTERNED(flush) + ADD_INTERNED(getstate) + ADD_INTERNED(isatty) + ADD_INTERNED(newlines) + ADD_INTERNED(read) + ADD_INTERNED(read1) + ADD_INTERNED(readable) + ADD_INTERNED(readinto) + ADD_INTERNED(readline) + ADD_INTERNED(reset) + ADD_INTERNED(seek) + ADD_INTERNED(seekable) + ADD_INTERNED(setstate) + ADD_INTERNED(tell) + ADD_INTERNED(truncate) + ADD_INTERNED(write) + ADD_INTERNED(writable) + + if (!_PyIO_str_nl && + !(_PyIO_str_nl = PyUnicode_InternFromString("\n"))) goto fail; - - if (!(_PyIO_empty_str = PyUnicode_FromStringAndSize(NULL, 0))) + + if (!_PyIO_empty_str && + !(_PyIO_empty_str = PyUnicode_FromStringAndSize(NULL, 0))) goto fail; - if (!(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0))) + if (!_PyIO_empty_bytes && + !(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0))) goto fail; - if (!(_PyIO_zero = PyLong_FromLong(0L))) + if (!_PyIO_zero && + !(_PyIO_zero = PyLong_FromLong(0L))) goto fail; - return; + state->initialized = 1; + + return m; fail: - Py_CLEAR(_PyIO_os_module); - Py_CLEAR(_PyIO_unsupported_operation); + Py_XDECREF(state->os_module); + Py_XDECREF(state->unsupported_operation); Py_DECREF(m); + return NULL; } diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h index c282e612173..aa8bfd69ddf 100644 --- a/Modules/_io/_iomodule.h +++ b/Modules/_io/_iomodule.h @@ -66,12 +66,7 @@ extern int _PyIO_trap_eintr(void); #define DEFAULT_BUFFER_SIZE (8 * 1024) /* bytes */ typedef struct { - /* This is the equivalent of PyException_HEAD in 3.x */ - PyObject_HEAD - PyObject *dict; - PyObject *args; - PyObject *message; - + PyException_HEAD PyObject *myerrno; PyObject *strerror; PyObject *filename; /* Not used, but part of the IOError object */ @@ -137,9 +132,20 @@ extern Py_off_t PyNumber_AsOff_t(PyObject *item, PyObject *err); /* Implementation details */ -extern PyObject *_PyIO_os_module; -extern PyObject *_PyIO_locale_module; -extern PyObject *_PyIO_unsupported_operation; +/* IO module structure */ + +extern PyModuleDef _PyIO_Module; + +typedef struct { + int initialized; + PyObject *os_module; + PyObject *locale_module; + + PyObject *unsupported_operation; +} _PyIO_State; + +#define IO_MOD_STATE(mod) ((_PyIO_State *)PyModule_GetState(mod)) +#define IO_STATE IO_MOD_STATE(PyState_FindModule(&_PyIO_Module)) extern PyObject *_PyIO_str_close; extern PyObject *_PyIO_str_closed; @@ -168,3 +174,5 @@ extern PyObject *_PyIO_str_write; extern PyObject *_PyIO_empty_str; extern PyObject *_PyIO_empty_bytes; extern PyObject *_PyIO_zero; + +extern PyTypeObject _PyBytesIOBuffer_Type; diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index e2d6025d33f..bb77acc0705 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -69,7 +69,7 @@ bufferediobase_readinto(PyObject *self, PyObject *args) static PyObject * bufferediobase_unsupported(const char *message) { - PyErr_SetString(_PyIO_unsupported_operation, message); + PyErr_SetString(IO_STATE->unsupported_operation, message); return NULL; } @@ -197,6 +197,7 @@ typedef struct { int detached; int readable; int writable; + int deallocating; /* True if this is a vanilla Buffered object (rather than a user derived class) *and* the raw stream is a vanilla FileIO object. */ @@ -265,13 +266,8 @@ static int _enter_buffered_busy(buffered *self) { if (self->owner == PyThread_get_thread_ident()) { - PyObject *r = PyObject_Repr((PyObject *) self); - if (r != NULL) { - PyErr_Format(PyExc_RuntimeError, - "reentrant call inside %s", - PyString_AS_STRING(r)); - Py_DECREF(r); - } + PyErr_Format(PyExc_RuntimeError, + "reentrant call inside %R", self); return 0; } Py_BEGIN_ALLOW_THREADS @@ -365,6 +361,7 @@ _enter_buffered_busy(buffered *self) static void buffered_dealloc(buffered *self) { + self->deallocating = 1; if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0) return; _PyObject_GC_UNTRACK(self); @@ -416,6 +413,23 @@ buffered_clear(buffered *self) return 0; } +/* Because this can call arbitrary code, it shouldn't be called when + the refcount is 0 (that is, not directly from tp_dealloc unless + the refcount has been temporarily re-incremented). */ +static PyObject * +buffered_dealloc_warn(buffered *self, PyObject *source) +{ + if (self->ok && self->raw) { + PyObject *r; + r = PyObject_CallMethod(self->raw, "_dealloc_warn", "O", source); + if (r) + Py_DECREF(r); + else + PyErr_Clear(); + } + Py_RETURN_NONE; +} + /* * _BufferedIOMixin methods * This is not a class, just a collection of methods that will be reused @@ -455,7 +469,7 @@ buffered_closed_get(buffered *self, void *context) static PyObject * buffered_close(buffered *self, PyObject *args) { - PyObject *res = NULL, *exc = NULL, *val, *tb; + PyObject *res = NULL; int r; CHECK_INITIALIZED(self) @@ -470,30 +484,26 @@ buffered_close(buffered *self, PyObject *args) Py_INCREF(res); goto end; } + + if (self->deallocating) { + PyObject *r = buffered_dealloc_warn(self, (PyObject *) self); + if (r) + Py_DECREF(r); + else + PyErr_Clear(); + } /* flush() will most probably re-take the lock, so drop it first */ LEAVE_BUFFERED(self) res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); if (!ENTER_BUFFERED(self)) return NULL; - if (res == NULL) - PyErr_Fetch(&exc, &val, &tb); - else - Py_DECREF(res); + if (res == NULL) { + goto end; + } + Py_XDECREF(res); res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_close, NULL); - if (exc != NULL) { - if (res != NULL) { - Py_CLEAR(res); - PyErr_Restore(exc, val, tb); - } - else { - Py_DECREF(exc); - Py_XDECREF(val); - Py_XDECREF(tb); - } - } - end: LEAVE_BUFFERED(self) return res; @@ -570,6 +580,15 @@ buffered_isatty(buffered *self, PyObject *args) return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_isatty, NULL); } +/* Serialization */ + +static PyObject * +buffered_getstate(buffered *self, PyObject *args) +{ + PyErr_Format(PyExc_TypeError, + "cannot serialize '%s' object", Py_TYPE(self)->tp_name); + return NULL; +} /* Forward decls */ static PyObject * @@ -1090,6 +1109,9 @@ buffered_seek(buffered *self, PyObject *args) CHECK_CLOSED(self, "seek of closed file") + if (_PyIOBase_check_seekable(self->raw, Py_True) == NULL) + return NULL; + target = PyNumber_AsOff_t(targetobj, PyExc_ValueError); if (target == -1 && PyErr_Occurred()) return NULL; @@ -1226,17 +1248,12 @@ buffered_repr(buffered *self) PyErr_Clear(); else return NULL; - res = PyString_FromFormat("<%s>", Py_TYPE(self)->tp_name); + res = PyUnicode_FromFormat("<%s>", Py_TYPE(self)->tp_name); } else { - PyObject *repr = PyObject_Repr(nameobj); + res = PyUnicode_FromFormat("<%s name=%R>", + Py_TYPE(self)->tp_name, nameobj); Py_DECREF(nameobj); - if (repr == NULL) - return NULL; - res = PyString_FromFormat("<%s name=%s>", - Py_TYPE(self)->tp_name, - PyString_AS_STRING(repr)); - Py_DECREF(repr); } return res; } @@ -1575,6 +1592,8 @@ static PyMethodDef bufferedreader_methods[] = { {"writable", (PyCFunction)buffered_writable, METH_NOARGS}, {"fileno", (PyCFunction)buffered_fileno, METH_NOARGS}, {"isatty", (PyCFunction)buffered_isatty, METH_NOARGS}, + {"_dealloc_warn", (PyCFunction)buffered_dealloc_warn, METH_O}, + {"__getstate__", (PyCFunction)buffered_getstate, METH_NOARGS}, {"read", (PyCFunction)buffered_read, METH_VARARGS}, {"peek", (PyCFunction)buffered_peek, METH_VARARGS}, @@ -1820,7 +1839,7 @@ bufferedwriter_write(buffered *self, PyObject *args) Py_off_t offset; CHECK_INITIALIZED(self) - if (!PyArg_ParseTuple(args, "s*:write", &buf)) { + if (!PyArg_ParseTuple(args, "y*:write", &buf)) { return NULL; } @@ -1970,6 +1989,8 @@ static PyMethodDef bufferedwriter_methods[] = { {"writable", (PyCFunction)buffered_writable, METH_NOARGS}, {"fileno", (PyCFunction)buffered_fileno, METH_NOARGS}, {"isatty", (PyCFunction)buffered_isatty, METH_NOARGS}, + {"_dealloc_warn", (PyCFunction)buffered_dealloc_warn, METH_O}, + {"__getstate__", (PyCFunction)buffered_getstate, METH_NOARGS}, {"write", (PyCFunction)bufferedwriter_write, METH_VARARGS}, {"truncate", (PyCFunction)buffered_truncate, METH_VARARGS}, @@ -2241,6 +2262,8 @@ static PyMethodDef bufferedrwpair_methods[] = { {"close", (PyCFunction)bufferedrwpair_close, METH_NOARGS}, {"isatty", (PyCFunction)bufferedrwpair_isatty, METH_NOARGS}, + {"__getstate__", (PyCFunction)buffered_getstate, METH_NOARGS}, + {NULL, NULL} }; @@ -2360,6 +2383,8 @@ static PyMethodDef bufferedrandom_methods[] = { {"writable", (PyCFunction)buffered_writable, METH_NOARGS}, {"fileno", (PyCFunction)buffered_fileno, METH_NOARGS}, {"isatty", (PyCFunction)buffered_isatty, METH_NOARGS}, + {"_dealloc_warn", (PyCFunction)buffered_dealloc_warn, METH_O}, + {"__getstate__", (PyCFunction)buffered_getstate, METH_NOARGS}, {"flush", (PyCFunction)buffered_flush, METH_NOARGS}, @@ -2430,4 +2455,3 @@ PyTypeObject PyBufferedRandom_Type = { 0, /* tp_alloc */ PyType_GenericNew, /* tp_new */ }; - diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index 64983206477..41645334075 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -10,8 +10,15 @@ typedef struct { size_t buf_size; PyObject *dict; PyObject *weakreflist; + Py_ssize_t exports; } bytesio; +typedef struct { + PyObject_HEAD + bytesio *source; +} bytesiobuf; + + #define CHECK_CLOSED(self) \ if ((self)->buf == NULL) { \ PyErr_SetString(PyExc_ValueError, \ @@ -19,6 +26,14 @@ typedef struct { return NULL; \ } +#define CHECK_EXPORTS(self) \ + if ((self)->exports > 0) { \ + PyErr_SetString(PyExc_BufferError, \ + "Existing exports of data: object cannot be re-sized"); \ + return NULL; \ + } + + /* Internal routine to get a line from the buffer of a BytesIO object. Returns the length between the current position to the next newline character. */ @@ -183,6 +198,30 @@ bytesio_flush(bytesio *self) Py_RETURN_NONE; } +PyDoc_STRVAR(getbuffer_doc, +"getbuffer() -> bytes.\n" +"\n" +"Get a read-write view over the contents of the BytesIO object."); + +static PyObject * +bytesio_getbuffer(bytesio *self) +{ + PyTypeObject *type = &_PyBytesIOBuffer_Type; + bytesiobuf *buf; + PyObject *view; + + CHECK_CLOSED(self); + + buf = (bytesiobuf *) type->tp_alloc(type, 0); + if (buf == NULL) + return NULL; + Py_INCREF(self); + buf->source = self; + view = PyMemoryView_FromObject((PyObject *) buf); + Py_DECREF(buf); + return view; +} + PyDoc_STRVAR(getval_doc, "getvalue() -> bytes.\n" "\n" @@ -236,8 +275,8 @@ bytesio_read(bytesio *self, PyObject *args) if (!PyArg_ParseTuple(args, "|O:read", &arg)) return NULL; - if (PyNumber_Check(arg)) { - size = PyNumber_AsSsize_t(arg, PyExc_OverflowError); + if (PyLong_Check(arg)) { + size = PyLong_AsSsize_t(arg); if (size == -1 && PyErr_Occurred()) return NULL; } @@ -305,8 +344,8 @@ bytesio_readline(bytesio *self, PyObject *args) if (!PyArg_ParseTuple(args, "|O:readline", &arg)) return NULL; - if (PyNumber_Check(arg)) { - size = PyNumber_AsSsize_t(arg, PyExc_OverflowError); + if (PyLong_Check(arg)) { + size = PyLong_AsSsize_t(arg); if (size == -1 && PyErr_Occurred()) return NULL; } @@ -351,8 +390,8 @@ bytesio_readlines(bytesio *self, PyObject *args) if (!PyArg_ParseTuple(args, "|O:readlines", &arg)) return NULL; - if (PyNumber_Check(arg)) { - maxsize = PyNumber_AsSsize_t(arg, PyExc_OverflowError); + if (PyLong_Check(arg)) { + maxsize = PyLong_AsSsize_t(arg); if (maxsize == -1 && PyErr_Occurred()) return NULL; } @@ -398,17 +437,16 @@ PyDoc_STRVAR(readinto_doc, "is set not to block as has no data to read."); static PyObject * -bytesio_readinto(bytesio *self, PyObject *args) +bytesio_readinto(bytesio *self, PyObject *buffer) { - Py_buffer buf; + void *raw_buffer; Py_ssize_t len, n; CHECK_CLOSED(self); - if (!PyArg_ParseTuple(args, "w*", &buf)) + if (PyObject_AsWriteBuffer(buffer, &raw_buffer, &len) == -1) return NULL; - len = buf.len; /* adjust invalid sizes */ n = self->string_size - self->pos; if (len > n) { @@ -417,12 +455,11 @@ bytesio_readinto(bytesio *self, PyObject *args) len = 0; } - memcpy(buf.buf, self->buf + self->pos, len); + memcpy(raw_buffer, self->buf + self->pos, len); assert(self->pos + len < PY_SSIZE_T_MAX); assert(len >= 0); self->pos += len; - PyBuffer_Release(&buf); return PyLong_FromSsize_t(len); } @@ -439,12 +476,13 @@ bytesio_truncate(bytesio *self, PyObject *args) PyObject *arg = Py_None; CHECK_CLOSED(self); + CHECK_EXPORTS(self); if (!PyArg_ParseTuple(args, "|O:truncate", &arg)) return NULL; - if (PyNumber_Check(arg)) { - size = PyNumber_AsSsize_t(arg, PyExc_OverflowError); + if (PyLong_Check(arg)) { + size = PyLong_AsSsize_t(arg); if (size == -1 && PyErr_Occurred()) return NULL; } @@ -501,19 +539,14 @@ PyDoc_STRVAR(seek_doc, static PyObject * bytesio_seek(bytesio *self, PyObject *args) { - PyObject *posobj; Py_ssize_t pos; int mode = 0; CHECK_CLOSED(self); - if (!PyArg_ParseTuple(args, "O|i:seek", &posobj, &mode)) + if (!PyArg_ParseTuple(args, "n|i:seek", &pos, &mode)) return NULL; - pos = PyNumber_AsSsize_t(posobj, PyExc_OverflowError); - if (pos == -1 && PyErr_Occurred()) - return NULL; - if (pos < 0 && mode == 0) { PyErr_Format(PyExc_ValueError, "negative seek value %zd", pos); @@ -565,6 +598,7 @@ bytesio_write(bytesio *self, PyObject *obj) PyObject *result = NULL; CHECK_CLOSED(self); + CHECK_EXPORTS(self); if (PyObject_GetBuffer(obj, &buf, PyBUF_CONTIG_RO) < 0) return NULL; @@ -658,8 +692,10 @@ bytesio_getstate(bytesio *self) } else { dict = PyDict_Copy(self->dict); - if (dict == NULL) + if (dict == NULL) { + Py_DECREF(initvalue); return NULL; + } } state = Py_BuildValue("(OnN)", initvalue, self->pos, dict); @@ -686,6 +722,7 @@ bytesio_setstate(bytesio *self, PyObject *state) Py_TYPE(self)->tp_name, Py_TYPE(state)->tp_name); return NULL; } + CHECK_EXPORTS(self); /* Reset the object to its default state. This is only needed to handle the case of repeated calls to __setstate__. */ self->string_size = 0; @@ -702,13 +739,13 @@ bytesio_setstate(bytesio *self, PyObject *state) method instead of modifying self->pos directly to better protect the object internal state against errneous (or malicious) inputs. */ position_obj = PyTuple_GET_ITEM(state, 1); - if (!PyIndex_Check(position_obj)) { + if (!PyLong_Check(position_obj)) { PyErr_Format(PyExc_TypeError, "second item of state must be an integer, not %.200s", Py_TYPE(position_obj)->tp_name); return NULL; } - pos = PyNumber_AsSsize_t(position_obj, PyExc_OverflowError); + pos = PyLong_AsSsize_t(position_obj); if (pos == -1 && PyErr_Occurred()) return NULL; if (pos < 0) { @@ -746,6 +783,11 @@ static void bytesio_dealloc(bytesio *self) { _PyObject_GC_UNTRACK(self); + if (self->exports > 0) { + PyErr_SetString(PyExc_SystemError, + "deallocated BytesIO object has exported buffers"); + PyErr_Print(); + } if (self->buf != NULL) { PyMem_Free(self->buf); self->buf = NULL; @@ -847,10 +889,11 @@ static struct PyMethodDef bytesio_methods[] = { {"write", (PyCFunction)bytesio_write, METH_O, write_doc}, {"writelines", (PyCFunction)bytesio_writelines, METH_O, writelines_doc}, {"read1", (PyCFunction)bytesio_read1, METH_O, read1_doc}, - {"readinto", (PyCFunction)bytesio_readinto, METH_VARARGS, readinto_doc}, + {"readinto", (PyCFunction)bytesio_readinto, METH_O, readinto_doc}, {"readline", (PyCFunction)bytesio_readline, METH_VARARGS, readline_doc}, {"readlines", (PyCFunction)bytesio_readlines, METH_VARARGS, readlines_doc}, {"read", (PyCFunction)bytesio_read, METH_VARARGS, read_doc}, + {"getbuffer", (PyCFunction)bytesio_getbuffer, METH_NOARGS, getbuffer_doc}, {"getvalue", (PyCFunction)bytesio_getvalue, METH_NOARGS, getval_doc}, {"seek", (PyCFunction)bytesio_seek, METH_VARARGS, seek_doc}, {"truncate", (PyCFunction)bytesio_truncate, METH_VARARGS, truncate_doc}, @@ -907,3 +950,96 @@ PyTypeObject PyBytesIO_Type = { 0, /*tp_alloc*/ bytesio_new, /*tp_new*/ }; + + +/* + * Implementation of the small intermediate object used by getbuffer(). + * getbuffer() returns a memoryview over this object, which should make it + * invisible from Python code. + */ + +static int +bytesiobuf_getbuffer(bytesiobuf *obj, Py_buffer *view, int flags) +{ + int ret; + void *ptr; + bytesio *b = (bytesio *) obj->source; + if (view == NULL) { + b->exports++; + return 0; + } + ptr = (void *) obj; + ret = PyBuffer_FillInfo(view, (PyObject*)obj, b->buf, b->string_size, + 0, flags); + if (ret >= 0) { + b->exports++; + } + return ret; +} + +static void +bytesiobuf_releasebuffer(bytesiobuf *obj, Py_buffer *view) +{ + bytesio *b = (bytesio *) obj->source; + b->exports--; +} + +static int +bytesiobuf_traverse(bytesiobuf *self, visitproc visit, void *arg) +{ + Py_VISIT(self->source); + return 0; +} + +static void +bytesiobuf_dealloc(bytesiobuf *self) +{ + Py_CLEAR(self->source); + Py_TYPE(self)->tp_free(self); +} + +static PyBufferProcs bytesiobuf_as_buffer = { + (getbufferproc) bytesiobuf_getbuffer, + (releasebufferproc) bytesiobuf_releasebuffer, +}; + +PyTypeObject _PyBytesIOBuffer_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_io._BytesIOBuffer", /*tp_name*/ + sizeof(bytesiobuf), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)bytesiobuf_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*/ + &bytesiobuf_as_buffer, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + (traverseproc)bytesiobuf_traverse, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + 0, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*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*/ +}; diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 54116656012..605ad51e355 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -2,6 +2,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "structmember.h" #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> #endif @@ -49,6 +50,7 @@ typedef struct { unsigned int writable : 1; signed int seekable : 2; /* -1 means unknown */ unsigned int closefd : 1; + unsigned int deallocating: 1; PyObject *weakreflist; PyObject *dict; } fileio; @@ -63,6 +65,26 @@ _PyFileIO_closed(PyObject *self) return ((fileio *)self)->fd < 0; } +/* Because this can call arbitrary code, it shouldn't be called when + the refcount is 0 (that is, not directly from tp_dealloc unless + the refcount has been temporarily re-incremented). */ +static PyObject * +fileio_dealloc_warn(fileio *self, PyObject *source) +{ + if (self->fd >= 0 && self->closefd) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + if (PyErr_WarnFormat(PyExc_ResourceWarning, 1, + "unclosed file %R", source)) { + /* Spurious errors can appear at shutdown */ + if (PyErr_ExceptionMatches(PyExc_Warning)) + PyErr_WriteUnraisable((PyObject *) self); + } + PyErr_Restore(exc, val, tb); + } + Py_RETURN_NONE; +} + static PyObject * portable_lseek(int fd, PyObject *posobj, int whence); @@ -104,6 +126,13 @@ fileio_close(fileio *self) self->fd = -1; Py_RETURN_NONE; } + if (self->deallocating) { + PyObject *r = fileio_dealloc_warn(self, (PyObject *) self); + if (r) + Py_DECREF(r); + else + PyErr_Clear(); + } errno = internal_close(self); if (errno < 0) return NULL; @@ -222,35 +251,23 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds) } #ifdef MS_WINDOWS - if (PyUnicode_Check(nameobj)) + if (PyUnicode_Check(nameobj)) { + int rv = _PyUnicode_HasNULChars(nameobj); + if (rv) { + if (rv != -1) + PyErr_SetString(PyExc_TypeError, "embedded NUL character"); + return -1; + } widename = PyUnicode_AS_UNICODE(nameobj); + } if (widename == NULL) #endif if (fd < 0) { - if (PyBytes_Check(nameobj) || PyByteArray_Check(nameobj)) { - Py_ssize_t namelen; - if (PyObject_AsCharBuffer(nameobj, &name, &namelen) < 0) - return -1; - } - else { - PyObject *u = PyUnicode_FromObject(nameobj); - - if (u == NULL) - return -1; - - stringobj = PyUnicode_AsEncodedString( - u, Py_FileSystemDefaultEncoding, NULL); - Py_DECREF(u); - if (stringobj == NULL) - return -1; - if (!PyBytes_Check(stringobj)) { - PyErr_SetString(PyExc_TypeError, - "encoder failed to return bytes"); - goto error; - } - name = PyBytes_AS_STRING(stringobj); + if (!PyUnicode_FSConverter(nameobj, &stringobj)) { + return -1; } + name = PyBytes_AS_STRING(stringobj); } s = mode; @@ -353,6 +370,11 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds) if (dircheck(self, nameobj) < 0) goto error; +#if defined(MS_WINDOWS) || defined(__CYGWIN__) + /* don't translate newlines (\r\n <=> \n) */ + _setmode(self->fd, O_BINARY); +#endif + if (PyObject_SetAttrString((PyObject *)self, "name", nameobj) < 0) goto error; @@ -369,10 +391,11 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds) goto done; error: + ret = -1; if (!fd_is_own) self->fd = -1; - - ret = -1; + if (self->fd >= 0) + internal_close(self); done: Py_CLEAR(stringobj); @@ -396,6 +419,7 @@ fileio_clear(fileio *self) static void fileio_dealloc(fileio *self) { + self->deallocating = 1; if (_PyIOBase_finalize((PyObject *) self) < 0) return; _PyObject_GC_UNTRACK(self); @@ -415,7 +439,8 @@ err_closed(void) static PyObject * err_mode(char *action) { - PyErr_Format(PyExc_ValueError, "File not open for %s", action); + PyErr_Format(IO_STATE->unsupported_operation, + "File not open for %s", action); return NULL; } @@ -424,7 +449,7 @@ fileio_fileno(fileio *self) { if (self->fd < 0) return err_closed(); - return PyInt_FromLong((long) self->fd); + return PyLong_FromLong((long) self->fd); } static PyObject * @@ -466,6 +491,7 @@ fileio_readinto(fileio *self, PyObject *args) { Py_buffer pbuf; Py_ssize_t n, len; + int err; if (self->fd < 0) return err_closed(); @@ -489,10 +515,12 @@ fileio_readinto(fileio *self, PyObject *args) Py_END_ALLOW_THREADS } else n = -1; + err = errno; PyBuffer_Release(&pbuf); if (n < 0) { - if (errno == EAGAIN) + if (err == EAGAIN) Py_RETURN_NONE; + errno = err; PyErr_SetFromErrno(PyExc_IOError); return NULL; } @@ -642,9 +670,11 @@ fileio_read(fileio *self, PyObject *args) n = -1; if (n < 0) { + int err = errno; Py_DECREF(bytes); - if (errno == EAGAIN) + if (err == EAGAIN) Py_RETURN_NONE; + errno = err; PyErr_SetFromErrno(PyExc_IOError); return NULL; } @@ -664,13 +694,14 @@ fileio_write(fileio *self, PyObject *args) { Py_buffer pbuf; Py_ssize_t n, len; + int err; if (self->fd < 0) return err_closed(); if (!self->writable) return err_mode("writing"); - if (!PyArg_ParseTuple(args, "s*", &pbuf)) + if (!PyArg_ParseTuple(args, "y*", &pbuf)) return NULL; if (_PyVerify_fd(self->fd)) { @@ -678,7 +709,14 @@ fileio_write(fileio *self, PyObject *args) errno = 0; len = pbuf.len; #if defined(MS_WIN64) || defined(MS_WINDOWS) - if (len > INT_MAX) + 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 + binary and the length is greater than 66,000 bytes (or less, + depending on heap usage). */ + len = 32767; + } + else if (len > INT_MAX) len = INT_MAX; n = write(self->fd, pbuf.buf, (int)len); #else @@ -687,12 +725,14 @@ fileio_write(fileio *self, PyObject *args) Py_END_ALLOW_THREADS } else n = -1; + err = errno; PyBuffer_Release(&pbuf); if (n < 0) { - if (errno == EAGAIN) + if (err == EAGAIN) Py_RETURN_NONE; + errno = err; PyErr_SetFromErrno(PyExc_IOError); return NULL; } @@ -905,7 +945,7 @@ fileio_repr(fileio *self) PyObject *nameobj, *res; if (self->fd < 0) - return PyString_FromFormat("<_io.FileIO [closed]>"); + return PyUnicode_FromFormat("<_io.FileIO [closed]>"); nameobj = PyObject_GetAttrString((PyObject *) self, "name"); if (nameobj == NULL) { @@ -913,18 +953,13 @@ fileio_repr(fileio *self) PyErr_Clear(); else return NULL; - res = PyString_FromFormat("<_io.FileIO fd=%d mode='%s'>", + res = PyUnicode_FromFormat("<_io.FileIO fd=%d mode='%s'>", self->fd, mode_string(self)); } else { - PyObject *repr = PyObject_Repr(nameobj); + res = PyUnicode_FromFormat("<_io.FileIO name=%R mode='%s'>", + nameobj, mode_string(self)); Py_DECREF(nameobj); - if (repr == NULL) - return NULL; - res = PyString_FromFormat("<_io.FileIO name=%s mode='%s'>", - PyString_AS_STRING(repr), - mode_string(self)); - Py_DECREF(repr); } return res; } @@ -942,6 +977,14 @@ fileio_isatty(fileio *self) return PyBool_FromLong(res); } +static PyObject * +fileio_getstate(fileio *self) +{ + PyErr_Format(PyExc_TypeError, + "cannot serialize '%s' object", Py_TYPE(self)->tp_name); + return NULL; +} + PyDoc_STRVAR(fileio_doc, "file(name: str[, mode: str]) -> file IO object\n" @@ -1035,6 +1078,8 @@ static PyMethodDef fileio_methods[] = { {"writable", (PyCFunction)fileio_writable, METH_NOARGS, writable_doc}, {"fileno", (PyCFunction)fileio_fileno, METH_NOARGS, fileno_doc}, {"isatty", (PyCFunction)fileio_isatty, METH_NOARGS, isatty_doc}, + {"_dealloc_warn", (PyCFunction)fileio_dealloc_warn, METH_O, NULL}, + {"__getstate__", (PyCFunction)fileio_getstate, METH_NOARGS, NULL}, {NULL, NULL} /* sentinel */ }; diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 04caea4cb6e..ba861467904 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -35,7 +35,8 @@ PyDoc_STRVAR(iobase_doc, "Even though IOBase does not declare read, readinto, or write because\n" "their signatures will vary, implementations and clients should\n" "consider those methods part of the interface. Also, implementations\n" - "may raise a IOError when operations they do not support are called.\n" + "may raise UnsupportedOperation when operations they do not support are\n" + "called.\n" "\n" "The basic type used for binary data read from or written to a file is\n" "bytes. bytearrays are accepted too, and in some cases (such as\n" @@ -65,7 +66,7 @@ PyDoc_STRVAR(iobase_doc, static PyObject * iobase_unsupported(const char *message) { - PyErr_SetString(_PyIO_unsupported_operation, message); + PyErr_SetString(IO_STATE->unsupported_operation, message); return NULL; } @@ -155,6 +156,19 @@ iobase_closed_get(PyObject *self, void *context) return PyBool_FromLong(IS_CLOSED(self)); } +static PyObject * +iobase_get_dict(PyObject *self) +{ + PyObject **dictptr = _PyObject_GetDictPtr(self); + PyObject *dict; + assert(dictptr); + dict = *dictptr; + if (dict == NULL) + dict = *dictptr = PyDict_New(); + Py_XINCREF(dict); + return dict; +} + PyObject * _PyIOBase_check_closed(PyObject *self, PyObject *args) { @@ -300,7 +314,7 @@ iobase_dealloc(iobase *self) PyDoc_STRVAR(iobase_seekable_doc, "Return whether object supports random access.\n" "\n" - "If False, seek(), tell() and truncate() will raise IOError.\n" + "If False, seek(), tell() and truncate() will raise UnsupportedOperation.\n" "This method may need to do a test seek()."); static PyObject * @@ -317,7 +331,7 @@ _PyIOBase_check_seekable(PyObject *self, PyObject *args) return NULL; if (res != Py_True) { Py_CLEAR(res); - PyErr_SetString(PyExc_IOError, "File or stream is not seekable."); + iobase_unsupported("File or stream is not seekable."); return NULL; } if (args == Py_True) { @@ -329,7 +343,7 @@ _PyIOBase_check_seekable(PyObject *self, PyObject *args) PyDoc_STRVAR(iobase_readable_doc, "Return whether object was opened for reading.\n" "\n" - "If False, read() will raise IOError."); + "If False, read() will raise UnsupportedOperation."); static PyObject * iobase_readable(PyObject *self, PyObject *args) @@ -346,7 +360,7 @@ _PyIOBase_check_readable(PyObject *self, PyObject *args) return NULL; if (res != Py_True) { Py_CLEAR(res); - PyErr_SetString(PyExc_IOError, "File or stream is not readable."); + iobase_unsupported("File or stream is not readable."); return NULL; } if (args == Py_True) { @@ -358,7 +372,7 @@ _PyIOBase_check_readable(PyObject *self, PyObject *args) PyDoc_STRVAR(iobase_writable_doc, "Return whether object was opened for writing.\n" "\n" - "If False, read() will raise IOError."); + "If False, write() will raise UnsupportedOperation."); static PyObject * iobase_writable(PyObject *self, PyObject *args) @@ -375,7 +389,7 @@ _PyIOBase_check_writable(PyObject *self, PyObject *args) return NULL; if (res != Py_True) { Py_CLEAR(res); - PyErr_SetString(PyExc_IOError, "File or stream is not writable."); + iobase_unsupported("File or stream is not writable."); return NULL; } if (args == Py_True) { @@ -702,6 +716,7 @@ static PyMethodDef iobase_methods[] = { }; static PyGetSetDef iobase_getset[] = { + {"__dict__", (getter)iobase_get_dict, NULL, NULL}, {"closed", (getter)iobase_closed_get, NULL, NULL}, {NULL} }; diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c index 59a3905b011..1f1fa40b02d 100644 --- a/Modules/_io/stringio.c +++ b/Modules/_io/stringio.c @@ -406,18 +406,12 @@ PyDoc_STRVAR(stringio_seek_doc, static PyObject * stringio_seek(stringio *self, PyObject *args) { - PyObject *posobj; Py_ssize_t pos; int mode = 0; CHECK_INITIALIZED(self); - if (!PyArg_ParseTuple(args, "O|i:seek", &posobj, &mode)) + if (!PyArg_ParseTuple(args, "n|i:seek", &pos, &mode)) return NULL; - - pos = PyNumber_AsSsize_t(posobj, PyExc_OverflowError); - if (pos == -1 && PyErr_Occurred()) - return NULL; - CHECK_CLOSED(self); if (mode != 0 && mode != 1 && mode != 2) { @@ -464,7 +458,7 @@ stringio_write(stringio *self, PyObject *obj) CHECK_INITIALIZED(self); if (!PyUnicode_Check(obj)) { - PyErr_Format(PyExc_TypeError, "unicode argument expected, got '%s'", + PyErr_Format(PyExc_TypeError, "string argument expected, got '%s'", Py_TYPE(obj)->tp_name); return NULL; } @@ -555,23 +549,43 @@ stringio_init(stringio *self, PyObject *args, PyObject *kwds) { char *kwlist[] = {"initial_value", "newline", NULL}; PyObject *value = NULL; + PyObject *newline_obj = NULL; char *newline = "\n"; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oz:__init__", kwlist, - &value, &newline)) + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:__init__", kwlist, + &value, &newline_obj)) return -1; + /* Parse the newline argument. This used to be done with the 'z' + specifier, however this allowed any object with the buffer interface to + be converted. Thus we have to parse it manually since we only want to + allow unicode objects or None. */ + if (newline_obj == Py_None) { + newline = NULL; + } + else if (newline_obj) { + if (!PyUnicode_Check(newline_obj)) { + PyErr_Format(PyExc_TypeError, + "newline must be str or None, not %.200s", + Py_TYPE(newline_obj)->tp_name); + return -1; + } + newline = _PyUnicode_AsString(newline_obj); + if (newline == NULL) + return -1; + } + if (newline && newline[0] != '\0' && !(newline[0] == '\n' && newline[1] == '\0') && !(newline[0] == '\r' && newline[1] == '\0') && !(newline[0] == '\r' && newline[1] == '\n' && newline[2] == '\0')) { PyErr_Format(PyExc_ValueError, - "illegal newline value: %s", newline); + "illegal newline value: %R", newline_obj); return -1; } if (value && value != Py_None && !PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, - "initial_value must be unicode or None, not %.200s", + "initial_value must be str or None, not %.200s", Py_TYPE(value)->tp_name); return -1; } @@ -582,8 +596,11 @@ stringio_init(stringio *self, PyObject *args, PyObject *kwds) Py_CLEAR(self->writenl); Py_CLEAR(self->decoder); + assert((newline != NULL && newline_obj != Py_None) || + (newline == NULL && newline_obj == Py_None)); + if (newline) { - self->readnl = PyString_FromString(newline); + self->readnl = PyUnicode_FromString(newline); if (self->readnl == NULL) return -1; } @@ -596,7 +613,8 @@ stringio_init(stringio *self, PyObject *args, PyObject *kwds) is pointless for StringIO) */ if (newline != NULL && newline[0] == '\r') { - self->writenl = PyUnicode_FromString(newline); + self->writenl = self->readnl; + Py_INCREF(self->writenl); } if (self->readuniversal) { @@ -754,13 +772,13 @@ stringio_setstate(stringio *self, PyObject *state) method instead of modifying self->pos directly to better protect the object internal state against errneous (or malicious) inputs. */ position_obj = PyTuple_GET_ITEM(state, 2); - if (!PyIndex_Check(position_obj)) { + if (!PyLong_Check(position_obj)) { PyErr_Format(PyExc_TypeError, "third item of state must be an integer, got %.200s", Py_TYPE(position_obj)->tp_name); return NULL; } - pos = PyNumber_AsSsize_t(position_obj, PyExc_OverflowError); + pos = PyLong_AsSsize_t(position_obj); if (pos == -1 && PyErr_Occurred()) return NULL; if (pos < 0) { diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index d2e92fa2017..2fbb8f30523 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -24,7 +24,7 @@ PyDoc_STRVAR(textiobase_doc, static PyObject * _unsupported(const char *message) { - PyErr_SetString(_PyIO_unsupported_operation, message); + PyErr_SetString(IO_STATE->unsupported_operation, message); return NULL; } @@ -635,9 +635,9 @@ PyDoc_STRVAR(textiowrapper_doc, "\n" "* On output, if newline is None, any '\\n' characters written are\n" " translated to the system default line separator, os.linesep. If\n" - " newline is '', no translation takes place. If newline is any of the\n" - " other legal values, any '\\n' characters written are translated to\n" - " the given string.\n" + " newline is '' or '\\n', no translation takes place. If newline is any\n" + " of the other legal values, any '\\n' characters written are translated\n" + " to the given string.\n" "\n" "If line_buffering is True, a call to flush is implied when a call to\n" "write contains a newline character." @@ -660,11 +660,14 @@ typedef struct PyObject *errors; const char *writenl; /* utf-8 encoded, NULL stands for \n */ char line_buffering; + char write_through; char readuniversal; char readtranslate; char writetranslate; char seekable; + char has_read1; char telling; + char deallocating; /* Specialized encoding func (see below) */ encodefunc_t encodefunc; /* Whether or not it's the start of the stream */ @@ -815,22 +818,23 @@ static int textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) { char *kwlist[] = {"buffer", "encoding", "errors", - "newline", "line_buffering", + "newline", "line_buffering", "write_through", NULL}; PyObject *buffer, *raw; char *encoding = NULL; char *errors = NULL; char *newline = NULL; - int line_buffering = 0; + int line_buffering = 0, write_through = 0; + _PyIO_State *state = IO_STATE; PyObject *res; int r; self->ok = 0; self->detached = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|zzzi:fileio", + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|zzzii:fileio", kwlist, &buffer, &encoding, &errors, - &newline, &line_buffering)) + &newline, &line_buffering, &write_through)) return -1; if (newline && newline[0] != '\0' @@ -855,12 +859,35 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) self->decoded_chars_used = 0; self->pending_bytes_count = 0; self->encodefunc = NULL; - self->writenl = NULL; + if (encoding == NULL) { + /* Try os.device_encoding(fileno) */ + PyObject *fileno; + fileno = PyObject_CallMethod(buffer, "fileno", NULL); + /* Ignore only AttributeError and UnsupportedOperation */ + if (fileno == NULL) { + if (PyErr_ExceptionMatches(PyExc_AttributeError) || + PyErr_ExceptionMatches(state->unsupported_operation)) { + PyErr_Clear(); + } + else { + goto error; + } + } + else { + self->encoding = PyObject_CallMethod(state->os_module, + "device_encoding", + "N", fileno); + if (self->encoding == NULL) + goto error; + else if (!PyUnicode_Check(self->encoding)) + Py_CLEAR(self->encoding); + } + } if (encoding == NULL && self->encoding == NULL) { - if (_PyIO_locale_module == NULL) { - _PyIO_locale_module = PyImport_ImportModule("locale"); - if (_PyIO_locale_module == NULL) + if (state->locale_module == NULL) { + state->locale_module = PyImport_ImportModule("locale"); + if (state->locale_module == NULL) goto catch_ImportError; else goto use_locale; @@ -868,7 +895,7 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) else { use_locale: self->encoding = PyObject_CallMethod( - _PyIO_locale_module, "getpreferredencoding", NULL); + state->locale_module, "getpreferredencoding", NULL); if (self->encoding == NULL) { catch_ImportError: /* @@ -879,19 +906,22 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) */ if (PyErr_ExceptionMatches(PyExc_ImportError)) { PyErr_Clear(); - self->encoding = PyString_FromString("ascii"); + self->encoding = PyUnicode_FromString("ascii"); } else goto error; } - else if (!PyString_Check(self->encoding)) + else if (!PyUnicode_Check(self->encoding)) Py_CLEAR(self->encoding); } } - if (self->encoding != NULL) - encoding = PyString_AsString(self->encoding); + if (self->encoding != NULL) { + encoding = _PyUnicode_AsString(self->encoding); + if (encoding == NULL) + goto error; + } else if (encoding != NULL) { - self->encoding = PyString_FromString(encoding); + self->encoding = PyUnicode_FromString(encoding); if (self->encoding == NULL) goto error; } @@ -909,15 +939,18 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) self->chunk_size = 8192; self->readuniversal = (newline == NULL || newline[0] == '\0'); self->line_buffering = line_buffering; + self->write_through = write_through; self->readtranslate = (newline == NULL); if (newline) { - self->readnl = PyString_FromString(newline); + self->readnl = PyUnicode_FromString(newline); if (self->readnl == NULL) return -1; } self->writetranslate = (newline == NULL || newline[0] != '\0'); - if (!self->readuniversal && self->writetranslate) { - self->writenl = PyString_AsString(self->readnl); + if (!self->readuniversal && self->readnl) { + self->writenl = _PyUnicode_AsString(self->readnl); + if (self->writenl == NULL) + goto error; if (!strcmp(self->writenl, "\n")) self->writenl = NULL; } @@ -977,10 +1010,10 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) else goto error; } - else if (PyString_Check(res)) { + else if (PyUnicode_Check(res)) { encodefuncentry *e = encodefuncs; while (e->name != NULL) { - if (!strcmp(PyString_AS_STRING(res), e->name)) { + if (!PyUnicode_CompareWithASCIIString(res, e->name)) { self->encodefunc = e->encodefunc; break; } @@ -1019,6 +1052,8 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds) goto error; self->seekable = self->telling = r; + self->has_read1 = PyObject_HasAttrString(buffer, "read1"); + self->encoding_start_of_stream = 0; if (self->seekable && self->encoder) { PyObject *cookieObj; @@ -1075,6 +1110,7 @@ _textiowrapper_clear(textio *self) static void textiowrapper_dealloc(textio *self) { + self->deallocating = 1; if (_textiowrapper_clear(self) < 0) return; _PyObject_GC_UNTRACK(self); @@ -1240,10 +1276,8 @@ textiowrapper_write(textio *self, PyObject *args) CHECK_CLOSED(self); - if (self->encoder == NULL) { - PyErr_SetString(PyExc_IOError, "not writable"); - return NULL; - } + if (self->encoder == NULL) + return _unsupported("not writable"); Py_INCREF(text); @@ -1263,7 +1297,9 @@ textiowrapper_write(textio *self, PyObject *args) text = newtext; } - if (self->line_buffering && + if (self->write_through) + needflush = 1; + else if (self->line_buffering && (haslf || findchar(PyUnicode_AS_UNICODE(text), PyUnicode_GET_SIZE(text), '\r'))) @@ -1380,7 +1416,7 @@ textiowrapper_read_chunk(textio *self) */ if (self->decoder == NULL) { - PyErr_SetString(PyExc_IOError, "not readable"); + _unsupported("not readable"); return -1; } @@ -1410,7 +1446,8 @@ textiowrapper_read_chunk(textio *self) if (chunk_size == NULL) goto fail; input_chunk = PyObject_CallMethodObjArgs(self->buffer, - _PyIO_str_read1, chunk_size, NULL); + (self->has_read1 ? _PyIO_str_read1: _PyIO_str_read), + chunk_size, NULL); Py_DECREF(chunk_size); if (input_chunk == NULL) goto fail; @@ -1470,10 +1507,8 @@ textiowrapper_read(textio *self, PyObject *args) CHECK_CLOSED(self); - if (self->decoder == NULL) { - PyErr_SetString(PyExc_IOError, "not readable"); - return NULL; - } + if (self->decoder == NULL) + return _unsupported("not readable"); if (_textiowrapper_writeflush(self) < 0) return NULL; @@ -1481,7 +1516,7 @@ textiowrapper_read(textio *self, PyObject *args) if (n < 0) { /* Read everything */ PyObject *bytes = PyObject_CallMethod(self->buffer, "read", NULL); - PyObject *decoded, *final; + PyObject *decoded; if (bytes == NULL) goto fail; decoded = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_decode, @@ -1497,14 +1532,12 @@ textiowrapper_read(textio *self, PyObject *args) return NULL; } - final = PyUnicode_Concat(result, decoded); - Py_DECREF(result); - Py_DECREF(decoded); - if (final == NULL) + PyUnicode_AppendAndDel(&result, decoded); + if (result == NULL) goto fail; Py_CLEAR(self->snapshot); - return final; + return result; } else { int res = 1; @@ -1622,8 +1655,8 @@ _PyIO_find_line_ending( } else { /* Non-universal mode. */ - Py_ssize_t readnl_len = PyString_GET_SIZE(readnl); - unsigned char *nl = (unsigned char *) PyString_AS_STRING(readnl); + Py_ssize_t readnl_len = PyUnicode_GET_SIZE(readnl); + Py_UNICODE *nl = PyUnicode_AS_UNICODE(readnl); if (readnl_len == 1) { Py_UNICODE *pos = find_control_char(start, end, nl[0]); if (pos != NULL) @@ -1823,24 +1856,12 @@ _textiowrapper_readline(textio *self, Py_ssize_t limit) static PyObject * textiowrapper_readline(textio *self, PyObject *args) { - PyObject *limitobj = NULL; Py_ssize_t limit = -1; CHECK_INITIALIZED(self); - if (!PyArg_ParseTuple(args, "|O:readline", &limitobj)) { + if (!PyArg_ParseTuple(args, "|n:readline", &limit)) { return NULL; } - if (limitobj) { - if (!PyNumber_Check(limitobj)) { - PyErr_Format(PyExc_TypeError, - "integer argument expected, got '%.200s'", - Py_TYPE(limitobj)->tp_name); - return NULL; - } - limit = PyNumber_AsSsize_t(limitobj, PyExc_OverflowError); - if (limit == -1 && PyErr_Occurred()) - return NULL; - } return _textiowrapper_readline(self, limit); } @@ -1945,7 +1966,7 @@ _textiowrapper_decoder_setstate(textio *self, cookie_type *cookie) res = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL); else res = PyObject_CallMethod(self->decoder, "setstate", - "((si))", "", cookie->dec_flags); + "((yi))", "", cookie->dec_flags); if (res == NULL) return -1; Py_DECREF(res); @@ -1990,8 +2011,7 @@ textiowrapper_seek(textio *self, PyObject *args) Py_INCREF(cookieObj); if (!self->seekable) { - PyErr_SetString(PyExc_IOError, - "underlying stream is not seekable"); + _unsupported("underlying stream is not seekable"); goto fail; } @@ -2002,8 +2022,7 @@ textiowrapper_seek(textio *self, PyObject *args) goto fail; if (cmp == 0) { - PyErr_SetString(PyExc_IOError, - "can't do nonzero cur-relative seeks"); + _unsupported("can't do nonzero cur-relative seeks"); goto fail; } @@ -2023,8 +2042,7 @@ textiowrapper_seek(textio *self, PyObject *args) goto fail; if (cmp == 0) { - PyErr_SetString(PyExc_IOError, - "can't do nonzero end-relative seeks"); + _unsupported("can't do nonzero end-relative seeks"); goto fail; } @@ -2057,13 +2075,8 @@ textiowrapper_seek(textio *self, PyObject *args) goto fail; if (cmp == 1) { - PyObject *repr = PyObject_Repr(cookieObj); - if (repr != NULL) { - PyErr_Format(PyExc_ValueError, - "negative seek position %s", - PyString_AS_STRING(repr)); - Py_DECREF(repr); - } + PyErr_Format(PyExc_ValueError, + "negative seek position %R", cookieObj); goto fail; } @@ -2131,7 +2144,7 @@ textiowrapper_seek(textio *self, PyObject *args) self->decoded_chars_used = cookie.chars_to_skip; } else { - self->snapshot = Py_BuildValue("is", cookie.dec_flags, ""); + self->snapshot = Py_BuildValue("iy", cookie.dec_flags, ""); if (self->snapshot == NULL) goto fail; } @@ -2163,8 +2176,7 @@ textiowrapper_tell(textio *self, PyObject *args) CHECK_CLOSED(self); if (!self->seekable) { - PyErr_SetString(PyExc_IOError, - "underlying stream is not seekable"); + _unsupported("underlying stream is not seekable"); goto fail; } if (!self->telling) { @@ -2241,7 +2253,7 @@ textiowrapper_tell(textio *self, PyObject *args) int dec_flags; PyObject *decoded = PyObject_CallMethod( - self->decoder, "decode", "s#", input, 1); + self->decoder, "decode", "y#", input, 1); if (decoded == NULL) goto fail; assert (PyUnicode_Check(decoded)); @@ -2254,7 +2266,7 @@ textiowrapper_tell(textio *self, PyObject *args) _PyIO_str_getstate, NULL); if (state == NULL) goto fail; - if (!PyArg_Parse(state, "(s#i)", &dec_buffer, &dec_buffer_len, &dec_flags)) { + if (!PyArg_Parse(state, "(y#i)", &dec_buffer, &dec_buffer_len, &dec_flags)) { Py_DECREF(state); goto fail; } @@ -2275,7 +2287,7 @@ textiowrapper_tell(textio *self, PyObject *args) if (input == input_end) { /* We didn't get enough decoded data; signal EOF to get more. */ PyObject *decoded = PyObject_CallMethod( - self->decoder, "decode", "si", "", /* final = */ 1); + self->decoder, "decode", "yi", "", /* final = */ 1); if (decoded == NULL) goto fail; assert (PyUnicode_Check(decoded)); @@ -2341,36 +2353,51 @@ textiowrapper_truncate(textio *self, PyObject *args) static PyObject * textiowrapper_repr(textio *self) { - PyObject *nameobj, *res; - PyObject *namerepr = NULL, *encrepr = NULL; + PyObject *nameobj, *modeobj, *res, *s; CHECK_INITIALIZED(self); + res = PyUnicode_FromString("<_io.TextIOWrapper"); + if (res == NULL) + return NULL; nameobj = PyObject_GetAttrString((PyObject *) self, "name"); if (nameobj == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) PyErr_Clear(); else goto error; - encrepr = PyObject_Repr(self->encoding); - res = PyString_FromFormat("<_io.TextIOWrapper encoding=%s>", - PyString_AS_STRING(encrepr)); } else { - encrepr = PyObject_Repr(self->encoding); - namerepr = PyObject_Repr(nameobj); - res = PyString_FromFormat("<_io.TextIOWrapper name=%s encoding=%s>", - PyString_AS_STRING(namerepr), - PyString_AS_STRING(encrepr)); + s = PyUnicode_FromFormat(" name=%R", nameobj); Py_DECREF(nameobj); + if (s == NULL) + goto error; + PyUnicode_AppendAndDel(&res, s); + if (res == NULL) + return NULL; } - Py_XDECREF(namerepr); - Py_XDECREF(encrepr); - return res; - + modeobj = PyObject_GetAttrString((PyObject *) self, "mode"); + if (modeobj == NULL) { + if (PyErr_ExceptionMatches(PyExc_AttributeError)) + PyErr_Clear(); + else + goto error; + } + else { + s = PyUnicode_FromFormat(" mode=%R", modeobj); + Py_DECREF(modeobj); + if (s == NULL) + goto error; + PyUnicode_AppendAndDel(&res, s); + if (res == NULL) + return NULL; + } + s = PyUnicode_FromFormat("%U encoding=%R>", + res, self->encoding); + Py_DECREF(res); + return s; error: - Py_XDECREF(namerepr); - Py_XDECREF(encrepr); + Py_XDECREF(res); return NULL; } @@ -2413,6 +2440,14 @@ textiowrapper_isatty(textio *self, PyObject *args) } static PyObject * +textiowrapper_getstate(textio *self, PyObject *args) +{ + PyErr_Format(PyExc_TypeError, + "cannot serialize '%s' object", Py_TYPE(self)->tp_name); + return NULL; +} + +static PyObject * textiowrapper_flush(textio *self, PyObject *args) { CHECK_INITIALIZED(self); @@ -2437,31 +2472,26 @@ textiowrapper_close(textio *self, PyObject *args) Py_DECREF(res); if (r < 0) return NULL; - + if (r > 0) { Py_RETURN_NONE; /* stream already closed */ } else { - PyObject *exc = NULL, *val, *tb; + if (self->deallocating) { + res = PyObject_CallMethod(self->buffer, "_dealloc_warn", "O", self); + if (res) + Py_DECREF(res); + else + PyErr_Clear(); + } res = PyObject_CallMethod((PyObject *)self, "flush", NULL); - if (res == NULL) - PyErr_Fetch(&exc, &val, &tb); + if (res == NULL) { + return NULL; + } else Py_DECREF(res); - res = PyObject_CallMethod(self->buffer, "close", NULL); - if (exc != NULL) { - if (res != NULL) { - Py_CLEAR(res); - PyErr_Restore(exc, val, tb); - } - else { - Py_DECREF(exc); - Py_XDECREF(val); - Py_XDECREF(tb); - } - } - return res; + return PyObject_CallMethod(self->buffer, "close", NULL); } } @@ -2541,8 +2571,7 @@ static PyObject * textiowrapper_errors_get(textio *self, void *context) { CHECK_INITIALIZED(self); - Py_INCREF(self->errors); - return self->errors; + return PyUnicode_FromString(PyBytes_AS_STRING(self->errors)); } static PyObject * @@ -2557,7 +2586,7 @@ textiowrapper_chunk_size_set(textio *self, PyObject *arg, void *context) { Py_ssize_t n; CHECK_INITIALIZED_INT(self); - n = PyNumber_AsSsize_t(arg, PyExc_TypeError); + n = PyNumber_AsSsize_t(arg, PyExc_ValueError); if (n == -1 && PyErr_Occurred()) return -1; if (n <= 0) { @@ -2582,6 +2611,7 @@ static PyMethodDef textiowrapper_methods[] = { {"readable", (PyCFunction)textiowrapper_readable, METH_NOARGS}, {"writable", (PyCFunction)textiowrapper_writable, METH_NOARGS}, {"isatty", (PyCFunction)textiowrapper_isatty, METH_NOARGS}, + {"__getstate__", (PyCFunction)textiowrapper_getstate, METH_NOARGS}, {"seek", (PyCFunction)textiowrapper_seek, METH_VARARGS}, {"tell", (PyCFunction)textiowrapper_tell, METH_NOARGS}, diff --git a/Modules/_json.c b/Modules/_json.c index 13f58163fe9..01436b6950a 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -20,8 +20,6 @@ typedef int Py_ssize_t; #define UNUSED #endif -#define DEFAULT_ENCODING "utf-8" - #define PyScanner_Check(op) PyObject_TypeCheck(op, &PyScannerType) #define PyScanner_CheckExact(op) (Py_TYPE(op) == &PyScannerType) #define PyEncoder_Check(op) PyObject_TypeCheck(op, &PyEncoderType) @@ -32,20 +30,19 @@ static PyTypeObject PyEncoderType; typedef struct _PyScannerObject { PyObject_HEAD - PyObject *encoding; PyObject *strict; PyObject *object_hook; - PyObject *pairs_hook; + PyObject *object_pairs_hook; PyObject *parse_float; PyObject *parse_int; PyObject *parse_constant; + PyObject *memo; } PyScannerObject; static PyMemberDef scanner_members[] = { - {"encoding", T_OBJECT, offsetof(PyScannerObject, encoding), READONLY, "encoding"}, {"strict", T_OBJECT, offsetof(PyScannerObject, strict), READONLY, "strict"}, {"object_hook", T_OBJECT, offsetof(PyScannerObject, object_hook), READONLY, "object_hook"}, - {"object_pairs_hook", T_OBJECT, offsetof(PyScannerObject, pairs_hook), READONLY, "object_pairs_hook"}, + {"object_pairs_hook", T_OBJECT, offsetof(PyScannerObject, object_pairs_hook), READONLY}, {"parse_float", T_OBJECT, offsetof(PyScannerObject, parse_float), READONLY, "parse_float"}, {"parse_int", T_OBJECT, offsetof(PyScannerObject, parse_int), READONLY, "parse_int"}, {"parse_constant", T_OBJECT, offsetof(PyScannerObject, parse_constant), READONLY, "parse_constant"}, @@ -78,18 +75,12 @@ static PyMemberDef encoder_members[] = { {NULL} }; -static Py_ssize_t -ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars); static PyObject * ascii_escape_unicode(PyObject *pystr); static PyObject * -ascii_escape_str(PyObject *pystr); -static PyObject * py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr); void init_json(void); static PyObject * -scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr); -static PyObject * scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr); static PyObject * _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx); @@ -142,7 +133,7 @@ static int _convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr) { /* PyObject to Py_ssize_t converter */ - *size_ptr = PyInt_AsSsize_t(o); + *size_ptr = PyLong_AsSsize_t(o); if (*size_ptr == -1 && PyErr_Occurred()) return 0; return 1; @@ -152,19 +143,19 @@ static PyObject * _convertPyInt_FromSsize_t(Py_ssize_t *size_ptr) { /* Py_ssize_t to PyObject converter */ - return PyInt_FromSsize_t(*size_ptr); + return PyLong_FromSsize_t(*size_ptr); } static Py_ssize_t -ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars) +ascii_escape_unichar(Py_UNICODE c, Py_UNICODE *output, Py_ssize_t chars) { /* Escape unicode code point c to ASCII escape sequences in char *output. output must have at least 12 bytes unused to accommodate an escaped surrogate pair "\uXXXX\uXXXX" */ output[chars++] = '\\'; switch (c) { - case '\\': output[chars++] = (char)c; break; - case '"': output[chars++] = (char)c; break; + case '\\': output[chars++] = c; break; + case '"': output[chars++] = c; break; case '\b': output[chars++] = 'b'; break; case '\f': output[chars++] = 'f'; break; case '\n': output[chars++] = 'n'; break; @@ -197,14 +188,14 @@ ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars) static PyObject * ascii_escape_unicode(PyObject *pystr) { - /* Take a PyUnicode pystr and return a new ASCII-only escaped PyString */ + /* Take a PyUnicode pystr and return a new ASCII-only escaped PyUnicode */ Py_ssize_t i; Py_ssize_t input_chars; Py_ssize_t output_size; Py_ssize_t max_output_size; Py_ssize_t chars; PyObject *rval; - char *output; + Py_UNICODE *output; Py_UNICODE *input_unicode; input_chars = PyUnicode_GET_SIZE(pystr); @@ -213,20 +204,20 @@ ascii_escape_unicode(PyObject *pystr) /* One char input can be up to 6 chars output, estimate 4 of these */ output_size = 2 + (MIN_EXPANSION * 4) + input_chars; max_output_size = 2 + (input_chars * MAX_EXPANSION); - rval = PyString_FromStringAndSize(NULL, output_size); + rval = PyUnicode_FromStringAndSize(NULL, output_size); if (rval == NULL) { return NULL; } - output = PyString_AS_STRING(rval); + output = PyUnicode_AS_UNICODE(rval); chars = 0; output[chars++] = '"'; for (i = 0; i < input_chars; i++) { Py_UNICODE c = input_unicode[i]; if (S_CHAR(c)) { - output[chars++] = (char)c; + output[chars++] = c; } else { - chars = ascii_escape_char(c, output, chars); + chars = ascii_escape_unichar(c, output, chars); } if (output_size - chars < (1 + MAX_EXPANSION)) { /* There's more than four, so let's resize by a lot */ @@ -238,101 +229,15 @@ ascii_escape_unicode(PyObject *pystr) /* Make sure that the output size changed before resizing */ if (new_output_size != output_size) { output_size = new_output_size; - if (_PyString_Resize(&rval, output_size) == -1) { + if (PyUnicode_Resize(&rval, output_size) == -1) { return NULL; } - output = PyString_AS_STRING(rval); - } - } - } - output[chars++] = '"'; - if (_PyString_Resize(&rval, chars) == -1) { - return NULL; - } - return rval; -} - -static PyObject * -ascii_escape_str(PyObject *pystr) -{ - /* Take a PyString pystr and return a new ASCII-only escaped PyString */ - Py_ssize_t i; - Py_ssize_t input_chars; - Py_ssize_t output_size; - Py_ssize_t chars; - PyObject *rval; - char *output; - char *input_str; - - input_chars = PyString_GET_SIZE(pystr); - input_str = PyString_AS_STRING(pystr); - - /* Fast path for a string that's already ASCII */ - for (i = 0; i < input_chars; i++) { - Py_UNICODE c = (Py_UNICODE)(unsigned char)input_str[i]; - if (!S_CHAR(c)) { - /* If we have to escape something, scan the string for unicode */ - Py_ssize_t j; - for (j = i; j < input_chars; j++) { - c = (Py_UNICODE)(unsigned char)input_str[j]; - if (c > 0x7f) { - /* We hit a non-ASCII character, bail to unicode mode */ - PyObject *uni; - uni = PyUnicode_DecodeUTF8(input_str, input_chars, "strict"); - if (uni == NULL) { - return NULL; - } - rval = ascii_escape_unicode(uni); - Py_DECREF(uni); - return rval; - } - } - break; - } - } - - if (i == input_chars) { - /* Input is already ASCII */ - output_size = 2 + input_chars; - } - else { - /* One char input can be up to 6 chars output, estimate 4 of these */ - output_size = 2 + (MIN_EXPANSION * 4) + input_chars; - } - rval = PyString_FromStringAndSize(NULL, output_size); - if (rval == NULL) { - return NULL; - } - output = PyString_AS_STRING(rval); - output[0] = '"'; - - /* We know that everything up to i is ASCII already */ - chars = i + 1; - memcpy(&output[1], input_str, i); - - for (; i < input_chars; i++) { - Py_UNICODE c = (Py_UNICODE)(unsigned char)input_str[i]; - if (S_CHAR(c)) { - output[chars++] = (char)c; - } - else { - chars = ascii_escape_char(c, output, chars); - } - /* An ASCII char can't possibly expand to a surrogate! */ - if (output_size - chars < (1 + MIN_EXPANSION)) { - /* There's more than four, so let's resize by a lot */ - output_size *= 2; - if (output_size > 2 + (input_chars * MIN_EXPANSION)) { - output_size = 2 + (input_chars * MIN_EXPANSION); - } - if (_PyString_Resize(&rval, output_size) == -1) { - return NULL; + output = PyUnicode_AS_UNICODE(rval); } - output = PyString_AS_STRING(rval); } } output[chars++] = '"'; - if (_PyString_Resize(&rval, chars) == -1) { + if (PyUnicode_Resize(&rval, chars) == -1) { return NULL; } return rval; @@ -365,18 +270,13 @@ static PyObject * join_list_unicode(PyObject *lst) { /* return u''.join(lst) */ - static PyObject *joinfn = NULL; - if (joinfn == NULL) { - PyObject *ustr = PyUnicode_FromUnicode(NULL, 0); - if (ustr == NULL) - return NULL; - - joinfn = PyObject_GetAttrString(ustr, "join"); - Py_DECREF(ustr); - if (joinfn == NULL) + static PyObject *sep = NULL; + if (sep == NULL) { + sep = PyUnicode_FromStringAndSize("", 0); + if (sep == NULL) return NULL; } - return PyObject_CallFunctionObjArgs(joinfn, lst, NULL); + return PyUnicode_Join(sep, lst); } static PyObject * @@ -390,7 +290,7 @@ _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) { if (rval == NULL) { return NULL; } - pyidx = PyInt_FromSsize_t(idx); + pyidx = PyLong_FromSsize_t(idx); if (pyidx == NULL) { Py_DECREF(rval); return NULL; @@ -406,190 +306,20 @@ _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) { return tpl; } -static PyObject * -scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_ssize_t *next_end_ptr) -{ - /* Read the JSON string from PyString pystr. - end is the index of the first character after the quote. - encoding is the encoding of pystr (must be an ASCII superset) - if strict is zero then literal control characters are allowed - *next_end_ptr is a return-by-reference index of the character - after the end quote - - Return value is a new PyString (if ASCII-only) or PyUnicode - */ - PyObject *rval; - Py_ssize_t len = PyString_GET_SIZE(pystr); - Py_ssize_t begin = end - 1; - Py_ssize_t next; - char *buf = PyString_AS_STRING(pystr); - PyObject *chunks = PyList_New(0); - if (chunks == NULL) { - goto bail; - } - if (end < 0 || len <= end) { - PyErr_SetString(PyExc_ValueError, "end is out of bounds"); - goto bail; - } - while (1) { - /* Find the end of the string or the next escape */ - Py_UNICODE c = 0; - PyObject *chunk = NULL; - for (next = end; next < len; next++) { - c = (unsigned char)buf[next]; - if (c == '"' || c == '\\') { - break; - } - else if (strict && c <= 0x1f) { - raise_errmsg("Invalid control character at", pystr, next); - goto bail; - } - } - if (!(c == '"' || c == '\\')) { - raise_errmsg("Unterminated string starting at", pystr, begin); - goto bail; - } - /* Pick up this chunk if it's not zero length */ - if (next != end) { - PyObject *strchunk = PyString_FromStringAndSize(&buf[end], next - end); - if (strchunk == NULL) { - goto bail; - } - chunk = PyUnicode_FromEncodedObject(strchunk, encoding, NULL); - Py_DECREF(strchunk); - if (chunk == NULL) { - goto bail; - } - if (PyList_Append(chunks, chunk)) { - Py_DECREF(chunk); - goto bail; - } - Py_DECREF(chunk); - } - next++; - if (c == '"') { - end = next; - break; - } - if (next == len) { - raise_errmsg("Unterminated string starting at", pystr, begin); - goto bail; - } - c = buf[next]; - if (c != 'u') { - /* Non-unicode backslash escapes */ - end = next + 1; - switch (c) { - case '"': break; - case '\\': break; - case '/': break; - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - default: c = 0; - } - if (c == 0) { - raise_errmsg("Invalid \\escape", pystr, end - 2); - goto bail; - } - } - else { - c = 0; - next++; - end = next + 4; - if (end >= len) { - raise_errmsg("Invalid \\uXXXX escape", pystr, next - 1); - goto bail; - } - /* Decode 4 hex digits */ - for (; next < end; next++) { - Py_UNICODE digit = buf[next]; - c <<= 4; - switch (digit) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - c |= (digit - '0'); break; - case 'a': case 'b': case 'c': case 'd': case 'e': - case 'f': - c |= (digit - 'a' + 10); break; - case 'A': case 'B': case 'C': case 'D': case 'E': - case 'F': - c |= (digit - 'A' + 10); break; - default: - raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); - goto bail; - } - } -#ifdef Py_UNICODE_WIDE - /* Surrogate pair */ - if ((c & 0xfc00) == 0xd800) { - Py_UNICODE c2 = 0; - if (end + 6 >= len) { - raise_errmsg("Unpaired high surrogate", pystr, end - 5); - goto bail; - } - if (buf[next++] != '\\' || buf[next++] != 'u') { - raise_errmsg("Unpaired high surrogate", pystr, end - 5); - goto bail; - } - end += 6; - /* Decode 4 hex digits */ - for (; next < end; next++) { - Py_UNICODE digit = buf[next]; - c2 <<= 4; - switch (digit) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - c2 |= (digit - '0'); break; - case 'a': case 'b': case 'c': case 'd': case 'e': - case 'f': - c2 |= (digit - 'a' + 10); break; - case 'A': case 'B': case 'C': case 'D': case 'E': - case 'F': - c2 |= (digit - 'A' + 10); break; - default: - raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); - goto bail; - } - } - if ((c2 & 0xfc00) != 0xdc00) { - raise_errmsg("Unpaired high surrogate", pystr, end - 5); - goto bail; - } - c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00)); - } - else if ((c & 0xfc00) == 0xdc00) { - raise_errmsg("Unpaired low surrogate", pystr, end - 5); - goto bail; - } -#endif - } - chunk = PyUnicode_FromUnicode(&c, 1); - if (chunk == NULL) { - goto bail; - } - if (PyList_Append(chunks, chunk)) { - Py_DECREF(chunk); - goto bail; - } - Py_DECREF(chunk); - } - - rval = join_list_unicode(chunks); - if (rval == NULL) { - goto bail; +#define APPEND_OLD_CHUNK \ + if (chunk != NULL) { \ + if (chunks == NULL) { \ + chunks = PyList_New(0); \ + if (chunks == NULL) { \ + goto bail; \ + } \ + } \ + if (PyList_Append(chunks, chunk)) { \ + Py_DECREF(chunk); \ + goto bail; \ + } \ + Py_CLEAR(chunk); \ } - Py_CLEAR(chunks); - *next_end_ptr = end; - return rval; -bail: - *next_end_ptr = -1; - Py_XDECREF(chunks); - return NULL; -} - static PyObject * scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next_end_ptr) @@ -602,15 +332,14 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next Return value is a new PyUnicode */ - PyObject *rval; + PyObject *rval = NULL; Py_ssize_t len = PyUnicode_GET_SIZE(pystr); Py_ssize_t begin = end - 1; - Py_ssize_t next; + Py_ssize_t next = begin; const Py_UNICODE *buf = PyUnicode_AS_UNICODE(pystr); - PyObject *chunks = PyList_New(0); - if (chunks == NULL) { - goto bail; - } + PyObject *chunks = NULL; + PyObject *chunk = NULL; + if (end < 0 || len <= end) { PyErr_SetString(PyExc_ValueError, "end is out of bounds"); goto bail; @@ -618,7 +347,6 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next while (1) { /* Find the end of the string or the next escape */ Py_UNICODE c = 0; - PyObject *chunk = NULL; for (next = end; next < len; next++) { c = buf[next]; if (c == '"' || c == '\\') { @@ -635,15 +363,11 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next } /* Pick up this chunk if it's not zero length */ if (next != end) { + APPEND_OLD_CHUNK chunk = PyUnicode_FromUnicode(&buf[end], next - end); if (chunk == NULL) { goto bail; } - if (PyList_Append(chunks, chunk)) { - Py_DECREF(chunk); - goto bail; - } - Py_DECREF(chunk); } next++; if (c == '"') { @@ -745,32 +469,39 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next } #endif } + APPEND_OLD_CHUNK chunk = PyUnicode_FromUnicode(&c, 1); if (chunk == NULL) { goto bail; } - if (PyList_Append(chunks, chunk)) { - Py_DECREF(chunk); + } + + if (chunks == NULL) { + if (chunk != NULL) + rval = chunk; + else + rval = PyUnicode_FromStringAndSize("", 0); + } + else { + APPEND_OLD_CHUNK + rval = join_list_unicode(chunks); + if (rval == NULL) { goto bail; } - Py_DECREF(chunk); + Py_CLEAR(chunks); } - rval = join_list_unicode(chunks); - if (rval == NULL) { - goto bail; - } - Py_DECREF(chunks); *next_end_ptr = end; return rval; bail: *next_end_ptr = -1; Py_XDECREF(chunks); + Py_XDECREF(chunk); return NULL; } PyDoc_STRVAR(pydoc_scanstring, - "scanstring(basestring, end, encoding, strict=True) -> (str, end)\n" + "scanstring(string, end, strict=True) -> (string, end)\n" "\n" "Scan the string s for a JSON string. End is the index of the\n" "character in s after the quote that started the JSON string.\n" @@ -789,18 +520,11 @@ py_scanstring(PyObject* self UNUSED, PyObject *args) PyObject *rval; Py_ssize_t end; Py_ssize_t next_end = -1; - char *encoding = NULL; int strict = 1; - if (!PyArg_ParseTuple(args, "OO&|zi:scanstring", &pystr, _convertPyInt_AsSsize_t, &end, &encoding, &strict)) { + if (!PyArg_ParseTuple(args, "OO&|i:scanstring", &pystr, _convertPyInt_AsSsize_t, &end, &strict)) { return NULL; } - if (encoding == NULL) { - encoding = DEFAULT_ENCODING; - } - if (PyString_Check(pystr)) { - rval = scanstring_str(pystr, end, encoding, strict, &next_end); - } - else if (PyUnicode_Check(pystr)) { + if (PyUnicode_Check(pystr)) { rval = scanstring_unicode(pystr, end, strict, &next_end); } else { @@ -813,7 +537,7 @@ py_scanstring(PyObject* self UNUSED, PyObject *args) } PyDoc_STRVAR(pydoc_encode_basestring_ascii, - "encode_basestring_ascii(basestring) -> str\n" + "encode_basestring_ascii(string) -> string\n" "\n" "Return an ASCII-only JSON representation of a Python string" ); @@ -821,13 +545,11 @@ PyDoc_STRVAR(pydoc_encode_basestring_ascii, static PyObject * py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr) { + PyObject *rval; /* Return an ASCII-only JSON representation of a Python string */ /* METH_O */ - if (PyString_Check(pystr)) { - return ascii_escape_str(pystr); - } - else if (PyUnicode_Check(pystr)) { - return ascii_escape_unicode(pystr); + if (PyUnicode_Check(pystr)) { + rval = ascii_escape_unicode(pystr); } else { PyErr_Format(PyExc_TypeError, @@ -835,6 +557,7 @@ py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr) Py_TYPE(pystr)->tp_name); return NULL; } + return rval; } static void @@ -851,10 +574,9 @@ scanner_traverse(PyObject *self, visitproc visit, void *arg) PyScannerObject *s; assert(PyScanner_Check(self)); s = (PyScannerObject *)self; - Py_VISIT(s->encoding); Py_VISIT(s->strict); Py_VISIT(s->object_hook); - Py_VISIT(s->pairs_hook); + Py_VISIT(s->object_pairs_hook); Py_VISIT(s->parse_float); Py_VISIT(s->parse_int); Py_VISIT(s->parse_constant); @@ -867,141 +589,17 @@ scanner_clear(PyObject *self) PyScannerObject *s; assert(PyScanner_Check(self)); s = (PyScannerObject *)self; - Py_CLEAR(s->encoding); Py_CLEAR(s->strict); Py_CLEAR(s->object_hook); - Py_CLEAR(s->pairs_hook); + Py_CLEAR(s->object_pairs_hook); Py_CLEAR(s->parse_float); Py_CLEAR(s->parse_int); Py_CLEAR(s->parse_constant); + Py_CLEAR(s->memo); return 0; } static PyObject * -_parse_object_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { - /* Read a JSON object from PyString pystr. - idx is the index of the first character after the opening curly brace. - *next_idx_ptr is a return-by-reference index to the first character after - the closing curly brace. - - Returns a new PyObject (usually a dict, but object_hook can change that) - */ - char *str = PyString_AS_STRING(pystr); - Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1; - PyObject *rval; - PyObject *pairs; - PyObject *item; - PyObject *key = NULL; - PyObject *val = NULL; - char *encoding = PyString_AS_STRING(s->encoding); - int strict = PyObject_IsTrue(s->strict); - Py_ssize_t next_idx; - - pairs = PyList_New(0); - if (pairs == NULL) - return NULL; - - /* skip whitespace after { */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* only loop if the object is non-empty */ - if (idx <= end_idx && str[idx] != '}') { - while (idx <= end_idx) { - /* read key */ - if (str[idx] != '"') { - raise_errmsg("Expecting property name", pystr, idx); - goto bail; - } - key = scanstring_str(pystr, idx + 1, encoding, strict, &next_idx); - if (key == NULL) - goto bail; - idx = next_idx; - - /* skip whitespace between key and : delimiter, read :, skip whitespace */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - if (idx > end_idx || str[idx] != ':') { - raise_errmsg("Expecting : delimiter", pystr, idx); - goto bail; - } - idx++; - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* read any JSON data type */ - val = scan_once_str(s, pystr, idx, &next_idx); - if (val == NULL) - goto bail; - - item = PyTuple_Pack(2, key, val); - if (item == NULL) - goto bail; - Py_CLEAR(key); - Py_CLEAR(val); - if (PyList_Append(pairs, item) == -1) { - Py_DECREF(item); - goto bail; - } - Py_DECREF(item); - idx = next_idx; - - /* skip whitespace before } or , */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* bail if the object is closed or we didn't get the , delimiter */ - if (idx > end_idx) break; - if (str[idx] == '}') { - break; - } - else if (str[idx] != ',') { - raise_errmsg("Expecting , delimiter", pystr, idx); - goto bail; - } - idx++; - - /* skip whitespace after , delimiter */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - } - } - /* verify that idx < end_idx, str[idx] should be '}' */ - if (idx > end_idx || str[idx] != '}') { - raise_errmsg("Expecting object", pystr, end_idx); - goto bail; - } - - /* if pairs_hook is not None: rval = object_pairs_hook(pairs) */ - if (s->pairs_hook != Py_None) { - val = PyObject_CallFunctionObjArgs(s->pairs_hook, pairs, NULL); - if (val == NULL) - goto bail; - Py_DECREF(pairs); - *next_idx_ptr = idx + 1; - return val; - } - - rval = PyObject_CallFunctionObjArgs((PyObject *)(&PyDict_Type), - pairs, NULL); - if (rval == NULL) - goto bail; - Py_CLEAR(pairs); - - /* if object_hook is not None: rval = object_hook(rval) */ - if (s->object_hook != Py_None) { - val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL); - if (val == NULL) - goto bail; - Py_DECREF(rval); - rval = val; - val = NULL; - } - *next_idx_ptr = idx + 1; - return rval; -bail: - Py_XDECREF(key); - Py_XDECREF(val); - Py_XDECREF(pairs); - return NULL; -} - -static PyObject * _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { /* Read a JSON object from PyUnicode pystr. idx is the index of the first character after the opening curly brace. @@ -1012,16 +610,18 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss */ Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1; - PyObject *rval; - PyObject *pairs; - PyObject *item; - PyObject *key = NULL; PyObject *val = NULL; + PyObject *rval = NULL; + PyObject *key = NULL; int strict = PyObject_IsTrue(s->strict); + int has_pairs_hook = (s->object_pairs_hook != Py_None); Py_ssize_t next_idx; - pairs = PyList_New(0); - if (pairs == NULL) + if (has_pairs_hook) + rval = PyList_New(0); + else + rval = PyDict_New(); + if (rval == NULL) return NULL; /* skip whitespace after { */ @@ -1030,6 +630,8 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss /* only loop if the object is non-empty */ if (idx <= end_idx && str[idx] != '}') { while (idx <= end_idx) { + PyObject *memokey; + /* read key */ if (str[idx] != '"') { raise_errmsg("Expecting property name enclosed in double quotes", pystr, idx); @@ -1038,6 +640,16 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss key = scanstring_unicode(pystr, idx + 1, strict, &next_idx); if (key == NULL) goto bail; + memokey = PyDict_GetItem(s->memo, key); + if (memokey != NULL) { + Py_INCREF(memokey); + Py_DECREF(key); + key = memokey; + } + else { + if (PyDict_SetItem(s->memo, key, key) < 0) + goto bail; + } idx = next_idx; /* skip whitespace between key and : delimiter, read :, skip whitespace */ @@ -1054,16 +666,24 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss if (val == NULL) goto bail; - item = PyTuple_Pack(2, key, val); - if (item == NULL) - goto bail; - Py_CLEAR(key); - Py_CLEAR(val); - if (PyList_Append(pairs, item) == -1) { + if (has_pairs_hook) { + PyObject *item = PyTuple_Pack(2, key, val); + if (item == NULL) + goto bail; + Py_CLEAR(key); + Py_CLEAR(val); + if (PyList_Append(rval, item) == -1) { + Py_DECREF(item); + goto bail; + } Py_DECREF(item); - goto bail; } - Py_DECREF(item); + else { + if (PyDict_SetItem(rval, key, val) < 0) + goto bail; + Py_CLEAR(key); + Py_CLEAR(val); + } idx = next_idx; /* skip whitespace before } or , */ @@ -1091,104 +711,25 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss goto bail; } - /* if pairs_hook is not None: rval = object_pairs_hook(pairs) */ - if (s->pairs_hook != Py_None) { - val = PyObject_CallFunctionObjArgs(s->pairs_hook, pairs, NULL); - if (val == NULL) - goto bail; - Py_DECREF(pairs); - *next_idx_ptr = idx + 1; + *next_idx_ptr = idx + 1; + + if (has_pairs_hook) { + val = PyObject_CallFunctionObjArgs(s->object_pairs_hook, rval, NULL); + Py_DECREF(rval); return val; } - rval = PyObject_CallFunctionObjArgs((PyObject *)(&PyDict_Type), - pairs, NULL); - if (rval == NULL) - goto bail; - Py_CLEAR(pairs); - /* if object_hook is not None: rval = object_hook(rval) */ if (s->object_hook != Py_None) { val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL); - if (val == NULL) - goto bail; Py_DECREF(rval); - rval = val; - val = NULL; + return val; } - *next_idx_ptr = idx + 1; return rval; bail: Py_XDECREF(key); Py_XDECREF(val); - Py_XDECREF(pairs); - return NULL; -} - -static PyObject * -_parse_array_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { - /* Read a JSON array from PyString pystr. - idx is the index of the first character after the opening brace. - *next_idx_ptr is a return-by-reference index to the first character after - the closing brace. - - Returns a new PyList - */ - char *str = PyString_AS_STRING(pystr); - Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1; - PyObject *val = NULL; - PyObject *rval = PyList_New(0); - Py_ssize_t next_idx; - if (rval == NULL) - return NULL; - - /* skip whitespace after [ */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* only loop if the array is non-empty */ - if (idx <= end_idx && str[idx] != ']') { - while (idx <= end_idx) { - - /* read any JSON term and de-tuplefy the (rval, idx) */ - val = scan_once_str(s, pystr, idx, &next_idx); - if (val == NULL) - goto bail; - - if (PyList_Append(rval, val) == -1) - goto bail; - - Py_CLEAR(val); - idx = next_idx; - - /* skip whitespace between term and , */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* bail if the array is closed or we didn't get the , delimiter */ - if (idx > end_idx) break; - if (str[idx] == ']') { - break; - } - else if (str[idx] != ',') { - raise_errmsg("Expecting , delimiter", pystr, idx); - goto bail; - } - idx++; - - /* skip whitespace after , */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - } - } - - /* verify that idx < end_idx, str[idx] should be ']' */ - if (idx > end_idx || str[idx] != ']') { - raise_errmsg("Expecting object", pystr, end_idx); - goto bail; - } - *next_idx_ptr = idx + 1; - return rval; -bail: - Py_XDECREF(val); - Py_DECREF(rval); + Py_XDECREF(rval); return NULL; } @@ -1273,121 +814,19 @@ _parse_constant(PyScannerObject *s, char *constant, Py_ssize_t idx, Py_ssize_t * PyObject *cstr; PyObject *rval; /* constant is "NaN", "Infinity", or "-Infinity" */ - cstr = PyString_InternFromString(constant); + cstr = PyUnicode_InternFromString(constant); if (cstr == NULL) return NULL; /* rval = parse_constant(constant) */ rval = PyObject_CallFunctionObjArgs(s->parse_constant, cstr, NULL); - idx += PyString_GET_SIZE(cstr); + idx += PyUnicode_GET_SIZE(cstr); Py_DECREF(cstr); *next_idx_ptr = idx; return rval; } static PyObject * -_match_number_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) { - /* Read a JSON number from PyString pystr. - idx is the index of the first character of the number - *next_idx_ptr is a return-by-reference index to the first character after - the number. - - Returns a new PyObject representation of that number: - PyInt, PyLong, or PyFloat. - May return other types if parse_int or parse_float are set - */ - char *str = PyString_AS_STRING(pystr); - Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1; - Py_ssize_t idx = start; - int is_float = 0; - PyObject *rval; - PyObject *numstr; - - /* read a sign if it's there, make sure it's not the end of the string */ - if (str[idx] == '-') { - idx++; - if (idx > end_idx) { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - } - - /* read as many integer digits as we find as long as it doesn't start with 0 */ - if (str[idx] >= '1' && str[idx] <= '9') { - idx++; - while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; - } - /* if it starts with 0 we only expect one integer digit */ - else if (str[idx] == '0') { - idx++; - } - /* no integer digits, error */ - else { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - - /* if the next char is '.' followed by a digit then read all float digits */ - if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') { - is_float = 1; - idx += 2; - while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; - } - - /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */ - if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) { - - /* save the index of the 'e' or 'E' just in case we need to backtrack */ - Py_ssize_t e_start = idx; - idx++; - - /* read an exponent sign if present */ - if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++; - - /* read all digits */ - while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; - - /* if we got a digit, then parse as float. if not, backtrack */ - if (str[idx - 1] >= '0' && str[idx - 1] <= '9') { - is_float = 1; - } - else { - idx = e_start; - } - } - - /* copy the section we determined to be a number */ - numstr = PyString_FromStringAndSize(&str[start], idx - start); - if (numstr == NULL) - return NULL; - if (is_float) { - /* parse as a float using a fast path if available, otherwise call user defined method */ - if (s->parse_float != (PyObject *)&PyFloat_Type) { - rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL); - } - else { - double d = PyOS_string_to_double(PyString_AS_STRING(numstr), - NULL, NULL); - if (d == -1.0 && PyErr_Occurred()) - return NULL; - rval = PyFloat_FromDouble(d); - } - } - else { - /* parse as an int using a fast path if available, otherwise call user defined method */ - if (s->parse_int != (PyObject *)&PyInt_Type) { - rval = PyObject_CallFunctionObjArgs(s->parse_int, numstr, NULL); - } - else { - rval = PyInt_FromString(PyString_AS_STRING(numstr), NULL, 10); - } - } - Py_DECREF(numstr); - *next_idx_ptr = idx; - return rval; -} - -static PyObject * _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) { /* Read a JSON number from PyUnicode pystr. idx is the index of the first character of the number @@ -1466,7 +905,7 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL); } else { - rval = PyFloat_FromString(numstr, NULL); + rval = PyFloat_FromString(numstr); } } else { @@ -1479,93 +918,6 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ } static PyObject * -scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) -{ - /* Read one JSON term (of any kind) from PyString pystr. - idx is the index of the first character of the term - *next_idx_ptr is a return-by-reference index to the first character after - the number. - - Returns a new PyObject representation of the term. - */ - PyObject *res; - char *str = PyString_AS_STRING(pystr); - Py_ssize_t length = PyString_GET_SIZE(pystr); - if (idx >= length) { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - switch (str[idx]) { - case '"': - /* string */ - return scanstring_str(pystr, idx + 1, - PyString_AS_STRING(s->encoding), - PyObject_IsTrue(s->strict), - next_idx_ptr); - case '{': - /* object */ - if (Py_EnterRecursiveCall(" while decoding a JSON object " - "from a byte string")) - return NULL; - res = _parse_object_str(s, pystr, idx + 1, next_idx_ptr); - Py_LeaveRecursiveCall(); - return res; - case '[': - /* array */ - if (Py_EnterRecursiveCall(" while decoding a JSON array " - "from a byte string")) - return NULL; - res = _parse_array_str(s, pystr, idx + 1, next_idx_ptr); - Py_LeaveRecursiveCall(); - return res; - case 'n': - /* null */ - if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') { - Py_INCREF(Py_None); - *next_idx_ptr = idx + 4; - return Py_None; - } - break; - case 't': - /* true */ - if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') { - Py_INCREF(Py_True); - *next_idx_ptr = idx + 4; - return Py_True; - } - break; - case 'f': - /* false */ - if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') { - Py_INCREF(Py_False); - *next_idx_ptr = idx + 5; - return Py_False; - } - break; - case 'N': - /* NaN */ - if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') { - return _parse_constant(s, "NaN", idx, next_idx_ptr); - } - break; - case 'I': - /* Infinity */ - if ((idx + 7 < length) && str[idx + 1] == 'n' && str[idx + 2] == 'f' && str[idx + 3] == 'i' && str[idx + 4] == 'n' && str[idx + 5] == 'i' && str[idx + 6] == 't' && str[idx + 7] == 'y') { - return _parse_constant(s, "Infinity", idx, next_idx_ptr); - } - break; - case '-': - /* -Infinity */ - if ((idx + 8 < length) && str[idx + 1] == 'I' && str[idx + 2] == 'n' && str[idx + 3] == 'f' && str[idx + 4] == 'i' && str[idx + 5] == 'n' && str[idx + 6] == 'i' && str[idx + 7] == 't' && str[idx + 8] == 'y') { - return _parse_constant(s, "-Infinity", idx, next_idx_ptr); - } - break; - } - /* Didn't find a string, object, array, or named constant. Look for a number. */ - return _match_number_str(s, pystr, idx, next_idx_ptr); -} - -static PyObject * scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { /* Read one JSON term (of any kind) from PyUnicode pystr. @@ -1666,10 +1018,7 @@ scanner_call(PyObject *self, PyObject *args, PyObject *kwds) if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:scan_once", kwlist, &pystr, _convertPyInt_AsSsize_t, &idx)) return NULL; - if (PyString_Check(pystr)) { - rval = scan_once_str(s, pystr, idx, &next_idx); - } - else if (PyUnicode_Check(pystr)) { + if (PyUnicode_Check(pystr)) { rval = scan_once_unicode(s, pystr, idx, &next_idx); } else { @@ -1678,6 +1027,9 @@ scanner_call(PyObject *self, PyObject *args, PyObject *kwds) Py_TYPE(pystr)->tp_name); return NULL; } + PyDict_Clear(s->memo); + if (rval == NULL) + return NULL; return _build_rval_index_tuple(rval, next_idx); } @@ -1687,10 +1039,9 @@ scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyScannerObject *s; s = (PyScannerObject *)type->tp_alloc(type, 0); if (s != NULL) { - s->encoding = NULL; s->strict = NULL; s->object_hook = NULL; - s->pairs_hook = NULL; + s->object_pairs_hook = NULL; s->parse_float = NULL; s->parse_int = NULL; s->parse_constant = NULL; @@ -1712,28 +1063,11 @@ scanner_init(PyObject *self, PyObject *args, PyObject *kwds) if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:make_scanner", kwlist, &ctx)) return -1; - /* PyString_AS_STRING is used on encoding */ - s->encoding = PyObject_GetAttrString(ctx, "encoding"); - if (s->encoding == NULL) - goto bail; - if (s->encoding == Py_None) { - Py_DECREF(Py_None); - s->encoding = PyString_InternFromString(DEFAULT_ENCODING); - } - else if (PyUnicode_Check(s->encoding)) { - PyObject *tmp = PyUnicode_AsEncodedString(s->encoding, NULL, NULL); - Py_DECREF(s->encoding); - s->encoding = tmp; - } - if (s->encoding == NULL) - goto bail; - if (!PyString_Check(s->encoding)) { - PyErr_Format(PyExc_TypeError, - "encoding must be a string, not %.80s", - Py_TYPE(s->encoding)->tp_name); - goto bail; + if (s->memo == NULL) { + s->memo = PyDict_New(); + if (s->memo == NULL) + goto bail; } - /* All of these will fail "gracefully" so we don't need to verify them */ s->strict = PyObject_GetAttrString(ctx, "strict"); @@ -1742,8 +1076,8 @@ scanner_init(PyObject *self, PyObject *args, PyObject *kwds) s->object_hook = PyObject_GetAttrString(ctx, "object_hook"); if (s->object_hook == NULL) goto bail; - s->pairs_hook = PyObject_GetAttrString(ctx, "object_pairs_hook"); - if (s->pairs_hook == NULL) + s->object_pairs_hook = PyObject_GetAttrString(ctx, "object_pairs_hook"); + if (s->object_pairs_hook == NULL) goto bail; s->parse_float = PyObject_GetAttrString(ctx, "parse_float"); if (s->parse_float == NULL) @@ -1758,10 +1092,9 @@ scanner_init(PyObject *self, PyObject *args, PyObject *kwds) return 0; bail: - Py_CLEAR(s->encoding); Py_CLEAR(s->strict); Py_CLEAR(s->object_hook); - Py_CLEAR(s->pairs_hook); + Py_CLEAR(s->object_pairs_hook); Py_CLEAR(s->parse_float); Py_CLEAR(s->parse_int); Py_CLEAR(s->parse_constant); @@ -1772,8 +1105,7 @@ PyDoc_STRVAR(scanner_doc, "JSON scanner object"); static PyTypeObject PyScannerType = { - PyObject_HEAD_INIT(NULL) - 0, /* tp_internal */ + PyVarObject_HEAD_INIT(NULL, 0) "_json.Scanner", /* tp_name */ sizeof(PyScannerObject), /* tp_basicsize */ 0, /* tp_itemsize */ @@ -1903,7 +1235,7 @@ _encoded_const(PyObject *obj) if (obj == Py_None) { static PyObject *s_null = NULL; if (s_null == NULL) { - s_null = PyString_InternFromString("null"); + s_null = PyUnicode_InternFromString("null"); } Py_INCREF(s_null); return s_null; @@ -1911,7 +1243,7 @@ _encoded_const(PyObject *obj) else if (obj == Py_True) { static PyObject *s_true = NULL; if (s_true == NULL) { - s_true = PyString_InternFromString("true"); + s_true = PyUnicode_InternFromString("true"); } Py_INCREF(s_true); return s_true; @@ -1919,7 +1251,7 @@ _encoded_const(PyObject *obj) else if (obj == Py_False) { static PyObject *s_false = NULL; if (s_false == NULL) { - s_false = PyString_InternFromString("false"); + s_false = PyUnicode_InternFromString("false"); } Py_INCREF(s_false); return s_false; @@ -1941,13 +1273,13 @@ encoder_encode_float(PyEncoderObject *s, PyObject *obj) return NULL; } if (i > 0) { - return PyString_FromString("Infinity"); + return PyUnicode_FromString("Infinity"); } else if (i < 0) { - return PyString_FromString("-Infinity"); + return PyUnicode_FromString("-Infinity"); } else { - return PyString_FromString("NaN"); + return PyUnicode_FromString("NaN"); } } /* Use a better float format here? */ @@ -1986,14 +1318,14 @@ encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssi return -1; return _steal_list_append(rval, cstr); } - else if (PyString_Check(obj) || PyUnicode_Check(obj)) + else if (PyUnicode_Check(obj)) { PyObject *encoded = encoder_encode_string(s, obj); if (encoded == NULL) return -1; return _steal_list_append(rval, encoded); } - else if (PyInt_Check(obj) || PyLong_Check(obj)) { + else if (PyLong_Check(obj)) { PyObject *encoded = PyObject_Str(obj); if (encoded == NULL) return -1; @@ -2074,16 +1406,16 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss static PyObject *empty_dict = NULL; PyObject *kstr = NULL; PyObject *ident = NULL; - PyObject *key = NULL; - PyObject *value = NULL; PyObject *it = NULL; + PyObject *items; + PyObject *item = NULL; int skipkeys; Py_ssize_t idx; if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) { - open_dict = PyString_InternFromString("{"); - close_dict = PyString_InternFromString("}"); - empty_dict = PyString_InternFromString("{}"); + open_dict = PyUnicode_InternFromString("{"); + close_dict = PyUnicode_InternFromString("}"); + empty_dict = PyUnicode_InternFromString("{}"); if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) return -1; } @@ -2119,17 +1451,49 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss */ } - /* TODO: C speedup not implemented for sort_keys */ - - it = PyObject_GetIter(dct); + if (PyObject_IsTrue(s->sort_keys)) { + /* First sort the keys then replace them with (key, value) tuples. */ + Py_ssize_t i, nitems; + items = PyMapping_Keys(dct); + if (items == NULL) + goto bail; + if (!PyList_Check(items)) { + PyErr_SetString(PyExc_ValueError, "keys must return list"); + goto bail; + } + if (PyList_Sort(items) < 0) + goto bail; + nitems = PyList_GET_SIZE(items); + for (i = 0; i < nitems; i++) { + PyObject *key, *value; + key = PyList_GET_ITEM(items, i); + value = PyDict_GetItem(dct, key); + item = PyTuple_Pack(2, key, value); + if (item == NULL) + goto bail; + PyList_SET_ITEM(items, i, item); + Py_DECREF(key); + } + } + else { + items = PyMapping_Items(dct); + } + if (items == NULL) + goto bail; + it = PyObject_GetIter(items); + Py_DECREF(items); if (it == NULL) goto bail; skipkeys = PyObject_IsTrue(s->skipkeys); idx = 0; - while ((key = PyIter_Next(it)) != NULL) { - PyObject *encoded; - - if (PyString_Check(key) || PyUnicode_Check(key)) { + while ((item = PyIter_Next(it)) != NULL) { + PyObject *encoded, *key, *value; + if (!PyTuple_Check(item) || Py_SIZE(item) != 2) { + PyErr_SetString(PyExc_ValueError, "items must return 2-tuples"); + goto bail; + } + key = PyTuple_GET_ITEM(item, 0); + if (PyUnicode_Check(key)) { Py_INCREF(key); kstr = key; } @@ -2138,18 +1502,20 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss if (kstr == NULL) goto bail; } - else if (PyInt_Check(key) || PyLong_Check(key)) { - kstr = PyObject_Str(key); + else if (key == Py_True || key == Py_False || key == Py_None) { + /* This must come before the PyLong_Check because + True and False are also 1 and 0.*/ + kstr = _encoded_const(key); if (kstr == NULL) goto bail; } - else if (key == Py_True || key == Py_False || key == Py_None) { - kstr = _encoded_const(key); + else if (PyLong_Check(key)) { + kstr = PyObject_Str(key); if (kstr == NULL) goto bail; } else if (skipkeys) { - Py_DECREF(key); + Py_DECREF(item); continue; } else { @@ -2163,10 +1529,6 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss goto bail; } - value = PyObject_GetItem(dct, key); - if (value == NULL) - goto bail; - encoded = encoder_encode_string(s, kstr); Py_CLEAR(kstr); if (encoded == NULL) @@ -2178,11 +1540,12 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss Py_DECREF(encoded); if (PyList_Append(rval, s->key_separator)) goto bail; + + value = PyTuple_GET_ITEM(item, 1); if (encoder_listencode_obj(s, rval, value, indent_level)) goto bail; idx += 1; - Py_CLEAR(value); - Py_DECREF(key); + Py_DECREF(item); } if (PyErr_Occurred()) goto bail; @@ -2195,9 +1558,8 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss } if (s->indent != Py_None) { /* TODO: DOES NOT RUN */ + indent_level -= 1; /* - indent_level -= 1; - yield '\n' + (' ' * (_indent * _current_indent_level)) */ } @@ -2207,8 +1569,7 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss bail: Py_XDECREF(it); - Py_XDECREF(key); - Py_XDECREF(value); + Py_XDECREF(item); Py_XDECREF(kstr); Py_XDECREF(ident); return -1; @@ -2227,9 +1588,9 @@ encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ss Py_ssize_t i; if (open_array == NULL || close_array == NULL || empty_array == NULL) { - open_array = PyString_InternFromString("["); - close_array = PyString_InternFromString("]"); - empty_array = PyString_InternFromString("[]"); + open_array = PyUnicode_InternFromString("["); + close_array = PyUnicode_InternFromString("]"); + empty_array = PyUnicode_InternFromString("[]"); if (open_array == NULL || close_array == NULL || empty_array == NULL) return -1; } @@ -2285,9 +1646,8 @@ encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ss } if (s->indent != Py_None) { /* TODO: DOES NOT RUN */ + indent_level -= 1; /* - indent_level -= 1; - yield '\n' + (' ' * (_indent * _current_indent_level)) */ } @@ -2349,8 +1709,7 @@ PyDoc_STRVAR(encoder_doc, "_iterencode(obj, _current_indent_level) -> iterable") static PyTypeObject PyEncoderType = { - PyObject_HEAD_INIT(NULL) - 0, /* tp_internal */ + PyVarObject_HEAD_INIT(NULL, 0) "_json.Encoder", /* tp_name */ sizeof(PyEncoderObject), /* tp_basicsize */ 0, /* tp_itemsize */ @@ -2406,19 +1765,42 @@ static PyMethodDef speedups_methods[] = { PyDoc_STRVAR(module_doc, "json speedups\n"); -void -init_json(void) +static struct PyModuleDef jsonmodule = { + PyModuleDef_HEAD_INIT, + "_json", + module_doc, + -1, + speedups_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyObject* +PyInit__json(void) { - PyObject *m; + PyObject *m = PyModule_Create(&jsonmodule); + if (!m) + return NULL; PyScannerType.tp_new = PyType_GenericNew; if (PyType_Ready(&PyScannerType) < 0) - return; + goto fail; PyEncoderType.tp_new = PyType_GenericNew; if (PyType_Ready(&PyEncoderType) < 0) - return; - m = Py_InitModule3("_json", speedups_methods, module_doc); + goto fail; Py_INCREF((PyObject*)&PyScannerType); - PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType); + if (PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType) < 0) { + Py_DECREF((PyObject*)&PyScannerType); + goto fail; + } Py_INCREF((PyObject*)&PyEncoderType); - PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType); + if (PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType) < 0) { + Py_DECREF((PyObject*)&PyEncoderType); + goto fail; + } + return m; + fail: + Py_DECREF(m); + return NULL; } diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 253a4dcb76d..1001dd22b76 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -1,5 +1,5 @@ /*********************************************************** -Copyright (C) 1997, 2002, 2003 Martin von Loewis +Copyright (C) 1997, 2002, 2003, 2007, 2008 Martin von Loewis Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, @@ -9,6 +9,7 @@ This software comes with no warranty. Use at your own risk. ******************************************************************/ +#define PY_SSIZE_T_CLEAN #include "Python.h" #include <stdio.h> @@ -37,14 +38,47 @@ This software comes with no warranty. Use at your own risk. #include <windows.h> #endif -#ifdef RISCOS -char *strdup(const char *); -#endif - PyDoc_STRVAR(locale__doc__, "Support for POSIX locales."); static PyObject *Error; +/* Convert a char* to a Unicode object according to the current locale */ +static PyObject* +str2uni(const char* s) +{ +#ifdef HAVE_BROKEN_MBSTOWCS + size_t needed = strlen(s); +#else + size_t needed = mbstowcs(NULL, s, 0); +#endif + size_t res1; + wchar_t smallbuf[30]; + wchar_t *dest; + PyObject *res2; + if (needed == (size_t)-1) { + PyErr_SetString(PyExc_ValueError, "Cannot convert byte to string"); + return NULL; + } + if (needed*sizeof(wchar_t) < sizeof(smallbuf)) + dest = smallbuf; + else { + dest = PyMem_Malloc((needed+1)*sizeof(wchar_t)); + if (!dest) + return PyErr_NoMemory(); + } + /* This shouldn't fail now */ + res1 = mbstowcs(dest, s, needed+1); +#ifdef HAVE_BROKEN_MBSTOWCS + assert(res1 != (size_t)-1); +#else + assert(res1 == needed); +#endif + res2 = PyUnicode_FromWideChar(dest, res1); + if (dest != smallbuf) + PyMem_Free(dest); + return res2; +} + /* support functions for formatting floating point numbers */ PyDoc_STRVAR(setlocale__doc__, @@ -58,8 +92,8 @@ copy_grouping(char* s) PyObject *result, *val = NULL; if (s[0] == '\0') - /* empty string: no grouping at all */ - return PyList_New(0); + /* empty string: no grouping at all */ + return PyList_New(0); for (i = 0; s[i] != '\0' && s[i] != CHAR_MAX; i++) ; /* nothing */ @@ -71,7 +105,7 @@ copy_grouping(char* s) i = -1; do { i++; - val = PyInt_FromLong(s[i]); + val = PyLong_FromLong(s[i]); if (!val) break; if (PyList_SetItem(result, i, val)) { @@ -89,70 +123,6 @@ copy_grouping(char* s) return result; } -static void -fixup_ulcase(void) -{ - PyObject *mods, *strop, *string, *ulo; - unsigned char ul[256]; - int n, c; - - /* find the string and strop modules */ - mods = PyImport_GetModuleDict(); - if (!mods) - return; - string = PyDict_GetItemString(mods, "string"); - if (string) - string = PyModule_GetDict(string); - strop=PyDict_GetItemString(mods, "strop"); - if (strop) - strop = PyModule_GetDict(strop); - if (!string && !strop) - return; - - /* create uppercase map string */ - n = 0; - for (c = 0; c < 256; c++) { - if (isupper(c)) - ul[n++] = c; - } - ulo = PyString_FromStringAndSize((const char *)ul, n); - if (!ulo) - return; - if (string) - PyDict_SetItemString(string, "uppercase", ulo); - if (strop) - PyDict_SetItemString(strop, "uppercase", ulo); - Py_DECREF(ulo); - - /* create lowercase string */ - n = 0; - for (c = 0; c < 256; c++) { - if (islower(c)) - ul[n++] = c; - } - ulo = PyString_FromStringAndSize((const char *)ul, n); - if (!ulo) - return; - if (string) - PyDict_SetItemString(string, "lowercase", ulo); - if (strop) - PyDict_SetItemString(strop, "lowercase", ulo); - Py_DECREF(ulo); - - /* create letters string */ - n = 0; - for (c = 0; c < 256; c++) { - if (isalpha(c)) - ul[n++] = c; - } - ulo = PyString_FromStringAndSize((const char *)ul, n); - if (!ulo) - return; - if (string) - PyDict_SetItemString(string, "letters", ulo); - Py_DECREF(ulo); -} - static PyObject* PyLocale_setlocale(PyObject* self, PyObject* args) { @@ -172,29 +142,24 @@ PyLocale_setlocale(PyObject* self, PyObject* args) #endif if (locale) { - /* set locale */ - result = setlocale(category, locale); - if (!result) { - /* operation failed, no setting was changed */ - PyErr_SetString(Error, "unsupported locale setting"); - return NULL; - } - result_object = PyString_FromString(result); - if (!result_object) - return NULL; - /* record changes to LC_CTYPE */ - if (category == LC_CTYPE || category == LC_ALL) - fixup_ulcase(); - /* things that got wrong up to here are ignored */ - PyErr_Clear(); + /* set locale */ + result = setlocale(category, locale); + if (!result) { + /* operation failed, no setting was changed */ + PyErr_SetString(Error, "unsupported locale setting"); + return NULL; + } + result_object = str2uni(result); + if (!result_object) + return NULL; } else { - /* get locale */ + /* get locale */ result = setlocale(category, NULL); if (!result) { PyErr_SetString(Error, "locale query failed"); return NULL; } - result_object = PyString_FromString(result); + result_object = str2uni(result); } return result_object; } @@ -220,13 +185,13 @@ PyLocale_localeconv(PyObject* self) involved herein */ #define RESULT_STRING(s)\ - x = PyString_FromString(l->s);\ + x = str2uni(l->s); \ if (!x) goto failed;\ PyDict_SetItemString(result, #s, x);\ Py_XDECREF(x) #define RESULT_INT(i)\ - x = PyInt_FromLong(l->i);\ + x = PyLong_FromLong(l->i);\ if (!x) goto failed;\ PyDict_SetItemString(result, #i, x);\ Py_XDECREF(x) @@ -268,116 +233,92 @@ PyLocale_localeconv(PyObject* self) return NULL; } +#if defined(HAVE_WCSCOLL) PyDoc_STRVAR(strcoll__doc__, "string,string -> int. Compares two strings according to the locale."); static PyObject* PyLocale_strcoll(PyObject* self, PyObject* args) { -#if !defined(HAVE_WCSCOLL) || !defined(Py_USING_UNICODE) - char *s1,*s2; - - if (!PyArg_ParseTuple(args, "ss:strcoll", &s1, &s2)) - return NULL; - return PyInt_FromLong(strcoll(s1, s2)); -#else PyObject *os1, *os2, *result = NULL; wchar_t *ws1 = NULL, *ws2 = NULL; - int rel1 = 0, rel2 = 0, len1, len2; - if (!PyArg_UnpackTuple(args, "strcoll", 2, 2, &os1, &os2)) + if (!PyArg_ParseTuple(args, "UU:strcoll", &os1, &os2)) return NULL; - /* If both arguments are byte strings, use strcoll. */ - if (PyString_Check(os1) && PyString_Check(os2)) - return PyInt_FromLong(strcoll(PyString_AS_STRING(os1), - PyString_AS_STRING(os2))); - /* If neither argument is unicode, it's an error. */ - if (!PyUnicode_Check(os1) && !PyUnicode_Check(os2)) { - PyErr_SetString(PyExc_ValueError, "strcoll arguments must be strings"); - } - /* Convert the non-unicode argument to unicode. */ - if (!PyUnicode_Check(os1)) { - os1 = PyUnicode_FromObject(os1); - if (!os1) - return NULL; - rel1 = 1; - } - if (!PyUnicode_Check(os2)) { - os2 = PyUnicode_FromObject(os2); - if (!os2) { - if (rel1) { - Py_DECREF(os1); - } - return NULL; - } - rel2 = 1; - } /* Convert the unicode strings to wchar[]. */ - len1 = PyUnicode_GET_SIZE(os1) + 1; - ws1 = PyMem_MALLOC(len1 * sizeof(wchar_t)); - if (!ws1) { - PyErr_NoMemory(); + ws1 = PyUnicode_AsWideCharString(os1, NULL); + if (ws1 == NULL) goto done; - } - if (PyUnicode_AsWideChar((PyUnicodeObject*)os1, ws1, len1) == -1) - goto done; - ws1[len1 - 1] = 0; - len2 = PyUnicode_GET_SIZE(os2) + 1; - ws2 = PyMem_MALLOC(len2 * sizeof(wchar_t)); - if (!ws2) { - PyErr_NoMemory(); - goto done; - } - if (PyUnicode_AsWideChar((PyUnicodeObject*)os2, ws2, len2) == -1) + ws2 = PyUnicode_AsWideCharString(os2, NULL); + if (ws2 == NULL) goto done; - ws2[len2 - 1] = 0; /* Collate the strings. */ - result = PyInt_FromLong(wcscoll(ws1, ws2)); + result = PyLong_FromLong(wcscoll(ws1, ws2)); done: /* Deallocate everything. */ if (ws1) PyMem_FREE(ws1); if (ws2) PyMem_FREE(ws2); - if (rel1) { - Py_DECREF(os1); - } - if (rel2) { - Py_DECREF(os2); - } return result; -#endif } +#endif - +#ifdef HAVE_WCSXFRM PyDoc_STRVAR(strxfrm__doc__, -"string -> string. Returns a string that behaves for cmp locale-aware."); +"strxfrm(string) -> string.\n\ +\n\ +Return a string that can be used as a key for locale-aware comparisons."); static PyObject* PyLocale_strxfrm(PyObject* self, PyObject* args) { - char *s, *buf; + Py_UNICODE *s0; + Py_ssize_t n0; + wchar_t *s, *buf = NULL; size_t n1, n2; - PyObject *result; + PyObject *result = NULL; +#if Py_UNICODE_SIZE != SIZEOF_WCHAR_T + Py_ssize_t i; +#endif - if (!PyArg_ParseTuple(args, "s:strxfrm", &s)) + if (!PyArg_ParseTuple(args, "u#:strxfrm", &s0, &n0)) return NULL; - /* assume no change in size, first */ - n1 = strlen(s) + 1; - buf = PyMem_Malloc(n1); - if (!buf) +#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T + s = (wchar_t *) s0; +#else + s = PyMem_Malloc((n0+1)*sizeof(wchar_t)); + if (!s) return PyErr_NoMemory(); - n2 = strxfrm(buf, s, n1) + 1; - if (n2 > n1) { + for (i=0; i<=n0; i++) + s[i] = s0[i]; +#endif + + /* assume no change in size, first */ + n1 = wcslen(s) + 1; + buf = PyMem_Malloc(n1*sizeof(wchar_t)); + if (!buf) { + PyErr_NoMemory(); + goto exit; + } + n2 = wcsxfrm(buf, s, n1); + if (n2 >= n1) { /* more space needed */ - buf = PyMem_Realloc(buf, n2); - if (!buf) - return PyErr_NoMemory(); - strxfrm(buf, s, n2); + buf = PyMem_Realloc(buf, (n2+1)*sizeof(wchar_t)); + if (!buf) { + PyErr_NoMemory(); + goto exit; + } + n2 = wcsxfrm(buf, s, n2+1); } - result = PyString_FromString(buf); - PyMem_Free(buf); + result = PyUnicode_FromWideChar(buf, n2); + exit: + if (buf) PyMem_Free(buf); +#if Py_UNICODE_SIZE != SIZEOF_WCHAR_T + PyMem_Free(s); +#endif return result; } +#endif #if defined(MS_WINDOWS) static PyObject* @@ -534,16 +475,17 @@ PyLocale_nl_langinfo(PyObject* self, PyObject* args) { int item, i; if (!PyArg_ParseTuple(args, "i:nl_langinfo", &item)) - return NULL; + return NULL; /* Check whether this is a supported constant. GNU libc sometimes returns numeric values in the char* return value, which would - crash PyString_FromString. */ + crash PyUnicode_FromString. */ for (i = 0; langinfo_constants[i].name; i++) if (langinfo_constants[i].value == item) { /* Check NULL as a workaround for GNU libc's returning NULL instead of an empty string for nl_langinfo(ERA). */ const char *result = nl_langinfo(item); - return PyString_FromString(result != NULL ? result : ""); + result = result != NULL ? result : ""; + return str2uni(result); } PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant"); return NULL; @@ -562,7 +504,7 @@ PyIntl_gettext(PyObject* self, PyObject *args) char *in; if (!PyArg_ParseTuple(args, "s", &in)) return 0; - return PyString_FromString(gettext(in)); + return str2uni(gettext(in)); } PyDoc_STRVAR(dgettext__doc__, @@ -575,7 +517,7 @@ PyIntl_dgettext(PyObject* self, PyObject *args) char *domain, *in; if (!PyArg_ParseTuple(args, "zs", &domain, &in)) return 0; - return PyString_FromString(dgettext(domain, in)); + return str2uni(dgettext(domain, in)); } PyDoc_STRVAR(dcgettext__doc__, @@ -589,7 +531,7 @@ PyIntl_dcgettext(PyObject *self, PyObject *args) int category; if (!PyArg_ParseTuple(args, "zsi", &domain, &msgid, &category)) return 0; - return PyString_FromString(dcgettext(domain,msgid,category)); + return str2uni(dcgettext(domain,msgid,category)); } PyDoc_STRVAR(textdomain__doc__, @@ -607,7 +549,7 @@ PyIntl_textdomain(PyObject* self, PyObject* args) PyErr_SetFromErrno(PyExc_OSError); return NULL; } - return PyString_FromString(domain); + return str2uni(domain); } PyDoc_STRVAR(bindtextdomain__doc__, @@ -617,19 +559,31 @@ PyDoc_STRVAR(bindtextdomain__doc__, static PyObject* PyIntl_bindtextdomain(PyObject* self,PyObject*args) { - char *domain, *dirname; - if (!PyArg_ParseTuple(args, "sz", &domain, &dirname)) + char *domain, *dirname, *current_dirname; + PyObject *dirname_obj, *dirname_bytes = NULL, *result; + if (!PyArg_ParseTuple(args, "sO", &domain, &dirname_obj)) return 0; if (!strlen(domain)) { PyErr_SetString(Error, "domain must be a non-empty string"); return 0; } - dirname = bindtextdomain(domain, dirname); - if (!dirname) { + if (dirname_obj != Py_None) { + if (!PyUnicode_FSConverter(dirname_obj, &dirname_bytes)) + return NULL; + dirname = PyBytes_AsString(dirname_bytes); + } else { + dirname_bytes = NULL; + dirname = NULL; + } + current_dirname = bindtextdomain(domain, dirname); + if (current_dirname == NULL) { + Py_XDECREF(dirname_bytes); PyErr_SetFromErrno(PyExc_OSError); return NULL; } - return PyString_FromString(dirname); + result = str2uni(current_dirname); + Py_XDECREF(dirname_bytes); + return result; } #ifdef HAVE_BIND_TEXTDOMAIN_CODESET @@ -645,7 +599,7 @@ PyIntl_bind_textdomain_codeset(PyObject* self,PyObject*args) return NULL; codeset = bind_textdomain_codeset(domain, codeset); if (codeset) - return PyString_FromString(codeset); + return str2uni(codeset); Py_RETURN_NONE; } #endif @@ -657,10 +611,14 @@ static struct PyMethodDef PyLocale_Methods[] = { METH_VARARGS, setlocale__doc__}, {"localeconv", (PyCFunction) PyLocale_localeconv, METH_NOARGS, localeconv__doc__}, +#ifdef HAVE_WCSCOLL {"strcoll", (PyCFunction) PyLocale_strcoll, METH_VARARGS, strcoll__doc__}, +#endif +#ifdef HAVE_WCSXFRM {"strxfrm", (PyCFunction) PyLocale_strxfrm, METH_VARARGS, strxfrm__doc__}, +#endif #if defined(MS_WINDOWS) {"_getdefaultlocale", (PyCFunction) PyLocale_getdefaultlocale, METH_NOARGS}, #endif @@ -687,67 +645,77 @@ static struct PyMethodDef PyLocale_Methods[] = { {NULL, NULL} }; + +static struct PyModuleDef _localemodule = { + PyModuleDef_HEAD_INIT, + "_locale", + locale__doc__, + -1, + PyLocale_Methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_locale(void) +PyInit__locale(void) { PyObject *m, *d, *x; #ifdef HAVE_LANGINFO_H int i; #endif - m = Py_InitModule("_locale", PyLocale_Methods); + m = PyModule_Create(&_localemodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); - x = PyInt_FromLong(LC_CTYPE); + x = PyLong_FromLong(LC_CTYPE); PyDict_SetItemString(d, "LC_CTYPE", x); Py_XDECREF(x); - x = PyInt_FromLong(LC_TIME); + x = PyLong_FromLong(LC_TIME); PyDict_SetItemString(d, "LC_TIME", x); Py_XDECREF(x); - x = PyInt_FromLong(LC_COLLATE); + x = PyLong_FromLong(LC_COLLATE); PyDict_SetItemString(d, "LC_COLLATE", x); Py_XDECREF(x); - x = PyInt_FromLong(LC_MONETARY); + x = PyLong_FromLong(LC_MONETARY); PyDict_SetItemString(d, "LC_MONETARY", x); Py_XDECREF(x); #ifdef LC_MESSAGES - x = PyInt_FromLong(LC_MESSAGES); + x = PyLong_FromLong(LC_MESSAGES); PyDict_SetItemString(d, "LC_MESSAGES", x); Py_XDECREF(x); #endif /* LC_MESSAGES */ - x = PyInt_FromLong(LC_NUMERIC); + x = PyLong_FromLong(LC_NUMERIC); PyDict_SetItemString(d, "LC_NUMERIC", x); Py_XDECREF(x); - x = PyInt_FromLong(LC_ALL); + x = PyLong_FromLong(LC_ALL); PyDict_SetItemString(d, "LC_ALL", x); Py_XDECREF(x); - x = PyInt_FromLong(CHAR_MAX); + x = PyLong_FromLong(CHAR_MAX); PyDict_SetItemString(d, "CHAR_MAX", x); Py_XDECREF(x); Error = PyErr_NewException("locale.Error", NULL, NULL); PyDict_SetItemString(d, "Error", Error); - x = PyString_FromString(locale__doc__); - PyDict_SetItemString(d, "__doc__", x); - Py_XDECREF(x); - #ifdef HAVE_LANGINFO_H for (i = 0; langinfo_constants[i].name; i++) { PyModule_AddIntConstant(m, langinfo_constants[i].name, langinfo_constants[i].value); } #endif + return m; } /* diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index 049c94db393..cc412bfc232 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -1,7 +1,5 @@ #include "Python.h" -#include "compile.h" #include "frameobject.h" -#include "structseq.h" #include "rotatingtree.h" #if !defined(HAVE_LONG_LONG) @@ -117,7 +115,7 @@ typedef struct { #define POF_BUILTINS 0x004 #define POF_NOMEMORY 0x100 -staticforward PyTypeObject PyProfiler_Type; +static PyTypeObject PyProfiler_Type; #define PyProfiler_Check(op) PyObject_TypeCheck(op, &PyProfiler_Type) #define PyProfiler_CheckExact(op) (Py_TYPE(op) == &PyProfiler_Type) @@ -178,34 +176,43 @@ normalizeUserObj(PyObject *obj) if (fn->m_self == NULL) { /* built-in function: look up the module name */ PyObject *mod = fn->m_module; - char *modname; - if (mod && PyString_Check(mod)) { - modname = PyString_AS_STRING(mod); + const char *modname; + if (mod && PyUnicode_Check(mod)) { + /* XXX: The following will truncate module names with embedded + * null-characters. It is unlikely that this can happen in + * practice and the concequences are not serious enough to + * introduce extra checks here. + */ + modname = _PyUnicode_AsString(mod); + if (modname == NULL) { + modname = "<encoding error>"; + PyErr_Clear(); + } } else if (mod && PyModule_Check(mod)) { modname = PyModule_GetName(mod); if (modname == NULL) { PyErr_Clear(); - modname = "__builtin__"; + modname = "builtins"; } } else { - modname = "__builtin__"; + modname = "builtins"; } - if (strcmp(modname, "__builtin__") != 0) - return PyString_FromFormat("<%s.%s>", - modname, - fn->m_ml->ml_name); + if (strcmp(modname, "builtins") != 0) + return PyUnicode_FromFormat("<%s.%s>", + modname, + fn->m_ml->ml_name); else - return PyString_FromFormat("<%s>", - fn->m_ml->ml_name); + return PyUnicode_FromFormat("<%s>", + fn->m_ml->ml_name); } else { /* built-in method: try to return repr(getattr(type(__self__), __name__)) */ PyObject *self = fn->m_self; - PyObject *name = PyString_FromString(fn->m_ml->ml_name); + PyObject *name = PyUnicode_FromString(fn->m_ml->ml_name); if (name != NULL) { PyObject *mo = _PyType_Lookup(Py_TYPE(self), name); Py_XINCREF(mo); @@ -218,8 +225,8 @@ normalizeUserObj(PyObject *obj) } } PyErr_Clear(); - return PyString_FromFormat("<built-in method %s>", - fn->m_ml->ml_name); + return PyUnicode_FromFormat("<built-in method %s>", + fn->m_ml->ml_name); } } @@ -816,9 +823,8 @@ Profiler(custom_timer=None, time_unit=None, subcalls=True, builtins=True)\n\ is, in seconds).\n\ "); -statichere PyTypeObject PyProfiler_Type = { - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ +static PyTypeObject PyProfiler_Type = { + PyVarObject_HEAD_INIT(NULL, 0) "_lsprof.Profiler", /* tp_name */ sizeof(ProfilerObject), /* tp_basicsize */ 0, /* tp_itemsize */ @@ -826,7 +832,7 @@ statichere PyTypeObject PyProfiler_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -863,16 +869,29 @@ static PyMethodDef moduleMethods[] = { {NULL, NULL} }; + +static struct PyModuleDef _lsprofmodule = { + PyModuleDef_HEAD_INIT, + "_lsprof", + "Fast profiler", + -1, + moduleMethods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_lsprof(void) +PyInit__lsprof(void) { PyObject *module, *d; - module = Py_InitModule3("_lsprof", moduleMethods, "Fast profiler"); + module = PyModule_Create(&_lsprofmodule); if (module == NULL) - return; + return NULL; d = PyModule_GetDict(module); if (PyType_Ready(&PyProfiler_Type) < 0) - return; + return NULL; PyDict_SetItemString(d, "Profiler", (PyObject *)&PyProfiler_Type); if (!initialized) { @@ -889,4 +908,5 @@ init_lsprof(void) (PyObject*) &StatsSubEntryType); empty_tuple = PyTuple_New(0); initialized = 1; + return module; } diff --git a/Modules/_multiprocessing/connection.h b/Modules/_multiprocessing/connection.h index 1d97bd4e985..002d5aa9cc5 100644 --- a/Modules/_multiprocessing/connection.h +++ b/Modules/_multiprocessing/connection.h @@ -96,21 +96,26 @@ connection_dealloc(ConnectionObject* self) static PyObject * connection_sendbytes(ConnectionObject *self, PyObject *args) { + Py_buffer pbuffer; char *buffer; Py_ssize_t length, offset=0, size=PY_SSIZE_T_MIN; int res; - if (!PyArg_ParseTuple(args, F_RBUFFER "#|" F_PY_SSIZE_T F_PY_SSIZE_T, - &buffer, &length, &offset, &size)) + if (!PyArg_ParseTuple(args, F_RBUFFER "*|" F_PY_SSIZE_T F_PY_SSIZE_T, + &pbuffer, &offset, &size)) return NULL; + buffer = pbuffer.buf; + length = pbuffer.len; - CHECK_WRITABLE(self); + CHECK_WRITABLE(self); /* XXX release buffer in case of failure */ if (offset < 0) { + PyBuffer_Release(&pbuffer); PyErr_SetString(PyExc_ValueError, "offset is negative"); return NULL; } if (length < offset) { + PyBuffer_Release(&pbuffer); PyErr_SetString(PyExc_ValueError, "buffer length < offset"); return NULL; } @@ -119,10 +124,12 @@ connection_sendbytes(ConnectionObject *self, PyObject *args) size = length - offset; } else { if (size < 0) { + PyBuffer_Release(&pbuffer); PyErr_SetString(PyExc_ValueError, "size is negative"); return NULL; } if (offset + size > length) { + PyBuffer_Release(&pbuffer); PyErr_SetString(PyExc_ValueError, "buffer length < offset + size"); return NULL; @@ -131,6 +138,7 @@ connection_sendbytes(ConnectionObject *self, PyObject *args) res = conn_send_string(self, buffer + offset, size); + PyBuffer_Release(&pbuffer); if (res < 0) { if (PyErr_Occurred()) return NULL; @@ -175,9 +183,9 @@ connection_recvbytes(ConnectionObject *self, PyObject *args) mp_SetError(PyExc_IOError, res); } else { if (freeme == NULL) { - result = PyString_FromStringAndSize(self->buffer, res); + result = PyBytes_FromStringAndSize(self->buffer, res); } else { - result = PyString_FromStringAndSize(freeme, res); + result = PyBytes_FromStringAndSize(freeme, res); PyMem_Free(freeme); } } @@ -271,7 +279,7 @@ connection_send_obj(ConnectionObject *self, PyObject *obj) if (!pickled_string) goto failure; - if (PyString_AsStringAndSize(pickled_string, &buffer, &length) < 0) + if (PyBytes_AsStringAndSize(pickled_string, &buffer, &length) < 0) goto failure; res = conn_send_string(self, buffer, (int)length); @@ -315,9 +323,9 @@ connection_recv_obj(ConnectionObject *self) mp_SetError(PyExc_IOError, res); } else { if (freeme == NULL) { - temp = PyString_FromStringAndSize(self->buffer, res); + temp = PyBytes_FromStringAndSize(self->buffer, res); } else { - temp = PyString_FromStringAndSize(freeme, res); + temp = PyBytes_FromStringAndSize(freeme, res); PyMem_Free(freeme); } } @@ -483,7 +491,7 @@ PyTypeObject CONNECTION_TYPE = { /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, - /* tp_compare */ 0, + /* tp_reserved */ 0, /* tp_repr */ (reprfunc)connection_repr, /* tp_as_number */ 0, /* tp_as_sequence */ 0, diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c index c831637f901..ee250e00439 100644 --- a/Modules/_multiprocessing/multiprocessing.c +++ b/Modules/_multiprocessing/multiprocessing.c @@ -241,20 +241,33 @@ static PyMethodDef module_methods[] = { * Initialize */ +static struct PyModuleDef multiprocessing_module = { + PyModuleDef_HEAD_INIT, + "_multiprocessing", + NULL, + -1, + module_methods, + NULL, + NULL, + NULL, + NULL +}; + + PyMODINIT_FUNC -init_multiprocessing(void) +PyInit__multiprocessing(void) { PyObject *module, *temp, *value; /* Initialize module */ - module = Py_InitModule("_multiprocessing", module_methods); + module = PyModule_Create(&multiprocessing_module); if (!module) - return; + return NULL; /* Get copy of objects from pickle */ temp = PyImport_ImportModule(PICKLE_MODULE); if (!temp) - return; + return NULL; pickle_dumps = PyObject_GetAttrString(temp, "dumps"); pickle_loads = PyObject_GetAttrString(temp, "loads"); pickle_protocol = PyObject_GetAttrString(temp, "HIGHEST_PROTOCOL"); @@ -263,13 +276,13 @@ init_multiprocessing(void) /* Get copy of BufferTooShort */ temp = PyImport_ImportModule("multiprocessing"); if (!temp) - return; + return NULL; BufferTooShort = PyObject_GetAttrString(temp, "BufferTooShort"); Py_XDECREF(temp); /* Add connection type to module */ if (PyType_Ready(&ConnectionType) < 0) - return; + return NULL; Py_INCREF(&ConnectionType); PyModule_AddObject(module, "Connection", (PyObject*)&ConnectionType); @@ -277,7 +290,7 @@ init_multiprocessing(void) (defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)) /* Add SemLock type to module */ if (PyType_Ready(&SemLockType) < 0) - return; + return NULL; Py_INCREF(&SemLockType); { PyObject *py_sem_value_max; @@ -288,7 +301,7 @@ init_multiprocessing(void) else py_sem_value_max = PyLong_FromLong(SEM_VALUE_MAX); if (py_sem_value_max == NULL) - return; + return NULL; PyDict_SetItemString(SemLockType.tp_dict, "SEM_VALUE_MAX", py_sem_value_max); } @@ -298,7 +311,7 @@ init_multiprocessing(void) #ifdef MS_WINDOWS /* Add PipeConnection to module */ if (PyType_Ready(&PipeConnectionType) < 0) - return; + return NULL; Py_INCREF(&PipeConnectionType); PyModule_AddObject(module, "PipeConnection", (PyObject*)&PipeConnectionType); @@ -306,30 +319,31 @@ init_multiprocessing(void) /* Initialize win32 class and add to multiprocessing */ temp = create_win32_namespace(); if (!temp) - return; + return NULL; PyModule_AddObject(module, "win32", temp); /* Initialize the event handle used to signal Ctrl-C */ sigint_event = CreateEvent(NULL, TRUE, FALSE, NULL); if (!sigint_event) { PyErr_SetFromWindowsErr(0); - return; + return NULL; } if (!SetConsoleCtrlHandler(ProcessingCtrlHandler, TRUE)) { PyErr_SetFromWindowsErr(0); - return; + return NULL; } #endif /* Add configuration macros */ temp = PyDict_New(); if (!temp) - return; + return NULL; + #define ADD_FLAG(name) \ value = Py_BuildValue("i", name); \ - if (value == NULL) { Py_DECREF(temp); return; } \ + if (value == NULL) { Py_DECREF(temp); return NULL; } \ if (PyDict_SetItemString(temp, #name, value) < 0) { \ - Py_DECREF(temp); Py_DECREF(value); return; } \ + Py_DECREF(temp); Py_DECREF(value); return NULL; } \ Py_DECREF(value) #if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED) @@ -347,6 +361,9 @@ init_multiprocessing(void) #ifdef HAVE_BROKEN_SEM_UNLINK ADD_FLAG(HAVE_BROKEN_SEM_UNLINK); #endif + if (PyModule_AddObject(module, "flags", temp) < 0) - return; + return NULL; + + return module; } diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index 5bda1ce12a0..1f37d6ac377 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -267,7 +267,7 @@ sem_timedwait_save(sem_t *sem, struct timespec *deadline, PyThreadState *_save) static PyObject * semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) { - int blocking = 1, res; + int blocking = 1, res, err = 0; double timeout; PyObject *timeout_obj = Py_None; struct timespec deadline = {0}; @@ -313,11 +313,13 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) else res = sem_timedwait(self->handle, &deadline); Py_END_ALLOW_THREADS + err = errno; if (res == MP_EXCEPTION_HAS_BEEN_SET) break; } while (res < 0 && errno == EINTR && !PyErr_CheckSignals()); if (res < 0) { + errno = err; if (errno == EAGAIN || errno == ETIMEDOUT) Py_RETURN_FALSE; else if (errno == EINTR) @@ -592,7 +594,7 @@ PyTypeObject SemLockType = { /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, - /* tp_compare */ 0, + /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, diff --git a/Modules/_multiprocessing/win32_functions.c b/Modules/_multiprocessing/win32_functions.c index 9425929469e..0e348c4134f 100644 --- a/Modules/_multiprocessing/win32_functions.c +++ b/Modules/_multiprocessing/win32_functions.c @@ -182,7 +182,7 @@ win32_SetNamedPipeHandleState(PyObject *self, PyObject *args) for (i = 0 ; i < 3 ; i++) { if (oArgs[i] != Py_None) { - dwArgs[i] = PyInt_AsUnsignedLongMask(oArgs[i]); + dwArgs[i] = PyLong_AsUnsignedLongMask(oArgs[i]); if (PyErr_Occurred()) return NULL; pArgs[i] = &dwArgs[i]; diff --git a/Modules/_pickle.c b/Modules/_pickle.c new file mode 100644 index 00000000000..18eaa38bdb6 --- /dev/null +++ b/Modules/_pickle.c @@ -0,0 +1,6425 @@ +#include "Python.h" +#include "structmember.h" + +PyDoc_STRVAR(pickle_module_doc, +"Optimized C implementation for the Python pickle module."); + +/* Bump this when new opcodes are added to the pickle protocol. */ +enum { + HIGHEST_PROTOCOL = 3, + DEFAULT_PROTOCOL = 3 +}; + +/* Pickle opcodes. These must be kept updated with pickle.py. + Extensive docs are in pickletools.py. */ +enum opcode { + MARK = '(', + STOP = '.', + POP = '0', + POP_MARK = '1', + DUP = '2', + FLOAT = 'F', + INT = 'I', + BININT = 'J', + BININT1 = 'K', + LONG = 'L', + BININT2 = 'M', + NONE = 'N', + PERSID = 'P', + BINPERSID = 'Q', + REDUCE = 'R', + STRING = 'S', + BINSTRING = 'T', + SHORT_BINSTRING = 'U', + UNICODE = 'V', + BINUNICODE = 'X', + APPEND = 'a', + BUILD = 'b', + GLOBAL = 'c', + DICT = 'd', + EMPTY_DICT = '}', + APPENDS = 'e', + GET = 'g', + BINGET = 'h', + INST = 'i', + LONG_BINGET = 'j', + LIST = 'l', + EMPTY_LIST = ']', + OBJ = 'o', + PUT = 'p', + BINPUT = 'q', + LONG_BINPUT = 'r', + SETITEM = 's', + TUPLE = 't', + EMPTY_TUPLE = ')', + SETITEMS = 'u', + BINFLOAT = 'G', + + /* Protocol 2. */ + PROTO = '\x80', + NEWOBJ = '\x81', + EXT1 = '\x82', + EXT2 = '\x83', + EXT4 = '\x84', + TUPLE1 = '\x85', + TUPLE2 = '\x86', + TUPLE3 = '\x87', + NEWTRUE = '\x88', + NEWFALSE = '\x89', + LONG1 = '\x8a', + LONG4 = '\x8b', + + /* Protocol 3 (Python 3.x) */ + BINBYTES = 'B', + SHORT_BINBYTES = 'C' +}; + +/* These aren't opcodes -- they're ways to pickle bools before protocol 2 + * so that unpicklers written before bools were introduced unpickle them + * as ints, but unpicklers after can recognize that bools were intended. + * Note that protocol 2 added direct ways to pickle bools. + */ +#undef TRUE +#define TRUE "I01\n" +#undef FALSE +#define FALSE "I00\n" + +enum { + /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements + batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will + break if this gets out of synch with pickle.py, but it's unclear that would + help anything either. */ + BATCHSIZE = 1000, + + /* Nesting limit until Pickler, when running in "fast mode", starts + checking for self-referential data-structures. */ + FAST_NESTING_LIMIT = 50, + + /* Initial size of the write buffer of Pickler. */ + WRITE_BUF_SIZE = 4096, + + /* Maximum size of the write buffer of Pickler when pickling to a + stream. This is ignored for in-memory pickling. */ + MAX_WRITE_BUF_SIZE = 64 * 1024, + + /* Prefetch size when unpickling (disabled on unpeekable streams) */ + PREFETCH = 8192 * 16 +}; + +/* Exception classes for pickle. These should override the ones defined in + pickle.py, when the C-optimized Pickler and Unpickler are used. */ +static PyObject *PickleError = NULL; +static PyObject *PicklingError = NULL; +static PyObject *UnpicklingError = NULL; + +/* copyreg.dispatch_table, {type_object: pickling_function} */ +static PyObject *dispatch_table = NULL; +/* For EXT[124] opcodes. */ +/* copyreg._extension_registry, {(module_name, function_name): code} */ +static PyObject *extension_registry = NULL; +/* copyreg._inverted_registry, {code: (module_name, function_name)} */ +static PyObject *inverted_registry = NULL; +/* copyreg._extension_cache, {code: object} */ +static PyObject *extension_cache = NULL; + +/* _compat_pickle.NAME_MAPPING, {(oldmodule, oldname): (newmodule, newname)} */ +static PyObject *name_mapping_2to3 = NULL; +/* _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule} */ +static PyObject *import_mapping_2to3 = NULL; +/* Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING */ +static PyObject *name_mapping_3to2 = NULL; +static PyObject *import_mapping_3to2 = NULL; + +/* XXX: Are these really nescessary? */ +/* As the name says, an empty tuple. */ +static PyObject *empty_tuple = NULL; +/* For looking up name pairs in copyreg._extension_registry. */ +static PyObject *two_tuple = NULL; + +static int +stack_underflow(void) +{ + PyErr_SetString(UnpicklingError, "unpickling stack underflow"); + return -1; +} + +/* Internal data type used as the unpickling stack. */ +typedef struct { + PyObject_VAR_HEAD + PyObject **data; + Py_ssize_t allocated; /* number of slots in data allocated */ +} Pdata; + +static void +Pdata_dealloc(Pdata *self) +{ + Py_ssize_t i = Py_SIZE(self); + while (--i >= 0) { + Py_DECREF(self->data[i]); + } + PyMem_FREE(self->data); + PyObject_Del(self); +} + +static PyTypeObject Pdata_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_pickle.Pdata", /*tp_name*/ + sizeof(Pdata), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)Pdata_dealloc, /*tp_dealloc*/ +}; + +static PyObject * +Pdata_New(void) +{ + Pdata *self; + + if (!(self = PyObject_New(Pdata, &Pdata_Type))) + return NULL; + Py_SIZE(self) = 0; + self->allocated = 8; + self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *)); + if (self->data) + return (PyObject *)self; + Py_DECREF(self); + return PyErr_NoMemory(); +} + + +/* Retain only the initial clearto items. If clearto >= the current + * number of items, this is a (non-erroneous) NOP. + */ +static int +Pdata_clear(Pdata *self, Py_ssize_t clearto) +{ + Py_ssize_t i = Py_SIZE(self); + + if (clearto < 0) + return stack_underflow(); + if (clearto >= i) + return 0; + + while (--i >= clearto) { + Py_CLEAR(self->data[i]); + } + Py_SIZE(self) = clearto; + return 0; +} + +static int +Pdata_grow(Pdata *self) +{ + PyObject **data = self->data; + Py_ssize_t allocated = self->allocated; + Py_ssize_t new_allocated; + + new_allocated = (allocated >> 3) + 6; + /* check for integer overflow */ + if (new_allocated > PY_SSIZE_T_MAX - allocated) + goto nomemory; + new_allocated += allocated; + if (new_allocated > (PY_SSIZE_T_MAX / sizeof(PyObject *))) + goto nomemory; + data = PyMem_REALLOC(data, new_allocated * sizeof(PyObject *)); + if (data == NULL) + goto nomemory; + + self->data = data; + self->allocated = new_allocated; + return 0; + + nomemory: + PyErr_NoMemory(); + return -1; +} + +/* D is a Pdata*. Pop the topmost element and store it into V, which + * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError + * is raised and V is set to NULL. + */ +static PyObject * +Pdata_pop(Pdata *self) +{ + if (Py_SIZE(self) == 0) { + PyErr_SetString(UnpicklingError, "bad pickle data"); + return NULL; + } + return self->data[--Py_SIZE(self)]; +} +#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0) + +static int +Pdata_push(Pdata *self, PyObject *obj) +{ + if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) { + return -1; + } + self->data[Py_SIZE(self)++] = obj; + return 0; +} + +/* Push an object on stack, transferring its ownership to the stack. */ +#define PDATA_PUSH(D, O, ER) do { \ + if (Pdata_push((D), (O)) < 0) return (ER); } while(0) + +/* Push an object on stack, adding a new reference to the object. */ +#define PDATA_APPEND(D, O, ER) do { \ + Py_INCREF((O)); \ + if (Pdata_push((D), (O)) < 0) return (ER); } while(0) + +static PyObject * +Pdata_poptuple(Pdata *self, Py_ssize_t start) +{ + PyObject *tuple; + Py_ssize_t len, i, j; + + len = Py_SIZE(self) - start; + tuple = PyTuple_New(len); + if (tuple == NULL) + return NULL; + for (i = start, j = 0; j < len; i++, j++) + PyTuple_SET_ITEM(tuple, j, self->data[i]); + + Py_SIZE(self) = start; + return tuple; +} + +static PyObject * +Pdata_poplist(Pdata *self, Py_ssize_t start) +{ + PyObject *list; + Py_ssize_t len, i, j; + + len = Py_SIZE(self) - start; + list = PyList_New(len); + if (list == NULL) + return NULL; + for (i = start, j = 0; j < len; i++, j++) + PyList_SET_ITEM(list, j, self->data[i]); + + Py_SIZE(self) = start; + return list; +} + +typedef struct { + PyObject *me_key; + Py_ssize_t me_value; +} PyMemoEntry; + +typedef struct { + Py_ssize_t mt_mask; + Py_ssize_t mt_used; + Py_ssize_t mt_allocated; + PyMemoEntry *mt_table; +} PyMemoTable; + +typedef struct PicklerObject { + PyObject_HEAD + PyMemoTable *memo; /* Memo table, keep track of the seen + objects to support self-referential objects + pickling. */ + PyObject *pers_func; /* persistent_id() method, can be NULL */ + PyObject *arg; + + PyObject *write; /* write() method of the output stream. */ + PyObject *output_buffer; /* Write into a local bytearray buffer before + flushing to the stream. */ + Py_ssize_t output_len; /* Length of output_buffer. */ + Py_ssize_t max_output_len; /* Allocation size of output_buffer. */ + int proto; /* Pickle protocol number, >= 0 */ + int bin; /* Boolean, true if proto > 0 */ + Py_ssize_t buf_size; /* Size of the current buffered pickle data */ + int fast; /* Enable fast mode if set to a true value. + The fast mode disable the usage of memo, + therefore speeding the pickling process by + not generating superfluous PUT opcodes. It + should not be used if with self-referential + objects. */ + int fast_nesting; + int fix_imports; /* Indicate whether Pickler should fix + the name of globals for Python 2.x. */ + PyObject *fast_memo; +} PicklerObject; + +typedef struct UnpicklerObject { + PyObject_HEAD + Pdata *stack; /* Pickle data stack, store unpickled objects. */ + + /* The unpickler memo is just an array of PyObject *s. Using a dict + is unnecessary, since the keys are contiguous ints. */ + PyObject **memo; + Py_ssize_t memo_size; + + PyObject *arg; + PyObject *pers_func; /* persistent_load() method, can be NULL. */ + + Py_buffer buffer; + char *input_buffer; + char *input_line; + Py_ssize_t input_len; + Py_ssize_t next_read_idx; + Py_ssize_t prefetched_idx; /* index of first prefetched byte */ + PyObject *read; /* read() method of the input stream. */ + PyObject *readline; /* readline() method of the input stream. */ + PyObject *peek; /* peek() method of the input stream, or NULL */ + + char *encoding; /* Name of the encoding to be used for + decoding strings pickled using Python + 2.x. The default value is "ASCII" */ + char *errors; /* Name of errors handling scheme to used when + decoding strings. The default value is + "strict". */ + Py_ssize_t *marks; /* Mark stack, used for unpickling container + objects. */ + Py_ssize_t num_marks; /* Number of marks in the mark stack. */ + Py_ssize_t marks_size; /* Current allocated size of the mark stack. */ + int proto; /* Protocol of the pickle loaded. */ + int fix_imports; /* Indicate whether Unpickler should fix + the name of globals pickled by Python 2.x. */ +} UnpicklerObject; + +/* Forward declarations */ +static int save(PicklerObject *, PyObject *, int); +static int save_reduce(PicklerObject *, PyObject *, PyObject *); +static PyTypeObject Pickler_Type; +static PyTypeObject Unpickler_Type; + + +/************************************************************************* + A custom hashtable mapping void* to longs. This is used by the pickler for + memoization. Using a custom hashtable rather than PyDict allows us to skip + a bunch of unnecessary object creation. This makes a huge performance + difference. */ + +#define MT_MINSIZE 8 +#define PERTURB_SHIFT 5 + + +static PyMemoTable * +PyMemoTable_New(void) +{ + PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable)); + if (memo == NULL) { + PyErr_NoMemory(); + return NULL; + } + + memo->mt_used = 0; + memo->mt_allocated = MT_MINSIZE; + memo->mt_mask = MT_MINSIZE - 1; + memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry)); + if (memo->mt_table == NULL) { + PyMem_FREE(memo); + PyErr_NoMemory(); + return NULL; + } + memset(memo->mt_table, 0, MT_MINSIZE * sizeof(PyMemoEntry)); + + return memo; +} + +static PyMemoTable * +PyMemoTable_Copy(PyMemoTable *self) +{ + Py_ssize_t i; + PyMemoTable *new = PyMemoTable_New(); + if (new == NULL) + return NULL; + + new->mt_used = self->mt_used; + new->mt_allocated = self->mt_allocated; + new->mt_mask = self->mt_mask; + /* The table we get from _New() is probably smaller than we wanted. + Free it and allocate one that's the right size. */ + PyMem_FREE(new->mt_table); + new->mt_table = PyMem_MALLOC(self->mt_allocated * sizeof(PyMemoEntry)); + if (new->mt_table == NULL) { + PyMem_FREE(new); + return NULL; + } + for (i = 0; i < self->mt_allocated; i++) { + Py_XINCREF(self->mt_table[i].me_key); + } + memcpy(new->mt_table, self->mt_table, + sizeof(PyMemoEntry) * self->mt_allocated); + + return new; +} + +static Py_ssize_t +PyMemoTable_Size(PyMemoTable *self) +{ + return self->mt_used; +} + +static int +PyMemoTable_Clear(PyMemoTable *self) +{ + Py_ssize_t i = self->mt_allocated; + + while (--i >= 0) { + Py_XDECREF(self->mt_table[i].me_key); + } + self->mt_used = 0; + memset(self->mt_table, 0, self->mt_allocated * sizeof(PyMemoEntry)); + return 0; +} + +static void +PyMemoTable_Del(PyMemoTable *self) +{ + if (self == NULL) + return; + PyMemoTable_Clear(self); + + PyMem_FREE(self->mt_table); + PyMem_FREE(self); +} + +/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup() + can be considerably simpler than dictobject.c's lookdict(). */ +static PyMemoEntry * +_PyMemoTable_Lookup(PyMemoTable *self, PyObject *key) +{ + size_t i; + size_t perturb; + size_t mask = (size_t)self->mt_mask; + PyMemoEntry *table = self->mt_table; + PyMemoEntry *entry; + Py_hash_t hash = (Py_hash_t)key >> 3; + + i = hash & mask; + entry = &table[i]; + if (entry->me_key == NULL || entry->me_key == key) + return entry; + + for (perturb = hash; ; perturb >>= PERTURB_SHIFT) { + i = (i << 2) + i + perturb + 1; + entry = &table[i & mask]; + if (entry->me_key == NULL || entry->me_key == key) + return entry; + } + assert(0); /* Never reached */ + return NULL; +} + +/* Returns -1 on failure, 0 on success. */ +static int +_PyMemoTable_ResizeTable(PyMemoTable *self, Py_ssize_t min_size) +{ + PyMemoEntry *oldtable = NULL; + PyMemoEntry *oldentry, *newentry; + Py_ssize_t new_size = MT_MINSIZE; + Py_ssize_t to_process; + + assert(min_size > 0); + + /* Find the smallest valid table size >= min_size. */ + while (new_size < min_size && new_size > 0) + new_size <<= 1; + if (new_size <= 0) { + PyErr_NoMemory(); + return -1; + } + /* new_size needs to be a power of two. */ + assert((new_size & (new_size - 1)) == 0); + + /* Allocate new table. */ + oldtable = self->mt_table; + self->mt_table = PyMem_MALLOC(new_size * sizeof(PyMemoEntry)); + if (self->mt_table == NULL) { + PyMem_FREE(oldtable); + PyErr_NoMemory(); + return -1; + } + self->mt_allocated = new_size; + self->mt_mask = new_size - 1; + memset(self->mt_table, 0, sizeof(PyMemoEntry) * new_size); + + /* Copy entries from the old table. */ + to_process = self->mt_used; + for (oldentry = oldtable; to_process > 0; oldentry++) { + if (oldentry->me_key != NULL) { + to_process--; + /* newentry is a pointer to a chunk of the new + mt_table, so we're setting the key:value pair + in-place. */ + newentry = _PyMemoTable_Lookup(self, oldentry->me_key); + newentry->me_key = oldentry->me_key; + newentry->me_value = oldentry->me_value; + } + } + + /* Deallocate the old table. */ + PyMem_FREE(oldtable); + return 0; +} + +/* Returns NULL on failure, a pointer to the value otherwise. */ +static Py_ssize_t * +PyMemoTable_Get(PyMemoTable *self, PyObject *key) +{ + PyMemoEntry *entry = _PyMemoTable_Lookup(self, key); + if (entry->me_key == NULL) + return NULL; + return &entry->me_value; +} + +/* Returns -1 on failure, 0 on success. */ +static int +PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value) +{ + PyMemoEntry *entry; + + assert(key != NULL); + + entry = _PyMemoTable_Lookup(self, key); + if (entry->me_key != NULL) { + entry->me_value = value; + return 0; + } + Py_INCREF(key); + entry->me_key = key; + entry->me_value = value; + self->mt_used++; + + /* If we added a key, we can safely resize. Otherwise just return! + * If used >= 2/3 size, adjust size. Normally, this quaduples the size. + * + * Quadrupling the size improves average table sparseness + * (reducing collisions) at the cost of some memory. It also halves + * the number of expensive resize operations in a growing memo table. + * + * Very large memo tables (over 50K items) use doubling instead. + * This may help applications with severe memory constraints. + */ + if (!(self->mt_used * 3 >= (self->mt_mask + 1) * 2)) + return 0; + return _PyMemoTable_ResizeTable(self, + (self->mt_used > 50000 ? 2 : 4) * self->mt_used); +} + +#undef MT_MINSIZE +#undef PERTURB_SHIFT + +/*************************************************************************/ + +/* Helpers for creating the argument tuple passed to functions. This has the + performance advantage of calling PyTuple_New() only once. + + XXX(avassalotti): Inline directly in _Pickler_FastCall() and + _Unpickler_FastCall(). */ +#define ARG_TUP(self, obj) do { \ + if ((self)->arg || ((self)->arg=PyTuple_New(1))) { \ + Py_XDECREF(PyTuple_GET_ITEM((self)->arg, 0)); \ + PyTuple_SET_ITEM((self)->arg, 0, (obj)); \ + } \ + else { \ + Py_DECREF((obj)); \ + } \ + } while (0) + +#define FREE_ARG_TUP(self) do { \ + if ((self)->arg->ob_refcnt > 1) \ + Py_CLEAR((self)->arg); \ + } while (0) + +/* A temporary cleaner API for fast single argument function call. + + XXX: Does caching the argument tuple provides any real performance benefits? + + A quick benchmark, on a 2.0GHz Athlon64 3200+ running Linux 2.6.24 with + glibc 2.7, tells me that it takes roughly 20,000,000 PyTuple_New(1) calls + when the tuple is retrieved from the freelist (i.e, call PyTuple_New() then + immediately DECREF it) and 1,200,000 calls when allocating brand new tuples + (i.e, call PyTuple_New() and store the returned value in an array), to save + one second (wall clock time). Either ways, the loading time a pickle stream + large enough to generate this number of calls would be massively + overwhelmed by other factors, like I/O throughput, the GC traversal and + object allocation overhead. So, I really doubt these functions provide any + real benefits. + + On the other hand, oprofile reports that pickle spends a lot of time in + these functions. But, that is probably more related to the function call + overhead, than the argument tuple allocation. + + XXX: And, what is the reference behavior of these? Steal, borrow? At first + glance, it seems to steal the reference of 'arg' and borrow the reference + of 'func'. */ +static PyObject * +_Pickler_FastCall(PicklerObject *self, PyObject *func, PyObject *arg) +{ + PyObject *result = NULL; + + ARG_TUP(self, arg); + if (self->arg) { + result = PyObject_Call(func, self->arg, NULL); + FREE_ARG_TUP(self); + } + return result; +} + +static int +_Pickler_ClearBuffer(PicklerObject *self) +{ + Py_CLEAR(self->output_buffer); + self->output_buffer = + PyBytes_FromStringAndSize(NULL, self->max_output_len); + if (self->output_buffer == NULL) + return -1; + self->output_len = 0; + return 0; +} + +static PyObject * +_Pickler_GetString(PicklerObject *self) +{ + PyObject *output_buffer = self->output_buffer; + + assert(self->output_buffer != NULL); + self->output_buffer = NULL; + /* Resize down to exact size */ + if (_PyBytes_Resize(&output_buffer, self->output_len) < 0) + return NULL; + return output_buffer; +} + +static int +_Pickler_FlushToFile(PicklerObject *self) +{ + PyObject *output, *result; + + assert(self->write != NULL); + + output = _Pickler_GetString(self); + if (output == NULL) + return -1; + + result = _Pickler_FastCall(self, self->write, output); + Py_XDECREF(result); + return (result == NULL) ? -1 : 0; +} + +static Py_ssize_t +_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t n) +{ + Py_ssize_t i, required; + char *buffer; + + assert(s != NULL); + + required = self->output_len + n; + if (required > self->max_output_len) { + if (self->write != NULL && required > MAX_WRITE_BUF_SIZE) { + /* XXX This reallocates a new buffer every time, which is a bit + wasteful. */ + if (_Pickler_FlushToFile(self) < 0) + return -1; + if (_Pickler_ClearBuffer(self) < 0) + return -1; + } + if (self->write != NULL && n > MAX_WRITE_BUF_SIZE) { + /* we already flushed above, so the buffer is empty */ + PyObject *result; + /* XXX we could spare an intermediate copy and pass + a memoryview instead */ + PyObject *output = PyBytes_FromStringAndSize(s, n); + if (s == NULL) + return -1; + result = _Pickler_FastCall(self, self->write, output); + Py_XDECREF(result); + return (result == NULL) ? -1 : 0; + } + else { + if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) { + PyErr_NoMemory(); + return -1; + } + self->max_output_len = (self->output_len + n) / 2 * 3; + if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0) + return -1; + } + } + buffer = PyBytes_AS_STRING(self->output_buffer); + if (n < 8) { + /* This is faster than memcpy when the string is short. */ + for (i = 0; i < n; i++) { + buffer[self->output_len + i] = s[i]; + } + } + else { + memcpy(buffer + self->output_len, s, n); + } + self->output_len += n; + return n; +} + +static PicklerObject * +_Pickler_New(void) +{ + PicklerObject *self; + + self = PyObject_GC_New(PicklerObject, &Pickler_Type); + if (self == NULL) + return NULL; + + self->pers_func = NULL; + self->arg = NULL; + self->write = NULL; + self->proto = 0; + self->bin = 0; + self->fast = 0; + 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->output_buffer = PyBytes_FromStringAndSize(NULL, + self->max_output_len); + if (self->output_buffer == NULL) { + Py_DECREF(self); + return NULL; + } + return self; +} + +static int +_Pickler_SetProtocol(PicklerObject *self, PyObject *proto_obj, + PyObject *fix_imports_obj) +{ + long proto = 0; + int fix_imports; + + if (proto_obj == NULL || proto_obj == Py_None) + proto = DEFAULT_PROTOCOL; + else { + proto = PyLong_AsLong(proto_obj); + if (proto == -1 && PyErr_Occurred()) + return -1; + } + if (proto < 0) + proto = HIGHEST_PROTOCOL; + if (proto > HIGHEST_PROTOCOL) { + PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d", + HIGHEST_PROTOCOL); + return -1; + } + fix_imports = PyObject_IsTrue(fix_imports_obj); + if (fix_imports == -1) + return -1; + + self->proto = proto; + self->bin = proto > 0; + self->fix_imports = fix_imports && proto < 3; + + return 0; +} + +/* Returns -1 (with an exception set) on failure, 0 on success. This may + be called once on a freshly created Pickler. */ +static int +_Pickler_SetOutputStream(PicklerObject *self, PyObject *file) +{ + assert(file != NULL); + self->write = PyObject_GetAttrString(file, "write"); + if (self->write == NULL) { + if (PyErr_ExceptionMatches(PyExc_AttributeError)) + PyErr_SetString(PyExc_TypeError, + "file must have a 'write' attribute"); + return -1; + } + + return 0; +} + +/* See documentation for _Pickler_FastCall(). */ +static PyObject * +_Unpickler_FastCall(UnpicklerObject *self, PyObject *func, PyObject *arg) +{ + PyObject *result = NULL; + + ARG_TUP(self, arg); + if (self->arg) { + result = PyObject_Call(func, self->arg, NULL); + FREE_ARG_TUP(self); + } + return result; +} + +/* Returns the size of the input on success, -1 on failure. This takes its + own reference to `input`. */ +static Py_ssize_t +_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input) +{ + if (self->buffer.buf != NULL) + PyBuffer_Release(&self->buffer); + if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0) + return -1; + self->input_buffer = self->buffer.buf; + self->input_len = self->buffer.len; + self->next_read_idx = 0; + self->prefetched_idx = self->input_len; + return self->input_len; +} + +static int +_Unpickler_SkipConsumed(UnpicklerObject *self) +{ + Py_ssize_t consumed = self->next_read_idx - self->prefetched_idx; + + if (consumed > 0) { + PyObject *r; + assert(self->peek); /* otherwise we did something wrong */ + /* This makes an useless copy... */ + r = PyObject_CallFunction(self->read, "n", consumed); + if (r == NULL) + return -1; + Py_DECREF(r); + self->prefetched_idx = self->next_read_idx; + } + return 0; +} + +static const Py_ssize_t READ_WHOLE_LINE = -1; + +/* If reading from a file, we need to only pull the bytes we need, since there + may be multiple pickle objects arranged contiguously in the same input + buffer. + + If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n` + bytes from the input stream/buffer. + + Update the unpickler's input buffer with the newly-read data. Returns -1 on + failure; on success, returns the number of bytes read from the file. + + On success, self->input_len will be 0; this is intentional so that when + unpickling from a file, the "we've run out of data" code paths will trigger, + causing the Unpickler to go back to the file for more data. Use the returned + size to tell you how much data you can process. */ +static Py_ssize_t +_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n) +{ + PyObject *data; + Py_ssize_t read_size, prefetched_size = 0; + + assert(self->read != NULL); + + if (_Unpickler_SkipConsumed(self) < 0) + return -1; + + if (n == READ_WHOLE_LINE) + data = PyObject_Call(self->readline, empty_tuple, NULL); + else { + PyObject *len = PyLong_FromSsize_t(n); + if (len == NULL) + return -1; + data = _Unpickler_FastCall(self, self->read, len); + } + if (data == NULL) + return -1; + + /* Prefetch some data without advancing the file pointer, if possible */ + if (self->peek) { + PyObject *len, *prefetched; + len = PyLong_FromSsize_t(PREFETCH); + if (len == NULL) { + Py_DECREF(data); + return -1; + } + prefetched = _Unpickler_FastCall(self, self->peek, len); + if (prefetched == NULL) { + if (PyErr_ExceptionMatches(PyExc_NotImplementedError)) { + /* peek() is probably not supported by the given file object */ + PyErr_Clear(); + Py_CLEAR(self->peek); + } + else { + Py_DECREF(data); + return -1; + } + } + else { + assert(PyBytes_Check(prefetched)); + prefetched_size = PyBytes_GET_SIZE(prefetched); + PyBytes_ConcatAndDel(&data, prefetched); + if (data == NULL) + return -1; + } + } + + read_size = _Unpickler_SetStringInput(self, data) - prefetched_size; + Py_DECREF(data); + self->prefetched_idx = read_size; + return read_size; +} + +/* Read `n` bytes from the unpickler's data source, storing the result in `*s`. + + This should be used for all data reads, rather than accessing the unpickler's + input buffer directly. This method deals correctly with reading from input + streams, which the input buffer doesn't deal with. + + Note that when reading from a file-like object, self->next_read_idx won't + be updated (it should remain at 0 for the entire unpickling process). You + should use this function's return value to know how many bytes you can + consume. + + Returns -1 (with an exception set) on failure. On success, return the + number of chars read. */ +static Py_ssize_t +_Unpickler_Read(UnpicklerObject *self, char **s, Py_ssize_t n) +{ + Py_ssize_t num_read; + + if (self->next_read_idx + n <= self->input_len) { + *s = self->input_buffer + self->next_read_idx; + self->next_read_idx += n; + return n; + } + if (!self->read) { + PyErr_Format(PyExc_EOFError, "Ran out of input"); + return -1; + } + num_read = _Unpickler_ReadFromFile(self, n); + if (num_read < 0) + return -1; + if (num_read < n) { + PyErr_Format(PyExc_EOFError, "Ran out of input"); + return -1; + } + *s = self->input_buffer; + self->next_read_idx = n; + return n; +} + +static Py_ssize_t +_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) + return -1; + + memcpy(input_line, line, len); + input_line[len] = '\0'; + self->input_line = input_line; + *result = self->input_line; + return len; +} + +/* Read a line from the input stream/buffer. If we run off the end of the input + before hitting \n, return the data we found. + + Returns the number of chars read, or -1 on failure. */ +static Py_ssize_t +_Unpickler_Readline(UnpicklerObject *self, char **result) +{ + Py_ssize_t i, num_read; + + for (i = self->next_read_idx; i < self->input_len; i++) { + if (self->input_buffer[i] == '\n') { + char *line_start = self->input_buffer + self->next_read_idx; + num_read = i - self->next_read_idx + 1; + self->next_read_idx = i + 1; + return _Unpickler_CopyLine(self, line_start, num_read, result); + } + } + if (self->read) { + num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE); + if (num_read < 0) + return -1; + self->next_read_idx = num_read; + return _Unpickler_CopyLine(self, self->input_buffer, num_read, result); + } + + /* If we get here, we've run off the end of the input string. Return the + remaining string and let the caller figure it out. */ + *result = self->input_buffer + self->next_read_idx; + num_read = i - self->next_read_idx; + self->next_read_idx = i; + return num_read; +} + +/* Returns -1 (with an exception set) on failure, 0 on success. The memo array + will be modified in place. */ +static int +_Unpickler_ResizeMemoList(UnpicklerObject *self, Py_ssize_t new_size) +{ + Py_ssize_t i; + PyObject **memo; + + assert(new_size > self->memo_size); + + memo = PyMem_REALLOC(self->memo, new_size * sizeof(PyObject *)); + if (memo == NULL) { + PyErr_NoMemory(); + return -1; + } + self->memo = memo; + for (i = self->memo_size; i < new_size; i++) + self->memo[i] = NULL; + self->memo_size = new_size; + return 0; +} + +/* Returns NULL if idx is out of bounds. */ +static PyObject * +_Unpickler_MemoGet(UnpicklerObject *self, Py_ssize_t idx) +{ + if (idx < 0 || idx >= self->memo_size) + return NULL; + + return self->memo[idx]; +} + +/* Returns -1 (with an exception set) on failure, 0 on success. + This takes its own reference to `value`. */ +static int +_Unpickler_MemoPut(UnpicklerObject *self, Py_ssize_t idx, PyObject *value) +{ + PyObject *old_item; + + if (idx >= self->memo_size) { + if (_Unpickler_ResizeMemoList(self, idx * 2) < 0) + return -1; + assert(idx < self->memo_size); + } + Py_INCREF(value); + old_item = self->memo[idx]; + self->memo[idx] = value; + Py_XDECREF(old_item); + return 0; +} + +static PyObject ** +_Unpickler_NewMemo(Py_ssize_t new_size) +{ + PyObject **memo = PyMem_MALLOC(new_size * sizeof(PyObject *)); + if (memo == NULL) + return NULL; + memset(memo, 0, new_size * sizeof(PyObject *)); + return memo; +} + +/* Free the unpickler's memo, taking care to decref any items left in it. */ +static void +_Unpickler_MemoCleanup(UnpicklerObject *self) +{ + Py_ssize_t i; + PyObject **memo = self->memo; + + if (self->memo == NULL) + return; + self->memo = NULL; + i = self->memo_size; + while (--i >= 0) { + Py_XDECREF(memo[i]); + } + PyMem_FREE(memo); +} + +static UnpicklerObject * +_Unpickler_New(void) +{ + UnpicklerObject *self; + + self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type); + 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; + self->input_line = NULL; + self->input_len = 0; + self->next_read_idx = 0; + self->prefetched_idx = 0; + self->read = NULL; + self->readline = NULL; + self->peek = NULL; + self->encoding = NULL; + self->errors = NULL; + self->marks = NULL; + self->num_marks = 0; + self->marks_size = 0; + self->proto = 0; + self->fix_imports = 0; + + return self; +} + +/* Returns -1 (with an exception set) on failure, 0 on success. This may + be called once on a freshly created Pickler. */ +static int +_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file) +{ + self->peek = PyObject_GetAttrString(file, "peek"); + if (self->peek == NULL) { + if (PyErr_ExceptionMatches(PyExc_AttributeError)) + PyErr_Clear(); + else + return -1; + } + self->read = PyObject_GetAttrString(file, "read"); + self->readline = PyObject_GetAttrString(file, "readline"); + if (self->readline == NULL || self->read == NULL) { + if (PyErr_ExceptionMatches(PyExc_AttributeError)) + PyErr_SetString(PyExc_TypeError, + "file must have 'read' and 'readline' attributes"); + Py_CLEAR(self->read); + Py_CLEAR(self->readline); + Py_CLEAR(self->peek); + return -1; + } + return 0; +} + +/* Returns -1 (with an exception set) on failure, 0 on success. This may + be called once on a freshly created Pickler. */ +static int +_Unpickler_SetInputEncoding(UnpicklerObject *self, + const char *encoding, + const char *errors) +{ + if (encoding == NULL) + encoding = "ASCII"; + if (errors == NULL) + errors = "strict"; + + self->encoding = strdup(encoding); + self->errors = strdup(errors); + if (self->encoding == NULL || self->errors == NULL) { + PyErr_NoMemory(); + return -1; + } + return 0; +} + +/* Generate a GET opcode for an object stored in the memo. */ +static int +memo_get(PicklerObject *self, PyObject *key) +{ + Py_ssize_t *value; + char pdata[30]; + Py_ssize_t len; + + value = PyMemoTable_Get(self->memo, key); + if (value == NULL) { + PyErr_SetObject(PyExc_KeyError, key); + return -1; + } + + if (!self->bin) { + pdata[0] = GET; + PyOS_snprintf(pdata + 1, sizeof(pdata) - 1, + "%" PY_FORMAT_SIZE_T "d\n", *value); + len = strlen(pdata); + } + else { + if (*value < 256) { + pdata[0] = BINGET; + pdata[1] = (unsigned char)(*value & 0xff); + len = 2; + } + else if (*value <= 0xffffffffL) { + pdata[0] = LONG_BINGET; + pdata[1] = (unsigned char)(*value & 0xff); + pdata[2] = (unsigned char)((*value >> 8) & 0xff); + pdata[3] = (unsigned char)((*value >> 16) & 0xff); + pdata[4] = (unsigned char)((*value >> 24) & 0xff); + len = 5; + } + else { /* unlikely */ + PyErr_SetString(PicklingError, + "memo id too large for LONG_BINGET"); + return -1; + } + } + + if (_Pickler_Write(self, pdata, len) < 0) + return -1; + + return 0; +} + +/* Store an object in the memo, assign it a new unique ID based on the number + of objects currently stored in the memo and generate a PUT opcode. */ +static int +memo_put(PicklerObject *self, PyObject *obj) +{ + Py_ssize_t x; + char pdata[30]; + Py_ssize_t len; + int status = 0; + + if (self->fast) + return 0; + + x = PyMemoTable_Size(self->memo); + if (PyMemoTable_Set(self->memo, obj, x) < 0) + goto error; + + if (!self->bin) { + pdata[0] = PUT; + PyOS_snprintf(pdata + 1, sizeof(pdata) - 1, + "%" PY_FORMAT_SIZE_T "d\n", x); + len = strlen(pdata); + } + else { + if (x < 256) { + pdata[0] = BINPUT; + pdata[1] = (unsigned char)x; + len = 2; + } + else if (x <= 0xffffffffL) { + pdata[0] = LONG_BINPUT; + pdata[1] = (unsigned char)(x & 0xff); + pdata[2] = (unsigned char)((x >> 8) & 0xff); + pdata[3] = (unsigned char)((x >> 16) & 0xff); + pdata[4] = (unsigned char)((x >> 24) & 0xff); + len = 5; + } + else { /* unlikely */ + PyErr_SetString(PicklingError, + "memo id too large for LONG_BINPUT"); + return -1; + } + } + + if (_Pickler_Write(self, pdata, len) < 0) + goto error; + + if (0) { + error: + status = -1; + } + + return status; +} + +static PyObject * +whichmodule(PyObject *global, PyObject *global_name) +{ + Py_ssize_t i, j; + static PyObject *module_str = NULL; + static PyObject *main_str = NULL; + PyObject *module_name; + PyObject *modules_dict; + PyObject *module; + PyObject *obj; + + if (module_str == NULL) { + module_str = PyUnicode_InternFromString("__module__"); + if (module_str == NULL) + return NULL; + main_str = PyUnicode_InternFromString("__main__"); + if (main_str == NULL) + return NULL; + } + + module_name = PyObject_GetAttr(global, module_str); + + /* In some rare cases (e.g., bound methods of extension types), + __module__ can be None. If it is so, then search sys.modules + for the module of global. */ + if (module_name == Py_None) { + Py_DECREF(module_name); + goto search; + } + + if (module_name) { + return module_name; + } + if (PyErr_ExceptionMatches(PyExc_AttributeError)) + PyErr_Clear(); + else + return NULL; + + search: + modules_dict = PySys_GetObject("modules"); + if (modules_dict == NULL) + return NULL; + + i = 0; + module_name = NULL; + while ((j = PyDict_Next(modules_dict, &i, &module_name, &module))) { + if (PyObject_RichCompareBool(module_name, main_str, Py_EQ) == 1) + continue; + + obj = PyObject_GetAttr(module, global_name); + if (obj == NULL) { + if (PyErr_ExceptionMatches(PyExc_AttributeError)) + PyErr_Clear(); + else + return NULL; + continue; + } + + if (obj != global) { + Py_DECREF(obj); + continue; + } + + Py_DECREF(obj); + break; + } + + /* If no module is found, use __main__. */ + if (!j) { + module_name = main_str; + } + + Py_INCREF(module_name); + return module_name; +} + +/* fast_save_enter() and fast_save_leave() are guards against recursive + objects when Pickler is used with the "fast mode" (i.e., with object + memoization disabled). If the nesting of a list or dict object exceed + FAST_NESTING_LIMIT, these guards will start keeping an internal + reference to the seen list or dict objects and check whether these objects + are recursive. These are not strictly necessary, since save() has a + hard-coded recursion limit, but they give a nicer error message than the + typical RuntimeError. */ +static int +fast_save_enter(PicklerObject *self, PyObject *obj) +{ + /* if fast_nesting < 0, we're doing an error exit. */ + if (++self->fast_nesting >= FAST_NESTING_LIMIT) { + PyObject *key = NULL; + if (self->fast_memo == NULL) { + self->fast_memo = PyDict_New(); + if (self->fast_memo == NULL) { + self->fast_nesting = -1; + return 0; + } + } + key = PyLong_FromVoidPtr(obj); + if (key == NULL) + return 0; + if (PyDict_GetItem(self->fast_memo, key)) { + Py_DECREF(key); + PyErr_Format(PyExc_ValueError, + "fast mode: can't pickle cyclic objects " + "including object type %.200s at %p", + obj->ob_type->tp_name, obj); + self->fast_nesting = -1; + return 0; + } + if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) { + Py_DECREF(key); + self->fast_nesting = -1; + return 0; + } + Py_DECREF(key); + } + return 1; +} + +static int +fast_save_leave(PicklerObject *self, PyObject *obj) +{ + if (self->fast_nesting-- >= FAST_NESTING_LIMIT) { + PyObject *key = PyLong_FromVoidPtr(obj); + if (key == NULL) + return 0; + if (PyDict_DelItem(self->fast_memo, key) < 0) { + Py_DECREF(key); + return 0; + } + Py_DECREF(key); + } + return 1; +} + +static int +save_none(PicklerObject *self, PyObject *obj) +{ + const char none_op = NONE; + if (_Pickler_Write(self, &none_op, 1) < 0) + return -1; + + return 0; +} + +static int +save_bool(PicklerObject *self, PyObject *obj) +{ + static const char *buf[2] = { FALSE, TRUE }; + const char len[2] = {sizeof(FALSE) - 1, sizeof(TRUE) - 1}; + int p = (obj == Py_True); + + if (self->proto >= 2) { + const char bool_op = p ? NEWTRUE : NEWFALSE; + if (_Pickler_Write(self, &bool_op, 1) < 0) + return -1; + } + else if (_Pickler_Write(self, buf[p], len[p]) < 0) + return -1; + + return 0; +} + +static int +save_int(PicklerObject *self, long x) +{ + char pdata[32]; + Py_ssize_t len = 0; + + if (!self->bin +#if SIZEOF_LONG > 4 + || x > 0x7fffffffL || x < -0x80000000L +#endif + ) { + /* Text-mode pickle, or long too big to fit in the 4-byte + * signed BININT format: store as a string. + */ + pdata[0] = LONG; /* use LONG for consistency with pickle.py */ + PyOS_snprintf(pdata + 1, sizeof(pdata) - 1, "%ldL\n", x); + if (_Pickler_Write(self, pdata, strlen(pdata)) < 0) + return -1; + } + else { + /* Binary pickle and x fits in a signed 4-byte int. */ + pdata[1] = (unsigned char)(x & 0xff); + pdata[2] = (unsigned char)((x >> 8) & 0xff); + pdata[3] = (unsigned char)((x >> 16) & 0xff); + pdata[4] = (unsigned char)((x >> 24) & 0xff); + + if ((pdata[4] == 0) && (pdata[3] == 0)) { + if (pdata[2] == 0) { + pdata[0] = BININT1; + len = 2; + } + else { + pdata[0] = BININT2; + len = 3; + } + } + else { + pdata[0] = BININT; + len = 5; + } + + if (_Pickler_Write(self, pdata, len) < 0) + return -1; + } + + return 0; +} + +static int +save_long(PicklerObject *self, PyObject *obj) +{ + PyObject *repr = NULL; + Py_ssize_t size; + long val = PyLong_AsLong(obj); + int status = 0; + + const char long_op = LONG; + + if (val == -1 && PyErr_Occurred()) { + /* out of range for int pickling */ + PyErr_Clear(); + } + else + return save_int(self, val); + + if (self->proto >= 2) { + /* Linear-time pickling. */ + size_t nbits; + size_t nbytes; + unsigned char *pdata; + char header[5]; + int i; + int sign = _PyLong_Sign(obj); + + if (sign == 0) { + header[0] = LONG1; + header[1] = 0; /* It's 0 -- an empty bytestring. */ + if (_Pickler_Write(self, header, 2) < 0) + goto error; + return 0; + } + nbits = _PyLong_NumBits(obj); + if (nbits == (size_t)-1 && PyErr_Occurred()) + goto error; + /* How many bytes do we need? There are nbits >> 3 full + * bytes of data, and nbits & 7 leftover bits. If there + * are any leftover bits, then we clearly need another + * byte. Wnat's not so obvious is that we *probably* + * need another byte even if there aren't any leftovers: + * the most-significant bit of the most-significant byte + * acts like a sign bit, and it's usually got a sense + * opposite of the one we need. The exception is longs + * of the form -(2**(8*j-1)) for j > 0. Such a long is + * its own 256's-complement, so has the right sign bit + * even without the extra byte. That's a pain to check + * for in advance, though, so we always grab an extra + * byte at the start, and cut it back later if possible. + */ + nbytes = (nbits >> 3) + 1; + if (nbytes > 0x7fffffffL) { + PyErr_SetString(PyExc_OverflowError, + "long too large to pickle"); + goto error; + } + repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes); + if (repr == NULL) + goto error; + pdata = (unsigned char *)PyBytes_AS_STRING(repr); + i = _PyLong_AsByteArray((PyLongObject *)obj, + pdata, nbytes, + 1 /* little endian */ , 1 /* signed */ ); + if (i < 0) + goto error; + /* If the long is negative, this may be a byte more than + * needed. This is so iff the MSB is all redundant sign + * bits. + */ + if (sign < 0 && + nbytes > 1 && + pdata[nbytes - 1] == 0xff && + (pdata[nbytes - 2] & 0x80) != 0) { + nbytes--; + } + + if (nbytes < 256) { + header[0] = LONG1; + header[1] = (unsigned char)nbytes; + size = 2; + } + else { + header[0] = LONG4; + size = (Py_ssize_t) nbytes; + for (i = 1; i < 5; i++) { + header[i] = (unsigned char)(size & 0xff); + size >>= 8; + } + size = 5; + } + if (_Pickler_Write(self, header, size) < 0 || + _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0) + goto error; + } + else { + char *string; + + /* proto < 2: write the repr and newline. This is quadratic-time (in + the number of digits), in both directions. We add a trailing 'L' + to the repr, for compatibility with Python 2.x. */ + + repr = PyObject_Repr(obj); + if (repr == NULL) + goto error; + + string = _PyUnicode_AsStringAndSize(repr, &size); + if (string == NULL) + goto error; + + if (_Pickler_Write(self, &long_op, 1) < 0 || + _Pickler_Write(self, string, size) < 0 || + _Pickler_Write(self, "L\n", 2) < 0) + goto error; + } + + if (0) { + error: + status = -1; + } + Py_XDECREF(repr); + + return status; +} + +static int +save_float(PicklerObject *self, PyObject *obj) +{ + double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj); + + if (self->bin) { + char pdata[9]; + pdata[0] = BINFLOAT; + if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0) + return -1; + if (_Pickler_Write(self, pdata, 9) < 0) + return -1; + } + else { + int result = -1; + char *buf = NULL; + char op = FLOAT; + + if (_Pickler_Write(self, &op, 1) < 0) + goto done; + + buf = PyOS_double_to_string(x, 'g', 17, 0, NULL); + if (!buf) { + PyErr_NoMemory(); + goto done; + } + + if (_Pickler_Write(self, buf, strlen(buf)) < 0) + goto done; + + if (_Pickler_Write(self, "\n", 1) < 0) + goto done; + + result = 0; +done: + PyMem_Free(buf); + return result; + } + + return 0; +} + +static int +save_bytes(PicklerObject *self, PyObject *obj) +{ + if (self->proto < 3) { + /* Older pickle protocols do not have an opcode for pickling bytes + objects. Therefore, we need to fake the copy protocol (i.e., + the __reduce__ method) to permit bytes object unpickling. + + Here we use a hack to be compatible with Python 2. Since in Python + 2 'bytes' is just an alias for 'str' (which has different + parameters than the actual bytes object), we use codecs.encode + to create the appropriate 'str' object when unpickled using + Python 2 *and* the appropriate 'bytes' object when unpickled + using Python 3. Again this is a hack and we don't need to do this + with newer protocols. */ + static PyObject *codecs_encode = NULL; + PyObject *reduce_value = NULL; + int status; + + if (codecs_encode == NULL) { + PyObject *codecs_module = PyImport_ImportModule("codecs"); + if (codecs_module == NULL) { + return -1; + } + codecs_encode = PyObject_GetAttrString(codecs_module, "encode"); + Py_DECREF(codecs_module); + if (codecs_encode == NULL) { + return -1; + } + } + + if (PyBytes_GET_SIZE(obj) == 0) { + reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type); + } + else { + static PyObject *latin1 = NULL; + PyObject *unicode_str = + PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj), + PyBytes_GET_SIZE(obj), + "strict"); + if (unicode_str == NULL) + return -1; + if (latin1 == NULL) { + latin1 = PyUnicode_InternFromString("latin1"); + if (latin1 == NULL) + return -1; + } + reduce_value = Py_BuildValue("(O(OO))", + codecs_encode, unicode_str, latin1); + Py_DECREF(unicode_str); + } + + if (reduce_value == NULL) + return -1; + + /* save_reduce() will memoize the object automatically. */ + status = save_reduce(self, reduce_value, obj); + Py_DECREF(reduce_value); + return status; + } + else { + Py_ssize_t size; + char header[5]; + Py_ssize_t len; + + size = PyBytes_GET_SIZE(obj); + if (size < 0) + return -1; + + if (size < 256) { + header[0] = SHORT_BINBYTES; + header[1] = (unsigned char)size; + len = 2; + } + else if (size <= 0xffffffffL) { + header[0] = BINBYTES; + header[1] = (unsigned char)(size & 0xff); + header[2] = (unsigned char)((size >> 8) & 0xff); + header[3] = (unsigned char)((size >> 16) & 0xff); + header[4] = (unsigned char)((size >> 24) & 0xff); + len = 5; + } + else { + PyErr_SetString(PyExc_OverflowError, + "cannot serialize a bytes object larger than 4GB"); + return -1; /* string too large */ + } + + if (_Pickler_Write(self, header, len) < 0) + return -1; + + if (_Pickler_Write(self, PyBytes_AS_STRING(obj), size) < 0) + return -1; + + if (memo_put(self, obj) < 0) + return -1; + + return 0; + } +} + +/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates + backslash and newline characters to \uXXXX escapes. */ +static PyObject * +raw_unicode_escape(const Py_UNICODE *s, Py_ssize_t size) +{ + PyObject *repr, *result; + char *p; + char *q; + + static const char *hexdigits = "0123456789abcdef"; + +#ifdef Py_UNICODE_WIDE + const Py_ssize_t expandsize = 10; +#else + const Py_ssize_t expandsize = 6; +#endif + + if (size > PY_SSIZE_T_MAX / expandsize) + return PyErr_NoMemory(); + + repr = PyByteArray_FromStringAndSize(NULL, expandsize * size); + if (repr == NULL) + return NULL; + if (size == 0) + goto done; + + p = q = PyByteArray_AS_STRING(repr); + while (size-- > 0) { + Py_UNICODE ch = *s++; +#ifdef Py_UNICODE_WIDE + /* Map 32-bit characters to '\Uxxxxxxxx' */ + if (ch >= 0x10000) { + *p++ = '\\'; + *p++ = 'U'; + *p++ = hexdigits[(ch >> 28) & 0xf]; + *p++ = hexdigits[(ch >> 24) & 0xf]; + *p++ = hexdigits[(ch >> 20) & 0xf]; + *p++ = hexdigits[(ch >> 16) & 0xf]; + *p++ = hexdigits[(ch >> 12) & 0xf]; + *p++ = hexdigits[(ch >> 8) & 0xf]; + *p++ = hexdigits[(ch >> 4) & 0xf]; + *p++ = hexdigits[ch & 15]; + } + else +#else + /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */ + if (ch >= 0xD800 && ch < 0xDC00) { + Py_UNICODE ch2; + Py_UCS4 ucs; + + ch2 = *s++; + size--; + if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { + ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000; + *p++ = '\\'; + *p++ = 'U'; + *p++ = hexdigits[(ucs >> 28) & 0xf]; + *p++ = hexdigits[(ucs >> 24) & 0xf]; + *p++ = hexdigits[(ucs >> 20) & 0xf]; + *p++ = hexdigits[(ucs >> 16) & 0xf]; + *p++ = hexdigits[(ucs >> 12) & 0xf]; + *p++ = hexdigits[(ucs >> 8) & 0xf]; + *p++ = hexdigits[(ucs >> 4) & 0xf]; + *p++ = hexdigits[ucs & 0xf]; + continue; + } + /* Fall through: isolated surrogates are copied as-is */ + s--; + size++; + } +#endif + /* Map 16-bit characters to '\uxxxx' */ + if (ch >= 256 || ch == '\\' || ch == '\n') { + *p++ = '\\'; + *p++ = 'u'; + *p++ = hexdigits[(ch >> 12) & 0xf]; + *p++ = hexdigits[(ch >> 8) & 0xf]; + *p++ = hexdigits[(ch >> 4) & 0xf]; + *p++ = hexdigits[ch & 15]; + } + /* Copy everything else as-is */ + else + *p++ = (char) ch; + } + size = p - q; + + done: + result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(repr), size); + Py_DECREF(repr); + return result; +} + +static int +save_unicode(PicklerObject *self, PyObject *obj) +{ + Py_ssize_t size; + PyObject *encoded = NULL; + + if (self->bin) { + char pdata[5]; + + encoded = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(obj), + PyUnicode_GET_SIZE(obj), + "surrogatepass"); + if (encoded == NULL) + goto error; + + size = PyBytes_GET_SIZE(encoded); + if (size > 0xffffffffL) { + PyErr_SetString(PyExc_OverflowError, + "cannot serialize a string larger than 4GB"); + goto error; /* string too large */ + } + + 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, pdata, 5) < 0) + goto error; + + if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) + goto error; + } + else { + const char unicode_op = UNICODE; + + encoded = raw_unicode_escape(PyUnicode_AS_UNICODE(obj), + PyUnicode_GET_SIZE(obj)); + if (encoded == NULL) + goto error; + + if (_Pickler_Write(self, &unicode_op, 1) < 0) + goto error; + + size = PyBytes_GET_SIZE(encoded); + if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) + goto error; + + if (_Pickler_Write(self, "\n", 1) < 0) + goto error; + } + if (memo_put(self, obj) < 0) + goto error; + + 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. */ +static int +store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len) +{ + Py_ssize_t i; + + assert(PyTuple_Size(t) == len); + + for (i = 0; i < len; i++) { + PyObject *element = PyTuple_GET_ITEM(t, i); + + if (element == NULL) + return -1; + if (save(self, element, 0) < 0) + return -1; + } + + return 0; +} + +/* Tuples are ubiquitous in the pickle protocols, so many techniques are + * used across protocols to minimize the space needed to pickle them. + * Tuples are also the only builtin immutable type that can be recursive + * (a tuple can be reached from itself), and that requires some subtle + * magic so that it works in all cases. IOW, this is a long routine. + */ +static int +save_tuple(PicklerObject *self, PyObject *obj) +{ + Py_ssize_t len, i; + + const char mark_op = MARK; + const char tuple_op = TUPLE; + const char pop_op = POP; + const char pop_mark_op = POP_MARK; + const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3}; + + if ((len = PyTuple_Size(obj)) < 0) + return -1; + + if (len == 0) { + char pdata[2]; + + if (self->proto) { + pdata[0] = EMPTY_TUPLE; + len = 1; + } + else { + pdata[0] = MARK; + pdata[1] = TUPLE; + len = 2; + } + if (_Pickler_Write(self, pdata, len) < 0) + return -1; + return 0; + } + + /* The tuple isn't in the memo now. If it shows up there after + * saving the tuple elements, the tuple must be recursive, in + * which case we'll pop everything we put on the stack, and fetch + * its value from the memo. + */ + if (len <= 3 && self->proto >= 2) { + /* Use TUPLE{1,2,3} opcodes. */ + if (store_tuple_elements(self, obj, len) < 0) + return -1; + + if (PyMemoTable_Get(self->memo, obj)) { + /* pop the len elements */ + for (i = 0; i < len; i++) + if (_Pickler_Write(self, &pop_op, 1) < 0) + return -1; + /* fetch from memo */ + if (memo_get(self, obj) < 0) + return -1; + + return 0; + } + else { /* Not recursive. */ + if (_Pickler_Write(self, len2opcode + len, 1) < 0) + return -1; + } + goto memoize; + } + + /* proto < 2 and len > 0, or proto >= 2 and len > 3. + * Generate MARK e1 e2 ... TUPLE + */ + if (_Pickler_Write(self, &mark_op, 1) < 0) + return -1; + + if (store_tuple_elements(self, obj, len) < 0) + return -1; + + if (PyMemoTable_Get(self->memo, obj)) { + /* pop the stack stuff we pushed */ + if (self->bin) { + if (_Pickler_Write(self, &pop_mark_op, 1) < 0) + return -1; + } + else { + /* Note that we pop one more than len, to remove + * the MARK too. + */ + for (i = 0; i <= len; i++) + if (_Pickler_Write(self, &pop_op, 1) < 0) + return -1; + } + /* fetch from memo */ + if (memo_get(self, obj) < 0) + return -1; + + return 0; + } + else { /* Not recursive. */ + if (_Pickler_Write(self, &tuple_op, 1) < 0) + return -1; + } + + memoize: + if (memo_put(self, obj) < 0) + return -1; + + return 0; +} + +/* iter is an iterator giving items, and we batch up chunks of + * MARK item item ... item APPENDS + * opcode sequences. Calling code should have arranged to first create an + * empty list, or list-like object, for the APPENDS to operate on. + * Returns 0 on success, <0 on error. + */ +static int +batch_list(PicklerObject *self, PyObject *iter) +{ + PyObject *obj = NULL; + PyObject *firstitem = NULL; + int i, n; + + const char mark_op = MARK; + const char append_op = APPEND; + const char appends_op = APPENDS; + + assert(iter != NULL); + + /* XXX: I think this function could be made faster by avoiding the + iterator interface and fetching objects directly from list using + PyList_GET_ITEM. + */ + + if (self->proto == 0) { + /* APPENDS isn't available; do one at a time. */ + for (;;) { + obj = PyIter_Next(iter); + if (obj == NULL) { + if (PyErr_Occurred()) + return -1; + break; + } + i = save(self, obj, 0); + Py_DECREF(obj); + if (i < 0) + return -1; + if (_Pickler_Write(self, &append_op, 1) < 0) + return -1; + } + return 0; + } + + /* proto > 0: write in batches of BATCHSIZE. */ + do { + /* Get first item */ + firstitem = PyIter_Next(iter); + if (firstitem == NULL) { + if (PyErr_Occurred()) + goto error; + + /* nothing more to add */ + break; + } + + /* Try to get a second item */ + obj = PyIter_Next(iter); + if (obj == NULL) { + if (PyErr_Occurred()) + goto error; + + /* Only one item to write */ + if (save(self, firstitem, 0) < 0) + goto error; + if (_Pickler_Write(self, &append_op, 1) < 0) + goto error; + Py_CLEAR(firstitem); + break; + } + + /* More than one item to write */ + + /* Pump out MARK, items, APPENDS. */ + if (_Pickler_Write(self, &mark_op, 1) < 0) + goto error; + + if (save(self, firstitem, 0) < 0) + goto error; + Py_CLEAR(firstitem); + n = 1; + + /* Fetch and save up to BATCHSIZE items */ + while (obj) { + if (save(self, obj, 0) < 0) + goto error; + Py_CLEAR(obj); + n += 1; + + if (n == BATCHSIZE) + break; + + obj = PyIter_Next(iter); + if (obj == NULL) { + if (PyErr_Occurred()) + goto error; + break; + } + } + + if (_Pickler_Write(self, &appends_op, 1) < 0) + goto error; + + } while (n == BATCHSIZE); + return 0; + + error: + Py_XDECREF(firstitem); + Py_XDECREF(obj); + return -1; +} + +/* This is a variant of batch_list() above, specialized for lists (with no + * support for list subclasses). Like batch_list(), we batch up chunks of + * MARK item item ... item APPENDS + * opcode sequences. Calling code should have arranged to first create an + * empty list, or list-like object, for the APPENDS to operate on. + * Returns 0 on success, -1 on error. + * + * This version is considerably faster than batch_list(), if less general. + * + * Note that this only works for protocols > 0. + */ +static int +batch_list_exact(PicklerObject *self, PyObject *obj) +{ + PyObject *item = NULL; + Py_ssize_t this_batch, total; + + const char append_op = APPEND; + const char appends_op = APPENDS; + const char mark_op = MARK; + + assert(obj != NULL); + assert(self->proto > 0); + assert(PyList_CheckExact(obj)); + + if (PyList_GET_SIZE(obj) == 1) { + item = PyList_GET_ITEM(obj, 0); + if (save(self, item, 0) < 0) + return -1; + if (_Pickler_Write(self, &append_op, 1) < 0) + return -1; + return 0; + } + + /* Write in batches of BATCHSIZE. */ + total = 0; + do { + this_batch = 0; + if (_Pickler_Write(self, &mark_op, 1) < 0) + return -1; + while (total < PyList_GET_SIZE(obj)) { + item = PyList_GET_ITEM(obj, total); + if (save(self, item, 0) < 0) + return -1; + total++; + if (++this_batch == BATCHSIZE) + break; + } + if (_Pickler_Write(self, &appends_op, 1) < 0) + return -1; + + } while (total < PyList_GET_SIZE(obj)); + + return 0; +} + +static int +save_list(PicklerObject *self, PyObject *obj) +{ + char header[3]; + Py_ssize_t len; + int status = 0; + + if (self->fast && !fast_save_enter(self, obj)) + goto error; + + /* Create an empty list. */ + if (self->bin) { + header[0] = EMPTY_LIST; + len = 1; + } + else { + header[0] = MARK; + header[1] = LIST; + len = 2; + } + + if (_Pickler_Write(self, header, len) < 0) + goto error; + + /* Get list length, and bow out early if empty. */ + if ((len = PyList_Size(obj)) < 0) + goto error; + + if (memo_put(self, obj) < 0) + goto error; + + if (len != 0) { + /* Materialize the list elements. */ + if (PyList_CheckExact(obj) && self->proto > 0) { + if (Py_EnterRecursiveCall(" while pickling an object")) + goto error; + status = batch_list_exact(self, obj); + Py_LeaveRecursiveCall(); + } else { + PyObject *iter = PyObject_GetIter(obj); + if (iter == NULL) + goto error; + + if (Py_EnterRecursiveCall(" while pickling an object")) { + Py_DECREF(iter); + goto error; + } + status = batch_list(self, iter); + Py_LeaveRecursiveCall(); + Py_DECREF(iter); + } + } + if (0) { + error: + status = -1; + } + + if (self->fast && !fast_save_leave(self, obj)) + status = -1; + + return status; +} + +/* iter is an iterator giving (key, value) pairs, and we batch up chunks of + * MARK key value ... key value SETITEMS + * opcode sequences. Calling code should have arranged to first create an + * empty dict, or dict-like object, for the SETITEMS to operate on. + * Returns 0 on success, <0 on error. + * + * This is very much like batch_list(). The difference between saving + * elements directly, and picking apart two-tuples, is so long-winded at + * the C level, though, that attempts to combine these routines were too + * ugly to bear. + */ +static int +batch_dict(PicklerObject *self, PyObject *iter) +{ + PyObject *obj = NULL; + PyObject *firstitem = NULL; + int i, n; + + const char mark_op = MARK; + const char setitem_op = SETITEM; + const char setitems_op = SETITEMS; + + assert(iter != NULL); + + if (self->proto == 0) { + /* SETITEMS isn't available; do one at a time. */ + for (;;) { + obj = PyIter_Next(iter); + if (obj == NULL) { + if (PyErr_Occurred()) + return -1; + break; + } + if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) { + PyErr_SetString(PyExc_TypeError, "dict items " + "iterator must return 2-tuples"); + return -1; + } + i = save(self, PyTuple_GET_ITEM(obj, 0), 0); + if (i >= 0) + i = save(self, PyTuple_GET_ITEM(obj, 1), 0); + Py_DECREF(obj); + if (i < 0) + return -1; + if (_Pickler_Write(self, &setitem_op, 1) < 0) + return -1; + } + return 0; + } + + /* proto > 0: write in batches of BATCHSIZE. */ + do { + /* Get first item */ + firstitem = PyIter_Next(iter); + if (firstitem == NULL) { + if (PyErr_Occurred()) + goto error; + + /* nothing more to add */ + break; + } + if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) { + PyErr_SetString(PyExc_TypeError, "dict items " + "iterator must return 2-tuples"); + goto error; + } + + /* Try to get a second item */ + obj = PyIter_Next(iter); + if (obj == NULL) { + if (PyErr_Occurred()) + goto error; + + /* Only one item to write */ + if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) + goto error; + if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) + goto error; + if (_Pickler_Write(self, &setitem_op, 1) < 0) + goto error; + Py_CLEAR(firstitem); + break; + } + + /* More than one item to write */ + + /* Pump out MARK, items, SETITEMS. */ + if (_Pickler_Write(self, &mark_op, 1) < 0) + goto error; + + if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) + goto error; + if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) + goto error; + Py_CLEAR(firstitem); + n = 1; + + /* Fetch and save up to BATCHSIZE items */ + while (obj) { + if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) { + PyErr_SetString(PyExc_TypeError, "dict items " + "iterator must return 2-tuples"); + goto error; + } + if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 || + save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0) + goto error; + Py_CLEAR(obj); + n += 1; + + if (n == BATCHSIZE) + break; + + obj = PyIter_Next(iter); + if (obj == NULL) { + if (PyErr_Occurred()) + goto error; + break; + } + } + + if (_Pickler_Write(self, &setitems_op, 1) < 0) + goto error; + + } while (n == BATCHSIZE); + return 0; + + error: + Py_XDECREF(firstitem); + Py_XDECREF(obj); + return -1; +} + +/* This is a variant of batch_dict() above that specializes for dicts, with no + * support for dict subclasses. Like batch_dict(), we batch up chunks of + * MARK key value ... key value SETITEMS + * opcode sequences. Calling code should have arranged to first create an + * empty dict, or dict-like object, for the SETITEMS to operate on. + * Returns 0 on success, -1 on error. + * + * Note that this currently doesn't work for protocol 0. + */ +static int +batch_dict_exact(PicklerObject *self, PyObject *obj) +{ + PyObject *key = NULL, *value = NULL; + int i; + Py_ssize_t dict_size, ppos = 0; + + const char mark_op = MARK; + const char setitem_op = SETITEM; + const char setitems_op = SETITEMS; + + assert(obj != NULL); + assert(self->proto > 0); + + dict_size = PyDict_Size(obj); + + /* Special-case len(d) == 1 to save space. */ + if (dict_size == 1) { + PyDict_Next(obj, &ppos, &key, &value); + if (save(self, key, 0) < 0) + return -1; + if (save(self, value, 0) < 0) + return -1; + if (_Pickler_Write(self, &setitem_op, 1) < 0) + return -1; + return 0; + } + + /* Write in batches of BATCHSIZE. */ + do { + i = 0; + if (_Pickler_Write(self, &mark_op, 1) < 0) + return -1; + while (PyDict_Next(obj, &ppos, &key, &value)) { + if (save(self, key, 0) < 0) + return -1; + if (save(self, value, 0) < 0) + return -1; + if (++i == BATCHSIZE) + break; + } + if (_Pickler_Write(self, &setitems_op, 1) < 0) + return -1; + if (PyDict_Size(obj) != dict_size) { + PyErr_Format( + PyExc_RuntimeError, + "dictionary changed size during iteration"); + return -1; + } + + } while (i == BATCHSIZE); + return 0; +} + +static int +save_dict(PicklerObject *self, PyObject *obj) +{ + PyObject *items, *iter; + char header[3]; + Py_ssize_t len; + int status = 0; + + if (self->fast && !fast_save_enter(self, obj)) + goto error; + + /* Create an empty dict. */ + if (self->bin) { + header[0] = EMPTY_DICT; + len = 1; + } + else { + header[0] = MARK; + header[1] = DICT; + len = 2; + } + + if (_Pickler_Write(self, header, len) < 0) + goto error; + + /* Get dict size, and bow out early if empty. */ + if ((len = PyDict_Size(obj)) < 0) + goto error; + + if (memo_put(self, obj) < 0) + goto error; + + if (len != 0) { + /* Save the dict items. */ + if (PyDict_CheckExact(obj) && self->proto > 0) { + /* We can take certain shortcuts if we know this is a dict and + not a dict subclass. */ + if (Py_EnterRecursiveCall(" while pickling an object")) + goto error; + status = batch_dict_exact(self, obj); + Py_LeaveRecursiveCall(); + } else { + items = PyObject_CallMethod(obj, "items", "()"); + if (items == NULL) + goto error; + iter = PyObject_GetIter(items); + Py_DECREF(items); + if (iter == NULL) + goto error; + if (Py_EnterRecursiveCall(" while pickling an object")) { + Py_DECREF(iter); + goto error; + } + status = batch_dict(self, iter); + Py_LeaveRecursiveCall(); + Py_DECREF(iter); + } + } + + if (0) { + error: + status = -1; + } + + if (self->fast && !fast_save_leave(self, obj)) + status = -1; + + return status; +} + +static int +save_global(PicklerObject *self, PyObject *obj, PyObject *name) +{ + static PyObject *name_str = NULL; + PyObject *global_name = NULL; + PyObject *module_name = NULL; + PyObject *module = NULL; + PyObject *cls; + int status = 0; + + const char global_op = GLOBAL; + + if (name_str == NULL) { + name_str = PyUnicode_InternFromString("__name__"); + if (name_str == NULL) + goto error; + } + + if (name) { + global_name = name; + Py_INCREF(global_name); + } + else { + global_name = PyObject_GetAttr(obj, name_str); + if (global_name == NULL) + goto error; + } + + module_name = whichmodule(obj, global_name); + if (module_name == NULL) + goto error; + + /* XXX: Change to use the import C API directly with level=0 to disallow + relative imports. + + XXX: PyImport_ImportModuleLevel could be used. However, this bypasses + builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore + custom import functions (IMHO, this would be a nice security + feature). The import C API would need to be extended to support the + extra parameters of __import__ to fix that. */ + module = PyImport_Import(module_name); + if (module == NULL) { + PyErr_Format(PicklingError, + "Can't pickle %R: import of module %R failed", + obj, module_name); + goto error; + } + cls = PyObject_GetAttr(module, global_name); + if (cls == NULL) { + PyErr_Format(PicklingError, + "Can't pickle %R: attribute lookup %S.%S failed", + obj, module_name, global_name); + goto error; + } + if (cls != obj) { + Py_DECREF(cls); + PyErr_Format(PicklingError, + "Can't pickle %R: it's not the same object as %S.%S", + obj, module_name, global_name); + goto error; + } + Py_DECREF(cls); + + if (self->proto >= 2) { + /* See whether this is in the extension registry, and if + * so generate an EXT opcode. + */ + PyObject *code_obj; /* extension code as Python object */ + long code; /* extension code as C value */ + char pdata[5]; + Py_ssize_t n; + + PyTuple_SET_ITEM(two_tuple, 0, module_name); + PyTuple_SET_ITEM(two_tuple, 1, global_name); + code_obj = PyDict_GetItem(extension_registry, two_tuple); + /* The object is not registered in the extension registry. + This is the most likely code path. */ + if (code_obj == NULL) + goto gen_global; + + /* XXX: pickle.py doesn't check neither the type, nor the range + of the value returned by the extension_registry. It should for + consistency. */ + + /* Verify code_obj has the right type and value. */ + if (!PyLong_Check(code_obj)) { + PyErr_Format(PicklingError, + "Can't pickle %R: extension code %R isn't an integer", + obj, code_obj); + goto error; + } + code = PyLong_AS_LONG(code_obj); + if (code <= 0 || code > 0x7fffffffL) { + if (!PyErr_Occurred()) + PyErr_Format(PicklingError, + "Can't pickle %R: extension code %ld is out of range", + obj, code); + goto error; + } + + /* Generate an EXT opcode. */ + if (code <= 0xff) { + pdata[0] = EXT1; + pdata[1] = (unsigned char)code; + n = 2; + } + else if (code <= 0xffff) { + pdata[0] = EXT2; + pdata[1] = (unsigned char)(code & 0xff); + pdata[2] = (unsigned char)((code >> 8) & 0xff); + n = 3; + } + else { + pdata[0] = EXT4; + pdata[1] = (unsigned char)(code & 0xff); + pdata[2] = (unsigned char)((code >> 8) & 0xff); + pdata[3] = (unsigned char)((code >> 16) & 0xff); + pdata[4] = (unsigned char)((code >> 24) & 0xff); + n = 5; + } + + if (_Pickler_Write(self, pdata, n) < 0) + goto error; + } + else { + /* Generate a normal global opcode if we are using a pickle + protocol <= 2, or if the object is not registered in the + extension registry. */ + PyObject *encoded; + PyObject *(*unicode_encoder)(PyObject *); + + gen_global: + if (_Pickler_Write(self, &global_op, 1) < 0) + goto error; + + /* Since Python 3.0 now supports non-ASCII identifiers, we encode both + the module name and the global name using UTF-8. We do so only when + we are using the pickle protocol newer than version 3. This is to + ensure compatibility with older Unpickler running on Python 2.x. */ + if (self->proto >= 3) { + unicode_encoder = PyUnicode_AsUTF8String; + } + else { + unicode_encoder = PyUnicode_AsASCIIString; + } + + /* For protocol < 3 and if the user didn't request against doing so, + we convert module names to the old 2.x module names. */ + if (self->fix_imports) { + PyObject *key; + PyObject *item; + + key = PyTuple_Pack(2, module_name, global_name); + if (key == NULL) + goto error; + item = PyDict_GetItemWithError(name_mapping_3to2, key); + Py_DECREF(key); + if (item) { + if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) { + PyErr_Format(PyExc_RuntimeError, + "_compat_pickle.REVERSE_NAME_MAPPING values " + "should be 2-tuples, not %.200s", + Py_TYPE(item)->tp_name); + goto error; + } + Py_CLEAR(module_name); + Py_CLEAR(global_name); + module_name = PyTuple_GET_ITEM(item, 0); + global_name = PyTuple_GET_ITEM(item, 1); + if (!PyUnicode_Check(module_name) || + !PyUnicode_Check(global_name)) { + PyErr_Format(PyExc_RuntimeError, + "_compat_pickle.REVERSE_NAME_MAPPING values " + "should be pairs of str, not (%.200s, %.200s)", + Py_TYPE(module_name)->tp_name, + Py_TYPE(global_name)->tp_name); + goto error; + } + Py_INCREF(module_name); + Py_INCREF(global_name); + } + else if (PyErr_Occurred()) { + goto error; + } + + item = PyDict_GetItemWithError(import_mapping_3to2, module_name); + if (item) { + if (!PyUnicode_Check(item)) { + PyErr_Format(PyExc_RuntimeError, + "_compat_pickle.REVERSE_IMPORT_MAPPING values " + "should be strings, not %.200s", + Py_TYPE(item)->tp_name); + goto error; + } + Py_CLEAR(module_name); + module_name = item; + Py_INCREF(module_name); + } + else if (PyErr_Occurred()) { + goto error; + } + } + + /* Save the name of the module. */ + encoded = unicode_encoder(module_name); + if (encoded == NULL) { + if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) + PyErr_Format(PicklingError, + "can't pickle module identifier '%S' using " + "pickle protocol %i", module_name, self->proto); + goto error; + } + if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), + PyBytes_GET_SIZE(encoded)) < 0) { + Py_DECREF(encoded); + goto error; + } + Py_DECREF(encoded); + if(_Pickler_Write(self, "\n", 1) < 0) + goto error; + + /* Save the name of the module. */ + encoded = unicode_encoder(global_name); + if (encoded == NULL) { + if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) + PyErr_Format(PicklingError, + "can't pickle global identifier '%S' using " + "pickle protocol %i", global_name, self->proto); + goto error; + } + if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), + PyBytes_GET_SIZE(encoded)) < 0) { + Py_DECREF(encoded); + goto error; + } + Py_DECREF(encoded); + if(_Pickler_Write(self, "\n", 1) < 0) + goto error; + + /* Memoize the object. */ + if (memo_put(self, obj) < 0) + goto error; + } + + if (0) { + error: + status = -1; + } + Py_XDECREF(module_name); + Py_XDECREF(global_name); + Py_XDECREF(module); + + return status; +} + +static int +save_pers(PicklerObject *self, PyObject *obj, PyObject *func) +{ + PyObject *pid = NULL; + int status = 0; + + const char persid_op = PERSID; + const char binpersid_op = BINPERSID; + + Py_INCREF(obj); + pid = _Pickler_FastCall(self, func, obj); + if (pid == NULL) + return -1; + + if (pid != Py_None) { + if (self->bin) { + if (save(self, pid, 1) < 0 || + _Pickler_Write(self, &binpersid_op, 1) < 0) + goto error; + } + else { + PyObject *pid_str = NULL; + char *pid_ascii_bytes; + Py_ssize_t size; + + pid_str = PyObject_Str(pid); + if (pid_str == NULL) + goto error; + + /* XXX: Should it check whether the persistent id only contains + ASCII characters? And what if the pid contains embedded + newlines? */ + pid_ascii_bytes = _PyUnicode_AsStringAndSize(pid_str, &size); + Py_DECREF(pid_str); + if (pid_ascii_bytes == NULL) + goto error; + + if (_Pickler_Write(self, &persid_op, 1) < 0 || + _Pickler_Write(self, pid_ascii_bytes, size) < 0 || + _Pickler_Write(self, "\n", 1) < 0) + goto error; + } + status = 1; + } + + if (0) { + error: + status = -1; + } + Py_XDECREF(pid); + + return status; +} + +/* We're saving obj, and args is the 2-thru-5 tuple returned by the + * appropriate __reduce__ method for obj. + */ +static int +save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) +{ + PyObject *callable; + PyObject *argtup; + PyObject *state = NULL; + PyObject *listitems = Py_None; + PyObject *dictitems = Py_None; + Py_ssize_t size; + + int use_newobj = self->proto >= 2; + + const char reduce_op = REDUCE; + const char build_op = BUILD; + const char newobj_op = NEWOBJ; + + size = PyTuple_Size(args); + if (size < 2 || size > 5) { + PyErr_SetString(PicklingError, "tuple returned by " + "__reduce__ must contain 2 through 5 elements"); + return -1; + } + + if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5, + &callable, &argtup, &state, &listitems, &dictitems)) + return -1; + + if (!PyCallable_Check(callable)) { + PyErr_SetString(PicklingError, "first item of the tuple " + "returned by __reduce__ must be callable"); + return -1; + } + if (!PyTuple_Check(argtup)) { + PyErr_SetString(PicklingError, "second item of the tuple " + "returned by __reduce__ must be a tuple"); + return -1; + } + + if (state == Py_None) + state = NULL; + + if (listitems == Py_None) + listitems = NULL; + else if (!PyIter_Check(listitems)) { + PyErr_Format(PicklingError, "Fourth element of tuple" + "returned by __reduce__ must be an iterator, not %s", + Py_TYPE(listitems)->tp_name); + return -1; + } + + if (dictitems == Py_None) + dictitems = NULL; + else if (!PyIter_Check(dictitems)) { + PyErr_Format(PicklingError, "Fifth element of tuple" + "returned by __reduce__ must be an iterator, not %s", + Py_TYPE(dictitems)->tp_name); + return -1; + } + + /* Protocol 2 special case: if callable's name is __newobj__, use + NEWOBJ. */ + if (use_newobj) { + static PyObject *newobj_str = NULL; + PyObject *name_str; + + if (newobj_str == NULL) { + newobj_str = PyUnicode_InternFromString("__newobj__"); + if (newobj_str == NULL) + return -1; + } + + name_str = PyObject_GetAttrString(callable, "__name__"); + if (name_str == NULL) { + if (PyErr_ExceptionMatches(PyExc_AttributeError)) + PyErr_Clear(); + else + return -1; + use_newobj = 0; + } + else { + use_newobj = PyUnicode_Check(name_str) && + PyUnicode_Compare(name_str, newobj_str) == 0; + Py_DECREF(name_str); + } + } + if (use_newobj) { + PyObject *cls; + PyObject *newargtup; + PyObject *obj_class; + int p; + + /* Sanity checks. */ + if (Py_SIZE(argtup) < 1) { + PyErr_SetString(PicklingError, "__newobj__ arglist is empty"); + return -1; + } + + cls = PyTuple_GET_ITEM(argtup, 0); + if (!PyObject_HasAttrString(cls, "__new__")) { + PyErr_SetString(PicklingError, "args[0] from " + "__newobj__ args has no __new__"); + return -1; + } + + if (obj != NULL) { + obj_class = PyObject_GetAttrString(obj, "__class__"); + if (obj_class == NULL) { + if (PyErr_ExceptionMatches(PyExc_AttributeError)) + PyErr_Clear(); + else + return -1; + } + p = obj_class != cls; /* true iff a problem */ + Py_DECREF(obj_class); + if (p) { + PyErr_SetString(PicklingError, "args[0] from " + "__newobj__ args has the wrong class"); + return -1; + } + } + /* XXX: These calls save() are prone to infinite recursion. Imagine + what happen if the value returned by the __reduce__() method of + some extension type contains another object of the same type. Ouch! + + Here is a quick example, that I ran into, to illustrate what I + mean: + + >>> import pickle, copyreg + >>> copyreg.dispatch_table.pop(complex) + >>> pickle.dumps(1+2j) + Traceback (most recent call last): + ... + RuntimeError: maximum recursion depth exceeded + + Removing the complex class from copyreg.dispatch_table made the + __reduce_ex__() method emit another complex object: + + >>> (1+1j).__reduce_ex__(2) + (<function __newobj__ at 0xb7b71c3c>, + (<class 'complex'>, (1+1j)), None, None, None) + + Thus when save() was called on newargstup (the 2nd item) recursion + ensued. Of course, the bug was in the complex class which had a + broken __getnewargs__() that emitted another complex object. But, + the point, here, is it is quite easy to end up with a broken reduce + function. */ + + /* Save the class and its __new__ arguments. */ + if (save(self, cls, 0) < 0) + return -1; + + newargtup = PyTuple_GetSlice(argtup, 1, Py_SIZE(argtup)); + if (newargtup == NULL) + return -1; + + p = save(self, newargtup, 0); + Py_DECREF(newargtup); + if (p < 0) + return -1; + + /* Add NEWOBJ opcode. */ + if (_Pickler_Write(self, &newobj_op, 1) < 0) + return -1; + } + else { /* Not using NEWOBJ. */ + if (save(self, callable, 0) < 0 || + save(self, argtup, 0) < 0 || + _Pickler_Write(self, &reduce_op, 1) < 0) + return -1; + } + + /* obj can be NULL when save_reduce() is used directly. A NULL obj means + the caller do not want to memoize the object. Not particularly useful, + but that is to mimic the behavior save_reduce() in pickle.py when + obj is None. */ + if (obj && memo_put(self, obj) < 0) + return -1; + + if (listitems && batch_list(self, listitems) < 0) + return -1; + + if (dictitems && batch_dict(self, dictitems) < 0) + return -1; + + if (state) { + if (save(self, state, 0) < 0 || + _Pickler_Write(self, &build_op, 1) < 0) + return -1; + } + + return 0; +} + +static int +save(PicklerObject *self, PyObject *obj, int pers_save) +{ + PyTypeObject *type; + PyObject *reduce_func = NULL; + PyObject *reduce_value = NULL; + int status = 0; + + if (Py_EnterRecursiveCall(" while pickling an object")) + return -1; + + /* The extra pers_save argument is necessary to avoid calling save_pers() + on its returned object. */ + if (!pers_save && self->pers_func) { + /* save_pers() returns: + -1 to signal an error; + 0 if it did nothing successfully; + 1 if a persistent id was saved. + */ + if ((status = save_pers(self, obj, self->pers_func)) != 0) + goto done; + } + + type = Py_TYPE(obj); + + /* The old cPickle had an optimization that used switch-case statement + dispatching on the first letter of the type name. This has was removed + since benchmarks shown that this optimization was actually slowing + things down. */ + + /* Atom types; these aren't memoized, so don't check the memo. */ + + if (obj == Py_None) { + status = save_none(self, obj); + goto done; + } + else if (obj == Py_False || obj == Py_True) { + status = save_bool(self, obj); + goto done; + } + else if (type == &PyLong_Type) { + status = save_long(self, obj); + goto done; + } + else if (type == &PyFloat_Type) { + status = save_float(self, obj); + goto done; + } + + /* Check the memo to see if it has the object. If so, generate + a GET (or BINGET) opcode, instead of pickling the object + once again. */ + if (PyMemoTable_Get(self->memo, obj)) { + if (memo_get(self, obj) < 0) + goto error; + goto done; + } + + if (type == &PyBytes_Type) { + status = save_bytes(self, obj); + goto done; + } + else if (type == &PyUnicode_Type) { + status = save_unicode(self, obj); + goto done; + } + else if (type == &PyDict_Type) { + status = save_dict(self, obj); + goto done; + } + else if (type == &PyList_Type) { + status = save_list(self, obj); + goto done; + } + else if (type == &PyTuple_Type) { + status = save_tuple(self, obj); + goto done; + } + else if (type == &PyType_Type) { + status = save_global(self, obj, NULL); + goto done; + } + else if (type == &PyFunction_Type) { + status = save_global(self, obj, NULL); + if (status < 0 && PyErr_ExceptionMatches(PickleError)) { + /* fall back to reduce */ + PyErr_Clear(); + } + else { + goto done; + } + } + else if (type == &PyCFunction_Type) { + status = save_global(self, obj, NULL); + goto done; + } + + /* XXX: This part needs some unit tests. */ + + /* Get a reduction callable, and call it. This may come from + * copyreg.dispatch_table, the object's __reduce_ex__ method, + * or the object's __reduce__ method. + */ + reduce_func = PyDict_GetItem(dispatch_table, (PyObject *)type); + if (reduce_func != NULL) { + /* Here, the reference count of the reduce_func object returned by + PyDict_GetItem needs to be increased to be consistent with the one + returned by PyObject_GetAttr. This is allow us to blindly DECREF + reduce_func at the end of the save() routine. + */ + Py_INCREF(reduce_func); + Py_INCREF(obj); + reduce_value = _Pickler_FastCall(self, reduce_func, obj); + } + else if (PyType_IsSubtype(type, &PyType_Type)) { + status = save_global(self, obj, NULL); + goto done; + } + else { + static PyObject *reduce_str = NULL; + static PyObject *reduce_ex_str = NULL; + + /* Cache the name of the reduce methods. */ + if (reduce_str == NULL) { + reduce_str = PyUnicode_InternFromString("__reduce__"); + if (reduce_str == NULL) + goto error; + reduce_ex_str = PyUnicode_InternFromString("__reduce_ex__"); + if (reduce_ex_str == NULL) + goto error; + } + + /* XXX: If the __reduce__ method is defined, __reduce_ex__ is + automatically defined as __reduce__. While this is convenient, this + make it impossible to know which method was actually called. Of + course, this is not a big deal. But still, it would be nice to let + the user know which method was called when something go + wrong. Incidentally, this means if __reduce_ex__ is not defined, we + don't actually have to check for a __reduce__ method. */ + + /* Check for a __reduce_ex__ method. */ + reduce_func = PyObject_GetAttr(obj, reduce_ex_str); + if (reduce_func != NULL) { + PyObject *proto; + proto = PyLong_FromLong(self->proto); + if (proto != NULL) { + reduce_value = _Pickler_FastCall(self, reduce_func, proto); + } + } + else { + if (PyErr_ExceptionMatches(PyExc_AttributeError)) + PyErr_Clear(); + else + goto error; + /* Check for a __reduce__ method. */ + reduce_func = PyObject_GetAttr(obj, reduce_str); + if (reduce_func != NULL) { + reduce_value = PyObject_Call(reduce_func, empty_tuple, NULL); + } + else { + PyErr_Format(PicklingError, "can't pickle '%.200s' object: %R", + type->tp_name, obj); + goto error; + } + } + } + + if (reduce_value == NULL) + goto error; + + if (PyUnicode_Check(reduce_value)) { + status = save_global(self, obj, reduce_value); + goto done; + } + + if (!PyTuple_Check(reduce_value)) { + PyErr_SetString(PicklingError, + "__reduce__ must return a string or tuple"); + goto error; + } + + status = save_reduce(self, reduce_value, obj); + + if (0) { + error: + status = -1; + } + done: + Py_LeaveRecursiveCall(); + Py_XDECREF(reduce_func); + Py_XDECREF(reduce_value); + + return status; +} + +static int +dump(PicklerObject *self, PyObject *obj) +{ + const char stop_op = STOP; + + if (self->proto >= 2) { + char header[2]; + + header[0] = PROTO; + assert(self->proto >= 0 && self->proto < 256); + header[1] = (unsigned char)self->proto; + if (_Pickler_Write(self, header, 2) < 0) + return -1; + } + + if (save(self, obj, 0) < 0 || + _Pickler_Write(self, &stop_op, 1) < 0) + return -1; + + return 0; +} + +PyDoc_STRVAR(Pickler_clear_memo_doc, +"clear_memo() -> None. Clears the pickler's \"memo\"." +"\n" +"The memo is the data structure that remembers which objects the\n" +"pickler has already seen, so that shared or recursive objects are\n" +"pickled by reference and not by value. This method is useful when\n" +"re-using picklers."); + +static PyObject * +Pickler_clear_memo(PicklerObject *self) +{ + if (self->memo) + PyMemoTable_Clear(self->memo); + + Py_RETURN_NONE; +} + +PyDoc_STRVAR(Pickler_dump_doc, +"dump(obj) -> None. Write a pickled representation of obj to the open file."); + +static PyObject * +Pickler_dump(PicklerObject *self, PyObject *args) +{ + PyObject *obj; + + /* Check whether the Pickler was initialized correctly (issue3664). + Developers often forget to call __init__() in their subclasses, which + would trigger a segfault without this check. */ + if (self->write == NULL) { + PyErr_Format(PicklingError, + "Pickler.__init__() was not called by %s.__init__()", + Py_TYPE(self)->tp_name); + return NULL; + } + + if (!PyArg_ParseTuple(args, "O:dump", &obj)) + return NULL; + + if (_Pickler_ClearBuffer(self) < 0) + return NULL; + + if (dump(self, obj) < 0) + return NULL; + + if (_Pickler_FlushToFile(self) < 0) + return NULL; + + Py_RETURN_NONE; +} + +static struct PyMethodDef Pickler_methods[] = { + {"dump", (PyCFunction)Pickler_dump, METH_VARARGS, + Pickler_dump_doc}, + {"clear_memo", (PyCFunction)Pickler_clear_memo, METH_NOARGS, + Pickler_clear_memo_doc}, + {NULL, NULL} /* sentinel */ +}; + +static void +Pickler_dealloc(PicklerObject *self) +{ + PyObject_GC_UnTrack(self); + + Py_XDECREF(self->output_buffer); + Py_XDECREF(self->write); + Py_XDECREF(self->pers_func); + Py_XDECREF(self->arg); + Py_XDECREF(self->fast_memo); + + PyMemoTable_Del(self->memo); + + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static int +Pickler_traverse(PicklerObject *self, visitproc visit, void *arg) +{ + Py_VISIT(self->write); + Py_VISIT(self->pers_func); + Py_VISIT(self->arg); + Py_VISIT(self->fast_memo); + return 0; +} + +static int +Pickler_clear(PicklerObject *self) +{ + Py_CLEAR(self->output_buffer); + Py_CLEAR(self->write); + Py_CLEAR(self->pers_func); + Py_CLEAR(self->arg); + Py_CLEAR(self->fast_memo); + + if (self->memo != NULL) { + PyMemoTable *memo = self->memo; + self->memo = NULL; + PyMemoTable_Del(memo); + } + return 0; +} + + +PyDoc_STRVAR(Pickler_doc, +"Pickler(file, protocol=None)" +"\n" +"This takes a binary file for writing a pickle data stream.\n" +"\n" +"The optional protocol argument tells the pickler to use the\n" +"given protocol; supported protocols are 0, 1, 2, 3. The default\n" +"protocol is 3; a backward-incompatible protocol designed for\n" +"Python 3.0.\n" +"\n" +"Specifying a negative protocol version selects the highest\n" +"protocol version supported. The higher the protocol used, the\n" +"more recent the version of Python needed to read the pickle\n" +"produced.\n" +"\n" +"The file argument must have a write() method that accepts a single\n" +"bytes argument. It can thus be a file object opened for binary\n" +"writing, a io.BytesIO instance, or any other custom object that\n" +"meets this interface.\n" +"\n" +"If fix_imports is True and protocol is less than 3, pickle will try to\n" +"map the new Python 3.x names to the old module names used in Python\n" +"2.x, so that the pickle data stream is readable with Python 2.x.\n"); + +static int +Pickler_init(PicklerObject *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"file", "protocol", "fix_imports", 0}; + PyObject *file; + PyObject *proto_obj = NULL; + PyObject *fix_imports = Py_True; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OO:Pickler", + kwlist, &file, &proto_obj, &fix_imports)) + return -1; + + /* In case of multiple __init__() calls, clear previous content. */ + if (self->write != NULL) + (void)Pickler_clear(self); + + if (_Pickler_SetProtocol(self, proto_obj, fix_imports) < 0) + return -1; + + if (_Pickler_SetOutputStream(self, file) < 0) + return -1; + + /* memo and output_buffer may have already been created in _Pickler_New */ + if (self->memo == NULL) { + self->memo = PyMemoTable_New(); + if (self->memo == NULL) + return -1; + } + self->output_len = 0; + if (self->output_buffer == NULL) { + self->max_output_len = WRITE_BUF_SIZE; + self->output_buffer = PyBytes_FromStringAndSize(NULL, + self->max_output_len); + if (self->output_buffer == NULL) + return -1; + } + + self->arg = NULL; + self->fast = 0; + self->fast_nesting = 0; + self->fast_memo = NULL; + self->pers_func = NULL; + if (PyObject_HasAttrString((PyObject *)self, "persistent_id")) { + self->pers_func = PyObject_GetAttrString((PyObject *)self, + "persistent_id"); + if (self->pers_func == NULL) + return -1; + } + return 0; +} + +/* Define a proxy object for the Pickler's internal memo object. This is to + * avoid breaking code like: + * pickler.memo.clear() + * and + * pickler.memo = saved_memo + * Is this a good idea? Not really, but we don't want to break code that uses + * it. Note that we don't implement the entire mapping API here. This is + * intentional, as these should be treated as black-box implementation details. + */ + +typedef struct { + PyObject_HEAD + PicklerObject *pickler; /* Pickler whose memo table we're proxying. */ +} PicklerMemoProxyObject; + +PyDoc_STRVAR(pmp_clear_doc, +"memo.clear() -> None. Remove all items from memo."); + +static PyObject * +pmp_clear(PicklerMemoProxyObject *self) +{ + if (self->pickler->memo) + PyMemoTable_Clear(self->pickler->memo); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(pmp_copy_doc, +"memo.copy() -> new_memo. Copy the memo to a new object."); + +static PyObject * +pmp_copy(PicklerMemoProxyObject *self) +{ + Py_ssize_t i; + PyMemoTable *memo; + PyObject *new_memo = PyDict_New(); + if (new_memo == NULL) + return NULL; + + memo = self->pickler->memo; + for (i = 0; i < memo->mt_allocated; ++i) { + PyMemoEntry entry = memo->mt_table[i]; + if (entry.me_key != NULL) { + int status; + PyObject *key, *value; + + key = PyLong_FromVoidPtr(entry.me_key); + value = Py_BuildValue("nO", entry.me_value, entry.me_key); + + if (key == NULL || value == NULL) { + Py_XDECREF(key); + Py_XDECREF(value); + goto error; + } + status = PyDict_SetItem(new_memo, key, value); + Py_DECREF(key); + Py_DECREF(value); + if (status < 0) + goto error; + } + } + return new_memo; + + error: + Py_XDECREF(new_memo); + return NULL; +} + +PyDoc_STRVAR(pmp_reduce_doc, +"memo.__reduce__(). Pickling support."); + +static PyObject * +pmp_reduce(PicklerMemoProxyObject *self, PyObject *args) +{ + PyObject *reduce_value, *dict_args; + PyObject *contents = pmp_copy(self); + if (contents == NULL) + return NULL; + + reduce_value = PyTuple_New(2); + if (reduce_value == NULL) { + Py_DECREF(contents); + return NULL; + } + dict_args = PyTuple_New(1); + if (dict_args == NULL) { + Py_DECREF(contents); + Py_DECREF(reduce_value); + return NULL; + } + PyTuple_SET_ITEM(dict_args, 0, contents); + Py_INCREF((PyObject *)&PyDict_Type); + PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type); + PyTuple_SET_ITEM(reduce_value, 1, dict_args); + return reduce_value; +} + +static PyMethodDef picklerproxy_methods[] = { + {"clear", (PyCFunction)pmp_clear, METH_NOARGS, pmp_clear_doc}, + {"copy", (PyCFunction)pmp_copy, METH_NOARGS, pmp_copy_doc}, + {"__reduce__", (PyCFunction)pmp_reduce, METH_VARARGS, pmp_reduce_doc}, + {NULL, NULL} /* sentinel */ +}; + +static void +PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self) +{ + PyObject_GC_UnTrack(self); + Py_XDECREF(self->pickler); + PyObject_GC_Del((PyObject *)self); +} + +static int +PicklerMemoProxy_traverse(PicklerMemoProxyObject *self, + visitproc visit, void *arg) +{ + Py_VISIT(self->pickler); + return 0; +} + +static int +PicklerMemoProxy_clear(PicklerMemoProxyObject *self) +{ + Py_CLEAR(self->pickler); + return 0; +} + +static PyTypeObject PicklerMemoProxyType = { + PyVarObject_HEAD_INIT(NULL, 0) + "_pickle.PicklerMemoProxy", /*tp_name*/ + sizeof(PicklerMemoProxyObject), /*tp_basicsize*/ + 0, + (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + PyObject_HashNotImplemented, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + PyObject_GenericSetAttr, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + 0, /* tp_doc */ + (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */ + (inquiry)PicklerMemoProxy_clear, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + picklerproxy_methods, /* tp_methods */ +}; + +static PyObject * +PicklerMemoProxy_New(PicklerObject *pickler) +{ + PicklerMemoProxyObject *self; + + self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType); + if (self == NULL) + return NULL; + Py_INCREF(pickler); + self->pickler = pickler; + PyObject_GC_Track(self); + return (PyObject *)self; +} + +/*****************************************************************************/ + +static PyObject * +Pickler_get_memo(PicklerObject *self) +{ + return PicklerMemoProxy_New(self); +} + +static int +Pickler_set_memo(PicklerObject *self, PyObject *obj) +{ + PyMemoTable *new_memo = NULL; + + if (obj == NULL) { + PyErr_SetString(PyExc_TypeError, + "attribute deletion is not supported"); + return -1; + } + + if (Py_TYPE(obj) == &PicklerMemoProxyType) { + PicklerObject *pickler = + ((PicklerMemoProxyObject *)obj)->pickler; + + new_memo = PyMemoTable_Copy(pickler->memo); + if (new_memo == NULL) + return -1; + } + else if (PyDict_Check(obj)) { + Py_ssize_t i = 0; + PyObject *key, *value; + + new_memo = PyMemoTable_New(); + if (new_memo == NULL) + return -1; + + while (PyDict_Next(obj, &i, &key, &value)) { + Py_ssize_t memo_id; + PyObject *memo_obj; + + if (!PyTuple_Check(value) || Py_SIZE(value) != 2) { + PyErr_SetString(PyExc_TypeError, + "'memo' values must be 2-item tuples"); + goto error; + } + memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0)); + if (memo_id == -1 && PyErr_Occurred()) + goto error; + memo_obj = PyTuple_GET_ITEM(value, 1); + if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0) + goto error; + } + } + else { + PyErr_Format(PyExc_TypeError, + "'memo' attribute must be an PicklerMemoProxy object" + "or dict, not %.200s", Py_TYPE(obj)->tp_name); + return -1; + } + + PyMemoTable_Del(self->memo); + self->memo = new_memo; + + return 0; + + error: + if (new_memo) + PyMemoTable_Del(new_memo); + return -1; +} + +static PyObject * +Pickler_get_persid(PicklerObject *self) +{ + if (self->pers_func == NULL) + PyErr_SetString(PyExc_AttributeError, "persistent_id"); + else + Py_INCREF(self->pers_func); + return self->pers_func; +} + +static int +Pickler_set_persid(PicklerObject *self, PyObject *value) +{ + PyObject *tmp; + + if (value == NULL) { + PyErr_SetString(PyExc_TypeError, + "attribute deletion is not supported"); + return -1; + } + if (!PyCallable_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "persistent_id must be a callable taking one argument"); + return -1; + } + + tmp = self->pers_func; + Py_INCREF(value); + self->pers_func = value; + Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */ + + return 0; +} + +static PyMemberDef Pickler_members[] = { + {"bin", T_INT, offsetof(PicklerObject, bin)}, + {"fast", T_INT, offsetof(PicklerObject, fast)}, + {NULL} +}; + +static PyGetSetDef Pickler_getsets[] = { + {"memo", (getter)Pickler_get_memo, + (setter)Pickler_set_memo}, + {"persistent_id", (getter)Pickler_get_persid, + (setter)Pickler_set_persid}, + {NULL} +}; + +static PyTypeObject Pickler_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_pickle.Pickler" , /*tp_name*/ + sizeof(PicklerObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)Pickler_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 | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + Pickler_doc, /*tp_doc*/ + (traverseproc)Pickler_traverse, /*tp_traverse*/ + (inquiry)Pickler_clear, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + Pickler_methods, /*tp_methods*/ + Pickler_members, /*tp_members*/ + Pickler_getsets, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + (initproc)Pickler_init, /*tp_init*/ + PyType_GenericAlloc, /*tp_alloc*/ + PyType_GenericNew, /*tp_new*/ + PyObject_GC_Del, /*tp_free*/ + 0, /*tp_is_gc*/ +}; + +/* Temporary helper for calling self.find_class(). + + XXX: It would be nice to able to avoid Python function call overhead, by + using directly the C version of find_class(), when find_class() is not + overridden by a subclass. Although, this could become rather hackish. A + simpler optimization would be to call the C function when self is not a + subclass instance. */ +static PyObject * +find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name) +{ + return PyObject_CallMethod((PyObject *)self, "find_class", "OO", + module_name, global_name); +} + +static Py_ssize_t +marker(UnpicklerObject *self) +{ + if (self->num_marks < 1) { + PyErr_SetString(UnpicklingError, "could not find MARK"); + return -1; + } + + return self->marks[--self->num_marks]; +} + +static int +load_none(UnpicklerObject *self) +{ + PDATA_APPEND(self->stack, Py_None, -1); + return 0; +} + +static int +bad_readline(void) +{ + PyErr_SetString(UnpicklingError, "pickle data was truncated"); + return -1; +} + +static int +load_int(UnpicklerObject *self) +{ + PyObject *value; + char *endptr, *s; + Py_ssize_t len; + long x; + + if ((len = _Unpickler_Readline(self, &s)) < 0) + return -1; + if (len < 2) + return bad_readline(); + + errno = 0; + /* XXX: Should the base argument of strtol() be explicitly set to 10? + XXX(avassalotti): Should this uses PyOS_strtol()? */ + x = strtol(s, &endptr, 0); + + if (errno || (*endptr != '\n' && *endptr != '\0')) { + /* Hm, maybe we've got something long. Let's try reading + * it as a Python long object. */ + errno = 0; + /* XXX: Same thing about the base here. */ + value = PyLong_FromString(s, NULL, 0); + if (value == NULL) { + PyErr_SetString(PyExc_ValueError, + "could not convert string to int"); + return -1; + } + } + else { + if (len == 3 && (x == 0 || x == 1)) { + if ((value = PyBool_FromLong(x)) == NULL) + return -1; + } + else { + if ((value = PyLong_FromLong(x)) == NULL) + return -1; + } + } + + PDATA_PUSH(self->stack, value, -1); + return 0; +} + +static int +load_bool(UnpicklerObject *self, PyObject *boolean) +{ + assert(boolean == Py_True || boolean == Py_False); + PDATA_APPEND(self->stack, boolean, -1); + return 0; +} + +/* s contains x bytes of an unsigned little-endian integer. Return its value + * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX. + */ +static Py_ssize_t +calc_binsize(char *bytes, int size) +{ + unsigned char *s = (unsigned char *)bytes; + size_t x = 0; + + assert(size == 4); + + x = (size_t) s[0]; + x |= (size_t) s[1] << 8; + x |= (size_t) s[2] << 16; + x |= (size_t) s[3] << 24; + + if (x > PY_SSIZE_T_MAX) + return -1; + else + return (Py_ssize_t) x; +} + +/* s contains x bytes of a little-endian integer. Return its value as a + * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian + * int, but when x is 4 it's a signed one. This is an historical source + * of x-platform bugs. + */ +static long +calc_binint(char *bytes, int size) +{ + unsigned char *s = (unsigned char *)bytes; + int i = size; + long x = 0; + + for (i = 0; i < size; i++) { + x |= (long)s[i] << (i * 8); + } + + /* Unlike BININT1 and BININT2, BININT (more accurately BININT4) + * is signed, so on a box with longs bigger than 4 bytes we need + * to extend a BININT's sign bit to the full width. + */ + if (SIZEOF_LONG > 4 && size == 4) { + x |= -(x & (1L << 31)); + } + + return x; +} + +static int +load_binintx(UnpicklerObject *self, char *s, int size) +{ + PyObject *value; + long x; + + x = calc_binint(s, size); + + if ((value = PyLong_FromLong(x)) == NULL) + return -1; + + PDATA_PUSH(self->stack, value, -1); + return 0; +} + +static int +load_binint(UnpicklerObject *self) +{ + char *s; + + if (_Unpickler_Read(self, &s, 4) < 0) + return -1; + + return load_binintx(self, s, 4); +} + +static int +load_binint1(UnpicklerObject *self) +{ + char *s; + + if (_Unpickler_Read(self, &s, 1) < 0) + return -1; + + return load_binintx(self, s, 1); +} + +static int +load_binint2(UnpicklerObject *self) +{ + char *s; + + if (_Unpickler_Read(self, &s, 2) < 0) + return -1; + + return load_binintx(self, s, 2); +} + +static int +load_long(UnpicklerObject *self) +{ + PyObject *value; + char *s; + Py_ssize_t len; + + if ((len = _Unpickler_Readline(self, &s)) < 0) + return -1; + if (len < 2) + return bad_readline(); + + /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove + the 'L' before calling PyLong_FromString. In order to maintain + compatibility with Python 3.0.0, we don't actually *require* + the 'L' to be present. */ + if (s[len-2] == 'L') + s[len-2] = '\0'; + /* XXX: Should the base argument explicitly set to 10? */ + value = PyLong_FromString(s, NULL, 0); + if (value == NULL) + return -1; + + PDATA_PUSH(self->stack, value, -1); + return 0; +} + +/* 'size' bytes contain the # of bytes of little-endian 256's-complement + * data following. + */ +static int +load_counted_long(UnpicklerObject *self, int size) +{ + PyObject *value; + char *nbytes; + char *pdata; + + assert(size == 1 || size == 4); + if (_Unpickler_Read(self, &nbytes, size) < 0) + return -1; + + size = calc_binint(nbytes, size); + if (size < 0) { + /* Corrupt or hostile pickle -- we never write one like this */ + PyErr_SetString(UnpicklingError, + "LONG pickle has negative byte count"); + return -1; + } + + if (size == 0) + value = PyLong_FromLong(0L); + else { + /* Read the raw little-endian bytes and convert. */ + if (_Unpickler_Read(self, &pdata, size) < 0) + return -1; + value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size, + 1 /* little endian */ , 1 /* signed */ ); + } + if (value == NULL) + return -1; + PDATA_PUSH(self->stack, value, -1); + return 0; +} + +static int +load_float(UnpicklerObject *self) +{ + PyObject *value; + char *endptr, *s; + Py_ssize_t len; + double d; + + if ((len = _Unpickler_Readline(self, &s)) < 0) + return -1; + if (len < 2) + return bad_readline(); + + errno = 0; + d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError); + if (d == -1.0 && PyErr_Occurred()) + return -1; + if ((endptr[0] != '\n') && (endptr[0] != '\0')) { + PyErr_SetString(PyExc_ValueError, "could not convert string to float"); + return -1; + } + value = PyFloat_FromDouble(d); + if (value == NULL) + return -1; + + PDATA_PUSH(self->stack, value, -1); + return 0; +} + +static int +load_binfloat(UnpicklerObject *self) +{ + PyObject *value; + double x; + char *s; + + if (_Unpickler_Read(self, &s, 8) < 0) + return -1; + + x = _PyFloat_Unpack8((unsigned char *)s, 0); + if (x == -1.0 && PyErr_Occurred()) + return -1; + + if ((value = PyFloat_FromDouble(x)) == NULL) + return -1; + + PDATA_PUSH(self->stack, value, -1); + return 0; +} + +static int +load_string(UnpicklerObject *self) +{ + PyObject *bytes; + PyObject *str = NULL; + Py_ssize_t len; + char *s, *p; + + if ((len = _Unpickler_Readline(self, &s)) < 0) + return -1; + if (len < 3) + return bad_readline(); + if ((s = strdup(s)) == NULL) { + PyErr_NoMemory(); + return -1; + } + + /* Strip outermost quotes */ + while (s[len - 1] <= ' ') + len--; + if (s[0] == '"' && s[len - 1] == '"') { + s[len - 1] = '\0'; + p = s + 1; + len -= 2; + } + else if (s[0] == '\'' && s[len - 1] == '\'') { + s[len - 1] = '\0'; + p = s + 1; + len -= 2; + } + else { + free(s); + PyErr_SetString(PyExc_ValueError, "insecure string pickle"); + return -1; + } + + /* 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); + Py_DECREF(bytes); + if (str == NULL) + return -1; + + PDATA_PUSH(self->stack, str, -1); + return 0; +} + +static int +load_binbytes(UnpicklerObject *self) +{ + PyObject *bytes; + Py_ssize_t x; + char *s; + + if (_Unpickler_Read(self, &s, 4) < 0) + return -1; + + x = calc_binsize(s, 4); + if (x < 0) { + PyErr_Format(PyExc_OverflowError, + "BINBYTES exceeds system's maximum size of %zd bytes", + PY_SSIZE_T_MAX + ); + return -1; + } + + if (_Unpickler_Read(self, &s, x) < 0) + return -1; + bytes = PyBytes_FromStringAndSize(s, x); + if (bytes == NULL) + return -1; + + PDATA_PUSH(self->stack, bytes, -1); + return 0; +} + +static int +load_short_binbytes(UnpicklerObject *self) +{ + PyObject *bytes; + Py_ssize_t x; + char *s; + + if (_Unpickler_Read(self, &s, 1) < 0) + return -1; + + x = (unsigned char)s[0]; + + if (_Unpickler_Read(self, &s, x) < 0) + return -1; + + bytes = PyBytes_FromStringAndSize(s, x); + if (bytes == NULL) + return -1; + + PDATA_PUSH(self->stack, bytes, -1); + return 0; +} + +static int +load_binstring(UnpicklerObject *self) +{ + PyObject *str; + Py_ssize_t x; + char *s; + + if (_Unpickler_Read(self, &s, 4) < 0) + return -1; + + x = calc_binint(s, 4); + if (x < 0) { + PyErr_SetString(UnpicklingError, + "BINSTRING pickle has negative byte count"); + return -1; + } + + if (_Unpickler_Read(self, &s, x) < 0) + return -1; + + /* Convert Python 2.x strings to unicode. */ + str = PyUnicode_Decode(s, x, self->encoding, self->errors); + if (str == NULL) + return -1; + + PDATA_PUSH(self->stack, str, -1); + return 0; +} + +static int +load_short_binstring(UnpicklerObject *self) +{ + PyObject *str; + Py_ssize_t x; + char *s; + + if (_Unpickler_Read(self, &s, 1) < 0) + return -1; + + x = (unsigned char)s[0]; + + if (_Unpickler_Read(self, &s, x) < 0) + return -1; + + /* Convert Python 2.x strings to unicode. */ + str = PyUnicode_Decode(s, x, self->encoding, self->errors); + if (str == NULL) + return -1; + + PDATA_PUSH(self->stack, str, -1); + return 0; +} + +static int +load_unicode(UnpicklerObject *self) +{ + PyObject *str; + Py_ssize_t len; + char *s; + + if ((len = _Unpickler_Readline(self, &s)) < 0) + return -1; + if (len < 1) + return bad_readline(); + + str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL); + if (str == NULL) + return -1; + + PDATA_PUSH(self->stack, str, -1); + return 0; +} + +static int +load_binunicode(UnpicklerObject *self) +{ + PyObject *str; + Py_ssize_t size; + char *s; + + if (_Unpickler_Read(self, &s, 4) < 0) + return -1; + + size = calc_binsize(s, 4); + if (size < 0) { + PyErr_Format(PyExc_OverflowError, + "BINUNICODE exceeds system's maximum size of %zd bytes", + PY_SSIZE_T_MAX + ); + return -1; + } + + + if (_Unpickler_Read(self, &s, size) < 0) + return -1; + + str = PyUnicode_DecodeUTF8(s, size, "surrogatepass"); + if (str == NULL) + return -1; + + PDATA_PUSH(self->stack, str, -1); + return 0; +} + +static int +load_tuple(UnpicklerObject *self) +{ + PyObject *tuple; + Py_ssize_t i; + + if ((i = marker(self)) < 0) + return -1; + + tuple = Pdata_poptuple(self->stack, i); + if (tuple == NULL) + return -1; + PDATA_PUSH(self->stack, tuple, -1); + return 0; +} + +static int +load_counted_tuple(UnpicklerObject *self, int len) +{ + PyObject *tuple; + + tuple = PyTuple_New(len); + if (tuple == NULL) + return -1; + + while (--len >= 0) { + PyObject *item; + + PDATA_POP(self->stack, item); + if (item == NULL) + return -1; + PyTuple_SET_ITEM(tuple, len, item); + } + PDATA_PUSH(self->stack, tuple, -1); + return 0; +} + +static int +load_empty_list(UnpicklerObject *self) +{ + PyObject *list; + + if ((list = PyList_New(0)) == NULL) + return -1; + PDATA_PUSH(self->stack, list, -1); + return 0; +} + +static int +load_empty_dict(UnpicklerObject *self) +{ + PyObject *dict; + + if ((dict = PyDict_New()) == NULL) + return -1; + PDATA_PUSH(self->stack, dict, -1); + return 0; +} + +static int +load_list(UnpicklerObject *self) +{ + PyObject *list; + Py_ssize_t i; + + if ((i = marker(self)) < 0) + return -1; + + list = Pdata_poplist(self->stack, i); + if (list == NULL) + return -1; + PDATA_PUSH(self->stack, list, -1); + return 0; +} + +static int +load_dict(UnpicklerObject *self) +{ + PyObject *dict, *key, *value; + Py_ssize_t i, j, k; + + if ((i = marker(self)) < 0) + return -1; + j = Py_SIZE(self->stack); + + if ((dict = PyDict_New()) == NULL) + return -1; + + for (k = i + 1; k < j; k += 2) { + key = self->stack->data[k - 1]; + value = self->stack->data[k]; + if (PyDict_SetItem(dict, key, value) < 0) { + Py_DECREF(dict); + return -1; + } + } + Pdata_clear(self->stack, i); + PDATA_PUSH(self->stack, dict, -1); + return 0; +} + +static PyObject * +instantiate(PyObject *cls, PyObject *args) +{ + PyObject *result = NULL; + /* Caller must assure args are a tuple. Normally, args come from + Pdata_poptuple which packs objects from the top of the stack + into a newly created tuple. */ + assert(PyTuple_Check(args)); + if (Py_SIZE(args) > 0 || !PyType_Check(cls) || + PyObject_HasAttrString(cls, "__getinitargs__")) { + result = PyObject_CallObject(cls, args); + } + else { + result = PyObject_CallMethod(cls, "__new__", "O", cls); + } + return result; +} + +static int +load_obj(UnpicklerObject *self) +{ + PyObject *cls, *args, *obj = NULL; + Py_ssize_t i; + + if ((i = marker(self)) < 0) + return -1; + + args = Pdata_poptuple(self->stack, i + 1); + if (args == NULL) + return -1; + + PDATA_POP(self->stack, cls); + if (cls) { + obj = instantiate(cls, args); + Py_DECREF(cls); + } + Py_DECREF(args); + if (obj == NULL) + return -1; + + PDATA_PUSH(self->stack, obj, -1); + return 0; +} + +static int +load_inst(UnpicklerObject *self) +{ + PyObject *cls = NULL; + PyObject *args = NULL; + PyObject *obj = NULL; + PyObject *module_name; + PyObject *class_name; + Py_ssize_t len; + Py_ssize_t i; + char *s; + + if ((i = marker(self)) < 0) + return -1; + if ((len = _Unpickler_Readline(self, &s)) < 0) + return -1; + if (len < 2) + return bad_readline(); + + /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII + identifiers are permitted in Python 3.0, since the INST opcode is only + supported by older protocols on Python 2.x. */ + module_name = PyUnicode_DecodeASCII(s, len - 1, "strict"); + if (module_name == NULL) + return -1; + + if ((len = _Unpickler_Readline(self, &s)) >= 0) { + if (len < 2) + return bad_readline(); + class_name = PyUnicode_DecodeASCII(s, len - 1, "strict"); + if (class_name != NULL) { + cls = find_class(self, module_name, class_name); + Py_DECREF(class_name); + } + } + Py_DECREF(module_name); + + if (cls == NULL) + return -1; + + if ((args = Pdata_poptuple(self->stack, i)) != NULL) { + obj = instantiate(cls, args); + Py_DECREF(args); + } + Py_DECREF(cls); + + if (obj == NULL) + return -1; + + PDATA_PUSH(self->stack, obj, -1); + return 0; +} + +static int +load_newobj(UnpicklerObject *self) +{ + PyObject *args = NULL; + PyObject *clsraw = NULL; + PyTypeObject *cls; /* clsraw cast to its true type */ + PyObject *obj; + + /* Stack is ... cls argtuple, and we want to call + * cls.__new__(cls, *argtuple). + */ + PDATA_POP(self->stack, args); + if (args == NULL) + goto error; + if (!PyTuple_Check(args)) { + PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg " "tuple."); + goto error; + } + + PDATA_POP(self->stack, clsraw); + cls = (PyTypeObject *)clsraw; + if (cls == NULL) + goto error; + if (!PyType_Check(cls)) { + PyErr_SetString(UnpicklingError, "NEWOBJ class argument " + "isn't a type object"); + goto error; + } + if (cls->tp_new == NULL) { + PyErr_SetString(UnpicklingError, "NEWOBJ class argument " + "has NULL tp_new"); + goto error; + } + + /* Call __new__. */ + obj = cls->tp_new(cls, args, NULL); + if (obj == NULL) + goto error; + + Py_DECREF(args); + Py_DECREF(clsraw); + PDATA_PUSH(self->stack, obj, -1); + return 0; + + error: + Py_XDECREF(args); + Py_XDECREF(clsraw); + return -1; +} + +static int +load_global(UnpicklerObject *self) +{ + PyObject *global = NULL; + PyObject *module_name; + PyObject *global_name; + Py_ssize_t len; + char *s; + + if ((len = _Unpickler_Readline(self, &s)) < 0) + return -1; + if (len < 2) + return bad_readline(); + module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict"); + if (!module_name) + return -1; + + if ((len = _Unpickler_Readline(self, &s)) >= 0) { + if (len < 2) { + Py_DECREF(module_name); + return bad_readline(); + } + global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict"); + if (global_name) { + global = find_class(self, module_name, global_name); + Py_DECREF(global_name); + } + } + Py_DECREF(module_name); + + if (global == NULL) + return -1; + PDATA_PUSH(self->stack, global, -1); + return 0; +} + +static int +load_persid(UnpicklerObject *self) +{ + PyObject *pid; + Py_ssize_t len; + char *s; + + if (self->pers_func) { + if ((len = _Unpickler_Readline(self, &s)) < 0) + return -1; + if (len < 2) + return bad_readline(); + + pid = PyBytes_FromStringAndSize(s, len - 1); + if (pid == NULL) + return -1; + + /* Ugh... this does not leak since _Unpickler_FastCall() steals the + reference to pid first. */ + pid = _Unpickler_FastCall(self, self->pers_func, pid); + if (pid == NULL) + return -1; + + PDATA_PUSH(self->stack, pid, -1); + return 0; + } + else { + PyErr_SetString(UnpicklingError, + "A load persistent id instruction was encountered,\n" + "but no persistent_load function was specified."); + return -1; + } +} + +static int +load_binpersid(UnpicklerObject *self) +{ + PyObject *pid; + + if (self->pers_func) { + PDATA_POP(self->stack, pid); + if (pid == NULL) + return -1; + + /* Ugh... this does not leak since _Unpickler_FastCall() steals the + reference to pid first. */ + pid = _Unpickler_FastCall(self, self->pers_func, pid); + if (pid == NULL) + return -1; + + PDATA_PUSH(self->stack, pid, -1); + return 0; + } + else { + PyErr_SetString(UnpicklingError, + "A load persistent id instruction was encountered,\n" + "but no persistent_load function was specified."); + return -1; + } +} + +static int +load_pop(UnpicklerObject *self) +{ + Py_ssize_t len = Py_SIZE(self->stack); + + /* Note that we split the (pickle.py) stack into two stacks, + * an object stack and a mark stack. We have to be clever and + * pop the right one. We do this by looking at the top of the + * mark stack first, and only signalling a stack underflow if + * the object stack is empty and the mark stack doesn't match + * our expectations. + */ + if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) { + self->num_marks--; + } else if (len > 0) { + len--; + Py_DECREF(self->stack->data[len]); + Py_SIZE(self->stack) = len; + } else { + return stack_underflow(); + } + return 0; +} + +static int +load_pop_mark(UnpicklerObject *self) +{ + Py_ssize_t i; + + if ((i = marker(self)) < 0) + return -1; + + Pdata_clear(self->stack, i); + + return 0; +} + +static int +load_dup(UnpicklerObject *self) +{ + PyObject *last; + Py_ssize_t len; + + if ((len = Py_SIZE(self->stack)) <= 0) + return stack_underflow(); + last = self->stack->data[len - 1]; + PDATA_APPEND(self->stack, last, -1); + return 0; +} + +static int +load_get(UnpicklerObject *self) +{ + PyObject *key, *value; + Py_ssize_t idx; + Py_ssize_t len; + char *s; + + if ((len = _Unpickler_Readline(self, &s)) < 0) + return -1; + if (len < 2) + return bad_readline(); + + key = PyLong_FromString(s, NULL, 10); + if (key == NULL) + return -1; + idx = PyLong_AsSsize_t(key); + if (idx == -1 && PyErr_Occurred()) { + Py_DECREF(key); + return -1; + } + + value = _Unpickler_MemoGet(self, idx); + if (value == NULL) { + if (!PyErr_Occurred()) + PyErr_SetObject(PyExc_KeyError, key); + Py_DECREF(key); + return -1; + } + Py_DECREF(key); + + PDATA_APPEND(self->stack, value, -1); + return 0; +} + +static int +load_binget(UnpicklerObject *self) +{ + PyObject *value; + Py_ssize_t idx; + char *s; + + if (_Unpickler_Read(self, &s, 1) < 0) + return -1; + + idx = Py_CHARMASK(s[0]); + + value = _Unpickler_MemoGet(self, idx); + if (value == NULL) { + PyObject *key = PyLong_FromSsize_t(idx); + if (!PyErr_Occurred()) + PyErr_SetObject(PyExc_KeyError, key); + Py_DECREF(key); + return -1; + } + + PDATA_APPEND(self->stack, value, -1); + return 0; +} + +static int +load_long_binget(UnpicklerObject *self) +{ + PyObject *value; + Py_ssize_t idx; + char *s; + + if (_Unpickler_Read(self, &s, 4) < 0) + return -1; + + idx = calc_binsize(s, 4); + + value = _Unpickler_MemoGet(self, idx); + if (value == NULL) { + PyObject *key = PyLong_FromSsize_t(idx); + if (!PyErr_Occurred()) + PyErr_SetObject(PyExc_KeyError, key); + Py_DECREF(key); + return -1; + } + + PDATA_APPEND(self->stack, value, -1); + return 0; +} + +/* Push an object from the extension registry (EXT[124]). nbytes is + * the number of bytes following the opcode, holding the index (code) value. + */ +static int +load_extension(UnpicklerObject *self, int nbytes) +{ + char *codebytes; /* the nbytes bytes after the opcode */ + long code; /* calc_binint returns long */ + PyObject *py_code; /* code as a Python int */ + PyObject *obj; /* the object to push */ + PyObject *pair; /* (module_name, class_name) */ + PyObject *module_name, *class_name; + + assert(nbytes == 1 || nbytes == 2 || nbytes == 4); + if (_Unpickler_Read(self, &codebytes, nbytes) < 0) + return -1; + code = calc_binint(codebytes, nbytes); + if (code <= 0) { /* note that 0 is forbidden */ + /* Corrupt or hostile pickle. */ + PyErr_SetString(UnpicklingError, "EXT specifies code <= 0"); + return -1; + } + + /* Look for the code in the cache. */ + py_code = PyLong_FromLong(code); + if (py_code == NULL) + return -1; + obj = PyDict_GetItem(extension_cache, py_code); + if (obj != NULL) { + /* Bingo. */ + Py_DECREF(py_code); + PDATA_APPEND(self->stack, obj, -1); + return 0; + } + + /* Look up the (module_name, class_name) pair. */ + pair = PyDict_GetItem(inverted_registry, py_code); + if (pair == NULL) { + Py_DECREF(py_code); + PyErr_Format(PyExc_ValueError, "unregistered extension " + "code %ld", code); + return -1; + } + /* Since the extension registry is manipulable via Python code, + * confirm that pair is really a 2-tuple of strings. + */ + if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 || + !PyUnicode_Check(module_name = PyTuple_GET_ITEM(pair, 0)) || + !PyUnicode_Check(class_name = PyTuple_GET_ITEM(pair, 1))) { + Py_DECREF(py_code); + PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] " + "isn't a 2-tuple of strings", code); + return -1; + } + /* Load the object. */ + obj = find_class(self, module_name, class_name); + if (obj == NULL) { + Py_DECREF(py_code); + return -1; + } + /* Cache code -> obj. */ + code = PyDict_SetItem(extension_cache, py_code, obj); + Py_DECREF(py_code); + if (code < 0) { + Py_DECREF(obj); + return -1; + } + PDATA_PUSH(self->stack, obj, -1); + return 0; +} + +static int +load_put(UnpicklerObject *self) +{ + PyObject *key, *value; + Py_ssize_t idx; + Py_ssize_t len; + char *s; + + if ((len = _Unpickler_Readline(self, &s)) < 0) + return -1; + if (len < 2) + return bad_readline(); + if (Py_SIZE(self->stack) <= 0) + return stack_underflow(); + value = self->stack->data[Py_SIZE(self->stack) - 1]; + + key = PyLong_FromString(s, NULL, 10); + if (key == NULL) + return -1; + idx = PyLong_AsSsize_t(key); + Py_DECREF(key); + if (idx < 0) { + if (!PyErr_Occurred()) + PyErr_SetString(PyExc_ValueError, + "negative PUT argument"); + return -1; + } + + return _Unpickler_MemoPut(self, idx, value); +} + +static int +load_binput(UnpicklerObject *self) +{ + PyObject *value; + Py_ssize_t idx; + char *s; + + if (_Unpickler_Read(self, &s, 1) < 0) + return -1; + + if (Py_SIZE(self->stack) <= 0) + return stack_underflow(); + value = self->stack->data[Py_SIZE(self->stack) - 1]; + + idx = Py_CHARMASK(s[0]); + + return _Unpickler_MemoPut(self, idx, value); +} + +static int +load_long_binput(UnpicklerObject *self) +{ + PyObject *value; + Py_ssize_t idx; + char *s; + + if (_Unpickler_Read(self, &s, 4) < 0) + return -1; + + if (Py_SIZE(self->stack) <= 0) + return stack_underflow(); + value = self->stack->data[Py_SIZE(self->stack) - 1]; + + idx = calc_binsize(s, 4); + if (idx < 0) { + PyErr_SetString(PyExc_ValueError, + "negative LONG_BINPUT argument"); + return -1; + } + + return _Unpickler_MemoPut(self, idx, value); +} + +static int +do_append(UnpicklerObject *self, Py_ssize_t x) +{ + PyObject *value; + PyObject *list; + Py_ssize_t len, i; + + len = Py_SIZE(self->stack); + if (x > len || x <= 0) + return stack_underflow(); + if (len == x) /* nothing to do */ + return 0; + + list = self->stack->data[x - 1]; + + if (PyList_Check(list)) { + PyObject *slice; + Py_ssize_t list_len; + int ret; + + slice = Pdata_poplist(self->stack, x); + if (!slice) + return -1; + list_len = PyList_GET_SIZE(list); + ret = PyList_SetSlice(list, list_len, list_len, slice); + Py_DECREF(slice); + return ret; + } + else { + PyObject *append_func; + + append_func = PyObject_GetAttrString(list, "append"); + if (append_func == NULL) + return -1; + for (i = x; i < len; i++) { + PyObject *result; + + value = self->stack->data[i]; + result = _Unpickler_FastCall(self, append_func, value); + if (result == NULL) { + Pdata_clear(self->stack, i + 1); + Py_SIZE(self->stack) = x; + return -1; + } + Py_DECREF(result); + } + Py_SIZE(self->stack) = x; + } + + return 0; +} + +static int +load_append(UnpicklerObject *self) +{ + return do_append(self, Py_SIZE(self->stack) - 1); +} + +static int +load_appends(UnpicklerObject *self) +{ + return do_append(self, marker(self)); +} + +static int +do_setitems(UnpicklerObject *self, Py_ssize_t x) +{ + PyObject *value, *key; + PyObject *dict; + Py_ssize_t len, i; + int status = 0; + + len = Py_SIZE(self->stack); + if (x > len || x <= 0) + return stack_underflow(); + if (len == x) /* nothing to do */ + return 0; + if ((len - x) % 2 != 0) { + /* Currupt or hostile pickle -- we never write one like this. */ + PyErr_SetString(UnpicklingError, "odd number of items for SETITEMS"); + return -1; + } + + /* Here, dict does not actually need to be a PyDict; it could be anything + that supports the __setitem__ attribute. */ + dict = self->stack->data[x - 1]; + + for (i = x + 1; i < len; i += 2) { + key = self->stack->data[i - 1]; + value = self->stack->data[i]; + if (PyObject_SetItem(dict, key, value) < 0) { + status = -1; + break; + } + } + + Pdata_clear(self->stack, x); + return status; +} + +static int +load_setitem(UnpicklerObject *self) +{ + return do_setitems(self, Py_SIZE(self->stack) - 2); +} + +static int +load_setitems(UnpicklerObject *self) +{ + return do_setitems(self, marker(self)); +} + +static int +load_build(UnpicklerObject *self) +{ + PyObject *state, *inst, *slotstate; + PyObject *setstate; + int status = 0; + + /* Stack is ... instance, state. We want to leave instance at + * the stack top, possibly mutated via instance.__setstate__(state). + */ + if (Py_SIZE(self->stack) < 2) + return stack_underflow(); + + PDATA_POP(self->stack, state); + if (state == NULL) + return -1; + + inst = self->stack->data[Py_SIZE(self->stack) - 1]; + + setstate = PyObject_GetAttrString(inst, "__setstate__"); + if (setstate == NULL) { + if (PyErr_ExceptionMatches(PyExc_AttributeError)) + PyErr_Clear(); + else { + Py_DECREF(state); + return -1; + } + } + else { + PyObject *result; + + /* The explicit __setstate__ is responsible for everything. */ + /* Ugh... this does not leak since _Unpickler_FastCall() steals the + reference to state first. */ + result = _Unpickler_FastCall(self, setstate, state); + Py_DECREF(setstate); + if (result == NULL) + return -1; + Py_DECREF(result); + return 0; + } + + /* A default __setstate__. First see whether state embeds a + * slot state dict too (a proto 2 addition). + */ + if (PyTuple_Check(state) && Py_SIZE(state) == 2) { + PyObject *tmp = state; + + state = PyTuple_GET_ITEM(tmp, 0); + slotstate = PyTuple_GET_ITEM(tmp, 1); + Py_INCREF(state); + Py_INCREF(slotstate); + Py_DECREF(tmp); + } + else + slotstate = NULL; + + /* Set inst.__dict__ from the state dict (if any). */ + if (state != Py_None) { + PyObject *dict; + PyObject *d_key, *d_value; + Py_ssize_t i; + + if (!PyDict_Check(state)) { + PyErr_SetString(UnpicklingError, "state is not a dictionary"); + goto error; + } + dict = PyObject_GetAttrString(inst, "__dict__"); + if (dict == NULL) + goto error; + + i = 0; + while (PyDict_Next(state, &i, &d_key, &d_value)) { + /* normally the keys for instance attributes are + interned. we should try to do that here. */ + Py_INCREF(d_key); + if (PyUnicode_CheckExact(d_key)) + PyUnicode_InternInPlace(&d_key); + if (PyObject_SetItem(dict, d_key, d_value) < 0) { + Py_DECREF(d_key); + goto error; + } + Py_DECREF(d_key); + } + Py_DECREF(dict); + } + + /* Also set instance attributes from the slotstate dict (if any). */ + if (slotstate != NULL) { + PyObject *d_key, *d_value; + Py_ssize_t i; + + if (!PyDict_Check(slotstate)) { + PyErr_SetString(UnpicklingError, + "slot state is not a dictionary"); + goto error; + } + i = 0; + while (PyDict_Next(slotstate, &i, &d_key, &d_value)) { + if (PyObject_SetAttr(inst, d_key, d_value) < 0) + goto error; + } + } + + if (0) { + error: + status = -1; + } + + Py_DECREF(state); + Py_XDECREF(slotstate); + return status; +} + +static int +load_mark(UnpicklerObject *self) +{ + + /* Note that we split the (pickle.py) stack into two stacks, an + * object stack and a mark stack. Here we push a mark onto the + * mark stack. + */ + + if ((self->num_marks + 1) >= self->marks_size) { + size_t alloc; + Py_ssize_t *marks; + + /* Use the size_t type to check for overflow. */ + alloc = ((size_t)self->num_marks << 1) + 20; + if (alloc > (PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) || + alloc <= ((size_t)self->num_marks + 1)) { + PyErr_NoMemory(); + return -1; + } + + if (self->marks == NULL) + marks = (Py_ssize_t *) PyMem_Malloc(alloc * sizeof(Py_ssize_t)); + else + marks = (Py_ssize_t *) PyMem_Realloc(self->marks, + alloc * sizeof(Py_ssize_t)); + if (marks == NULL) { + PyErr_NoMemory(); + return -1; + } + self->marks = marks; + self->marks_size = (Py_ssize_t)alloc; + } + + self->marks[self->num_marks++] = Py_SIZE(self->stack); + + return 0; +} + +static int +load_reduce(UnpicklerObject *self) +{ + PyObject *callable = NULL; + PyObject *argtup = NULL; + PyObject *obj = NULL; + + PDATA_POP(self->stack, argtup); + if (argtup == NULL) + return -1; + PDATA_POP(self->stack, callable); + if (callable) { + obj = PyObject_CallObject(callable, argtup); + Py_DECREF(callable); + } + Py_DECREF(argtup); + + if (obj == NULL) + return -1; + + PDATA_PUSH(self->stack, obj, -1); + return 0; +} + +/* Just raises an error if we don't know the protocol specified. PROTO + * is the first opcode for protocols >= 2. + */ +static int +load_proto(UnpicklerObject *self) +{ + char *s; + int i; + + if (_Unpickler_Read(self, &s, 1) < 0) + return -1; + + i = (unsigned char)s[0]; + if (i <= HIGHEST_PROTOCOL) { + self->proto = i; + return 0; + } + + PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i); + return -1; +} + +static PyObject * +load(UnpicklerObject *self) +{ + PyObject *err; + PyObject *value = NULL; + char *s; + + self->num_marks = 0; + if (Py_SIZE(self->stack)) + Pdata_clear(self->stack, 0); + + /* Convenient macros for the dispatch while-switch loop just below. */ +#define OP(opcode, load_func) \ + case opcode: if (load_func(self) < 0) break; continue; + +#define OP_ARG(opcode, load_func, arg) \ + case opcode: if (load_func(self, (arg)) < 0) break; continue; + + while (1) { + if (_Unpickler_Read(self, &s, 1) < 0) + break; + + switch ((enum opcode)s[0]) { + OP(NONE, load_none) + OP(BININT, load_binint) + OP(BININT1, load_binint1) + OP(BININT2, load_binint2) + OP(INT, load_int) + OP(LONG, load_long) + OP_ARG(LONG1, load_counted_long, 1) + OP_ARG(LONG4, load_counted_long, 4) + OP(FLOAT, load_float) + OP(BINFLOAT, load_binfloat) + OP(BINBYTES, load_binbytes) + OP(SHORT_BINBYTES, load_short_binbytes) + OP(BINSTRING, load_binstring) + OP(SHORT_BINSTRING, load_short_binstring) + OP(STRING, load_string) + OP(UNICODE, load_unicode) + OP(BINUNICODE, load_binunicode) + OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0) + OP_ARG(TUPLE1, load_counted_tuple, 1) + OP_ARG(TUPLE2, load_counted_tuple, 2) + OP_ARG(TUPLE3, load_counted_tuple, 3) + OP(TUPLE, load_tuple) + OP(EMPTY_LIST, load_empty_list) + OP(LIST, load_list) + OP(EMPTY_DICT, load_empty_dict) + OP(DICT, load_dict) + OP(OBJ, load_obj) + OP(INST, load_inst) + OP(NEWOBJ, load_newobj) + OP(GLOBAL, load_global) + OP(APPEND, load_append) + OP(APPENDS, load_appends) + OP(BUILD, load_build) + OP(DUP, load_dup) + OP(BINGET, load_binget) + OP(LONG_BINGET, load_long_binget) + OP(GET, load_get) + OP(MARK, load_mark) + OP(BINPUT, load_binput) + OP(LONG_BINPUT, load_long_binput) + OP(PUT, load_put) + OP(POP, load_pop) + OP(POP_MARK, load_pop_mark) + OP(SETITEM, load_setitem) + OP(SETITEMS, load_setitems) + OP(PERSID, load_persid) + OP(BINPERSID, load_binpersid) + OP(REDUCE, load_reduce) + OP(PROTO, load_proto) + OP_ARG(EXT1, load_extension, 1) + OP_ARG(EXT2, load_extension, 2) + OP_ARG(EXT4, load_extension, 4) + OP_ARG(NEWTRUE, load_bool, Py_True) + OP_ARG(NEWFALSE, load_bool, Py_False) + + case STOP: + break; + + default: + if (s[0] == '\0') + PyErr_SetNone(PyExc_EOFError); + else + PyErr_Format(UnpicklingError, + "invalid load key, '%c'.", s[0]); + return NULL; + } + + break; /* and we are done! */ + } + + if (_Unpickler_SkipConsumed(self) < 0) + return NULL; + + /* XXX: It is not clear what this is actually for. */ + if ((err = PyErr_Occurred())) { + if (err == PyExc_EOFError) { + PyErr_SetNone(PyExc_EOFError); + } + return NULL; + } + + PDATA_POP(self->stack, value); + return value; +} + +PyDoc_STRVAR(Unpickler_load_doc, +"load() -> object. Load a pickle." +"\n" +"Read a pickled object representation from the open file object given in\n" +"the constructor, and return the reconstituted object hierarchy specified\n" +"therein.\n"); + +static PyObject * +Unpickler_load(UnpicklerObject *self) +{ + /* Check whether the Unpickler was initialized correctly. This prevents + segfaulting if a subclass overridden __init__ with a function that does + not call Unpickler.__init__(). Here, we simply ensure that self->read + is not NULL. */ + if (self->read == NULL) { + PyErr_Format(UnpicklingError, + "Unpickler.__init__() was not called by %s.__init__()", + Py_TYPE(self)->tp_name); + return NULL; + } + + return load(self); +} + +/* The name of find_class() is misleading. In newer pickle protocols, this + function is used for loading any global (i.e., functions), not just + classes. The name is kept only for backward compatibility. */ + +PyDoc_STRVAR(Unpickler_find_class_doc, +"find_class(module_name, global_name) -> object.\n" +"\n" +"Return an object from a specified module, importing the module if\n" +"necessary. Subclasses may override this method (e.g. to restrict\n" +"unpickling of arbitrary classes and functions).\n" +"\n" +"This method is called whenever a class or a function object is\n" +"needed. Both arguments passed are str objects.\n"); + +static PyObject * +Unpickler_find_class(UnpicklerObject *self, PyObject *args) +{ + PyObject *global; + PyObject *modules_dict; + PyObject *module; + PyObject *module_name, *global_name; + + if (!PyArg_UnpackTuple(args, "find_class", 2, 2, + &module_name, &global_name)) + return NULL; + + /* Try to map the old names used in Python 2.x to the new ones used in + Python 3.x. We do this only with old pickle protocols and when the + user has not disabled the feature. */ + if (self->proto < 3 && self->fix_imports) { + PyObject *key; + PyObject *item; + + /* Check if the global (i.e., a function or a class) was renamed + or moved to another module. */ + key = PyTuple_Pack(2, module_name, global_name); + if (key == NULL) + return NULL; + item = PyDict_GetItemWithError(name_mapping_2to3, key); + Py_DECREF(key); + if (item) { + if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) { + PyErr_Format(PyExc_RuntimeError, + "_compat_pickle.NAME_MAPPING values should be " + "2-tuples, not %.200s", Py_TYPE(item)->tp_name); + return NULL; + } + module_name = PyTuple_GET_ITEM(item, 0); + global_name = PyTuple_GET_ITEM(item, 1); + if (!PyUnicode_Check(module_name) || + !PyUnicode_Check(global_name)) { + PyErr_Format(PyExc_RuntimeError, + "_compat_pickle.NAME_MAPPING values should be " + "pairs of str, not (%.200s, %.200s)", + Py_TYPE(module_name)->tp_name, + Py_TYPE(global_name)->tp_name); + return NULL; + } + } + else if (PyErr_Occurred()) { + return NULL; + } + + /* Check if the module was renamed. */ + item = PyDict_GetItemWithError(import_mapping_2to3, module_name); + if (item) { + if (!PyUnicode_Check(item)) { + PyErr_Format(PyExc_RuntimeError, + "_compat_pickle.IMPORT_MAPPING values should be " + "strings, not %.200s", Py_TYPE(item)->tp_name); + return NULL; + } + module_name = item; + } + else if (PyErr_Occurred()) { + return NULL; + } + } + + modules_dict = PySys_GetObject("modules"); + if (modules_dict == NULL) + return NULL; + + module = PyDict_GetItemWithError(modules_dict, module_name); + if (module == NULL) { + if (PyErr_Occurred()) + return NULL; + module = PyImport_Import(module_name); + if (module == NULL) + return NULL; + global = PyObject_GetAttr(module, global_name); + Py_DECREF(module); + } + else { + global = PyObject_GetAttr(module, global_name); + } + return global; +} + +static struct PyMethodDef Unpickler_methods[] = { + {"load", (PyCFunction)Unpickler_load, METH_NOARGS, + Unpickler_load_doc}, + {"find_class", (PyCFunction)Unpickler_find_class, METH_VARARGS, + Unpickler_find_class_doc}, + {NULL, NULL} /* sentinel */ +}; + +static void +Unpickler_dealloc(UnpicklerObject *self) +{ + PyObject_GC_UnTrack((PyObject *)self); + Py_XDECREF(self->readline); + Py_XDECREF(self->read); + Py_XDECREF(self->peek); + Py_XDECREF(self->stack); + Py_XDECREF(self->pers_func); + Py_XDECREF(self->arg); + if (self->buffer.buf != NULL) { + PyBuffer_Release(&self->buffer); + self->buffer.buf = NULL; + } + + _Unpickler_MemoCleanup(self); + PyMem_Free(self->marks); + PyMem_Free(self->input_line); + free(self->encoding); + free(self->errors); + + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static int +Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg) +{ + Py_VISIT(self->readline); + Py_VISIT(self->read); + Py_VISIT(self->peek); + Py_VISIT(self->stack); + Py_VISIT(self->pers_func); + Py_VISIT(self->arg); + return 0; +} + +static int +Unpickler_clear(UnpicklerObject *self) +{ + Py_CLEAR(self->readline); + Py_CLEAR(self->read); + Py_CLEAR(self->peek); + Py_CLEAR(self->stack); + Py_CLEAR(self->pers_func); + Py_CLEAR(self->arg); + if (self->buffer.buf != NULL) { + PyBuffer_Release(&self->buffer); + self->buffer.buf = NULL; + } + + _Unpickler_MemoCleanup(self); + PyMem_Free(self->marks); + self->marks = NULL; + PyMem_Free(self->input_line); + self->input_line = NULL; + free(self->encoding); + self->encoding = NULL; + free(self->errors); + self->errors = NULL; + + return 0; +} + +PyDoc_STRVAR(Unpickler_doc, +"Unpickler(file, *, encoding='ASCII', errors='strict')" +"\n" +"This takes a binary file for reading a pickle data stream.\n" +"\n" +"The protocol version of the pickle is detected automatically, so no\n" +"proto argument is needed.\n" +"\n" +"The file-like object must have two methods, a read() method\n" +"that takes an integer argument, and a readline() method that\n" +"requires no arguments. Both methods should return bytes.\n" +"Thus file-like object can be a binary file object opened for\n" +"reading, a BytesIO object, or any other custom object that\n" +"meets this interface.\n" +"\n" +"Optional keyword arguments are *fix_imports*, *encoding* and *errors*,\n" +"which are used to control compatiblity support for pickle stream\n" +"generated by Python 2.x. If *fix_imports* is True, pickle will try to\n" +"map the old Python 2.x names to the new names used in Python 3.x. The\n" +"*encoding* and *errors* tell pickle how to decode 8-bit string\n" +"instances pickled by Python 2.x; these default to 'ASCII' and\n" +"'strict', respectively.\n"); + +static int +Unpickler_init(UnpicklerObject *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"file", "fix_imports", "encoding", "errors", 0}; + PyObject *file; + PyObject *fix_imports = Py_True; + char *encoding = NULL; + char *errors = NULL; + + /* XXX: That is an horrible error message. But, I don't know how to do + better... */ + if (Py_SIZE(args) != 1) { + PyErr_Format(PyExc_TypeError, + "%s takes exactly one positional argument (%zd given)", + Py_TYPE(self)->tp_name, Py_SIZE(args)); + return -1; + } + + /* Arguments parsing needs to be done in the __init__() method to allow + subclasses to define their own __init__() method, which may (or may + not) support Unpickler arguments. However, this means we need to be + extra careful in the other Unpickler methods, since a subclass could + forget to call Unpickler.__init__() thus breaking our internal + invariants. */ + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oss:Unpickler", kwlist, + &file, &fix_imports, &encoding, &errors)) + return -1; + + /* In case of multiple __init__() calls, clear previous content. */ + if (self->read != NULL) + (void)Unpickler_clear(self); + + if (_Unpickler_SetInputStream(self, file) < 0) + return -1; + + if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0) + return -1; + + self->fix_imports = PyObject_IsTrue(fix_imports); + if (self->fix_imports == -1) + return -1; + + if (PyObject_HasAttrString((PyObject *)self, "persistent_load")) { + self->pers_func = PyObject_GetAttrString((PyObject *)self, + "persistent_load"); + if (self->pers_func == NULL) + return -1; + } + else { + self->pers_func = NULL; + } + + self->stack = (Pdata *)Pdata_New(); + if (self->stack == NULL) + return -1; + + self->memo_size = 32; + self->memo = _Unpickler_NewMemo(self->memo_size); + if (self->memo == NULL) + return -1; + + self->arg = NULL; + self->proto = 0; + + return 0; +} + +/* Define a proxy object for the Unpickler's internal memo object. This is to + * avoid breaking code like: + * unpickler.memo.clear() + * and + * unpickler.memo = saved_memo + * Is this a good idea? Not really, but we don't want to break code that uses + * it. Note that we don't implement the entire mapping API here. This is + * intentional, as these should be treated as black-box implementation details. + * + * We do, however, have to implement pickling/unpickling support because of + * real-world code like cvs2svn. + */ + +typedef struct { + PyObject_HEAD + UnpicklerObject *unpickler; +} UnpicklerMemoProxyObject; + +PyDoc_STRVAR(ump_clear_doc, +"memo.clear() -> None. Remove all items from memo."); + +static PyObject * +ump_clear(UnpicklerMemoProxyObject *self) +{ + _Unpickler_MemoCleanup(self->unpickler); + self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size); + if (self->unpickler->memo == NULL) + return NULL; + Py_RETURN_NONE; +} + +PyDoc_STRVAR(ump_copy_doc, +"memo.copy() -> new_memo. Copy the memo to a new object."); + +static PyObject * +ump_copy(UnpicklerMemoProxyObject *self) +{ + Py_ssize_t i; + PyObject *new_memo = PyDict_New(); + if (new_memo == NULL) + return NULL; + + for (i = 0; i < self->unpickler->memo_size; i++) { + int status; + PyObject *key, *value; + + value = self->unpickler->memo[i]; + if (value == NULL) + continue; + + key = PyLong_FromSsize_t(i); + if (key == NULL) + goto error; + status = PyDict_SetItem(new_memo, key, value); + Py_DECREF(key); + if (status < 0) + goto error; + } + return new_memo; + +error: + Py_DECREF(new_memo); + return NULL; +} + +PyDoc_STRVAR(ump_reduce_doc, +"memo.__reduce__(). Pickling support."); + +static PyObject * +ump_reduce(UnpicklerMemoProxyObject *self, PyObject *args) +{ + PyObject *reduce_value; + PyObject *constructor_args; + PyObject *contents = ump_copy(self); + if (contents == NULL) + return NULL; + + reduce_value = PyTuple_New(2); + if (reduce_value == NULL) { + Py_DECREF(contents); + return NULL; + } + constructor_args = PyTuple_New(1); + if (constructor_args == NULL) { + Py_DECREF(contents); + Py_DECREF(reduce_value); + return NULL; + } + PyTuple_SET_ITEM(constructor_args, 0, contents); + Py_INCREF((PyObject *)&PyDict_Type); + PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type); + PyTuple_SET_ITEM(reduce_value, 1, constructor_args); + return reduce_value; +} + +static PyMethodDef unpicklerproxy_methods[] = { + {"clear", (PyCFunction)ump_clear, METH_NOARGS, ump_clear_doc}, + {"copy", (PyCFunction)ump_copy, METH_NOARGS, ump_copy_doc}, + {"__reduce__", (PyCFunction)ump_reduce, METH_VARARGS, ump_reduce_doc}, + {NULL, NULL} /* sentinel */ +}; + +static void +UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self) +{ + PyObject_GC_UnTrack(self); + Py_XDECREF(self->unpickler); + PyObject_GC_Del((PyObject *)self); +} + +static int +UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self, + visitproc visit, void *arg) +{ + Py_VISIT(self->unpickler); + return 0; +} + +static int +UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self) +{ + Py_CLEAR(self->unpickler); + return 0; +} + +static PyTypeObject UnpicklerMemoProxyType = { + PyVarObject_HEAD_INIT(NULL, 0) + "_pickle.UnpicklerMemoProxy", /*tp_name*/ + sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/ + 0, + (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + PyObject_HashNotImplemented, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + PyObject_GenericSetAttr, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + 0, /* tp_doc */ + (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */ + (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + unpicklerproxy_methods, /* tp_methods */ +}; + +static PyObject * +UnpicklerMemoProxy_New(UnpicklerObject *unpickler) +{ + UnpicklerMemoProxyObject *self; + + self = PyObject_GC_New(UnpicklerMemoProxyObject, + &UnpicklerMemoProxyType); + if (self == NULL) + return NULL; + Py_INCREF(unpickler); + self->unpickler = unpickler; + PyObject_GC_Track(self); + return (PyObject *)self; +} + +/*****************************************************************************/ + + +static PyObject * +Unpickler_get_memo(UnpicklerObject *self) +{ + return UnpicklerMemoProxy_New(self); +} + +static int +Unpickler_set_memo(UnpicklerObject *self, PyObject *obj) +{ + PyObject **new_memo; + Py_ssize_t new_memo_size = 0; + Py_ssize_t i; + + if (obj == NULL) { + PyErr_SetString(PyExc_TypeError, + "attribute deletion is not supported"); + return -1; + } + + if (Py_TYPE(obj) == &UnpicklerMemoProxyType) { + UnpicklerObject *unpickler = + ((UnpicklerMemoProxyObject *)obj)->unpickler; + + new_memo_size = unpickler->memo_size; + new_memo = _Unpickler_NewMemo(new_memo_size); + if (new_memo == NULL) + return -1; + + for (i = 0; i < new_memo_size; i++) { + Py_XINCREF(unpickler->memo[i]); + new_memo[i] = unpickler->memo[i]; + } + } + else if (PyDict_Check(obj)) { + Py_ssize_t i = 0; + PyObject *key, *value; + + new_memo_size = PyDict_Size(obj); + new_memo = _Unpickler_NewMemo(new_memo_size); + if (new_memo == NULL) + return -1; + + while (PyDict_Next(obj, &i, &key, &value)) { + Py_ssize_t idx; + if (!PyLong_Check(key)) { + PyErr_SetString(PyExc_TypeError, + "memo key must be integers"); + goto error; + } + idx = PyLong_AsSsize_t(key); + if (idx == -1 && PyErr_Occurred()) + goto error; + if (_Unpickler_MemoPut(self, idx, value) < 0) + goto error; + } + } + else { + PyErr_Format(PyExc_TypeError, + "'memo' attribute must be an UnpicklerMemoProxy object" + "or dict, not %.200s", Py_TYPE(obj)->tp_name); + return -1; + } + + _Unpickler_MemoCleanup(self); + self->memo_size = new_memo_size; + self->memo = new_memo; + + return 0; + + error: + if (new_memo_size) { + i = new_memo_size; + while (--i >= 0) { + Py_XDECREF(new_memo[i]); + } + PyMem_FREE(new_memo); + } + return -1; +} + +static PyObject * +Unpickler_get_persload(UnpicklerObject *self) +{ + if (self->pers_func == NULL) + PyErr_SetString(PyExc_AttributeError, "persistent_load"); + else + Py_INCREF(self->pers_func); + return self->pers_func; +} + +static int +Unpickler_set_persload(UnpicklerObject *self, PyObject *value) +{ + PyObject *tmp; + + if (value == NULL) { + PyErr_SetString(PyExc_TypeError, + "attribute deletion is not supported"); + return -1; + } + if (!PyCallable_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "persistent_load must be a callable taking " + "one argument"); + return -1; + } + + tmp = self->pers_func; + Py_INCREF(value); + self->pers_func = value; + Py_XDECREF(tmp); /* self->pers_func can be NULL, so be careful. */ + + return 0; +} + +static PyGetSetDef Unpickler_getsets[] = { + {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo}, + {"persistent_load", (getter)Unpickler_get_persload, + (setter)Unpickler_set_persload}, + {NULL} +}; + +static PyTypeObject Unpickler_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_pickle.Unpickler", /*tp_name*/ + sizeof(UnpicklerObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)Unpickler_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 | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + Unpickler_doc, /*tp_doc*/ + (traverseproc)Unpickler_traverse, /*tp_traverse*/ + (inquiry)Unpickler_clear, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + Unpickler_methods, /*tp_methods*/ + 0, /*tp_members*/ + Unpickler_getsets, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + (initproc)Unpickler_init, /*tp_init*/ + PyType_GenericAlloc, /*tp_alloc*/ + PyType_GenericNew, /*tp_new*/ + PyObject_GC_Del, /*tp_free*/ + 0, /*tp_is_gc*/ +}; + +PyDoc_STRVAR(pickle_dump_doc, +"dump(obj, file, protocol=None, *, fix_imports=True) -> None\n" +"\n" +"Write a pickled representation of obj to the open file object file. This\n" +"is equivalent to ``Pickler(file, protocol).dump(obj)``, but may be more\n" +"efficient.\n" +"\n" +"The optional protocol argument tells the pickler to use the given protocol;\n" +"supported protocols are 0, 1, 2, 3. The default protocol is 3; a\n" +"backward-incompatible protocol designed for Python 3.0.\n" +"\n" +"Specifying a negative protocol version selects the highest protocol version\n" +"supported. The higher the protocol used, the more recent the version of\n" +"Python needed to read the pickle produced.\n" +"\n" +"The file argument must have a write() method that accepts a single bytes\n" +"argument. It can thus be a file object opened for binary writing, a\n" +"io.BytesIO instance, or any other custom object that meets this interface.\n" +"\n" +"If fix_imports is True and protocol is less than 3, pickle will try to\n" +"map the new Python 3.x names to the old module names used in Python 2.x,\n" +"so that the pickle data stream is readable with Python 2.x.\n"); + +static PyObject * +pickle_dump(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"obj", "file", "protocol", "fix_imports", 0}; + PyObject *obj; + PyObject *file; + PyObject *proto = NULL; + PyObject *fix_imports = Py_True; + PicklerObject *pickler; + + /* fix_imports is a keyword-only argument. */ + if (Py_SIZE(args) > 3) { + PyErr_Format(PyExc_TypeError, + "pickle.dump() takes at most 3 positional " + "argument (%zd given)", Py_SIZE(args)); + return NULL; + } + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO:dump", kwlist, + &obj, &file, &proto, &fix_imports)) + return NULL; + + pickler = _Pickler_New(); + if (pickler == NULL) + return NULL; + + if (_Pickler_SetProtocol(pickler, proto, fix_imports) < 0) + goto error; + + if (_Pickler_SetOutputStream(pickler, file) < 0) + goto error; + + if (dump(pickler, obj) < 0) + goto error; + + if (_Pickler_FlushToFile(pickler) < 0) + goto error; + + Py_DECREF(pickler); + Py_RETURN_NONE; + + error: + Py_XDECREF(pickler); + return NULL; +} + +PyDoc_STRVAR(pickle_dumps_doc, +"dumps(obj, protocol=None, *, fix_imports=True) -> bytes\n" +"\n" +"Return the pickled representation of the object as a bytes\n" +"object, instead of writing it to a file.\n" +"\n" +"The optional protocol argument tells the pickler to use the given protocol;\n" +"supported protocols are 0, 1, 2, 3. The default protocol is 3; a\n" +"backward-incompatible protocol designed for Python 3.0.\n" +"\n" +"Specifying a negative protocol version selects the highest protocol version\n" +"supported. The higher the protocol used, the more recent the version of\n" +"Python needed to read the pickle produced.\n" +"\n" +"If fix_imports is True and *protocol* is less than 3, pickle will try to\n" +"map the new Python 3.x names to the old module names used in Python 2.x,\n" +"so that the pickle data stream is readable with Python 2.x.\n"); + +static PyObject * +pickle_dumps(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"obj", "protocol", "fix_imports", 0}; + PyObject *obj; + PyObject *proto = NULL; + PyObject *result; + PyObject *fix_imports = Py_True; + PicklerObject *pickler; + + /* fix_imports is a keyword-only argument. */ + if (Py_SIZE(args) > 2) { + PyErr_Format(PyExc_TypeError, + "pickle.dumps() takes at most 2 positional " + "argument (%zd given)", Py_SIZE(args)); + return NULL; + } + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OO:dumps", kwlist, + &obj, &proto, &fix_imports)) + return NULL; + + pickler = _Pickler_New(); + if (pickler == NULL) + return NULL; + + if (_Pickler_SetProtocol(pickler, proto, fix_imports) < 0) + goto error; + + if (dump(pickler, obj) < 0) + goto error; + + result = _Pickler_GetString(pickler); + Py_DECREF(pickler); + return result; + + error: + Py_XDECREF(pickler); + return NULL; +} + +PyDoc_STRVAR(pickle_load_doc, +"load(file, *, fix_imports=True, encoding='ASCII', errors='strict') -> object\n" +"\n" +"Read a pickled object representation from the open file object file and\n" +"return the reconstituted object hierarchy specified therein. This is\n" +"equivalent to ``Unpickler(file).load()``, but may be more efficient.\n" +"\n" +"The protocol version of the pickle is detected automatically, so no protocol\n" +"argument is needed. Bytes past the pickled object's representation are\n" +"ignored.\n" +"\n" +"The argument file must have two methods, a read() method that takes an\n" +"integer argument, and a readline() method that requires no arguments. Both\n" +"methods should return bytes. Thus *file* can be a binary file object opened\n" +"for reading, a BytesIO object, or any other custom object that meets this\n" +"interface.\n" +"\n" +"Optional keyword arguments are fix_imports, encoding and errors,\n" +"which are used to control compatiblity support for pickle stream generated\n" +"by Python 2.x. If fix_imports is True, pickle will try to map the old\n" +"Python 2.x names to the new names used in Python 3.x. The encoding and\n" +"errors tell pickle how to decode 8-bit string instances pickled by Python\n" +"2.x; these default to 'ASCII' and 'strict', respectively.\n"); + +static PyObject * +pickle_load(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"file", "fix_imports", "encoding", "errors", 0}; + PyObject *file; + PyObject *fix_imports = Py_True; + PyObject *result; + char *encoding = NULL; + char *errors = NULL; + UnpicklerObject *unpickler; + + /* fix_imports, encoding and errors are a keyword-only argument. */ + if (Py_SIZE(args) != 1) { + PyErr_Format(PyExc_TypeError, + "pickle.load() takes exactly one positional " + "argument (%zd given)", Py_SIZE(args)); + return NULL; + } + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oss:load", kwlist, + &file, &fix_imports, &encoding, &errors)) + return NULL; + + unpickler = _Unpickler_New(); + if (unpickler == NULL) + return NULL; + + if (_Unpickler_SetInputStream(unpickler, file) < 0) + goto error; + + if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0) + goto error; + + unpickler->fix_imports = PyObject_IsTrue(fix_imports); + if (unpickler->fix_imports == -1) + goto error; + + result = load(unpickler); + Py_DECREF(unpickler); + return result; + + error: + Py_XDECREF(unpickler); + return NULL; +} + +PyDoc_STRVAR(pickle_loads_doc, +"loads(input, *, fix_imports=True, encoding='ASCII', errors='strict') -> object\n" +"\n" +"Read a pickled object hierarchy from a bytes object and return the\n" +"reconstituted object hierarchy specified therein\n" +"\n" +"The protocol version of the pickle is detected automatically, so no protocol\n" +"argument is needed. Bytes past the pickled object's representation are\n" +"ignored.\n" +"\n" +"Optional keyword arguments are fix_imports, encoding and errors, which\n" +"are used to control compatiblity support for pickle stream generated\n" +"by Python 2.x. If fix_imports is True, pickle will try to map the old\n" +"Python 2.x names to the new names used in Python 3.x. The encoding and\n" +"errors tell pickle how to decode 8-bit string instances pickled by Python\n" +"2.x; these default to 'ASCII' and 'strict', respectively.\n"); + +static PyObject * +pickle_loads(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"input", "fix_imports", "encoding", "errors", 0}; + PyObject *input; + PyObject *fix_imports = Py_True; + PyObject *result; + char *encoding = NULL; + char *errors = NULL; + UnpicklerObject *unpickler; + + /* fix_imports, encoding and errors are a keyword-only argument. */ + if (Py_SIZE(args) != 1) { + PyErr_Format(PyExc_TypeError, + "pickle.loads() takes exactly one positional " + "argument (%zd given)", Py_SIZE(args)); + return NULL; + } + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oss:loads", kwlist, + &input, &fix_imports, &encoding, &errors)) + return NULL; + + unpickler = _Unpickler_New(); + if (unpickler == NULL) + return NULL; + + if (_Unpickler_SetStringInput(unpickler, input) < 0) + goto error; + + if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0) + goto error; + + unpickler->fix_imports = PyObject_IsTrue(fix_imports); + if (unpickler->fix_imports == -1) + goto error; + + result = load(unpickler); + Py_DECREF(unpickler); + return result; + + error: + Py_XDECREF(unpickler); + return NULL; +} + + +static struct PyMethodDef pickle_methods[] = { + {"dump", (PyCFunction)pickle_dump, METH_VARARGS|METH_KEYWORDS, + pickle_dump_doc}, + {"dumps", (PyCFunction)pickle_dumps, METH_VARARGS|METH_KEYWORDS, + pickle_dumps_doc}, + {"load", (PyCFunction)pickle_load, METH_VARARGS|METH_KEYWORDS, + pickle_load_doc}, + {"loads", (PyCFunction)pickle_loads, METH_VARARGS|METH_KEYWORDS, + pickle_loads_doc}, + {NULL, NULL} /* sentinel */ +}; + +static int +initmodule(void) +{ + PyObject *copyreg = NULL; + PyObject *compat_pickle = NULL; + + /* XXX: We should ensure that the types of the dictionaries imported are + exactly PyDict objects. Otherwise, it is possible to crash the pickle + since we use the PyDict API directly to access these dictionaries. */ + + copyreg = PyImport_ImportModule("copyreg"); + if (!copyreg) + goto error; + dispatch_table = PyObject_GetAttrString(copyreg, "dispatch_table"); + if (!dispatch_table) + goto error; + extension_registry = \ + PyObject_GetAttrString(copyreg, "_extension_registry"); + if (!extension_registry) + goto error; + inverted_registry = PyObject_GetAttrString(copyreg, "_inverted_registry"); + if (!inverted_registry) + goto error; + extension_cache = PyObject_GetAttrString(copyreg, "_extension_cache"); + if (!extension_cache) + goto error; + Py_CLEAR(copyreg); + + /* Load the 2.x -> 3.x stdlib module mapping tables */ + compat_pickle = PyImport_ImportModule("_compat_pickle"); + if (!compat_pickle) + goto error; + name_mapping_2to3 = PyObject_GetAttrString(compat_pickle, "NAME_MAPPING"); + if (!name_mapping_2to3) + goto error; + if (!PyDict_CheckExact(name_mapping_2to3)) { + PyErr_Format(PyExc_RuntimeError, + "_compat_pickle.NAME_MAPPING should be a dict, not %.200s", + Py_TYPE(name_mapping_2to3)->tp_name); + goto error; + } + import_mapping_2to3 = PyObject_GetAttrString(compat_pickle, + "IMPORT_MAPPING"); + if (!import_mapping_2to3) + goto error; + if (!PyDict_CheckExact(import_mapping_2to3)) { + PyErr_Format(PyExc_RuntimeError, + "_compat_pickle.IMPORT_MAPPING should be a dict, " + "not %.200s", Py_TYPE(import_mapping_2to3)->tp_name); + goto error; + } + /* ... and the 3.x -> 2.x mapping tables */ + name_mapping_3to2 = PyObject_GetAttrString(compat_pickle, + "REVERSE_NAME_MAPPING"); + if (!name_mapping_3to2) + goto error; + if (!PyDict_CheckExact(name_mapping_3to2)) { + PyErr_Format(PyExc_RuntimeError, + "_compat_pickle.REVERSE_NAME_MAPPING should be a dict, " + "not %.200s", Py_TYPE(name_mapping_3to2)->tp_name); + goto error; + } + import_mapping_3to2 = PyObject_GetAttrString(compat_pickle, + "REVERSE_IMPORT_MAPPING"); + if (!import_mapping_3to2) + goto error; + if (!PyDict_CheckExact(import_mapping_3to2)) { + PyErr_Format(PyExc_RuntimeError, + "_compat_pickle.REVERSE_IMPORT_MAPPING should be a dict, " + "not %.200s", Py_TYPE(import_mapping_3to2)->tp_name); + goto error; + } + Py_CLEAR(compat_pickle); + + empty_tuple = PyTuple_New(0); + if (empty_tuple == NULL) + goto error; + two_tuple = PyTuple_New(2); + if (two_tuple == NULL) + goto error; + /* We use this temp container with no regard to refcounts, or to + * keeping containees alive. Exempt from GC, because we don't + * want anything looking at two_tuple() by magic. + */ + PyObject_GC_UnTrack(two_tuple); + + return 0; + + error: + Py_CLEAR(copyreg); + Py_CLEAR(dispatch_table); + Py_CLEAR(extension_registry); + Py_CLEAR(inverted_registry); + Py_CLEAR(extension_cache); + Py_CLEAR(compat_pickle); + Py_CLEAR(name_mapping_2to3); + Py_CLEAR(import_mapping_2to3); + Py_CLEAR(name_mapping_3to2); + Py_CLEAR(import_mapping_3to2); + Py_CLEAR(empty_tuple); + Py_CLEAR(two_tuple); + return -1; +} + +static struct PyModuleDef _picklemodule = { + PyModuleDef_HEAD_INIT, + "_pickle", + pickle_module_doc, + -1, + pickle_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit__pickle(void) +{ + PyObject *m; + + if (PyType_Ready(&Unpickler_Type) < 0) + return NULL; + if (PyType_Ready(&Pickler_Type) < 0) + return NULL; + if (PyType_Ready(&Pdata_Type) < 0) + return NULL; + if (PyType_Ready(&PicklerMemoProxyType) < 0) + return NULL; + if (PyType_Ready(&UnpicklerMemoProxyType) < 0) + return NULL; + + /* Create the module and add the functions. */ + m = PyModule_Create(&_picklemodule); + if (m == NULL) + return NULL; + + Py_INCREF(&Pickler_Type); + if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0) + return NULL; + Py_INCREF(&Unpickler_Type); + if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0) + return NULL; + + /* Initialize the exceptions. */ + PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL); + if (PickleError == NULL) + return NULL; + PicklingError = \ + PyErr_NewException("_pickle.PicklingError", PickleError, NULL); + if (PicklingError == NULL) + return NULL; + UnpicklingError = \ + PyErr_NewException("_pickle.UnpicklingError", PickleError, NULL); + if (UnpicklingError == NULL) + return NULL; + + if (PyModule_AddObject(m, "PickleError", PickleError) < 0) + return NULL; + if (PyModule_AddObject(m, "PicklingError", PicklingError) < 0) + return NULL; + if (PyModule_AddObject(m, "UnpicklingError", UnpicklingError) < 0) + return NULL; + + if (initmodule() < 0) + return NULL; + + return m; +} diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c new file mode 100644 index 00000000000..19ca31f56dd --- /dev/null +++ b/Modules/_posixsubprocess.c @@ -0,0 +1,804 @@ +/* Authors: Gregory P. Smith & Jeffrey Yasskin */ +#include "Python.h" +#if defined(HAVE_PIPE2) && !defined(_GNU_SOURCE) +# define _GNU_SOURCE +#endif +#include <unistd.h> +#include <fcntl.h> +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#if defined(HAVE_SYS_STAT_H) && defined(__FreeBSD__) +#include <sys/stat.h> +#endif +#ifdef HAVE_SYS_SYSCALL_H +#include <sys/syscall.h> +#endif +#ifdef HAVE_DIRENT_H +#include <dirent.h> +#endif + +#if defined(sun) +/* readdir64 is used to work around Solaris 9 bug 6395699. */ +# define readdir readdir64 +# define dirent dirent64 +# if !defined(HAVE_DIRFD) +/* Some versions of Solaris lack dirfd(). */ +# define dirfd(dirp) ((dirp)->dd_fd) +# define HAVE_DIRFD +# endif +#endif + +#if defined(__FreeBSD__) || (defined(__APPLE__) && defined(__MACH__)) +# define FD_DIR "/dev/fd" +#else +# define FD_DIR "/proc/self/fd" +#endif + +#define POSIX_CALL(call) if ((call) == -1) goto error + + +/* Maximum file descriptor, initialized on module load. */ +static long max_fd; + + +/* Given the gc module call gc.enable() and return 0 on success. */ +static int +_enable_gc(PyObject *gc_module) +{ + PyObject *result; + result = PyObject_CallMethod(gc_module, "enable", NULL); + if (result == NULL) + return 1; + Py_DECREF(result); + return 0; +} + + +/* Convert ASCII to a positive int, no libc call. no overflow. -1 on error. */ +static int +_pos_int_from_ascii(char *name) +{ + int num = 0; + while (*name >= '0' && *name <= '9') { + num = num * 10 + (*name - '0'); + ++name; + } + if (*name) + return -1; /* Non digit found, not a number. */ + return num; +} + + +#if defined(__FreeBSD__) +/* When /dev/fd isn't mounted it is often a static directory populated + * with 0 1 2 or entries for 0 .. 63 on FreeBSD, NetBSD and OpenBSD. + * NetBSD and OpenBSD have a /proc fs available (though not necessarily + * mounted) and do not have fdescfs for /dev/fd. MacOS X has a devfs + * that properly supports /dev/fd. + */ +static int +_is_fdescfs_mounted_on_dev_fd() +{ + struct stat dev_stat; + struct stat dev_fd_stat; + if (stat("/dev", &dev_stat) != 0) + return 0; + if (stat(FD_DIR, &dev_fd_stat) != 0) + return 0; + if (dev_stat.st_dev == dev_fd_stat.st_dev) + return 0; /* / == /dev == /dev/fd means it is static. #fail */ + return 1; +} +#endif + + +/* Returns 1 if there is a problem with fd_sequence, 0 otherwise. */ +static int +_sanity_check_python_fd_sequence(PyObject *fd_sequence) +{ + Py_ssize_t seq_idx, seq_len = PySequence_Length(fd_sequence); + long prev_fd = -1; + for (seq_idx = 0; seq_idx < seq_len; ++seq_idx) { + PyObject* py_fd = PySequence_Fast_GET_ITEM(fd_sequence, seq_idx); + long iter_fd = PyLong_AsLong(py_fd); + if (iter_fd < 0 || iter_fd < prev_fd || iter_fd > INT_MAX) { + /* Negative, overflow, not a Long, unsorted, too big for a fd. */ + return 1; + } + } + return 0; +} + + +/* Is fd found in the sorted Python Sequence? */ +static int +_is_fd_in_sorted_fd_sequence(int fd, PyObject *fd_sequence) +{ + /* Binary search. */ + Py_ssize_t search_min = 0; + Py_ssize_t search_max = PySequence_Length(fd_sequence) - 1; + if (search_max < 0) + return 0; + do { + long middle = (search_min + search_max) / 2; + long middle_fd = PyLong_AsLong( + PySequence_Fast_GET_ITEM(fd_sequence, middle)); + if (fd == middle_fd) + return 1; + if (fd > middle_fd) + search_min = middle + 1; + else + search_max = middle - 1; + } while (search_min <= search_max); + return 0; +} + + +/* Close all file descriptors in the range start_fd inclusive to + * end_fd exclusive except for those in py_fds_to_keep. If the + * range defined by [start_fd, end_fd) is large this will take a + * long time as it calls close() on EVERY possible fd. + */ +static void +_close_fds_by_brute_force(int start_fd, int end_fd, PyObject *py_fds_to_keep) +{ + Py_ssize_t num_fds_to_keep = PySequence_Length(py_fds_to_keep); + Py_ssize_t keep_seq_idx; + int fd_num; + /* As py_fds_to_keep is sorted we can loop through the list closing + * fds inbetween any in the keep list falling within our range. */ + for (keep_seq_idx = 0; keep_seq_idx < num_fds_to_keep; ++keep_seq_idx) { + PyObject* py_keep_fd = PySequence_Fast_GET_ITEM(py_fds_to_keep, + keep_seq_idx); + int keep_fd = PyLong_AsLong(py_keep_fd); + if (keep_fd < start_fd) + continue; + for (fd_num = start_fd; fd_num < keep_fd; ++fd_num) { + while (close(fd_num) < 0 && errno == EINTR); + } + start_fd = keep_fd + 1; + } + if (start_fd <= end_fd) { + for (fd_num = start_fd; fd_num < end_fd; ++fd_num) { + while (close(fd_num) < 0 && errno == EINTR); + } + } +} + + +#if defined(__linux__) && defined(HAVE_SYS_SYSCALL_H) +/* It doesn't matter if d_name has room for NAME_MAX chars; we're using this + * only to read a directory of short file descriptor number names. The kernel + * will return an error if we didn't give it enough space. Highly Unlikely. + * This structure is very old and stable: It will not change unless the kernel + * chooses to break compatibility with all existing binaries. Highly Unlikely. + */ +struct linux_dirent { +#if defined(__x86_64__) && defined(__ILP32__) + /* Support the wacky x32 ABI (fake 32-bit userspace speaking to x86_64 + * kernel interfaces) - https://sites.google.com/site/x32abi/ */ + unsigned long long d_ino; + unsigned long long d_off; +#else + unsigned long d_ino; /* Inode number */ + unsigned long d_off; /* Offset to next linux_dirent */ +#endif + unsigned short d_reclen; /* Length of this linux_dirent */ + char d_name[256]; /* Filename (null-terminated) */ +}; + +/* Close all open file descriptors in the range start_fd inclusive to end_fd + * exclusive. Do not close any in the sorted py_fds_to_keep list. + * + * This version is async signal safe as it does not make any unsafe C library + * calls, malloc calls or handle any locks. It is _unfortunate_ to be forced + * to resort to making a kernel system call directly but this is the ONLY api + * available that does no harm. opendir/readdir/closedir perform memory + * allocation and locking so while they usually work they are not guaranteed + * to (especially if you have replaced your malloc implementation). A version + * of this function that uses those can be found in the _maybe_unsafe variant. + * + * This is Linux specific because that is all I am ready to test it on. It + * should be easy to add OS specific dirent or dirent64 structures and modify + * it with some cpp #define magic to work on other OSes as well if you want. + */ +static void +_close_open_fd_range_safe(int start_fd, int end_fd, PyObject* py_fds_to_keep) +{ + int fd_dir_fd; + if (start_fd >= end_fd) + return; +#ifdef O_CLOEXEC + fd_dir_fd = open(FD_DIR, O_RDONLY | O_CLOEXEC, 0); +#else + fd_dir_fd = open(FD_DIR, O_RDONLY, 0); +#ifdef FD_CLOEXEC + { + int old = fcntl(fd_dir_fd, F_GETFD); + if (old != -1) + fcntl(fd_dir_fd, F_SETFD, old | FD_CLOEXEC); + } +#endif +#endif + if (fd_dir_fd == -1) { + /* No way to get a list of open fds. */ + _close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep); + return; + } else { + char buffer[sizeof(struct linux_dirent)]; + int bytes; + while ((bytes = syscall(SYS_getdents, fd_dir_fd, + (struct linux_dirent *)buffer, + sizeof(buffer))) > 0) { + struct linux_dirent *entry; + int offset; + for (offset = 0; offset < bytes; offset += entry->d_reclen) { + int fd; + entry = (struct linux_dirent *)(buffer + offset); + if ((fd = _pos_int_from_ascii(entry->d_name)) < 0) + continue; /* Not a number. */ + if (fd != fd_dir_fd && fd >= start_fd && fd < end_fd && + !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) { + while (close(fd) < 0 && errno == EINTR); + } + } + } + close(fd_dir_fd); + } +} + +#define _close_open_fd_range _close_open_fd_range_safe + +#else /* NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */ + + +/* Close all open file descriptors in the range start_fd inclusive to end_fd + * exclusive. Do not close any in the sorted py_fds_to_keep list. + * + * This function violates the strict use of async signal safe functions. :( + * It calls opendir(), readdir() and closedir(). Of these, the one most + * likely to ever cause a problem is opendir() as it performs an internal + * malloc(). Practically this should not be a problem. The Java VM makes the + * same calls between fork and exec in its own UNIXProcess_md.c implementation. + * + * readdir_r() is not used because it provides no benefit. It is typically + * implemented as readdir() followed by memcpy(). See also: + * http://womble.decadent.org.uk/readdir_r-advisory.html + */ +static void +_close_open_fd_range_maybe_unsafe(int start_fd, int end_fd, + PyObject* py_fds_to_keep) +{ + DIR *proc_fd_dir; +#ifndef HAVE_DIRFD + while (_is_fd_in_sorted_fd_sequence(start_fd, py_fds_to_keep) && + (start_fd < end_fd)) { + ++start_fd; + } + if (start_fd >= end_fd) + return; + /* Close our lowest fd before we call opendir so that it is likely to + * reuse that fd otherwise we might close opendir's file descriptor in + * our loop. This trick assumes that fd's are allocated on a lowest + * available basis. */ + while (close(start_fd) < 0 && errno == EINTR); + ++start_fd; +#endif + if (start_fd >= end_fd) + return; + +#if defined(__FreeBSD__) + if (!_is_fdescfs_mounted_on_dev_fd()) + proc_fd_dir = NULL; + else +#endif + proc_fd_dir = opendir(FD_DIR); + if (!proc_fd_dir) { + /* No way to get a list of open fds. */ + _close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep); + } else { + struct dirent *dir_entry; +#ifdef HAVE_DIRFD + int fd_used_by_opendir = dirfd(proc_fd_dir); +#else + int fd_used_by_opendir = start_fd - 1; +#endif + errno = 0; + while ((dir_entry = readdir(proc_fd_dir))) { + int fd; + if ((fd = _pos_int_from_ascii(dir_entry->d_name)) < 0) + continue; /* Not a number. */ + if (fd != fd_used_by_opendir && fd >= start_fd && fd < end_fd && + !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) { + while (close(fd) < 0 && errno == EINTR); + } + errno = 0; + } + if (errno) { + /* readdir error, revert behavior. Highly Unlikely. */ + _close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep); + } + closedir(proc_fd_dir); + } +} + +#define _close_open_fd_range _close_open_fd_range_maybe_unsafe + +#endif /* else NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */ + + +/* + * This function is code executed in the child process immediately after fork + * to set things up and call exec(). + * + * All of the code in this function must only use async-signal-safe functions, + * listed at `man 7 signal` or + * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. + * + * This restriction is documented at + * http://www.opengroup.org/onlinepubs/009695399/functions/fork.html. + */ +static void +child_exec(char *const exec_array[], + char *const argv[], + char *const envp[], + const char *cwd, + int p2cread, int p2cwrite, + int c2pread, int c2pwrite, + int errread, int errwrite, + int errpipe_read, int errpipe_write, + int close_fds, int restore_signals, + int call_setsid, + PyObject *py_fds_to_keep, + PyObject *preexec_fn, + PyObject *preexec_fn_args_tuple) +{ + int i, saved_errno, unused, reached_preexec = 0; + PyObject *result; + const char* err_msg = ""; + /* Buffer large enough to hold a hex integer. We can't malloc. */ + char hex_errno[sizeof(saved_errno)*2+1]; + + /* Close parent's pipe ends. */ + if (p2cwrite != -1) { + POSIX_CALL(close(p2cwrite)); + } + if (c2pread != -1) { + POSIX_CALL(close(c2pread)); + } + if (errread != -1) { + POSIX_CALL(close(errread)); + } + POSIX_CALL(close(errpipe_read)); + + /* When duping fds, if there arises a situation where one of the fds is + either 0, 1 or 2, it is possible that it is overwritten (#12607). */ + if (c2pwrite == 0) + POSIX_CALL(c2pwrite = dup(c2pwrite)); + if (errwrite == 0 || errwrite == 1) + POSIX_CALL(errwrite = dup(errwrite)); + + /* Dup fds for child. + dup2() removes the CLOEXEC flag but we must do it ourselves if dup2() + would be a no-op (issue #10806). */ + if (p2cread == 0) { + int old = fcntl(p2cread, F_GETFD); + if (old != -1) + fcntl(p2cread, F_SETFD, old & ~FD_CLOEXEC); + } else if (p2cread != -1) { + POSIX_CALL(dup2(p2cread, 0)); /* stdin */ + } + if (c2pwrite == 1) { + int old = fcntl(c2pwrite, F_GETFD); + if (old != -1) + fcntl(c2pwrite, F_SETFD, old & ~FD_CLOEXEC); + } else if (c2pwrite != -1) { + POSIX_CALL(dup2(c2pwrite, 1)); /* stdout */ + } + if (errwrite == 2) { + int old = fcntl(errwrite, F_GETFD); + if (old != -1) + fcntl(errwrite, F_SETFD, old & ~FD_CLOEXEC); + } else if (errwrite != -1) { + POSIX_CALL(dup2(errwrite, 2)); /* stderr */ + } + + /* Close pipe fds. Make sure we don't close the same fd more than */ + /* once, or standard fds. */ + if (p2cread > 2) { + POSIX_CALL(close(p2cread)); + } + if (c2pwrite > 2 && c2pwrite != p2cread) { + POSIX_CALL(close(c2pwrite)); + } + if (errwrite != c2pwrite && errwrite != p2cread && errwrite > 2) { + POSIX_CALL(close(errwrite)); + } + + if (close_fds) { + int local_max_fd = max_fd; +#if defined(__NetBSD__) + local_max_fd = fcntl(0, F_MAXFD); + if (local_max_fd < 0) + local_max_fd = max_fd; +#endif + /* TODO HP-UX could use pstat_getproc() if anyone cares about it. */ + _close_open_fd_range(3, local_max_fd, py_fds_to_keep); + } + + if (cwd) + POSIX_CALL(chdir(cwd)); + + if (restore_signals) + _Py_RestoreSignals(); + +#ifdef HAVE_SETSID + if (call_setsid) + POSIX_CALL(setsid()); +#endif + + reached_preexec = 1; + if (preexec_fn != Py_None && preexec_fn_args_tuple) { + /* This is where the user has asked us to deadlock their program. */ + result = PyObject_Call(preexec_fn, preexec_fn_args_tuple, NULL); + if (result == NULL) { + /* Stringifying the exception or traceback would involve + * memory allocation and thus potential for deadlock. + * We've already faced potential deadlock by calling back + * into Python in the first place, so it probably doesn't + * matter but we avoid it to minimize the possibility. */ + err_msg = "Exception occurred in preexec_fn."; + errno = 0; /* We don't want to report an OSError. */ + goto error; + } + /* Py_DECREF(result); - We're about to exec so why bother? */ + } + + /* This loop matches the Lib/os.py _execvpe()'s PATH search when */ + /* given the executable_list generated by Lib/subprocess.py. */ + saved_errno = 0; + for (i = 0; exec_array[i] != NULL; ++i) { + const char *executable = exec_array[i]; + if (envp) { + execve(executable, argv, envp); + } else { + execv(executable, argv); + } + if (errno != ENOENT && errno != ENOTDIR && saved_errno == 0) { + saved_errno = errno; + } + } + /* Report the first exec error, not the last. */ + if (saved_errno) + errno = saved_errno; + +error: + saved_errno = errno; + /* Report the posix error to our parent process. */ + /* We ignore all write() return values as the total size of our writes is + * less than PIPEBUF and we cannot do anything about an error anyways. */ + if (saved_errno) { + char *cur; + unused = write(errpipe_write, "OSError:", 8); + cur = hex_errno + sizeof(hex_errno); + while (saved_errno != 0 && cur > hex_errno) { + *--cur = "0123456789ABCDEF"[saved_errno % 16]; + saved_errno /= 16; + } + unused = write(errpipe_write, cur, hex_errno + sizeof(hex_errno) - cur); + unused = write(errpipe_write, ":", 1); + if (!reached_preexec) { + /* Indicate to the parent that the error happened before exec(). */ + unused = write(errpipe_write, "noexec", 6); + } + /* 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, err_msg, strlen(err_msg)); + } + if (unused) return; /* silly? yes! avoids gcc compiler warning. */ +} + + +static PyObject * +subprocess_fork_exec(PyObject* self, PyObject *args) +{ + PyObject *gc_module = NULL; + PyObject *executable_list, *py_close_fds, *py_fds_to_keep; + PyObject *env_list, *preexec_fn; + PyObject *process_args, *converted_args = NULL, *fast_args = NULL; + PyObject *preexec_fn_args_tuple = NULL; + int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite; + int errpipe_read, errpipe_write, close_fds, restore_signals; + int call_setsid; + PyObject *cwd_obj, *cwd_obj2; + const char *cwd; + pid_t pid; + int need_to_reenable_gc = 0; + char *const *exec_array, *const *argv = NULL, *const *envp = NULL; + Py_ssize_t arg_num; + + if (!PyArg_ParseTuple( + args, "OOOOOOiiiiiiiiiiO:fork_exec", + &process_args, &executable_list, &py_close_fds, &py_fds_to_keep, + &cwd_obj, &env_list, + &p2cread, &p2cwrite, &c2pread, &c2pwrite, + &errread, &errwrite, &errpipe_read, &errpipe_write, + &restore_signals, &call_setsid, &preexec_fn)) + return NULL; + + close_fds = PyObject_IsTrue(py_close_fds); + if (close_fds < 0) + return NULL; + if (close_fds && errpipe_write < 3) { /* precondition */ + PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3"); + return NULL; + } + if (PySequence_Length(py_fds_to_keep) < 0) { + PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep"); + return NULL; + } + if (_sanity_check_python_fd_sequence(py_fds_to_keep)) { + PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep"); + return NULL; + } + + /* We need to call gc.disable() when we'll be calling preexec_fn */ + if (preexec_fn != Py_None) { + PyObject *result; + gc_module = PyImport_ImportModule("gc"); + if (gc_module == NULL) + return NULL; + result = PyObject_CallMethod(gc_module, "isenabled", NULL); + if (result == NULL) { + Py_DECREF(gc_module); + return NULL; + } + need_to_reenable_gc = PyObject_IsTrue(result); + Py_DECREF(result); + if (need_to_reenable_gc == -1) { + Py_DECREF(gc_module); + return NULL; + } + result = PyObject_CallMethod(gc_module, "disable", NULL); + if (result == NULL) { + Py_DECREF(gc_module); + return NULL; + } + Py_DECREF(result); + } + + exec_array = _PySequence_BytesToCharpArray(executable_list); + if (!exec_array) { + Py_XDECREF(gc_module); + return NULL; + } + + /* Convert args and env into appropriate arguments for exec() */ + /* These conversions are done in the parent process to avoid allocating + or freeing memory in the child process. */ + if (process_args != Py_None) { + Py_ssize_t num_args; + /* Equivalent to: */ + /* tuple(PyUnicode_FSConverter(arg) for arg in process_args) */ + fast_args = PySequence_Fast(process_args, "argv must be a tuple"); + if (fast_args == NULL) + goto cleanup; + num_args = PySequence_Fast_GET_SIZE(fast_args); + converted_args = PyTuple_New(num_args); + if (converted_args == NULL) + goto cleanup; + for (arg_num = 0; arg_num < num_args; ++arg_num) { + PyObject *borrowed_arg, *converted_arg; + borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num); + if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0) + goto cleanup; + PyTuple_SET_ITEM(converted_args, arg_num, converted_arg); + } + + argv = _PySequence_BytesToCharpArray(converted_args); + Py_CLEAR(converted_args); + Py_CLEAR(fast_args); + if (!argv) + goto cleanup; + } + + if (env_list != Py_None) { + envp = _PySequence_BytesToCharpArray(env_list); + if (!envp) + goto cleanup; + } + + if (preexec_fn != Py_None) { + preexec_fn_args_tuple = PyTuple_New(0); + if (!preexec_fn_args_tuple) + goto cleanup; + _PyImport_AcquireLock(); + } + + if (cwd_obj != Py_None) { + if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0) + goto cleanup; + cwd = PyBytes_AsString(cwd_obj2); + } else { + cwd = NULL; + cwd_obj2 = NULL; + } + + pid = fork(); + if (pid == 0) { + /* Child process */ + /* + * Code from here to _exit() must only use async-signal-safe functions, + * listed at `man 7 signal` or + * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. + */ + + if (preexec_fn != Py_None) { + /* We'll be calling back into Python later so we need to do this. + * This call may not be async-signal-safe but neither is calling + * back into Python. The user asked us to use hope as a strategy + * to avoid deadlock... */ + PyOS_AfterFork(); + } + + child_exec(exec_array, argv, envp, cwd, + p2cread, p2cwrite, c2pread, c2pwrite, + errread, errwrite, errpipe_read, errpipe_write, + close_fds, restore_signals, call_setsid, + py_fds_to_keep, preexec_fn, preexec_fn_args_tuple); + _exit(255); + return NULL; /* Dead code to avoid a potential compiler warning. */ + } + Py_XDECREF(cwd_obj2); + + if (pid == -1) { + /* Capture the errno exception before errno can be clobbered. */ + PyErr_SetFromErrno(PyExc_OSError); + } + if (preexec_fn != Py_None && + _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) { + PyErr_SetString(PyExc_RuntimeError, + "not holding the import lock"); + } + + /* Parent process */ + if (envp) + _Py_FreeCharPArray(envp); + if (argv) + _Py_FreeCharPArray(argv); + _Py_FreeCharPArray(exec_array); + + /* Reenable gc in the parent process (or if fork failed). */ + if (need_to_reenable_gc && _enable_gc(gc_module)) { + Py_XDECREF(gc_module); + return NULL; + } + Py_XDECREF(preexec_fn_args_tuple); + Py_XDECREF(gc_module); + + if (pid == -1) + return NULL; /* fork() failed. Exception set earlier. */ + + return PyLong_FromPid(pid); + +cleanup: + if (envp) + _Py_FreeCharPArray(envp); + if (argv) + _Py_FreeCharPArray(argv); + _Py_FreeCharPArray(exec_array); + Py_XDECREF(converted_args); + Py_XDECREF(fast_args); + Py_XDECREF(preexec_fn_args_tuple); + + /* Reenable gc if it was disabled. */ + if (need_to_reenable_gc) + _enable_gc(gc_module); + Py_XDECREF(gc_module); + return NULL; +} + + +PyDoc_STRVAR(subprocess_fork_exec_doc, +"fork_exec(args, executable_list, close_fds, cwd, env,\n\ + p2cread, p2cwrite, c2pread, c2pwrite,\n\ + errread, errwrite, errpipe_read, errpipe_write,\n\ + restore_signals, call_setsid, preexec_fn)\n\ +\n\ +Forks a child process, closes parent file descriptors as appropriate in the\n\ +child and dups the few that are needed before calling exec() in the child\n\ +process.\n\ +\n\ +The preexec_fn, if supplied, will be called immediately before exec.\n\ +WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\ + It may trigger infrequent, difficult to debug deadlocks.\n\ +\n\ +If an error occurs in the child process before the exec, it is\n\ +serialized and written to the errpipe_write fd per subprocess.py.\n\ +\n\ +Returns: the child process's PID.\n\ +\n\ +Raises: Only on an error in the parent process.\n\ +"); + +PyDoc_STRVAR(subprocess_cloexec_pipe_doc, +"cloexec_pipe() -> (read_end, write_end)\n\n\ +Create a pipe whose ends have the cloexec flag set."); + +static PyObject * +subprocess_cloexec_pipe(PyObject *self, PyObject *noargs) +{ + int fds[2]; + int res; +#ifdef HAVE_PIPE2 + Py_BEGIN_ALLOW_THREADS + res = pipe2(fds, O_CLOEXEC); + Py_END_ALLOW_THREADS + if (res != 0 && errno == ENOSYS) + { + { +#endif + /* We hold the GIL which offers some protection from other code calling + * fork() before the CLOEXEC flags have been set but we can't guarantee + * anything without pipe2(). */ + long oldflags; + + res = pipe(fds); + + if (res == 0) { + oldflags = fcntl(fds[0], F_GETFD, 0); + if (oldflags < 0) res = oldflags; + } + if (res == 0) + res = fcntl(fds[0], F_SETFD, oldflags | FD_CLOEXEC); + + if (res == 0) { + oldflags = fcntl(fds[1], F_GETFD, 0); + if (oldflags < 0) res = oldflags; + } + if (res == 0) + res = fcntl(fds[1], F_SETFD, oldflags | FD_CLOEXEC); +#ifdef HAVE_PIPE2 + } + } +#endif + if (res != 0) + return PyErr_SetFromErrno(PyExc_OSError); + return Py_BuildValue("(ii)", fds[0], fds[1]); +} + +/* module level code ********************************************************/ + +PyDoc_STRVAR(module_doc, +"A POSIX helper for the subprocess module."); + + +static PyMethodDef module_methods[] = { + {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc}, + {"cloexec_pipe", subprocess_cloexec_pipe, METH_NOARGS, subprocess_cloexec_pipe_doc}, + {NULL, NULL} /* sentinel */ +}; + + +static struct PyModuleDef _posixsubprocessmodule = { + PyModuleDef_HEAD_INIT, + "_posixsubprocess", + module_doc, + -1, /* No memory is needed. */ + module_methods, +}; + +PyMODINIT_FUNC +PyInit__posixsubprocess(void) +{ +#ifdef _SC_OPEN_MAX + max_fd = sysconf(_SC_OPEN_MAX); + if (max_fd == -1) +#endif + max_fd = 256; /* Matches Lib/subprocess.py */ + + return PyModule_Create(&_posixsubprocessmodule); +} diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 8bb9e37d16b..bc9b04a27b5 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -231,7 +231,7 @@ random_seed(RandomObject *self, PyObject *args) /* If the arg is an int or long, use its absolute value; else use * the absolute value of its hash code. */ - if (PyInt_Check(arg) || PyLong_Check(arg)) + if (PyLong_Check(arg)) n = PyNumber_Absolute(arg); else { long hash = PyObject_Hash(arg); @@ -259,7 +259,7 @@ random_seed(RandomObject *self, PyObject *args) masklower = PyLong_FromUnsignedLong(0xffffffffU); if (masklower == NULL) goto Done; - thirtytwo = PyInt_FromLong(32L); + thirtytwo = PyLong_FromLong(32L); if (thirtytwo == NULL) goto Done; while ((err=PyObject_IsTrue(n))) { @@ -369,87 +369,6 @@ random_setstate(RandomObject *self, PyObject *state) return Py_None; } -/* -Jumpahead should be a fast way advance the generator n-steps ahead, but -lacking a formula for that, the next best is to use n and the existing -state to create a new state far away from the original. - -The generator uses constant spaced additive feedback, so shuffling the -state elements ought to produce a state which would not be encountered -(in the near term) by calls to random(). Shuffling is normally -implemented by swapping the ith element with another element ranging -from 0 to i inclusive. That allows the element to have the possibility -of not being moved. Since the goal is to produce a new, different -state, the swap element is ranged from 0 to i-1 inclusive. This assures -that each element gets moved at least once. - -To make sure that consecutive calls to jumpahead(n) produce different -states (even in the rare case of involutory shuffles), i+1 is added to -each element at position i. Successive calls are then guaranteed to -have changing (growing) values as well as shuffled positions. - -Finally, the self->index value is set to N so that the generator itself -kicks in on the next call to random(). This assures that all results -have been through the generator and do not just reflect alterations to -the underlying state. -*/ - -static PyObject * -random_jumpahead(RandomObject *self, PyObject *n) -{ - long i, j; - PyObject *iobj; - PyObject *remobj; - unsigned long *mt, tmp, nonzero; - - if (!PyInt_Check(n) && !PyLong_Check(n)) { - PyErr_Format(PyExc_TypeError, "jumpahead requires an " - "integer, not '%s'", - Py_TYPE(n)->tp_name); - return NULL; - } - - mt = self->state; - for (i = N-1; i > 1; i--) { - iobj = PyInt_FromLong(i); - if (iobj == NULL) - return NULL; - remobj = PyNumber_Remainder(n, iobj); - Py_DECREF(iobj); - if (remobj == NULL) - return NULL; - j = PyInt_AsLong(remobj); - Py_DECREF(remobj); - if (j == -1L && PyErr_Occurred()) - return NULL; - tmp = mt[i]; - mt[i] = mt[j]; - mt[j] = tmp; - } - - nonzero = 0; - for (i = 1; i < N; i++) { - mt[i] += i+1; - mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ - nonzero |= mt[i]; - } - - /* Ensure the state is nonzero: in the unlikely event that mt[1] through - mt[N-1] are all zero, set the MSB of mt[0] (see issue #14591). In the - normal case, we fall back to the pre-issue 14591 behaviour for mt[0]. */ - if (nonzero) { - mt[0] += 1; - mt[0] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ - } - else { - mt[0] = 0x80000000UL; - } - - self->index = N; - Py_INCREF(Py_None); - return Py_None; -} - static PyObject * random_getrandbits(RandomObject *self, PyObject *args) { @@ -521,9 +440,6 @@ static PyMethodDef random_methods[] = { PyDoc_STR("getstate() -> tuple containing the current state.")}, {"setstate", (PyCFunction)random_setstate, METH_O, PyDoc_STR("setstate(state) -> None. Restores generator state.")}, - {"jumpahead", (PyCFunction)random_jumpahead, METH_O, - PyDoc_STR("jumpahead(int) -> None. Create new state from " - "existing state and integer.")}, {"getrandbits", (PyCFunction)random_getrandbits, METH_VARARGS, PyDoc_STR("getrandbits(k) -> x. Generates a long int with " "k random bits.")}, @@ -543,7 +459,7 @@ static PyTypeObject Random_Type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -573,23 +489,37 @@ static PyTypeObject Random_Type = { 0, /*tp_init*/ 0, /*tp_alloc*/ random_new, /*tp_new*/ - _PyObject_Del, /*tp_free*/ + PyObject_Free, /*tp_free*/ 0, /*tp_is_gc*/ }; PyDoc_STRVAR(module_doc, "Module implements the Mersenne Twister random number generator."); + +static struct PyModuleDef _randommodule = { + PyModuleDef_HEAD_INIT, + "_random", + module_doc, + -1, + NULL, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_random(void) +PyInit__random(void) { PyObject *m; if (PyType_Ready(&Random_Type) < 0) - return; - m = Py_InitModule3("_random", NULL, module_doc); + return NULL; + m = PyModule_Create(&_randommodule); if (m == NULL) - return; + return NULL; Py_INCREF(&Random_Type); PyModule_AddObject(m, "Random", (PyObject *)&Random_Type); + return m; } diff --git a/Modules/_scproxy.c b/Modules/_scproxy.c new file mode 100644 index 00000000000..3b2a38ea32f --- /dev/null +++ b/Modules/_scproxy.c @@ -0,0 +1,261 @@ +/* + * Helper method for urllib to fetch the proxy configuration settings + * using the SystemConfiguration framework. + */ +#include <Python.h> +#include <SystemConfiguration/SystemConfiguration.h> + +static int32_t +cfnum_to_int32(CFNumberRef num) +{ + int32_t result; + + CFNumberGetValue(num, kCFNumberSInt32Type, &result); + return result; +} + +static PyObject* +cfstring_to_pystring(CFStringRef ref) +{ + const char* s; + + s = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8); + if (s) { + return PyUnicode_DecodeUTF8( + s, strlen(s), NULL); + + } else { + CFIndex len = CFStringGetLength(ref); + Boolean ok; + PyObject* result; + char* buf; + + buf = PyMem_Malloc(len*4); + if (buf == NULL) { + PyErr_NoMemory(); + return NULL; + } + + ok = CFStringGetCString(ref, + buf, len * 4, + kCFStringEncodingUTF8); + if (!ok) { + PyMem_Free(buf); + return NULL; + } else { + result = PyUnicode_DecodeUTF8( + buf, strlen(buf), NULL); + PyMem_Free(buf); + } + return result; + } +} + + +static PyObject* +get_proxy_settings(PyObject* mod __attribute__((__unused__))) +{ + CFDictionaryRef proxyDict = NULL; + CFNumberRef aNum = NULL; + CFArrayRef anArray = NULL; + PyObject* result = NULL; + PyObject* v; + int r; + + proxyDict = SCDynamicStoreCopyProxies(NULL); + if (!proxyDict) { + Py_INCREF(Py_None); + return Py_None; + } + + result = PyDict_New(); + if (result == NULL) goto error; + + if (&kSCPropNetProxiesExcludeSimpleHostnames != NULL) { + aNum = CFDictionaryGetValue(proxyDict, + kSCPropNetProxiesExcludeSimpleHostnames); + if (aNum == NULL) { + v = PyBool_FromLong(0); + } else { + v = PyBool_FromLong(cfnum_to_int32(aNum)); + } + } else { + v = PyBool_FromLong(0); + } + + if (v == NULL) goto error; + + r = PyDict_SetItemString(result, "exclude_simple", v); + Py_DECREF(v); v = NULL; + if (r == -1) goto error; + + anArray = CFDictionaryGetValue(proxyDict, + kSCPropNetProxiesExceptionsList); + if (anArray != NULL) { + CFIndex len = CFArrayGetCount(anArray); + CFIndex i; + v = PyTuple_New(len); + if (v == NULL) goto error; + + r = PyDict_SetItemString(result, "exceptions", v); + Py_DECREF(v); + if (r == -1) goto error; + + for (i = 0; i < len; i++) { + CFStringRef aString = NULL; + + aString = CFArrayGetValueAtIndex(anArray, i); + if (aString == NULL) { + PyTuple_SetItem(v, i, Py_None); + Py_INCREF(Py_None); + } else { + PyObject* t = cfstring_to_pystring(aString); + if (!t) { + PyTuple_SetItem(v, i, Py_None); + Py_INCREF(Py_None); + } else { + PyTuple_SetItem(v, i, t); + } + } + } + } + + CFRelease(proxyDict); + return result; + +error: + if (proxyDict) CFRelease(proxyDict); + Py_XDECREF(result); + return NULL; +} + +static int +set_proxy(PyObject* proxies, char* proto, CFDictionaryRef proxyDict, + CFStringRef enabledKey, + CFStringRef hostKey, CFStringRef portKey) +{ + CFNumberRef aNum; + + aNum = CFDictionaryGetValue(proxyDict, enabledKey); + if (aNum && cfnum_to_int32(aNum)) { + CFStringRef hostString; + + hostString = CFDictionaryGetValue(proxyDict, hostKey); + aNum = CFDictionaryGetValue(proxyDict, portKey); + + if (hostString) { + int r; + PyObject* h = cfstring_to_pystring(hostString); + PyObject* v; + if (h) { + if (aNum) { + int32_t port = cfnum_to_int32(aNum); + v = PyUnicode_FromFormat("http://%U:%ld", + h, (long)port); + } else { + v = PyUnicode_FromFormat("http://%U", h); + } + Py_DECREF(h); + if (!v) return -1; + r = PyDict_SetItemString(proxies, proto, + v); + Py_DECREF(v); + return r; + } + } + + } + return 0; +} + + + +static PyObject* +get_proxies(PyObject* mod __attribute__((__unused__))) +{ + PyObject* result = NULL; + int r; + CFDictionaryRef proxyDict = NULL; + + proxyDict = SCDynamicStoreCopyProxies(NULL); + if (proxyDict == NULL) { + return PyDict_New(); + } + + result = PyDict_New(); + if (result == NULL) goto error; + + r = set_proxy(result, "http", proxyDict, + kSCPropNetProxiesHTTPEnable, + kSCPropNetProxiesHTTPProxy, + kSCPropNetProxiesHTTPPort); + if (r == -1) goto error; + r = set_proxy(result, "https", proxyDict, + kSCPropNetProxiesHTTPSEnable, + kSCPropNetProxiesHTTPSProxy, + kSCPropNetProxiesHTTPSPort); + if (r == -1) goto error; + r = set_proxy(result, "ftp", proxyDict, + kSCPropNetProxiesFTPEnable, + kSCPropNetProxiesFTPProxy, + kSCPropNetProxiesFTPPort); + if (r == -1) goto error; + r = set_proxy(result, "gopher", proxyDict, + kSCPropNetProxiesGopherEnable, + kSCPropNetProxiesGopherProxy, + kSCPropNetProxiesGopherPort); + if (r == -1) goto error; + + CFRelease(proxyDict); + return result; +error: + if (proxyDict) CFRelease(proxyDict); + Py_XDECREF(result); + return NULL; +} + +static PyMethodDef mod_methods[] = { + { + "_get_proxy_settings", + (PyCFunction)get_proxy_settings, + METH_NOARGS, + NULL, + }, + { + "_get_proxies", + (PyCFunction)get_proxies, + METH_NOARGS, + NULL, + }, + { 0, 0, 0, 0 } +}; + + + +static struct PyModuleDef mod_module = { + PyModuleDef_HEAD_INIT, + "_scproxy", + NULL, + -1, + mod_methods, + NULL, + NULL, + NULL, + NULL +}; + + +#ifdef __cplusplus +extern "C" { +#endif + +PyObject* +PyInit__scproxy(void) +{ + return PyModule_Create(&mod_module); +} + +#ifdef __cplusplus +} +#endif + diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c index 0653367ddb9..735a2426ccf 100644 --- a/Modules/_sqlite/cache.c +++ b/Modules/_sqlite/cache.c @@ -1,6 +1,6 @@ /* cache .c - a LRU cache * - * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * @@ -242,12 +242,12 @@ PyObject* pysqlite_cache_display(pysqlite_Cache* self, PyObject* args) if (!fmt_args) { return NULL; } - template = PyString_FromString("%s <- %s ->%s\n"); + template = PyUnicode_FromString("%s <- %s ->%s\n"); if (!template) { Py_DECREF(fmt_args); return NULL; } - display_str = PyString_Format(template, fmt_args); + display_str = PyUnicode_Format(template, fmt_args); Py_DECREF(template); Py_DECREF(fmt_args); if (!display_str) { @@ -283,7 +283,7 @@ PyTypeObject pysqlite_NodeType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -325,7 +325,7 @@ PyTypeObject pysqlite_CacheType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_sqlite/cache.h b/Modules/_sqlite/cache.h index b09517c1513..a133903961d 100644 --- a/Modules/_sqlite/cache.h +++ b/Modules/_sqlite/cache.h @@ -1,6 +1,6 @@ /* cache.h - definitions for the LRU cache * - * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index a646513c4a1..9d4c72f695b 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -1,9 +1,9 @@ /* connection.c - the connection type * - * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2004-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. @@ -23,6 +23,7 @@ #include "cache.h" #include "module.h" +#include "structmember.h" #include "connection.h" #include "statement.h" #include "cursor.h" @@ -61,7 +62,7 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject { static char *kwlist[] = {"database", "timeout", "detect_types", "isolation_level", "check_same_thread", "factory", "cached_statements", NULL, NULL}; - PyObject* database; + char* database; int detect_types = 0; PyObject* isolation_level = NULL; PyObject* factory = NULL; @@ -69,12 +70,8 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject int cached_statements = 100; double timeout = 5.0; int rc; - PyObject* class_attr = NULL; - PyObject* class_attr_str = NULL; - int is_apsw_connection = 0; - PyObject* database_utf8; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|diOiOi", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|diOiOi", kwlist, &database, &timeout, &detect_types, &isolation_level, &check_same_thread, &factory, &cached_statements)) { return -1; @@ -94,57 +91,17 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject Py_INCREF(&PyUnicode_Type); self->text_factory = (PyObject*)&PyUnicode_Type; - if (PyString_Check(database) || PyUnicode_Check(database)) { - if (PyString_Check(database)) { - database_utf8 = database; - Py_INCREF(database_utf8); - } else { - database_utf8 = PyUnicode_AsUTF8String(database); - if (!database_utf8) { - return -1; - } - } - - Py_BEGIN_ALLOW_THREADS - rc = sqlite3_open(PyString_AsString(database_utf8), &self->db); - Py_END_ALLOW_THREADS - - Py_DECREF(database_utf8); - - if (rc != SQLITE_OK) { - _pysqlite_seterror(self->db, NULL); - return -1; - } - } else { - /* Create a pysqlite connection from a APSW connection */ - class_attr = PyObject_GetAttrString(database, "__class__"); - if (class_attr) { - class_attr_str = PyObject_Str(class_attr); - if (class_attr_str) { - if (strcmp(PyString_AsString(class_attr_str), "<type 'apsw.Connection'>") == 0) { - /* In the APSW Connection object, the first entry after - * PyObject_HEAD is the sqlite3* we want to get hold of. - * Luckily, this is the same layout as we have in our - * pysqlite_Connection */ - self->db = ((pysqlite_Connection*)database)->db; - - Py_INCREF(database); - self->apsw_connection = database; - is_apsw_connection = 1; - } - } - } - Py_XDECREF(class_attr_str); - Py_XDECREF(class_attr); + Py_BEGIN_ALLOW_THREADS + rc = sqlite3_open(database, &self->db); + Py_END_ALLOW_THREADS - if (!is_apsw_connection) { - PyErr_SetString(PyExc_ValueError, "database parameter must be string or APSW Connection object"); - return -1; - } + if (rc != SQLITE_OK) { + _pysqlite_seterror(self->db, NULL); + return -1; } if (!isolation_level) { - isolation_level = PyString_FromString(""); + isolation_level = PyUnicode_FromString(""); if (!isolation_level) { return -1; } @@ -243,11 +200,13 @@ void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset weakref = PyList_GetItem(self->statements, i); statement = PyWeakref_GetObject(weakref); if (statement != Py_None) { + Py_INCREF(statement); if (action == ACTION_RESET) { (void)pysqlite_statement_reset((pysqlite_Statement*)statement); } else { (void)pysqlite_statement_finalize((pysqlite_Statement*)statement); } + Py_DECREF(statement); } } @@ -264,8 +223,6 @@ void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset void pysqlite_connection_dealloc(pysqlite_Connection* self) { - PyObject* ret = NULL; - Py_XDECREF(self->statement_cache); /* Clean up if user has not called .close() explicitly. */ @@ -273,10 +230,6 @@ void pysqlite_connection_dealloc(pysqlite_Connection* self) Py_BEGIN_ALLOW_THREADS sqlite3_close(self->db); Py_END_ALLOW_THREADS - } else if (self->apsw_connection) { - ret = PyObject_CallMethod(self->apsw_connection, "close", ""); - Py_XDECREF(ret); - Py_XDECREF(self->apsw_connection); } if (self->begin_statement) { @@ -290,7 +243,7 @@ void pysqlite_connection_dealloc(pysqlite_Connection* self) Py_XDECREF(self->statements); Py_XDECREF(self->cursors); - self->ob_type->tp_free((PyObject*)self); + Py_TYPE(self)->tp_free((PyObject*)self); } /* @@ -353,7 +306,6 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args) { - PyObject* ret; int rc; if (!pysqlite_check_thread(self)) { @@ -363,23 +315,15 @@ PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args) pysqlite_do_all_statements(self, ACTION_FINALIZE, 1); if (self->db) { - if (self->apsw_connection) { - ret = PyObject_CallMethod(self->apsw_connection, "close", ""); - Py_XDECREF(ret); - Py_XDECREF(self->apsw_connection); - self->apsw_connection = NULL; - self->db = NULL; - } else { - Py_BEGIN_ALLOW_THREADS - rc = sqlite3_close(self->db); - Py_END_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS + rc = sqlite3_close(self->db); + Py_END_ALLOW_THREADS - if (rc != SQLITE_OK) { - _pysqlite_seterror(self->db, NULL); - return NULL; - } else { - self->db = NULL; - } + if (rc != SQLITE_OK) { + _pysqlite_seterror(self->db, NULL); + return NULL; + } else { + self->db = NULL; } } @@ -542,32 +486,25 @@ void _pysqlite_set_result(sqlite3_context* context, PyObject* py_val) { const char* buffer; Py_ssize_t buflen; - PyObject* stringval; if ((!py_val) || PyErr_Occurred()) { sqlite3_result_null(context); } else if (py_val == Py_None) { sqlite3_result_null(context); - } else if (PyInt_Check(py_val)) { - sqlite3_result_int64(context, (sqlite_int64)PyInt_AsLong(py_val)); } else if (PyLong_Check(py_val)) { sqlite3_result_int64(context, PyLong_AsLongLong(py_val)); } else if (PyFloat_Check(py_val)) { sqlite3_result_double(context, PyFloat_AsDouble(py_val)); - } else if (PyBuffer_Check(py_val)) { + } else if (PyUnicode_Check(py_val)) { + char *str = _PyUnicode_AsString(py_val); + if (str != NULL) + sqlite3_result_text(context, str, -1, SQLITE_TRANSIENT); + } else if (PyObject_CheckBuffer(py_val)) { if (PyObject_AsCharBuffer(py_val, &buffer, &buflen) != 0) { PyErr_SetString(PyExc_ValueError, "could not convert BLOB to buffer"); } else { sqlite3_result_blob(context, buffer, buflen, SQLITE_TRANSIENT); } - } else if (PyString_Check(py_val)) { - sqlite3_result_text(context, PyString_AsString(py_val), -1, SQLITE_TRANSIENT); - } else if (PyUnicode_Check(py_val)) { - stringval = PyUnicode_AsUTF8String(py_val); - if (stringval) { - sqlite3_result_text(context, PyString_AsString(stringval), -1, SQLITE_TRANSIENT); - Py_DECREF(stringval); - } } else { /* TODO: raise error */ } @@ -580,9 +517,7 @@ PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_ sqlite3_value* cur_value; PyObject* cur_py_value; const char* val_str; - sqlite_int64 val_int; Py_ssize_t buflen; - void* raw_buffer; args = PyTuple_New(argc); if (!args) { @@ -593,18 +528,14 @@ PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_ cur_value = argv[i]; switch (sqlite3_value_type(argv[i])) { case SQLITE_INTEGER: - val_int = sqlite3_value_int64(cur_value); - if(val_int < LONG_MIN || val_int > LONG_MAX) - cur_py_value = PyLong_FromLongLong(val_int); - else - cur_py_value = PyInt_FromLong((long)val_int); + cur_py_value = PyLong_FromLongLong(sqlite3_value_int64(cur_value)); break; case SQLITE_FLOAT: cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value)); break; case SQLITE_TEXT: val_str = (const char*)sqlite3_value_text(cur_value); - cur_py_value = PyUnicode_DecodeUTF8(val_str, strlen(val_str), NULL); + cur_py_value = PyUnicode_FromString(val_str); /* TODO: have a way to show errors here */ if (!cur_py_value) { PyErr_Clear(); @@ -614,16 +545,8 @@ PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_ break; case SQLITE_BLOB: buflen = sqlite3_value_bytes(cur_value); - cur_py_value = PyBuffer_New(buflen); - if (!cur_py_value) { - break; - } - if (PyObject_AsWriteBuffer(cur_py_value, &raw_buffer, &buflen)) { - Py_DECREF(cur_py_value); - cur_py_value = NULL; - break; - } - memcpy(raw_buffer, sqlite3_value_blob(cur_value), buflen); + cur_py_value = PyBytes_FromStringAndSize( + sqlite3_value_blob(cur_value), buflen); break; case SQLITE_NULL: default: @@ -748,6 +671,7 @@ void _pysqlite_final_callback(sqlite3_context* context) { PyObject* function_result = NULL; PyObject** aggregate_instance; + PyObject* aggregate_class; #ifdef WITH_THREAD PyGILState_STATE threadstate; @@ -755,6 +679,8 @@ void _pysqlite_final_callback(sqlite3_context* context) threadstate = PyGILState_Ensure(); #endif + aggregate_class = (PyObject*)sqlite3_user_data(context); + aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*)); if (!*aggregate_instance) { /* this branch is executed if there was an exception in the aggregate's @@ -934,8 +860,8 @@ static int _authorizer_callback(void* user_arg, int action, const char* arg1, co rc = SQLITE_DENY; } else { - if (PyInt_Check(ret)) { - rc = (int)PyInt_AsLong(ret); + if (PyLong_Check(ret)) { + rc = (int)PyLong_AsLong(ret); } else { rc = SQLITE_DENY; } @@ -967,7 +893,7 @@ static int _progress_handler(void* user_arg) } /* abort query if error occurred */ - rc = 1; + rc = 1; } else { rc = (int)PyObject_IsTrue(ret); Py_DECREF(ret); @@ -1124,7 +1050,7 @@ static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, Py { PyObject* res; PyObject* begin_statement; - char* begin_statement_str; + static PyObject* begin_word; Py_XDECREF(self->isolation_level); @@ -1145,30 +1071,33 @@ static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, Py self->inTransaction = 0; } else { + const char *statement; + Py_ssize_t size; + Py_INCREF(isolation_level); self->isolation_level = isolation_level; - begin_statement = PyString_FromString("BEGIN "); - if (!begin_statement) { - return -1; + if (!begin_word) { + begin_word = PyUnicode_FromString("BEGIN "); + if (!begin_word) return -1; } - PyString_Concat(&begin_statement, isolation_level); + begin_statement = PyUnicode_Concat(begin_word, isolation_level); if (!begin_statement) { return -1; } - begin_statement_str = PyString_AsString(begin_statement); - if (!begin_statement_str) { + statement = _PyUnicode_AsStringAndSize(begin_statement, &size); + if (!statement) { Py_DECREF(begin_statement); return -1; } - self->begin_statement = PyMem_Malloc(strlen(begin_statement_str) + 2); + self->begin_statement = PyMem_Malloc(size + 2); if (!self->begin_statement) { Py_DECREF(begin_statement); return -1; } - strcpy(self->begin_statement, begin_statement_str); + strcpy(self->begin_statement, statement); Py_DECREF(begin_statement); } @@ -1346,8 +1275,8 @@ pysqlite_collation_callback( goto finally; } - string1 = PyString_FromStringAndSize((const char*)text1_data, text1_length); - string2 = PyString_FromStringAndSize((const char*)text2_data, text2_length); + string1 = PyUnicode_FromStringAndSize((const char*)text1_data, text1_length); + string2 = PyUnicode_FromStringAndSize((const char*)text2_data, text2_length); if (!string1 || !string2) { goto finally; /* failed to allocate strings */ @@ -1360,7 +1289,7 @@ pysqlite_collation_callback( goto finally; } - result = PyInt_AsLong(retval); + result = PyLong_AsLong(retval); if (PyErr_Occurred()) { result = 0; } @@ -1446,14 +1375,16 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) PyObject* uppercase_name = 0; PyObject* name; PyObject* retval; - char* chk; + Py_UNICODE* chk; + Py_ssize_t i, len; + char *uppercase_name_str; int rc; if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { goto finally; } - if (!PyArg_ParseTuple(args, "O!O:create_collation(name, callback)", &PyString_Type, &name, &callable)) { + if (!PyArg_ParseTuple(args, "O!O:create_collation(name, callback)", &PyUnicode_Type, &name, &callable)) { goto finally; } @@ -1462,19 +1393,24 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) goto finally; } - chk = PyString_AsString(uppercase_name); - while (*chk) { + len = PyUnicode_GET_SIZE(uppercase_name); + chk = PyUnicode_AS_UNICODE(uppercase_name); + for (i=0; i<len; i++, chk++) { if ((*chk >= '0' && *chk <= '9') || (*chk >= 'A' && *chk <= 'Z') || (*chk == '_')) { - chk++; + continue; } else { PyErr_SetString(pysqlite_ProgrammingError, "invalid character in collation name"); goto finally; } } + uppercase_name_str = _PyUnicode_AsString(uppercase_name); + if (!uppercase_name_str) + goto finally; + if (callable != Py_None && !PyCallable_Check(callable)) { PyErr_SetString(PyExc_TypeError, "parameter must be callable"); goto finally; @@ -1489,7 +1425,7 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) } rc = sqlite3_create_collation(self->db, - PyString_AsString(uppercase_name), + uppercase_name_str, SQLITE_UTF8, (callable != Py_None) ? callable : NULL, (callable != Py_None) ? pysqlite_collation_callback : NULL); @@ -1546,8 +1482,7 @@ pysqlite_connection_exit(pysqlite_Connection* self, PyObject* args) } Py_DECREF(result); - Py_INCREF(Py_False); - return Py_False; + Py_RETURN_FALSE; } static char connection_doc[] = @@ -1603,18 +1538,19 @@ static PyMethodDef connection_methods[] = { static struct PyMemberDef connection_members[] = { - {"Warning", T_OBJECT, offsetof(pysqlite_Connection, Warning), RO}, - {"Error", T_OBJECT, offsetof(pysqlite_Connection, Error), RO}, - {"InterfaceError", T_OBJECT, offsetof(pysqlite_Connection, InterfaceError), RO}, - {"DatabaseError", T_OBJECT, offsetof(pysqlite_Connection, DatabaseError), RO}, - {"DataError", T_OBJECT, offsetof(pysqlite_Connection, DataError), RO}, - {"OperationalError", T_OBJECT, offsetof(pysqlite_Connection, OperationalError), RO}, - {"IntegrityError", T_OBJECT, offsetof(pysqlite_Connection, IntegrityError), RO}, - {"InternalError", T_OBJECT, offsetof(pysqlite_Connection, InternalError), RO}, - {"ProgrammingError", T_OBJECT, offsetof(pysqlite_Connection, ProgrammingError), RO}, - {"NotSupportedError", T_OBJECT, offsetof(pysqlite_Connection, NotSupportedError), RO}, + {"Warning", T_OBJECT, offsetof(pysqlite_Connection, Warning), READONLY}, + {"Error", T_OBJECT, offsetof(pysqlite_Connection, Error), READONLY}, + {"InterfaceError", T_OBJECT, offsetof(pysqlite_Connection, InterfaceError), READONLY}, + {"DatabaseError", T_OBJECT, offsetof(pysqlite_Connection, DatabaseError), READONLY}, + {"DataError", T_OBJECT, offsetof(pysqlite_Connection, DataError), READONLY}, + {"OperationalError", T_OBJECT, offsetof(pysqlite_Connection, OperationalError), READONLY}, + {"IntegrityError", T_OBJECT, offsetof(pysqlite_Connection, IntegrityError), READONLY}, + {"InternalError", T_OBJECT, offsetof(pysqlite_Connection, InternalError), READONLY}, + {"ProgrammingError", T_OBJECT, offsetof(pysqlite_Connection, ProgrammingError), READONLY}, + {"NotSupportedError", T_OBJECT, offsetof(pysqlite_Connection, NotSupportedError), READONLY}, {"row_factory", T_OBJECT, offsetof(pysqlite_Connection, row_factory)}, {"text_factory", T_OBJECT, offsetof(pysqlite_Connection, text_factory)}, + {"in_transaction", T_BOOL, offsetof(pysqlite_Connection, inTransaction), READONLY}, {NULL} }; @@ -1627,7 +1563,7 @@ PyTypeObject pysqlite_ConnectionType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h index ecc8d2b24de..c8e2f7cbd2b 100644 --- a/Modules/_sqlite/connection.h +++ b/Modules/_sqlite/connection.h @@ -1,6 +1,6 @@ /* connection.h - definitions for the connection type * - * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * @@ -39,7 +39,7 @@ typedef struct /* 1 if we are currently within a transaction, i. e. if a BEGIN has been * issued */ - int inTransaction; + char inTransaction; /* the type detection mode. Only 0, PARSE_DECLTYPES, PARSE_COLNAMES or a * bitwise combination thereof makes sense */ @@ -84,7 +84,7 @@ typedef struct /* Determines how bytestrings from SQLite are converted to Python objects: * - PyUnicode_Type: Python Unicode objects are constructed from UTF-8 bytestrings * - OptimizedUnicode: Like before, but for ASCII data, only PyStrings are created. - * - PyString_Type: PyStrings are created as-is. + * - PyBytes_Type: PyStrings are created as-is. * - Any custom callable: Any object returned from the callable called with the bytestring * as single parameter. */ @@ -99,11 +99,6 @@ typedef struct /* a dictionary of registered collation name => collation callable mappings */ PyObject* collations; - /* if our connection was created from a APSW connection, we keep a - * reference to the APSW connection around and get rid of it in our - * destructor */ - PyObject* apsw_connection; - /* Exception objects */ PyObject* Warning; PyObject* Error; diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index e1cd536efc0..86fbd4ee0d2 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -1,6 +1,6 @@ /* cursor.c - the cursor type * - * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * @@ -26,7 +26,7 @@ #include "util.h" #include "sqlitecompat.h" -/* used to decide wether to call PyInt_FromLong or PyLong_FromLongLong */ +/* used to decide wether to call PyLong_FromLong or PyLong_FromLongLong */ #ifndef INT32_MIN #define INT32_MIN (-2147483647 - 1) #endif @@ -38,10 +38,10 @@ PyObject* pysqlite_cursor_iternext(pysqlite_Cursor* self); static char* errmsg_fetch_across_rollback = "Cursor needed to be reset because of commit/rollback and can no longer be fetched from."; -static pysqlite_StatementKind detect_statement_type(char* statement) +static pysqlite_StatementKind detect_statement_type(const char* statement) { char buf[20]; - char* src; + const char* src; char* dst; src = statement; @@ -145,7 +145,7 @@ static void pysqlite_cursor_dealloc(pysqlite_Cursor* self) PyObject_ClearWeakRefs((PyObject*)self); } - self->ob_type->tp_free((PyObject*)self); + Py_TYPE(self)->tp_free((PyObject*)self); } PyObject* _pysqlite_get_converter(PyObject* key) @@ -193,7 +193,7 @@ int pysqlite_build_row_cast_map(pysqlite_Cursor* self) if (*pos == '[') { type_start = pos + 1; } else if (*pos == ']' && type_start != (const char*)-1) { - key = PyString_FromStringAndSize(type_start, pos - type_start); + key = PyUnicode_FromStringAndSize(type_start, pos - type_start); if (!key) { /* creating a string failed, but it is too complicated * to propagate the error here, we just assume there is @@ -218,7 +218,7 @@ int pysqlite_build_row_cast_map(pysqlite_Cursor* self) * 'NUMBER(10)' to be treated as 'NUMBER', for example. * In other words, it will work as people expect it to work.*/ if (*pos == ' ' || *pos == '(' || *pos == 0) { - py_decltype = PyString_FromStringAndSize(decltype, pos - decltype); + py_decltype = PyUnicode_FromStringAndSize(decltype, pos - decltype); if (!py_decltype) { return -1; } @@ -263,36 +263,14 @@ PyObject* _pysqlite_build_column_name(const char* colname) if ((*pos == '[') && (pos > colname) && (*(pos-1) == ' ')) { pos--; } - return PyString_FromStringAndSize(colname, pos - colname); + return PyUnicode_FromStringAndSize(colname, pos - colname); } } } PyObject* pysqlite_unicode_from_string(const char* val_str, Py_ssize_t size, int optimize) { - const char* check; - Py_ssize_t pos; - int is_ascii = 0; - - if (optimize) { - is_ascii = 1; - - check = val_str; - for (pos = 0; pos < size; pos++) { - if (*check & 0x80) { - is_ascii = 0; - break; - } - - check++; - } - } - - if (is_ascii) { - return PyString_FromStringAndSize(val_str, size); - } else { - return PyUnicode_DecodeUTF8(val_str, size, NULL); - } + return PyUnicode_FromStringAndSize(val_str, size); } /* @@ -312,10 +290,11 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self) PyObject* converted; Py_ssize_t nbytes; PyObject* buffer; - void* raw_buffer; const char* val_str; char buf[200]; const char* colname; + PyObject* buf_bytes; + PyObject* error_obj; if (self->reset) { PyErr_SetString(pysqlite_InterfaceError, errmsg_fetch_across_rollback); @@ -348,7 +327,7 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self) Py_INCREF(Py_None); converted = Py_None; } else { - item = PyString_FromStringAndSize(val_str, nbytes); + item = PyBytes_FromStringAndSize(val_str, nbytes); if (!item) { return NULL; } @@ -370,7 +349,7 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self) if (intval < INT32_MIN || intval > INT32_MAX) { converted = PyLong_FromLongLong(intval); } else { - converted = PyInt_FromLong((long)intval); + converted = PyLong_FromLong((long)intval); } } else if (coltype == SQLITE_FLOAT) { converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i)); @@ -390,24 +369,35 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self) } PyOS_snprintf(buf, sizeof(buf) - 1, "Could not decode to UTF-8 column '%s' with text '%s'", colname , val_str); - PyErr_SetString(pysqlite_OperationalError, buf); + buf_bytes = PyByteArray_FromStringAndSize(buf, strlen(buf)); + if (!buf_bytes) { + PyErr_SetString(pysqlite_OperationalError, "Could not decode to UTF-8"); + } else { + error_obj = PyUnicode_FromEncodedObject(buf_bytes, "ascii", "replace"); + if (!error_obj) { + PyErr_SetString(pysqlite_OperationalError, "Could not decode to UTF-8"); + } else { + PyErr_SetObject(pysqlite_OperationalError, error_obj); + Py_DECREF(error_obj); + } + Py_DECREF(buf_bytes); + } } - } else if (self->connection->text_factory == (PyObject*)&PyString_Type) { - converted = PyString_FromStringAndSize(val_str, nbytes); + } else if (self->connection->text_factory == (PyObject*)&PyBytes_Type) { + converted = PyBytes_FromStringAndSize(val_str, nbytes); + } else if (self->connection->text_factory == (PyObject*)&PyByteArray_Type) { + converted = PyByteArray_FromStringAndSize(val_str, nbytes); } else { - converted = PyObject_CallFunction(self->connection->text_factory, "s#", val_str, nbytes); + converted = PyObject_CallFunction(self->connection->text_factory, "y#", val_str, nbytes); } } else { /* coltype == SQLITE_BLOB */ nbytes = sqlite3_column_bytes(self->statement->st, i); - buffer = PyBuffer_New(nbytes); + buffer = PyBytes_FromStringAndSize( + sqlite3_column_blob(self->statement->st, i), nbytes); if (!buffer) { break; } - if (PyObject_AsWriteBuffer(buffer, &raw_buffer, &nbytes)) { - break; - } - memcpy(raw_buffer, sqlite3_column_blob(self->statement->st, i), nbytes); converted = buffer; } } @@ -456,8 +446,8 @@ static int check_cursor(pysqlite_Cursor* cur) PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) { PyObject* operation; - PyObject* operation_bytestr = NULL; - char* operation_cstr; + const char* operation_cstr; + Py_ssize_t operation_len; PyObject* parameters_list = NULL; PyObject* parameters_iter = NULL; PyObject* parameters = NULL; @@ -492,8 +482,8 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* goto error; } - if (!PyString_Check(operation) && !PyUnicode_Check(operation)) { - PyErr_SetString(PyExc_ValueError, "operation parameter must be str or unicode"); + if (!PyUnicode_Check(operation)) { + PyErr_SetString(PyExc_ValueError, "operation parameter must be str"); goto error; } @@ -514,8 +504,8 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* goto error; } - if (!PyString_Check(operation) && !PyUnicode_Check(operation)) { - PyErr_SetString(PyExc_ValueError, "operation parameter must be str or unicode"); + if (!PyUnicode_Check(operation)) { + PyErr_SetString(PyExc_ValueError, "operation parameter must be str"); goto error; } @@ -549,16 +539,9 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* rc = pysqlite_statement_reset(self->statement); } - if (PyString_Check(operation)) { - operation_cstr = PyString_AsString(operation); - } else { - operation_bytestr = PyUnicode_AsUTF8String(operation); - if (!operation_bytestr) { - goto error; - } - - operation_cstr = PyString_AsString(operation_bytestr); - } + operation_cstr = _PyUnicode_AsStringAndSize(operation, &operation_len); + if (operation_cstr == NULL) + goto error; /* reset description and rowcount */ Py_DECREF(self->description); @@ -639,6 +622,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* } } + while (1) { parameters = PyIter_Next(parameters_iter); if (!parameters) { @@ -750,7 +734,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* Py_BEGIN_ALLOW_THREADS lastrowid = sqlite3_last_insert_rowid(self->connection->db); Py_END_ALLOW_THREADS - self->lastrowid = PyInt_FromLong((long)lastrowid); + self->lastrowid = PyLong_FromLong((long)lastrowid); } else { Py_INCREF(Py_None); self->lastrowid = Py_None; @@ -772,7 +756,6 @@ error: #endif #endif - Py_XDECREF(operation_bytestr); Py_XDECREF(parameters); Py_XDECREF(parameters_iter); Py_XDECREF(parameters_list); @@ -817,17 +800,13 @@ PyObject* pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args) self->reset = 0; - if (PyString_Check(script_obj)) { - script_cstr = PyString_AsString(script_obj); - } else if (PyUnicode_Check(script_obj)) { - script_str = PyUnicode_AsUTF8String(script_obj); - if (!script_str) { + if (PyUnicode_Check(script_obj)) { + script_cstr = _PyUnicode_AsString(script_obj); + if (!script_cstr) { return NULL; } - - script_cstr = PyString_AsString(script_str); } else { - PyErr_SetString(PyExc_ValueError, "script argument must be unicode or string."); + PyErr_SetString(PyExc_ValueError, "script argument must be unicode."); return NULL; } @@ -1076,11 +1055,11 @@ static PyMethodDef cursor_methods[] = { static struct PyMemberDef cursor_members[] = { - {"connection", T_OBJECT, offsetof(pysqlite_Cursor, connection), RO}, - {"description", T_OBJECT, offsetof(pysqlite_Cursor, description), RO}, + {"connection", T_OBJECT, offsetof(pysqlite_Cursor, connection), READONLY}, + {"description", T_OBJECT, offsetof(pysqlite_Cursor, description), READONLY}, {"arraysize", T_INT, offsetof(pysqlite_Cursor, arraysize), 0}, - {"lastrowid", T_OBJECT, offsetof(pysqlite_Cursor, lastrowid), RO}, - {"rowcount", T_LONG, offsetof(pysqlite_Cursor, rowcount), RO}, + {"lastrowid", T_OBJECT, offsetof(pysqlite_Cursor, lastrowid), READONLY}, + {"rowcount", T_LONG, offsetof(pysqlite_Cursor, rowcount), READONLY}, {"row_factory", T_OBJECT, offsetof(pysqlite_Cursor, row_factory), 0}, {NULL} }; @@ -1097,7 +1076,7 @@ PyTypeObject pysqlite_CursorType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1108,7 +1087,7 @@ PyTypeObject pysqlite_CursorType = { 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_ITER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ cursor_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Modules/_sqlite/cursor.h b/Modules/_sqlite/cursor.h index cf5389c898d..118ba388a41 100644 --- a/Modules/_sqlite/cursor.h +++ b/Modules/_sqlite/cursor.h @@ -1,6 +1,6 @@ /* cursor.h - definitions for the cursor type * - * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 33611d9dad2..cbc3b8e90be 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -1,6 +1,6 @@ /* module.c - the module itself * - * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * @@ -51,7 +51,7 @@ static PyObject* module_connect(PyObject* self, PyObject* args, PyObject* * 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}; - PyObject* database; + char* database; int detect_types = 0; PyObject* isolation_level; PyObject* factory = NULL; @@ -61,10 +61,10 @@ static PyObject* module_connect(PyObject* self, PyObject* args, PyObject* PyObject* result; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|diOiOi", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|diOiOi", kwlist, &database, &timeout, &detect_types, &isolation_level, &check_same_thread, &factory, &cached_statements)) { - return NULL; + return NULL; } if (factory == NULL) { @@ -93,7 +93,7 @@ static PyObject* module_complete(PyObject* self, PyObject* args, PyObject* if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &statement)) { - return NULL; + return NULL; } if (sqlite3_complete(statement)) { @@ -122,7 +122,7 @@ static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyOb if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &do_enable)) { - return NULL; + return NULL; } rc = sqlite3_enable_shared_cache(do_enable); @@ -155,8 +155,8 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args) /* a basic type is adapted; there's a performance optimization if that's not the case * (99 % of all usages) */ - if (type == &PyInt_Type || type == &PyLong_Type || type == &PyFloat_Type - || type == &PyString_Type || type == &PyUnicode_Type || type == &PyBuffer_Type) { + if (type == &PyLong_Type || type == &PyFloat_Type + || type == &PyUnicode_Type || type == &PyByteArray_Type) { pysqlite_BaseTypeAdapted = 1; } @@ -180,7 +180,7 @@ static PyObject* module_register_converter(PyObject* self, PyObject* args) PyObject* callable; PyObject* retval = NULL; - if (!PyArg_ParseTuple(args, "SO", &orig_name, &callable)) { + if (!PyArg_ParseTuple(args, "UO", &orig_name, &callable)) { return NULL; } @@ -300,13 +300,26 @@ static IntConstantPair _int_constants[] = { {(char*)NULL, 0} }; -PyMODINIT_FUNC init_sqlite3(void) + +static struct PyModuleDef _sqlite3module = { + PyModuleDef_HEAD_INIT, + "_sqlite3", + NULL, + -1, + module_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC PyInit__sqlite3(void) { PyObject *module, *dict; PyObject *tmp_obj; int i; - module = Py_InitModule("_sqlite3", module_methods); + module = PyModule_Create(&_sqlite3module); if (!module || (pysqlite_row_setup_types() < 0) || @@ -316,7 +329,8 @@ PyMODINIT_FUNC init_sqlite3(void) (pysqlite_statement_setup_types() < 0) || (pysqlite_prepare_protocol_setup_types() < 0) ) { - return; + Py_XDECREF(module); + return NULL; } Py_INCREF(&pysqlite_ConnectionType); @@ -338,12 +352,12 @@ PyMODINIT_FUNC init_sqlite3(void) /*** Create DB-API Exception hierarchy */ - if (!(pysqlite_Error = PyErr_NewException(MODULE_NAME ".Error", PyExc_StandardError, NULL))) { + if (!(pysqlite_Error = PyErr_NewException(MODULE_NAME ".Error", PyExc_Exception, NULL))) { goto error; } PyDict_SetItemString(dict, "Error", pysqlite_Error); - if (!(pysqlite_Warning = PyErr_NewException(MODULE_NAME ".Warning", PyExc_StandardError, NULL))) { + if (!(pysqlite_Warning = PyErr_NewException(MODULE_NAME ".Warning", PyExc_Exception, NULL))) { goto error; } PyDict_SetItemString(dict, "Warning", pysqlite_Warning); @@ -402,7 +416,7 @@ PyMODINIT_FUNC init_sqlite3(void) /* Set integer constants */ for (i = 0; _int_constants[i].constant_name != 0; i++) { - tmp_obj = PyInt_FromLong(_int_constants[i].constant_value); + tmp_obj = PyLong_FromLong(_int_constants[i].constant_value); if (!tmp_obj) { goto error; } @@ -410,13 +424,13 @@ PyMODINIT_FUNC init_sqlite3(void) Py_DECREF(tmp_obj); } - if (!(tmp_obj = PyString_FromString(PYSQLITE_VERSION))) { + if (!(tmp_obj = PyUnicode_FromString(PYSQLITE_VERSION))) { goto error; } PyDict_SetItemString(dict, "version", tmp_obj); Py_DECREF(tmp_obj); - if (!(tmp_obj = PyString_FromString(sqlite3_libversion()))) { + if (!(tmp_obj = PyUnicode_FromString(sqlite3_libversion()))) { goto error; } PyDict_SetItemString(dict, "sqlite_version", tmp_obj); @@ -434,7 +448,7 @@ PyMODINIT_FUNC init_sqlite3(void) /* Original comment from _bsddb.c in the Python core. This is also still * needed nowadays for Python 2.3/2.4. - * + * * PyEval_InitThreads is called here due to a quirk in python 1.5 * - 2.2.1 (at least) according to Russell Williamson <merel@wt.net>: * The global interpreter lock is not initialized until the first @@ -453,5 +467,8 @@ error: if (PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, MODULE_NAME ": init failed"); + Py_DECREF(module); + module = NULL; } + return module; } diff --git a/Modules/_sqlite/module.h b/Modules/_sqlite/module.h index 8d17d6173f0..0eddb679483 100644 --- a/Modules/_sqlite/module.h +++ b/Modules/_sqlite/module.h @@ -1,6 +1,6 @@ /* module.h - definitions for the module * - * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c index 9ed25e18adf..fc6887445e8 100644 --- a/Modules/_sqlite/prepare_protocol.c +++ b/Modules/_sqlite/prepare_protocol.c @@ -1,6 +1,6 @@ /* prepare_protocol.c - the protocol for preparing values for SQLite * - * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * @@ -43,7 +43,7 @@ PyTypeObject pysqlite_PrepareProtocolType= { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_sqlite/prepare_protocol.h b/Modules/_sqlite/prepare_protocol.h index 1cdf7086eb4..924e16223ac 100644 --- a/Modules/_sqlite/prepare_protocol.h +++ b/Modules/_sqlite/prepare_protocol.h @@ -1,6 +1,6 @@ /* prepare_protocol.h - the protocol for preparing values for SQLite * - * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c index 480b482ed85..3d440942f9d 100644 --- a/Modules/_sqlite/row.c +++ b/Modules/_sqlite/row.c @@ -1,6 +1,6 @@ /* row.c - an enhanced tuple for database rows * - * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * @@ -76,23 +76,20 @@ PyObject* pysqlite_row_subscript(pysqlite_Row* self, PyObject* idx) PyObject* item; - if (PyInt_Check(idx)) { - _idx = PyInt_AsLong(idx); - item = PyTuple_GetItem(self->data, _idx); - Py_XINCREF(item); - return item; - } else if (PyLong_Check(idx)) { + if (PyLong_Check(idx)) { _idx = PyLong_AsLong(idx); item = PyTuple_GetItem(self->data, _idx); Py_XINCREF(item); return item; - } else if (PyString_Check(idx)) { - key = PyString_AsString(idx); + } else if (PyUnicode_Check(idx)) { + key = _PyUnicode_AsString(idx); + if (key == NULL) + return NULL; nitems = PyTuple_Size(self->description); for (i = 0; i < nitems; i++) { - compare_key = PyString_AsString(PyTuple_GET_ITEM(PyTuple_GET_ITEM(self->description, i), 0)); + compare_key = _PyUnicode_AsString(PyTuple_GET_ITEM(PyTuple_GET_ITEM(self->description, i), 0)); if (!compare_key) { return NULL; } @@ -169,7 +166,7 @@ static PyObject* pysqlite_iter(pysqlite_Row* self) return PyObject_GetIter(self->data); } -static long pysqlite_row_hash(pysqlite_Row *self) +static Py_hash_t pysqlite_row_hash(pysqlite_Row *self) { return PyObject_Hash(self->description) ^ PyObject_Hash(self->data); } @@ -215,7 +212,7 @@ PyTypeObject pysqlite_RowType = { (printfunc)pysqlite_row_print, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ diff --git a/Modules/_sqlite/row.h b/Modules/_sqlite/row.h index dd9b0c3c6fb..d014109032a 100644 --- a/Modules/_sqlite/row.h +++ b/Modules/_sqlite/row.h @@ -1,6 +1,6 @@ /* row.h - an enhanced tuple for database rows * - * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * diff --git a/Modules/_sqlite/sqlitecompat.h b/Modules/_sqlite/sqlitecompat.h index 3408fc2119a..cf20f16f654 100644 --- a/Modules/_sqlite/sqlitecompat.h +++ b/Modules/_sqlite/sqlitecompat.h @@ -1,6 +1,6 @@ /* sqlitecompat.h - compatibility macros * - * Copyright (C) 2006-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2006-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index c777211f556..80bcc385b59 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -1,6 +1,6 @@ /* statement.c - the statement type * - * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * @@ -41,10 +41,8 @@ typedef enum { } parse_remaining_sql_state; typedef enum { - TYPE_INT, TYPE_LONG, TYPE_FLOAT, - TYPE_STRING, TYPE_UNICODE, TYPE_BUFFER, TYPE_UNKNOWN @@ -54,30 +52,21 @@ int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* con { const char* tail; int rc; - PyObject* sql_str; - char* sql_cstr; + const char* sql_cstr; + Py_ssize_t sql_cstr_len; self->st = NULL; self->in_use = 0; - if (PyString_Check(sql)) { - sql_str = sql; - Py_INCREF(sql_str); - } else if (PyUnicode_Check(sql)) { - sql_str = PyUnicode_AsUTF8String(sql); - if (!sql_str) { - rc = PYSQLITE_SQL_WRONG_TYPE; - return rc; - } - } else { + sql_cstr = _PyUnicode_AsStringAndSize(sql, &sql_cstr_len); + if (sql_cstr == NULL) { rc = PYSQLITE_SQL_WRONG_TYPE; return rc; } self->in_weakreflist = NULL; - self->sql = sql_str; - - sql_cstr = PyString_AsString(sql_str); + Py_INCREF(sql); + self->sql = sql; Py_BEGIN_ALLOW_THREADS rc = sqlite3_prepare(connection->db, @@ -101,79 +90,50 @@ int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* con int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObject* parameter, int allow_8bit_chars) { int rc = SQLITE_OK; - long longval; PY_LONG_LONG longlongval; const char* buffer; char* string; Py_ssize_t buflen; - PyObject* stringval; parameter_type paramtype; - char* c; if (parameter == Py_None) { rc = sqlite3_bind_null(self->st, pos); goto final; } - if (PyInt_CheckExact(parameter)) { - paramtype = TYPE_INT; - } else if (PyLong_CheckExact(parameter)) { + if (PyLong_CheckExact(parameter)) { paramtype = TYPE_LONG; } else if (PyFloat_CheckExact(parameter)) { paramtype = TYPE_FLOAT; - } else if (PyString_CheckExact(parameter)) { - paramtype = TYPE_STRING; } else if (PyUnicode_CheckExact(parameter)) { paramtype = TYPE_UNICODE; - } else if (PyBuffer_Check(parameter)) { - paramtype = TYPE_BUFFER; - } else if (PyInt_Check(parameter)) { - paramtype = TYPE_INT; } else if (PyLong_Check(parameter)) { paramtype = TYPE_LONG; } else if (PyFloat_Check(parameter)) { paramtype = TYPE_FLOAT; - } else if (PyString_Check(parameter)) { - paramtype = TYPE_STRING; } else if (PyUnicode_Check(parameter)) { paramtype = TYPE_UNICODE; + } else if (PyObject_CheckBuffer(parameter)) { + paramtype = TYPE_BUFFER; } else { paramtype = TYPE_UNKNOWN; } - if (paramtype == TYPE_STRING && !allow_8bit_chars) { - string = PyString_AS_STRING(parameter); - for (c = string; *c != 0; c++) { - if (*c & 0x80) { - PyErr_SetString(pysqlite_ProgrammingError, "You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings."); - rc = -1; - goto final; - } - } - } - switch (paramtype) { - case TYPE_INT: - longval = PyInt_AsLong(parameter); - rc = sqlite3_bind_int64(self->st, pos, (sqlite_int64)longval); - break; case TYPE_LONG: + /* in the overflow error case, longval/longlongval is -1, and an exception is set */ longlongval = PyLong_AsLongLong(parameter); - /* in the overflow error case, longlongval is -1, and an exception is set */ rc = sqlite3_bind_int64(self->st, pos, (sqlite_int64)longlongval); break; case TYPE_FLOAT: rc = sqlite3_bind_double(self->st, pos, PyFloat_AsDouble(parameter)); break; - case TYPE_STRING: - PyString_AsStringAndSize(parameter, &string, &buflen); - rc = sqlite3_bind_text(self->st, pos, string, buflen, SQLITE_TRANSIENT); - break; case TYPE_UNICODE: - stringval = PyUnicode_AsUTF8String(parameter); - PyString_AsStringAndSize(stringval, &string, &buflen); - rc = sqlite3_bind_text(self->st, pos, string, buflen, SQLITE_TRANSIENT); - Py_DECREF(stringval); + string = _PyUnicode_AsStringAndSize(parameter, &buflen); + if (string != NULL) + rc = sqlite3_bind_text(self->st, pos, string, buflen, SQLITE_TRANSIENT); + else + rc = -1; break; case TYPE_BUFFER: if (PyObject_AsCharBuffer(parameter, &buffer, &buflen) == 0) { @@ -198,9 +158,8 @@ static int _need_adapt(PyObject* obj) return 1; } - if (PyInt_CheckExact(obj) || PyLong_CheckExact(obj) - || PyFloat_CheckExact(obj) || PyString_CheckExact(obj) - || PyUnicode_CheckExact(obj) || PyBuffer_Check(obj)) { + if (PyLong_CheckExact(obj) || PyFloat_CheckExact(obj) + || PyUnicode_CheckExact(obj) || PyByteArray_CheckExact(obj)) { return 0; } else { return 1; @@ -325,10 +284,15 @@ int pysqlite_statement_recompile(pysqlite_Statement* self, PyObject* params) { const char* tail; int rc; - char* sql_cstr; + const char* sql_cstr; + Py_ssize_t sql_len; sqlite3_stmt* new_st; - sql_cstr = PyString_AsString(self->sql); + sql_cstr = _PyUnicode_AsStringAndSize(self->sql, &sql_len); + if (sql_cstr == NULL) { + rc = PYSQLITE_SQL_WRONG_TYPE; + return rc; + } Py_BEGIN_ALLOW_THREADS rc = sqlite3_prepare(self->db, @@ -503,7 +467,7 @@ PyTypeObject pysqlite_StatementType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -514,7 +478,7 @@ PyTypeObject pysqlite_StatementType = { 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ 0, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index 05fd5ff3d86..e5da42e7d83 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -1,6 +1,6 @@ /* statement.h - definitions for the statement type * - * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * diff --git a/Modules/_sqlite/util.c b/Modules/_sqlite/util.c index 6b57b763ddb..b7faae867e8 100644 --- a/Modules/_sqlite/util.c +++ b/Modules/_sqlite/util.c @@ -1,6 +1,6 @@ /* util.c - various utility functions * - * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * diff --git a/Modules/_sqlite/util.h b/Modules/_sqlite/util.h index 42690032a70..baf405c3405 100644 --- a/Modules/_sqlite/util.h +++ b/Modules/_sqlite/util.h @@ -1,6 +1,6 @@ /* util.h - various utility functions * - * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> + * Copyright (C) 2005-2010 Gerhard Häring <gh@ghaering.de> * * This file is part of pysqlite. * diff --git a/Modules/_sre.c b/Modules/_sre.c index 8f47688d410..88bbf6a941e 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -58,12 +58,8 @@ static char copyright[] = /* defining this one enables tracing */ #undef VERBOSE -#if PY_VERSION_HEX >= 0x01060000 -#if PY_VERSION_HEX < 0x02020000 || defined(Py_USING_UNICODE) /* defining this enables unicode support (default under 1.6a1 and later) */ #define HAVE_UNICODE -#endif -#endif /* -------------------------------------------------------------------- */ /* optional features */ @@ -71,9 +67,6 @@ static char copyright[] = /* enables fast searching */ #define USE_FAST_SEARCH -/* enables aggressive inlining (always on for Visual C) */ -#undef USE_INLINE - /* enables copy/deepcopy handling (work in progress) */ #undef USE_BUILTIN_COPY @@ -1671,7 +1664,7 @@ state_reset(SRE_STATE* state) } static void* -getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize) +getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize, Py_buffer *view) { /* given a python object, return a data pointer, a length (in characters), and a character size. return NULL if the object @@ -1682,40 +1675,37 @@ getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize) int charsize; void* ptr; -#if defined(HAVE_UNICODE) + /* Unicode objects do not support the buffer API. So, get the data + directly instead. */ if (PyUnicode_Check(string)) { - /* unicode strings doesn't always support the buffer interface */ - ptr = (void*) PyUnicode_AS_DATA(string); - /* bytes = PyUnicode_GET_DATA_SIZE(string); */ - size = PyUnicode_GET_SIZE(string); - charsize = sizeof(Py_UNICODE); - - } else { -#endif + ptr = (void *)PyUnicode_AS_DATA(string); + *p_length = PyUnicode_GET_SIZE(string); + *p_charsize = sizeof(Py_UNICODE); + return ptr; + } /* get pointer to string buffer */ + view->len = -1; buffer = Py_TYPE(string)->tp_as_buffer; - if (!buffer || !buffer->bf_getreadbuffer || !buffer->bf_getsegcount || - buffer->bf_getsegcount(string, NULL) != 1) { - PyErr_SetString(PyExc_TypeError, "expected string or buffer"); - return NULL; + if (!buffer || !buffer->bf_getbuffer || + (*buffer->bf_getbuffer)(string, view, PyBUF_SIMPLE) < 0) { + PyErr_SetString(PyExc_TypeError, "expected string or buffer"); + return NULL; } /* determine buffer size */ - bytes = buffer->bf_getreadbuffer(string, 0, &ptr); + bytes = view->len; + ptr = view->buf; + if (bytes < 0) { PyErr_SetString(PyExc_TypeError, "buffer has negative size"); - return NULL; + goto err; } /* determine character size */ -#if PY_VERSION_HEX >= 0x01060000 size = PyObject_Size(string); -#else - size = PyObject_Length(string); -#endif - if (PyString_Check(string) || bytes == size) + if (PyBytes_Check(string) || bytes == size) charsize = 1; #if defined(HAVE_UNICODE) else if (bytes == (Py_ssize_t) (size * sizeof(Py_UNICODE))) @@ -1723,17 +1713,22 @@ getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize) #endif else { PyErr_SetString(PyExc_TypeError, "buffer size mismatch"); - return NULL; + goto err; } -#if defined(HAVE_UNICODE) - } -#endif - *p_length = size; *p_charsize = charsize; + if (ptr == NULL) { + PyErr_SetString(PyExc_ValueError, + "Buffer is NULL"); + goto err; + } return ptr; + err: + PyBuffer_Release(view); + view->buf = NULL; + return NULL; } LOCAL(PyObject*) @@ -1751,9 +1746,21 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string, state->lastmark = -1; state->lastindex = -1; - ptr = getstring(string, &length, &charsize); + state->buffer.buf = NULL; + ptr = getstring(string, &length, &charsize, &state->buffer); if (!ptr) - return NULL; + goto err; + + if (charsize == 1 && pattern->charsize > 1) { + PyErr_SetString(PyExc_TypeError, + "can't use a string pattern on a bytes-like object"); + goto err; + } + if (charsize > 1 && pattern->charsize == 1) { + PyErr_SetString(PyExc_TypeError, + "can't use a bytes pattern on a string-like object"); + goto err; + } /* adjust boundaries */ if (start < 0) @@ -1790,11 +1797,17 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string, state->lower = sre_lower; return string; + err: + if (state->buffer.buf) + PyBuffer_Release(&state->buffer); + return NULL; } LOCAL(void) state_fini(SRE_STATE* state) { + if (state->buffer.buf) + PyBuffer_Release(&state->buffer); Py_XDECREF(state->string); data_stack_dealloc(state); } @@ -1856,6 +1869,8 @@ pattern_dealloc(PatternObject* self) { if (self->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) self); + if (self->view.buf) + PyBuffer_Release(&self->view); Py_XDECREF(self->pattern); Py_XDECREF(self->groupindex); Py_XDECREF(self->indexgroup); @@ -1949,7 +1964,7 @@ call(char* module, char* function, PyObject* args) if (!args) return NULL; - name = PyString_FromString(module); + name = PyUnicode_FromString(module); if (!name) return NULL; mod = PyImport_Import(name); @@ -2290,6 +2305,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, Py_ssize_t i, b, e; int bint; int filter_is_callable; + Py_buffer view; if (PyCallable_Check(ptemplate)) { /* sub/subn takes either a function or a template */ @@ -2299,7 +2315,8 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, } else { /* if not callable, check if it's a literal string */ int literal; - ptr = getstring(ptemplate, &n, &bint); + view.buf = NULL; + ptr = getstring(ptemplate, &n, &bint, &view); b = bint; if (ptr) { if (b == 1) { @@ -2313,6 +2330,8 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, PyErr_Clear(); literal = 0; } + if (view.buf) + PyBuffer_Release(&view); if (literal) { filter = ptemplate; Py_INCREF(filter); @@ -2540,35 +2559,35 @@ pattern_deepcopy(PatternObject* self, PyObject* memo) } PyDoc_STRVAR(pattern_match_doc, -"match(string[, pos[, endpos]]) --> match object or None.\n\ +"match(string[, pos[, endpos]]) -> match object or None.\n\n\ Matches zero or more characters at the beginning of the string"); PyDoc_STRVAR(pattern_search_doc, -"search(string[, pos[, endpos]]) --> match object or None.\n\ +"search(string[, pos[, endpos]]) -> match object or None.\n\n\ Scan through string looking for a match, and return a corresponding\n\ match object instance. Return None if no position in the string matches."); PyDoc_STRVAR(pattern_split_doc, -"split(string[, maxsplit = 0]) --> list.\n\ +"split(string[, maxsplit = 0]) -> list.\n\n\ Split string by the occurrences of pattern."); PyDoc_STRVAR(pattern_findall_doc, -"findall(string[, pos[, endpos]]) --> list.\n\ +"findall(string[, pos[, endpos]]) -> list.\n\n\ Return a list of all non-overlapping matches of pattern in string."); PyDoc_STRVAR(pattern_finditer_doc, -"finditer(string[, pos[, endpos]]) --> iterator.\n\ +"finditer(string[, pos[, endpos]]) -> iterator.\n\n\ Return an iterator over all non-overlapping matches for the \n\ RE pattern in string. For each match, the iterator returns a\n\ match object."); PyDoc_STRVAR(pattern_sub_doc, -"sub(repl, string[, count = 0]) --> newstring\n\ +"sub(repl, string[, count = 0]) -> newstring.\n\n\ Return the string obtained by replacing the leftmost non-overlapping\n\ occurrences of pattern in string by the replacement repl."); PyDoc_STRVAR(pattern_subn_doc, -"subn(repl, string[, count = 0]) --> (newstring, number of subs)\n\ +"subn(repl, string[, count = 0]) -> (newstring, number of subs)\n\n\ Return the tuple (new_string, number_of_subs_made) found by replacing\n\ the leftmost non-overlapping occurrences of pattern with the\n\ replacement repl."); @@ -2607,15 +2626,15 @@ static PyMemberDef pattern_members[] = { {NULL} /* Sentinel */ }; -statichere PyTypeObject Pattern_Type = { - PyObject_HEAD_INIT(NULL) - 0, "_" SRE_MODULE ".SRE_Pattern", +static PyTypeObject Pattern_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_" SRE_MODULE ".SRE_Pattern", sizeof(PatternObject), sizeof(SRE_CODE), - (destructor)pattern_dealloc, /*tp_dealloc*/ - 0, /* tp_print */ - 0, /* tp_getattrn */ + (destructor)pattern_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2626,7 +2645,7 @@ statichere PyTypeObject Pattern_Type = { 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ pattern_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ @@ -2654,6 +2673,7 @@ _compile(PyObject* self_, PyObject* args) Py_ssize_t groups = 0; PyObject* groupindex = NULL; PyObject* indexgroup = NULL; + if (!PyArg_ParseTuple(args, "OiO!|nOO", &pattern, &flags, &PyList_Type, &code, &groups, &groupindex, &indexgroup)) @@ -2668,13 +2688,13 @@ _compile(PyObject* self_, PyObject* args) self->pattern = NULL; self->groupindex = NULL; self->indexgroup = NULL; + self->view.buf = NULL; self->codesize = n; for (i = 0; i < n; i++) { PyObject *o = PyList_GET_ITEM(code, i); - unsigned long value = PyInt_Check(o) ? (unsigned long)PyInt_AsLong(o) - : PyLong_AsUnsignedLong(o); + unsigned long value = PyLong_AsUnsignedLong(o); if (value == (unsigned long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) { PyErr_SetString(PyExc_OverflowError, @@ -2695,6 +2715,16 @@ _compile(PyObject* self_, PyObject* args) return NULL; } + if (pattern == Py_None) + self->charsize = -1; + else { + Py_ssize_t p_length; + if (!getstring(pattern, &p_length, &self->charsize, &self->view)) { + Py_DECREF(self); + return NULL; + } + } + Py_INCREF(pattern); self->pattern = pattern; @@ -2954,13 +2984,13 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups) <INFO> <1=skip> <2=flags> <3=min> <4=max>; If SRE_INFO_PREFIX or SRE_INFO_CHARSET is in the flags, more follows. */ - SRE_CODE flags, i; + SRE_CODE flags, min, max, i; SRE_CODE *newcode; GET_SKIP; newcode = code+skip-1; GET_ARG; flags = arg; - GET_ARG; /* min */ - GET_ARG; /* max */ + GET_ARG; min = arg; + GET_ARG; max = arg; /* Check that only valid flags are present */ if ((flags & ~(SRE_INFO_PREFIX | SRE_INFO_LITERAL | @@ -2976,9 +3006,9 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups) FAIL; /* Validate the prefix */ if (flags & SRE_INFO_PREFIX) { - SRE_CODE prefix_len; + SRE_CODE prefix_len, prefix_skip; GET_ARG; prefix_len = arg; - GET_ARG; /* prefix skip */ + GET_ARG; prefix_skip = arg; /* Here comes the prefix string */ if (code+prefix_len < code || code+prefix_len > newcode) FAIL; @@ -3224,16 +3254,20 @@ match_getindex(MatchObject* self, PyObject* index) { Py_ssize_t i; - if (PyInt_Check(index)) - return PyInt_AsSsize_t(index); + if (index == NULL) + /* Default value */ + return 0; + + if (PyLong_Check(index)) + return PyLong_AsSsize_t(index); i = -1; if (self->pattern->groupindex) { index = PyObject_GetItem(self->pattern->groupindex, index); if (index) { - if (PyInt_Check(index) || PyLong_Check(index)) - i = PyInt_AsSsize_t(index); + if (PyLong_Check(index)) + i = PyLong_AsSsize_t(index); Py_DECREF(index); } else PyErr_Clear(); @@ -3374,7 +3408,7 @@ match_start(MatchObject* self, PyObject* args) { Py_ssize_t index; - PyObject* index_ = Py_False; /* zero */ + PyObject* index_ = NULL; if (!PyArg_UnpackTuple(args, "start", 0, 1, &index_)) return NULL; @@ -3397,7 +3431,7 @@ match_end(MatchObject* self, PyObject* args) { Py_ssize_t index; - PyObject* index_ = Py_False; /* zero */ + PyObject* index_ = NULL; if (!PyArg_UnpackTuple(args, "end", 0, 1, &index_)) return NULL; @@ -3425,12 +3459,12 @@ _pair(Py_ssize_t i1, Py_ssize_t i2) if (!pair) return NULL; - item = PyInt_FromSsize_t(i1); + item = PyLong_FromSsize_t(i1); if (!item) goto error; PyTuple_SET_ITEM(pair, 0, item); - item = PyInt_FromSsize_t(i2); + item = PyLong_FromSsize_t(i2); if (!item) goto error; PyTuple_SET_ITEM(pair, 1, item); @@ -3447,7 +3481,7 @@ match_span(MatchObject* self, PyObject* args) { Py_ssize_t index; - PyObject* index_ = Py_False; /* zero */ + PyObject* index_ = NULL; if (!PyArg_UnpackTuple(args, "span", 0, 1, &index_)) return NULL; @@ -3550,36 +3584,36 @@ PyDoc_STRVAR(match_doc, Match objects always have a boolean value of True."); PyDoc_STRVAR(match_group_doc, -"group([group1, ...]) -> str or tuple.\n\ +"group([group1, ...]) -> str or tuple.\n\n\ Return subgroup(s) of the match by indices or names.\n\ For 0 returns the entire match."); PyDoc_STRVAR(match_start_doc, -"start([group=0]) -> int.\n\ +"start([group=0]) -> int.\n\n\ Return index of the start of the substring matched by group."); PyDoc_STRVAR(match_end_doc, -"end([group=0]) -> int.\n\ +"end([group=0]) -> int.\n\n\ Return index of the end of the substring matched by group."); PyDoc_STRVAR(match_span_doc, -"span([group]) -> tuple.\n\ +"span([group]) -> tuple.\n\n\ For MatchObject m, return the 2-tuple (m.start(group), m.end(group))."); PyDoc_STRVAR(match_groups_doc, -"groups([default=None]) -> tuple.\n\ +"groups([default=None]) -> tuple.\n\n\ Return a tuple containing all the subgroups of the match, from 1.\n\ The default argument is used for groups\n\ that did not participate in the match"); PyDoc_STRVAR(match_groupdict_doc, -"groupdict([default=None]) -> dict.\n\ +"groupdict([default=None]) -> dict.\n\n\ Return a dictionary containing all the named subgroups of the match,\n\ keyed by the subgroup name. The default argument is used for groups\n\ that did not participate in the match"); PyDoc_STRVAR(match_expand_doc, -"expand(template) -> str.\n\ +"expand(template) -> str.\n\n\ Return the string obtained by doing backslash substitution\n\ on the string template, as done by the sub() method."); @@ -3648,37 +3682,36 @@ static PyMemberDef match_members[] = { {NULL} }; - /* FIXME: implement setattr("string", None) as a special case (to detach the associated string, if any */ static PyTypeObject Match_Type = { - PyVarObject_HEAD_INIT(NULL, 0) + PyVarObject_HEAD_INIT(NULL,0) "_" SRE_MODULE ".SRE_Match", sizeof(MatchObject), sizeof(Py_ssize_t), - (destructor)match_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 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, - match_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ + (destructor)match_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 */ + match_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ match_methods, /* tp_methods */ match_members, /* tp_members */ match_getset, /* tp_getset */ @@ -3836,11 +3869,11 @@ static PyMemberDef scanner_members[] = { {NULL} /* Sentinel */ }; -statichere PyTypeObject Scanner_Type = { - PyObject_HEAD_INIT(NULL) - 0, "_" SRE_MODULE ".SRE_Scanner", +static PyTypeObject Scanner_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_" SRE_MODULE ".SRE_Scanner", sizeof(ScannerObject), 0, - (destructor)scanner_dealloc, /*tp_dealloc*/ + (destructor)scanner_dealloc,/* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ @@ -3906,11 +3939,19 @@ static PyMethodDef _functions[] = { {NULL, NULL} }; -#if PY_VERSION_HEX < 0x02030000 -DL_EXPORT(void) init_sre(void) -#else -PyMODINIT_FUNC init_sre(void) -#endif +static struct PyModuleDef sremodule = { + PyModuleDef_HEAD_INIT, + "_" SRE_MODULE, + NULL, + -1, + _functions, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC PyInit__sre(void) { PyObject* m; PyObject* d; @@ -3919,30 +3960,31 @@ PyMODINIT_FUNC init_sre(void) /* Patch object types */ if (PyType_Ready(&Pattern_Type) || PyType_Ready(&Match_Type) || PyType_Ready(&Scanner_Type)) - return; + return NULL; - m = Py_InitModule("_" SRE_MODULE, _functions); + m = PyModule_Create(&sremodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); - x = PyInt_FromLong(SRE_MAGIC); + x = PyLong_FromLong(SRE_MAGIC); if (x) { PyDict_SetItemString(d, "MAGIC", x); Py_DECREF(x); } - x = PyInt_FromLong(sizeof(SRE_CODE)); + x = PyLong_FromLong(sizeof(SRE_CODE)); if (x) { PyDict_SetItemString(d, "CODESIZE", x); Py_DECREF(x); } - x = PyString_FromString(copyright); + x = PyUnicode_FromString(copyright); if (x) { PyDict_SetItemString(d, "copyright", x); Py_DECREF(x); } + return m; } #endif /* !defined(SRE_RECURSIVE) */ diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 195e5b6491f..e9de8cad273 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -47,6 +47,7 @@ enum py_ssl_error { PY_SSL_ERROR_WANT_CONNECT, /* start of non ssl.h errorcodes */ PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */ + PY_SSL_ERROR_NO_SOCKET, /* socket has been GC'd */ PY_SSL_ERROR_INVALID_ERROR_CODE }; @@ -73,6 +74,8 @@ enum py_ssl_version { /* 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) @@ -112,27 +115,40 @@ static unsigned int _ssl_locks_count = 0; # undef HAVE_OPENSSL_RAND #endif +/* SSL_CTX_clear_options() and SSL_clear_options() were first added in + * OpenSSL 0.9.8m but do not appear in some 0.9.9-dev versions such the + * 0.9.9 from "May 2008" that NetBSD 5.0 uses. */ +#if OPENSSL_VERSION_NUMBER >= 0x009080dfL && OPENSSL_VERSION_NUMBER != 0x00909000L +# define HAVE_SSL_CTX_CLEAR_OPTIONS +#else +# undef HAVE_SSL_CTX_CLEAR_OPTIONS +#endif + +typedef struct { + PyObject_HEAD + SSL_CTX *ctx; +} PySSLContext; + typedef struct { PyObject_HEAD - PySocketSockObject *Socket; /* Socket on which we're layered */ - SSL_CTX* ctx; - SSL* ssl; - X509* peer_cert; - char server[X509_NAME_MAXLEN]; - char issuer[X509_NAME_MAXLEN]; - int shutdown_seen_zero; - -} PySSLObject; - -static PyTypeObject PySSL_Type; -static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args); -static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args); + PyObject *Socket; /* weakref to socket on which we're layered */ + SSL *ssl; + X509 *peer_cert; + int shutdown_seen_zero; +} PySSLSocket; + +static PyTypeObject PySSLContext_Type; +static PyTypeObject PySSLSocket_Type; + +static PyObject *PySSL_SSLwrite(PySSLSocket *self, PyObject *args); +static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args); static int check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing); -static PyObject *PySSL_peercert(PySSLObject *self, PyObject *args); -static PyObject *PySSL_cipher(PySSLObject *self); +static PyObject *PySSL_peercert(PySSLSocket *self, PyObject *args); +static PyObject *PySSL_cipher(PySSLSocket *self); -#define PySSLObject_Check(v) (Py_TYPE(v) == &PySSL_Type) +#define PySSLContext_Check(v) (Py_TYPE(v) == &PySSLContext_Type) +#define PySSLSocket_Check(v) (Py_TYPE(v) == &PySSLSocket_Type) typedef enum { SOCKET_IS_NONBLOCKING, @@ -155,7 +171,7 @@ typedef enum { */ static PyObject * -PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno) +PySSL_SetError(PySSLSocket *obj, int ret, char *filename, int lineno) { PyObject *v; char buf[2048]; @@ -193,13 +209,18 @@ PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno) { unsigned long e = ERR_get_error(); if (e == 0) { - if (ret == 0 || !obj->Socket) { + PySocketSockObject *s + = (PySocketSockObject *) PyWeakref_GetObject(obj->Socket); + if (ret == 0 || (((PyObject *)s) == Py_None)) { p = PY_SSL_ERROR_EOF; errstr = "EOF occurred in violation of protocol"; } else if (ret == -1) { /* underlying BIO reported an I/O error */ + Py_INCREF(s); ERR_clear_error(); - return obj->Socket->errorhandler(); + v = s->errorhandler(); + Py_DECREF(s); + return v; } else { /* possible? */ p = PY_SSL_ERROR_SYSCALL; errstr = "Some I/O error occurred"; @@ -260,140 +281,42 @@ _setSSLError (char *errstr, int errcode, char *filename, int lineno) { return NULL; } -static PySSLObject * -newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file, +static PySSLSocket * +newPySSLSocket(SSL_CTX *ctx, PySocketSockObject *sock, enum py_ssl_server_or_client socket_type, - enum py_ssl_cert_requirements certreq, - enum py_ssl_version proto_version, - char *cacerts_file, char *ciphers) + char *server_hostname) { - PySSLObject *self; - char *errstr = NULL; - int ret; - int verification_mode; + PySSLSocket *self; - self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */ + self = PyObject_New(PySSLSocket, &PySSLSocket_Type); if (self == NULL) return NULL; - memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN); - memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN); + self->peer_cert = NULL; self->ssl = NULL; - self->ctx = NULL; self->Socket = NULL; /* Make sure the SSL error state is initialized */ (void) ERR_get_state(); ERR_clear_error(); - if ((key_file && !cert_file) || (!key_file && cert_file)) { - errstr = ERRSTR("Both the key & certificate files " - "must be specified"); - goto fail; - } - - if ((socket_type == PY_SSL_SERVER) && - ((key_file == NULL) || (cert_file == NULL))) { - errstr = ERRSTR("Both the key & certificate files " - "must be specified for server-side operation"); - goto fail; - } - PySSL_BEGIN_ALLOW_THREADS - if (proto_version == PY_SSL_VERSION_TLS1) - self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ - else if (proto_version == PY_SSL_VERSION_SSL3) - self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ -#ifndef OPENSSL_NO_SSL2 - else if (proto_version == PY_SSL_VERSION_SSL2) - self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ -#endif - else if (proto_version == PY_SSL_VERSION_SSL23) - self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + self->ssl = SSL_new(ctx); PySSL_END_ALLOW_THREADS - - if (self->ctx == NULL) { - errstr = ERRSTR("Invalid SSL protocol variant specified."); - goto fail; - } - - if (ciphers != NULL) { - ret = SSL_CTX_set_cipher_list(self->ctx, ciphers); - if (ret == 0) { - errstr = ERRSTR("No cipher can be selected."); - goto fail; - } - } - - if (certreq != PY_SSL_CERT_NONE) { - if (cacerts_file == NULL) { - errstr = ERRSTR("No root certificates specified for " - "verification of other-side certificates."); - goto fail; - } else { - PySSL_BEGIN_ALLOW_THREADS - ret = SSL_CTX_load_verify_locations(self->ctx, - cacerts_file, - NULL); - PySSL_END_ALLOW_THREADS - if (ret != 1) { - _setSSLError(NULL, 0, __FILE__, __LINE__); - goto fail; - } - } - } - if (key_file) { - PySSL_BEGIN_ALLOW_THREADS - ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file, - SSL_FILETYPE_PEM); - PySSL_END_ALLOW_THREADS - if (ret != 1) { - _setSSLError(NULL, ret, __FILE__, __LINE__); - goto fail; - } - - PySSL_BEGIN_ALLOW_THREADS - ret = SSL_CTX_use_certificate_chain_file(self->ctx, - cert_file); - PySSL_END_ALLOW_THREADS - if (ret != 1) { - /* - fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n", - ret, ERR_peek_error(), ERR_peek_last_error(), cert_file); - */ - if (ERR_peek_last_error() != 0) { - _setSSLError(NULL, ret, __FILE__, __LINE__); - goto fail; - } - } - } - - /* ssl compatibility */ - SSL_CTX_set_options(self->ctx, - SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS); - - verification_mode = SSL_VERIFY_NONE; - if (certreq == PY_SSL_CERT_OPTIONAL) - verification_mode = SSL_VERIFY_PEER; - else if (certreq == PY_SSL_CERT_REQUIRED) - verification_mode = (SSL_VERIFY_PEER | - SSL_VERIFY_FAIL_IF_NO_PEER_CERT); - SSL_CTX_set_verify(self->ctx, verification_mode, - NULL); /* set verify lvl */ - - PySSL_BEGIN_ALLOW_THREADS - self->ssl = SSL_new(self->ctx); /* New ssl struct */ - PySSL_END_ALLOW_THREADS - SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */ + SSL_set_fd(self->ssl, sock->sock_fd); #ifdef SSL_MODE_AUTO_RETRY SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY); #endif +#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME + if (server_hostname != NULL) + SSL_set_tlsext_host_name(self->ssl, server_hostname); +#endif + /* If the socket is in non-blocking mode or timeout mode, set the BIO * to non-blocking mode (blocking is the default) */ - if (Sock->sock_timeout >= 0.0) { - /* Set both the read and write BIO's to non-blocking mode */ + if (sock->sock_timeout >= 0.0) { BIO_set_nbio(SSL_get_rbio(self->ssl), 1); BIO_set_nbio(SSL_get_wbio(self->ssl), 1); } @@ -405,129 +328,81 @@ newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file, SSL_set_accept_state(self->ssl); PySSL_END_ALLOW_THREADS - self->Socket = Sock; - Py_INCREF(self->Socket); + self->Socket = PyWeakref_NewRef((PyObject *) sock, NULL); return self; - fail: - if (errstr) - PyErr_SetString(PySSLErrorObject, errstr); - Py_DECREF(self); - return NULL; } -static PyObject * -PySSL_sslwrap(PyObject *self, PyObject *args) -{ - PySocketSockObject *Sock; - int server_side = 0; - int verification_mode = PY_SSL_CERT_NONE; - int protocol = PY_SSL_VERSION_SSL23; - char *key_file = NULL; - char *cert_file = NULL; - char *cacerts_file = NULL; - char *ciphers = NULL; - - if (!PyArg_ParseTuple(args, "O!i|zziizz:sslwrap", - PySocketModule.Sock_Type, - &Sock, - &server_side, - &key_file, &cert_file, - &verification_mode, &protocol, - &cacerts_file, &ciphers)) - return NULL; - - /* - fprintf(stderr, - "server_side is %d, keyfile %p, certfile %p, verify_mode %d, " - "protocol %d, certs %p\n", - server_side, key_file, cert_file, verification_mode, - protocol, cacerts_file); - */ - - return (PyObject *) newPySSLObject(Sock, key_file, cert_file, - server_side, verification_mode, - protocol, cacerts_file, - ciphers); -} - -PyDoc_STRVAR(ssl_doc, -"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n" -" cacertsfile, ciphers]) -> sslobject"); - /* SSL object methods */ -static PyObject *PySSL_SSLdo_handshake(PySSLObject *self) +static PyObject *PySSL_SSLdo_handshake(PySSLSocket *self) { int ret; int err; int sockstate, nonblocking; + PySocketSockObject *sock + = (PySocketSockObject *) PyWeakref_GetObject(self->Socket); + + if (((PyObject*)sock) == Py_None) { + _setSSLError("Underlying socket connection gone", + PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__); + return NULL; + } + Py_INCREF(sock); /* just in case the blocking state of the socket has been changed */ - nonblocking = (self->Socket->sock_timeout >= 0.0); + nonblocking = (sock->sock_timeout >= 0.0); BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking); BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking); /* Actually negotiate SSL connection */ /* XXX If SSL_do_handshake() returns 0, it's also a failure. */ + sockstate = 0; do { PySSL_BEGIN_ALLOW_THREADS ret = SSL_do_handshake(self->ssl); err = SSL_get_error(self->ssl, ret); PySSL_END_ALLOW_THREADS - if(PyErr_CheckSignals()) { - return NULL; - } + if (PyErr_CheckSignals()) + goto error; if (err == SSL_ERROR_WANT_READ) { - sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); + sockstate = check_socket_and_wait_for_timeout(sock, 0); } else if (err == SSL_ERROR_WANT_WRITE) { - sockstate = check_socket_and_wait_for_timeout(self->Socket, 1); + sockstate = check_socket_and_wait_for_timeout(sock, 1); } else { sockstate = SOCKET_OPERATION_OK; } if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, ERRSTR("The handshake operation timed out")); - return NULL; + goto error; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { PyErr_SetString(PySSLErrorObject, ERRSTR("Underlying socket has been closed.")); - return NULL; + goto error; } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { PyErr_SetString(PySSLErrorObject, ERRSTR("Underlying socket too large for select().")); - return NULL; + goto error; } else if (sockstate == SOCKET_IS_NONBLOCKING) { break; } } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE); + Py_DECREF(sock); if (ret < 1) return PySSL_SetError(self, ret, __FILE__, __LINE__); if (self->peer_cert) X509_free (self->peer_cert); PySSL_BEGIN_ALLOW_THREADS - if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) { - X509_NAME_oneline(X509_get_subject_name(self->peer_cert), - self->server, X509_NAME_MAXLEN); - X509_NAME_oneline(X509_get_issuer_name(self->peer_cert), - self->issuer, X509_NAME_MAXLEN); - } + self->peer_cert = SSL_get_peer_certificate(self->ssl); PySSL_END_ALLOW_THREADS Py_INCREF(Py_None); return Py_None; -} -static PyObject * -PySSL_server(PySSLObject *self) -{ - return PyString_FromString(self->server); -} - -static PyObject * -PySSL_issuer(PySSLObject *self) -{ - return PyString_FromString(self->issuer); +error: + Py_DECREF(sock); + return NULL; } static PyObject * @@ -545,7 +420,7 @@ _create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) { _setSSLError(NULL, 0, __FILE__, __LINE__); goto fail; } - name_obj = PyString_FromStringAndSize(namebuf, buflen); + name_obj = PyUnicode_FromStringAndSize(namebuf, buflen); if (name_obj == NULL) goto fail; @@ -633,8 +508,8 @@ _create_tuple_for_X509_NAME (X509_NAME *xname) /* fprintf(stderr, "RDN level %d, attribute %s: %s\n", entry->set, - PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)), - PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1))); + PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 0)), + PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 1))); */ if (attr == NULL) goto fail1; @@ -721,21 +596,24 @@ _get_peer_alt_names (X509 *certificate) { /* now decode the altName */ ext = X509_get_ext(certificate, i); if(!(method = X509V3_EXT_get(ext))) { - PyErr_SetString(PySSLErrorObject, - ERRSTR("No method for internalizing subjectAltName!")); + PyErr_SetString + (PySSLErrorObject, + ERRSTR("No method for internalizing subjectAltName!")); goto fail; } p = ext->value->data; if (method->it) - names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL, - &p, - ext->value->length, - ASN1_ITEM_ptr(method->it))); + names = (GENERAL_NAMES*) + (ASN1_item_d2i(NULL, + &p, + ext->value->length, + ASN1_ITEM_ptr(method->it))); else - names = (GENERAL_NAMES*) (method->d2i(NULL, - &p, - ext->value->length)); + names = (GENERAL_NAMES*) + (method->d2i(NULL, + &p, + ext->value->length)); for(j = 0; j < sk_GENERAL_NAME_num(names); j++) { @@ -744,14 +622,15 @@ _get_peer_alt_names (X509 *certificate) { name = sk_GENERAL_NAME_value(names, j); if (name->type == GEN_DIRNAME) { - /* we special-case DirName as a tuple of tuples of attributes */ + /* we special-case DirName as a tuple of + tuples of attributes */ t = PyTuple_New(2); if (t == NULL) { goto fail; } - v = PyString_FromString("DirName"); + v = PyUnicode_FromString("DirName"); if (v == NULL) { Py_DECREF(t); goto fail; @@ -782,13 +661,14 @@ _get_peer_alt_names (X509 *certificate) { t = PyTuple_New(2); if (t == NULL) goto fail; - v = PyString_FromStringAndSize(buf, (vptr - buf)); + v = PyUnicode_FromStringAndSize(buf, (vptr - buf)); if (v == NULL) { Py_DECREF(t); goto fail; } PyTuple_SET_ITEM(t, 0, v); - v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1))); + v = PyUnicode_FromStringAndSize((vptr + 1), + (len - (vptr - buf + 1))); if (v == NULL) { Py_DECREF(t); goto fail; @@ -828,7 +708,7 @@ _get_peer_alt_names (X509 *certificate) { } static PyObject * -_decode_certificate (X509 *certificate, int verbose) { +_decode_certificate(X509 *certificate) { PyObject *retval = NULL; BIO *biobuf = NULL; @@ -857,65 +737,60 @@ _decode_certificate (X509 *certificate, int verbose) { } Py_DECREF(peer); - if (verbose) { - issuer = _create_tuple_for_X509_NAME( - X509_get_issuer_name(certificate)); - if (issuer == NULL) - goto fail0; - if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) { - Py_DECREF(issuer); - goto fail0; - } + issuer = _create_tuple_for_X509_NAME( + X509_get_issuer_name(certificate)); + if (issuer == NULL) + goto fail0; + if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) { Py_DECREF(issuer); + goto fail0; + } + Py_DECREF(issuer); - version = PyInt_FromLong(X509_get_version(certificate) + 1); - if (PyDict_SetItemString(retval, "version", version) < 0) { - Py_DECREF(version); - goto fail0; - } + version = PyLong_FromLong(X509_get_version(certificate) + 1); + if (PyDict_SetItemString(retval, "version", version) < 0) { Py_DECREF(version); + goto fail0; } + Py_DECREF(version); /* get a memory buffer */ biobuf = BIO_new(BIO_s_mem()); - if (verbose) { - - (void) BIO_reset(biobuf); - serialNumber = X509_get_serialNumber(certificate); - /* should not exceed 20 octets, 160 bits, so buf is big enough */ - i2a_ASN1_INTEGER(biobuf, serialNumber); - len = BIO_gets(biobuf, buf, sizeof(buf)-1); - if (len < 0) { - _setSSLError(NULL, 0, __FILE__, __LINE__); - goto fail1; - } - sn_obj = PyString_FromStringAndSize(buf, len); - if (sn_obj == NULL) - goto fail1; - if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) { - Py_DECREF(sn_obj); - goto fail1; - } + (void) BIO_reset(biobuf); + serialNumber = X509_get_serialNumber(certificate); + /* should not exceed 20 octets, 160 bits, so buf is big enough */ + i2a_ASN1_INTEGER(biobuf, serialNumber); + len = BIO_gets(biobuf, buf, sizeof(buf)-1); + if (len < 0) { + _setSSLError(NULL, 0, __FILE__, __LINE__); + goto fail1; + } + sn_obj = PyUnicode_FromStringAndSize(buf, len); + if (sn_obj == NULL) + goto fail1; + if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) { Py_DECREF(sn_obj); + goto fail1; + } + Py_DECREF(sn_obj); - (void) BIO_reset(biobuf); - notBefore = X509_get_notBefore(certificate); - ASN1_TIME_print(biobuf, notBefore); - len = BIO_gets(biobuf, buf, sizeof(buf)-1); - if (len < 0) { - _setSSLError(NULL, 0, __FILE__, __LINE__); - goto fail1; - } - pnotBefore = PyString_FromStringAndSize(buf, len); - if (pnotBefore == NULL) - goto fail1; - if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) { - Py_DECREF(pnotBefore); - goto fail1; - } + (void) BIO_reset(biobuf); + notBefore = X509_get_notBefore(certificate); + ASN1_TIME_print(biobuf, notBefore); + len = BIO_gets(biobuf, buf, sizeof(buf)-1); + if (len < 0) { + _setSSLError(NULL, 0, __FILE__, __LINE__); + goto fail1; + } + pnotBefore = PyUnicode_FromStringAndSize(buf, len); + if (pnotBefore == NULL) + goto fail1; + if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) { Py_DECREF(pnotBefore); + goto fail1; } + Py_DECREF(pnotBefore); (void) BIO_reset(biobuf); notAfter = X509_get_notAfter(certificate); @@ -925,7 +800,7 @@ _decode_certificate (X509 *certificate, int verbose) { _setSSLError(NULL, 0, __FILE__, __LINE__); goto fail1; } - pnotAfter = PyString_FromStringAndSize(buf, len); + pnotAfter = PyUnicode_FromStringAndSize(buf, len); if (pnotAfter == NULL) goto fail1; if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) { @@ -964,42 +839,45 @@ static PyObject * PySSL_test_decode_certificate (PyObject *mod, PyObject *args) { PyObject *retval = NULL; - char *filename = NULL; + PyObject *filename; X509 *x=NULL; BIO *cert; - int verbose = 1; - if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose)) + if (!PyArg_ParseTuple(args, "O&:test_decode_certificate", + PyUnicode_FSConverter, &filename)) return NULL; if ((cert=BIO_new(BIO_s_file())) == NULL) { - PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file"); + PyErr_SetString(PySSLErrorObject, + "Can't malloc memory to read file"); goto fail0; } - if (BIO_read_filename(cert,filename) <= 0) { - PyErr_SetString(PySSLErrorObject, "Can't open file"); + if (BIO_read_filename(cert, PyBytes_AsString(filename)) <= 0) { + PyErr_SetString(PySSLErrorObject, + "Can't open file"); goto fail0; } x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL); if (x == NULL) { - PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file"); + PyErr_SetString(PySSLErrorObject, + "Error decoding PEM-encoded file"); goto fail0; } - retval = _decode_certificate(x, verbose); + retval = _decode_certificate(x); X509_free(x); fail0: - + Py_DECREF(filename); if (cert != NULL) BIO_free(cert); return retval; } static PyObject * -PySSL_peercert(PySSLObject *self, PyObject *args) +PySSL_peercert(PySSLSocket *self, PyObject *args) { PyObject *retval = NULL; int len; @@ -1027,17 +905,18 @@ PySSL_peercert(PySSLObject *self, PyObject *args) PySSL_SetError(self, len, __FILE__, __LINE__); return NULL; } - retval = PyString_FromStringAndSize((const char *) bytes_buf, len); + /* this is actually an immutable bytes sequence */ + retval = PyBytes_FromStringAndSize + ((const char *) bytes_buf, len); OPENSSL_free(bytes_buf); return retval; } else { - - verification = SSL_CTX_get_verify_mode(self->ctx); + verification = SSL_CTX_get_verify_mode(SSL_get_SSL_CTX(self->ssl)); if ((verification & SSL_VERIFY_PEER) == 0) return PyDict_New(); else - return _decode_certificate (self->peer_cert, 0); + return _decode_certificate(self->peer_cert); } } @@ -1053,7 +932,7 @@ If the optional argument is True, returns a DER-encoded copy of the\n\ peer certificate, or None if no certificate was provided. This will\n\ return the certificate even if it wasn't validated."); -static PyObject *PySSL_cipher (PySSLObject *self) { +static PyObject *PySSL_cipher (PySSLSocket *self) { PyObject *retval, *v; const SSL_CIPHER *current; @@ -1075,7 +954,7 @@ static PyObject *PySSL_cipher (PySSLObject *self) { Py_INCREF(Py_None); PyTuple_SET_ITEM(retval, 0, Py_None); } else { - v = PyString_FromString(cipher_name); + v = PyUnicode_FromString(cipher_name); if (v == NULL) goto fail0; PyTuple_SET_ITEM(retval, 0, v); @@ -1085,12 +964,12 @@ static PyObject *PySSL_cipher (PySSLObject *self) { Py_INCREF(Py_None); PyTuple_SET_ITEM(retval, 1, Py_None); } else { - v = PyString_FromString(cipher_protocol); + v = PyUnicode_FromString(cipher_protocol); if (v == NULL) goto fail0; PyTuple_SET_ITEM(retval, 1, v); } - v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL)); + v = PyLong_FromLong(SSL_CIPHER_get_bits(current, NULL)); if (v == NULL) goto fail0; PyTuple_SET_ITEM(retval, 2, v); @@ -1101,14 +980,12 @@ static PyObject *PySSL_cipher (PySSLObject *self) { return NULL; } -static void PySSL_dealloc(PySSLObject *self) +static void PySSL_dealloc(PySSLSocket *self) { if (self->peer_cert) /* Possible not to have one? */ X509_free (self->peer_cert); if (self->ssl) SSL_free(self->ssl); - if (self->ctx) - SSL_CTX_free(self->ctx); Py_XDECREF(self->Socket); PyObject_Del(self); } @@ -1181,25 +1058,36 @@ normal_return: return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK; } -static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args) +static PyObject *PySSL_SSLwrite(PySSLSocket *self, PyObject *args) { Py_buffer buf; int len; int sockstate; int err; int nonblocking; + PySocketSockObject *sock + = (PySocketSockObject *) PyWeakref_GetObject(self->Socket); - if (!PyArg_ParseTuple(args, "s*:write", &buf)) + if (((PyObject*)sock) == Py_None) { + _setSSLError("Underlying socket connection gone", + PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__); return NULL; + } + Py_INCREF(sock); + + if (!PyArg_ParseTuple(args, "y*:write", &buf)) { + Py_DECREF(sock); + return NULL; + } /* just in case the blocking state of the socket has been changed */ - nonblocking = (self->Socket->sock_timeout >= 0.0); + nonblocking = (sock->sock_timeout >= 0.0); BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking); BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking); - sockstate = check_socket_and_wait_for_timeout(self->Socket, 1); + sockstate = check_socket_and_wait_for_timeout(sock, 1); if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The write operation timed out"); goto error; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { @@ -1212,6 +1100,7 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args) goto error; } do { + err = 0; PySSL_BEGIN_ALLOW_THREADS len = SSL_write(self->ssl, buf.buf, buf.len); err = SSL_get_error(self->ssl, len); @@ -1220,14 +1109,14 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args) goto error; } if (err == SSL_ERROR_WANT_READ) { - sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); + sockstate = check_socket_and_wait_for_timeout(sock, 0); } else if (err == SSL_ERROR_WANT_WRITE) { - sockstate = check_socket_and_wait_for_timeout(self->Socket, 1); + sockstate = check_socket_and_wait_for_timeout(sock, 1); } else { sockstate = SOCKET_OPERATION_OK; } if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The write operation timed out"); goto error; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { @@ -1239,13 +1128,15 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args) } } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE); + Py_DECREF(sock); PyBuffer_Release(&buf); if (len > 0) - return PyInt_FromLong(len); + return PyLong_FromLong(len); else return PySSL_SetError(self, len, __FILE__, __LINE__); error: + Py_DECREF(sock); PyBuffer_Release(&buf); return NULL; } @@ -1256,7 +1147,7 @@ PyDoc_STRVAR(PySSL_SSLwrite_doc, Writes the string s into the SSL object. Returns the number\n\ of bytes written."); -static PyObject *PySSL_SSLpending(PySSLObject *self) +static PyObject *PySSL_SSLpending(PySSLSocket *self) { int count = 0; @@ -1266,7 +1157,7 @@ static PyObject *PySSL_SSLpending(PySSLObject *self) if (count < 0) return PySSL_SetError(self, count, __FILE__, __LINE__); else - return PyInt_FromLong(count); + return PyLong_FromLong(count); } PyDoc_STRVAR(PySSL_SSLpending_doc, @@ -1275,23 +1166,52 @@ PyDoc_STRVAR(PySSL_SSLpending_doc, Returns the number of already decrypted bytes available for read,\n\ pending on the connection.\n"); -static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args) +static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args) { - PyObject *buf; - int count = 0; - int len = 1024; + PyObject *dest = NULL; + Py_buffer buf; + char *mem; + int len, count; + int buf_passed = 0; int sockstate; int err; int nonblocking; + PySocketSockObject *sock + = (PySocketSockObject *) PyWeakref_GetObject(self->Socket); - if (!PyArg_ParseTuple(args, "|i:read", &len)) + if (((PyObject*)sock) == Py_None) { + _setSSLError("Underlying socket connection gone", + PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__); return NULL; + } + Py_INCREF(sock); - if (!(buf = PyString_FromStringAndSize((char *) 0, len))) - return NULL; + buf.obj = NULL; + buf.buf = NULL; + if (!PyArg_ParseTuple(args, "i|w*:read", &len, &buf)) + goto error; + + if ((buf.buf == NULL) && (buf.obj == NULL)) { + dest = PyBytes_FromStringAndSize(NULL, len); + if (dest == NULL) + goto error; + mem = PyBytes_AS_STRING(dest); + } + else { + buf_passed = 1; + mem = buf.buf; + if (len <= 0 || len > buf.len) { + len = (int) buf.len; + if (buf.len != len) { + PyErr_SetString(PyExc_OverflowError, + "maximum length can't fit in a C 'int'"); + goto error; + } + } + } /* just in case the blocking state of the socket has been changed */ - nonblocking = (self->Socket->sock_timeout >= 0.0); + nonblocking = (sock->sock_timeout >= 0.0); BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking); BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking); @@ -1301,70 +1221,72 @@ static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args) PySSL_END_ALLOW_THREADS if (!count) { - sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); + sockstate = check_socket_and_wait_for_timeout(sock, 0); if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The read operation timed out"); - Py_DECREF(buf); - return NULL; + goto error; } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { PyErr_SetString(PySSLErrorObject, "Underlying socket too large for select()."); - Py_DECREF(buf); - return NULL; + goto error; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { - if (SSL_get_shutdown(self->ssl) != - SSL_RECEIVED_SHUTDOWN) - { - Py_DECREF(buf); - PyErr_SetString(PySSLErrorObject, - "Socket closed without SSL shutdown handshake"); - return NULL; - } else { - /* should contain a zero-length string */ - _PyString_Resize(&buf, 0); - return buf; - } + count = 0; + goto done; } } do { + err = 0; PySSL_BEGIN_ALLOW_THREADS - count = SSL_read(self->ssl, PyString_AsString(buf), len); + count = SSL_read(self->ssl, mem, len); err = SSL_get_error(self->ssl, count); PySSL_END_ALLOW_THREADS - if(PyErr_CheckSignals()) { - Py_DECREF(buf); - return NULL; - } + if (PyErr_CheckSignals()) + goto error; if (err == SSL_ERROR_WANT_READ) { - sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); + sockstate = check_socket_and_wait_for_timeout(sock, 0); } else if (err == SSL_ERROR_WANT_WRITE) { - sockstate = check_socket_and_wait_for_timeout(self->Socket, 1); + sockstate = check_socket_and_wait_for_timeout(sock, 1); } else if ((err == SSL_ERROR_ZERO_RETURN) && (SSL_get_shutdown(self->ssl) == SSL_RECEIVED_SHUTDOWN)) { - _PyString_Resize(&buf, 0); - return buf; + count = 0; + goto done; } else { sockstate = SOCKET_OPERATION_OK; } if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The read operation timed out"); - Py_DECREF(buf); - return NULL; + goto error; } else if (sockstate == SOCKET_IS_NONBLOCKING) { break; } } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE); if (count <= 0) { - Py_DECREF(buf); - return PySSL_SetError(self, count, __FILE__, __LINE__); + PySSL_SetError(self, count, __FILE__, __LINE__); + goto error; } - if (count != len) - _PyString_Resize(&buf, count); - return buf; + +done: + Py_DECREF(sock); + if (!buf_passed) { + _PyBytes_Resize(&dest, count); + return dest; + } + else { + PyBuffer_Release(&buf); + return PyLong_FromLong(count); + } + +error: + Py_DECREF(sock); + if (!buf_passed) + Py_XDECREF(dest); + else + PyBuffer_Release(&buf); + return NULL; } PyDoc_STRVAR(PySSL_SSLread_doc, @@ -1372,20 +1294,23 @@ PyDoc_STRVAR(PySSL_SSLread_doc, \n\ Read up to len bytes from the SSL socket."); -static PyObject *PySSL_SSLshutdown(PySSLObject *self) +static PyObject *PySSL_SSLshutdown(PySSLSocket *self) { int err, ssl_err, sockstate, nonblocking; int zeros = 0; + PySocketSockObject *sock + = (PySocketSockObject *) PyWeakref_GetObject(self->Socket); /* Guard against closed socket */ - if (self->Socket->sock_fd < 0) { - PyErr_SetString(PySSLErrorObject, - "Underlying socket has been closed."); + if ((((PyObject*)sock) == Py_None) || (sock->sock_fd < 0)) { + _setSSLError("Underlying socket connection gone", + PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__); return NULL; } + Py_INCREF(sock); /* Just in case the blocking state of the socket has been changed */ - nonblocking = (self->Socket->sock_timeout >= 0.0); + nonblocking = (sock->sock_timeout >= 0.0); BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking); BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking); @@ -1420,36 +1345,41 @@ static PyObject *PySSL_SSLshutdown(PySSLObject *self) /* Possibly retry shutdown until timeout or failure */ ssl_err = SSL_get_error(self->ssl, err); if (ssl_err == SSL_ERROR_WANT_READ) - sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); + sockstate = check_socket_and_wait_for_timeout(sock, 0); else if (ssl_err == SSL_ERROR_WANT_WRITE) - sockstate = check_socket_and_wait_for_timeout(self->Socket, 1); + sockstate = check_socket_and_wait_for_timeout(sock, 1); else break; if (sockstate == SOCKET_HAS_TIMED_OUT) { if (ssl_err == SSL_ERROR_WANT_READ) - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The read operation timed out"); else - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The write operation timed out"); - return NULL; + goto error; } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { PyErr_SetString(PySSLErrorObject, "Underlying socket too large for select()."); - return NULL; + goto error; } else if (sockstate != SOCKET_OPERATION_OK) /* Retain the SSL error code */ break; } - if (err < 0) + if (err < 0) { + Py_DECREF(sock); return PySSL_SetError(self, err, __FILE__, __LINE__); - else { - Py_INCREF(self->Socket); - return (PyObject *) (self->Socket); } + else + /* It's already INCREF'ed */ + return (PyObject *) sock; + +error: + Py_DECREF(sock); + return NULL; } PyDoc_STRVAR(PySSL_SSLshutdown_doc, @@ -1458,6 +1388,7 @@ PyDoc_STRVAR(PySSL_SSLshutdown_doc, Does the SSL shutdown handshake with the remote end, and returns\n\ the underlying socket object."); + static PyMethodDef PySSLMethods[] = { {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS}, {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS, @@ -1466,8 +1397,6 @@ static PyMethodDef PySSLMethods[] = { PySSL_SSLread_doc}, {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS, PySSL_SSLpending_doc}, - {"server", (PyCFunction)PySSL_server, METH_NOARGS}, - {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS}, {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS, PySSL_peercert_doc}, {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS}, @@ -1476,29 +1405,476 @@ static PyMethodDef PySSLMethods[] = { {NULL, NULL} }; -static PyObject *PySSL_getattr(PySSLObject *self, char *name) -{ - return Py_FindMethod(PySSLMethods, (PyObject *)self, name); -} - -static PyTypeObject PySSL_Type = { +static PyTypeObject PySSLSocket_Type = { PyVarObject_HEAD_INIT(NULL, 0) - "ssl.SSLContext", /*tp_name*/ - sizeof(PySSLObject), /*tp_basicsize*/ + "_ssl._SSLSocket", /*tp_name*/ + sizeof(PySSLSocket), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySSL_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)PySSL_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 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*/ + PySSLMethods, /*tp_methods*/ +}; + + +/* + * _SSLContext objects + */ + +static PyObject * +context_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + char *kwlist[] = {"protocol", NULL}; + PySSLContext *self; + int proto_version = PY_SSL_VERSION_SSL23; + SSL_CTX *ctx = NULL; + + if (!PyArg_ParseTupleAndKeywords( + args, kwds, "i:_SSLContext", kwlist, + &proto_version)) + return NULL; + + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); +#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + ctx = SSL_CTX_new(SSLv23_method()); + else + proto_version = -1; + PySSL_END_ALLOW_THREADS + + if (proto_version == -1) { + PyErr_SetString(PyExc_ValueError, + "invalid protocol version"); + return NULL; + } + if (ctx == NULL) { + PyErr_SetString(PySSLErrorObject, + "failed to allocate SSL context"); + return NULL; + } + + assert(type != NULL && type->tp_alloc != NULL); + self = (PySSLContext *) type->tp_alloc(type, 0); + if (self == NULL) { + SSL_CTX_free(ctx); + return NULL; + } + self->ctx = ctx; + /* Defaults */ + SSL_CTX_set_verify(self->ctx, SSL_VERIFY_NONE, NULL); + SSL_CTX_set_options(self->ctx, + SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS); + +#define SID_CTX "Python" + SSL_CTX_set_session_id_context(self->ctx, (const unsigned char *) SID_CTX, + sizeof(SID_CTX)); +#undef SID_CTX + + return (PyObject *)self; +} + +static void +context_dealloc(PySSLContext *self) +{ + SSL_CTX_free(self->ctx); + Py_TYPE(self)->tp_free(self); +} + +static PyObject * +set_ciphers(PySSLContext *self, PyObject *args) +{ + int ret; + const char *cipherlist; + + if (!PyArg_ParseTuple(args, "s:set_ciphers", &cipherlist)) + return NULL; + ret = SSL_CTX_set_cipher_list(self->ctx, cipherlist); + if (ret == 0) { + /* Clearing the error queue is necessary on some OpenSSL versions, + otherwise the error will be reported again when another SSL call + is done. */ + ERR_clear_error(); + PyErr_SetString(PySSLErrorObject, + "No cipher can be selected."); + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject * +get_verify_mode(PySSLContext *self, void *c) +{ + switch (SSL_CTX_get_verify_mode(self->ctx)) { + case SSL_VERIFY_NONE: + return PyLong_FromLong(PY_SSL_CERT_NONE); + case SSL_VERIFY_PEER: + return PyLong_FromLong(PY_SSL_CERT_OPTIONAL); + case SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT: + return PyLong_FromLong(PY_SSL_CERT_REQUIRED); + } + PyErr_SetString(PySSLErrorObject, + "invalid return value from SSL_CTX_get_verify_mode"); + return NULL; +} + +static int +set_verify_mode(PySSLContext *self, PyObject *arg, void *c) +{ + int n, mode; + if (!PyArg_Parse(arg, "i", &n)) + return -1; + if (n == PY_SSL_CERT_NONE) + mode = SSL_VERIFY_NONE; + else if (n == PY_SSL_CERT_OPTIONAL) + mode = SSL_VERIFY_PEER; + else if (n == PY_SSL_CERT_REQUIRED) + mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT; + else { + PyErr_SetString(PyExc_ValueError, + "invalid value for verify_mode"); + return -1; + } + SSL_CTX_set_verify(self->ctx, mode, NULL); + return 0; +} + +static PyObject * +get_options(PySSLContext *self, void *c) +{ + return PyLong_FromLong(SSL_CTX_get_options(self->ctx)); +} + +static int +set_options(PySSLContext *self, PyObject *arg, void *c) +{ + long new_opts, opts, set, clear; + if (!PyArg_Parse(arg, "l", &new_opts)) + return -1; + opts = SSL_CTX_get_options(self->ctx); + clear = opts & ~new_opts; + set = ~opts & new_opts; + if (clear) { +#ifdef HAVE_SSL_CTX_CLEAR_OPTIONS + SSL_CTX_clear_options(self->ctx, clear); +#else + PyErr_SetString(PyExc_ValueError, + "can't clear options before OpenSSL 0.9.8m"); + return -1; +#endif + } + if (set) + SSL_CTX_set_options(self->ctx, set); + return 0; +} + +static PyObject * +load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds) +{ + char *kwlist[] = {"certfile", "keyfile", NULL}; + PyObject *certfile, *keyfile = NULL; + PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL; + int r; + + errno = 0; + ERR_clear_error(); + if (!PyArg_ParseTupleAndKeywords(args, kwds, + "O|O:load_cert_chain", kwlist, + &certfile, &keyfile)) + return NULL; + if (keyfile == Py_None) + keyfile = NULL; + if (!PyUnicode_FSConverter(certfile, &certfile_bytes)) { + PyErr_SetString(PyExc_TypeError, + "certfile should be a valid filesystem path"); + return NULL; + } + if (keyfile && !PyUnicode_FSConverter(keyfile, &keyfile_bytes)) { + PyErr_SetString(PyExc_TypeError, + "keyfile should be a valid filesystem path"); + goto error; + } + PySSL_BEGIN_ALLOW_THREADS + r = SSL_CTX_use_certificate_chain_file(self->ctx, + PyBytes_AS_STRING(certfile_bytes)); + PySSL_END_ALLOW_THREADS + if (r != 1) { + if (errno != 0) { + ERR_clear_error(); + PyErr_SetFromErrno(PyExc_IOError); + } + else { + _setSSLError(NULL, 0, __FILE__, __LINE__); + } + goto error; + } + PySSL_BEGIN_ALLOW_THREADS + r = SSL_CTX_use_PrivateKey_file(self->ctx, + PyBytes_AS_STRING(keyfile ? keyfile_bytes : certfile_bytes), + SSL_FILETYPE_PEM); + PySSL_END_ALLOW_THREADS + Py_XDECREF(keyfile_bytes); + Py_XDECREF(certfile_bytes); + if (r != 1) { + if (errno != 0) { + ERR_clear_error(); + PyErr_SetFromErrno(PyExc_IOError); + } + else { + _setSSLError(NULL, 0, __FILE__, __LINE__); + } + return NULL; + } + PySSL_BEGIN_ALLOW_THREADS + r = SSL_CTX_check_private_key(self->ctx); + PySSL_END_ALLOW_THREADS + if (r != 1) { + _setSSLError(NULL, 0, __FILE__, __LINE__); + return NULL; + } + Py_RETURN_NONE; + +error: + Py_XDECREF(keyfile_bytes); + Py_XDECREF(certfile_bytes); + return NULL; +} + +static PyObject * +load_verify_locations(PySSLContext *self, PyObject *args, PyObject *kwds) +{ + char *kwlist[] = {"cafile", "capath", NULL}; + PyObject *cafile = NULL, *capath = NULL; + PyObject *cafile_bytes = NULL, *capath_bytes = NULL; + const char *cafile_buf = NULL, *capath_buf = NULL; + int r; + + errno = 0; + if (!PyArg_ParseTupleAndKeywords(args, kwds, + "|OO:load_verify_locations", kwlist, + &cafile, &capath)) + return NULL; + if (cafile == Py_None) + cafile = NULL; + if (capath == Py_None) + capath = NULL; + if (cafile == NULL && capath == NULL) { + PyErr_SetString(PyExc_TypeError, + "cafile and capath cannot be both omitted"); + return NULL; + } + if (cafile && !PyUnicode_FSConverter(cafile, &cafile_bytes)) { + PyErr_SetString(PyExc_TypeError, + "cafile should be a valid filesystem path"); + return NULL; + } + if (capath && !PyUnicode_FSConverter(capath, &capath_bytes)) { + Py_XDECREF(cafile_bytes); + PyErr_SetString(PyExc_TypeError, + "capath should be a valid filesystem path"); + return NULL; + } + if (cafile) + cafile_buf = PyBytes_AS_STRING(cafile_bytes); + if (capath) + capath_buf = PyBytes_AS_STRING(capath_bytes); + PySSL_BEGIN_ALLOW_THREADS + r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf); + PySSL_END_ALLOW_THREADS + Py_XDECREF(cafile_bytes); + Py_XDECREF(capath_bytes); + if (r != 1) { + if (errno != 0) { + ERR_clear_error(); + PyErr_SetFromErrno(PyExc_IOError); + } + else { + _setSSLError(NULL, 0, __FILE__, __LINE__); + } + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject * +context_wrap_socket(PySSLContext *self, PyObject *args, PyObject *kwds) +{ + char *kwlist[] = {"sock", "server_side", "server_hostname", NULL}; + PySocketSockObject *sock; + int server_side = 0; + char *hostname = NULL; + PyObject *hostname_obj, *res; + + /* server_hostname is either None (or absent), or to be encoded + using the idna encoding. */ + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i|O!:_wrap_socket", kwlist, + PySocketModule.Sock_Type, + &sock, &server_side, + Py_TYPE(Py_None), &hostname_obj)) { + PyErr_Clear(); + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!iet:_wrap_socket", kwlist, + PySocketModule.Sock_Type, + &sock, &server_side, + "idna", &hostname)) + return NULL; +#ifndef SSL_CTRL_SET_TLSEXT_HOSTNAME + PyMem_Free(hostname); + PyErr_SetString(PyExc_ValueError, "server_hostname is not supported " + "by your OpenSSL library"); + return NULL; +#endif + } + + res = (PyObject *) newPySSLSocket(self->ctx, sock, server_side, + hostname); + if (hostname != NULL) + PyMem_Free(hostname); + return res; +} + +static PyObject * +session_stats(PySSLContext *self, PyObject *unused) +{ + int r; + PyObject *value, *stats = PyDict_New(); + if (!stats) + return NULL; + +#define ADD_STATS(SSL_NAME, KEY_NAME) \ + value = PyLong_FromLong(SSL_CTX_sess_ ## SSL_NAME (self->ctx)); \ + if (value == NULL) \ + goto error; \ + r = PyDict_SetItemString(stats, KEY_NAME, value); \ + Py_DECREF(value); \ + if (r < 0) \ + goto error; + + ADD_STATS(number, "number"); + ADD_STATS(connect, "connect"); + ADD_STATS(connect_good, "connect_good"); + ADD_STATS(connect_renegotiate, "connect_renegotiate"); + ADD_STATS(accept, "accept"); + ADD_STATS(accept_good, "accept_good"); + ADD_STATS(accept_renegotiate, "accept_renegotiate"); + ADD_STATS(accept, "accept"); + ADD_STATS(hits, "hits"); + ADD_STATS(misses, "misses"); + ADD_STATS(timeouts, "timeouts"); + ADD_STATS(cache_full, "cache_full"); + +#undef ADD_STATS + + return stats; + +error: + Py_DECREF(stats); + return NULL; +} + +static PyObject * +set_default_verify_paths(PySSLContext *self, PyObject *unused) +{ + if (!SSL_CTX_set_default_verify_paths(self->ctx)) { + _setSSLError(NULL, 0, __FILE__, __LINE__); + return NULL; + } + Py_RETURN_NONE; +} + +static PyGetSetDef context_getsetlist[] = { + {"options", (getter) get_options, + (setter) set_options, NULL}, + {"verify_mode", (getter) get_verify_mode, + (setter) set_verify_mode, NULL}, + {NULL}, /* sentinel */ +}; + +static struct PyMethodDef context_methods[] = { + {"_wrap_socket", (PyCFunction) context_wrap_socket, + METH_VARARGS | METH_KEYWORDS, NULL}, + {"set_ciphers", (PyCFunction) set_ciphers, + METH_VARARGS, NULL}, + {"load_cert_chain", (PyCFunction) load_cert_chain, + METH_VARARGS | METH_KEYWORDS, NULL}, + {"load_verify_locations", (PyCFunction) load_verify_locations, + METH_VARARGS | METH_KEYWORDS, NULL}, + {"session_stats", (PyCFunction) session_stats, + METH_NOARGS, NULL}, + {"set_default_verify_paths", (PyCFunction) set_default_verify_paths, + METH_NOARGS, NULL}, + {NULL, NULL} /* sentinel */ +}; + +static PyTypeObject PySSLContext_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_ssl._SSLContext", /*tp_name*/ + sizeof(PySSLContext), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)context_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 | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + context_methods, /*tp_methods*/ + 0, /*tp_members*/ + context_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*/ + context_new, /*tp_new*/ }; + + #ifdef HAVE_OPENSSL_RAND /* helper routines for seeding the SSL PRNG */ @@ -1525,7 +1901,7 @@ bound on the entropy contained in string. See RFC 1750."); static PyObject * PySSL_RAND_status(PyObject *self) { - return PyInt_FromLong(RAND_status()); + return PyLong_FromLong(RAND_status()); } PyDoc_STRVAR(PySSL_RAND_status_doc, @@ -1536,22 +1912,24 @@ It is necessary to seed the PRNG with RAND_add() on some platforms before\n\ using the ssl() function."); static PyObject * -PySSL_RAND_egd(PyObject *self, PyObject *arg) +PySSL_RAND_egd(PyObject *self, PyObject *args) { + PyObject *path; int bytes; - if (!PyString_Check(arg)) - return PyErr_Format(PyExc_TypeError, - "RAND_egd() expected string, found %s", - Py_TYPE(arg)->tp_name); - bytes = RAND_egd(PyString_AS_STRING(arg)); + if (!PyArg_ParseTuple(args, "O&:RAND_egd", + PyUnicode_FSConverter, &path)) + return NULL; + + bytes = RAND_egd(PyBytes_AsString(path)); + Py_DECREF(path); if (bytes == -1) { PyErr_SetString(PySSLErrorObject, "EGD connection failed or EGD did not return " "enough data to seed the PRNG"); return NULL; } - return PyInt_FromLong(bytes); + return PyLong_FromLong(bytes); } PyDoc_STRVAR(PySSL_RAND_egd_doc, @@ -1563,17 +1941,17 @@ fails or if it does provide enough data to seed PRNG."); #endif + + /* List of functions exported by this module. */ static PyMethodDef PySSL_methods[] = { - {"sslwrap", PySSL_sslwrap, - METH_VARARGS, ssl_doc}, {"_test_decode_cert", PySSL_test_decode_certificate, METH_VARARGS}, #ifdef HAVE_OPENSSL_RAND {"RAND_add", PySSL_RAND_add, METH_VARARGS, PySSL_RAND_add_doc}, - {"RAND_egd", PySSL_RAND_egd, METH_O, + {"RAND_egd", PySSL_RAND_egd, METH_VARARGS, PySSL_RAND_egd_doc}, {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS, PySSL_RAND_status_doc}, @@ -1593,16 +1971,17 @@ static unsigned long _ssl_thread_id_function (void) { return PyThread_get_thread_ident(); } -static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) { +static void _ssl_thread_locking_function + (int mode, int n, const char *file, int line) { /* this function is needed to perform locking on shared data structures. (Note that OpenSSL uses a number of global data - structures that will be implicitly shared whenever multiple threads - use OpenSSL.) Multi-threaded applications will crash at random if - it is not set. + structures that will be implicitly shared whenever multiple + threads use OpenSSL.) Multi-threaded applications will + crash at random if it is not set. - locking_function() must be able to handle up to CRYPTO_num_locks() - different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and - releases it otherwise. + locking_function() must be able to handle up to + CRYPTO_num_locks() different mutex locks. It sets the n-th + lock if mode & CRYPTO_LOCK, and releases it otherwise. file and line are the file number of the function setting the lock. They can be useful for debugging. @@ -1629,7 +2008,8 @@ static int _setup_ssl_threads(void) { malloc(sizeof(PyThread_type_lock) * _ssl_locks_count); if (_ssl_locks == NULL) return 0; - memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count); + memset(_ssl_locks, 0, + sizeof(PyThread_type_lock) * _ssl_locks_count); for (i = 0; i < _ssl_locks_count; i++) { _ssl_locks[i] = PyThread_allocate_lock(); if (_ssl_locks[i] == NULL) { @@ -1653,23 +2033,60 @@ PyDoc_STRVAR(module_doc, "Implementation module for SSL socket operations. See the socket module\n\ for documentation."); + +static struct PyModuleDef _sslmodule = { + PyModuleDef_HEAD_INIT, + "_ssl", + module_doc, + -1, + PySSL_methods, + NULL, + NULL, + NULL, + NULL +}; + + +static void +parse_openssl_version(unsigned long libver, + unsigned int *major, unsigned int *minor, + unsigned int *fix, unsigned int *patch, + unsigned int *status) +{ + *status = libver & 0xF; + libver >>= 4; + *patch = libver & 0xFF; + libver >>= 8; + *fix = libver & 0xFF; + libver >>= 8; + *minor = libver & 0xFF; + libver >>= 8; + *major = libver & 0xFF; +} + PyMODINIT_FUNC -init_ssl(void) +PyInit__ssl(void) { PyObject *m, *d, *r; unsigned long libver; unsigned int major, minor, fix, patch, status; + PySocketModule_APIObject *socket_api; - Py_TYPE(&PySSL_Type) = &PyType_Type; + if (PyType_Ready(&PySSLContext_Type) < 0) + return NULL; + if (PyType_Ready(&PySSLSocket_Type) < 0) + return NULL; - m = Py_InitModule3("_ssl", PySSL_methods, module_doc); + m = PyModule_Create(&_sslmodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); /* Load _socket module and its C API */ - if (PySocketModule_ImportModuleAndAPI()) - return; + socket_api = PySocketModule_ImportModuleAndAPI(); + if (!socket_api) + return NULL; + PySocketModule = *socket_api; /* Init OpenSSL */ SSL_load_error_strings(); @@ -1677,7 +2094,7 @@ init_ssl(void) #ifdef WITH_THREAD /* note that this will start threading if not already started */ if (!_setup_ssl_threads()) { - return; + return NULL; } #endif OpenSSL_add_all_algorithms(); @@ -1687,12 +2104,15 @@ init_ssl(void) PySocketModule.error, NULL); if (PySSLErrorObject == NULL) - return; + return NULL; if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0) - return; - if (PyDict_SetItemString(d, "SSLType", - (PyObject *)&PySSL_Type) != 0) - return; + return NULL; + if (PyDict_SetItemString(d, "_SSLContext", + (PyObject *)&PySSLContext_Type) != 0) + return NULL; + if (PyDict_SetItemString(d, "_SSLSocket", + (PyObject *)&PySSLSocket_Type) != 0) + return NULL; PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN", PY_SSL_ERROR_ZERO_RETURN); PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ", @@ -1732,6 +2152,21 @@ init_ssl(void) PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", PY_SSL_VERSION_TLS1); + /* protocol options */ + PyModule_AddIntConstant(m, "OP_ALL", + SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS); + 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); + +#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME + r = Py_True; +#else + r = Py_False; +#endif + Py_INCREF(r); + PyModule_AddObject(m, "HAS_SNI", r); + /* OpenSSL version */ /* SSLeay() gives us the version of the library linked against, which could be different from the headers version. @@ -1739,22 +2174,22 @@ init_ssl(void) libver = SSLeay(); r = PyLong_FromUnsignedLong(libver); if (r == NULL) - return; + return NULL; if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r)) - return; - status = libver & 0xF; - libver >>= 4; - patch = libver & 0xFF; - libver >>= 8; - fix = libver & 0xFF; - libver >>= 8; - minor = libver & 0xFF; - libver >>= 8; - major = libver & 0xFF; + return NULL; + parse_openssl_version(libver, &major, &minor, &fix, &patch, &status); r = Py_BuildValue("IIIII", major, minor, fix, patch, status); if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r)) - return; - r = PyString_FromString(SSLeay_version(SSLEAY_VERSION)); + return NULL; + r = PyUnicode_FromString(SSLeay_version(SSLEAY_VERSION)); if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r)) - return; + return NULL; + + libver = OPENSSL_VERSION_NUMBER; + parse_openssl_version(libver, &major, &minor, &fix, &patch, &status); + r = Py_BuildValue("IIIII", major, minor, fix, patch, status); + if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r)) + return NULL; + + return m; } diff --git a/Modules/_struct.c b/Modules/_struct.c index d8c932427d6..edbe9b9884b 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -1,4 +1,4 @@ -/* struct module -- pack values into and (out of) strings */ +/* struct module -- pack values into and (out of) bytes objects */ /* New version supporting byte order, alignment and size options, character strings, and unsigned numbers */ @@ -6,23 +6,11 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structseq.h" #include "structmember.h" #include <ctype.h> static PyTypeObject PyStructType; -/* compatibility macros */ -#if (PY_VERSION_HEX < 0x02050000) -typedef int Py_ssize_t; -#endif - -/* warning messages */ -#define FLOAT_COERCE_WARN "integer argument expected, got float" -#define NON_INTEGER_WARN "integer argument expected, got non-integer " \ - "(implicit conversion using __int__ is deprecated)" - - /* The translation function for each format character is table driven */ typedef struct _formatdef { char format; @@ -100,96 +88,35 @@ typedef struct { char c; _Bool x; } s_bool; #pragma options align=reset #endif -static char *integer_codes = "bBhHiIlLqQ"; - -/* Helper to get a PyLongObject by hook or by crook. Caller should decref. */ +/* Helper for integer format codes: converts an arbitrary Python object to a + PyLongObject if possible, otherwise fails. Caller should decref. */ static PyObject * get_pylong(PyObject *v) { - PyObject *r, *w; - int converted = 0; assert(v != NULL); - if (!PyInt_Check(v) && !PyLong_Check(v)) { - PyNumberMethods *m; - /* Not an integer; first try to use __index__ to - convert to an integer. If the __index__ method - doesn't exist, or raises a TypeError, try __int__. - Use of the latter is deprecated, and will fail in - Python 3.x. */ - - m = Py_TYPE(v)->tp_as_number; + if (!PyLong_Check(v)) { + /* Not an integer; try to use __index__ to convert. */ if (PyIndex_Check(v)) { - w = PyNumber_Index(v); - if (w != NULL) { - v = w; - /* successfully converted to an integer */ - converted = 1; - } - else if (PyErr_ExceptionMatches(PyExc_TypeError)) { - PyErr_Clear(); - } - else - return NULL; - } - if (!converted && m != NULL && m->nb_int != NULL) { - /* Special case warning message for floats, for - backwards compatibility. */ - if (PyFloat_Check(v)) { - if (PyErr_WarnEx( - PyExc_DeprecationWarning, - FLOAT_COERCE_WARN, 1)) - return NULL; - } - else { - if (PyErr_WarnEx( - PyExc_DeprecationWarning, - NON_INTEGER_WARN, 1)) - return NULL; - } - v = m->nb_int(v); + v = PyNumber_Index(v); if (v == NULL) return NULL; - if (!PyInt_Check(v) && !PyLong_Check(v)) { - PyErr_SetString(PyExc_TypeError, - "__int__ method returned " - "non-integer"); - return NULL; - } - converted = 1; } - if (!converted) { + else { PyErr_SetString(StructError, - "cannot convert argument " - "to integer"); + "required argument is not an integer"); return NULL; } } else - /* Ensure we own a reference to v. */ Py_INCREF(v); - assert(PyInt_Check(v) || PyLong_Check(v)); - if (PyInt_Check(v)) { - r = PyLong_FromLong(PyInt_AS_LONG(v)); - Py_DECREF(v); - } - else if (PyLong_Check(v)) { - assert(PyLong_Check(v)); - r = v; - } - else { - r = NULL; /* silence compiler warning about - possibly uninitialized variable */ - assert(0); /* shouldn't ever get here */ - } - - return r; + assert(PyLong_Check(v)); + return v; } -/* Helper to convert a Python object to a C long. Sets an exception - (struct.error for an inconvertible type, OverflowError for - out-of-range values) and returns -1 on error. */ +/* Helper routine to get a C long and raise the appropriate error if it isn't + one */ static int get_long(PyObject *v, long *p) @@ -202,12 +129,17 @@ get_long(PyObject *v, long *p) assert(PyLong_Check(v)); x = PyLong_AsLong(v); Py_DECREF(v); - if (x == (long)-1 && PyErr_Occurred()) + if (x == (long)-1 && PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_OverflowError)) + PyErr_SetString(StructError, + "argument out of range"); return -1; + } *p = x; return 0; } + /* Same, but handling unsigned long */ static int @@ -221,8 +153,12 @@ get_ulong(PyObject *v, unsigned long *p) assert(PyLong_Check(v)); x = PyLong_AsUnsignedLong(v); Py_DECREF(v); - if (x == (unsigned long)-1 && PyErr_Occurred()) + if (x == (unsigned long)-1 && PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_OverflowError)) + PyErr_SetString(StructError, + "argument out of range"); return -1; + } *p = x; return 0; } @@ -242,8 +178,12 @@ get_longlong(PyObject *v, PY_LONG_LONG *p) assert(PyLong_Check(v)); x = PyLong_AsLongLong(v); Py_DECREF(v); - if (x == (PY_LONG_LONG)-1 && PyErr_Occurred()) + if (x == (PY_LONG_LONG)-1 && PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_OverflowError)) + PyErr_SetString(StructError, + "argument out of range"); return -1; + } *p = x; return 0; } @@ -261,14 +201,22 @@ get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p) assert(PyLong_Check(v)); x = PyLong_AsUnsignedLongLong(v); Py_DECREF(v); - if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) + if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_OverflowError)) + PyErr_SetString(StructError, + "argument out of range"); return -1; + } *p = x; return 0; } #endif + +#define RANGE_ERROR(x, f, flag, mask) return _range_error(f, flag) + + /* Floating point helpers */ static PyObject * @@ -322,6 +270,7 @@ _range_error(const formatdef *f, int is_unsigned) ~ largest, largest); } + return -1; } @@ -349,19 +298,19 @@ _range_error(const formatdef *f, int is_unsigned) static PyObject * nu_char(const char *p, const formatdef *f) { - return PyString_FromStringAndSize(p, 1); + return PyBytes_FromStringAndSize(p, 1); } static PyObject * nu_byte(const char *p, const formatdef *f) { - return PyInt_FromLong((long) *(signed char *)p); + return PyLong_FromLong((long) *(signed char *)p); } static PyObject * nu_ubyte(const char *p, const formatdef *f) { - return PyInt_FromLong((long) *(unsigned char *)p); + return PyLong_FromLong((long) *(unsigned char *)p); } static PyObject * @@ -369,7 +318,7 @@ nu_short(const char *p, const formatdef *f) { short x; memcpy((char *)&x, p, sizeof x); - return PyInt_FromLong((long)x); + return PyLong_FromLong((long)x); } static PyObject * @@ -377,7 +326,7 @@ nu_ushort(const char *p, const formatdef *f) { unsigned short x; memcpy((char *)&x, p, sizeof x); - return PyInt_FromLong((long)x); + return PyLong_FromLong((long)x); } static PyObject * @@ -385,7 +334,7 @@ nu_int(const char *p, const formatdef *f) { int x; memcpy((char *)&x, p, sizeof x); - return PyInt_FromLong((long)x); + return PyLong_FromLong((long)x); } static PyObject * @@ -394,10 +343,10 @@ nu_uint(const char *p, const formatdef *f) unsigned int x; memcpy((char *)&x, p, sizeof x); #if (SIZEOF_LONG > SIZEOF_INT) - return PyInt_FromLong((long)x); + return PyLong_FromLong((long)x); #else if (x <= ((unsigned int)LONG_MAX)) - return PyInt_FromLong((long)x); + return PyLong_FromLong((long)x); return PyLong_FromUnsignedLong((unsigned long)x); #endif } @@ -407,7 +356,7 @@ nu_long(const char *p, const formatdef *f) { long x; memcpy((char *)&x, p, sizeof x); - return PyInt_FromLong(x); + return PyLong_FromLong(x); } static PyObject * @@ -416,7 +365,7 @@ nu_ulong(const char *p, const formatdef *f) unsigned long x; memcpy((char *)&x, p, sizeof x); if (x <= LONG_MAX) - return PyInt_FromLong((long)x); + return PyLong_FromLong((long)x); return PyLong_FromUnsignedLong(x); } @@ -431,7 +380,7 @@ nu_longlong(const char *p, const formatdef *f) PY_LONG_LONG x; memcpy((char *)&x, p, sizeof x); if (x >= LONG_MIN && x <= LONG_MAX) - return PyInt_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long)); + return PyLong_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long)); return PyLong_FromLongLong(x); } @@ -441,7 +390,7 @@ nu_ulonglong(const char *p, const formatdef *f) unsigned PY_LONG_LONG x; memcpy((char *)&x, p, sizeof x); if (x <= LONG_MAX) - return PyInt_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long)); + return PyLong_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long)); return PyLong_FromUnsignedLongLong(x); } @@ -513,12 +462,12 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) static int np_char(char *p, PyObject *v, const formatdef *f) { - if (!PyString_Check(v) || PyString_Size(v) != 1) { + if (!PyBytes_Check(v) || PyBytes_Size(v) != 1) { PyErr_SetString(StructError, - "char format require string of length 1"); + "char format requires a bytes object of length 1"); return -1; } - *p = *PyString_AsString(v); + *p = *PyBytes_AsString(v); return 0; } @@ -566,7 +515,7 @@ np_int(char *p, PyObject *v, const formatdef *f) return -1; #if (SIZEOF_LONG > SIZEOF_INT) if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX))) - return _range_error(f, 0); + RANGE_ERROR(x, f, 0, -1); #endif y = (int)x; memcpy(p, (char *)&y, sizeof y); @@ -583,7 +532,7 @@ np_uint(char *p, PyObject *v, const formatdef *f) y = (unsigned int)x; #if (SIZEOF_LONG > SIZEOF_INT) if (x > ((unsigned long)UINT_MAX)) - return _range_error(f, 1); + RANGE_ERROR(y, f, 1, -1); #endif memcpy(p, (char *)&y, sizeof y); return 0; @@ -727,7 +676,7 @@ bu_int(const char *p, const formatdef *f) /* Extend the sign bit. */ if (SIZEOF_LONG > f->size) x |= -(x & (1L << ((8 * f->size) - 1))); - return PyInt_FromLong(x); + return PyLong_FromLong(x); } static PyObject * @@ -740,7 +689,7 @@ bu_uint(const char *p, const formatdef *f) x = (x<<8) | *bytes++; } while (--i > 0); if (x <= LONG_MAX) - return PyInt_FromLong((long)x); + return PyLong_FromLong((long)x); return PyLong_FromUnsignedLong(x); } @@ -758,7 +707,7 @@ bu_longlong(const char *p, const formatdef *f) if (SIZEOF_LONG_LONG > f->size) x |= -(x & ((PY_LONG_LONG)1 << ((8 * f->size) - 1))); if (x >= LONG_MIN && x <= LONG_MAX) - return PyInt_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long)); + return PyLong_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long)); return PyLong_FromLongLong(x); #else return _PyLong_FromByteArray((const unsigned char *)p, @@ -779,7 +728,7 @@ bu_ulonglong(const char *p, const formatdef *f) x = (x<<8) | *bytes++; } while (--i > 0); if (x <= LONG_MAX) - return PyInt_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long)); + return PyLong_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long)); return PyLong_FromUnsignedLongLong(x); #else return _PyLong_FromByteArray((const unsigned char *)p, @@ -819,10 +768,10 @@ bp_int(char *p, PyObject *v, const formatdef *f) i = f->size; if (i != SIZEOF_LONG) { if ((i == 2) && (x < -32768 || x > 32767)) - return _range_error(f, 0); + RANGE_ERROR(x, f, 0, 0xffffL); #if (SIZEOF_LONG != 4) else if ((i == 4) && (x < -2147483648L || x > 2147483647L)) - return _range_error(f, 0); + RANGE_ERROR(x, f, 0, 0xffffffffL); #endif } do { @@ -844,7 +793,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f) unsigned long maxint = 1; maxint <<= (unsigned long)(i * 8); if (x >= maxint) - return _range_error(f, 1); + RANGE_ERROR(x, f, 1, maxint - 1); } do { p[--i] = (char)x; @@ -955,7 +904,7 @@ lu_int(const char *p, const formatdef *f) /* Extend the sign bit. */ if (SIZEOF_LONG > f->size) x |= -(x & (1L << ((8 * f->size) - 1))); - return PyInt_FromLong(x); + return PyLong_FromLong(x); } static PyObject * @@ -968,7 +917,7 @@ lu_uint(const char *p, const formatdef *f) x = (x<<8) | bytes[--i]; } while (i > 0); if (x <= LONG_MAX) - return PyInt_FromLong((long)x); + return PyLong_FromLong((long)x); return PyLong_FromUnsignedLong((long)x); } @@ -986,7 +935,7 @@ lu_longlong(const char *p, const formatdef *f) if (SIZEOF_LONG_LONG > f->size) x |= -(x & ((PY_LONG_LONG)1 << ((8 * f->size) - 1))); if (x >= LONG_MIN && x <= LONG_MAX) - return PyInt_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long)); + return PyLong_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long)); return PyLong_FromLongLong(x); #else return _PyLong_FromByteArray((const unsigned char *)p, @@ -1007,7 +956,7 @@ lu_ulonglong(const char *p, const formatdef *f) x = (x<<8) | bytes[--i]; } while (i > 0); if (x <= LONG_MAX) - return PyInt_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long)); + return PyLong_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long)); return PyLong_FromUnsignedLongLong(x); #else return _PyLong_FromByteArray((const unsigned char *)p, @@ -1039,10 +988,10 @@ lp_int(char *p, PyObject *v, const formatdef *f) i = f->size; if (i != SIZEOF_LONG) { if ((i == 2) && (x < -32768 || x > 32767)) - return _range_error(f, 0); + RANGE_ERROR(x, f, 0, 0xffffL); #if (SIZEOF_LONG != 4) else if ((i == 4) && (x < -2147483648L || x > 2147483647L)) - return _range_error(f, 0); + RANGE_ERROR(x, f, 0, 0xffffffffL); #endif } do { @@ -1064,7 +1013,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f) unsigned long maxint = 1; maxint <<= (unsigned long)(i * 8); if (x >= maxint) - return _range_error(f, 1); + RANGE_ERROR(x, f, 1, maxint - 1); } do { *p++ = (char)x; @@ -1227,7 +1176,7 @@ prepare_s(PyStructObject *self) char c; Py_ssize_t size, len, num, itemsize; - fmt = PyString_AS_STRING(self->s_format); + fmt = PyBytes_AS_STRING(self->s_format); f = whichtable((char **)&fmt); @@ -1248,8 +1197,11 @@ prepare_s(PyStructObject *self) goto overflow; num = num*10 + (c - '0'); } - if (c == '\0') - break; + if (c == '\0') { + PyErr_SetString(StructError, + "repeat count given without format specifier"); + return -1; + } } else num = 1; @@ -1371,11 +1323,28 @@ s_init(PyObject *self, PyObject *args, PyObject *kwds) assert(PyStruct_Check(self)); - if (!PyArg_ParseTupleAndKeywords(args, kwds, "S:Struct", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:Struct", kwlist, &o_format)) return -1; - Py_INCREF(o_format); + if (PyUnicode_Check(o_format)) { + o_format = PyUnicode_AsASCIIString(o_format); + if (o_format == NULL) + return -1; + } + /* XXX support buffer interface, too */ + else { + Py_INCREF(o_format); + } + + if (!PyBytes_Check(o_format)) { + Py_DECREF(o_format); + PyErr_Format(PyExc_TypeError, + "Struct() argument 1 must be a bytes object, not %.200s", + Py_TYPE(o_format)->tp_name); + return -1; + } + Py_CLEAR(soself->s_format); soself->s_format = o_format; @@ -1408,12 +1377,12 @@ s_unpack_internal(PyStructObject *soself, char *startfrom) { const formatdef *e = code->fmtdef; const char *res = startfrom + code->offset; if (e->format == 's') { - v = PyString_FromStringAndSize(res, code->size); + 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 = PyString_FromStringAndSize(res + 1, n); + v = PyBytes_FromStringAndSize(res + 1, n); } else { v = e->unpack(res, e); } @@ -1430,89 +1399,74 @@ fail: PyDoc_STRVAR(s_unpack__doc__, -"S.unpack(str) -> (v1, v2, ...)\n\ +"S.unpack(buffer) -> (v1, v2, ...)\n\ \n\ -Return tuple containing values unpacked according to this Struct's format.\n\ -Requires len(str) == self.size. See struct.__doc__ for more on format\n\ -strings."); +Return a tuple containing values unpacked according to the format\n\ +string S.format. Requires len(buffer) == S.size. See help(struct)\n\ +for more on format strings."); static PyObject * -s_unpack(PyObject *self, PyObject *inputstr) +s_unpack(PyObject *self, PyObject *input) { - char *start; - Py_ssize_t len; - PyObject *args=NULL, *result; + Py_buffer vbuf; + PyObject *result; PyStructObject *soself = (PyStructObject *)self; + assert(PyStruct_Check(self)); assert(soself->s_codes != NULL); - if (inputstr == NULL) - goto fail; - if (PyString_Check(inputstr) && - PyString_GET_SIZE(inputstr) == soself->s_size) { - return s_unpack_internal(soself, PyString_AS_STRING(inputstr)); - } - args = PyTuple_Pack(1, inputstr); - if (args == NULL) + if (PyObject_GetBuffer(input, &vbuf, PyBUF_SIMPLE) < 0) return NULL; - if (!PyArg_ParseTuple(args, "s#:unpack", &start, &len)) - goto fail; - if (soself->s_size != len) - goto fail; - result = s_unpack_internal(soself, start); - Py_DECREF(args); + if (vbuf.len != soself->s_size) { + PyErr_Format(StructError, + "unpack requires a bytes object of length %zd", + soself->s_size); + PyBuffer_Release(&vbuf); + return NULL; + } + result = s_unpack_internal(soself, vbuf.buf); + PyBuffer_Release(&vbuf); return result; - -fail: - Py_XDECREF(args); - PyErr_Format(StructError, - "unpack requires a string argument of length %zd", - soself->s_size); - return NULL; } PyDoc_STRVAR(s_unpack_from__doc__, -"S.unpack_from(buffer[, offset]) -> (v1, v2, ...)\n\ +"S.unpack_from(buffer, offset=0) -> (v1, v2, ...)\n\ \n\ -Return tuple containing values unpacked according to this Struct's format.\n\ -Unlike unpack, unpack_from can unpack values from any object supporting\n\ -the buffer API, not just str. Requires len(buffer[offset:]) >= self.size.\n\ -See struct.__doc__ for more on format strings."); +Return a tuple containing values unpacked according to the format\n\ +string S.format. Requires len(buffer[offset:]) >= S.size. See\n\ +help(struct) for more on format strings."); static PyObject * s_unpack_from(PyObject *self, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"buffer", "offset", 0}; -#if (PY_VERSION_HEX < 0x02050000) - static char *fmt = "z#|i:unpack_from"; -#else - static char *fmt = "z#|n:unpack_from"; -#endif - Py_ssize_t buffer_len = 0, offset = 0; - char *buffer = NULL; + + PyObject *input; + Py_ssize_t offset = 0; + Py_buffer vbuf; + PyObject *result; PyStructObject *soself = (PyStructObject *)self; + assert(PyStruct_Check(self)); assert(soself->s_codes != NULL); - if (!PyArg_ParseTupleAndKeywords(args, kwds, fmt, kwlist, - &buffer, &buffer_len, &offset)) + if (!PyArg_ParseTupleAndKeywords(args, kwds, + "O|n:unpack_from", kwlist, + &input, &offset)) return NULL; - - if (buffer == NULL) { - PyErr_Format(StructError, - "unpack_from requires a buffer argument"); + if (PyObject_GetBuffer(input, &vbuf, PyBUF_SIMPLE) < 0) return NULL; - } - if (offset < 0) - offset += buffer_len; - - if (offset < 0 || (buffer_len - offset) < soself->s_size) { + offset += vbuf.len; + if (offset < 0 || vbuf.len - offset < soself->s_size) { PyErr_Format(StructError, "unpack_from requires a buffer of at least %zd bytes", soself->s_size); + PyBuffer_Release(&vbuf); return NULL; } - return s_unpack_internal(soself, buffer + offset); + result = s_unpack_internal(soself, (char*)vbuf.buf + offset); + PyBuffer_Release(&vbuf); + return result; } @@ -1542,40 +1496,57 @@ s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf) const formatdef *e = code->fmtdef; char *res = buf + code->offset; if (e->format == 's') { - if (!PyString_Check(v)) { + int isstring; + void *p; + isstring = PyBytes_Check(v); + if (!isstring && !PyByteArray_Check(v)) { PyErr_SetString(StructError, - "argument for 's' must " - "be a string"); + "argument for 's' must be a bytes object"); return -1; } - n = PyString_GET_SIZE(v); + 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, PyString_AS_STRING(v), n); + memcpy(res, p, n); } else if (e->format == 'p') { - if (!PyString_Check(v)) { + int isstring; + void *p; + isstring = PyBytes_Check(v); + if (!isstring && !PyByteArray_Check(v)) { PyErr_SetString(StructError, - "argument for 'p' must " - "be a string"); + "argument for 'p' must be a bytes object"); return -1; } - n = PyString_GET_SIZE(v); + 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, PyString_AS_STRING(v), n); + 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 (strchr(integer_codes, e->format) != NULL && - PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_Format(StructError, - "integer out of range for " - "'%c' format code", - e->format); - return -1; + } 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; + } } } @@ -1585,10 +1556,11 @@ s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf) PyDoc_STRVAR(s_pack__doc__, -"S.pack(v1, v2, ...) -> string\n\ +"S.pack(v1, v2, ...) -> bytes\n\ \n\ -Return a string containing values v1, v2, ... packed according to this\n\ -Struct's format. See struct.__doc__ for more on format strings."); +Return a bytes object containing values v1, v2, ... packed according\n\ +to the format string S.format. See help(struct) for more on format\n\ +strings."); static PyObject * s_pack(PyObject *self, PyObject *args) @@ -1608,12 +1580,12 @@ s_pack(PyObject *self, PyObject *args) } /* Allocate a new string */ - result = PyString_FromStringAndSize((char *)NULL, soself->s_size); + result = PyBytes_FromStringAndSize((char *)NULL, soself->s_size); if (result == NULL) return NULL; /* Call the guts */ - if ( s_pack_internal(soself, args, 0, PyString_AS_STRING(result)) != 0 ) { + if ( s_pack_internal(soself, args, 0, PyBytes_AS_STRING(result)) != 0 ) { Py_DECREF(result); return NULL; } @@ -1624,10 +1596,10 @@ s_pack(PyObject *self, PyObject *args) PyDoc_STRVAR(s_pack_into__doc__, "S.pack_into(buffer, offset, v1, v2, ...)\n\ \n\ -Pack the values v1, v2, ... according to this Struct's format, write \n\ -the packed bytes into the writable buffer buf starting at offset. Note\n\ -that the offset is not an optional argument. See struct.__doc__ for \n\ -more on format strings."); +Pack the values v1, v2, ... according to the format string S.format\n\ +and write the packed bytes into the writable buffer buf starting at\n\ +offset. Note that the offset is a required argument. See\n\ +help(struct) for more on format strings."); static PyObject * s_pack_into(PyObject *self, PyObject *args) @@ -1666,7 +1638,7 @@ s_pack_into(PyObject *self, PyObject *args) assert( buffer_len >= 0 ); /* Extract the offset from the first argument */ - offset = PyInt_AsSsize_t(PyTuple_GET_ITEM(args, 1)); + offset = PyNumber_AsSsize_t(PyTuple_GET_ITEM(args, 1), PyExc_IndexError); if (offset == -1 && PyErr_Occurred()) return NULL; @@ -1700,7 +1672,7 @@ s_get_format(PyStructObject *self, void *unused) static PyObject * s_get_size(PyStructObject *self, void *unused) { - return PyInt_FromSsize_t(self->s_size); + return PyLong_FromSsize_t(self->s_size); } PyDoc_STRVAR(s_sizeof__doc__, @@ -1727,7 +1699,11 @@ static struct PyMethodDef s_methods[] = { {NULL, NULL} /* sentinel */ }; -PyDoc_STRVAR(s__doc__, "Compiled struct object"); +PyDoc_STRVAR(s__doc__, +"Struct(fmt) --> compiled struct object\n" +"\n" +"Return a new Struct object which writes and reads binary data according to\n" +"the format string fmt. See help(struct) for more on format strings."); #define OFF(x) offsetof(PyStructObject, x) @@ -1747,7 +1723,7 @@ PyTypeObject PyStructType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1758,7 +1734,7 @@ PyTypeObject PyStructType = { PyObject_GenericGetAttr, /* tp_getattro */ PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS,/* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ s__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ @@ -1825,7 +1801,9 @@ clearcache(PyObject *self) } PyDoc_STRVAR(calcsize_doc, -"Return size of C struct described by format string fmt."); +"calcsize(fmt) -> integer\n\ +\n\ +Return size in bytes of the struct described by the format string fmt."); static PyObject * calcsize(PyObject *self, PyObject *fmt) @@ -1836,11 +1814,14 @@ calcsize(PyObject *self, PyObject *fmt) return NULL; n = ((PyStructObject *)s_object)->s_size; Py_DECREF(s_object); - return PyInt_FromSsize_t(n); + return PyLong_FromSsize_t(n); } PyDoc_STRVAR(pack_doc, -"Return string containing values v1, v2, ... packed according to fmt."); +"pack(fmt, v1, v2, ...) -> bytes\n\ +\n\ +Return a bytes object containing the values v1, v2, ... packed according\n\ +to the format string fmt. See help(struct) for more on format strings."); static PyObject * pack(PyObject *self, PyObject *args) @@ -1869,8 +1850,12 @@ pack(PyObject *self, PyObject *args) } PyDoc_STRVAR(pack_into_doc, -"Pack the values v1, v2, ... according to fmt.\n\ -Write the packed bytes into the writable buffer buf starting at offset."); +"pack_into(fmt, buffer, offset, v1, v2, ...)\n\ +\n\ +Pack the values v1, v2, ... according to the format string fmt and write\n\ +the packed bytes into the writable buffer buf starting at offset. Note\n\ +that the offset is a required argument. See help(struct) for more\n\ +on format strings."); static PyObject * pack_into(PyObject *self, PyObject *args) @@ -1899,8 +1884,11 @@ pack_into(PyObject *self, PyObject *args) } PyDoc_STRVAR(unpack_doc, -"Unpack the string containing packed C structure data, according to fmt.\n\ -Requires len(string) == calcsize(fmt)."); +"unpack(fmt, buffer) -> (v1, v2, ...)\n\ +\n\ +Return a tuple containing values unpacked according to the format string\n\ +fmt. Requires len(buffer) == calcsize(fmt). See help(struct) for more\n\ +on format strings."); static PyObject * unpack(PyObject *self, PyObject *args) @@ -1919,8 +1907,11 @@ unpack(PyObject *self, PyObject *args) } PyDoc_STRVAR(unpack_from_doc, -"Unpack the buffer, containing packed C structure data, according to\n\ -fmt, starting at offset. Requires len(buffer[offset:]) >= calcsize(fmt)."); +"unpack_from(fmt, buffer, offset=0) -> (v1, v2, ...)\n\ +\n\ +Return a tuple containing values unpacked according to the format string\n\ +fmt. Requires len(buffer[offset:]) >= calcsize(fmt). See help(struct)\n\ +for more on format strings."); static PyObject * unpack_from(PyObject *self, PyObject *args, PyObject *kwds) @@ -1963,10 +1954,10 @@ static struct PyMethodDef module_functions[] = { /* Module initialization */ PyDoc_STRVAR(module_doc, -"Functions to convert between Python values and C structs represented\n\ -as Python strings. It uses format strings (explained below) as compact\n\ -descriptions of the lay-out of the C structs and the intended conversion\n\ -to/from Python values.\n\ +"Functions to convert between Python values and C structs.\n\ +Python bytes objects are used to hold the data representing the C struct\n\ +and also as format strings (explained below) to describe the layout of data\n\ +in the C struct.\n\ \n\ The optional first format char indicates byte order, size and alignment:\n\ @: native order, size & alignment (default)\n\ @@ -1991,26 +1982,31 @@ Whitespace between formats is ignored.\n\ \n\ The variable struct.error is an exception raised on errors.\n"); + +static struct PyModuleDef _structmodule = { + PyModuleDef_HEAD_INIT, + "_struct", + module_doc, + -1, + module_functions, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_struct(void) +PyInit__struct(void) { - PyObject *ver, *m; + PyObject *m; - ver = PyString_FromString("0.2"); - if (ver == NULL) - return; - - m = Py_InitModule3("_struct", module_functions, module_doc); + m = PyModule_Create(&_structmodule); if (m == NULL) - return; + return NULL; Py_TYPE(&PyStructType) = &PyType_Type; if (PyType_Ready(&PyStructType) < 0) - return; - - /* This speed trick can't be used until overflow masking goes - away, because native endian always raises exceptions - instead of overflow masking. */ + return NULL; /* Check endian and swap in faster functions */ { @@ -2055,7 +2051,7 @@ init_struct(void) if (StructError == NULL) { StructError = PyErr_NewException("struct.error", NULL, NULL); if (StructError == NULL) - return; + return NULL; } Py_INCREF(StructError); @@ -2064,8 +2060,5 @@ init_struct(void) Py_INCREF((PyObject*)&PyStructType); PyModule_AddObject(m, "Struct", (PyObject*)&PyStructType); - PyModule_AddObject(m, "__version__", ver); - - PyModule_AddIntConstant(m, "_PY_STRUCT_RANGE_CHECKING", 1); - PyModule_AddIntConstant(m, "_PY_STRUCT_FLOAT_COERCE", 1); + return m; } diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index f1968e2a70c..94b6e6793a5 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5,6 +5,8 @@ * standard Python regression test, via Lib/test/test_capi.py. */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" #include <float.h> #include "structmember.h" @@ -84,7 +86,7 @@ test_list_api(PyObject *self) return (PyObject*)NULL; /* list = range(NLIST) */ for (i = 0; i < NLIST; ++i) { - PyObject* anint = PyInt_FromLong(i); + PyObject* anint = PyLong_FromLong(i); if (anint == (PyObject*)NULL) { Py_DECREF(list); return (PyObject*)NULL; @@ -100,7 +102,7 @@ test_list_api(PyObject *self) /* Check that list == range(29, -1, -1) now */ for (i = 0; i < NLIST; ++i) { PyObject* anint = PyList_GET_ITEM(list, i); - if (PyInt_AS_LONG(anint) != NLIST-1-i) { + if (PyLong_AS_LONG(anint) != NLIST-1-i) { PyErr_SetString(TestError, "test_list_api: reverse screwed up"); Py_DECREF(list); @@ -126,7 +128,7 @@ test_dict_inner(int count) return -1; for (i = 0; i < count; i++) { - v = PyInt_FromLong(i); + v = PyLong_FromLong(i); PyDict_SetItem(dict, v, v); Py_DECREF(v); } @@ -135,8 +137,8 @@ test_dict_inner(int count) PyObject *o; iterations++; - i = PyInt_AS_LONG(v) + 1; - o = PyInt_FromLong(i); + i = PyLong_AS_LONG(v) + 1; + o = PyLong_FromLong(i); if (o == NULL) return -1; if (PyDict_SetItem(dict, k, o) < 0) { @@ -178,8 +180,7 @@ test_dict_iteration(PyObject* self) * PyType_Ready if it hasn't already been called */ static PyTypeObject _HashInheritanceTester_Type = { - PyObject_HEAD_INIT(NULL) - 0, /* Number of items for varobject */ + PyVarObject_HEAD_INIT(NULL, 0) "hashinheritancetester", /* Name of this type */ sizeof(PyObject), /* Basic object size */ 0, /* Item size for varobject */ @@ -187,7 +188,7 @@ static PyTypeObject _HashInheritanceTester_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -224,7 +225,7 @@ test_lazy_hash_inheritance(PyObject* self) { PyTypeObject *type; PyObject *obj; - long hash; + Py_hash_t hash; type = &_HashInheritanceTester_Type; @@ -297,17 +298,12 @@ broken_buffer_getbuffer(PyObject *self, Py_buffer *view, int flags) } static PyBufferProcs memoryviewtester_as_buffer = { - 0, /* bf_getreadbuffer */ - 0, /* bf_getwritebuffer */ - 0, /* bf_getsegcount */ - 0, /* bf_getcharbuffer */ (getbufferproc)broken_buffer_getbuffer, /* bf_getbuffer */ 0, /* bf_releasebuffer */ }; static PyTypeObject _MemoryViewTester_Type = { - PyObject_HEAD_INIT(NULL) - 0, /* Number of items for varobject */ + PyVarObject_HEAD_INIT(NULL, 0) "memoryviewtester", /* Name of this type */ sizeof(PyObject), /* Basic object size */ 0, /* Item size for varobject */ @@ -326,7 +322,7 @@ static PyTypeObject _MemoryViewTester_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ &memoryviewtester_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER, /* tp_flags */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ 0, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ @@ -810,7 +806,7 @@ test_L_code(PyObject *self) "L code returned wrong value for long 42"); Py_DECREF(num); - num = PyInt_FromLong(42); + num = PyLong_FromLong(42); if (num == NULL) return NULL; @@ -936,8 +932,8 @@ getargs_n(PyObject *self, PyObject *args) { Py_ssize_t value; if (!PyArg_ParseTuple(args, "n", &value)) - return NULL; - return PyInt_FromSsize_t(value); + return NULL; + return PyLong_FromSsize_t(value); } #ifdef HAVE_LONG_LONG @@ -961,7 +957,7 @@ getargs_K(PyObject *self, PyObject *args) #endif /* This function not only tests the 'k' getargs code, but also the - PyInt_AsUnsignedLongMask() and PyInt_AsUnsignedLongMask() functions. */ + PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */ static PyObject * test_k_code(PyObject *self) { @@ -977,10 +973,10 @@ test_k_code(PyObject *self) if (num == NULL) return NULL; - value = PyInt_AsUnsignedLongMask(num); + value = PyLong_AsUnsignedLongMask(num); if (value != ULONG_MAX) return raiseTestError("test_k_code", - "PyInt_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF"); + "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF"); PyTuple_SET_ITEM(tuple, 0, num); @@ -996,10 +992,10 @@ test_k_code(PyObject *self) if (num == NULL) return NULL; - value = PyInt_AsUnsignedLongMask(num); + value = PyLong_AsUnsignedLongMask(num); if (value != (unsigned long)-0x42) return raiseTestError("test_k_code", - "PyInt_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF"); + "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF"); PyTuple_SET_ITEM(tuple, 0, num); @@ -1015,7 +1011,236 @@ test_k_code(PyObject *self) return Py_None; } -#ifdef Py_USING_UNICODE +static PyObject * +getargs_s(PyObject *self, PyObject *args) +{ + char *str; + if (!PyArg_ParseTuple(args, "s", &str)) + return NULL; + return PyBytes_FromString(str); +} + +static PyObject * +getargs_s_star(PyObject *self, PyObject *args) +{ + Py_buffer buffer; + PyObject *bytes; + if (!PyArg_ParseTuple(args, "s*", &buffer)) + return NULL; + bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len); + PyBuffer_Release(&buffer); + return bytes; +} + +static PyObject * +getargs_s_hash(PyObject *self, PyObject *args) +{ + char *str; + Py_ssize_t size; + if (!PyArg_ParseTuple(args, "s#", &str, &size)) + return NULL; + return PyBytes_FromStringAndSize(str, size); +} + +static PyObject * +getargs_z(PyObject *self, PyObject *args) +{ + char *str; + if (!PyArg_ParseTuple(args, "z", &str)) + return NULL; + if (str != NULL) + return PyBytes_FromString(str); + else + Py_RETURN_NONE; +} + +static PyObject * +getargs_z_star(PyObject *self, PyObject *args) +{ + Py_buffer buffer; + PyObject *bytes; + if (!PyArg_ParseTuple(args, "z*", &buffer)) + return NULL; + if (buffer.buf != NULL) + bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len); + else { + Py_INCREF(Py_None); + bytes = Py_None; + } + PyBuffer_Release(&buffer); + return bytes; +} + +static PyObject * +getargs_z_hash(PyObject *self, PyObject *args) +{ + char *str; + Py_ssize_t size; + if (!PyArg_ParseTuple(args, "z#", &str, &size)) + return NULL; + if (str != NULL) + return PyBytes_FromStringAndSize(str, size); + else + Py_RETURN_NONE; +} + +static PyObject * +getargs_y(PyObject *self, PyObject *args) +{ + char *str; + if (!PyArg_ParseTuple(args, "y", &str)) + return NULL; + return PyBytes_FromString(str); +} + +static PyObject * +getargs_y_star(PyObject *self, PyObject *args) +{ + Py_buffer buffer; + PyObject *bytes; + if (!PyArg_ParseTuple(args, "y*", &buffer)) + return NULL; + bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len); + PyBuffer_Release(&buffer); + return bytes; +} + +static PyObject * +getargs_y_hash(PyObject *self, PyObject *args) +{ + char *str; + Py_ssize_t size; + if (!PyArg_ParseTuple(args, "y#", &str, &size)) + return NULL; + return PyBytes_FromStringAndSize(str, size); +} + +static PyObject * +getargs_u(PyObject *self, PyObject *args) +{ + Py_UNICODE *str; + Py_ssize_t size; + if (!PyArg_ParseTuple(args, "u", &str)) + return NULL; + size = Py_UNICODE_strlen(str); + return PyUnicode_FromUnicode(str, size); +} + +static PyObject * +getargs_u_hash(PyObject *self, PyObject *args) +{ + Py_UNICODE *str; + Py_ssize_t size; + if (!PyArg_ParseTuple(args, "u#", &str, &size)) + return NULL; + return PyUnicode_FromUnicode(str, size); +} + +static PyObject * +getargs_Z(PyObject *self, PyObject *args) +{ + Py_UNICODE *str; + Py_ssize_t size; + if (!PyArg_ParseTuple(args, "Z", &str)) + return NULL; + if (str != NULL) { + size = Py_UNICODE_strlen(str); + return PyUnicode_FromUnicode(str, size); + } else + Py_RETURN_NONE; +} + +static PyObject * +getargs_Z_hash(PyObject *self, PyObject *args) +{ + Py_UNICODE *str; + Py_ssize_t size; + if (!PyArg_ParseTuple(args, "Z#", &str, &size)) + return NULL; + if (str != NULL) + return PyUnicode_FromUnicode(str, size); + else + Py_RETURN_NONE; +} + +/* Test the s and z codes for PyArg_ParseTuple. +*/ +static PyObject * +test_s_code(PyObject *self) +{ + /* Unicode strings should be accepted */ + PyObject *tuple, *obj; + char *value; + + tuple = PyTuple_New(1); + if (tuple == NULL) + return NULL; + + obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"), + "latin-1", NULL); + if (obj == NULL) + return NULL; + + PyTuple_SET_ITEM(tuple, 0, obj); + + /* These two blocks used to raise a TypeError: + * "argument must be string without null bytes, not str" + */ + if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0) + return NULL; + + if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0) + return NULL; + + Py_DECREF(tuple); + Py_RETURN_NONE; +} + +static PyObject * +test_bug_7414(PyObject *self) +{ + /* Issue #7414: for PyArg_ParseTupleAndKeywords, 'C' code wasn't being + skipped properly in skipitem() */ + int a = 0, b = 0, result; + char *kwlist[] = {"a", "b", NULL}; + PyObject *tuple = NULL, *dict = NULL, *b_str; + + tuple = PyTuple_New(0); + if (tuple == NULL) + goto failure; + dict = PyDict_New(); + if (dict == NULL) + goto failure; + b_str = PyUnicode_FromString("b"); + if (b_str == NULL) + goto failure; + result = PyDict_SetItemString(dict, "b", b_str); + Py_DECREF(b_str); + if (result < 0) + goto failure; + + result = PyArg_ParseTupleAndKeywords(tuple, dict, "|CC", + kwlist, &a, &b); + if (!result) + goto failure; + + if (a != 0) + return raiseTestError("test_bug_7414", + "C format code not skipped properly"); + if (b != 'b') + return raiseTestError("test_bug_7414", + "C format code returned wrong value"); + + Py_DECREF(dict); + Py_DECREF(tuple); + Py_RETURN_NONE; + + failure: + Py_XDECREF(dict); + Py_XDECREF(tuple); + return NULL; +} + static volatile int x; @@ -1027,7 +1252,7 @@ test_u_code(PyObject *self) { PyObject *tuple, *obj; Py_UNICODE *value; - int len; + Py_ssize_t len; /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */ /* Just use the macro and check that it compiles */ @@ -1063,6 +1288,59 @@ test_u_code(PyObject *self) return Py_None; } +/* Test Z and Z# codes for PyArg_ParseTuple */ +static PyObject * +test_Z_code(PyObject *self) +{ + PyObject *tuple, *obj; + Py_UNICODE *value1, *value2; + Py_ssize_t len1, len2; + + tuple = PyTuple_New(2); + if (tuple == NULL) + return NULL; + + obj = PyUnicode_FromString("test"); + PyTuple_SET_ITEM(tuple, 0, obj); + Py_INCREF(Py_None); + PyTuple_SET_ITEM(tuple, 1, Py_None); + + /* swap values on purpose */ + value1 = NULL; + value2 = PyUnicode_AS_UNICODE(obj); + + /* Test Z for both values */ + if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0) + return NULL; + if (value1 != PyUnicode_AS_UNICODE(obj)) + return raiseTestError("test_Z_code", + "Z code returned wrong value for 'test'"); + if (value2 != NULL) + return raiseTestError("test_Z_code", + "Z code returned wrong value for None"); + + value1 = NULL; + value2 = PyUnicode_AS_UNICODE(obj); + len1 = -1; + len2 = -1; + + /* Test Z# for both values */ + if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1, + &value2, &len2) < 0) + return NULL; + if (value1 != PyUnicode_AS_UNICODE(obj) || + len1 != PyUnicode_GET_SIZE(obj)) + return raiseTestError("test_Z_code", + "Z# code returned wrong values for 'test'"); + if (value2 != NULL || + len2 != 0) + return raiseTestError("test_Z_code", + "Z# code returned wrong values for None'"); + + Py_DECREF(tuple); + Py_RETURN_NONE; +} + static PyObject * test_widechar(PyObject *self) { @@ -1089,7 +1367,8 @@ test_widechar(PyObject *self) Py_DECREF(wide); Py_DECREF(utf8); return raiseTestError("test_widechar", - "wide string and utf8 string have different length"); + "wide string and utf8 string " + "have different length"); } if (PyUnicode_Compare(wide, utf8)) { Py_DECREF(wide); @@ -1097,7 +1376,8 @@ test_widechar(PyObject *self) if (PyErr_Occurred()) return NULL; return raiseTestError("test_widechar", - "wide string and utf8 string are differents"); + "wide string and utf8 string " + "are different"); } Py_DECREF(wide); @@ -1106,10 +1386,62 @@ test_widechar(PyObject *self) } static PyObject * +unicode_aswidechar(PyObject *self, PyObject *args) +{ + PyObject *unicode, *result; + Py_ssize_t buflen, size; + wchar_t *buffer; + + if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen)) + return NULL; + buffer = PyMem_Malloc(buflen * sizeof(wchar_t)); + if (buffer == NULL) + return PyErr_NoMemory(); + + size = PyUnicode_AsWideChar(unicode, buffer, buflen); + if (size == -1) { + PyMem_Free(buffer); + return NULL; + } + + if (size < buflen) + buflen = size + 1; + else + buflen = size; + result = PyUnicode_FromWideChar(buffer, buflen); + PyMem_Free(buffer); + if (result == NULL) + return NULL; + + return Py_BuildValue("(Nn)", result, size); +} + +static PyObject * +unicode_aswidecharstring(PyObject *self, PyObject *args) +{ + PyObject *unicode, *result; + Py_ssize_t size; + wchar_t *buffer; + + if (!PyArg_ParseTuple(args, "U", &unicode)) + return NULL; + + buffer = PyUnicode_AsWideCharString(unicode, &size); + if (buffer == NULL) + return NULL; + + result = PyUnicode_FromWideChar(buffer, size + 1); + PyMem_Free(buffer); + if (result == NULL) + return NULL; + return Py_BuildValue("(Nn)", result, size); +} + +static PyObject * unicode_encodedecimal(PyObject *self, PyObject *args) { Py_UNICODE *unicode; - int length; + Py_ssize_t length; char *errors = NULL; PyObject *decimal; Py_ssize_t decimal_length, new_length; @@ -1141,6 +1473,38 @@ unicode_encodedecimal(PyObject *self, PyObject *args) } static PyObject * +unicode_transformdecimaltoascii(PyObject *self, PyObject *args) +{ + Py_UNICODE *unicode; + Py_ssize_t length; + if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length)) + return NULL; + return PyUnicode_TransformDecimalToASCII(unicode, length); +} + +static PyObject * +getargs_w_star(PyObject *self, PyObject *args) +{ + Py_buffer buffer; + PyObject *result; + char *str; + + if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer)) + return NULL; + + if (2 <= buffer.len) { + str = buffer.buf; + str[0] = '['; + str[buffer.len-1] = ']'; + } + + result = PyBytes_FromStringAndSize(buffer.buf, buffer.len); + PyBuffer_Release(&buffer); + return result; +} + + +static PyObject * test_empty_argparse(PyObject *self) { /* Test that formats can begin with '|'. See issue #4720. */ @@ -1186,7 +1550,6 @@ codec_incrementaldecoder(PyObject *self, PyObject *args) return PyCodec_IncrementalDecoder(encoding, errors); } -#endif /* Simple test of _PyLong_NumBits and _PyLong_Sign. */ static PyObject * @@ -1230,12 +1593,12 @@ test_long_numbits(PyObject *self) return Py_None; } -/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */ +/* Example passing NULLs to PyObject_Str(NULL). */ static PyObject * test_null_strings(PyObject *self) { - PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL); + PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL); PyObject *tuple = PyTuple_Pack(2, o1, o2); Py_XDECREF(o1); Py_XDECREF(o2); @@ -1252,16 +1615,12 @@ raise_exception(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "Oi:raise_exception", &exc, &num_args)) return NULL; - if (!PyExceptionClass_Check(exc)) { - PyErr_Format(PyExc_TypeError, "an exception class is required"); - return NULL; - } exc_args = PyTuple_New(num_args); if (exc_args == NULL) return NULL; for (i = 0; i < num_args; ++i) { - v = PyInt_FromLong(i); + v = PyLong_FromLong(i); if (v == NULL) { Py_DECREF(exc_args); return NULL; @@ -1421,21 +1780,22 @@ PyObject *pending_threadfunc(PyObject *self, PyObject *arg) } #endif -/* Some tests of PyString_FromFormat(). This needs more tests. */ +/* Some tests of PyUnicode_FromFormat(). This needs more tests. */ static PyObject * test_string_from_format(PyObject *self, PyObject *args) { PyObject *result; char *msg; - -#define CHECK_1_FORMAT(FORMAT, TYPE) \ - result = PyString_FromFormat(FORMAT, (TYPE)1); \ - if (result == NULL) \ - return NULL; \ - if (strcmp(PyString_AsString(result), "1")) { \ - msg = FORMAT " failed at 1"; \ - goto Fail; \ - } \ + static const Py_UNICODE one[] = {'1', 0}; + +#define CHECK_1_FORMAT(FORMAT, TYPE) \ + result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \ + if (result == NULL) \ + return NULL; \ + if (Py_UNICODE_strcmp(PyUnicode_AS_UNICODE(result), one)) { \ + msg = FORMAT " failed at 1"; \ + goto Fail; \ + } \ Py_DECREF(result) CHECK_1_FORMAT("%d", int); @@ -1463,6 +1823,78 @@ test_string_from_format(PyObject *self, PyObject *args) #undef CHECK_1_FORMAT } + +static PyObject * +test_unicode_compare_with_ascii(PyObject *self) { + PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4); + int result; + if (py_s == NULL) + return NULL; + result = PyUnicode_CompareWithASCIIString(py_s, "str"); + Py_DECREF(py_s); + if (!result) { + PyErr_SetString(TestError, "Python string ending in NULL " + "should not compare equal to c string."); + return NULL; + } + Py_RETURN_NONE; +} + +/* This is here to provide a docstring for test_descr. */ +static PyObject * +test_with_docstring(PyObject *self) +{ + Py_RETURN_NONE; +} + +/* Test PyOS_string_to_double. */ +static PyObject * +test_string_to_double(PyObject *self) { + double result; + char *msg; + +#define CHECK_STRING(STR, expected) \ + result = PyOS_string_to_double(STR, NULL, NULL); \ + if (result == -1.0 && PyErr_Occurred()) \ + return NULL; \ + if (result != expected) { \ + msg = "conversion of " STR " to float failed"; \ + goto fail; \ + } + +#define CHECK_INVALID(STR) \ + result = PyOS_string_to_double(STR, NULL, NULL); \ + if (result == -1.0 && PyErr_Occurred()) { \ + if (PyErr_ExceptionMatches(PyExc_ValueError)) \ + PyErr_Clear(); \ + else \ + return NULL; \ + } \ + else { \ + msg = "conversion of " STR " didn't raise ValueError"; \ + goto fail; \ + } + + CHECK_STRING("0.1", 0.1); + CHECK_STRING("1.234", 1.234); + CHECK_STRING("-1.35", -1.35); + CHECK_STRING(".1e01", 1.0); + CHECK_STRING("2.e-2", 0.02); + + CHECK_INVALID(" 0.1"); + CHECK_INVALID("\t\n-3"); + CHECK_INVALID(".123 "); + CHECK_INVALID("3\n"); + CHECK_INVALID("123abc"); + + Py_RETURN_NONE; + fail: + return raiseTestError("test_string_to_double", msg); +#undef CHECK_STRING +#undef CHECK_INVALID +} + + /* Coverage testing of capsule objects. */ static const char *capsule_name = "capsule name"; @@ -1614,12 +2046,118 @@ test_capsule(PyObject *self, PyObject *args) #undef FAIL } -/* This is here to provide a docstring for test_descr. */ +#ifdef HAVE_GETTIMEOFDAY +/* Profiling of integer performance */ +static void print_delta(int test, struct timeval *s, struct timeval *e) +{ + e->tv_sec -= s->tv_sec; + e->tv_usec -= s->tv_usec; + if (e->tv_usec < 0) { + e->tv_sec -=1; + e->tv_usec += 1000000; + } + printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec); +} + static PyObject * -test_with_docstring(PyObject *self) +profile_int(PyObject *self, PyObject* args) { - Py_RETURN_NONE; + int i, k; + struct timeval start, stop; + PyObject *single, **multiple, *op1, *result; + + /* Test 1: Allocate and immediately deallocate + many small integers */ + gettimeofday(&start, NULL); + for(k=0; k < 20000; k++) + for(i=0; i < 1000; i++) { + single = PyLong_FromLong(i); + Py_DECREF(single); + } + gettimeofday(&stop, NULL); + print_delta(1, &start, &stop); + + /* Test 2: Allocate and immediately deallocate + many large integers */ + gettimeofday(&start, NULL); + for(k=0; k < 20000; k++) + for(i=0; i < 1000; i++) { + single = PyLong_FromLong(i+1000000); + Py_DECREF(single); + } + gettimeofday(&stop, NULL); + print_delta(2, &start, &stop); + + /* Test 3: Allocate a few integers, then release + them all simultaneously. */ + multiple = malloc(sizeof(PyObject*) * 1000); + gettimeofday(&start, NULL); + for(k=0; k < 20000; k++) { + for(i=0; i < 1000; i++) { + multiple[i] = PyLong_FromLong(i+1000000); + } + for(i=0; i < 1000; i++) { + Py_DECREF(multiple[i]); + } + } + gettimeofday(&stop, NULL); + print_delta(3, &start, &stop); + + /* Test 4: Allocate many integers, then release + them all simultaneously. */ + multiple = malloc(sizeof(PyObject*) * 1000000); + gettimeofday(&start, NULL); + for(k=0; k < 20; k++) { + for(i=0; i < 1000000; i++) { + multiple[i] = PyLong_FromLong(i+1000000); + } + for(i=0; i < 1000000; i++) { + Py_DECREF(multiple[i]); + } + } + gettimeofday(&stop, NULL); + print_delta(4, &start, &stop); + + /* Test 5: Allocate many integers < 32000 */ + multiple = malloc(sizeof(PyObject*) * 1000000); + gettimeofday(&start, NULL); + for(k=0; k < 10; k++) { + for(i=0; i < 1000000; i++) { + multiple[i] = PyLong_FromLong(i+1000); + } + for(i=0; i < 1000000; i++) { + Py_DECREF(multiple[i]); + } + } + gettimeofday(&stop, NULL); + print_delta(5, &start, &stop); + + /* Test 6: Perform small int addition */ + op1 = PyLong_FromLong(1); + gettimeofday(&start, NULL); + for(i=0; i < 10000000; i++) { + result = PyNumber_Add(op1, op1); + Py_DECREF(result); + } + gettimeofday(&stop, NULL); + Py_DECREF(op1); + print_delta(6, &start, &stop); + + /* Test 7: Perform medium int addition */ + op1 = PyLong_FromLong(1000); + gettimeofday(&start, NULL); + for(i=0; i < 10000000; i++) { + result = PyNumber_Add(op1, op1); + Py_DECREF(result); + } + gettimeofday(&stop, NULL); + Py_DECREF(op1); + print_delta(7, &start, &stop); + + Py_INCREF(Py_None); + return Py_None; } +#endif /* To test the format of tracebacks as printed out. */ static PyObject * @@ -1639,6 +2177,70 @@ traceback_print(PyObject *self, PyObject *args) Py_RETURN_NONE; } +/* To test the format of exceptions as printed out. */ +static PyObject * +exception_print(PyObject *self, PyObject *args) +{ + PyObject *value; + PyObject *tb; + + if (!PyArg_ParseTuple(args, "O:exception_print", + &value)) + return NULL; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, "an exception instance is required"); + return NULL; + } + + tb = PyException_GetTraceback(value); + PyErr_Display((PyObject *) Py_TYPE(value), value, tb); + Py_XDECREF(tb); + + Py_RETURN_NONE; +} + + + + +/* reliably raise a MemoryError */ +static PyObject * +raise_memoryerror(PyObject *self) +{ + PyErr_NoMemory(); + return NULL; +} + +/* Issue 6012 */ +static PyObject *str1, *str2; +static int +failing_converter(PyObject *obj, void *arg) +{ + /* Clone str1, then let the conversion fail. */ + assert(str1); + str2 = str1; + Py_INCREF(str2); + return 0; +} +static PyObject* +argparsing(PyObject *o, PyObject *args) +{ + PyObject *res; + str1 = str2 = NULL; + if (!PyArg_ParseTuple(args, "O&O&", + PyUnicode_FSConverter, &str1, + failing_converter, &str2)) { + if (!str2) + /* argument converter not called? */ + return NULL; + /* Should be 1 */ + res = PyLong_FromSsize_t(Py_REFCNT(str2)); + Py_DECREF(str2); + PyErr_Clear(); + return res; + } + Py_RETURN_NONE; +} + /* To test that the result of PyCode_NewEmpty has the right members. */ static PyObject * code_newempty(PyObject *self, PyObject *args) @@ -1659,8 +2261,8 @@ code_newempty(PyObject *self, PyObject *args) static PyObject * make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs) { - char *name; - char *doc = NULL; + const char *name; + const char *doc = NULL; PyObject *base = NULL; PyObject *dict = NULL; @@ -1675,20 +2277,58 @@ make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs) } static PyObject * -sequence_delitem(PyObject *self, PyObject *args) +make_memoryview_from_NULL_pointer(PyObject *self) { - PyObject *seq; - Py_ssize_t i; - - if (!PyArg_ParseTuple(args, "On", &seq, &i)) + Py_buffer info; + if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0) return NULL; - if (PySequence_DelItem(seq, i) < 0) + return PyMemoryView_FromBuffer(&info); +} + +/* Test that the fatal error from not having a current thread doesn't + cause an infinite loop. Run via Lib/test/test_capi.py */ +static PyObject * +crash_no_current_thread(PyObject *self) +{ + Py_BEGIN_ALLOW_THREADS + /* Using PyThreadState_Get() directly allows the test to pass in + !pydebug mode. However, the test only actually tests anything + in pydebug mode, since that's where the infinite loop was in + the first place. */ + PyThreadState_Get(); + Py_END_ALLOW_THREADS + return NULL; +} + +/* To run some code in a sub-interpreter. */ +static PyObject * +run_in_subinterp(PyObject *self, PyObject *args) +{ + const char *code; + int r; + PyThreadState *substate, *mainstate; + + if (!PyArg_ParseTuple(args, "s:run_in_subinterp", + &code)) return NULL; - Py_RETURN_NONE; + + mainstate = PyThreadState_Get(); + + PyThreadState_Swap(NULL); + + substate = Py_NewInterpreter(); + r = PyRun_SimpleString(code); + Py_EndInterpreter(substate); + + PyThreadState_Swap(mainstate); + + return PyLong_FromLong(r); } + static PyMethodDef TestMethods[] = { {"raise_exception", raise_exception, METH_VARARGS}, + {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS}, {"test_config", (PyCFunction)test_config, METH_NOARGS}, {"test_datetime_capi", test_datetime_capi, METH_NOARGS}, {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS}, @@ -1701,11 +2341,14 @@ static PyMethodDef TestMethods[] = { {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS}, {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS}, {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS}, + {"test_bug_7414", (PyCFunction)test_bug_7414, METH_NOARGS}, {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS}, {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS}, {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS, PyDoc_STR("This is a pretty normal docstring.")}, - + {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS}, + {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS}, + {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS}, {"getargs_tuple", getargs_tuple, METH_VARARGS}, {"getargs_keywords", (PyCFunction)getargs_keywords, METH_VARARGS|METH_KEYWORDS}, @@ -1725,26 +2368,50 @@ static PyMethodDef TestMethods[] = { {"test_long_long_and_overflow", (PyCFunction)test_long_long_and_overflow, METH_NOARGS}, {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS}, +#endif + {"getargs_s", getargs_s, METH_VARARGS}, + {"getargs_s_star", getargs_s_star, METH_VARARGS}, + {"getargs_s_hash", getargs_s_hash, METH_VARARGS}, + {"getargs_z", getargs_z, METH_VARARGS}, + {"getargs_z_star", getargs_z_star, METH_VARARGS}, + {"getargs_z_hash", getargs_z_hash, METH_VARARGS}, + {"getargs_y", getargs_y, METH_VARARGS}, + {"getargs_y_star", getargs_y_star, METH_VARARGS}, + {"getargs_y_hash", getargs_y_hash, METH_VARARGS}, + {"getargs_u", getargs_u, METH_VARARGS}, + {"getargs_u_hash", getargs_u_hash, METH_VARARGS}, + {"getargs_Z", getargs_Z, METH_VARARGS}, + {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS}, + {"getargs_w_star", getargs_w_star, METH_VARARGS}, {"codec_incrementalencoder", - (PyCFunction)codec_incrementalencoder, METH_VARARGS}, + (PyCFunction)codec_incrementalencoder, METH_VARARGS}, {"codec_incrementaldecoder", - (PyCFunction)codec_incrementaldecoder, METH_VARARGS}, -#endif -#ifdef Py_USING_UNICODE + (PyCFunction)codec_incrementaldecoder, METH_VARARGS}, + {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS}, {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS}, + {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS}, {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS}, + {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS}, + {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS}, {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS}, -#endif + {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS}, #ifdef WITH_THREAD - {"_test_thread_state", test_thread_state, METH_VARARGS}, + {"_test_thread_state", test_thread_state, METH_VARARGS}, {"_pending_threadfunc", pending_threadfunc, METH_VARARGS}, #endif - {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS}, - {"traceback_print", traceback_print, METH_VARARGS}, - {"code_newempty", code_newempty, METH_VARARGS}, +#ifdef HAVE_GETTIMEOFDAY + {"profile_int", profile_int, METH_NOARGS}, +#endif + {"traceback_print", traceback_print, METH_VARARGS}, + {"exception_print", exception_print, METH_VARARGS}, + {"argparsing", argparsing, METH_VARARGS}, + {"code_newempty", code_newempty, METH_VARARGS}, {"make_exception_with_doc", (PyCFunction)make_exception_with_doc, METH_VARARGS | METH_KEYWORDS}, - {"sequence_delitem", (PyCFunction)sequence_delitem, METH_VARARGS}, + {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer, + METH_NOARGS}, + {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS}, + {"run_in_subinterp", run_in_subinterp, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; @@ -1760,6 +2427,7 @@ typedef struct { unsigned int uint_member; long long_member; unsigned long ulong_member; + Py_ssize_t pyssizet_member; float float_member; double double_member; char inplace_member[6]; @@ -1784,6 +2452,7 @@ static struct PyMemberDef test_members[] = { {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL}, {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL}, {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL}, + {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL}, {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL}, {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL}, {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL}, @@ -1800,13 +2469,13 @@ test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { static char *keywords[] = { "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT", - "T_INT", "T_UINT", "T_LONG", "T_ULONG", + "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET", "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE", #ifdef HAVE_LONG_LONG "T_LONGLONG", "T_ULONGLONG", #endif NULL}; - static char *fmt = "|bbBhHiIlkfds#" + static char *fmt = "|bbBhHiIlknfds#" #ifdef HAVE_LONG_LONG "LK" #endif @@ -1828,6 +2497,7 @@ test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) &ob->structmembers.uint_member, &ob->structmembers.long_member, &ob->structmembers.ulong_member, + &ob->structmembers.pyssizet_member, &ob->structmembers.float_member, &ob->structmembers.double_member, &s, &string_len @@ -1868,7 +2538,7 @@ static PyTypeObject test_structmembersType = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1901,16 +2571,30 @@ static PyTypeObject test_structmembersType = { }; + +static struct PyModuleDef _testcapimodule = { + PyModuleDef_HEAD_INIT, + "_testcapi", + NULL, + -1, + TestMethods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_testcapi(void) +PyInit__testcapi(void) { PyObject *m; - m = Py_InitModule("_testcapi", TestMethods); + m = PyModule_Create(&_testcapimodule); if (m == NULL) - return; + return NULL; Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type; + Py_TYPE(&_MemoryViewTester_Type)=&PyType_Type; Py_TYPE(&test_structmembersType)=&PyType_Type; Py_INCREF(&test_structmembersType); @@ -1918,17 +2602,17 @@ init_testcapi(void) test_capi to automatically call this */ PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType); - PyModule_AddObject(m, "CHAR_MAX", PyInt_FromLong(CHAR_MAX)); - PyModule_AddObject(m, "CHAR_MIN", PyInt_FromLong(CHAR_MIN)); - PyModule_AddObject(m, "UCHAR_MAX", PyInt_FromLong(UCHAR_MAX)); - PyModule_AddObject(m, "SHRT_MAX", PyInt_FromLong(SHRT_MAX)); - PyModule_AddObject(m, "SHRT_MIN", PyInt_FromLong(SHRT_MIN)); - PyModule_AddObject(m, "USHRT_MAX", PyInt_FromLong(USHRT_MAX)); + PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX)); + PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN)); + PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX)); + PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX)); + PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN)); + PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX)); PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX)); PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN)); PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX)); - PyModule_AddObject(m, "LONG_MAX", PyInt_FromLong(LONG_MAX)); - PyModule_AddObject(m, "LONG_MIN", PyInt_FromLong(LONG_MIN)); + PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX)); + PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN)); PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX)); PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX)); PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN)); @@ -1937,11 +2621,14 @@ init_testcapi(void) PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX)); PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN)); PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX)); - PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyInt_FromSsize_t(PY_SSIZE_T_MAX)); - PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyInt_FromSsize_t(PY_SSIZE_T_MIN)); - PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyInt_FromSsize_t(sizeof(PyGC_Head))); + PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX)); + PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN)); + PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head))); + Py_INCREF(&PyInstanceMethod_Type); + PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type); TestError = PyErr_NewException("_testcapi.error", NULL, NULL); Py_INCREF(TestError); PyModule_AddObject(m, "error", TestError); + return m; } diff --git a/Modules/_testembed.c b/Modules/_testembed.c new file mode 100644 index 00000000000..51b439f4804 --- /dev/null +++ b/Modules/_testembed.c @@ -0,0 +1,58 @@ +#include <Python.h> +#include <stdio.h> + +void print_subinterp(void) +{ + /* Just output some debug stuff */ + PyThreadState *ts = PyThreadState_Get(); + printf("interp %p, thread state %p: ", ts->interp, ts); + fflush(stdout); + PyRun_SimpleString( + "import sys;" + "print('id(modules) =', id(sys.modules));" + "sys.stdout.flush()" + ); +} + +int main(int argc, char *argv[]) +{ + PyThreadState *mainstate, *substate; +#ifdef WITH_THREAD + PyGILState_STATE gilstate; +#endif + int i, j; + + for (i=0; i<3; i++) { + printf("--- Pass %d ---\n", i); + /* HACK: the "./" at front avoids a search along the PATH in + Modules/getpath.c */ + Py_SetProgramName(L"./_testembed"); + Py_Initialize(); + mainstate = PyThreadState_Get(); + +#ifdef WITH_THREAD + PyEval_InitThreads(); + PyEval_ReleaseThread(mainstate); + + gilstate = PyGILState_Ensure(); +#endif + print_subinterp(); + PyThreadState_Swap(NULL); + + for (j=0; j<3; j++) { + substate = Py_NewInterpreter(); + print_subinterp(); + Py_EndInterpreter(substate); + } + + PyThreadState_Swap(mainstate); + print_subinterp(); +#ifdef WITH_THREAD + PyGILState_Release(gilstate); +#endif + + PyEval_RestoreThread(mainstate); + Py_Finalize(); + } + return 0; +} diff --git a/Modules/threadmodule.c b/Modules/_threadmodule.c index 9462f430a72..5f76a7b6c2f 100644 --- a/Modules/threadmodule.c +++ b/Modules/_threadmodule.c @@ -14,8 +14,8 @@ #include "pythread.h" static PyObject *ThreadError; -static PyObject *str_dict; static long nb_threads = 0; +static PyObject *str_dict; /* Lock objects */ @@ -40,19 +40,101 @@ lock_dealloc(lockobject *self) PyObject_Del(self); } +/* Helper to acquire an interruptible lock with a timeout. If the lock acquire + * is interrupted, signal handlers are run, and if they raise an exception, + * PY_LOCK_INTR is returned. Otherwise, PY_LOCK_ACQUIRED or PY_LOCK_FAILURE + * are returned, depending on whether the lock can be acquired withing the + * timeout. + */ +static PyLockStatus +acquire_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds) +{ + PyLockStatus r; + _PyTime_timeval curtime; + _PyTime_timeval endtime; + + if (microseconds > 0) { + _PyTime_gettimeofday(&endtime); + endtime.tv_sec += microseconds / (1000 * 1000); + endtime.tv_usec += microseconds % (1000 * 1000); + } + + + do { + Py_BEGIN_ALLOW_THREADS + r = PyThread_acquire_lock_timed(lock, microseconds, 1); + Py_END_ALLOW_THREADS + + if (r == PY_LOCK_INTR) { + /* Run signal handlers if we were interrupted. Propagate + * exceptions from signal handlers, such as KeyboardInterrupt, by + * passing up PY_LOCK_INTR. */ + if (Py_MakePendingCalls() < 0) { + return PY_LOCK_INTR; + } + + /* If we're using a timeout, recompute the timeout after processing + * signals, since those can take time. */ + if (microseconds >= 0) { + _PyTime_gettimeofday(&curtime); + microseconds = ((endtime.tv_sec - curtime.tv_sec) * 1000000 + + (endtime.tv_usec - curtime.tv_usec)); + + /* Check for negative values, since those mean block forever. + */ + if (microseconds <= 0) { + r = PY_LOCK_FAILURE; + } + } + } + } while (r == PY_LOCK_INTR); /* Retry if we were interrupted. */ + + return r; +} + static PyObject * -lock_PyThread_acquire_lock(lockobject *self, PyObject *args) +lock_PyThread_acquire_lock(lockobject *self, PyObject *args, PyObject *kwds) { - int i = 1; + char *kwlist[] = {"blocking", "timeout", NULL}; + int blocking = 1; + double timeout = -1; + PY_TIMEOUT_T microseconds; + PyLockStatus r; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|id:acquire", kwlist, + &blocking, &timeout)) + return NULL; - if (!PyArg_ParseTuple(args, "|i:acquire", &i)) + if (!blocking && timeout != -1) { + PyErr_SetString(PyExc_ValueError, "can't specify a timeout " + "for a non-blocking call"); + return NULL; + } + if (timeout < 0 && timeout != -1) { + PyErr_SetString(PyExc_ValueError, "timeout value must be " + "strictly positive"); return NULL; + } + if (!blocking) + microseconds = 0; + else if (timeout == -1) + microseconds = -1; + else { + timeout *= 1e6; + if (timeout >= (double) PY_TIMEOUT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "timeout value is too large"); + return NULL; + } + microseconds = (PY_TIMEOUT_T) timeout; + } - Py_BEGIN_ALLOW_THREADS - i = PyThread_acquire_lock(self->lock_lock, i); - Py_END_ALLOW_THREADS + r = acquire_timed(self->lock_lock, microseconds); + if (r == PY_LOCK_INTR) { + return NULL; + } - return PyBool_FromLong((long)i); + return PyBool_FromLong(r == PY_LOCK_ACQUIRED); } PyDoc_STRVAR(acquire_doc, @@ -64,7 +146,7 @@ locked (even by the same thread), waiting for another thread to release\n\ the lock, and return None once the lock is acquired.\n\ With an argument, this will only block if the argument is true,\n\ and the return value reflects whether the lock is acquired.\n\ -The blocking operation is not interruptible."); +The blocking operation is interruptible."); static PyObject * lock_PyThread_release_lock(lockobject *self) @@ -107,9 +189,9 @@ Return whether the lock is in the locked state."); static PyMethodDef lock_methods[] = { {"acquire_lock", (PyCFunction)lock_PyThread_acquire_lock, - METH_VARARGS, acquire_doc}, + METH_VARARGS | METH_KEYWORDS, acquire_doc}, {"acquire", (PyCFunction)lock_PyThread_acquire_lock, - METH_VARARGS, acquire_doc}, + METH_VARARGS | METH_KEYWORDS, acquire_doc}, {"release_lock", (PyCFunction)lock_PyThread_release_lock, METH_NOARGS, release_doc}, {"release", (PyCFunction)lock_PyThread_release_lock, @@ -119,15 +201,15 @@ static PyMethodDef lock_methods[] = { {"locked", (PyCFunction)lock_locked_lock, METH_NOARGS, locked_doc}, {"__enter__", (PyCFunction)lock_PyThread_acquire_lock, - METH_VARARGS, acquire_doc}, + METH_VARARGS | METH_KEYWORDS, acquire_doc}, {"__exit__", (PyCFunction)lock_PyThread_release_lock, METH_VARARGS, release_doc}, - {NULL} /* sentinel */ + {NULL, NULL} /* sentinel */ }; static PyTypeObject Locktype = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "thread.lock", /*tp_name*/ + "_thread.lock", /*tp_name*/ sizeof(lockobject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ @@ -135,26 +217,320 @@ static PyTypeObject Locktype = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 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_HAVE_WEAKREFS, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(lockobject, in_weakreflist), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - lock_methods, /* tp_methods */ + 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*/ + offsetof(lockobject, in_weakreflist), /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + lock_methods, /*tp_methods*/ +}; + +/* Recursive lock objects */ + +typedef struct { + PyObject_HEAD + PyThread_type_lock rlock_lock; + long rlock_owner; + unsigned long rlock_count; + PyObject *in_weakreflist; +} rlockobject; + +static void +rlock_dealloc(rlockobject *self) +{ + assert(self->rlock_lock); + if (self->in_weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject *) self); + /* Unlock the lock so it's safe to free it */ + if (self->rlock_count > 0) + PyThread_release_lock(self->rlock_lock); + + PyThread_free_lock(self->rlock_lock); + Py_TYPE(self)->tp_free(self); +} + +static PyObject * +rlock_acquire(rlockobject *self, PyObject *args, PyObject *kwds) +{ + char *kwlist[] = {"blocking", "timeout", NULL}; + int blocking = 1; + double timeout = -1; + PY_TIMEOUT_T microseconds; + long tid; + PyLockStatus r = PY_LOCK_ACQUIRED; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|id:acquire", kwlist, + &blocking, &timeout)) + return NULL; + + if (!blocking && timeout != -1) { + PyErr_SetString(PyExc_ValueError, "can't specify a timeout " + "for a non-blocking call"); + return NULL; + } + if (timeout < 0 && timeout != -1) { + PyErr_SetString(PyExc_ValueError, "timeout value must be " + "strictly positive"); + return NULL; + } + if (!blocking) + microseconds = 0; + else if (timeout == -1) + microseconds = -1; + else { + timeout *= 1e6; + if (timeout >= (double) PY_TIMEOUT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "timeout value is too large"); + return NULL; + } + microseconds = (PY_TIMEOUT_T) timeout; + } + + tid = PyThread_get_thread_ident(); + if (self->rlock_count > 0 && tid == self->rlock_owner) { + unsigned long count = self->rlock_count + 1; + if (count <= self->rlock_count) { + PyErr_SetString(PyExc_OverflowError, + "Internal lock count overflowed"); + return NULL; + } + self->rlock_count = count; + Py_RETURN_TRUE; + } + + if (self->rlock_count > 0 || + !PyThread_acquire_lock(self->rlock_lock, 0)) { + if (microseconds == 0) { + Py_RETURN_FALSE; + } + r = acquire_timed(self->rlock_lock, microseconds); + } + if (r == PY_LOCK_ACQUIRED) { + assert(self->rlock_count == 0); + self->rlock_owner = tid; + self->rlock_count = 1; + } + else if (r == PY_LOCK_INTR) { + return NULL; + } + + return PyBool_FromLong(r == PY_LOCK_ACQUIRED); +} + +PyDoc_STRVAR(rlock_acquire_doc, +"acquire(blocking=True) -> bool\n\ +\n\ +Lock the lock. `blocking` indicates whether we should wait\n\ +for the lock to be available or not. If `blocking` is False\n\ +and another thread holds the lock, the method will return False\n\ +immediately. If `blocking` is True and another thread holds\n\ +the lock, the method will wait for the lock to be released,\n\ +take it and then return True.\n\ +(note: the blocking operation is interruptible.)\n\ +\n\ +In all other cases, the method will return True immediately.\n\ +Precisely, if the current thread already holds the lock, its\n\ +internal counter is simply incremented. If nobody holds the lock,\n\ +the lock is taken and its internal counter initialized to 1."); + +static PyObject * +rlock_release(rlockobject *self) +{ + long tid = PyThread_get_thread_ident(); + + if (self->rlock_count == 0 || self->rlock_owner != tid) { + PyErr_SetString(PyExc_RuntimeError, + "cannot release un-acquired lock"); + return NULL; + } + if (--self->rlock_count == 0) { + self->rlock_owner = 0; + PyThread_release_lock(self->rlock_lock); + } + Py_RETURN_NONE; +} + +PyDoc_STRVAR(rlock_release_doc, +"release()\n\ +\n\ +Release the lock, allowing another thread that is blocked waiting for\n\ +the lock to acquire the lock. The lock must be in the locked state,\n\ +and must be locked by the same thread that unlocks it; otherwise a\n\ +`RuntimeError` is raised.\n\ +\n\ +Do note that if the lock was acquire()d several times in a row by the\n\ +current thread, release() needs to be called as many times for the lock\n\ +to be available for other threads."); + +static PyObject * +rlock_acquire_restore(rlockobject *self, PyObject *arg) +{ + long owner; + unsigned long count; + int r = 1; + + if (!PyArg_ParseTuple(arg, "kl:_acquire_restore", &count, &owner)) + return NULL; + + if (!PyThread_acquire_lock(self->rlock_lock, 0)) { + Py_BEGIN_ALLOW_THREADS + r = PyThread_acquire_lock(self->rlock_lock, 1); + Py_END_ALLOW_THREADS + } + if (!r) { + PyErr_SetString(ThreadError, "couldn't acquire lock"); + return NULL; + } + assert(self->rlock_count == 0); + self->rlock_owner = owner; + self->rlock_count = count; + Py_RETURN_NONE; +} + +PyDoc_STRVAR(rlock_acquire_restore_doc, +"_acquire_restore(state) -> None\n\ +\n\ +For internal use by `threading.Condition`."); + +static PyObject * +rlock_release_save(rlockobject *self) +{ + long owner; + unsigned long count; + + owner = self->rlock_owner; + count = self->rlock_count; + self->rlock_count = 0; + self->rlock_owner = 0; + PyThread_release_lock(self->rlock_lock); + return Py_BuildValue("kl", count, owner); +} + +PyDoc_STRVAR(rlock_release_save_doc, +"_release_save() -> tuple\n\ +\n\ +For internal use by `threading.Condition`."); + + +static PyObject * +rlock_is_owned(rlockobject *self) +{ + long tid = PyThread_get_thread_ident(); + + if (self->rlock_count > 0 && self->rlock_owner == tid) { + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; +} + +PyDoc_STRVAR(rlock_is_owned_doc, +"_is_owned() -> bool\n\ +\n\ +For internal use by `threading.Condition`."); + +static PyObject * +rlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + rlockobject *self; + + self = (rlockobject *) type->tp_alloc(type, 0); + if (self != NULL) { + self->rlock_lock = PyThread_allocate_lock(); + if (self->rlock_lock == NULL) { + type->tp_free(self); + PyErr_SetString(ThreadError, "can't allocate lock"); + return NULL; + } + self->in_weakreflist = NULL; + self->rlock_owner = 0; + self->rlock_count = 0; + } + + return (PyObject *) self; +} + +static PyObject * +rlock_repr(rlockobject *self) +{ + return PyUnicode_FromFormat("<%s owner=%ld count=%lu>", + Py_TYPE(self)->tp_name, self->rlock_owner, self->rlock_count); +} + + +static PyMethodDef rlock_methods[] = { + {"acquire", (PyCFunction)rlock_acquire, + METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc}, + {"release", (PyCFunction)rlock_release, + METH_NOARGS, rlock_release_doc}, + {"_is_owned", (PyCFunction)rlock_is_owned, + METH_NOARGS, rlock_is_owned_doc}, + {"_acquire_restore", (PyCFunction)rlock_acquire_restore, + METH_O, rlock_acquire_restore_doc}, + {"_release_save", (PyCFunction)rlock_release_save, + METH_NOARGS, rlock_release_save_doc}, + {"__enter__", (PyCFunction)rlock_acquire, + METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc}, + {"__exit__", (PyCFunction)rlock_release, + METH_VARARGS, rlock_release_doc}, + {NULL, NULL} /* sentinel */ +}; + + +static PyTypeObject RLocktype = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "_thread.RLock", /*tp_name*/ + sizeof(rlockobject), /*tp_size*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)rlock_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_reserved*/ + (reprfunc)rlock_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 | Py_TPFLAGS_BASETYPE, /* tp_flags */ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + offsetof(rlockobject, in_weakreflist), /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + rlock_methods, /*tp_methods*/ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + PyType_GenericAlloc, /* tp_alloc */ + rlock_new /* tp_new */ }; static lockobject * @@ -349,7 +725,7 @@ local_new(PyTypeObject *type, PyObject *args, PyObject *kw) self->args = args; Py_XINCREF(kw); self->kw = kw; - self->key = PyString_FromFormat("thread.local.%p", self); + self->key = PyUnicode_FromFormat("thread.local.%p", self); if (self->key == NULL) goto err; @@ -473,8 +849,8 @@ local_setattro(localobject *self, PyObject *name, PyObject *v) r = PyObject_RichCompareBool(name, str_dict, Py_EQ); if (r == 1) { PyErr_Format(PyExc_AttributeError, - "'%.50s' object attribute '__dict__' is read-only", - Py_TYPE(self)->tp_name); + "'%.50s' object attribute '%U' is read-only", + Py_TYPE(self)->tp_name, name); return -1; } if (r == -1) @@ -487,14 +863,14 @@ static PyObject *local_getattro(localobject *, PyObject *); static PyTypeObject localtype = { PyVarObject_HEAD_INIT(NULL, 0) - /* tp_name */ "thread._local", + /* tp_name */ "_thread._local", /* tp_basicsize */ sizeof(localobject), /* tp_itemsize */ 0, /* tp_dealloc */ (destructor)local_dealloc, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, - /* tp_compare */ 0, + /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, @@ -619,11 +995,11 @@ t_bootstrap(void *boot_raw) else { PyObject *file; PyObject *exc, *value, *tb; - PyErr_Fetch(&exc, &value, &tb); PySys_WriteStderr( "Unhandled exception in thread started by "); + PyErr_Fetch(&exc, &value, &tb); file = PySys_GetObject("stderr"); - if (file) + if (file != NULL && file != Py_None) PyFile_WriteObject(boot->func, file, 0); else PyObject_Print(boot->func, stderr, 0); @@ -695,7 +1071,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) PyMem_DEL(boot); return NULL; } - return PyInt_FromLong(ident); + return PyLong_FromLong(ident); } PyDoc_STRVAR(start_new_doc, @@ -761,7 +1137,7 @@ thread_get_ident(PyObject *self) PyErr_SetString(ThreadError, "no current thread ident"); return NULL; } - return PyInt_FromLong(ident); + return PyLong_FromLong(ident); } PyDoc_STRVAR(get_ident_doc, @@ -778,7 +1154,7 @@ A thread's identity may be reused for another thread after it exits."); static PyObject * thread__count(PyObject *self) { - return PyInt_FromLong(nb_threads); + return PyLong_FromLong(nb_threads); } PyDoc_STRVAR(_count_doc, @@ -824,7 +1200,7 @@ thread_stack_size(PyObject *self, PyObject *args) return NULL; } - return PyInt_FromSsize_t((Py_ssize_t) old_size); + return PyLong_FromSsize_t((Py_ssize_t) old_size); } PyDoc_STRVAR(stack_size_doc, @@ -893,42 +1269,68 @@ A lock is not owned by the thread that locked it; another thread may\n\ unlock it. A thread attempting to lock a lock that it has already locked\n\ will block until another thread unlocks it. Deadlocks may ensue."); +static struct PyModuleDef threadmodule = { + PyModuleDef_HEAD_INIT, + "_thread", + thread_doc, + -1, + thread_methods, + NULL, + NULL, + NULL, + NULL +}; + + PyMODINIT_FUNC -initthread(void) +PyInit__thread(void) { - PyObject *m, *d; + PyObject *m, *d, *timeout_max; /* Initialize types: */ if (PyType_Ready(&localdummytype) < 0) - return; + return NULL; if (PyType_Ready(&localtype) < 0) - return; + return NULL; + if (PyType_Ready(&Locktype) < 0) + return NULL; + if (PyType_Ready(&RLocktype) < 0) + return NULL; /* Create the module and add the functions */ - m = Py_InitModule3("thread", thread_methods, thread_doc); + m = PyModule_Create(&threadmodule); if (m == NULL) - return; + return NULL; + + timeout_max = PyFloat_FromDouble(PY_TIMEOUT_MAX / 1000000); + if (!timeout_max) + return NULL; + if (PyModule_AddObject(m, "TIMEOUT_MAX", timeout_max) < 0) + return NULL; /* Add a symbolic constant */ d = PyModule_GetDict(m); - ThreadError = PyErr_NewException("thread.error", NULL, NULL); + ThreadError = PyErr_NewException("_thread.error", NULL, NULL); PyDict_SetItemString(d, "error", ThreadError); Locktype.tp_doc = lock_doc; - if (PyType_Ready(&Locktype) < 0) - return; Py_INCREF(&Locktype); PyDict_SetItemString(d, "LockType", (PyObject *)&Locktype); + Py_INCREF(&RLocktype); + if (PyModule_AddObject(m, "RLock", (PyObject *)&RLocktype) < 0) + return NULL; + Py_INCREF(&localtype); if (PyModule_AddObject(m, "_local", (PyObject *)&localtype) < 0) - return; + return NULL; nb_threads = 0; - str_dict = PyString_InternFromString("__dict__"); + str_dict = PyUnicode_InternFromString("__dict__"); if (str_dict == NULL) - return; + return NULL; /* Initialize the C thread library */ PyThread_init_thread(); + return m; } diff --git a/Modules/_time.c b/Modules/_time.c new file mode 100644 index 00000000000..10cc8e12a6a --- /dev/null +++ b/Modules/_time.c @@ -0,0 +1,28 @@ +#include "Python.h" +#include "_time.h" + +/* Exposed in timefuncs.h. */ +time_t +_PyTime_DoubleToTimet(double x) +{ + time_t result; + double diff; + + result = (time_t)x; + /* How much info did we lose? time_t may be an integral or + * floating type, and we don't know which. If it's integral, + * we don't know whether C truncates, rounds, returns the floor, + * etc. If we lost a second or more, the C rounding is + * unreasonable, or the input just doesn't fit in a time_t; + * call it an error regardless. Note that the original cast to + * time_t can cause a C error too, but nothing we can do to + * work around that. + */ + diff = x - (double)result; + if (diff <= -1.0 || diff >= 1.0) { + PyErr_SetString(PyExc_ValueError, + "timestamp out of range for platform time_t"); + result = (time_t)-1; + } + return result; +} diff --git a/Modules/_time.h b/Modules/_time.h new file mode 100644 index 00000000000..816593b03fa --- /dev/null +++ b/Modules/_time.h @@ -0,0 +1,3 @@ +/* XXX: It is probably best to move timefuncs.h content in here, and + remove it but user code may rely on it. */ +#include "timefuncs.h" diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 40c8be2ce7c..23906dea903 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -44,7 +44,7 @@ Copyright (C) 1994 Steen Lumholt. #ifndef PyBool_Check #define PyBool_Check(o) 0 -#define PyBool_FromLong PyInt_FromLong +#define PyBool_FromLong PyLong_FromLong #endif /* Starting with Tcl 8.4, many APIs offer const-correctness. Unfortunately, @@ -281,7 +281,7 @@ static PyObject *valInCmd; static PyObject *trbInCmd; #ifdef TKINTER_PROTECT_LOADTK -static int tk_load_failed; +static int tk_load_failed = 0; #endif @@ -338,9 +338,8 @@ WaitForMainloop(TkappObject* self) static char * AsString(PyObject *value, PyObject *tmp) { - if (PyString_Check(value)) - return PyString_AsString(value); -#ifdef Py_USING_UNICODE + if (PyBytes_Check(value)) + return PyBytes_AsString(value); else if (PyUnicode_Check(value)) { PyObject *v = PyUnicode_AsUTF8String(value); if (v == NULL) @@ -350,9 +349,8 @@ AsString(PyObject *value, PyObject *tmp) return NULL; } Py_DECREF(v); - return PyString_AsString(v); + return PyBytes_AsString(v); } -#endif else { PyObject *v = PyObject_Str(value); if (v == NULL) @@ -362,7 +360,7 @@ AsString(PyObject *value, PyObject *tmp) return NULL; } Py_DECREF(v); - return PyString_AsString(v); + return PyBytes_AsString(v); } } @@ -465,13 +463,13 @@ Split(char *list) * Could be a quoted string containing funnies, e.g. {"}. * Return the string itself. */ - return PyString_FromString(list); + return PyUnicode_FromString(list); } if (argc == 0) - v = PyString_FromString(""); + v = PyUnicode_FromString(""); else if (argc == 1) - v = PyString_FromString(argv[0]); + v = PyUnicode_FromString(argv[0]); else if ((v = PyTuple_New(argc)) != NULL) { int i; PyObject *w; @@ -533,10 +531,10 @@ SplitObj(PyObject *arg) return result; /* Fall through, returning arg. */ } - else if (PyString_Check(arg)) { + else if (PyBytes_Check(arg)) { int argc; char **argv; - char *list = PyString_AsString(arg); + char *list = PyBytes_AsString(arg); if (Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) { Py_INCREF(arg); @@ -544,7 +542,7 @@ SplitObj(PyObject *arg) } Tcl_Free(FREECAST argv); if (argc > 1) - return Split(PyString_AsString(arg)); + return Split(PyBytes_AsString(arg)); /* Fall through, returning arg. */ } Py_INCREF(arg); @@ -602,7 +600,7 @@ static void EnableEventHook(void); /* Forward */ static void DisableEventHook(void); /* Forward */ static TkappObject * -Tkapp_New(char *screenName, char *baseName, char *className, +Tkapp_New(char *screenName, char *className, int interactive, int wantobjects, int wantTk, int sync, char *use) { TkappObject *v; @@ -758,7 +756,7 @@ typedef struct { PyObject *string; /* This cannot cause cycles. */ } PyTclObject; -staticforward PyTypeObject PyTclObject_Type; +static PyTypeObject PyTclObject_Type; #define PyTclObject_Check(v) ((v)->ob_type == &PyTclObject_Type) static PyObject * @@ -782,17 +780,6 @@ PyTclObject_dealloc(PyTclObject *self) PyObject_Del(self); } -static PyObject * -PyTclObject_str(PyTclObject *self) -{ - if (self->string && PyString_Check(self->string)) { - Py_INCREF(self->string); - return self->string; - } - /* XXX Could cache value if it is an ASCII string. */ - return PyString_FromString(Tcl_GetString(self->value)); -} - static char* PyTclObject_TclString(PyObject *self) { @@ -801,32 +788,16 @@ PyTclObject_TclString(PyObject *self) /* Like _str, but create Unicode if necessary. */ PyDoc_STRVAR(PyTclObject_string__doc__, -"the string representation of this object, either as string or Unicode"); +"the string representation of this object, either as str or bytes"); static PyObject * PyTclObject_string(PyTclObject *self, void *ignored) { char *s; - int i, len; + int len; if (!self->string) { s = Tcl_GetStringFromObj(self->value, &len); - for (i = 0; i < len; i++) - if (s[i] & 0x80) - break; -#ifdef Py_USING_UNICODE - if (i == len) - /* It is an ASCII string. */ - self->string = PyString_FromStringAndSize(s, len); - else { - self->string = PyUnicode_DecodeUTF8(s, len, "strict"); - if (!self->string) { - PyErr_Clear(); - self->string = PyString_FromStringAndSize(s, len); - } - } -#else - self->string = PyString_FromStringAndSize(s, len); -#endif + self->string = PyUnicode_FromStringAndSize(s, len); if (!self->string) return NULL; } @@ -834,11 +805,8 @@ PyTclObject_string(PyTclObject *self, void *ignored) return self->string; } -#ifdef Py_USING_UNICODE -PyDoc_STRVAR(PyTclObject_unicode__doc__, "convert argument to unicode"); - static PyObject * -PyTclObject_unicode(PyTclObject *self, void *ignored) +PyTclObject_str(PyTclObject *self, void *ignored) { char *s; int len; @@ -850,26 +818,67 @@ PyTclObject_unicode(PyTclObject *self, void *ignored) s = Tcl_GetStringFromObj(self->value, &len); return PyUnicode_DecodeUTF8(s, len, "strict"); } -#endif static PyObject * PyTclObject_repr(PyTclObject *self) { - char buf[50]; - PyOS_snprintf(buf, 50, "<%s object at %p>", - self->value->typePtr->name, self->value); - return PyString_FromString(buf); + return PyUnicode_FromFormat("<%s object at %p>", + self->value->typePtr->name, self->value); } -static int -PyTclObject_cmp(PyTclObject *self, PyTclObject *other) +#define TEST_COND(cond) ((cond) ? Py_True : Py_False) + +static PyObject * +PyTclObject_richcompare(PyObject *self, PyObject *other, int op) { - int res; - res = strcmp(Tcl_GetString(self->value), - Tcl_GetString(other->value)); - if (res < 0) return -1; - if (res > 0) return 1; - return 0; + int result; + PyObject *v; + + /* neither argument should be NULL, unless something's gone wrong */ + if (self == NULL || other == NULL) { + PyErr_BadInternalCall(); + return NULL; + } + + /* both arguments should be instances of PyTclObject */ + if (!PyTclObject_Check(self) || !PyTclObject_Check(other)) { + v = Py_NotImplemented; + goto finished; + } + + if (self == other) + /* fast path when self and other are identical */ + result = 0; + else + result = strcmp(Tcl_GetString(((PyTclObject *)self)->value), + Tcl_GetString(((PyTclObject *)other)->value)); + /* Convert 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; + case Py_GE: + v = TEST_COND(result >= 0); + break; + case Py_LT: + v = TEST_COND(result < 0); + break; + case Py_GT: + v = TEST_COND(result > 0); + break; + default: + PyErr_BadArgument(); + return NULL; + } + finished: + Py_INCREF(v); + return v; } PyDoc_STRVAR(get_typename__doc__, "name of the Tcl type"); @@ -877,7 +886,7 @@ PyDoc_STRVAR(get_typename__doc__, "name of the Tcl type"); static PyObject* get_typename(PyTclObject* obj, void* ignored) { - return PyString_FromString(obj->value->typePtr->name); + return PyUnicode_FromString(obj->value->typePtr->name); } @@ -888,71 +897,69 @@ static PyGetSetDef PyTclObject_getsetlist[] = { {0}, }; -static PyMethodDef PyTclObject_methods[] = { -#ifdef Py_USING_UNICODE - {"__unicode__", (PyCFunction)PyTclObject_unicode, METH_NOARGS, - PyTclObject_unicode__doc__}, -#endif - {0} -}; - -statichere PyTypeObject PyTclObject_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ +static PyTypeObject PyTclObject_Type = { + PyVarObject_HEAD_INIT(NULL, 0) "_tkinter.Tcl_Obj", /*tp_name*/ - sizeof(PyTclObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ + sizeof(PyTclObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ /* methods */ - (destructor)PyTclObject_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - (cmpfunc)PyTclObject_cmp, /*tp_compare*/ + (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*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - PyTclObject_methods, /*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*/ + 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 Tcl_Obj* AsObj(PyObject *value) { Tcl_Obj *result; + long longVal; + int overflow; - if (PyString_Check(value)) - return Tcl_NewStringObj(PyString_AS_STRING(value), - PyString_GET_SIZE(value)); + if (PyBytes_Check(value)) + return Tcl_NewStringObj(PyBytes_AS_STRING(value), + PyBytes_GET_SIZE(value)); else if (PyBool_Check(value)) return Tcl_NewBooleanObj(PyObject_IsTrue(value)); - else if (PyInt_Check(value)) - return Tcl_NewLongObj(PyInt_AS_LONG(value)); + else if (PyLong_CheckExact(value) && + ((longVal = PyLong_AsLongAndOverflow(value, &overflow)), + !overflow)) { + /* If there is an overflow in the long conversion, + fall through to default object handling. */ + return Tcl_NewLongObj(longVal); + } else if (PyFloat_Check(value)) return Tcl_NewDoubleObj(PyFloat_AS_DOUBLE(value)); else if (PyTuple_Check(value)) { @@ -967,7 +974,6 @@ AsObj(PyObject *value) ckfree(FREECAST argv); return result; } -#ifdef Py_USING_UNICODE else if (PyUnicode_Check(value)) { Py_UNICODE *inbuf = PyUnicode_AS_UNICODE(value); Py_ssize_t size = PyUnicode_GET_SIZE(value); @@ -987,8 +993,10 @@ AsObj(PyObject *value) for (i = 0; i < size; i++) { if (inbuf[i] >= 0x10000) { /* Tcl doesn't do UTF-16, yet. */ - PyErr_SetString(PyExc_ValueError, - "unsupported character"); + PyErr_Format(PyExc_ValueError, + "character U+%x is above the range " + "(U+0000-U+FFFF) allowed by Tcl", + inbuf[i]); ckfree(FREECAST outbuf); return NULL; } @@ -1002,7 +1010,6 @@ AsObj(PyObject *value) #endif } -#endif else if(PyTclObject_Check(value)) { Tcl_Obj *v = ((PyTclObject*)value)->value; Tcl_IncrRefCount(v); @@ -1025,31 +1032,8 @@ FromObj(PyObject* tkapp, Tcl_Obj *value) TkappObject *app = (TkappObject*)tkapp; if (value->typePtr == NULL) { - /* If the result contains any bytes with the top bit set, - it's UTF-8 and we should decode it to Unicode */ -#ifdef Py_USING_UNICODE - int i; - char *s = value->bytes; - int len = value->length; - for (i = 0; i < len; i++) { - if (value->bytes[i] & 0x80) - break; - } - - if (i == value->length) - result = PyString_FromStringAndSize(s, len); - else { - /* Convert UTF-8 to Unicode string */ - result = PyUnicode_DecodeUTF8(s, len, "strict"); - if (result == NULL) { - PyErr_Clear(); - result = PyString_FromStringAndSize(s, len); - } - } -#else - result = PyString_FromStringAndSize(value->bytes, value->length); -#endif - return result; + return PyUnicode_FromStringAndSize(value->bytes, + value->length); } if (value->typePtr == app->BooleanType) { @@ -1061,7 +1045,7 @@ FromObj(PyObject* tkapp, Tcl_Obj *value) if (value->typePtr == app->ByteArrayType) { int size; char *data = (char*)Tcl_GetByteArrayFromObj(value, &size); - return PyString_FromStringAndSize(data, size); + return PyBytes_FromStringAndSize(data, size); } if (value->typePtr == app->DoubleType) { @@ -1069,7 +1053,7 @@ FromObj(PyObject* tkapp, Tcl_Obj *value) } if (value->typePtr == app->IntType) { - return PyInt_FromLong(value->internalRep.longValue); + return PyLong_FromLong(value->internalRep.longValue); } if (value->typePtr == app->ListType) { @@ -1106,7 +1090,6 @@ FromObj(PyObject* tkapp, Tcl_Obj *value) } if (value->typePtr == app->StringType) { -#ifdef Py_USING_UNICODE #if defined(Py_UNICODE_WIDE) && TCL_UTF_MAX==3 PyObject *result; int size; @@ -1126,12 +1109,6 @@ FromObj(PyObject* tkapp, Tcl_Obj *value) return PyUnicode_FromUnicode(Tcl_GetUnicode(value), Tcl_GetCharLength(value)); #endif -#else - int size; - char *c; - c = Tcl_GetStringFromObj(value, &size); - return PyString_FromStringAndSize(c, size); -#endif } return newPyTclObject(value); @@ -1233,30 +1210,7 @@ Tkapp_CallResult(TkappObject *self) const char *s = Tcl_GetStringResult(self->interp); const char *p = s; - /* If the result contains any bytes with the top bit set, - it's UTF-8 and we should decode it to Unicode */ -#ifdef Py_USING_UNICODE - while (*p != '\0') { - if (*p & 0x80) - break; - p++; - } - - if (*p == '\0') - res = PyString_FromStringAndSize(s, (int)(p-s)); - else { - /* Convert UTF-8 to Unicode string */ - p = strchr(p, '\0'); - res = PyUnicode_DecodeUTF8(s, (int)(p-s), "strict"); - if (res == NULL) { - PyErr_Clear(); - res = PyString_FromStringAndSize(s, (int)(p-s)); - } - } -#else - p = strchr(p, '\0'); - res = PyString_FromStringAndSize(s, (int)(p-s)); -#endif + res = PyUnicode_FromStringAndSize(s, (int)(p-s)); } return res; } @@ -1416,7 +1370,7 @@ Tkapp_GlobalCall(PyObject *self, PyObject *args) if (err == TCL_ERROR) res = Tkinter_Error(self); else - res = PyString_FromString(Tkapp_Result(self)); + res = PyUnicode_FromString(Tkapp_Result(self)); LEAVE_OVERLAP_TCL ckfree(cmd); } @@ -1442,7 +1396,7 @@ Tkapp_Eval(PyObject *self, PyObject *args) if (err == TCL_ERROR) res = Tkinter_Error(self); else - res = PyString_FromString(Tkapp_Result(self)); + res = PyUnicode_FromString(Tkapp_Result(self)); LEAVE_OVERLAP_TCL return res; } @@ -1465,7 +1419,7 @@ Tkapp_GlobalEval(PyObject *self, PyObject *args) if (err == TCL_ERROR) res = Tkinter_Error(self); else - res = PyString_FromString(Tkapp_Result(self)); + res = PyUnicode_FromString(Tkapp_Result(self)); LEAVE_OVERLAP_TCL return res; } @@ -1489,7 +1443,7 @@ Tkapp_EvalFile(PyObject *self, PyObject *args) res = Tkinter_Error(self); else - res = PyString_FromString(Tkapp_Result(self)); + res = PyUnicode_FromString(Tkapp_Result(self)); LEAVE_OVERLAP_TCL return res; } @@ -1512,7 +1466,7 @@ Tkapp_Record(PyObject *self, PyObject *args) if (err == TCL_ERROR) res = Tkinter_Error(self); else - res = PyString_FromString(Tkapp_Result(self)); + res = PyUnicode_FromString(Tkapp_Result(self)); LEAVE_OVERLAP_TCL return res; } @@ -1560,8 +1514,12 @@ static int varname_converter(PyObject *in, void *_out) { char **out = (char**)_out; - if (PyString_Check(in)) { - *out = PyString_AsString(in); + if (PyBytes_Check(in)) { + *out = PyBytes_AsString(in); + return 1; + } + if (PyUnicode_Check(in)) { + *out = _PyUnicode_AsString(in); return 1; } if (PyTclObject_Check(in)) { @@ -1731,7 +1689,7 @@ GetVar(PyObject *self, PyObject *args, int flags) res = FromObj(self, tres); } else { - res = PyString_FromString(Tcl_GetString(tres)); + res = PyUnicode_FromString(Tcl_GetString(tres)); } } LEAVE_OVERLAP_TCL @@ -1799,7 +1757,7 @@ Tkapp_GetInt(PyObject *self, PyObject *args) if (PyTuple_Size(args) == 1) { PyObject* o = PyTuple_GetItem(args, 0); - if (PyInt_Check(o)) { + if (PyLong_Check(o)) { Py_INCREF(o); return o; } @@ -1839,7 +1797,7 @@ Tkapp_GetBoolean(PyObject *self, PyObject *args) if (PyTuple_Size(args) == 1) { PyObject *o = PyTuple_GetItem(args, 0); - if (PyInt_Check(o)) { + if (PyLong_Check(o)) { Py_INCREF(o); return o; } @@ -1975,7 +1933,7 @@ Tkapp_SplitList(PyObject *self, PyObject *args) goto finally; for (i = 0; i < argc; i++) { - PyObject *s = PyString_FromString(argv[i]); + PyObject *s = PyUnicode_FromString(argv[i]); if (!s || PyTuple_SetItem(v, i, s)) { Py_DECREF(v); v = NULL; @@ -2016,7 +1974,7 @@ Tkapp_Merge(PyObject *self, PyObject *args) PyObject *res = NULL; if (s) { - res = PyString_FromString(s); + res = PyUnicode_FromString(s); ckfree(s); } @@ -2049,7 +2007,7 @@ static int PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { PythonCmd_ClientData *data = (PythonCmd_ClientData *)clientData; - PyObject *func, *arg, *res; + PyObject *self, *func, *arg, *res; int i, rv; Tcl_Obj *obj_res; @@ -2058,6 +2016,7 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) /* TBD: no error checking here since we know, via the * Tkapp_CreateCommand() that the client data is a two-tuple */ + self = data->self; func = data->func; /* Create argument list (argv1, ..., argvN) */ @@ -2065,8 +2024,20 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) return PythonCmd_Error(interp); for (i = 0; i < (argc - 1); i++) { - PyObject *s = PyString_FromString(argv[i + 1]); - if (!s || PyTuple_SetItem(arg, i, s)) { + PyObject *s = PyUnicode_FromString(argv[i + 1]); + if (!s) { + /* Is Tk leaking 0xC080 in %A - a "modified" utf-8 null? */ + if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError) && + !strcmp(argv[i + 1], "\xC0\x80")) { + PyErr_Clear(); + /* Convert to "strict" utf-8 null */ + s = PyUnicode_FromString("\0"); + } else { + Py_DECREF(arg); + return PythonCmd_Error(interp); + } + } + if (PyTuple_SetItem(arg, i, s)) { Py_DECREF(arg); return PythonCmd_Error(interp); } @@ -2167,7 +2138,6 @@ Tkapp_CreateCommand(PyObject *selfptr, PyObject *args) Py_INCREF(func); data->self = selfptr; data->func = func; - #ifdef WITH_THREAD if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) { Tcl_Condition cond = NULL; @@ -2322,29 +2292,11 @@ Tkapp_CreateFileHandler(PyObject *self, PyObject *args) PyObject *file, *func; int mask, tfile; - if (!self && Py_Py3kWarningFlag) { - if (PyErr_Warn(PyExc_DeprecationWarning, - "_tkinter.createfilehandler is gone in 3.x") < 0) - return NULL; - } - if (!PyArg_ParseTuple(args, "OiO:createfilehandler", &file, &mask, &func)) return NULL; -#ifdef WITH_THREAD - if (!self && !tcl_lock) { - /* We don't have the Tcl lock since Tcl is threaded. */ - PyErr_SetString(PyExc_RuntimeError, - "_tkinter.createfilehandler not supported " - "for threaded Tcl"); - return NULL; - } -#endif - - if (self) { - CHECK_TCL_APPARTMENT; - } + CHECK_TCL_APPARTMENT; tfile = PyObject_AsFileDescriptor(file); if (tfile < 0) @@ -2372,28 +2324,10 @@ Tkapp_DeleteFileHandler(PyObject *self, PyObject *args) PyObject *file; int tfile; - if (!self && Py_Py3kWarningFlag) { - if (PyErr_Warn(PyExc_DeprecationWarning, - "_tkinter.deletefilehandler is gone in 3.x") < 0) - return NULL; - } - if (!PyArg_ParseTuple(args, "O:deletefilehandler", &file)) return NULL; -#ifdef WITH_THREAD - if (!self && !tcl_lock) { - /* We don't have the Tcl lock since Tcl is threaded. */ - PyErr_SetString(PyExc_RuntimeError, - "_tkinter.deletefilehandler not supported " - "for threaded Tcl"); - return NULL; - } -#endif - - if (self) { - CHECK_TCL_APPARTMENT; - } + CHECK_TCL_APPARTMENT; tfile = PyObject_AsFileDescriptor(file); if (tfile < 0) @@ -2485,13 +2419,7 @@ Tktt_Repr(PyObject *self) PyOS_snprintf(buf, sizeof(buf), "<tktimertoken at %p%s>", v, v->func == NULL ? ", handler deleted" : ""); - return PyString_FromString(buf); -} - -static PyObject * -Tktt_GetAttr(PyObject *self, char *name) -{ - return Py_FindMethod(Tktt_methods, self, name); + return PyUnicode_FromString(buf); } static PyTypeObject Tktt_Type = @@ -2502,14 +2430,28 @@ static PyTypeObject Tktt_Type = 0, /*tp_itemsize */ Tktt_Dealloc, /*tp_dealloc */ 0, /*tp_print */ - Tktt_GetAttr, /*tp_getattr */ + 0, /*tp_getattr */ 0, /*tp_setattr */ - 0, /*tp_compare */ + 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*/ }; @@ -2551,12 +2493,6 @@ Tkapp_CreateTimerHandler(PyObject *self, PyObject *args) PyObject *func; TkttObject *v; - if (!self && Py_Py3kWarningFlag) { - if (PyErr_Warn(PyExc_DeprecationWarning, - "_tkinter.createtimerhandler is gone in 3.x") < 0) - return NULL; - } - if (!PyArg_ParseTuple(args, "iO:createtimerhandler", &milliseconds, &func)) return NULL; @@ -2565,19 +2501,7 @@ Tkapp_CreateTimerHandler(PyObject *self, PyObject *args) return NULL; } -#ifdef WITH_THREAD - if (!self && !tcl_lock) { - /* We don't have the Tcl lock since Tcl is threaded. */ - PyErr_SetString(PyExc_RuntimeError, - "_tkinter.createtimerhandler not supported " - "for threaded Tcl"); - return NULL; - } -#endif - - if (self) { - CHECK_TCL_APPARTMENT; - } + CHECK_TCL_APPARTMENT; v = Tktt_New(func); if (v) { @@ -2600,29 +2524,11 @@ Tkapp_MainLoop(PyObject *selfptr, PyObject *args) PyThreadState *tstate = PyThreadState_Get(); #endif - if (!self && Py_Py3kWarningFlag) { - if (PyErr_Warn(PyExc_DeprecationWarning, - "_tkinter.mainloop is gone in 3.x") < 0) - return NULL; - } - if (!PyArg_ParseTuple(args, "|i:mainloop", &threshold)) return NULL; -#ifdef WITH_THREAD - if (!self && !tcl_lock) { - /* We don't have the Tcl lock since Tcl is threaded. */ - PyErr_SetString(PyExc_RuntimeError, - "_tkinter.mainloop not supported " - "for threaded Tcl"); - return NULL; - } -#endif - - if (self) { - CHECK_TCL_APPARTMENT; - self->dispatching = 1; - } + CHECK_TCL_APPARTMENT; + self->dispatching = 1; quitMainLoop = 0; while (Tk_GetNumMainWindows() > threshold && @@ -2632,7 +2538,7 @@ Tkapp_MainLoop(PyObject *selfptr, PyObject *args) int result; #ifdef WITH_THREAD - if (self && self->threaded) { + if (self->threaded) { /* Allow other Python threads to run. */ ENTER_TCL result = Tcl_DoOneEvent(0); @@ -2654,15 +2560,13 @@ Tkapp_MainLoop(PyObject *selfptr, PyObject *args) #endif if (PyErr_CheckSignals() != 0) { - if (self) - self->dispatching = 0; + self->dispatching = 0; return NULL; } if (result < 0) break; } - if (self) - self->dispatching = 0; + self->dispatching = 0; quitMainLoop = 0; if (errorInCmd) { @@ -2681,12 +2585,6 @@ Tkapp_DoOneEvent(PyObject *self, PyObject *args) int flags = 0; int rv; - if (!self && Py_Py3kWarningFlag) { - if (PyErr_Warn(PyExc_DeprecationWarning, - "_tkinter.dooneevent is gone in 3.x") < 0) - return NULL; - } - if (!PyArg_ParseTuple(args, "|i:dooneevent", &flags)) return NULL; @@ -2700,12 +2598,6 @@ static PyObject * Tkapp_Quit(PyObject *self, PyObject *args) { - if (!self && Py_Py3kWarningFlag) { - if (PyErr_Warn(PyExc_DeprecationWarning, - "_tkinter.quit is gone in 3.x") < 0) - return NULL; - } - if (!PyArg_ParseTuple(args, ":quit")) return NULL; @@ -2721,7 +2613,7 @@ Tkapp_InterpAddr(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, ":interpaddr")) return NULL; - return PyInt_FromLong((long)Tkapp_Interp(self)); + return PyLong_FromLong((long)Tkapp_Interp(self)); } static PyObject * @@ -2857,12 +2749,6 @@ Tkapp_Dealloc(PyObject *self) DisableEventHook(); } -static PyObject * -Tkapp_GetAttr(PyObject *self, char *name) -{ - return Py_FindMethod(Tkapp_methods, self, name); -} - static PyTypeObject Tkapp_Type = { PyVarObject_HEAD_INIT(NULL, 0) @@ -2871,14 +2757,28 @@ static PyTypeObject Tkapp_Type = 0, /*tp_itemsize */ Tkapp_Dealloc, /*tp_dealloc */ 0, /*tp_print */ - Tkapp_GetAttr, /*tp_getattr */ + 0, /*tp_getattr */ 0, /*tp_setattr */ - 0, /*tp_compare */ + 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*/ }; @@ -3000,7 +2900,8 @@ static PyObject * Tkinter_Create(PyObject *self, PyObject *args) { char *screenName = NULL; - char *baseName = NULL; + char *baseName = NULL; /* XXX this is not used anymore; + try getting rid of it. */ char *className = NULL; int interactive = 0; int wantobjects = 0; @@ -3008,11 +2909,6 @@ Tkinter_Create(PyObject *self, PyObject *args) int sync = 0; /* pass -sync to wish */ char *use = NULL; /* pass -use to wish */ - baseName = strrchr(Py_GetProgramName(), '/'); - if (baseName != NULL) - baseName++; - else - baseName = Py_GetProgramName(); className = "Tk"; if (!PyArg_ParseTuple(args, "|zssiiiiz:create", @@ -3021,7 +2917,7 @@ Tkinter_Create(PyObject *self, PyObject *args) &sync, &use)) return NULL; - return (PyObject *) Tkapp_New(screenName, baseName, className, + return (PyObject *) Tkapp_New(screenName, className, interactive, wantobjects, wantTk, sync, use); } @@ -3053,7 +2949,7 @@ frames in an animation."; static PyObject * Tkinter_getbusywaitinterval(PyObject *self, PyObject *args) { - return PyInt_FromLong(Tkinter_busywaitinterval); + return PyLong_FromLong(Tkinter_busywaitinterval); } static char getbusywaitinterval_doc[] = @@ -3066,14 +2962,6 @@ static PyMethodDef moduleMethods[] = { {"_flatten", Tkinter_Flatten, METH_VARARGS}, {"create", Tkinter_Create, METH_VARARGS}, -#ifdef HAVE_CREATEFILEHANDLER - {"createfilehandler", Tkapp_CreateFileHandler, METH_VARARGS}, - {"deletefilehandler", Tkapp_DeleteFileHandler, METH_VARARGS}, -#endif - {"createtimerhandler", Tkapp_CreateTimerHandler, METH_VARARGS}, - {"mainloop", Tkapp_MainLoop, METH_VARARGS}, - {"dooneevent", Tkapp_DoOneEvent, METH_VARARGS}, - {"quit", Tkapp_Quit, METH_VARARGS}, {"setbusywaitinterval",Tkinter_setbusywaitinterval, METH_VARARGS, setbusywaitinterval_doc}, {"getbusywaitinterval",(PyCFunction)Tkinter_getbusywaitinterval, @@ -3184,7 +3072,7 @@ DisableEventHook(void) static void ins_long(PyObject *d, char *name, long val) { - PyObject *v = PyInt_FromLong(val); + PyObject *v = PyLong_FromLong(val); if (v) { PyDict_SetItemString(d, name, v); Py_DECREF(v); @@ -3193,7 +3081,7 @@ ins_long(PyObject *d, char *name, long val) static void ins_string(PyObject *d, char *name, char *val) { - PyObject *v = PyString_FromString(val); + PyObject *v = PyUnicode_FromString(val); if (v) { PyDict_SetItemString(d, name, v); Py_DECREF(v); @@ -3201,20 +3089,33 @@ ins_string(PyObject *d, char *name, char *val) } +static struct PyModuleDef _tkintermodule = { + PyModuleDef_HEAD_INIT, + "_tkinter", + NULL, + -1, + moduleMethods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_tkinter(void) +PyInit__tkinter(void) { - PyObject *m, *d; + PyObject *m, *d, *uexe, *cexe; - Py_TYPE(&Tkapp_Type) = &PyType_Type; + if (PyType_Ready(&Tkapp_Type) < 0) + return NULL; #ifdef WITH_THREAD tcl_lock = PyThread_allocate_lock(); #endif - m = Py_InitModule("_tkinter", moduleMethods); + m = PyModule_Create(&_tkintermodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); Tkinter_TclError = PyErr_NewException("_tkinter.TclError", NULL, NULL); @@ -3234,7 +3135,10 @@ init_tkinter(void) PyDict_SetItemString(d, "TkappType", (PyObject *)&Tkapp_Type); - Py_TYPE(&Tktt_Type) = &PyType_Type; + if (PyType_Ready(&Tktt_Type) < 0) { + Py_DECREF(m); + return NULL; + } PyDict_SetItemString(d, "TkttType", (PyObject *)&Tktt_Type); Py_TYPE(&PyTclObject_Type) = &PyType_Type; @@ -3257,10 +3161,19 @@ init_tkinter(void) /* This helps the dynamic loader; in Unicode aware Tcl versions it also helps Tcl find its encodings. */ - Tcl_FindExecutable(Py_GetProgramName()); + uexe = PyUnicode_FromWideChar(Py_GetProgramName(), -1); + if (uexe) { + cexe = PyUnicode_EncodeFSDefault(uexe); + if (cexe) + Tcl_FindExecutable(PyBytes_AsString(cexe)); + Py_XDECREF(cexe); + Py_DECREF(uexe); + } - if (PyErr_Occurred()) - return; + if (PyErr_Occurred()) { + Py_DECREF(m); + return NULL; + } #if 0 /* This was not a good idea; through <Destroy> bindings, @@ -3268,5 +3181,5 @@ init_tkinter(void) interpreter and thread state have already been destroyed! */ Py_AtExit(Tcl_Finalize); #endif - + return m; } diff --git a/Modules/_weakref.c b/Modules/_weakref.c index 3880067763d..88995b88a85 100644 --- a/Modules/_weakref.c +++ b/Modules/_weakref.c @@ -17,10 +17,10 @@ weakref_getweakrefcount(PyObject *self, PyObject *object) if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) { PyWeakReference **list = GET_WEAKREFS_LISTPTR(object); - result = PyInt_FromSsize_t(_PyWeakref_GetWeakrefCount(*list)); + result = PyLong_FromSsize_t(_PyWeakref_GetWeakrefCount(*list)); } else - result = PyInt_FromLong(0); + result = PyLong_FromLong(0); return result; } @@ -88,13 +88,25 @@ weakref_functions[] = { }; +static struct PyModuleDef weakrefmodule = { + PyModuleDef_HEAD_INIT, + "_weakref", + "Weak-reference support module.", + -1, + weakref_functions, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_weakref(void) +PyInit__weakref(void) { PyObject *m; - m = Py_InitModule3("_weakref", weakref_functions, - "Weak-reference support module."); + m = PyModule_Create(&weakrefmodule); + if (m != NULL) { Py_INCREF(&_PyWeakref_RefType); PyModule_AddObject(m, "ref", @@ -109,4 +121,5 @@ init_weakref(void) PyModule_AddObject(m, "CallableProxyType", (PyObject *) &_PyWeakref_CallableProxyType); } + return m; } diff --git a/Modules/addrinfo.h b/Modules/addrinfo.h index 670b173f2af..1cb6f0e9d44 100644 --- a/Modules/addrinfo.h +++ b/Modules/addrinfo.h @@ -170,7 +170,7 @@ struct sockaddr_storage { #ifdef __cplusplus extern "C" { #endif -extern void freehostent Py_PROTO((struct hostent *)); +extern void freehostent(struct hostent *); #ifdef __cplusplus } #endif diff --git a/Modules/almodule.c b/Modules/almodule.c deleted file mode 100644 index 691175e56bf..00000000000 --- a/Modules/almodule.c +++ /dev/null @@ -1,3232 +0,0 @@ - -#define OLD_INTERFACE /* define for pre-Irix 6 interface */ - -#include "Python.h" -#include "stringobject.h" -#include <audio.h> -#include <stdarg.h> - -#ifndef AL_NO_ELEM -#ifndef OLD_INTERFACE -#define OLD_INTERFACE -#endif /* OLD_INTERFACE */ -#endif /* AL_NO_ELEM */ - -static PyObject *ErrorObject; - -/* ----------------------------------------------------- */ - -/* Declarations for objects of type port */ - -typedef struct { - PyObject_HEAD - /* XXXX Add your own stuff here */ - ALport port; -} alpobject; - -static PyTypeObject Alptype; - - - -/* ---------------------------------------------------------------- */ - -/* Declarations for objects of type config */ - -typedef struct { - PyObject_HEAD - /* XXXX Add your own stuff here */ - ALconfig config; -} alcobject; - -static PyTypeObject Alctype; - - -static void -ErrorHandler(long code, const char *fmt, ...) -{ - va_list args; - char buf[128]; - - va_start(args, fmt); - vsprintf(buf, fmt, args); - va_end(args); - PyErr_SetString(ErrorObject, buf); -} - -#ifdef AL_NO_ELEM /* IRIX 6 */ - -static PyObject * -param2python(int resource, int param, ALvalue value, ALparamInfo *pinfo) -{ - ALparamInfo info; - - if (pinfo == NULL) { - pinfo = &info; - if (alGetParamInfo(resource, param, &info) < 0) - return NULL; - } - switch (pinfo->elementType) { - case AL_PTR_ELEM: - /* XXXX don't know how to handle this */ - case AL_NO_ELEM: - Py_INCREF(Py_None); - return Py_None; - case AL_INT32_ELEM: - case AL_RESOURCE_ELEM: - case AL_ENUM_ELEM: - return PyInt_FromLong((long) value.i); - case AL_INT64_ELEM: - return PyLong_FromLongLong(value.ll); - case AL_FIXED_ELEM: - return PyFloat_FromDouble(alFixedToDouble(value.ll)); - case AL_CHAR_ELEM: - if (value.ptr == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return PyString_FromString((char *) value.ptr); - default: - PyErr_SetString(ErrorObject, "unknown element type"); - return NULL; - } -} - -static int -python2elem(PyObject *item, void *ptr, int elementType) -{ - switch (elementType) { - case AL_INT32_ELEM: - case AL_RESOURCE_ELEM: - case AL_ENUM_ELEM: - if (!PyInt_Check(item)) { - PyErr_BadArgument(); - return -1; - } - *((int *) ptr) = PyInt_AsLong(item); - break; - case AL_INT64_ELEM: - if (PyInt_Check(item)) - *((long long *) ptr) = PyInt_AsLong(item); - else if (PyLong_Check(item)) - *((long long *) ptr) = PyLong_AsLongLong(item); - else { - PyErr_BadArgument(); - return -1; - } - break; - case AL_FIXED_ELEM: - if (PyInt_Check(item)) - *((long long *) ptr) = alDoubleToFixed((double) PyInt_AsLong(item)); - else if (PyFloat_Check(item)) - *((long long *) ptr) = alDoubleToFixed(PyFloat_AsDouble(item)); - else { - PyErr_BadArgument(); - return -1; - } - break; - default: - PyErr_SetString(ErrorObject, "unknown element type"); - return -1; - } - return 0; -} - -static int -python2param(int resource, ALpv *param, PyObject *value, ALparamInfo *pinfo) -{ - ALparamInfo info; - int i, stepsize; - PyObject *item; - - if (pinfo == NULL) { - pinfo = &info; - if (alGetParamInfo(resource, param->param, &info) < 0) - return -1; - } - switch (pinfo->valueType) { - case AL_STRING_VAL: - if (pinfo->elementType != AL_CHAR_ELEM) { - PyErr_SetString(ErrorObject, "unknown element type"); - return -1; - } - if (!PyString_Check(value)) { - PyErr_BadArgument(); - return -1; - } - param->value.ptr = PyString_AS_STRING(value); - param->sizeIn = PyString_GET_SIZE(value)+1; /*account for NUL*/ - break; - case AL_SET_VAL: - case AL_VECTOR_VAL: - if (!PyList_Check(value) && !PyTuple_Check(value)) { - PyErr_BadArgument(); - return -1; - } - switch (pinfo->elementType) { - case AL_INT32_ELEM: - case AL_RESOURCE_ELEM: - case AL_ENUM_ELEM: - param->sizeIn = PySequence_Size(value); - param->value.ptr = PyMem_NEW(int, param->sizeIn); - stepsize = sizeof(int); - break; - case AL_INT64_ELEM: - case AL_FIXED_ELEM: - param->sizeIn = PySequence_Size(value); - param->value.ptr = PyMem_NEW(long long, param->sizeIn); - stepsize = sizeof(long long); - break; - } - for (i = 0; i < param->sizeIn; i++) { - item = PySequence_GetItem(value, i); - if (python2elem(item, (void *) ((char *) param->value.ptr + i*stepsize), pinfo->elementType) < 0) { - PyMem_DEL(param->value.ptr); - return -1; - } - } - break; - case AL_SCALAR_VAL: - switch (pinfo->elementType) { - case AL_INT32_ELEM: - case AL_RESOURCE_ELEM: - case AL_ENUM_ELEM: - return python2elem(value, (void *) ¶m->value.i, - pinfo->elementType); - case AL_INT64_ELEM: - case AL_FIXED_ELEM: - return python2elem(value, (void *) ¶m->value.ll, - pinfo->elementType); - default: - PyErr_SetString(ErrorObject, "unknown element type"); - return -1; - } - } - return 0; -} - -static int -python2params(int resource1, int resource2, PyObject *list, ALpv **pvsp, ALparamInfo **pinfop) -{ - PyObject *item; - ALpv *pvs; - ALparamInfo *pinfo; - int npvs, i; - - npvs = PyList_Size(list); - pvs = PyMem_NEW(ALpv, npvs); - pinfo = PyMem_NEW(ALparamInfo, npvs); - for (i = 0; i < npvs; i++) { - item = PyList_GetItem(list, i); - if (!PyArg_ParseTuple(item, "iO", &pvs[i].param, &item)) - goto error; - if (alGetParamInfo(resource1, pvs[i].param, &pinfo[i]) < 0 && - alGetParamInfo(resource2, pvs[i].param, &pinfo[i]) < 0) - goto error; - if (python2param(resource1, &pvs[i], item, &pinfo[i]) < 0) - goto error; - } - - *pvsp = pvs; - *pinfop = pinfo; - return npvs; - - error: - /* XXXX we should clean up everything */ - if (pvs) - PyMem_DEL(pvs); - if (pinfo) - PyMem_DEL(pinfo); - return -1; -} - -/* -------------------------------------------------------- */ - - -static PyObject * -SetConfig(alcobject *self, PyObject *args, int (*func)(ALconfig, int)) -{ - int par; - - if (!PyArg_ParseTuple(args, "i:SetConfig", &par)) - return NULL; - - if ((*func)(self->config, par) == -1) - return NULL; - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -GetConfig(alcobject *self, PyObject *args, int (*func)(ALconfig)) -{ - int par; - - if (!PyArg_ParseTuple(args, ":GetConfig")) - return NULL; - - if ((par = (*func)(self->config)) == -1) - return NULL; - - return PyInt_FromLong((long) par); -} - -PyDoc_STRVAR(alc_SetWidth__doc__, -"alSetWidth: set the wordsize for integer audio data."); - -static PyObject * -alc_SetWidth(alcobject *self, PyObject *args) -{ - return SetConfig(self, args, alSetWidth); -} - - -PyDoc_STRVAR(alc_GetWidth__doc__, -"alGetWidth: get the wordsize for integer audio data."); - -static PyObject * -alc_GetWidth(alcobject *self, PyObject *args) -{ - return GetConfig(self, args, alGetWidth); -} - - -PyDoc_STRVAR(alc_SetSampFmt__doc__, -"alSetSampFmt: set the sample format setting in an audio ALconfig " -"structure."); - -static PyObject * -alc_SetSampFmt(alcobject *self, PyObject *args) -{ - return SetConfig(self, args, alSetSampFmt); -} - - -PyDoc_STRVAR(alc_GetSampFmt__doc__, -"alGetSampFmt: get the sample format setting in an audio ALconfig " -"structure."); - -static PyObject * -alc_GetSampFmt(alcobject *self, PyObject *args) -{ - return GetConfig(self, args, alGetSampFmt); -} - - -PyDoc_STRVAR(alc_SetChannels__doc__, -"alSetChannels: set the channel settings in an audio ALconfig."); - -static PyObject * -alc_SetChannels(alcobject *self, PyObject *args) -{ - return SetConfig(self, args, alSetChannels); -} - - -PyDoc_STRVAR(alc_GetChannels__doc__, -"alGetChannels: get the channel settings in an audio ALconfig."); - -static PyObject * -alc_GetChannels(alcobject *self, PyObject *args) -{ - return GetConfig(self, args, alGetChannels); -} - - -PyDoc_STRVAR(alc_SetFloatMax__doc__, -"alSetFloatMax: set the maximum value of floating point sample data."); - -static PyObject * -alc_SetFloatMax(alcobject *self, PyObject *args) -{ - double maximum_value; - - if (!PyArg_ParseTuple(args, "d:SetFloatMax", &maximum_value)) - return NULL; - if (alSetFloatMax(self->config, maximum_value) < 0) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - - -PyDoc_STRVAR(alc_GetFloatMax__doc__, -"alGetFloatMax: get the maximum value of floating point sample data."); - -static PyObject * -alc_GetFloatMax(alcobject *self, PyObject *args) -{ - double maximum_value; - - if (!PyArg_ParseTuple(args, ":GetFloatMax")) - return NULL; - if ((maximum_value = alGetFloatMax(self->config)) == 0) - return NULL; - return PyFloat_FromDouble(maximum_value); -} - - -PyDoc_STRVAR(alc_SetDevice__doc__, -"alSetDevice: set the device setting in an audio ALconfig structure."); - -static PyObject * -alc_SetDevice(alcobject *self, PyObject *args) -{ - return SetConfig(self, args, alSetDevice); -} - - -PyDoc_STRVAR(alc_GetDevice__doc__, -"alGetDevice: get the device setting in an audio ALconfig structure."); - -static PyObject * -alc_GetDevice(alcobject *self, PyObject *args) -{ - return GetConfig(self, args, alGetDevice); -} - - -PyDoc_STRVAR(alc_SetQueueSize__doc__, -"alSetQueueSize: set audio port buffer size."); - -static PyObject * -alc_SetQueueSize(alcobject *self, PyObject *args) -{ - return SetConfig(self, args, alSetQueueSize); -} - - -PyDoc_STRVAR(alc_GetQueueSize__doc__, -"alGetQueueSize: get audio port buffer size."); - -static PyObject * -alc_GetQueueSize(alcobject *self, PyObject *args) -{ - return GetConfig(self, args, alGetQueueSize); -} - -#endif /* AL_NO_ELEM */ - -static PyObject * -setconfig(alcobject *self, PyObject *args, int (*func)(ALconfig, long)) -{ - long par; - - if (!PyArg_ParseTuple(args, "l:SetConfig", &par)) - return NULL; - - if ((*func)(self->config, par) == -1) - return NULL; - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -getconfig(alcobject *self, PyObject *args, long (*func)(ALconfig)) -{ - long par; - - if (!PyArg_ParseTuple(args, ":GetConfig")) - return NULL; - - if ((par = (*func)(self->config)) == -1) - return NULL; - - return PyInt_FromLong((long) par); -} - -static PyObject * -alc_setqueuesize (alcobject *self, PyObject *args) -{ - return setconfig(self, args, ALsetqueuesize); -} - -static PyObject * -alc_getqueuesize (alcobject *self, PyObject *args) -{ - return getconfig(self, args, ALgetqueuesize); -} - -static PyObject * -alc_setwidth (alcobject *self, PyObject *args) -{ - return setconfig(self, args, ALsetwidth); -} - -static PyObject * -alc_getwidth (alcobject *self, PyObject *args) -{ - return getconfig(self, args, ALgetwidth); -} - -static PyObject * -alc_getchannels (alcobject *self, PyObject *args) -{ - return getconfig(self, args, ALgetchannels); -} - -static PyObject * -alc_setchannels (alcobject *self, PyObject *args) -{ - return setconfig(self, args, ALsetchannels); -} - -#ifdef AL_405 - -static PyObject * -alc_getsampfmt (alcobject *self, PyObject *args) -{ - return getconfig(self, args, ALgetsampfmt); -} - -static PyObject * -alc_setsampfmt (alcobject *self, PyObject *args) -{ - return setconfig(self, args, ALsetsampfmt); -} - -static PyObject * -alc_getfloatmax(alcobject *self, PyObject *args) -{ - double arg; - - if (!PyArg_ParseTuple(args, ":GetFloatMax")) - return 0; - if ((arg = ALgetfloatmax(self->config)) == 0) - return NULL; - return PyFloat_FromDouble(arg); -} - -static PyObject * -alc_setfloatmax(alcobject *self, PyObject *args) -{ - double arg; - - if (!PyArg_ParseTuple(args, "d:SetFloatMax", &arg)) - return 0; - if (ALsetfloatmax(self->config, arg) == -1) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} -#endif /* AL_405 */ - -static struct PyMethodDef alc_methods[] = { -#ifdef AL_NO_ELEM /* IRIX 6 */ - {"SetWidth", (PyCFunction)alc_SetWidth, METH_VARARGS, alc_SetWidth__doc__}, - {"GetWidth", (PyCFunction)alc_GetWidth, METH_VARARGS, alc_GetWidth__doc__}, - {"SetSampFmt", (PyCFunction)alc_SetSampFmt, METH_VARARGS, alc_SetSampFmt__doc__}, - {"GetSampFmt", (PyCFunction)alc_GetSampFmt, METH_VARARGS, alc_GetSampFmt__doc__}, - {"SetChannels", (PyCFunction)alc_SetChannels, METH_VARARGS, alc_SetChannels__doc__}, - {"GetChannels", (PyCFunction)alc_GetChannels, METH_VARARGS, alc_GetChannels__doc__}, - {"SetFloatMax", (PyCFunction)alc_SetFloatMax, METH_VARARGS, alc_SetFloatMax__doc__}, - {"GetFloatMax", (PyCFunction)alc_GetFloatMax, METH_VARARGS, alc_GetFloatMax__doc__}, - {"SetDevice", (PyCFunction)alc_SetDevice, METH_VARARGS, alc_SetDevice__doc__}, - {"GetDevice", (PyCFunction)alc_GetDevice, METH_VARARGS, alc_GetDevice__doc__}, - {"SetQueueSize", (PyCFunction)alc_SetQueueSize, METH_VARARGS, alc_SetQueueSize__doc__}, - {"GetQueueSize", (PyCFunction)alc_GetQueueSize, METH_VARARGS, alc_GetQueueSize__doc__}, -#endif /* AL_NO_ELEM */ - {"getqueuesize", (PyCFunction)alc_getqueuesize, METH_VARARGS}, - {"setqueuesize", (PyCFunction)alc_setqueuesize, METH_VARARGS}, - {"getwidth", (PyCFunction)alc_getwidth, METH_VARARGS}, - {"setwidth", (PyCFunction)alc_setwidth, METH_VARARGS}, - {"getchannels", (PyCFunction)alc_getchannels, METH_VARARGS}, - {"setchannels", (PyCFunction)alc_setchannels, METH_VARARGS}, -#ifdef AL_405 - {"getsampfmt", (PyCFunction)alc_getsampfmt, METH_VARARGS}, - {"setsampfmt", (PyCFunction)alc_setsampfmt, METH_VARARGS}, - {"getfloatmax", (PyCFunction)alc_getfloatmax, METH_VARARGS}, - {"setfloatmax", (PyCFunction)alc_setfloatmax, METH_VARARGS}, -#endif /* AL_405 */ - - {NULL, NULL} /* sentinel */ -}; - -/* ---------- */ - - -static PyObject * -newalcobject(ALconfig config) -{ - alcobject *self; - - self = PyObject_New(alcobject, &Alctype); - if (self == NULL) - return NULL; - /* XXXX Add your own initializers here */ - self->config = config; - return (PyObject *) self; -} - - -static void -alc_dealloc(alcobject *self) -{ - /* XXXX Add your own cleanup code here */ -#ifdef AL_NO_ELEM /* IRIX 6 */ - (void) alFreeConfig(self->config); /* ignore errors */ -#else - (void) ALfreeconfig(self->config); /* ignore errors */ -#endif - PyObject_Del(self); -} - -static PyObject * -alc_getattr(alcobject *self, char *name) -{ - /* XXXX Add your own getattr code here */ - return Py_FindMethod(alc_methods, (PyObject *)self, name); -} - -PyDoc_STRVAR(Alctype__doc__, ""); - -static PyTypeObject Alctype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "al.config", /*tp_name*/ - sizeof(alcobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)alc_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)alc_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - - /* Space for future expansion */ - 0L,0L,0L,0L, - Alctype__doc__ /* Documentation string */ -}; - -/* End of code for config objects */ -/* ---------------------------------------------------------------- */ - -#ifdef AL_NO_ELEM /* IRIX 6 */ - -PyDoc_STRVAR(alp_SetConfig__doc__, -"alSetConfig: set the ALconfig of an audio ALport."); - -static PyObject * -alp_SetConfig(alpobject *self, PyObject *args) -{ - alcobject *config; - if (!PyArg_ParseTuple(args, "O!:SetConfig", &Alctype, &config)) - return NULL; - if (alSetConfig(self->port, config->config) < 0) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - - -PyDoc_STRVAR(alp_GetConfig__doc__, -"alGetConfig: get the ALconfig of an audio ALport."); - -static PyObject * -alp_GetConfig(alpobject *self, PyObject *args) -{ - ALconfig config; - if (!PyArg_ParseTuple(args, ":GetConfig")) - return NULL; - if ((config = alGetConfig(self->port)) == NULL) - return NULL; - return newalcobject(config); -} - - -PyDoc_STRVAR(alp_GetResource__doc__, -"alGetResource: get the resource associated with an audio port."); - -static PyObject * -alp_GetResource(alpobject *self, PyObject *args) -{ - int resource; - - if (!PyArg_ParseTuple(args, ":GetResource")) - return NULL; - if ((resource = alGetResource(self->port)) == 0) - return NULL; - return PyInt_FromLong((long) resource); -} - - -PyDoc_STRVAR(alp_GetFD__doc__, -"alGetFD: get the file descriptor for an audio port."); - -static PyObject * -alp_GetFD(alpobject *self, PyObject *args) -{ - int fd; - - if (!PyArg_ParseTuple(args, ":GetFD")) - return NULL; - - if ((fd = alGetFD(self->port)) < 0) - return NULL; - - return PyInt_FromLong((long) fd); -} - - -PyDoc_STRVAR(alp_GetFilled__doc__, -"alGetFilled: return the number of filled sample frames in " -"an audio port."); - -static PyObject * -alp_GetFilled(alpobject *self, PyObject *args) -{ - int filled; - - if (!PyArg_ParseTuple(args, ":GetFilled")) - return NULL; - if ((filled = alGetFilled(self->port)) < 0) - return NULL; - return PyInt_FromLong((long) filled); -} - - -PyDoc_STRVAR(alp_GetFillable__doc__, -"alGetFillable: report the number of unfilled sample frames " -"in an audio port."); - -static PyObject * -alp_GetFillable(alpobject *self, PyObject *args) -{ - int fillable; - - if (!PyArg_ParseTuple(args, ":GetFillable")) - return NULL; - if ((fillable = alGetFillable(self->port)) < 0) - return NULL; - return PyInt_FromLong((long) fillable); -} - - -PyDoc_STRVAR(alp_ReadFrames__doc__, -"alReadFrames: read sample frames from an audio port."); - -static PyObject * -alp_ReadFrames(alpobject *self, PyObject *args) -{ - int framecount; - PyObject *v; - int size; - int ch; - ALconfig c; - - if (!PyArg_ParseTuple(args, "i:ReadFrames", &framecount)) - return NULL; - if (framecount < 0) { - PyErr_SetString(ErrorObject, "negative framecount"); - return NULL; - } - c = alGetConfig(self->port); - switch (alGetSampFmt(c)) { - case AL_SAMPFMT_TWOSCOMP: - switch (alGetWidth(c)) { - case AL_SAMPLE_8: - size = 1; - break; - case AL_SAMPLE_16: - size = 2; - break; - case AL_SAMPLE_24: - size = 4; - break; - default: - PyErr_SetString(ErrorObject, "can't determine width"); - alFreeConfig(c); - return NULL; - } - break; - case AL_SAMPFMT_FLOAT: - size = 4; - break; - case AL_SAMPFMT_DOUBLE: - size = 8; - break; - default: - PyErr_SetString(ErrorObject, "can't determine format"); - alFreeConfig(c); - return NULL; - } - ch = alGetChannels(c); - alFreeConfig(c); - if (ch < 0) { - PyErr_SetString(ErrorObject, "can't determine # of channels"); - return NULL; - } - size *= ch; - v = PyString_FromStringAndSize((char *) NULL, size * framecount); - if (v == NULL) - return NULL; - - Py_BEGIN_ALLOW_THREADS - alReadFrames(self->port, (void *) PyString_AS_STRING(v), framecount); - Py_END_ALLOW_THREADS - - return v; -} - - -PyDoc_STRVAR(alp_DiscardFrames__doc__, -"alDiscardFrames: discard audio from an audio port."); - -static PyObject * -alp_DiscardFrames(alpobject *self, PyObject *args) -{ - int framecount; - - if (!PyArg_ParseTuple(args, "i:DiscardFrames", &framecount)) - return NULL; - - Py_BEGIN_ALLOW_THREADS - framecount = alDiscardFrames(self->port, framecount); - Py_END_ALLOW_THREADS - - if (framecount < 0) - return NULL; - - return PyInt_FromLong((long) framecount); -} - - -PyDoc_STRVAR(alp_ZeroFrames__doc__, -"alZeroFrames: write zero-valued sample frames to an audio port."); - -static PyObject * -alp_ZeroFrames(alpobject *self, PyObject *args) -{ - int framecount; - - if (!PyArg_ParseTuple(args, "i:ZeroFrames", &framecount)) - return NULL; - - if (framecount < 0) { - PyErr_SetString(ErrorObject, "negative framecount"); - return NULL; - } - - Py_BEGIN_ALLOW_THREADS - alZeroFrames(self->port, framecount); - Py_END_ALLOW_THREADS - - Py_INCREF(Py_None); - return Py_None; -} - - -PyDoc_STRVAR(alp_SetFillPoint__doc__, -"alSetFillPoint: set low- or high-water mark for an audio port."); - -static PyObject * -alp_SetFillPoint(alpobject *self, PyObject *args) -{ - int fillpoint; - - if (!PyArg_ParseTuple(args, "i:SetFillPoint", &fillpoint)) - return NULL; - - if (alSetFillPoint(self->port, fillpoint) < 0) - return NULL; - - Py_INCREF(Py_None); - return Py_None; -} - - -PyDoc_STRVAR(alp_GetFillPoint__doc__, -"alGetFillPoint: get low- or high-water mark for an audio port."); - -static PyObject * -alp_GetFillPoint(alpobject *self, PyObject *args) -{ - int fillpoint; - - if (!PyArg_ParseTuple(args, ":GetFillPoint")) - return NULL; - - if ((fillpoint = alGetFillPoint(self->port)) < 0) - return NULL; - - return PyInt_FromLong((long) fillpoint); -} - - -PyDoc_STRVAR(alp_GetFrameNumber__doc__, -"alGetFrameNumber: get the absolute sample frame number " -"associated with a port."); - -static PyObject * -alp_GetFrameNumber(alpobject *self, PyObject *args) -{ - stamp_t fnum; - - if (!PyArg_ParseTuple(args, ":GetFrameNumber")) - return NULL; - - if (alGetFrameNumber(self->port, &fnum) < 0) - return NULL; - - return PyLong_FromLongLong((long long) fnum); -} - - -PyDoc_STRVAR(alp_GetFrameTime__doc__, -"alGetFrameTime: get the time at which a sample frame came " -"in or will go out."); - -static PyObject * -alp_GetFrameTime(alpobject *self, PyObject *args) -{ - stamp_t fnum, time; - PyObject *ret, *v0, *v1; - - if (!PyArg_ParseTuple(args, ":GetFrameTime")) - return NULL; - if (alGetFrameTime(self->port, &fnum, &time) < 0) - return NULL; - v0 = PyLong_FromLongLong((long long) fnum); - v1 = PyLong_FromLongLong((long long) time); - if (PyErr_Occurred()) { - Py_XDECREF(v0); - Py_XDECREF(v1); - return NULL; - } - ret = PyTuple_Pack(2, v0, v1); - Py_DECREF(v0); - Py_DECREF(v1); - return ret; -} - - -PyDoc_STRVAR(alp_WriteFrames__doc__, -"alWriteFrames: write sample frames to an audio port."); - -static PyObject * -alp_WriteFrames(alpobject *self, PyObject *args) -{ - char *samples; - int length; - int size, ch; - ALconfig c; - - if (!PyArg_ParseTuple(args, "s#:WriteFrames", &samples, &length)) - return NULL; - c = alGetConfig(self->port); - switch (alGetSampFmt(c)) { - case AL_SAMPFMT_TWOSCOMP: - switch (alGetWidth(c)) { - case AL_SAMPLE_8: - size = 1; - break; - case AL_SAMPLE_16: - size = 2; - break; - case AL_SAMPLE_24: - size = 4; - break; - default: - PyErr_SetString(ErrorObject, "can't determine width"); - alFreeConfig(c); - return NULL; - } - break; - case AL_SAMPFMT_FLOAT: - size = 4; - break; - case AL_SAMPFMT_DOUBLE: - size = 8; - break; - default: - PyErr_SetString(ErrorObject, "can't determine format"); - alFreeConfig(c); - return NULL; - } - ch = alGetChannels(c); - alFreeConfig(c); - if (ch < 0) { - PyErr_SetString(ErrorObject, "can't determine # of channels"); - return NULL; - } - size *= ch; - if (length % size != 0) { - PyErr_SetString(ErrorObject, - "buffer length not whole number of frames"); - return NULL; - } - - Py_BEGIN_ALLOW_THREADS - alWriteFrames(self->port, (void *) samples, length / size); - Py_END_ALLOW_THREADS - - Py_INCREF(Py_None); - return Py_None; -} - - -PyDoc_STRVAR(alp_ClosePort__doc__, "alClosePort: close an audio port."); - -static PyObject * -alp_ClosePort(alpobject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, ":ClosePort")) - return NULL; - if (alClosePort(self->port) < 0) - return NULL; - self->port = NULL; - Py_INCREF(Py_None); - return Py_None; -} - -#endif /* AL_NO_ELEM */ - -#ifdef OLD_INTERFACE -static PyObject * -alp_closeport(alpobject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, ":ClosePort")) - return NULL; - if (ALcloseport(self->port) < 0) - return NULL; - self->port = NULL; - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -alp_getfd(alpobject *self, PyObject *args) -{ - int fd; - - if (!PyArg_ParseTuple(args, ":GetFD")) - return NULL; - if ((fd = ALgetfd(self-> port)) == -1) - return NULL; - return PyInt_FromLong(fd); -} - -static PyObject * -alp_getfilled(alpobject *self, PyObject *args) -{ - long count; - - if (!PyArg_ParseTuple(args, ":GetFilled")) - return NULL; - if ((count = ALgetfilled(self-> port)) == -1) - return NULL; - return PyInt_FromLong(count); -} - -static PyObject * -alp_getfillable(alpobject *self, PyObject *args) -{ - long count; - - if (!PyArg_ParseTuple(args, ":GetFillable")) - return NULL; - if ((count = ALgetfillable(self-> port)) == -1) - return NULL; - return PyInt_FromLong (count); -} - -static PyObject * -alp_readsamps(alpobject *self, PyObject *args) -{ - long count; - PyObject *v; - ALconfig c; - int width; - int ret; - - if (!PyArg_ParseTuple(args, "l:readsamps", &count)) - return NULL; - - if (count <= 0) { - PyErr_SetString(ErrorObject, "al.readsamps : arg <= 0"); - return NULL; - } - - c = ALgetconfig(self->port); -#ifdef AL_405 - width = ALgetsampfmt(c); - if (width == AL_SAMPFMT_FLOAT) - width = sizeof(float); - else if (width == AL_SAMPFMT_DOUBLE) - width = sizeof(double); - else - width = ALgetwidth(c); -#else - width = ALgetwidth(c); -#endif /* AL_405 */ - ALfreeconfig(c); - v = PyString_FromStringAndSize((char *)NULL, width * count); - if (v == NULL) - return NULL; - - Py_BEGIN_ALLOW_THREADS - ret = ALreadsamps(self->port, (void *) PyString_AsString(v), count); - Py_END_ALLOW_THREADS - if (ret == -1) { - Py_DECREF(v); - return NULL; - } - - return (v); -} - -static PyObject * -alp_writesamps(alpobject *self, PyObject *args) -{ - char *buf; - int size, width; - ALconfig c; - int ret; - - if (!PyArg_ParseTuple(args, "s#:writesamps", &buf, &size)) - return NULL; - - c = ALgetconfig(self->port); -#ifdef AL_405 - width = ALgetsampfmt(c); - if (width == AL_SAMPFMT_FLOAT) - width = sizeof(float); - else if (width == AL_SAMPFMT_DOUBLE) - width = sizeof(double); - else - width = ALgetwidth(c); -#else - width = ALgetwidth(c); -#endif /* AL_405 */ - ALfreeconfig(c); - Py_BEGIN_ALLOW_THREADS - ret = ALwritesamps (self->port, (void *) buf, (long) size / width); - Py_END_ALLOW_THREADS - if (ret == -1) - return NULL; - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -alp_getfillpoint(alpobject *self, PyObject *args) -{ - long count; - - if (!PyArg_ParseTuple(args, ":GetFillPoint")) - return NULL; - if ((count = ALgetfillpoint(self->port)) == -1) - return NULL; - return PyInt_FromLong(count); -} - -static PyObject * -alp_setfillpoint(alpobject *self, PyObject *args) -{ - long count; - - if (!PyArg_ParseTuple(args, "l:SetFillPoint", &count)) - return NULL; - if (ALsetfillpoint(self->port, count) == -1) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -alp_setconfig(alpobject *self, PyObject *args) -{ - alcobject *config; - - if (!PyArg_ParseTuple(args, "O!:SetConfig", &Alctype, &config)) - return NULL; - if (ALsetconfig(self->port, config->config) == -1) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -alp_getconfig(alpobject *self, PyObject *args) -{ - ALconfig config; - - if (!PyArg_ParseTuple(args, ":GetConfig")) - return NULL; - config = ALgetconfig(self->port); - if (config == NULL) - return NULL; - return newalcobject(config); -} - -#ifdef AL_405 -static PyObject * -alp_getstatus(alpobject *self, PyObject *args) -{ - PyObject *list, *v; - long *PVbuffer; - long length; - int i; - - if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &list)) - return NULL; - length = PyList_Size(list); - PVbuffer = PyMem_NEW(long, length); - if (PVbuffer == NULL) - return PyErr_NoMemory(); - for (i = 0; i < length; i++) { - v = PyList_GetItem(list, i); - if (!PyInt_Check(v)) { - PyMem_DEL(PVbuffer); - PyErr_BadArgument(); - return NULL; - } - PVbuffer[i] = PyInt_AsLong(v); - } - - if (ALgetstatus(self->port, PVbuffer, length) == -1) - return NULL; - - for (i = 0; i < length; i++) - PyList_SetItem(list, i, PyInt_FromLong(PVbuffer[i])); - - PyMem_DEL(PVbuffer); - - Py_INCREF(Py_None); - return Py_None; -} -#endif /* AL_405 */ - -#endif /* OLD_INTERFACE */ - -static struct PyMethodDef alp_methods[] = { -#ifdef AL_NO_ELEM /* IRIX 6 */ - {"SetConfig", (PyCFunction)alp_SetConfig, METH_VARARGS, alp_SetConfig__doc__}, - {"GetConfig", (PyCFunction)alp_GetConfig, METH_VARARGS, alp_GetConfig__doc__}, - {"GetResource", (PyCFunction)alp_GetResource, METH_VARARGS, alp_GetResource__doc__}, - {"GetFD", (PyCFunction)alp_GetFD, METH_VARARGS, alp_GetFD__doc__}, - {"GetFilled", (PyCFunction)alp_GetFilled, METH_VARARGS, alp_GetFilled__doc__}, - {"GetFillable", (PyCFunction)alp_GetFillable, METH_VARARGS, alp_GetFillable__doc__}, - {"ReadFrames", (PyCFunction)alp_ReadFrames, METH_VARARGS, alp_ReadFrames__doc__}, - {"DiscardFrames", (PyCFunction)alp_DiscardFrames, METH_VARARGS, alp_DiscardFrames__doc__}, - {"ZeroFrames", (PyCFunction)alp_ZeroFrames, METH_VARARGS, alp_ZeroFrames__doc__}, - {"SetFillPoint", (PyCFunction)alp_SetFillPoint, METH_VARARGS, alp_SetFillPoint__doc__}, - {"GetFillPoint", (PyCFunction)alp_GetFillPoint, METH_VARARGS, alp_GetFillPoint__doc__}, - {"GetFrameNumber", (PyCFunction)alp_GetFrameNumber, METH_VARARGS, alp_GetFrameNumber__doc__}, - {"GetFrameTime", (PyCFunction)alp_GetFrameTime, METH_VARARGS, alp_GetFrameTime__doc__}, - {"WriteFrames", (PyCFunction)alp_WriteFrames, METH_VARARGS, alp_WriteFrames__doc__}, - {"ClosePort", (PyCFunction)alp_ClosePort, METH_VARARGS, alp_ClosePort__doc__}, -#endif /* AL_NO_ELEM */ -#ifdef OLD_INTERFACE - {"closeport", (PyCFunction)alp_closeport, METH_VARARGS}, - {"getfd", (PyCFunction)alp_getfd, METH_VARARGS}, - {"fileno", (PyCFunction)alp_getfd, METH_VARARGS}, - {"getfilled", (PyCFunction)alp_getfilled, METH_VARARGS}, - {"getfillable", (PyCFunction)alp_getfillable, METH_VARARGS}, - {"readsamps", (PyCFunction)alp_readsamps, METH_VARARGS}, - {"writesamps", (PyCFunction)alp_writesamps, METH_VARARGS}, - {"setfillpoint", (PyCFunction)alp_setfillpoint, METH_VARARGS}, - {"getfillpoint", (PyCFunction)alp_getfillpoint, METH_VARARGS}, - {"setconfig", (PyCFunction)alp_setconfig, METH_VARARGS}, - {"getconfig", (PyCFunction)alp_getconfig, METH_VARARGS}, -#ifdef AL_405 - {"getstatus", (PyCFunction)alp_getstatus, METH_VARARGS}, -#endif /* AL_405 */ -#endif /* OLD_INTERFACE */ - - {NULL, NULL} /* sentinel */ -}; - -/* ---------- */ - - -static PyObject * -newalpobject(ALport port) -{ - alpobject *self; - - self = PyObject_New(alpobject, &Alptype); - if (self == NULL) - return NULL; - /* XXXX Add your own initializers here */ - self->port = port; - return (PyObject *) self; -} - - -static void -alp_dealloc(alpobject *self) -{ - /* XXXX Add your own cleanup code here */ - if (self->port) { -#ifdef AL_NO_ELEM /* IRIX 6 */ - alClosePort(self->port); -#else - ALcloseport(self->port); -#endif - } - PyObject_Del(self); -} - -static PyObject * -alp_getattr(alpobject *self, char *name) -{ - /* XXXX Add your own getattr code here */ - if (self->port == NULL) { - PyErr_SetString(ErrorObject, "port already closed"); - return NULL; - } - return Py_FindMethod(alp_methods, (PyObject *)self, name); -} - -PyDoc_STRVAR(Alptype__doc__, ""); - -static PyTypeObject Alptype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "al.port", /*tp_name*/ - sizeof(alpobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)alp_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)alp_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - - /* Space for future expansion */ - 0L,0L,0L,0L, - Alptype__doc__ /* Documentation string */ -}; - -/* End of code for port objects */ -/* -------------------------------------------------------- */ - - -#ifdef AL_NO_ELEM /* IRIX 6 */ - -PyDoc_STRVAR(al_NewConfig__doc__, -"alNewConfig: create and initialize an audio ALconfig structure."); - -static PyObject * -al_NewConfig(PyObject *self, PyObject *args) -{ - ALconfig config; - - if (!PyArg_ParseTuple(args, ":NewConfig")) - return NULL; - if ((config = alNewConfig()) == NULL) - return NULL; - return newalcobject(config); -} - -PyDoc_STRVAR(al_OpenPort__doc__, -"alOpenPort: open an audio port."); - -static PyObject * -al_OpenPort(PyObject *self, PyObject *args) -{ - ALport port; - char *name, *dir; - alcobject *config = NULL; - - if (!PyArg_ParseTuple(args, "ss|O!:OpenPort", &name, &dir, &Alctype, &config)) - return NULL; - if ((port = alOpenPort(name, dir, config ? config->config : NULL)) == NULL) - return NULL; - return newalpobject(port); -} - -PyDoc_STRVAR(al_Connect__doc__, -"alConnect: connect two audio I/O resources."); - -static PyObject * -al_Connect(PyObject *self, PyObject *args) -{ - int source, dest, nprops = 0, id, i; - ALpv *props = NULL; - ALparamInfo *propinfo = NULL; - PyObject *propobj = NULL; - - if (!PyArg_ParseTuple(args, "ii|O!:Connect", &source, &dest, &PyList_Type, &propobj)) - return NULL; - if (propobj != NULL) { - nprops = python2params(source, dest, propobj, &props, &propinfo); - if (nprops < 0) - return NULL; - } - - id = alConnect(source, dest, props, nprops); - - if (props) { - for (i = 0; i < nprops; i++) { - switch (propinfo[i].valueType) { - case AL_SET_VAL: - case AL_VECTOR_VAL: - PyMem_DEL(props[i].value.ptr); - break; - } - } - PyMem_DEL(props); - PyMem_DEL(propinfo); - } - - if (id < 0) - return NULL; - return PyInt_FromLong((long) id); -} - -PyDoc_STRVAR(al_Disconnect__doc__, -"alDisconnect: delete a connection between two audio I/O resources."); - -static PyObject * -al_Disconnect(PyObject *self, PyObject *args) -{ - int res; - - if (!PyArg_ParseTuple(args, "i:Disconnect", &res)) - return NULL; - if (alDisconnect(res) < 0) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - -PyDoc_STRVAR(al_GetParams__doc__, -"alGetParams: get the values of audio resource parameters."); - -static PyObject * -al_GetParams(PyObject *self, PyObject *args) -{ - int resource; - PyObject *pvslist, *item = NULL, *v = NULL; - ALpv *pvs; - int i, j, npvs; - ALparamInfo *pinfo; - - if (!PyArg_ParseTuple(args, "iO!:GetParams", &resource, &PyList_Type, &pvslist)) - return NULL; - npvs = PyList_Size(pvslist); - pvs = PyMem_NEW(ALpv, npvs); - pinfo = PyMem_NEW(ALparamInfo, npvs); - for (i = 0; i < npvs; i++) { - item = PyList_GetItem(pvslist, i); - if (!PyInt_Check(item)) { - item = NULL; - PyErr_SetString(ErrorObject, "list of integers expected"); - goto error; - } - pvs[i].param = (int) PyInt_AsLong(item); - item = NULL; /* not needed anymore */ - if (alGetParamInfo(resource, pvs[i].param, &pinfo[i]) < 0) - goto error; - switch (pinfo[i].valueType) { - case AL_NO_VAL: - break; - case AL_MATRIX_VAL: - pinfo[i].maxElems *= pinfo[i].maxElems2; - /* fall through */ - case AL_STRING_VAL: - case AL_SET_VAL: - case AL_VECTOR_VAL: - switch (pinfo[i].elementType) { - case AL_INT32_ELEM: - case AL_RESOURCE_ELEM: - case AL_ENUM_ELEM: - pvs[i].value.ptr = PyMem_NEW(int, pinfo[i].maxElems); - pvs[i].sizeIn = pinfo[i].maxElems; - break; - case AL_INT64_ELEM: - case AL_FIXED_ELEM: - pvs[i].value.ptr = PyMem_NEW(long long, pinfo[i].maxElems); - pvs[i].sizeIn = pinfo[i].maxElems; - break; - case AL_CHAR_ELEM: - pvs[i].value.ptr = PyMem_NEW(char, 32); - pvs[i].sizeIn = 32; - break; - case AL_NO_ELEM: - case AL_PTR_ELEM: - default: - PyErr_SetString(ErrorObject, "internal error"); - goto error; - } - break; - case AL_SCALAR_VAL: - break; - default: - PyErr_SetString(ErrorObject, "internal error"); - goto error; - } - if (pinfo[i].valueType == AL_MATRIX_VAL) { - pinfo[i].maxElems /= pinfo[i].maxElems2; - pvs[i].sizeIn /= pinfo[i].maxElems2; - pvs[i].size2In = pinfo[i].maxElems2; - } - } - if (alGetParams(resource, pvs, npvs) < 0) - goto error; - if (!(v = PyList_New(npvs))) - goto error; - for (i = 0; i < npvs; i++) { - if (pvs[i].sizeOut < 0) { - char buf[32]; - PyOS_snprintf(buf, sizeof(buf), - "problem with param %d", i); - PyErr_SetString(ErrorObject, buf); - goto error; - } - switch (pinfo[i].valueType) { - case AL_NO_VAL: - item = Py_None; - Py_INCREF(item); - break; - case AL_STRING_VAL: - item = PyString_FromString(pvs[i].value.ptr); - PyMem_DEL(pvs[i].value.ptr); - break; - case AL_MATRIX_VAL: - /* XXXX this is not right */ - pvs[i].sizeOut *= pvs[i].size2Out; - /* fall through */ - case AL_SET_VAL: - case AL_VECTOR_VAL: - item = PyList_New(pvs[i].sizeOut); - for (j = 0; j < pvs[i].sizeOut; j++) { - switch (pinfo[i].elementType) { - case AL_INT32_ELEM: - case AL_RESOURCE_ELEM: - case AL_ENUM_ELEM: - PyList_SetItem(item, j, PyInt_FromLong((long) ((int *) pvs[i].value.ptr)[j])); - break; - case AL_INT64_ELEM: - PyList_SetItem(item, j, PyLong_FromLongLong(((long long *) pvs[i].value.ptr)[j])); - break; - case AL_FIXED_ELEM: - PyList_SetItem(item, j, PyFloat_FromDouble(alFixedToDouble(((long long *) pvs[i].value.ptr)[j]))); - break; - default: - PyErr_SetString(ErrorObject, "internal error"); - goto error; - } - } - PyMem_DEL(pvs[i].value.ptr); - break; - case AL_SCALAR_VAL: - item = param2python(resource, pvs[i].param, pvs[i].value, &pinfo[i]); - break; - } - if (PyErr_Occurred() || - PyList_SetItem(v, i, Py_BuildValue("(iO)", pvs[i].param, - item)) < 0 || - PyErr_Occurred()) - goto error; - Py_DECREF(item); - } - PyMem_DEL(pvs); - PyMem_DEL(pinfo); - return v; - - error: - Py_XDECREF(v); - Py_XDECREF(item); - if (pvs) - PyMem_DEL(pvs); - if (pinfo) - PyMem_DEL(pinfo); - return NULL; -} - -PyDoc_STRVAR(al_SetParams__doc__, -"alSetParams: set the values of audio resource parameters."); - -static PyObject * -al_SetParams(PyObject *self, PyObject *args) -{ - int resource; - PyObject *pvslist; - ALpv *pvs; - ALparamInfo *pinfo; - int npvs, i; - - if (!PyArg_ParseTuple(args, "iO!:SetParams", &resource, &PyList_Type, &pvslist)) - return NULL; - npvs = python2params(resource, -1, pvslist, &pvs, &pinfo); - if (npvs < 0) - return NULL; - - if (alSetParams(resource, pvs, npvs) < 0) - goto error; - - /* cleanup */ - for (i = 0; i < npvs; i++) { - switch (pinfo[i].valueType) { - case AL_SET_VAL: - case AL_VECTOR_VAL: - PyMem_DEL(pvs[i].value.ptr); - break; - } - } - PyMem_DEL(pvs); - PyMem_DEL(pinfo); - - Py_INCREF(Py_None); - return Py_None; - - error: - /* XXXX we should clean up everything */ - if (pvs) - PyMem_DEL(pvs); - if (pinfo) - PyMem_DEL(pinfo); - return NULL; -} - -PyDoc_STRVAR(al_QueryValues__doc__, -"alQueryValues: get the set of possible values for a parameter."); - -static PyObject * -al_QueryValues(PyObject *self, PyObject *args) -{ - int resource, param; - ALvalue *return_set = NULL; - int setsize = 32, qualsize = 0, nvals, i; - ALpv *quals = NULL; - ALparamInfo pinfo; - ALparamInfo *qualinfo = NULL; - PyObject *qualobj = NULL; - PyObject *res = NULL, *item; - - if (!PyArg_ParseTuple(args, "ii|O!:QueryValues", &resource, ¶m, - &PyList_Type, &qualobj)) - return NULL; - if (qualobj != NULL) { - qualsize = python2params(resource, param, qualobj, &quals, &qualinfo); - if (qualsize < 0) - return NULL; - } - setsize = 32; - return_set = PyMem_NEW(ALvalue, setsize); - if (return_set == NULL) { - PyErr_NoMemory(); - goto cleanup; - } - - retry: - nvals = alQueryValues(resource, param, return_set, setsize, quals, qualsize); - if (nvals < 0) - goto cleanup; - if (nvals > setsize) { - ALvalue *old_return_set = return_set; - setsize = nvals; - PyMem_RESIZE(return_set, ALvalue, setsize); - if (return_set == NULL) { - return_set = old_return_set; - PyErr_NoMemory(); - goto cleanup; - } - goto retry; - } - - if (alGetParamInfo(resource, param, &pinfo) < 0) - goto cleanup; - - res = PyList_New(nvals); - if (res == NULL) - goto cleanup; - for (i = 0; i < nvals; i++) { - item = param2python(resource, param, return_set[i], &pinfo); - if (item == NULL || - PyList_SetItem(res, i, item) < 0) { - Py_DECREF(res); - res = NULL; - goto cleanup; - } - } - - cleanup: - if (return_set) - PyMem_DEL(return_set); - if (quals) { - for (i = 0; i < qualsize; i++) { - switch (qualinfo[i].valueType) { - case AL_SET_VAL: - case AL_VECTOR_VAL: - PyMem_DEL(quals[i].value.ptr); - break; - } - } - PyMem_DEL(quals); - PyMem_DEL(qualinfo); - } - - return res; -} - -PyDoc_STRVAR(al_GetParamInfo__doc__, -"alGetParamInfo: get information about a parameter on " -"a particular audio resource."); - -static PyObject * -al_GetParamInfo(PyObject *self, PyObject *args) -{ - int res, param; - ALparamInfo pinfo; - PyObject *v, *item; - - if (!PyArg_ParseTuple(args, "ii:GetParamInfo", &res, ¶m)) - return NULL; - if (alGetParamInfo(res, param, &pinfo) < 0) - return NULL; - v = PyDict_New(); - if (!v) return NULL; - - item = PyInt_FromLong((long) pinfo.resource); - PyDict_SetItemString(v, "resource", item); - Py_DECREF(item); - - item = PyInt_FromLong((long) pinfo.param); - PyDict_SetItemString(v, "param", item); - Py_DECREF(item); - - item = PyInt_FromLong((long) pinfo.valueType); - PyDict_SetItemString(v, "valueType", item); - Py_DECREF(item); - - if (pinfo.valueType != AL_NO_VAL && pinfo.valueType != AL_SCALAR_VAL) { - /* multiple values */ - item = PyInt_FromLong((long) pinfo.maxElems); - PyDict_SetItemString(v, "maxElems", item); - Py_DECREF(item); - - if (pinfo.valueType == AL_MATRIX_VAL) { - /* 2 dimensional */ - item = PyInt_FromLong((long) pinfo.maxElems2); - PyDict_SetItemString(v, "maxElems2", item); - Py_DECREF(item); - } - } - - item = PyInt_FromLong((long) pinfo.elementType); - PyDict_SetItemString(v, "elementType", item); - Py_DECREF(item); - - item = PyString_FromString(pinfo.name); - PyDict_SetItemString(v, "name", item); - Py_DECREF(item); - - item = param2python(res, param, pinfo.initial, &pinfo); - PyDict_SetItemString(v, "initial", item); - Py_DECREF(item); - - if (pinfo.elementType != AL_ENUM_ELEM && - pinfo.elementType != AL_RESOURCE_ELEM && - pinfo.elementType != AL_CHAR_ELEM) { - /* range param */ - item = param2python(res, param, pinfo.min, &pinfo); - PyDict_SetItemString(v, "min", item); - Py_DECREF(item); - - item = param2python(res, param, pinfo.max, &pinfo); - PyDict_SetItemString(v, "max", item); - Py_DECREF(item); - - item = param2python(res, param, pinfo.minDelta, &pinfo); - PyDict_SetItemString(v, "minDelta", item); - Py_DECREF(item); - - item = param2python(res, param, pinfo.maxDelta, &pinfo); - PyDict_SetItemString(v, "maxDelta", item); - Py_DECREF(item); - - item = PyInt_FromLong((long) pinfo.specialVals); - PyDict_SetItemString(v, "specialVals", item); - Py_DECREF(item); - } - - return v; -} - -PyDoc_STRVAR(al_GetResourceByName__doc__, -"alGetResourceByName: find an audio resource by name."); - -static PyObject * -al_GetResourceByName(PyObject *self, PyObject *args) -{ - int res, start_res, type; - char *name; - - if (!PyArg_ParseTuple(args, "isi:GetResourceByName", &start_res, &name, &type)) - return NULL; - if ((res = alGetResourceByName(start_res, name, type)) == 0) - return NULL; - return PyInt_FromLong((long) res); -} - -PyDoc_STRVAR(al_IsSubtype__doc__, -"alIsSubtype: indicate if one resource type is a subtype of another."); - -static PyObject * -al_IsSubtype(PyObject *self, PyObject *args) -{ - int type, subtype; - - if (!PyArg_ParseTuple(args, "ii:IsSubtype", &type, &subtype)) - return NULL; - return PyInt_FromLong((long) alIsSubtype(type, subtype)); -} - -PyDoc_STRVAR(al_SetErrorHandler__doc__, ""); - -static PyObject * -al_SetErrorHandler(PyObject *self, PyObject *args) -{ - - if (!PyArg_ParseTuple(args, ":SetErrorHandler")) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - -#endif /* AL_NO_ELEM */ - -#ifdef OLD_INTERFACE - -static PyObject * -al_openport(PyObject *self, PyObject *args) -{ - char *name, *dir; - ALport port; - alcobject *config = NULL; - - if (!PyArg_ParseTuple(args, "ss|O!:OpenPort", &name, &dir, &Alctype, &config)) - return NULL; - if ((port = ALopenport(name, dir, config ? config->config : NULL)) == NULL) - return NULL; - return newalpobject(port); -} - -static PyObject * -al_newconfig(PyObject *self, PyObject *args) -{ - ALconfig config; - - if (!PyArg_ParseTuple(args, ":NewConfig")) - return NULL; - if ((config = ALnewconfig ()) == NULL) - return NULL; - return newalcobject(config); -} - -static PyObject * -al_queryparams(PyObject *self, PyObject *args) -{ - long device; - long length; - long *PVbuffer; - long PVdummy[2]; - PyObject *v = NULL; - int i; - - if (!PyArg_ParseTuple(args, "l:queryparams", &device)) - return NULL; - if ((length = ALqueryparams(device, PVdummy, 2L)) == -1) - return NULL; - if ((PVbuffer = PyMem_NEW(long, length)) == NULL) - return PyErr_NoMemory(); - if (ALqueryparams(device, PVbuffer, length) >= 0 && - (v = PyList_New((int)length)) != NULL) { - for (i = 0; i < length; i++) - PyList_SetItem(v, i, PyInt_FromLong(PVbuffer[i])); - } - PyMem_DEL(PVbuffer); - return v; -} - -static PyObject * -doParams(PyObject *args, int (*func)(long, long *, long), int modified) -{ - long device; - PyObject *list, *v; - long *PVbuffer; - long length; - int i; - - if (!PyArg_ParseTuple(args, "lO!", &device, &PyList_Type, &list)) - return NULL; - length = PyList_Size(list); - PVbuffer = PyMem_NEW(long, length); - if (PVbuffer == NULL) - return PyErr_NoMemory(); - for (i = 0; i < length; i++) { - v = PyList_GetItem(list, i); - if (!PyInt_Check(v)) { - PyMem_DEL(PVbuffer); - PyErr_BadArgument(); - return NULL; - } - PVbuffer[i] = PyInt_AsLong(v); - } - - if ((*func)(device, PVbuffer, length) == -1) { - PyMem_DEL(PVbuffer); - return NULL; - } - - if (modified) { - for (i = 0; i < length; i++) - PyList_SetItem(list, i, PyInt_FromLong(PVbuffer[i])); - } - - PyMem_DEL(PVbuffer); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -al_getparams(PyObject *self, PyObject *args) -{ - return doParams(args, ALgetparams, 1); -} - -static PyObject * -al_setparams(PyObject *self, PyObject *args) -{ - return doParams(args, ALsetparams, 0); -} - -static PyObject * -al_getname(PyObject *self, PyObject *args) -{ - long device, descriptor; - char *name; - - if (!PyArg_ParseTuple(args, "ll:getname", &device, &descriptor)) - return NULL; - if ((name = ALgetname(device, descriptor)) == NULL) - return NULL; - return PyString_FromString(name); -} - -static PyObject * -al_getdefault(PyObject *self, PyObject *args) -{ - long device, descriptor, value; - - if (!PyArg_ParseTuple(args, "ll:getdefault", &device, &descriptor)) - return NULL; - if ((value = ALgetdefault(device, descriptor)) == -1) - return NULL; - return PyLong_FromLong(value); -} - -static PyObject * -al_getminmax(PyObject *self, PyObject *args) -{ - long device, descriptor, min, max; - - if (!PyArg_ParseTuple(args, "ll:getminmax", &device, &descriptor)) - return NULL; - min = -1; - max = -1; - if (ALgetminmax(device, descriptor, &min, &max) == -1) - return NULL; - return Py_BuildValue("ll", min, max); -} - -#endif /* OLD_INTERFACE */ - -/* List of methods defined in the module */ - -static struct PyMethodDef al_methods[] = { -#ifdef AL_NO_ELEM /* IRIX 6 */ - {"NewConfig", (PyCFunction)al_NewConfig, METH_VARARGS, al_NewConfig__doc__}, - {"OpenPort", (PyCFunction)al_OpenPort, METH_VARARGS, al_OpenPort__doc__}, - {"Connect", (PyCFunction)al_Connect, METH_VARARGS, al_Connect__doc__}, - {"Disconnect", (PyCFunction)al_Disconnect, METH_VARARGS, al_Disconnect__doc__}, - {"GetParams", (PyCFunction)al_GetParams, METH_VARARGS, al_GetParams__doc__}, - {"SetParams", (PyCFunction)al_SetParams, METH_VARARGS, al_SetParams__doc__}, - {"QueryValues", (PyCFunction)al_QueryValues, METH_VARARGS, al_QueryValues__doc__}, - {"GetParamInfo", (PyCFunction)al_GetParamInfo, METH_VARARGS, al_GetParamInfo__doc__}, - {"GetResourceByName", (PyCFunction)al_GetResourceByName, METH_VARARGS, al_GetResourceByName__doc__}, - {"IsSubtype", (PyCFunction)al_IsSubtype, METH_VARARGS, al_IsSubtype__doc__}, -#if 0 - /* this one not supported */ - {"SetErrorHandler", (PyCFunction)al_SetErrorHandler, METH_VARARGS, al_SetErrorHandler__doc__}, -#endif -#endif /* AL_NO_ELEM */ -#ifdef OLD_INTERFACE - {"openport", (PyCFunction)al_openport, METH_VARARGS}, - {"newconfig", (PyCFunction)al_newconfig, METH_VARARGS}, - {"queryparams", (PyCFunction)al_queryparams, METH_VARARGS}, - {"getparams", (PyCFunction)al_getparams, METH_VARARGS}, - {"setparams", (PyCFunction)al_setparams, METH_VARARGS}, - {"getname", (PyCFunction)al_getname, METH_VARARGS}, - {"getdefault", (PyCFunction)al_getdefault, METH_VARARGS}, - {"getminmax", (PyCFunction)al_getminmax, METH_VARARGS}, -#endif /* OLD_INTERFACE */ - - {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */ -}; - - -/* Initialization function for the module (*must* be called inital) */ - -PyDoc_STRVAR(al_module_documentation, ""); - -void -inital(void) -{ - PyObject *m, *d, *x; - - if (PyErr_WarnPy3k("the al module has been removed in " - "Python 3.0", 2) < 0) - return; - - /* Create the module and add the functions */ - m = Py_InitModule4("al", al_methods, - al_module_documentation, - (PyObject*)NULL,PYTHON_API_VERSION); - if (m == NULL) - return; - - /* Add some symbolic constants to the module */ - d = PyModule_GetDict(m); - ErrorObject = PyErr_NewException("al.error", NULL, NULL); - PyDict_SetItemString(d, "error", ErrorObject); - - /* XXXX Add constants here */ -#ifdef AL_4CHANNEL - x = PyInt_FromLong((long) AL_4CHANNEL); - if (x == NULL || PyDict_SetItemString(d, "FOURCHANNEL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ADAT_IF_TYPE - x = PyInt_FromLong((long) AL_ADAT_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "ADAT_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ADAT_MCLK_TYPE - x = PyInt_FromLong((long) AL_ADAT_MCLK_TYPE); - if (x == NULL || PyDict_SetItemString(d, "ADAT_MCLK_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_AES_IF_TYPE - x = PyInt_FromLong((long) AL_AES_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "AES_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_AES_MCLK_TYPE - x = PyInt_FromLong((long) AL_AES_MCLK_TYPE); - if (x == NULL || PyDict_SetItemString(d, "AES_MCLK_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ANALOG_IF_TYPE - x = PyInt_FromLong((long) AL_ANALOG_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "ANALOG_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ASSOCIATE - x = PyInt_FromLong((long) AL_ASSOCIATE); - if (x == NULL || PyDict_SetItemString(d, "ASSOCIATE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_BUFFER_NULL - x = PyInt_FromLong((long) AL_BAD_BUFFER_NULL); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFER_NULL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_BUFFERLENGTH - x = PyInt_FromLong((long) AL_BAD_BUFFERLENGTH); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFERLENGTH", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_BUFFERLENGTH_NEG - x = PyInt_FromLong((long) AL_BAD_BUFFERLENGTH_NEG); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFERLENGTH_NEG", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_BUFFERLENGTH_ODD - x = PyInt_FromLong((long) AL_BAD_BUFFERLENGTH_ODD); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFERLENGTH_ODD", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_CHANNELS - x = PyInt_FromLong((long) AL_BAD_CHANNELS); - if (x == NULL || PyDict_SetItemString(d, "BAD_CHANNELS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_CONFIG - x = PyInt_FromLong((long) AL_BAD_CONFIG); - if (x == NULL || PyDict_SetItemString(d, "BAD_CONFIG", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_COUNT_NEG - x = PyInt_FromLong((long) AL_BAD_COUNT_NEG); - if (x == NULL || PyDict_SetItemString(d, "BAD_COUNT_NEG", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_DEVICE - x = PyInt_FromLong((long) AL_BAD_DEVICE); - if (x == NULL || PyDict_SetItemString(d, "BAD_DEVICE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_DEVICE_ACCESS - x = PyInt_FromLong((long) AL_BAD_DEVICE_ACCESS); - if (x == NULL || PyDict_SetItemString(d, "BAD_DEVICE_ACCESS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_DIRECTION - x = PyInt_FromLong((long) AL_BAD_DIRECTION); - if (x == NULL || PyDict_SetItemString(d, "BAD_DIRECTION", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_FILLPOINT - x = PyInt_FromLong((long) AL_BAD_FILLPOINT); - if (x == NULL || PyDict_SetItemString(d, "BAD_FILLPOINT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_FLOATMAX - x = PyInt_FromLong((long) AL_BAD_FLOATMAX); - if (x == NULL || PyDict_SetItemString(d, "BAD_FLOATMAX", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_ILLEGAL_STATE - x = PyInt_FromLong((long) AL_BAD_ILLEGAL_STATE); - if (x == NULL || PyDict_SetItemString(d, "BAD_ILLEGAL_STATE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_NO_PORTS - x = PyInt_FromLong((long) AL_BAD_NO_PORTS); - if (x == NULL || PyDict_SetItemString(d, "BAD_NO_PORTS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_NOT_FOUND - x = PyInt_FromLong((long) AL_BAD_NOT_FOUND); - if (x == NULL || PyDict_SetItemString(d, "BAD_NOT_FOUND", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_NOT_IMPLEMENTED - x = PyInt_FromLong((long) AL_BAD_NOT_IMPLEMENTED); - if (x == NULL || PyDict_SetItemString(d, "BAD_NOT_IMPLEMENTED", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_OUT_OF_MEM - x = PyInt_FromLong((long) AL_BAD_OUT_OF_MEM); - if (x == NULL || PyDict_SetItemString(d, "BAD_OUT_OF_MEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_PARAM - x = PyInt_FromLong((long) AL_BAD_PARAM); - if (x == NULL || PyDict_SetItemString(d, "BAD_PARAM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_PERMISSIONS - x = PyInt_FromLong((long) AL_BAD_PERMISSIONS); - if (x == NULL || PyDict_SetItemString(d, "BAD_PERMISSIONS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_PORT - x = PyInt_FromLong((long) AL_BAD_PORT); - if (x == NULL || PyDict_SetItemString(d, "BAD_PORT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_PORTSTYLE - x = PyInt_FromLong((long) AL_BAD_PORTSTYLE); - if (x == NULL || PyDict_SetItemString(d, "BAD_PORTSTYLE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_PVBUFFER - x = PyInt_FromLong((long) AL_BAD_PVBUFFER); - if (x == NULL || PyDict_SetItemString(d, "BAD_PVBUFFER", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_QSIZE - x = PyInt_FromLong((long) AL_BAD_QSIZE); - if (x == NULL || PyDict_SetItemString(d, "BAD_QSIZE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_RATE - x = PyInt_FromLong((long) AL_BAD_RATE); - if (x == NULL || PyDict_SetItemString(d, "BAD_RATE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_RESOURCE - x = PyInt_FromLong((long) AL_BAD_RESOURCE); - if (x == NULL || PyDict_SetItemString(d, "BAD_RESOURCE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_SAMPFMT - x = PyInt_FromLong((long) AL_BAD_SAMPFMT); - if (x == NULL || PyDict_SetItemString(d, "BAD_SAMPFMT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_TRANSFER_SIZE - x = PyInt_FromLong((long) AL_BAD_TRANSFER_SIZE); - if (x == NULL || PyDict_SetItemString(d, "BAD_TRANSFER_SIZE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_BAD_WIDTH - x = PyInt_FromLong((long) AL_BAD_WIDTH); - if (x == NULL || PyDict_SetItemString(d, "BAD_WIDTH", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_CHANNEL_MODE - x = PyInt_FromLong((long) AL_CHANNEL_MODE); - if (x == NULL || PyDict_SetItemString(d, "CHANNEL_MODE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_CHANNELS - x = PyInt_FromLong((long) AL_CHANNELS); - if (x == NULL || PyDict_SetItemString(d, "CHANNELS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_CHAR_ELEM - x = PyInt_FromLong((long) AL_CHAR_ELEM); - if (x == NULL || PyDict_SetItemString(d, "CHAR_ELEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_CLOCK_GEN - x = PyInt_FromLong((long) AL_CLOCK_GEN); - if (x == NULL || PyDict_SetItemString(d, "CLOCK_GEN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_CLOCKGEN_TYPE - x = PyInt_FromLong((long) AL_CLOCKGEN_TYPE); - if (x == NULL || PyDict_SetItemString(d, "CLOCKGEN_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_CONNECT - x = PyInt_FromLong((long) AL_CONNECT); - if (x == NULL || PyDict_SetItemString(d, "CONNECT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_CONNECTION_TYPE - x = PyInt_FromLong((long) AL_CONNECTION_TYPE); - if (x == NULL || PyDict_SetItemString(d, "CONNECTION_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_CONNECTIONS - x = PyInt_FromLong((long) AL_CONNECTIONS); - if (x == NULL || PyDict_SetItemString(d, "CONNECTIONS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_CRYSTAL_MCLK_TYPE - x = PyInt_FromLong((long) AL_CRYSTAL_MCLK_TYPE); - if (x == NULL || PyDict_SetItemString(d, "CRYSTAL_MCLK_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_DEFAULT_DEVICE - x = PyInt_FromLong((long) AL_DEFAULT_DEVICE); - if (x == NULL || PyDict_SetItemString(d, "DEFAULT_DEVICE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_DEFAULT_INPUT - x = PyInt_FromLong((long) AL_DEFAULT_INPUT); - if (x == NULL || PyDict_SetItemString(d, "DEFAULT_INPUT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_DEFAULT_OUTPUT - x = PyInt_FromLong((long) AL_DEFAULT_OUTPUT); - if (x == NULL || PyDict_SetItemString(d, "DEFAULT_OUTPUT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_DEST - x = PyInt_FromLong((long) AL_DEST); - if (x == NULL || PyDict_SetItemString(d, "DEST", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_DEVICE_TYPE - x = PyInt_FromLong((long) AL_DEVICE_TYPE); - if (x == NULL || PyDict_SetItemString(d, "DEVICE_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_DEVICES - x = PyInt_FromLong((long) AL_DEVICES); - if (x == NULL || PyDict_SetItemString(d, "DEVICES", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_DIGITAL_IF_TYPE - x = PyInt_FromLong((long) AL_DIGITAL_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "DIGITAL_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_DIGITAL_INPUT_RATE - x = PyInt_FromLong((long) AL_DIGITAL_INPUT_RATE); - if (x == NULL || PyDict_SetItemString(d, "DIGITAL_INPUT_RATE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_DISCONNECT - x = PyInt_FromLong((long) AL_DISCONNECT); - if (x == NULL || PyDict_SetItemString(d, "DISCONNECT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ENUM_ELEM - x = PyInt_FromLong((long) AL_ENUM_ELEM); - if (x == NULL || PyDict_SetItemString(d, "ENUM_ELEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ENUM_VALUE - x = PyInt_FromLong((long) AL_ENUM_VALUE); - if (x == NULL || PyDict_SetItemString(d, "ENUM_VALUE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ERROR_INPUT_OVERFLOW - x = PyInt_FromLong((long) AL_ERROR_INPUT_OVERFLOW); - if (x == NULL || PyDict_SetItemString(d, "ERROR_INPUT_OVERFLOW", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ERROR_LENGTH - x = PyInt_FromLong((long) AL_ERROR_LENGTH); - if (x == NULL || PyDict_SetItemString(d, "ERROR_LENGTH", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ERROR_LOCATION_LSP - x = PyInt_FromLong((long) AL_ERROR_LOCATION_LSP); - if (x == NULL || PyDict_SetItemString(d, "ERROR_LOCATION_LSP", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ERROR_LOCATION_MSP - x = PyInt_FromLong((long) AL_ERROR_LOCATION_MSP); - if (x == NULL || PyDict_SetItemString(d, "ERROR_LOCATION_MSP", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ERROR_NUMBER - x = PyInt_FromLong((long) AL_ERROR_NUMBER); - if (x == NULL || PyDict_SetItemString(d, "ERROR_NUMBER", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ERROR_OUTPUT_UNDERFLOW - x = PyInt_FromLong((long) AL_ERROR_OUTPUT_UNDERFLOW); - if (x == NULL || PyDict_SetItemString(d, "ERROR_OUTPUT_UNDERFLOW", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_ERROR_TYPE - x = PyInt_FromLong((long) AL_ERROR_TYPE); - if (x == NULL || PyDict_SetItemString(d, "ERROR_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_FIXED_ELEM - x = PyInt_FromLong((long) AL_FIXED_ELEM); - if (x == NULL || PyDict_SetItemString(d, "FIXED_ELEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_FIXED_MCLK_TYPE - x = PyInt_FromLong((long) AL_FIXED_MCLK_TYPE); - if (x == NULL || PyDict_SetItemString(d, "FIXED_MCLK_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_GAIN - x = PyInt_FromLong((long) AL_GAIN); - if (x == NULL || PyDict_SetItemString(d, "GAIN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_GAIN_REF - x = PyInt_FromLong((long) AL_GAIN_REF); - if (x == NULL || PyDict_SetItemString(d, "GAIN_REF", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_HRB_TYPE - x = PyInt_FromLong((long) AL_HRB_TYPE); - if (x == NULL || PyDict_SetItemString(d, "HRB_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INPUT_COUNT - x = PyInt_FromLong((long) AL_INPUT_COUNT); - if (x == NULL || PyDict_SetItemString(d, "INPUT_COUNT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INPUT_DEVICE_TYPE - x = PyInt_FromLong((long) AL_INPUT_DEVICE_TYPE); - if (x == NULL || PyDict_SetItemString(d, "INPUT_DEVICE_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INPUT_DIGITAL - x = PyInt_FromLong((long) AL_INPUT_DIGITAL); - if (x == NULL || PyDict_SetItemString(d, "INPUT_DIGITAL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INPUT_HRB_TYPE - x = PyInt_FromLong((long) AL_INPUT_HRB_TYPE); - if (x == NULL || PyDict_SetItemString(d, "INPUT_HRB_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INPUT_LINE - x = PyInt_FromLong((long) AL_INPUT_LINE); - if (x == NULL || PyDict_SetItemString(d, "INPUT_LINE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INPUT_MIC - x = PyInt_FromLong((long) AL_INPUT_MIC); - if (x == NULL || PyDict_SetItemString(d, "INPUT_MIC", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INPUT_PORT_TYPE - x = PyInt_FromLong((long) AL_INPUT_PORT_TYPE); - if (x == NULL || PyDict_SetItemString(d, "INPUT_PORT_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INPUT_RATE - x = PyInt_FromLong((long) AL_INPUT_RATE); - if (x == NULL || PyDict_SetItemString(d, "INPUT_RATE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INPUT_SOURCE - x = PyInt_FromLong((long) AL_INPUT_SOURCE); - if (x == NULL || PyDict_SetItemString(d, "INPUT_SOURCE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INT32_ELEM - x = PyInt_FromLong((long) AL_INT32_ELEM); - if (x == NULL || PyDict_SetItemString(d, "INT32_ELEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INT64_ELEM - x = PyInt_FromLong((long) AL_INT64_ELEM); - if (x == NULL || PyDict_SetItemString(d, "INT64_ELEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INTERFACE - x = PyInt_FromLong((long) AL_INTERFACE); - if (x == NULL || PyDict_SetItemString(d, "INTERFACE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INTERFACE_TYPE - x = PyInt_FromLong((long) AL_INTERFACE_TYPE); - if (x == NULL || PyDict_SetItemString(d, "INTERFACE_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INVALID_PARAM - x = PyInt_FromLong((long) AL_INVALID_PARAM); - if (x == NULL || PyDict_SetItemString(d, "INVALID_PARAM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_INVALID_VALUE - x = PyInt_FromLong((long) AL_INVALID_VALUE); - if (x == NULL || PyDict_SetItemString(d, "INVALID_VALUE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_JITTER - x = PyInt_FromLong((long) AL_JITTER); - if (x == NULL || PyDict_SetItemString(d, "JITTER", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_LABEL - x = PyInt_FromLong((long) AL_LABEL); - if (x == NULL || PyDict_SetItemString(d, "LABEL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_LEFT_INPUT_ATTEN - x = PyInt_FromLong((long) AL_LEFT_INPUT_ATTEN); - if (x == NULL || PyDict_SetItemString(d, "LEFT_INPUT_ATTEN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_LEFT_MONITOR_ATTEN - x = PyInt_FromLong((long) AL_LEFT_MONITOR_ATTEN); - if (x == NULL || PyDict_SetItemString(d, "LEFT_MONITOR_ATTEN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_LEFT_SPEAKER_GAIN - x = PyInt_FromLong((long) AL_LEFT_SPEAKER_GAIN); - if (x == NULL || PyDict_SetItemString(d, "LEFT_SPEAKER_GAIN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_LEFT1_INPUT_ATTEN - x = PyInt_FromLong((long) AL_LEFT1_INPUT_ATTEN); - if (x == NULL || PyDict_SetItemString(d, "LEFT1_INPUT_ATTEN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_LEFT2_INPUT_ATTEN - x = PyInt_FromLong((long) AL_LEFT2_INPUT_ATTEN); - if (x == NULL || PyDict_SetItemString(d, "LEFT2_INPUT_ATTEN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_LINE_IF_TYPE - x = PyInt_FromLong((long) AL_LINE_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "LINE_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_LOCKED - x = PyInt_FromLong((long) AL_LOCKED); - if (x == NULL || PyDict_SetItemString(d, "LOCKED", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MASTER_CLOCK - x = PyInt_FromLong((long) AL_MASTER_CLOCK); - if (x == NULL || PyDict_SetItemString(d, "MASTER_CLOCK", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MATRIX_VAL - x = PyInt_FromLong((long) AL_MATRIX_VAL); - if (x == NULL || PyDict_SetItemString(d, "MATRIX_VAL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MAX_ERROR - x = PyInt_FromLong((long) AL_MAX_ERROR); - if (x == NULL || PyDict_SetItemString(d, "MAX_ERROR", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MAX_EVENT_PARAM - x = PyInt_FromLong((long) AL_MAX_EVENT_PARAM); - if (x == NULL || PyDict_SetItemString(d, "MAX_EVENT_PARAM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MAX_PBUFSIZE - x = PyInt_FromLong((long) AL_MAX_PBUFSIZE); - if (x == NULL || PyDict_SetItemString(d, "MAX_PBUFSIZE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MAX_PORTS - x = PyInt_FromLong((long) AL_MAX_PORTS); - if (x == NULL || PyDict_SetItemString(d, "MAX_PORTS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MAX_RESOURCE_ID - x = PyInt_FromLong((long) AL_MAX_RESOURCE_ID); - if (x == NULL || PyDict_SetItemString(d, "MAX_RESOURCE_ID", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MAX_SETSIZE - x = PyInt_FromLong((long) AL_MAX_SETSIZE); - if (x == NULL || PyDict_SetItemString(d, "MAX_SETSIZE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MAX_STRLEN - x = PyInt_FromLong((long) AL_MAX_STRLEN); - if (x == NULL || PyDict_SetItemString(d, "MAX_STRLEN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MCLK_TYPE - x = PyInt_FromLong((long) AL_MCLK_TYPE); - if (x == NULL || PyDict_SetItemString(d, "MCLK_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MIC_IF_TYPE - x = PyInt_FromLong((long) AL_MIC_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "MIC_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MONITOR_CTL - x = PyInt_FromLong((long) AL_MONITOR_CTL); - if (x == NULL || PyDict_SetItemString(d, "MONITOR_CTL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MONITOR_OFF - x = PyInt_FromLong((long) AL_MONITOR_OFF); - if (x == NULL || PyDict_SetItemString(d, "MONITOR_OFF", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MONITOR_ON - x = PyInt_FromLong((long) AL_MONITOR_ON); - if (x == NULL || PyDict_SetItemString(d, "MONITOR_ON", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MONO - x = PyInt_FromLong((long) AL_MONO); - if (x == NULL || PyDict_SetItemString(d, "MONO", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_MUTE - x = PyInt_FromLong((long) AL_MUTE); - if (x == NULL || PyDict_SetItemString(d, "MUTE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NAME - x = PyInt_FromLong((long) AL_NAME); - if (x == NULL || PyDict_SetItemString(d, "NAME", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NEG_INFINITY - x = PyInt_FromLong((long) AL_NEG_INFINITY); - if (x == NULL || PyDict_SetItemString(d, "NEG_INFINITY", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NEG_INFINITY_BIT - x = PyInt_FromLong((long) AL_NEG_INFINITY_BIT); - if (x == NULL || PyDict_SetItemString(d, "NEG_INFINITY_BIT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NO_CHANGE - x = PyInt_FromLong((long) AL_NO_CHANGE); - if (x == NULL || PyDict_SetItemString(d, "NO_CHANGE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NO_CHANGE_BIT - x = PyInt_FromLong((long) AL_NO_CHANGE_BIT); - if (x == NULL || PyDict_SetItemString(d, "NO_CHANGE_BIT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NO_ELEM - x = PyInt_FromLong((long) AL_NO_ELEM); - if (x == NULL || PyDict_SetItemString(d, "NO_ELEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NO_ERRORS - x = PyInt_FromLong((long) AL_NO_ERRORS); - if (x == NULL || PyDict_SetItemString(d, "NO_ERRORS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NO_OP - x = PyInt_FromLong((long) AL_NO_OP); - if (x == NULL || PyDict_SetItemString(d, "NO_OP", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NO_VAL - x = PyInt_FromLong((long) AL_NO_VAL); - if (x == NULL || PyDict_SetItemString(d, "NO_VAL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NULL_INTERFACE - x = PyInt_FromLong((long) AL_NULL_INTERFACE); - if (x == NULL || PyDict_SetItemString(d, "NULL_INTERFACE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_NULL_RESOURCE - x = PyInt_FromLong((long) AL_NULL_RESOURCE); - if (x == NULL || PyDict_SetItemString(d, "NULL_RESOURCE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_OPTICAL_IF_TYPE - x = PyInt_FromLong((long) AL_OPTICAL_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "OPTICAL_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_OUTPUT_COUNT - x = PyInt_FromLong((long) AL_OUTPUT_COUNT); - if (x == NULL || PyDict_SetItemString(d, "OUTPUT_COUNT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_OUTPUT_DEVICE_TYPE - x = PyInt_FromLong((long) AL_OUTPUT_DEVICE_TYPE); - if (x == NULL || PyDict_SetItemString(d, "OUTPUT_DEVICE_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_OUTPUT_HRB_TYPE - x = PyInt_FromLong((long) AL_OUTPUT_HRB_TYPE); - if (x == NULL || PyDict_SetItemString(d, "OUTPUT_HRB_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_OUTPUT_PORT_TYPE - x = PyInt_FromLong((long) AL_OUTPUT_PORT_TYPE); - if (x == NULL || PyDict_SetItemString(d, "OUTPUT_PORT_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_OUTPUT_RATE - x = PyInt_FromLong((long) AL_OUTPUT_RATE); - if (x == NULL || PyDict_SetItemString(d, "OUTPUT_RATE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_PARAM_BIT - x = PyInt_FromLong((long) AL_PARAM_BIT); - if (x == NULL || PyDict_SetItemString(d, "PARAM_BIT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_PARAMS - x = PyInt_FromLong((long) AL_PARAMS); - if (x == NULL || PyDict_SetItemString(d, "PARAMS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_PORT_COUNT - x = PyInt_FromLong((long) AL_PORT_COUNT); - if (x == NULL || PyDict_SetItemString(d, "PORT_COUNT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_PORT_TYPE - x = PyInt_FromLong((long) AL_PORT_TYPE); - if (x == NULL || PyDict_SetItemString(d, "PORT_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_PORTS - x = PyInt_FromLong((long) AL_PORTS); - if (x == NULL || PyDict_SetItemString(d, "PORTS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_PORTSTYLE_DIRECT - x = PyInt_FromLong((long) AL_PORTSTYLE_DIRECT); - if (x == NULL || PyDict_SetItemString(d, "PORTSTYLE_DIRECT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_PORTSTYLE_SERIAL - x = PyInt_FromLong((long) AL_PORTSTYLE_SERIAL); - if (x == NULL || PyDict_SetItemString(d, "PORTSTYLE_SERIAL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_PRINT_ERRORS - x = PyInt_FromLong((long) AL_PRINT_ERRORS); - if (x == NULL || PyDict_SetItemString(d, "PRINT_ERRORS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_PTR_ELEM - x = PyInt_FromLong((long) AL_PTR_ELEM); - if (x == NULL || PyDict_SetItemString(d, "PTR_ELEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RANGE_VALUE - x = PyInt_FromLong((long) AL_RANGE_VALUE); - if (x == NULL || PyDict_SetItemString(d, "RANGE_VALUE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE - x = PyInt_FromLong((long) AL_RATE); - if (x == NULL || PyDict_SetItemString(d, "RATE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_11025 - x = PyInt_FromLong((long) AL_RATE_11025); - if (x == NULL || PyDict_SetItemString(d, "RATE_11025", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_16000 - x = PyInt_FromLong((long) AL_RATE_16000); - if (x == NULL || PyDict_SetItemString(d, "RATE_16000", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_22050 - x = PyInt_FromLong((long) AL_RATE_22050); - if (x == NULL || PyDict_SetItemString(d, "RATE_22050", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_32000 - x = PyInt_FromLong((long) AL_RATE_32000); - if (x == NULL || PyDict_SetItemString(d, "RATE_32000", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_44100 - x = PyInt_FromLong((long) AL_RATE_44100); - if (x == NULL || PyDict_SetItemString(d, "RATE_44100", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_48000 - x = PyInt_FromLong((long) AL_RATE_48000); - if (x == NULL || PyDict_SetItemString(d, "RATE_48000", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_8000 - x = PyInt_FromLong((long) AL_RATE_8000); - if (x == NULL || PyDict_SetItemString(d, "RATE_8000", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_AES_1 - x = PyInt_FromLong((long) AL_RATE_AES_1); - if (x == NULL || PyDict_SetItemString(d, "RATE_AES_1", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_AES_1s - x = PyInt_FromLong((long) AL_RATE_AES_1s); - if (x == NULL || PyDict_SetItemString(d, "RATE_AES_1s", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_AES_2 - x = PyInt_FromLong((long) AL_RATE_AES_2); - if (x == NULL || PyDict_SetItemString(d, "RATE_AES_2", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_AES_3 - x = PyInt_FromLong((long) AL_RATE_AES_3); - if (x == NULL || PyDict_SetItemString(d, "RATE_AES_3", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_AES_4 - x = PyInt_FromLong((long) AL_RATE_AES_4); - if (x == NULL || PyDict_SetItemString(d, "RATE_AES_4", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_AES_6 - x = PyInt_FromLong((long) AL_RATE_AES_6); - if (x == NULL || PyDict_SetItemString(d, "RATE_AES_6", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_FRACTION_D - x = PyInt_FromLong((long) AL_RATE_FRACTION_D); - if (x == NULL || PyDict_SetItemString(d, "RATE_FRACTION_D", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_FRACTION_N - x = PyInt_FromLong((long) AL_RATE_FRACTION_N); - if (x == NULL || PyDict_SetItemString(d, "RATE_FRACTION_N", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_INPUTRATE - x = PyInt_FromLong((long) AL_RATE_INPUTRATE); - if (x == NULL || PyDict_SetItemString(d, "RATE_INPUTRATE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_NO_DIGITAL_INPUT - x = PyInt_FromLong((long) AL_RATE_NO_DIGITAL_INPUT); - if (x == NULL || PyDict_SetItemString(d, "RATE_NO_DIGITAL_INPUT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_UNACQUIRED - x = PyInt_FromLong((long) AL_RATE_UNACQUIRED); - if (x == NULL || PyDict_SetItemString(d, "RATE_UNACQUIRED", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RATE_UNDEFINED - x = PyInt_FromLong((long) AL_RATE_UNDEFINED); - if (x == NULL || PyDict_SetItemString(d, "RATE_UNDEFINED", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_REF_0DBV - x = PyInt_FromLong((long) AL_REF_0DBV); - if (x == NULL || PyDict_SetItemString(d, "REF_0DBV", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_REF_NONE - x = PyInt_FromLong((long) AL_REF_NONE); - if (x == NULL || PyDict_SetItemString(d, "REF_NONE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RESERVED1_TYPE - x = PyInt_FromLong((long) AL_RESERVED1_TYPE); - if (x == NULL || PyDict_SetItemString(d, "RESERVED1_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RESERVED2_TYPE - x = PyInt_FromLong((long) AL_RESERVED2_TYPE); - if (x == NULL || PyDict_SetItemString(d, "RESERVED2_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RESERVED3_TYPE - x = PyInt_FromLong((long) AL_RESERVED3_TYPE); - if (x == NULL || PyDict_SetItemString(d, "RESERVED3_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RESERVED4_TYPE - x = PyInt_FromLong((long) AL_RESERVED4_TYPE); - if (x == NULL || PyDict_SetItemString(d, "RESERVED4_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RESOURCE - x = PyInt_FromLong((long) AL_RESOURCE); - if (x == NULL || PyDict_SetItemString(d, "RESOURCE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RESOURCE_ELEM - x = PyInt_FromLong((long) AL_RESOURCE_ELEM); - if (x == NULL || PyDict_SetItemString(d, "RESOURCE_ELEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RESOURCE_TYPE - x = PyInt_FromLong((long) AL_RESOURCE_TYPE); - if (x == NULL || PyDict_SetItemString(d, "RESOURCE_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RIGHT_INPUT_ATTEN - x = PyInt_FromLong((long) AL_RIGHT_INPUT_ATTEN); - if (x == NULL || PyDict_SetItemString(d, "RIGHT_INPUT_ATTEN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RIGHT_MONITOR_ATTEN - x = PyInt_FromLong((long) AL_RIGHT_MONITOR_ATTEN); - if (x == NULL || PyDict_SetItemString(d, "RIGHT_MONITOR_ATTEN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RIGHT_SPEAKER_GAIN - x = PyInt_FromLong((long) AL_RIGHT_SPEAKER_GAIN); - if (x == NULL || PyDict_SetItemString(d, "RIGHT_SPEAKER_GAIN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RIGHT1_INPUT_ATTEN - x = PyInt_FromLong((long) AL_RIGHT1_INPUT_ATTEN); - if (x == NULL || PyDict_SetItemString(d, "RIGHT1_INPUT_ATTEN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_RIGHT2_INPUT_ATTEN - x = PyInt_FromLong((long) AL_RIGHT2_INPUT_ATTEN); - if (x == NULL || PyDict_SetItemString(d, "RIGHT2_INPUT_ATTEN", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SAMPFMT_DOUBLE - x = PyInt_FromLong((long) AL_SAMPFMT_DOUBLE); - if (x == NULL || PyDict_SetItemString(d, "SAMPFMT_DOUBLE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SAMPFMT_FLOAT - x = PyInt_FromLong((long) AL_SAMPFMT_FLOAT); - if (x == NULL || PyDict_SetItemString(d, "SAMPFMT_FLOAT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SAMPFMT_TWOSCOMP - x = PyInt_FromLong((long) AL_SAMPFMT_TWOSCOMP); - if (x == NULL || PyDict_SetItemString(d, "SAMPFMT_TWOSCOMP", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SAMPLE_16 - x = PyInt_FromLong((long) AL_SAMPLE_16); - if (x == NULL || PyDict_SetItemString(d, "SAMPLE_16", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SAMPLE_24 - x = PyInt_FromLong((long) AL_SAMPLE_24); - if (x == NULL || PyDict_SetItemString(d, "SAMPLE_24", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SAMPLE_8 - x = PyInt_FromLong((long) AL_SAMPLE_8); - if (x == NULL || PyDict_SetItemString(d, "SAMPLE_8", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SCALAR_VAL - x = PyInt_FromLong((long) AL_SCALAR_VAL); - if (x == NULL || PyDict_SetItemString(d, "SCALAR_VAL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SET_VAL - x = PyInt_FromLong((long) AL_SET_VAL); - if (x == NULL || PyDict_SetItemString(d, "SET_VAL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SHORT_NAME - x = PyInt_FromLong((long) AL_SHORT_NAME); - if (x == NULL || PyDict_SetItemString(d, "SHORT_NAME", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SMPTE272M_IF_TYPE - x = PyInt_FromLong((long) AL_SMPTE272M_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "SMPTE272M_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SOURCE - x = PyInt_FromLong((long) AL_SOURCE); - if (x == NULL || PyDict_SetItemString(d, "SOURCE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SPEAKER_IF_TYPE - x = PyInt_FromLong((long) AL_SPEAKER_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "SPEAKER_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SPEAKER_MUTE_CTL - x = PyInt_FromLong((long) AL_SPEAKER_MUTE_CTL); - if (x == NULL || PyDict_SetItemString(d, "SPEAKER_MUTE_CTL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SPEAKER_MUTE_OFF - x = PyInt_FromLong((long) AL_SPEAKER_MUTE_OFF); - if (x == NULL || PyDict_SetItemString(d, "SPEAKER_MUTE_OFF", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SPEAKER_MUTE_ON - x = PyInt_FromLong((long) AL_SPEAKER_MUTE_ON); - if (x == NULL || PyDict_SetItemString(d, "SPEAKER_MUTE_ON", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SPEAKER_PLUS_LINE_IF_TYPE - x = PyInt_FromLong((long) AL_SPEAKER_PLUS_LINE_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "SPEAKER_PLUS_LINE_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_STEREO - x = PyInt_FromLong((long) AL_STEREO); - if (x == NULL || PyDict_SetItemString(d, "STEREO", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_STRING_VAL - x = PyInt_FromLong((long) AL_STRING_VAL); - if (x == NULL || PyDict_SetItemString(d, "STRING_VAL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SUBSYSTEM - x = PyInt_FromLong((long) AL_SUBSYSTEM); - if (x == NULL || PyDict_SetItemString(d, "SUBSYSTEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SUBSYSTEM_TYPE - x = PyInt_FromLong((long) AL_SUBSYSTEM_TYPE); - if (x == NULL || PyDict_SetItemString(d, "SUBSYSTEM_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SYNC_INPUT_TO_AES - x = PyInt_FromLong((long) AL_SYNC_INPUT_TO_AES); - if (x == NULL || PyDict_SetItemString(d, "SYNC_INPUT_TO_AES", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SYNC_OUTPUT_TO_AES - x = PyInt_FromLong((long) AL_SYNC_OUTPUT_TO_AES); - if (x == NULL || PyDict_SetItemString(d, "SYNC_OUTPUT_TO_AES", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SYSTEM - x = PyInt_FromLong((long) AL_SYSTEM); - if (x == NULL || PyDict_SetItemString(d, "SYSTEM", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_SYSTEM_TYPE - x = PyInt_FromLong((long) AL_SYSTEM_TYPE); - if (x == NULL || PyDict_SetItemString(d, "SYSTEM_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_TEST_IF_TYPE - x = PyInt_FromLong((long) AL_TEST_IF_TYPE); - if (x == NULL || PyDict_SetItemString(d, "TEST_IF_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_TYPE - x = PyInt_FromLong((long) AL_TYPE); - if (x == NULL || PyDict_SetItemString(d, "TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_TYPE_BIT - x = PyInt_FromLong((long) AL_TYPE_BIT); - if (x == NULL || PyDict_SetItemString(d, "TYPE_BIT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_UNUSED_COUNT - x = PyInt_FromLong((long) AL_UNUSED_COUNT); - if (x == NULL || PyDict_SetItemString(d, "UNUSED_COUNT", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_UNUSED_PORTS - x = PyInt_FromLong((long) AL_UNUSED_PORTS); - if (x == NULL || PyDict_SetItemString(d, "UNUSED_PORTS", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_VARIABLE_MCLK_TYPE - x = PyInt_FromLong((long) AL_VARIABLE_MCLK_TYPE); - if (x == NULL || PyDict_SetItemString(d, "VARIABLE_MCLK_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_VECTOR_VAL - x = PyInt_FromLong((long) AL_VECTOR_VAL); - if (x == NULL || PyDict_SetItemString(d, "VECTOR_VAL", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_VIDEO_MCLK_TYPE - x = PyInt_FromLong((long) AL_VIDEO_MCLK_TYPE); - if (x == NULL || PyDict_SetItemString(d, "VIDEO_MCLK_TYPE", x) < 0) - goto error; - Py_DECREF(x); -#endif -#ifdef AL_WORDSIZE - x = PyInt_FromLong((long) AL_WORDSIZE); - if (x == NULL || PyDict_SetItemString(d, "WORDSIZE", x) < 0) - goto error; - Py_DECREF(x); -#endif - -#ifdef AL_NO_ELEM /* IRIX 6 */ - (void) alSetErrorHandler(ErrorHandler); -#endif /* AL_NO_ELEM */ -#ifdef OLD_INTERFACE - (void) ALseterrorhandler(ErrorHandler); -#endif /* OLD_INTERFACE */ - - error: - return; -} diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 5a92862a7c3..475acb46920 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -22,10 +22,13 @@ struct arrayobject; /* Forward */ * functions aren't visible yet. */ struct arraydescr { - int typecode; + Py_UNICODE typecode; int itemsize; PyObject * (*getitem)(struct arrayobject *, Py_ssize_t); int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *); + char *formats; + int is_integer_type; + int is_signed; }; typedef struct arrayobject { @@ -34,6 +37,7 @@ typedef struct arrayobject { Py_ssize_t allocated; struct arraydescr *ob_descr; PyObject *weakreflist; /* List of weak references */ + int ob_exports; /* Number of exported buffers */ } arrayobject; static PyTypeObject Arraytype; @@ -47,9 +51,15 @@ array_resize(arrayobject *self, Py_ssize_t newsize) char *items; size_t _new_size; + if (self->ob_exports > 0 && newsize != Py_SIZE(self)) { + PyErr_SetString(PyExc_BufferError, + "cannot resize an array that is exporting buffers"); + return -1; + } + /* Bypass realloc() when a previous overallocation is large enough to accommodate the newsize. If the newsize is 16 smaller than the - current size, then proceed with the realloc() to shrink the list. + current size, then proceed with the realloc() to shrink the array. */ if (self->allocated >= newsize && @@ -59,6 +69,14 @@ array_resize(arrayobject *self, Py_ssize_t newsize) return 0; } + if (newsize == 0) { + PyMem_FREE(self->ob_item); + self->ob_item = NULL; + Py_SIZE(self) = 0; + self->allocated = 0; + return 0; + } + /* This over-allocates proportional to the array size, making room * for additional growth. The over-allocation is mild, but is * enough to give linear-time amortized behavior over a long @@ -102,29 +120,12 @@ in bounds; that's the responsibility of the caller. ****************************************************************************/ static PyObject * -c_getitem(arrayobject *ap, Py_ssize_t i) -{ - return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1); -} - -static int -c_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) -{ - char x; - if (!PyArg_Parse(v, "c;array item must be char", &x)) - return -1; - if (i >= 0) - ((char *)ap->ob_item)[i] = x; - return 0; -} - -static PyObject * b_getitem(arrayobject *ap, Py_ssize_t i) { long x = ((char *)ap->ob_item)[i]; if (x >= 128) x -= 256; - return PyInt_FromLong(x); + return PyLong_FromLong(x); } static int @@ -155,7 +156,7 @@ static PyObject * BB_getitem(arrayobject *ap, Py_ssize_t i) { long x = ((unsigned char *)ap->ob_item)[i]; - return PyInt_FromLong(x); + return PyLong_FromLong(x); } static int @@ -170,7 +171,6 @@ BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) return 0; } -#ifdef Py_USING_UNICODE static PyObject * u_getitem(arrayobject *ap, Py_ssize_t i) { @@ -194,14 +194,15 @@ u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) ((Py_UNICODE *)ap->ob_item)[i] = p[0]; return 0; } -#endif + static PyObject * h_getitem(arrayobject *ap, Py_ssize_t i) { - return PyInt_FromLong((long) ((short *)ap->ob_item)[i]); + return PyLong_FromLong((long) ((short *)ap->ob_item)[i]); } + static int h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { @@ -217,7 +218,7 @@ h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) static PyObject * HH_getitem(arrayobject *ap, Py_ssize_t i) { - return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]); + return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]); } static int @@ -246,7 +247,7 @@ HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) static PyObject * i_getitem(arrayobject *ap, Py_ssize_t i) { - return PyInt_FromLong((long) ((int *)ap->ob_item)[i]); + return PyLong_FromLong((long) ((int *)ap->ob_item)[i]); } static int @@ -303,7 +304,7 @@ II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) static PyObject * l_getitem(arrayobject *ap, Py_ssize_t i) { - return PyInt_FromLong(((long *)ap->ob_item)[i]); + return PyLong_FromLong(((long *)ap->ob_item)[i]); } static int @@ -389,23 +390,25 @@ d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) return 0; } -/* Description of types */ + +/* Description of types. + * + * Don't forget to update typecode_to_mformat_code() if you add a new + * typecode. + */ static struct arraydescr descriptors[] = { - {'c', sizeof(char), c_getitem, c_setitem}, - {'b', sizeof(char), b_getitem, b_setitem}, - {'B', sizeof(char), BB_getitem, BB_setitem}, -#ifdef Py_USING_UNICODE - {'u', sizeof(Py_UNICODE), u_getitem, u_setitem}, -#endif - {'h', sizeof(short), h_getitem, h_setitem}, - {'H', sizeof(short), HH_getitem, HH_setitem}, - {'i', sizeof(int), i_getitem, i_setitem}, - {'I', sizeof(int), II_getitem, II_setitem}, - {'l', sizeof(long), l_getitem, l_setitem}, - {'L', sizeof(long), LL_getitem, LL_setitem}, - {'f', sizeof(float), f_getitem, f_setitem}, - {'d', sizeof(double), d_getitem, d_setitem}, - {'\0', 0, 0, 0} /* Sentinel */ + {'b', 1, b_getitem, b_setitem, "b", 1, 1}, + {'B', 1, BB_getitem, BB_setitem, "B", 1, 0}, + {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, "u", 0, 0}, + {'h', sizeof(short), h_getitem, h_setitem, "h", 1, 1}, + {'H', sizeof(short), HH_getitem, HH_setitem, "H", 1, 0}, + {'i', sizeof(int), i_getitem, i_setitem, "i", 1, 1}, + {'I', sizeof(int), II_getitem, II_setitem, "I", 1, 0}, + {'l', sizeof(long), l_getitem, l_setitem, "l", 1, 1}, + {'L', sizeof(long), LL_getitem, LL_setitem, "L", 1, 0}, + {'f', sizeof(float), f_getitem, f_setitem, "f", 0, 0}, + {'d', sizeof(double), d_getitem, d_setitem, "d", 0, 0}, + {'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */ }; /**************************************************************************** @@ -446,6 +449,7 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr) return PyErr_NoMemory(); } } + op->ob_exports = 0; return (PyObject *) op; } @@ -670,11 +674,9 @@ array_concat(arrayobject *a, PyObject *bb) static PyObject * array_repeat(arrayobject *a, Py_ssize_t n) { - Py_ssize_t i; Py_ssize_t size; arrayobject *np; - char *p; - Py_ssize_t nbytes; + Py_ssize_t oldbytes, newbytes; if (n < 0) n = 0; if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) { @@ -684,13 +686,23 @@ array_repeat(arrayobject *a, Py_ssize_t n) np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr); if (np == NULL) return NULL; - p = np->ob_item; - nbytes = Py_SIZE(a) * a->ob_descr->itemsize; - for (i = 0; i < n; i++) { - memcpy(p, a->ob_item, nbytes); - p += nbytes; + if (n == 0) + return (PyObject *)np; + oldbytes = Py_SIZE(a) * a->ob_descr->itemsize; + newbytes = oldbytes * n; + /* this follows the code in unicode_repeat */ + if (oldbytes == 1) { + memset(np->ob_item, a->ob_item[0], newbytes); + } else { + Py_ssize_t done = oldbytes; + Py_MEMCPY(np->ob_item, a->ob_item, oldbytes); + while (done < newbytes) { + Py_ssize_t ncopy = (done <= newbytes-done) ? done : newbytes-done; + Py_MEMCPY(np->ob_item+done, np->ob_item, ncopy); + done += ncopy; + } } - return (PyObject *) np; + return (PyObject *)np; } static int @@ -737,29 +749,27 @@ array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) ihigh = Py_SIZE(a); item = a->ob_item; d = n - (ihigh-ilow); + /* Issue #4509: If the array has exported buffers and the slice + assignment would change the size of the array, fail early to make + sure we don't modify it. */ + if (d != 0 && a->ob_exports > 0) { + PyErr_SetString(PyExc_BufferError, + "cannot resize an array that is exporting buffers"); + return -1; + } if (d < 0) { /* Delete -d items */ memmove(item + (ihigh+d)*a->ob_descr->itemsize, item + ihigh*a->ob_descr->itemsize, (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize); - Py_SIZE(a) += d; - PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize); - /* Can't fail */ - a->ob_item = item; - a->allocated = Py_SIZE(a); + if (array_resize(a, Py_SIZE(a) + d) == -1) + return -1; } else if (d > 0) { /* Insert d items */ - PyMem_RESIZE(item, char, - (Py_SIZE(a) + d)*a->ob_descr->itemsize); - if (item == NULL) { - PyErr_NoMemory(); + if (array_resize(a, Py_SIZE(a) + d)) return -1; - } memmove(item + (ihigh+d)*a->ob_descr->itemsize, item + ihigh*a->ob_descr->itemsize, (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize); - a->ob_item = item; - Py_SIZE(a) += d; - a->allocated = Py_SIZE(a); } if (n > 0) memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item, @@ -814,8 +824,7 @@ array_iter_extend(arrayobject *self, PyObject *bb) static int array_do_extend(arrayobject *self, PyObject *bb) { - Py_ssize_t size; - char *old_item; + Py_ssize_t size, oldsize, bbsize; if (!array_Check(bb)) return array_iter_extend(self, bb); @@ -830,18 +839,14 @@ array_do_extend(arrayobject *self, PyObject *bb) PyErr_NoMemory(); return -1; } - size = Py_SIZE(self) + Py_SIZE(b); - old_item = self->ob_item; - PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize); - if (self->ob_item == NULL) { - self->ob_item = old_item; - PyErr_NoMemory(); + oldsize = Py_SIZE(self); + /* Get the size of bb before resizing the array since bb could be self. */ + bbsize = Py_SIZE(bb); + size = oldsize + Py_SIZE(b); + if (array_resize(self, size) == -1) return -1; - } - memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize, - b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize); - Py_SIZE(self) = size; - self->allocated = size; + memcpy(self->ob_item + oldsize * self->ob_descr->itemsize, + b->ob_item, bbsize * b->ob_descr->itemsize); return 0; #undef b @@ -877,27 +882,15 @@ array_inplace_repeat(arrayobject *self, Py_ssize_t n) return PyErr_NoMemory(); } size = Py_SIZE(self) * self->ob_descr->itemsize; - if (n == 0) { - PyMem_FREE(items); - self->ob_item = NULL; - Py_SIZE(self) = 0; - self->allocated = 0; + if (n > 0 && size > PY_SSIZE_T_MAX / n) { + return PyErr_NoMemory(); } - else { - if (size > PY_SSIZE_T_MAX / n) { - return PyErr_NoMemory(); - } - PyMem_RESIZE(items, char, n * size); - if (items == NULL) - return PyErr_NoMemory(); - p = items; - for (i = 1; i < n; i++) { - p += size; - memcpy(p, items, size); - } - self->ob_item = items; - Py_SIZE(self) *= n; - self->allocated = Py_SIZE(self); + if (array_resize(self, n * Py_SIZE(self)) == -1) + return NULL; + items = p = self->ob_item; + for (i = 1; i < n; i++) { + p += size; + memcpy(p, items, size); } } Py_INCREF(self); @@ -929,7 +922,7 @@ array_count(arrayobject *self, PyObject *v) else if (cmp < 0) return NULL; } - return PyInt_FromSsize_t(count); + return PyLong_FromSsize_t(count); } PyDoc_STRVAR(count_doc, @@ -947,7 +940,7 @@ array_index(arrayobject *self, PyObject *v) int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ); Py_DECREF(selfi); if (cmp > 0) { - return PyInt_FromLong((long)i); + return PyLong_FromLong((long)i); } else if (cmp < 0) return NULL; @@ -1073,7 +1066,7 @@ array_buffer_info(arrayobject *self, PyObject *unused) return NULL; PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item)); - PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(Py_SIZE(self)))); + PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self)))); return retval; } @@ -1188,96 +1181,97 @@ PyDoc_STRVAR(reverse_doc, \n\ Reverse the order of the items in the array."); + +/* Forward */ +static PyObject *array_frombytes(arrayobject *self, PyObject *args); + static PyObject * array_fromfile(arrayobject *self, PyObject *args) { - PyObject *f; - Py_ssize_t n; - FILE *fp; + PyObject *f, *b, *res; + Py_ssize_t itemsize = self->ob_descr->itemsize; + Py_ssize_t n, nbytes; + int not_enough_bytes; + if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n)) return NULL; - fp = PyFile_AsFile(f); - if (fp == NULL) { - PyErr_SetString(PyExc_TypeError, "arg1 must be open file"); + + nbytes = n * itemsize; + if (nbytes < 0 || nbytes/itemsize != n) { + PyErr_NoMemory(); return NULL; } - if (n > 0) { - char *item = self->ob_item; - Py_ssize_t itemsize = self->ob_descr->itemsize; - size_t nread; - Py_ssize_t newlength; - size_t newbytes; - /* Be careful here about overflow */ - if ((newlength = Py_SIZE(self) + n) <= 0 || - (newbytes = newlength * itemsize) / itemsize != - (size_t)newlength) - goto nomem; - PyMem_RESIZE(item, char, newbytes); - if (item == NULL) { - nomem: - PyErr_NoMemory(); - return NULL; - } - self->ob_item = item; - Py_SIZE(self) += n; - self->allocated = Py_SIZE(self); - nread = fread(item + (Py_SIZE(self) - n) * itemsize, - itemsize, n, fp); - if (nread < (size_t)n) { - Py_SIZE(self) -= (n - nread); - PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize); - self->ob_item = item; - self->allocated = Py_SIZE(self); - if (ferror(fp)) { - PyErr_SetFromErrno(PyExc_IOError); - clearerr(fp); - } - else { - PyErr_SetString(PyExc_EOFError, - "not enough items in file"); - } - return NULL; - } + + b = PyObject_CallMethod(f, "read", "n", nbytes); + if (b == NULL) + return NULL; + + if (!PyBytes_Check(b)) { + PyErr_SetString(PyExc_TypeError, + "read() didn't return bytes"); + Py_DECREF(b); + return NULL; } - Py_INCREF(Py_None); - return Py_None; + + not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes); + + args = Py_BuildValue("(O)", b); + Py_DECREF(b); + if (args == NULL) + return NULL; + + res = array_frombytes(self, args); + Py_DECREF(args); + if (res == NULL) + return NULL; + + if (not_enough_bytes) { + PyErr_SetString(PyExc_EOFError, + "read() didn't return enough bytes"); + Py_DECREF(res); + return NULL; + } + + return res; } PyDoc_STRVAR(fromfile_doc, "fromfile(f, n)\n\ \n\ Read n objects from the file object f and append them to the end of the\n\ -array. Also called as read."); - - -static PyObject * -array_fromfile_as_read(arrayobject *self, PyObject *args) -{ - if (PyErr_WarnPy3k("array.read() not supported in 3.x; " - "use array.fromfile()", 1) < 0) - return NULL; - return array_fromfile(self, args); -} +array."); static PyObject * array_tofile(arrayobject *self, PyObject *f) { - FILE *fp; + Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize; + /* Write 64K blocks at a time */ + /* XXX Make the block size settable */ + int BLOCKSIZE = 64*1024; + Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE; + Py_ssize_t i; - fp = PyFile_AsFile(f); - if (fp == NULL) { - PyErr_SetString(PyExc_TypeError, "arg must be open file"); - return NULL; - } - if (self->ob_size > 0) { - if (fwrite(self->ob_item, self->ob_descr->itemsize, - self->ob_size, fp) != (size_t)self->ob_size) { - PyErr_SetFromErrno(PyExc_IOError); - clearerr(fp); + if (Py_SIZE(self) == 0) + goto done; + + for (i = 0; i < nblocks; i++) { + char* ptr = self->ob_item + i*BLOCKSIZE; + Py_ssize_t size = BLOCKSIZE; + PyObject *bytes, *res; + if (i*BLOCKSIZE + size > nbytes) + size = nbytes - i*BLOCKSIZE; + bytes = PyBytes_FromStringAndSize(ptr, size); + if (bytes == NULL) return NULL; - } + res = PyObject_CallMethod(f, "write", "O", bytes); + Py_DECREF(bytes); + if (res == NULL) + return NULL; + Py_DECREF(res); /* drop write result */ } + + done: Py_INCREF(Py_None); return Py_None; } @@ -1285,25 +1279,13 @@ array_tofile(arrayobject *self, PyObject *f) PyDoc_STRVAR(tofile_doc, "tofile(f)\n\ \n\ -Write all items (as machine values) to the file object f. Also called as\n\ -write."); - - -static PyObject * -array_tofile_as_write(arrayobject *self, PyObject *f) -{ - if (PyErr_WarnPy3k("array.write() not supported in 3.x; " - "use array.tofile()", 1) < 0) - return NULL; - return array_tofile(self, f); -} +Write all items (as machine values) to the file object f."); static PyObject * array_fromlist(arrayobject *self, PyObject *list) { Py_ssize_t n; - Py_ssize_t itemsize = self->ob_descr->itemsize; if (!PyList_Check(list)) { PyErr_SetString(PyExc_TypeError, "arg must be list"); @@ -1311,28 +1293,15 @@ array_fromlist(arrayobject *self, PyObject *list) } n = PyList_Size(list); if (n > 0) { - char *item = self->ob_item; - Py_ssize_t i; - PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize); - if (item == NULL) { - PyErr_NoMemory(); + Py_ssize_t i, old_size; + old_size = Py_SIZE(self); + if (array_resize(self, old_size + n) == -1) return NULL; - } - self->ob_item = item; - Py_SIZE(self) += n; - self->allocated = Py_SIZE(self); for (i = 0; i < n; i++) { PyObject *v = PyList_GetItem(list, i); if ((*self->ob_descr->setitem)(self, Py_SIZE(self) - n + i, v) != 0) { - Py_SIZE(self) -= n; - if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) { - return PyErr_NoMemory(); - } - PyMem_RESIZE(item, char, - Py_SIZE(self) * itemsize); - self->ob_item = item; - self->allocated = Py_SIZE(self); + array_resize(self, old_size); return NULL; } } @@ -1346,7 +1315,6 @@ PyDoc_STRVAR(fromlist_doc, \n\ Append items to array from list."); - static PyObject * array_tolist(arrayobject *self, PyObject *unused) { @@ -1371,97 +1339,139 @@ PyDoc_STRVAR(tolist_doc, \n\ Convert array to an ordinary list with the same items."); - static PyObject * -array_fromstring(arrayobject *self, PyObject *args) +frombytes(arrayobject *self, Py_buffer *buffer) { - char *str; - Py_ssize_t n; int itemsize = self->ob_descr->itemsize; - if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n)) + Py_ssize_t n; + if (buffer->itemsize != 1) { + PyBuffer_Release(buffer); + PyErr_SetString(PyExc_TypeError, "string/buffer of bytes required."); return NULL; + } + n = buffer->len; if (n % itemsize != 0) { + PyBuffer_Release(buffer); PyErr_SetString(PyExc_ValueError, "string length not a multiple of item size"); return NULL; } n = n / itemsize; if (n > 0) { - char *item = self->ob_item; - if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) || - ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) { + Py_ssize_t old_size = Py_SIZE(self); + if ((n > PY_SSIZE_T_MAX - old_size) || + ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) { + PyBuffer_Release(buffer); return PyErr_NoMemory(); } - PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize); - if (item == NULL) { - PyErr_NoMemory(); + if (array_resize(self, old_size + n) == -1) { + PyBuffer_Release(buffer); return NULL; } - self->ob_item = item; - Py_SIZE(self) += n; - self->allocated = Py_SIZE(self); - memcpy(item + (Py_SIZE(self) - n) * itemsize, - str, itemsize*n); + memcpy(self->ob_item + old_size * itemsize, + buffer->buf, n * itemsize); } + PyBuffer_Release(buffer); Py_INCREF(Py_None); return Py_None; } +static PyObject * +array_fromstring(arrayobject *self, PyObject *args) +{ + Py_buffer buffer; + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "fromstring() is deprecated. Use frombytes() instead.", 2) != 0) + return NULL; + if (!PyArg_ParseTuple(args, "s*:fromstring", &buffer)) + return NULL; + else + return frombytes(self, &buffer); +} + PyDoc_STRVAR(fromstring_doc, "fromstring(string)\n\ \n\ Appends items from the string, interpreting it as an array of machine\n\ -values,as if it had been read from a file using the fromfile() method)."); +values, as if it had been read from a file using the fromfile() method).\n\ +\n\ +This method is deprecated. Use frombytes instead."); static PyObject * -array_tostring(arrayobject *self, PyObject *unused) +array_frombytes(arrayobject *self, PyObject *args) { - if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) { - return PyString_FromStringAndSize(self->ob_item, + Py_buffer buffer; + if (!PyArg_ParseTuple(args, "y*:frombytes", &buffer)) + return NULL; + else + return frombytes(self, &buffer); +} + +PyDoc_STRVAR(frombytes_doc, +"frombytes(bytestring)\n\ +\n\ +Appends items from the string, interpreting it as an array of machine\n\ +values, as if it had been read from a file using the fromfile() method)."); + + +static PyObject * +array_tobytes(arrayobject *self, PyObject *unused) +{ + if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) { + return PyBytes_FromStringAndSize(self->ob_item, Py_SIZE(self) * self->ob_descr->itemsize); } else { return PyErr_NoMemory(); } } -PyDoc_STRVAR(tostring_doc, -"tostring() -> string\n\ +PyDoc_STRVAR(tobytes_doc, +"tobytes() -> bytes\n\ \n\ -Convert the array to an array of machine values and return the string\n\ +Convert the array to an array of machine values and return the bytes\n\ representation."); +static PyObject * +array_tostring(arrayobject *self, PyObject *unused) +{ + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "tostring() is deprecated. Use tobytes() instead.", 2) != 0) + return NULL; + return array_tobytes(self, unused); +} + +PyDoc_STRVAR(tostring_doc, +"tostring() -> bytes\n\ +\n\ +Convert the array to an array of machine values and return the bytes\n\ +representation.\n\ +\n\ +This method is deprecated. Use tobytes instead."); + -#ifdef Py_USING_UNICODE static PyObject * array_fromunicode(arrayobject *self, PyObject *args) { Py_UNICODE *ustr; Py_ssize_t n; + Py_UNICODE typecode; if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n)) return NULL; - if (self->ob_descr->typecode != 'u') { + typecode = self->ob_descr->typecode; + if (typecode != 'u') { PyErr_SetString(PyExc_ValueError, "fromunicode() may only be called on " - "type 'u' arrays"); + "unicode type arrays"); return NULL; } if (n > 0) { - Py_UNICODE *item = (Py_UNICODE *) self->ob_item; - if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) { - return PyErr_NoMemory(); - } - PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n); - if (item == NULL) { - PyErr_NoMemory(); + Py_ssize_t old_size = Py_SIZE(self); + if (array_resize(self, old_size + n) == -1) return NULL; - } - self->ob_item = (char *) item; - Py_SIZE(self) += n; - self->allocated = Py_SIZE(self); - memcpy(item + Py_SIZE(self) - n, + memcpy(self->ob_item + old_size * sizeof(Py_UNICODE), ustr, n * sizeof(Py_UNICODE)); } @@ -1473,17 +1483,19 @@ PyDoc_STRVAR(fromunicode_doc, "fromunicode(ustr)\n\ \n\ Extends this array with data from the unicode string ustr.\n\ -The array must be a type 'u' array; otherwise a ValueError\n\ -is raised. Use array.fromstring(ustr.decode(...)) to\n\ +The array must be a unicode type array; otherwise a ValueError\n\ +is raised. Use array.frombytes(ustr.encode(...)) to\n\ append Unicode data to an array of some other type."); static PyObject * array_tounicode(arrayobject *self, PyObject *unused) { - if (self->ob_descr->typecode != 'u') { + Py_UNICODE typecode; + typecode = self->ob_descr->typecode; + if (typecode != 'u') { PyErr_SetString(PyExc_ValueError, - "tounicode() may only be called on type 'u' arrays"); + "tounicode() may only be called on unicode type arrays"); return NULL; } return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self)); @@ -1493,16 +1505,471 @@ PyDoc_STRVAR(tounicode_doc, "tounicode() -> unicode\n\ \n\ Convert the array to a unicode string. The array must be\n\ -a type 'u' array; otherwise a ValueError is raised. Use\n\ -array.tostring().decode() to obtain a unicode string from\n\ +a unicode type array; otherwise a ValueError is raised. Use\n\ +array.tobytes().decode() to obtain a unicode string from\n\ an array of some other type."); -#endif /* Py_USING_UNICODE */ static PyObject * -array_reduce(arrayobject *array) +array_sizeof(arrayobject *self, PyObject *unused) +{ + Py_ssize_t res; + res = sizeof(arrayobject) + self->allocated * self->ob_descr->itemsize; + return PyLong_FromSsize_t(res); +} + +PyDoc_STRVAR(sizeof_doc, +"__sizeof__() -> int\n\ +\n\ +Size of the array in memory, in bytes."); + + +/*********************** Pickling support ************************/ + +enum machine_format_code { + UNKNOWN_FORMAT = -1, + /* UNKNOWN_FORMAT is used to indicate that the machine format for an + * array type code cannot be interpreted. When this occurs, a list of + * Python objects is used to represent the content of the array + * instead of using the memory content of the array directly. In that + * case, the array_reconstructor mechanism is bypassed completely, and + * the standard array constructor is used instead. + * + * This is will most likely occur when the machine doesn't use IEEE + * floating-point numbers. + */ + + UNSIGNED_INT8 = 0, + SIGNED_INT8 = 1, + UNSIGNED_INT16_LE = 2, + UNSIGNED_INT16_BE = 3, + SIGNED_INT16_LE = 4, + SIGNED_INT16_BE = 5, + UNSIGNED_INT32_LE = 6, + UNSIGNED_INT32_BE = 7, + SIGNED_INT32_LE = 8, + SIGNED_INT32_BE = 9, + UNSIGNED_INT64_LE = 10, + UNSIGNED_INT64_BE = 11, + SIGNED_INT64_LE = 12, + SIGNED_INT64_BE = 13, + IEEE_754_FLOAT_LE = 14, + IEEE_754_FLOAT_BE = 15, + IEEE_754_DOUBLE_LE = 16, + IEEE_754_DOUBLE_BE = 17, + UTF16_LE = 18, + UTF16_BE = 19, + UTF32_LE = 20, + UTF32_BE = 21 +}; +#define MACHINE_FORMAT_CODE_MIN 0 +#define MACHINE_FORMAT_CODE_MAX 21 + +static const struct mformatdescr { + size_t size; + int is_signed; + int is_big_endian; +} mformat_descriptors[] = { + {1, 0, 0}, /* 0: UNSIGNED_INT8 */ + {1, 1, 0}, /* 1: SIGNED_INT8 */ + {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */ + {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */ + {2, 1, 0}, /* 4: SIGNED_INT16_LE */ + {2, 1, 1}, /* 5: SIGNED_INT16_BE */ + {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */ + {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */ + {4, 1, 0}, /* 8: SIGNED_INT32_LE */ + {4, 1, 1}, /* 9: SIGNED_INT32_BE */ + {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */ + {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */ + {8, 1, 0}, /* 12: SIGNED_INT64_LE */ + {8, 1, 1}, /* 13: SIGNED_INT64_BE */ + {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */ + {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */ + {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */ + {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */ + {4, 0, 0}, /* 18: UTF16_LE */ + {4, 0, 1}, /* 19: UTF16_BE */ + {8, 0, 0}, /* 20: UTF32_LE */ + {8, 0, 1} /* 21: UTF32_BE */ +}; + + +/* + * Internal: This function is used to find the machine format of a given + * array type code. This returns UNKNOWN_FORMAT when the machine format cannot + * be found. + */ +static enum machine_format_code +typecode_to_mformat_code(int typecode) { - PyObject *dict, *result, *list; +#ifdef WORDS_BIGENDIAN + const int is_big_endian = 1; +#else + const int is_big_endian = 0; +#endif + size_t intsize; + int is_signed; + + switch (typecode) { + case 'b': + return SIGNED_INT8; + case 'B': + return UNSIGNED_INT8; + + case 'u': + if (sizeof(Py_UNICODE) == 2) { + return UTF16_LE + is_big_endian; + } + if (sizeof(Py_UNICODE) == 4) { + return UTF32_LE + is_big_endian; + } + return UNKNOWN_FORMAT; + + case 'f': + if (sizeof(float) == 4) { + const float y = 16711938.0; + if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0) + return IEEE_754_FLOAT_BE; + if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0) + return IEEE_754_FLOAT_LE; + } + return UNKNOWN_FORMAT; + + case 'd': + if (sizeof(double) == 8) { + const double x = 9006104071832581.0; + if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0) + return IEEE_754_DOUBLE_BE; + if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0) + return IEEE_754_DOUBLE_LE; + } + return UNKNOWN_FORMAT; + + /* Integers */ + case 'h': + intsize = sizeof(short); + is_signed = 1; + break; + case 'H': + intsize = sizeof(short); + is_signed = 0; + break; + case 'i': + intsize = sizeof(int); + is_signed = 1; + break; + case 'I': + intsize = sizeof(int); + is_signed = 0; + break; + case 'l': + intsize = sizeof(long); + is_signed = 1; + break; + case 'L': + intsize = sizeof(long); + is_signed = 0; + break; + default: + return UNKNOWN_FORMAT; + } + switch (intsize) { + case 2: + return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed); + case 4: + return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed); + case 8: + return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed); + default: + return UNKNOWN_FORMAT; + } +} + +/* Forward declaration. */ +static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds); + +/* + * Internal: This function wraps the array constructor--i.e., array_new()--to + * allow the creation of array objects from C code without having to deal + * directly the tuple argument of array_new(). The typecode argument is a + * Unicode character value, like 'i' or 'f' for example, representing an array + * type code. The items argument is a bytes or a list object from which + * contains the initial value of the array. + * + * On success, this functions returns the array object created. Otherwise, + * NULL is returned to indicate a failure. + */ +static PyObject * +make_array(PyTypeObject *arraytype, Py_UNICODE typecode, PyObject *items) +{ + PyObject *new_args; + PyObject *array_obj; + PyObject *typecode_obj; + + assert(arraytype != NULL); + assert(items != NULL); + + typecode_obj = PyUnicode_FromUnicode(&typecode, 1); + if (typecode_obj == NULL) + return NULL; + + new_args = PyTuple_New(2); + if (new_args == NULL) + return NULL; + Py_INCREF(items); + PyTuple_SET_ITEM(new_args, 0, typecode_obj); + PyTuple_SET_ITEM(new_args, 1, items); + + array_obj = array_new(arraytype, new_args, NULL); + Py_DECREF(new_args); + if (array_obj == NULL) + return NULL; + + return array_obj; +} + +/* + * This functions is a special constructor used when unpickling an array. It + * provides a portable way to rebuild an array from its memory representation. + */ +static PyObject * +array_reconstructor(PyObject *self, PyObject *args) +{ + PyTypeObject *arraytype; + PyObject *items; + PyObject *converted_items; + PyObject *result; + int typecode_int; + Py_UNICODE typecode; + enum machine_format_code mformat_code; + struct arraydescr *descr; + + if (!PyArg_ParseTuple(args, "OCiO:array._array_reconstructor", + &arraytype, &typecode_int, &mformat_code, &items)) + return NULL; + + typecode = (Py_UNICODE)typecode_int; + + if (!PyType_Check(arraytype)) { + PyErr_Format(PyExc_TypeError, + "first argument must a type object, not %.200s", + Py_TYPE(arraytype)->tp_name); + return NULL; + } + if (!PyType_IsSubtype(arraytype, &Arraytype)) { + PyErr_Format(PyExc_TypeError, + "%.200s is not a subtype of %.200s", + arraytype->tp_name, Arraytype.tp_name); + return NULL; + } + for (descr = descriptors; descr->typecode != '\0'; descr++) { + if (descr->typecode == typecode) + break; + } + if (descr->typecode == '\0') { + PyErr_SetString(PyExc_ValueError, + "second argument must be a valid type code"); + return NULL; + } + if (mformat_code < MACHINE_FORMAT_CODE_MIN || + mformat_code > MACHINE_FORMAT_CODE_MAX) { + PyErr_SetString(PyExc_ValueError, + "third argument must be a valid machine format code."); + return NULL; + } + if (!PyBytes_Check(items)) { + PyErr_Format(PyExc_TypeError, + "fourth argument should be bytes, not %.200s", + Py_TYPE(items)->tp_name); + return NULL; + } + + /* Fast path: No decoding has to be done. */ + if (mformat_code == typecode_to_mformat_code(typecode) || + mformat_code == UNKNOWN_FORMAT) { + return make_array(arraytype, typecode, items); + } + + /* Slow path: Decode the byte string according to the given machine + * format code. This occurs when the computer unpickling the array + * object is architecturally different from the one that pickled the + * array. + */ + if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) { + PyErr_SetString(PyExc_ValueError, + "string length not a multiple of item size"); + return NULL; + } + switch (mformat_code) { + case IEEE_754_FLOAT_LE: + case IEEE_754_FLOAT_BE: { + int i; + int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0; + Py_ssize_t itemcount = Py_SIZE(items) / 4; + const unsigned char *memstr = + (unsigned char *)PyBytes_AS_STRING(items); + + converted_items = PyList_New(itemcount); + if (converted_items == NULL) + return NULL; + for (i = 0; i < itemcount; i++) { + PyObject *pyfloat = PyFloat_FromDouble( + _PyFloat_Unpack4(&memstr[i * 4], le)); + if (pyfloat == NULL) { + Py_DECREF(converted_items); + return NULL; + } + PyList_SET_ITEM(converted_items, i, pyfloat); + } + break; + } + case IEEE_754_DOUBLE_LE: + case IEEE_754_DOUBLE_BE: { + int i; + int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0; + Py_ssize_t itemcount = Py_SIZE(items) / 8; + const unsigned char *memstr = + (unsigned char *)PyBytes_AS_STRING(items); + + converted_items = PyList_New(itemcount); + if (converted_items == NULL) + return NULL; + for (i = 0; i < itemcount; i++) { + PyObject *pyfloat = PyFloat_FromDouble( + _PyFloat_Unpack8(&memstr[i * 8], le)); + if (pyfloat == NULL) { + Py_DECREF(converted_items); + return NULL; + } + PyList_SET_ITEM(converted_items, i, pyfloat); + } + break; + } + case UTF16_LE: + case UTF16_BE: { + int byteorder = (mformat_code == UTF16_LE) ? -1 : 1; + converted_items = PyUnicode_DecodeUTF16( + PyBytes_AS_STRING(items), Py_SIZE(items), + "strict", &byteorder); + if (converted_items == NULL) + return NULL; + break; + } + case UTF32_LE: + case UTF32_BE: { + int byteorder = (mformat_code == UTF32_LE) ? -1 : 1; + converted_items = PyUnicode_DecodeUTF32( + PyBytes_AS_STRING(items), Py_SIZE(items), + "strict", &byteorder); + if (converted_items == NULL) + return NULL; + break; + } + + case UNSIGNED_INT8: + case SIGNED_INT8: + case UNSIGNED_INT16_LE: + case UNSIGNED_INT16_BE: + case SIGNED_INT16_LE: + case SIGNED_INT16_BE: + case UNSIGNED_INT32_LE: + case UNSIGNED_INT32_BE: + case SIGNED_INT32_LE: + case SIGNED_INT32_BE: + case UNSIGNED_INT64_LE: + case UNSIGNED_INT64_BE: + case SIGNED_INT64_LE: + case SIGNED_INT64_BE: { + int i; + const struct mformatdescr mf_descr = + mformat_descriptors[mformat_code]; + Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size; + const unsigned char *memstr = + (unsigned char *)PyBytes_AS_STRING(items); + struct arraydescr *descr; + + /* If possible, try to pack array's items using a data type + * that fits better. This may result in an array with narrower + * or wider elements. + * + * For example, if a 32-bit machine pickles a L-code array of + * unsigned longs, then the array will be unpickled by 64-bit + * machine as an I-code array of unsigned ints. + * + * XXX: Is it possible to write a unit test for this? + */ + for (descr = descriptors; descr->typecode != '\0'; descr++) { + if (descr->is_integer_type && + descr->itemsize == mf_descr.size && + descr->is_signed == mf_descr.is_signed) + typecode = descr->typecode; + } + + converted_items = PyList_New(itemcount); + if (converted_items == NULL) + return NULL; + for (i = 0; i < itemcount; i++) { + PyObject *pylong; + + pylong = _PyLong_FromByteArray( + &memstr[i * mf_descr.size], + mf_descr.size, + !mf_descr.is_big_endian, + mf_descr.is_signed); + if (pylong == NULL) { + Py_DECREF(converted_items); + return NULL; + } + PyList_SET_ITEM(converted_items, i, pylong); + } + break; + } + case UNKNOWN_FORMAT: + /* Impossible, but needed to shut up GCC about the unhandled + * enumeration value. + */ + default: + PyErr_BadArgument(); + return NULL; + } + + result = make_array(arraytype, typecode, converted_items); + Py_DECREF(converted_items); + return result; +} + +static PyObject * +array_reduce_ex(arrayobject *array, PyObject *value) +{ + PyObject *dict; + PyObject *result; + PyObject *array_str; + int typecode = array->ob_descr->typecode; + int mformat_code; + static PyObject *array_reconstructor = NULL; + long protocol; + + if (array_reconstructor == NULL) { + PyObject *array_module = PyImport_ImportModule("array"); + if (array_module == NULL) + return NULL; + array_reconstructor = PyObject_GetAttrString( + array_module, + "_array_reconstructor"); + Py_DECREF(array_module); + if (array_reconstructor == NULL) + return NULL; + } + + if (!PyLong_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "__reduce_ex__ argument should an integer"); + return NULL; + } + protocol = PyLong_AsLong(value); + if (protocol == -1 && PyErr_Occurred()) + return NULL; dict = PyObject_GetAttrString((PyObject *)array, "__dict__"); if (dict == NULL) { @@ -1512,20 +1979,41 @@ array_reduce(arrayobject *array) dict = Py_None; Py_INCREF(dict); } - /* Unlike in Python 3.x, we never use the more efficient memory - * representation of an array for pickling. This is unfortunately - * necessary to allow array objects to be unpickled by Python 3.x, - * since str objects from 2.x are always decoded to unicode in - * Python 3.x. - */ - list = array_tolist(array, NULL); - if (list == NULL) { + + mformat_code = typecode_to_mformat_code(typecode); + if (mformat_code == UNKNOWN_FORMAT || protocol < 3) { + /* Convert the array to a list if we got something weird + * (e.g., non-IEEE floats), or we are pickling the array using + * a Python 2.x compatible protocol. + * + * It is necessary to use a list representation for Python 2.x + * compatible pickle protocol, since Python 2's str objects + * are unpickled as unicode by Python 3. Thus it is impossible + * to make arrays unpicklable by Python 3 by using their memory + * representation, unless we resort to ugly hacks such as + * coercing unicode objects to bytes in array_reconstructor. + */ + PyObject *list; + list = array_tolist(array, NULL); + if (list == NULL) { + Py_DECREF(dict); + return NULL; + } + result = Py_BuildValue( + "O(CO)O", Py_TYPE(array), typecode, list, dict); + Py_DECREF(list); + Py_DECREF(dict); + return result; + } + + array_str = array_tobytes(array, NULL); + if (array_str == NULL) { Py_DECREF(dict); return NULL; } result = Py_BuildValue( - "O(cO)O", Py_TYPE(array), array->ob_descr->typecode, list, dict); - Py_DECREF(list); + "O(OCiN)O", array_reconstructor, Py_TYPE(array), typecode, + mformat_code, array_str, dict); Py_DECREF(dict); return result; } @@ -1533,29 +2021,16 @@ array_reduce(arrayobject *array) PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); static PyObject * -array_sizeof(arrayobject *self, PyObject *unused) -{ - Py_ssize_t res; - res = sizeof(arrayobject) + self->allocated * self->ob_descr->itemsize; - return PyLong_FromSsize_t(res); -} - -PyDoc_STRVAR(sizeof_doc, -"__sizeof__() -> int\n\ -\n\ -Size of the array in memory, in bytes."); - -static PyObject * array_get_typecode(arrayobject *a, void *closure) { - char tc = a->ob_descr->typecode; - return PyString_FromStringAndSize(&tc, 1); + Py_UNICODE tc = a->ob_descr->typecode; + return PyUnicode_FromUnicode(&tc, 1); } static PyObject * array_get_itemsize(arrayobject *a, void *closure) { - return PyInt_FromLong((long)a->ob_descr->itemsize); + return PyLong_FromLong((long)a->ob_descr->itemsize); } static PyGetSetDef array_getsets [] = { @@ -1587,19 +2062,17 @@ static PyMethodDef array_methods[] = { fromlist_doc}, {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS, fromstring_doc}, -#ifdef Py_USING_UNICODE + {"frombytes", (PyCFunction)array_frombytes, METH_VARARGS, + frombytes_doc}, {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS, fromunicode_doc}, -#endif {"index", (PyCFunction)array_index, METH_O, index_doc}, {"insert", (PyCFunction)array_insert, METH_VARARGS, insert_doc}, {"pop", (PyCFunction)array_pop, METH_VARARGS, pop_doc}, - {"read", (PyCFunction)array_fromfile_as_read, METH_VARARGS, - fromfile_doc}, - {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS, + {"__reduce_ex__", (PyCFunction)array_reduce_ex, METH_O, reduce_doc}, {"remove", (PyCFunction)array_remove, METH_O, remove_doc}, @@ -1613,12 +2086,10 @@ static PyMethodDef array_methods[] = { tolist_doc}, {"tostring", (PyCFunction)array_tostring, METH_NOARGS, tostring_doc}, -#ifdef Py_USING_UNICODE + {"tobytes", (PyCFunction)array_tobytes, METH_NOARGS, + tobytes_doc}, {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS, tounicode_doc}, -#endif - {"write", (PyCFunction)array_tofile_as_write, METH_O, - tofile_doc}, {"__sizeof__", (PyCFunction)array_sizeof, METH_NOARGS, sizeof_doc}, {NULL, NULL} /* sentinel */ @@ -1627,32 +2098,23 @@ static PyMethodDef array_methods[] = { static PyObject * array_repr(arrayobject *a) { - char buf[256], typecode; - PyObject *s, *t, *v = NULL; + Py_UNICODE typecode; + PyObject *s, *v = NULL; Py_ssize_t len; len = Py_SIZE(a); typecode = a->ob_descr->typecode; if (len == 0) { - PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode); - return PyString_FromString(buf); + return PyUnicode_FromFormat("array('%c')", (int)typecode); } - - if (typecode == 'c') - v = array_tostring(a, NULL); -#ifdef Py_USING_UNICODE - else if (typecode == 'u') + if (typecode == 'u') { v = array_tounicode(a, NULL); -#endif - else + } else { v = array_tolist(a, NULL); - t = PyObject_Repr(v); - Py_XDECREF(v); + } - PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode); - s = PyString_FromString(buf); - PyString_ConcatAndDel(&s, t); - PyString_ConcatAndDel(&s, PyString_FromString(")")); + s = PyUnicode_FromFormat("array('%c', %R)", (int)typecode, v); + Py_DECREF(v); return s; } @@ -1674,7 +2136,7 @@ array_subscr(arrayobject* self, PyObject* item) arrayobject* ar; int itemsize = self->ob_descr->itemsize; - if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self), + if (PySlice_GetIndicesEx(item, Py_SIZE(self), &start, &stop, &step, &slicelength) < 0) { return NULL; } @@ -1745,7 +2207,7 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value) return (*self->ob_descr->setitem)(self, i, value); } else if (PySlice_Check(item)) { - if (PySlice_GetIndicesEx((PySliceObject *)item, + if (PySlice_GetIndicesEx(item, Py_SIZE(self), &start, &stop, &step, &slicelength) < 0) { return -1; @@ -1789,18 +2251,28 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value) if ((step > 0 && stop < start) || (step < 0 && stop > start)) stop = start; + + /* Issue #4509: If the array has exported buffers and the slice + assignment would change the size of the array, fail early to make + sure we don't modify it. */ + if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) { + PyErr_SetString(PyExc_BufferError, + "cannot resize an array that is exporting buffers"); + return -1; + } + if (step == 1) { if (slicelength > needed) { memmove(self->ob_item + (start + needed) * itemsize, self->ob_item + stop * itemsize, (Py_SIZE(self) - stop) * itemsize); if (array_resize(self, Py_SIZE(self) + - needed - slicelength) < 0) + needed - slicelength) < 0) return -1; } else if (slicelength < needed) { if (array_resize(self, Py_SIZE(self) + - needed - slicelength) < 0) + needed - slicelength) < 0) return -1; memmove(self->ob_item + (start + needed) * itemsize, self->ob_item + stop * itemsize, @@ -1869,40 +2341,49 @@ static PyMappingMethods array_as_mapping = { static const void *emptybuf = ""; -static Py_ssize_t -array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr) -{ - if ( index != 0 ) { - PyErr_SetString(PyExc_SystemError, - "Accessing non-existent array segment"); - return -1; - } - *ptr = (void *)self->ob_item; - if (*ptr == NULL) - *ptr = emptybuf; - return Py_SIZE(self)*self->ob_descr->itemsize; -} -static Py_ssize_t -array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr) +static int +array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags) { - if ( index != 0 ) { - PyErr_SetString(PyExc_SystemError, - "Accessing non-existent array segment"); - return -1; + if (view==NULL) goto finish; + + view->buf = (void *)self->ob_item; + view->obj = (PyObject*)self; + Py_INCREF(self); + if (view->buf == NULL) + view->buf = (void *)emptybuf; + view->len = (Py_SIZE(self)) * self->ob_descr->itemsize; + view->readonly = 0; + view->ndim = 1; + view->itemsize = self->ob_descr->itemsize; + view->suboffsets = NULL; + view->shape = NULL; + if ((flags & PyBUF_ND)==PyBUF_ND) { + view->shape = &((Py_SIZE(self))); + } + view->strides = NULL; + if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES) + view->strides = &(view->itemsize); + view->format = NULL; + view->internal = NULL; + if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) { + view->format = self->ob_descr->formats; +#ifdef Py_UNICODE_WIDE + if (self->ob_descr->typecode == 'u') { + view->format = "w"; + } +#endif } - *ptr = (void *)self->ob_item; - if (*ptr == NULL) - *ptr = emptybuf; - return Py_SIZE(self)*self->ob_descr->itemsize; + + finish: + self->ob_exports++; + return 0; } -static Py_ssize_t -array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp) +static void +array_buffer_relbuf(arrayobject *self, Py_buffer *view) { - if ( lenp ) - *lenp = Py_SIZE(self)*self->ob_descr->itemsize; - return 1; + self->ob_exports--; } static PySequenceMethods array_as_sequence = { @@ -1910,37 +2391,39 @@ static PySequenceMethods array_as_sequence = { (binaryfunc)array_concat, /*sq_concat*/ (ssizeargfunc)array_repeat, /*sq_repeat*/ (ssizeargfunc)array_item, /*sq_item*/ - (ssizessizeargfunc)array_slice, /*sq_slice*/ + 0, /*sq_slice*/ (ssizeobjargproc)array_ass_item, /*sq_ass_item*/ - (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/ + 0, /*sq_ass_slice*/ (objobjproc)array_contains, /*sq_contains*/ (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/ (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/ }; static PyBufferProcs array_as_buffer = { - (readbufferproc)array_buffer_getreadbuf, - (writebufferproc)array_buffer_getwritebuf, - (segcountproc)array_buffer_getsegcount, - NULL, + (getbufferproc)array_buffer_getbuf, + (releasebufferproc)array_buffer_relbuf }; static PyObject * array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - char c; + int c; PyObject *initial = NULL, *it = NULL; struct arraydescr *descr; if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds)) return NULL; - if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial)) + if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial)) return NULL; if (!(initial == NULL || PyList_Check(initial) - || PyString_Check(initial) || PyTuple_Check(initial) - || (c == 'u' && PyUnicode_Check(initial)))) { + || PyByteArray_Check(initial) + || PyBytes_Check(initial) + || PyTuple_Check(initial) + || ((c=='u') && PyUnicode_Check(initial)) + || (array_Check(initial) + && c == ((arrayobject*)initial)->ob_descr->typecode))) { it = PyObject_GetIter(initial); if (it == NULL) return NULL; @@ -1956,17 +2439,20 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *a; Py_ssize_t len; - if (initial == NULL || !(PyList_Check(initial) - || PyTuple_Check(initial))) + if (initial == NULL) len = 0; + else if (PyList_Check(initial)) + len = PyList_GET_SIZE(initial); + else if (PyTuple_Check(initial) || array_Check(initial)) + len = Py_SIZE(initial); else - len = PySequence_Size(initial); + len = 0; a = newarrayobject(type, len, descr); if (a == NULL) return NULL; - if (len > 0) { + if (len > 0 && !array_Check(initial)) { Py_ssize_t i; for (i = 0; i < len; i++) { PyObject *v = @@ -1982,14 +2468,16 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } Py_DECREF(v); } - } else if (initial != NULL && PyString_Check(initial)) { + } + else if (initial != NULL && (PyByteArray_Check(initial) || + PyBytes_Check(initial))) { PyObject *t_initial, *v; t_initial = PyTuple_Pack(1, initial); if (t_initial == NULL) { Py_DECREF(a); return NULL; } - v = array_fromstring((arrayobject *)a, + v = array_frombytes((arrayobject *)a, t_initial); Py_DECREF(t_initial); if (v == NULL) { @@ -1997,8 +2485,8 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } Py_DECREF(v); -#ifdef Py_USING_UNICODE - } else if (initial != NULL && PyUnicode_Check(initial)) { + } + else if (initial != NULL && PyUnicode_Check(initial)) { Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial); if (n > 0) { arrayobject *self = (arrayobject *)a; @@ -2014,7 +2502,11 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) memcpy(item, PyUnicode_AS_DATA(initial), n); self->allocated = Py_SIZE(self); } -#endif + } + else if (initial != NULL && array_Check(initial)) { + arrayobject *self = (arrayobject *)a; + arrayobject *other = (arrayobject *)initial; + memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize); } if (it != NULL) { if (array_iter_extend((arrayobject *)a, it) == -1) { @@ -2028,7 +2520,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } } PyErr_SetString(PyExc_ValueError, - "bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)"); + "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)"); return NULL; } @@ -2042,10 +2534,9 @@ type is specified at object creation time by using a type code, which\n\ is a single character. The following type codes are defined:\n\ \n\ Type code C Type Minimum size in bytes \n\ - 'c' character 1 \n\ 'b' signed integer 1 \n\ 'B' unsigned integer 1 \n\ - 'u' Unicode character 2 \n\ + 'u' Unicode character 2 (see note) \n\ 'h' signed integer 2 \n\ 'H' unsigned integer 2 \n\ 'i' signed integer 2 \n\ @@ -2055,6 +2546,9 @@ is a single character. The following type codes are defined:\n\ 'f' floating point 4 \n\ 'd' floating point 8 \n\ \n\ +NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\ +narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\ +\n\ The constructor is:\n\ \n\ array(typecode [, initializer]) -- create a new array\n\ @@ -2079,17 +2573,15 @@ count() -- return number of occurrences of an object\n\ extend() -- extend array by appending multiple elements from an iterable\n\ fromfile() -- read items from a file object\n\ fromlist() -- append items from the list\n\ -fromstring() -- append items from the string\n\ +frombytes() -- append items from the string\n\ index() -- return index of first occurrence of an object\n\ insert() -- insert a new item into the array at a provided position\n\ pop() -- remove and return item (default last)\n\ -read() -- DEPRECATED, use fromfile()\n\ remove() -- remove first occurrence of an object\n\ reverse() -- reverse the order of the items in the array\n\ tofile() -- write all items to a file object\n\ tolist() -- return the array converted to an ordinary list\n\ -tostring() -- return the array converted to a string\n\ -write() -- DEPRECATED, use tofile()\n\ +tobytes() -- return the array converted to a string\n\ \n\ Attributes:\n\ \n\ @@ -2108,7 +2600,7 @@ static PyTypeObject Arraytype = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)array_repr, /* tp_repr */ 0, /* tp_as_number*/ &array_as_sequence, /* tp_as_sequence*/ @@ -2119,7 +2611,7 @@ static PyTypeObject Arraytype = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ &array_as_buffer, /* tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ arraytype_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ @@ -2211,7 +2703,7 @@ static PyTypeObject PyArrayIter_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2238,24 +2730,60 @@ static PyTypeObject PyArrayIter_Type = { /* No functions in array module. */ static PyMethodDef a_methods[] = { + {"_array_reconstructor", array_reconstructor, METH_VARARGS, + PyDoc_STR("Internal. Used for pickling support.")}, {NULL, NULL, 0, NULL} /* Sentinel */ }; +static struct PyModuleDef arraymodule = { + PyModuleDef_HEAD_INIT, + "array", + module_doc, + -1, + a_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initarray(void) +PyInit_array(void) { PyObject *m; + PyObject *typecodes; + Py_ssize_t size = 0; + register Py_UNICODE *p; + struct arraydescr *descr; - Arraytype.ob_type = &PyType_Type; - PyArrayIter_Type.ob_type = &PyType_Type; - m = Py_InitModule3("array", a_methods, module_doc); + if (PyType_Ready(&Arraytype) < 0) + return NULL; + Py_TYPE(&PyArrayIter_Type) = &PyType_Type; + m = PyModule_Create(&arraymodule); if (m == NULL) - return; + return NULL; Py_INCREF((PyObject *)&Arraytype); PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype); Py_INCREF((PyObject *)&Arraytype); PyModule_AddObject(m, "array", (PyObject *)&Arraytype); - /* No need to check the error here, the caller will do that */ + + for (descr=descriptors; descr->typecode != '\0'; descr++) { + size++; + } + + typecodes = PyUnicode_FromStringAndSize(NULL, size); + p = PyUnicode_AS_UNICODE(typecodes); + for (descr = descriptors; descr->typecode != '\0'; descr++) { + *p++ = (char)descr->typecode; + } + + PyModule_AddObject(m, "typecodes", (PyObject *)typecodes); + + if (PyErr_Occurred()) { + Py_DECREF(m); + m = NULL; + } + return m; } diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c new file mode 100644 index 00000000000..1ee7ead05f7 --- /dev/null +++ b/Modules/atexitmodule.c @@ -0,0 +1,301 @@ +/* + * atexit - allow programmer to define multiple exit functions to be executed + * upon normal program termination. + * + * Translated from atexit.py by Collin Winter. + + Copyright 2007 Python Software Foundation. + */ + +#include "Python.h" + +/* 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; + +/* ===================================================================== */ +/* Callback machinery. */ + +typedef struct { + PyObject *func; + PyObject *args; + PyObject *kwargs; +} atexit_callback; + +typedef struct { + atexit_callback **atexit_callbacks; + int ncallbacks; + int callback_len; +} atexitmodule_state; + +#define GET_ATEXIT_STATE(mod) ((atexitmodule_state*)PyModule_GetState(mod)) + + +/* Installed into pythonrun.c's atexit mechanism */ + +static void +atexit_callfuncs(void) +{ + PyObject *exc_type = NULL, *exc_value, *exc_tb, *r; + atexit_callback *cb; + PyObject *module; + atexitmodule_state *modstate; + int i; + + module = PyState_FindModule(&atexitmodule); + if (module == NULL) + return; + modstate = GET_ATEXIT_STATE(module); + + if (modstate->ncallbacks == 0) + return; + + + for (i = modstate->ncallbacks - 1; i >= 0; i--) + { + cb = modstate->atexit_callbacks[i]; + if (cb == NULL) + continue; + + r = PyObject_Call(cb->func, cb->args, cb->kwargs); + Py_XDECREF(r); + if (r == NULL) { + /* Maintain the last exception, but don't leak if there are + multiple exceptions. */ + if (exc_type) { + Py_DECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); + } + PyErr_Fetch(&exc_type, &exc_value, &exc_tb); + if (!PyErr_ExceptionMatches(PyExc_SystemExit)) { + PySys_WriteStderr("Error in atexit._run_exitfuncs:\n"); + PyErr_NormalizeException(&exc_type, &exc_value, &exc_tb); + PyErr_Display(exc_type, exc_value, exc_tb); + } + } + } + + atexit_cleanup(module); + + 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. */ + +PyDoc_STRVAR(atexit_register__doc__, +"register(func, *args, **kwargs) -> func\n\ +\n\ +Register a function to be executed upon normal program termination\n\ +\n\ + func - function to be called at exit\n\ + args - optional arguments to pass to func\n\ + kwargs - optional keyword arguments to pass to func\n\ +\n\ + func is returned to facilitate usage as a decorator."); + +static PyObject * +atexit_register(PyObject *self, PyObject *args, PyObject *kwargs) +{ + atexitmodule_state *modstate; + atexit_callback *new_callback; + PyObject *func = NULL; + + modstate = GET_ATEXIT_STATE(self); + + if (modstate->ncallbacks >= modstate->callback_len) { + atexit_callback **r; + modstate->callback_len += 16; + r = (atexit_callback**)PyMem_Realloc(modstate->atexit_callbacks, + sizeof(atexit_callback*) * modstate->callback_len); + if (r == NULL) + return PyErr_NoMemory(); + modstate->atexit_callbacks = r; + } + + if (PyTuple_GET_SIZE(args) == 0) { + PyErr_SetString(PyExc_TypeError, + "register() takes at least 1 argument (0 given)"); + return NULL; + } + + func = PyTuple_GET_ITEM(args, 0); + if (!PyCallable_Check(func)) { + PyErr_SetString(PyExc_TypeError, + "the first argument must be callable"); + return NULL; + } + + new_callback = PyMem_Malloc(sizeof(atexit_callback)); + if (new_callback == NULL) + return PyErr_NoMemory(); + + new_callback->args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args)); + if (new_callback->args == NULL) { + PyMem_Free(new_callback); + return NULL; + } + new_callback->func = func; + new_callback->kwargs = kwargs; + Py_INCREF(func); + Py_XINCREF(kwargs); + + modstate->atexit_callbacks[modstate->ncallbacks++] = new_callback; + + Py_INCREF(func); + return func; +} + +PyDoc_STRVAR(atexit_run_exitfuncs__doc__, +"_run_exitfuncs() -> None\n\ +\n\ +Run all registered exit functions."); + +static PyObject * +atexit_run_exitfuncs(PyObject *self, PyObject *unused) +{ + atexit_callfuncs(); + if (PyErr_Occurred()) + return NULL; + Py_RETURN_NONE; +} + +PyDoc_STRVAR(atexit_clear__doc__, +"_clear() -> None\n\ +\n\ +Clear the list of previously registered exit functions."); + +static PyObject * +atexit_clear(PyObject *self, PyObject *unused) +{ + atexitmodule_state *modstate; + atexit_callback *cb; + int i; + + modstate = GET_ATEXIT_STATE(self); + + for (i = 0; i < modstate->ncallbacks; i++) { + cb = modstate->atexit_callbacks[i]; + if (cb == NULL) + continue; + + atexit_delete_cb(self, i); + } + modstate->ncallbacks = 0; + Py_RETURN_NONE; +} + +PyDoc_STRVAR(atexit_unregister__doc__, +"unregister(func) -> None\n\ +\n\ +Unregister a exit function which was previously registered using\n\ +atexit.register\n\ +\n\ + func - function to be unregistered"); + +static PyObject * +atexit_unregister(PyObject *self, PyObject *func) +{ + atexitmodule_state *modstate; + atexit_callback *cb; + int i, eq; + + modstate = GET_ATEXIT_STATE(self); + + for (i = 0; i < modstate->ncallbacks; i++) + { + cb = modstate->atexit_callbacks[i]; + if (cb == NULL) + continue; + + eq = PyObject_RichCompareBool(cb->func, func, Py_EQ); + if (eq < 0) + return NULL; + if (eq) + atexit_delete_cb(self, i); + } + Py_RETURN_NONE; +} + +static PyMethodDef atexit_methods[] = { + {"register", (PyCFunction) atexit_register, METH_VARARGS|METH_KEYWORDS, + atexit_register__doc__}, + {"_clear", (PyCFunction) atexit_clear, METH_NOARGS, + atexit_clear__doc__}, + {"unregister", (PyCFunction) atexit_unregister, METH_O, + atexit_unregister__doc__}, + {"_run_exitfuncs", (PyCFunction) atexit_run_exitfuncs, METH_NOARGS, + atexit_run_exitfuncs__doc__}, + {NULL, NULL} /* sentinel */ +}; + +/* ===================================================================== */ +/* Initialization function. */ + +PyDoc_STRVAR(atexit__doc__, +"allow programmer to define multiple exit functions to be executed\ +upon normal program termination.\n\ +\n\ +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, + NULL +}; + +PyMODINIT_FUNC +PyInit_atexit(void) +{ + PyObject *m; + atexitmodule_state *modstate; + + m = PyModule_Create(&atexitmodule); + if (m == NULL) + return NULL; + + modstate = GET_ATEXIT_STATE(m); + modstate->callback_len = 32; + modstate->ncallbacks = 0; + modstate->atexit_callbacks = PyMem_New(atexit_callback*, + modstate->callback_len); + if (modstate->atexit_callbacks == NULL) + return NULL; + + _Py_PyAtExit(atexit_callfuncs); + return m; +} diff --git a/Modules/audioop.c b/Modules/audioop.c index fc79cf52b2d..9ab4834e29c 100644 --- a/Modules/audioop.c +++ b/Modules/audioop.c @@ -1,6 +1,8 @@ /* audioopmodule - Module to detect peak values in arrays */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" #if SIZEOF_INT == 4 @@ -307,7 +309,7 @@ audioop_check_size(int size) } static int -audioop_check_parameters(int len, int size) +audioop_check_parameters(Py_ssize_t len, int size) { if (!audioop_check_size(size)) return 0; @@ -322,10 +324,10 @@ static PyObject * audioop_getsample(PyObject *self, PyObject *args) { signed char *cp; - int len, size, val = 0; - int i; + Py_ssize_t len, i; + int size, val = 0; - if ( !PyArg_ParseTuple(args, "s#ii:getsample", &cp, &len, &size, &i) ) + if ( !PyArg_ParseTuple(args, "s#in:getsample", &cp, &len, &size, &i) ) return 0; if (!audioop_check_parameters(len, size)) return NULL; @@ -336,15 +338,15 @@ audioop_getsample(PyObject *self, PyObject *args) if ( size == 1 ) val = (int)*CHARP(cp, i); else if ( size == 2 ) val = (int)*SHORTP(cp, i*2); else if ( size == 4 ) val = (int)*LONGP(cp, i*4); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * audioop_max(PyObject *self, PyObject *args) { signed char *cp; - int len, size, val = 0; - int i; + Py_ssize_t len, i; + int size, val = 0; int max = 0; if ( !PyArg_ParseTuple(args, "s#i:max", &cp, &len, &size) ) @@ -358,15 +360,15 @@ audioop_max(PyObject *self, PyObject *args) if ( val < 0 ) val = (-val); if ( val > max ) max = val; } - return PyInt_FromLong(max); + return PyLong_FromLong(max); } static PyObject * audioop_minmax(PyObject *self, PyObject *args) { signed char *cp; - int len, size, val = 0; - int i; + Py_ssize_t len, i; + int size, val = 0; int min = 0x7fffffff, max = -0x7fffffff; if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len, &size)) @@ -387,8 +389,8 @@ static PyObject * audioop_avg(PyObject *self, PyObject *args) { signed char *cp; - int len, size, val = 0; - int i; + Py_ssize_t len, i; + int size, val = 0; double avg = 0.0; if ( !PyArg_ParseTuple(args, "s#i:avg", &cp, &len, &size) ) @@ -405,15 +407,15 @@ audioop_avg(PyObject *self, PyObject *args) val = 0; else val = (int)(avg / (double)(len/size)); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * audioop_rms(PyObject *self, PyObject *args) { signed char *cp; - int len, size, val = 0; - int i; + Py_ssize_t len, i; + int size, val = 0; double sum_squares = 0.0; if ( !PyArg_ParseTuple(args, "s#i:rms", &cp, &len, &size) ) @@ -430,12 +432,12 @@ audioop_rms(PyObject *self, PyObject *args) val = 0; else val = (int)sqrt(sum_squares / (double)(len/size)); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } -static double _sum2(short *a, short *b, int len) +static double _sum2(short *a, short *b, Py_ssize_t len) { - int i; + Py_ssize_t i; double sum = 0.0; for( i=0; i<len; i++) { @@ -480,14 +482,14 @@ static PyObject * audioop_findfit(PyObject *self, PyObject *args) { short *cp1, *cp2; - int len1, len2; - int j, best_j; + Py_ssize_t len1, len2; + Py_ssize_t j, best_j; double aj_m1, aj_lm1; double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor; /* Passing a short** for an 's' argument is correct only if the string contents is aligned for interpretation - as short[]. Due to the definition of PyStringObject, + as short[]. Due to the definition of PyBytesObject, this is currently (Python 2.6) the case. */ if ( !PyArg_ParseTuple(args, "s#s#:findfit", (char**)&cp1, &len1, (char**)&cp2, &len2) ) @@ -511,8 +513,9 @@ audioop_findfit(PyObject *self, PyObject *args) best_result = result; best_j = 0; + j = 0; - for (j=1; j<=len1-len2; j++) { + for ( j=1; j<=len1-len2; j++) { aj_m1 = (double)cp1[j-1]; aj_lm1 = (double)cp1[j+len2-1]; @@ -531,7 +534,7 @@ audioop_findfit(PyObject *self, PyObject *args) factor = _sum2(cp1+best_j, cp2, len2) / sum_ri_2; - return Py_BuildValue("(if)", best_j, factor); + return Py_BuildValue("(nf)", best_j, factor); } /* @@ -542,7 +545,7 @@ static PyObject * audioop_findfactor(PyObject *self, PyObject *args) { short *cp1, *cp2; - int len1, len2; + Py_ssize_t len1, len2; double sum_ri_2, sum_aij_ri, result; if ( !PyArg_ParseTuple(args, "s#s#:findfactor", @@ -573,12 +576,12 @@ static PyObject * audioop_findmax(PyObject *self, PyObject *args) { short *cp1; - int len1, len2; - int j, best_j; + Py_ssize_t len1, len2; + Py_ssize_t j, best_j; double aj_m1, aj_lm1; double result, best_result; - if ( !PyArg_ParseTuple(args, "s#i:findmax", + if ( !PyArg_ParseTuple(args, "s#n:findmax", (char**)&cp1, &len1, &len2) ) return 0; if ( len1 & 1 ) { @@ -596,8 +599,9 @@ audioop_findmax(PyObject *self, PyObject *args) best_result = result; best_j = 0; + j = 0; - for (j=1; j<=len1-len2; j++) { + for ( j=1; j<=len1-len2; j++) { aj_m1 = (double)cp1[j-1]; aj_lm1 = (double)cp1[j+len2-1]; @@ -610,16 +614,16 @@ audioop_findmax(PyObject *self, PyObject *args) } - return PyInt_FromLong(best_j); + return PyLong_FromSsize_t(best_j); } static PyObject * audioop_avgpp(PyObject *self, PyObject *args) { signed char *cp; - int len, size, val = 0, prevval = 0, prevextremevalid = 0, + Py_ssize_t len, i; + int size, val = 0, prevval = 0, prevextremevalid = 0, prevextreme = 0; - int i; double avg = 0.0; int diff, prevdiff, extremediff, nextreme = 0; @@ -665,16 +669,16 @@ audioop_avgpp(PyObject *self, PyObject *args) val = 0; else val = (int)(avg / (double)nextreme); - return PyInt_FromLong(val); + return PyLong_FromLong(val); } static PyObject * audioop_maxpp(PyObject *self, PyObject *args) { signed char *cp; - int len, size, val = 0, prevval = 0, prevextremevalid = 0, + Py_ssize_t len, i; + int size, val = 0, prevval = 0, prevextremevalid = 0, prevextreme = 0; - int i; int max = 0; int diff, prevdiff, extremediff; @@ -716,16 +720,17 @@ audioop_maxpp(PyObject *self, PyObject *args) if ( diff != 0 ) prevdiff = diff; } - return PyInt_FromLong(max); + return PyLong_FromLong(max); } static PyObject * audioop_cross(PyObject *self, PyObject *args) { signed char *cp; - int len, size, val = 0; - int i; - int prevval, ncross; + Py_ssize_t len, i; + int size, val = 0; + int prevval; + Py_ssize_t ncross; if ( !PyArg_ParseTuple(args, "s#i:cross", &cp, &len, &size) ) return 0; @@ -741,17 +746,17 @@ audioop_cross(PyObject *self, PyObject *args) if ( val != prevval ) ncross++; prevval = val; } - return PyInt_FromLong(ncross); + return PyLong_FromSsize_t(ncross); } static PyObject * audioop_mul(PyObject *self, PyObject *args) { signed char *cp, *ncp; - int len, size, val = 0; + Py_ssize_t len, i; + int size, val = 0; double factor, fval, maxval; PyObject *rv; - int i; if ( !PyArg_ParseTuple(args, "s#id:mul", &cp, &len, &size, &factor ) ) return 0; @@ -766,10 +771,10 @@ audioop_mul(PyObject *self, PyObject *args) return 0; } - rv = PyString_FromStringAndSize(NULL, len); + rv = PyBytes_FromStringAndSize(NULL, len); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { @@ -790,19 +795,25 @@ audioop_mul(PyObject *self, PyObject *args) static PyObject * audioop_tomono(PyObject *self, PyObject *args) { + Py_buffer pcp; signed char *cp, *ncp; - int len, size, val1 = 0, val2 = 0; + Py_ssize_t len, i; + int size, val1 = 0, val2 = 0; double fac1, fac2, fval, maxval; PyObject *rv; - int i; - if ( !PyArg_ParseTuple(args, "s#idd:tomono", - &cp, &len, &size, &fac1, &fac2 ) ) + if ( !PyArg_ParseTuple(args, "s*idd:tomono", + &pcp, &size, &fac1, &fac2 ) ) return 0; - if (!audioop_check_parameters(len, size)) + cp = pcp.buf; + len = pcp.len; + if (!audioop_check_parameters(len, size)) { + PyBuffer_Release(&pcp); return NULL; + } if (((len / size) & 1) != 0) { PyErr_SetString(AudioopError, "not a whole number of frames"); + PyBuffer_Release(&pcp); return NULL; } @@ -810,14 +821,17 @@ audioop_tomono(PyObject *self, PyObject *args) else if ( size == 2 ) maxval = (double) 0x7fff; else if ( size == 4 ) maxval = (double) 0x7fffffff; else { + PyBuffer_Release(&pcp); PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); return 0; } - rv = PyString_FromStringAndSize(NULL, len/2); - if ( rv == 0 ) + rv = PyBytes_FromStringAndSize(NULL, len/2); + if ( rv == 0 ) { + PyBuffer_Release(&pcp); return 0; - ncp = (signed char *)PyString_AsString(rv); + } + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size*2 ) { @@ -835,6 +849,7 @@ audioop_tomono(PyObject *self, PyObject *args) else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1; else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1; } + PyBuffer_Release(&pcp); return rv; } @@ -842,10 +857,10 @@ static PyObject * audioop_tostereo(PyObject *self, PyObject *args) { signed char *cp, *ncp; - int len, size, val1, val2, val = 0; + Py_ssize_t len, i; + int size, val1, val2, val = 0; double fac1, fac2, fval, maxval; PyObject *rv; - int i; if ( !PyArg_ParseTuple(args, "s#idd:tostereo", &cp, &len, &size, &fac1, &fac2 ) ) @@ -861,16 +876,16 @@ audioop_tostereo(PyObject *self, PyObject *args) return 0; } - if (len > INT_MAX/2) { + if (len > PY_SSIZE_T_MAX/2) { PyErr_SetString(PyExc_MemoryError, "not enough memory for output buffer"); return 0; } - rv = PyString_FromStringAndSize(NULL, len*2); + rv = PyBytes_FromStringAndSize(NULL, len*2); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { @@ -903,9 +918,9 @@ static PyObject * audioop_add(PyObject *self, PyObject *args) { signed char *cp1, *cp2, *ncp; - int len1, len2, size, val1 = 0, val2 = 0, maxval, newval; + Py_ssize_t len1, len2, i; + int size, val1 = 0, val2 = 0, maxval, newval; PyObject *rv; - int i; if ( !PyArg_ParseTuple(args, "s#s#i:add", &cp1, &len1, &cp2, &len2, &size ) ) @@ -925,10 +940,10 @@ audioop_add(PyObject *self, PyObject *args) return 0; } - rv = PyString_FromStringAndSize(NULL, len1); + rv = PyBytes_FromStringAndSize(NULL, len1); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len1; i += size ) { if ( size == 1 ) val1 = (int)*CHARP(cp1, i); @@ -957,9 +972,9 @@ static PyObject * audioop_bias(PyObject *self, PyObject *args) { signed char *cp, *ncp; - int len, size, val = 0; + Py_ssize_t len, i; + int size, val = 0; PyObject *rv; - int i; int bias; if ( !PyArg_ParseTuple(args, "s#ii:bias", @@ -969,10 +984,10 @@ audioop_bias(PyObject *self, PyObject *args) if (!audioop_check_parameters(len, size)) return NULL; - rv = PyString_FromStringAndSize(NULL, len); + rv = PyBytes_FromStringAndSize(NULL, len); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { @@ -992,9 +1007,9 @@ audioop_reverse(PyObject *self, PyObject *args) { signed char *cp; unsigned char *ncp; - int len, size, val = 0; + Py_ssize_t len, i, j; + int size, val = 0; PyObject *rv; - int i, j; if ( !PyArg_ParseTuple(args, "s#i:reverse", &cp, &len, &size) ) @@ -1003,10 +1018,10 @@ audioop_reverse(PyObject *self, PyObject *args) if (!audioop_check_parameters(len, size)) return NULL; - rv = PyString_FromStringAndSize(NULL, len); + rv = PyBytes_FromStringAndSize(NULL, len); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; @@ -1027,9 +1042,9 @@ audioop_lin2lin(PyObject *self, PyObject *args) { signed char *cp; unsigned char *ncp; - int len, size, size2, val = 0; + Py_ssize_t len, i, j; + int size, size2, val = 0; PyObject *rv; - int i, j; if ( !PyArg_ParseTuple(args, "s#ii:lin2lin", &cp, &len, &size, &size2) ) @@ -1040,15 +1055,15 @@ audioop_lin2lin(PyObject *self, PyObject *args) if (!audioop_check_size(size2)) return NULL; - if (len/size > INT_MAX/size2) { + if (len/size > PY_SSIZE_T_MAX/size2) { PyErr_SetString(PyExc_MemoryError, "not enough memory for output buffer"); return 0; } - rv = PyString_FromStringAndSize(NULL, (len/size)*size2); + rv = PyBytes_FromStringAndSize(NULL, (len/size)*size2); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0, j=0; i < len; i += size, j += size2 ) { if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; @@ -1077,7 +1092,8 @@ static PyObject * audioop_ratecv(PyObject *self, PyObject *args) { char *cp, *ncp; - int len, size, nchannels, inrate, outrate, weightA, weightB; + Py_ssize_t len; + int size, nchannels, inrate, outrate, weightA, weightB; int chan, d, *prev_i, *cur_i, cur_o; PyObject *state, *samps, *str, *rv = NULL; int bytes_per_frame; @@ -1168,12 +1184,12 @@ audioop_ratecv(PyObject *self, PyObject *args) case ceiling(len/inrate) * outrate. */ /* compute ceiling(len/inrate) without overflow */ - int q = len > 0 ? 1 + (len - 1) / inrate : 0; - if (outrate > INT_MAX / q / bytes_per_frame) + Py_ssize_t q = len > 0 ? 1 + (len - 1) / inrate : 0; + if (outrate > PY_SSIZE_T_MAX / q / bytes_per_frame) str = NULL; else - str = PyString_FromStringAndSize(NULL, - q * outrate * bytes_per_frame); + str = PyBytes_FromStringAndSize(NULL, + q * outrate * bytes_per_frame); if (str == NULL) { PyErr_SetString(PyExc_MemoryError, @@ -1181,7 +1197,7 @@ audioop_ratecv(PyObject *self, PyObject *args) goto exit; } } - ncp = PyString_AsString(str); + ncp = PyBytes_AsString(str); for (;;) { while (d < 0) { @@ -1198,13 +1214,12 @@ audioop_ratecv(PyObject *self, PyObject *args) goto exit; /* We have checked before that the length * of the string fits into int. */ - len = (int)(ncp - PyString_AsString(str)); - if (len == 0) { - /*don't want to resize to zero length*/ - rv = PyString_FromStringAndSize("", 0); - Py_DECREF(str); - str = rv; - } else if (_PyString_Resize(&str, len) < 0) + len = (Py_ssize_t)(ncp - PyBytes_AsString(str)); + rv = PyBytes_FromStringAndSize + (PyBytes_AsString(str), len); + Py_DECREF(str); + str = rv; + if (str == NULL) goto exit; rv = Py_BuildValue("(O(iO))", str, d, samps); Py_DECREF(samps); @@ -1258,9 +1273,9 @@ audioop_lin2ulaw(PyObject *self, PyObject *args) { signed char *cp; unsigned char *ncp; - int len, size, val = 0; + Py_ssize_t len, i; + int size, val = 0; PyObject *rv; - int i; if ( !PyArg_ParseTuple(args, "s#i:lin2ulaw", &cp, &len, &size) ) @@ -1269,10 +1284,10 @@ audioop_lin2ulaw(PyObject *self, PyObject *args) if (!audioop_check_parameters(len, size)) return NULL; - rv = PyString_FromStringAndSize(NULL, len/size); + rv = PyBytes_FromStringAndSize(NULL, len/size); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; @@ -1290,9 +1305,9 @@ audioop_ulaw2lin(PyObject *self, PyObject *args) unsigned char *cp; unsigned char cval; signed char *ncp; - int len, size, val; + Py_ssize_t len, i; + int size, val; PyObject *rv; - int i; if ( !PyArg_ParseTuple(args, "s#i:ulaw2lin", &cp, &len, &size) ) @@ -1301,15 +1316,15 @@ audioop_ulaw2lin(PyObject *self, PyObject *args) if (!audioop_check_size(size)) return NULL; - if (len > INT_MAX/size) { + if (len > PY_SSIZE_T_MAX/size) { PyErr_SetString(PyExc_MemoryError, "not enough memory for output buffer"); return 0; } - rv = PyString_FromStringAndSize(NULL, len*size); + rv = PyBytes_FromStringAndSize(NULL, len*size); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len*size; i += size ) { cval = *cp++; @@ -1327,9 +1342,9 @@ audioop_lin2alaw(PyObject *self, PyObject *args) { signed char *cp; unsigned char *ncp; - int len, size, val = 0; + Py_ssize_t len, i; + int size, val = 0; PyObject *rv; - int i; if ( !PyArg_ParseTuple(args, "s#i:lin2alaw", &cp, &len, &size) ) @@ -1338,10 +1353,10 @@ audioop_lin2alaw(PyObject *self, PyObject *args) if (!audioop_check_parameters(len, size)) return NULL; - rv = PyString_FromStringAndSize(NULL, len/size); + rv = PyBytes_FromStringAndSize(NULL, len/size); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; @@ -1359,9 +1374,9 @@ audioop_alaw2lin(PyObject *self, PyObject *args) unsigned char *cp; unsigned char cval; signed char *ncp; - int len, size, val; + Py_ssize_t len, i; + int size, val; PyObject *rv; - int i; if ( !PyArg_ParseTuple(args, "s#i:alaw2lin", &cp, &len, &size) ) @@ -1370,15 +1385,15 @@ audioop_alaw2lin(PyObject *self, PyObject *args) if (!audioop_check_size(size)) return NULL; - if (len > INT_MAX/size) { + if (len > PY_SSIZE_T_MAX/size) { PyErr_SetString(PyExc_MemoryError, "not enough memory for output buffer"); return 0; } - rv = PyString_FromStringAndSize(NULL, len*size); + rv = PyBytes_FromStringAndSize(NULL, len*size); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len*size; i += size ) { cval = *cp++; @@ -1396,10 +1411,11 @@ audioop_lin2adpcm(PyObject *self, PyObject *args) { signed char *cp; signed char *ncp; - int len, size, val = 0, step, valpred, delta, + Py_ssize_t len, i; + int size, val = 0, step, valpred, delta, index, sign, vpdiff, diff; PyObject *rv, *state, *str; - int i, outputbuffer = 0, bufferstep; + int outputbuffer = 0, bufferstep; if ( !PyArg_ParseTuple(args, "s#iO:lin2adpcm", &cp, &len, &size, &state) ) @@ -1408,15 +1424,16 @@ audioop_lin2adpcm(PyObject *self, PyObject *args) if (!audioop_check_parameters(len, size)) return NULL; - str = PyString_FromStringAndSize(NULL, len/(size*2)); + str = PyBytes_FromStringAndSize(NULL, len/(size*2)); if ( str == 0 ) return 0; - ncp = (signed char *)PyString_AsString(str); + ncp = (signed char *)PyBytes_AsString(str); /* Decode state, should have (value, step) */ if ( state == Py_None ) { /* First time, it seems. Set defaults */ valpred = 0; + step = 7; index = 0; } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) ) return 0; @@ -1501,9 +1518,10 @@ audioop_adpcm2lin(PyObject *self, PyObject *args) { signed char *cp; signed char *ncp; - int len, size, valpred, step, delta, index, sign, vpdiff; + Py_ssize_t len, i; + int size, valpred, step, delta, index, sign, vpdiff; PyObject *rv, *str, *state; - int i, inputbuffer = 0, bufferstep; + int inputbuffer = 0, bufferstep; if ( !PyArg_ParseTuple(args, "s#iO:adpcm2lin", &cp, &len, &size, &state) ) @@ -1516,19 +1534,20 @@ audioop_adpcm2lin(PyObject *self, PyObject *args) if ( state == Py_None ) { /* First time, it seems. Set defaults */ valpred = 0; + step = 7; index = 0; } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) ) return 0; - if (len > (INT_MAX/2)/size) { + if (len > (PY_SSIZE_T_MAX/2)/size) { PyErr_SetString(PyExc_MemoryError, "not enough memory for output buffer"); return 0; } - str = PyString_FromStringAndSize(NULL, len*size*2); + str = PyBytes_FromStringAndSize(NULL, len*size*2); if ( str == 0 ) return 0; - ncp = (signed char *)PyString_AsString(str); + ncp = (signed char *)PyBytes_AsString(str); step = stepsizeTable[index]; bufferstep = 0; @@ -1617,17 +1636,31 @@ static PyMethodDef audioop_methods[] = { { 0, 0 } }; + +static struct PyModuleDef audioopmodule = { + PyModuleDef_HEAD_INIT, + "audioop", + NULL, + -1, + audioop_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initaudioop(void) +PyInit_audioop(void) { PyObject *m, *d; - m = Py_InitModule("audioop", audioop_methods); + m = PyModule_Create(&audioopmodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); if (d == NULL) - return; + return NULL; AudioopError = PyErr_NewException("audioop.error", NULL, NULL); if (AudioopError != NULL) PyDict_SetItemString(d,"error",AudioopError); + return m; } diff --git a/Modules/binascii.c b/Modules/binascii.c index 8334fe5c07c..19681b415cc 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -141,7 +141,7 @@ static char table_a2b_base64[] = { #define BASE64_PAD '=' /* Max binary chunk size; limited only by available memory */ -#define BASE64_MAXBIN (PY_SSIZE_T_MAX/2 - sizeof(PyStringObject) - 3) +#define BASE64_MAXBIN ((PY_SSIZE_T_MAX - 3) / 2) static unsigned char table_b2a_base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -196,7 +196,7 @@ binascii_a2b_uu(PyObject *self, PyObject *args) PyObject *rv; Py_ssize_t ascii_len, bin_len; - if ( !PyArg_ParseTuple(args, "s*:a2b_uu", &pascii) ) + if ( !PyArg_ParseTuple(args, "y*:a2b_uu", &pascii) ) return NULL; ascii_data = pascii.buf; ascii_len = pascii.len; @@ -208,11 +208,11 @@ binascii_a2b_uu(PyObject *self, PyObject *args) ascii_len--; /* Allocate the buffer */ - if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL ) { + if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len)) == NULL ) { PyBuffer_Release(&pascii); return NULL; } - bin_data = (unsigned char *)PyString_AS_STRING(rv); + bin_data = (unsigned char *)PyBytes_AS_STRING(rv); for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) { /* XXX is it really best to add NULs if there's no more data */ @@ -282,7 +282,7 @@ binascii_b2a_uu(PyObject *self, PyObject *args) PyObject *rv; Py_ssize_t bin_len; - if ( !PyArg_ParseTuple(args, "s*:b2a_uu", &pbin) ) + if ( !PyArg_ParseTuple(args, "y*:b2a_uu", &pbin) ) return NULL; bin_data = pbin.buf; bin_len = pbin.len; @@ -294,11 +294,11 @@ binascii_b2a_uu(PyObject *self, PyObject *args) } /* We're lazy and allocate to much (fixed up later) */ - if ( (rv=PyString_FromStringAndSize(NULL, 2 + (bin_len+2)/3*4)) == NULL ) { + if ( (rv=PyBytes_FromStringAndSize(NULL, 2 + (bin_len+2)/3*4)) == NULL ) { PyBuffer_Release(&pbin); return NULL; } - ascii_data = (unsigned char *)PyString_AS_STRING(rv); + ascii_data = (unsigned char *)PyBytes_AS_STRING(rv); /* Store the length */ *ascii_data++ = ' ' + (bin_len & 077); @@ -320,9 +320,9 @@ binascii_b2a_uu(PyObject *self, PyObject *args) } *ascii_data++ = '\n'; /* Append a courtesy newline */ - if (_PyString_Resize(&rv, + if (_PyBytes_Resize(&rv, (ascii_data - - (unsigned char *)PyString_AS_STRING(rv))) < 0) { + (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { Py_DECREF(rv); rv = NULL; } @@ -370,7 +370,7 @@ binascii_a2b_base64(PyObject *self, PyObject *args) Py_ssize_t ascii_len, bin_len; int quad_pos = 0; - if ( !PyArg_ParseTuple(args, "s*:a2b_base64", &pascii) ) + if ( !PyArg_ParseTuple(args, "y*:a2b_base64", &pascii) ) return NULL; ascii_data = pascii.buf; ascii_len = pascii.len; @@ -385,11 +385,11 @@ binascii_a2b_base64(PyObject *self, PyObject *args) bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */ /* Allocate the buffer */ - if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL ) { + if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len)) == NULL ) { PyBuffer_Release(&pascii); return NULL; } - bin_data = (unsigned char *)PyString_AS_STRING(rv); + bin_data = (unsigned char *)PyBytes_AS_STRING(rv); bin_len = 0; for( ; ascii_len > 0; ascii_len--, ascii_data++) { @@ -449,17 +449,17 @@ binascii_a2b_base64(PyObject *self, PyObject *args) /* And set string size correctly. If the result string is empty ** (because the input was all invalid) return the shared empty - ** string instead; _PyString_Resize() won't do this for us. + ** string instead; _PyBytes_Resize() won't do this for us. */ if (bin_len > 0) { - if (_PyString_Resize(&rv, bin_len) < 0) { + if (_PyBytes_Resize(&rv, bin_len) < 0) { Py_DECREF(rv); rv = NULL; } } else { Py_DECREF(rv); - rv = PyString_FromStringAndSize("", 0); + rv = PyBytes_FromStringAndSize("", 0); } PyBuffer_Release(&pascii); return rv; @@ -478,7 +478,7 @@ binascii_b2a_base64(PyObject *self, PyObject *args) PyObject *rv; Py_ssize_t bin_len; - if ( !PyArg_ParseTuple(args, "s*:b2a_base64", &pbuf) ) + if ( !PyArg_ParseTuple(args, "y*:b2a_base64", &pbuf) ) return NULL; bin_data = pbuf.buf; bin_len = pbuf.len; @@ -494,11 +494,11 @@ binascii_b2a_base64(PyObject *self, PyObject *args) /* We're lazy and allocate too much (fixed up later). "+3" leaves room for up to two pad characters and a trailing newline. Note that 'b' gets encoded as 'Yg==\n' (1 in, 5 out). */ - if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2 + 3)) == NULL ) { + if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len*2 + 3)) == NULL ) { PyBuffer_Release(&pbuf); return NULL; } - ascii_data = (unsigned char *)PyString_AS_STRING(rv); + ascii_data = (unsigned char *)PyBytes_AS_STRING(rv); for( ; bin_len > 0 ; bin_len--, bin_data++ ) { /* Shift the data into our buffer */ @@ -522,9 +522,9 @@ binascii_b2a_base64(PyObject *self, PyObject *args) } *ascii_data++ = '\n'; /* Append a courtesy newline */ - if (_PyString_Resize(&rv, + if (_PyBytes_Resize(&rv, (ascii_data - - (unsigned char *)PyString_AS_STRING(rv))) < 0) { + (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { Py_DECREF(rv); rv = NULL; } @@ -546,7 +546,7 @@ binascii_a2b_hqx(PyObject *self, PyObject *args) Py_ssize_t len; int done = 0; - if ( !PyArg_ParseTuple(args, "s*:a2b_hqx", &pascii) ) + if ( !PyArg_ParseTuple(args, "y*:a2b_hqx", &pascii) ) return NULL; ascii_data = pascii.buf; len = pascii.len; @@ -561,11 +561,11 @@ binascii_a2b_hqx(PyObject *self, PyObject *args) /* Allocate a string that is too big (fixed later) Add two to the initial length to prevent interning which would preclude subsequent resizing. */ - if ( (rv=PyString_FromStringAndSize(NULL, len+2)) == NULL ) { + if ( (rv=PyBytes_FromStringAndSize(NULL, len+2)) == NULL ) { PyBuffer_Release(&pascii); return NULL; } - bin_data = (unsigned char *)PyString_AS_STRING(rv); + bin_data = (unsigned char *)PyBytes_AS_STRING(rv); for( ; len > 0 ; len--, ascii_data++ ) { /* Get the byte and look it up */ @@ -601,9 +601,9 @@ binascii_a2b_hqx(PyObject *self, PyObject *args) Py_DECREF(rv); return NULL; } - if (_PyString_Resize(&rv, + if (_PyBytes_Resize(&rv, (bin_data - - (unsigned char *)PyString_AS_STRING(rv))) < 0) { + (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { Py_DECREF(rv); rv = NULL; } @@ -629,7 +629,7 @@ binascii_rlecode_hqx(PyObject *self, PyObject *args) unsigned char ch; Py_ssize_t in, inend, len; - if ( !PyArg_ParseTuple(args, "s*:rlecode_hqx", &pbuf) ) + if ( !PyArg_ParseTuple(args, "y*:rlecode_hqx", &pbuf) ) return NULL; in_data = pbuf.buf; len = pbuf.len; @@ -642,11 +642,11 @@ binascii_rlecode_hqx(PyObject *self, PyObject *args) } /* Worst case: output is twice as big as input (fixed later) */ - if ( (rv=PyString_FromStringAndSize(NULL, len*2+2)) == NULL ) { + if ( (rv=PyBytes_FromStringAndSize(NULL, len*2+2)) == NULL ) { PyBuffer_Release(&pbuf); return NULL; } - out_data = (unsigned char *)PyString_AS_STRING(rv); + out_data = (unsigned char *)PyBytes_AS_STRING(rv); for( in=0; in<len; in++) { ch = in_data[in]; @@ -664,7 +664,7 @@ binascii_rlecode_hqx(PyObject *self, PyObject *args) /* More than 3 in a row. Output RLE. */ *out_data++ = ch; *out_data++ = RUNCHAR; - *out_data++ = inend-in; + *out_data++ = (unsigned char) (inend-in); in = inend-1; } else { /* Less than 3. Output the byte itself */ @@ -672,9 +672,9 @@ binascii_rlecode_hqx(PyObject *self, PyObject *args) } } } - if (_PyString_Resize(&rv, + if (_PyBytes_Resize(&rv, (out_data - - (unsigned char *)PyString_AS_STRING(rv))) < 0) { + (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { Py_DECREF(rv); rv = NULL; } @@ -695,7 +695,7 @@ binascii_b2a_hqx(PyObject *self, PyObject *args) PyObject *rv; Py_ssize_t len; - if ( !PyArg_ParseTuple(args, "s*:b2a_hqx", &pbin) ) + if ( !PyArg_ParseTuple(args, "y*:b2a_hqx", &pbin) ) return NULL; bin_data = pbin.buf; len = pbin.len; @@ -708,11 +708,11 @@ binascii_b2a_hqx(PyObject *self, PyObject *args) } /* Allocate a buffer that is at least large enough */ - if ( (rv=PyString_FromStringAndSize(NULL, len*2+2)) == NULL ) { + if ( (rv=PyBytes_FromStringAndSize(NULL, len*2+2)) == NULL ) { PyBuffer_Release(&pbin); return NULL; } - ascii_data = (unsigned char *)PyString_AS_STRING(rv); + ascii_data = (unsigned char *)PyBytes_AS_STRING(rv); for( ; len > 0 ; len--, bin_data++ ) { /* Shift into our buffer, and output any 6bits ready */ @@ -729,9 +729,9 @@ binascii_b2a_hqx(PyObject *self, PyObject *args) leftchar <<= (6-leftbits); *ascii_data++ = table_b2a_hqx[leftchar & 0x3f]; } - if (_PyString_Resize(&rv, + if (_PyBytes_Resize(&rv, (ascii_data - - (unsigned char *)PyString_AS_STRING(rv))) < 0) { + (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { Py_DECREF(rv); rv = NULL; } @@ -750,7 +750,7 @@ binascii_rledecode_hqx(PyObject *self, PyObject *args) PyObject *rv; Py_ssize_t in_len, out_len, out_len_left; - if ( !PyArg_ParseTuple(args, "s*:rledecode_hqx", &pin) ) + if ( !PyArg_ParseTuple(args, "y*:rledecode_hqx", &pin) ) return NULL; in_data = pin.buf; in_len = pin.len; @@ -760,7 +760,7 @@ binascii_rledecode_hqx(PyObject *self, PyObject *args) /* Empty string is a special case */ if ( in_len == 0 ) { PyBuffer_Release(&pin); - return PyString_FromStringAndSize("", 0); + return PyBytes_FromStringAndSize("", 0); } else if (in_len > PY_SSIZE_T_MAX / 2) { PyBuffer_Release(&pin); @@ -769,12 +769,12 @@ binascii_rledecode_hqx(PyObject *self, PyObject *args) /* Allocate a buffer of reasonable size. Resized when needed */ out_len = in_len*2; - if ( (rv=PyString_FromStringAndSize(NULL, out_len)) == NULL ) { + if ( (rv=PyBytes_FromStringAndSize(NULL, out_len)) == NULL ) { PyBuffer_Release(&pin); return NULL; } out_len_left = out_len; - out_data = (unsigned char *)PyString_AS_STRING(rv); + out_data = (unsigned char *)PyBytes_AS_STRING(rv); /* ** We need two macros here to get/put bytes and handle @@ -795,9 +795,9 @@ binascii_rledecode_hqx(PyObject *self, PyObject *args) do { \ if ( --out_len_left < 0 ) { \ if ( out_len > PY_SSIZE_T_MAX / 2) return PyErr_NoMemory(); \ - if (_PyString_Resize(&rv, 2*out_len) < 0) \ + if (_PyBytes_Resize(&rv, 2*out_len) < 0) \ { Py_DECREF(rv); PyBuffer_Release(&pin); return NULL; } \ - out_data = (unsigned char *)PyString_AS_STRING(rv) \ + out_data = (unsigned char *)PyBytes_AS_STRING(rv) \ + out_len; \ out_len_left = out_len-1; \ out_len = out_len * 2; \ @@ -846,9 +846,9 @@ binascii_rledecode_hqx(PyObject *self, PyObject *args) OUTBYTE(in_byte); } } - if (_PyString_Resize(&rv, + if (_PyBytes_Resize(&rv, (out_data - - (unsigned char *)PyString_AS_STRING(rv))) < 0) { + (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { Py_DECREF(rv); rv = NULL; } @@ -867,7 +867,7 @@ binascii_crc_hqx(PyObject *self, PyObject *args) unsigned int crc; Py_ssize_t len; - if ( !PyArg_ParseTuple(args, "s*i:crc_hqx", &pin, &crc) ) + if ( !PyArg_ParseTuple(args, "y*i:crc_hqx", &pin, &crc) ) return NULL; bin_data = pin.buf; len = pin.len; @@ -894,17 +894,13 @@ binascii_crc32(PyObject *self, PyObject *args) Py_ssize_t len; int signed_val; - if (!PyArg_ParseTuple(args, "s*|I:crc32", &pbuf, &crc32val)) + if (!PyArg_ParseTuple(args, "y*|I:crc32", &pbuf, &crc32val)) return NULL; - /* In Python 2.x we return a signed integer regardless of native platform - * long size (the 32bit unsigned long is treated as 32-bit signed and sign - * extended into a 64-bit long inside the integer object). 3.0 does the - * right thing and returns unsigned. http://bugs.python.org/issue1202 */ buf = (Byte*)pbuf.buf; len = pbuf.len; signed_val = crc32(crc32val, buf, len); PyBuffer_Release(&pbuf); - return PyInt_FromLong(signed_val); + return PyLong_FromUnsignedLong(signed_val & 0xffffffffU); } #else /* USE_ZLIB_CRC32 */ /* Crc - 32 BIT ANSI X3.66 CRC checksum files @@ -1030,23 +1026,24 @@ binascii_crc32(PyObject *self, PyObject *args) { /* By Jim Ahlstrom; All rights transferred to CNRI */ Py_buffer pbin; unsigned char *bin_data; - unsigned int crc = 0U; /* initial value of CRC */ + unsigned int crc = 0; /* initial value of CRC */ Py_ssize_t len; - int result; + unsigned int result; - if ( !PyArg_ParseTuple(args, "s*|I:crc32", &pbin, &crc) ) + if ( !PyArg_ParseTuple(args, "y*|I:crc32", &pbin, &crc) ) return NULL; bin_data = pbin.buf; len = pbin.len; crc = ~ crc; - while (len-- > 0) - crc = crc_32_tab[(crc ^ *bin_data++) & 0xffU] ^ (crc >> 8); + while (len-- > 0) { + crc = crc_32_tab[(crc ^ *bin_data++) & 0xff] ^ (crc >> 8); /* Note: (crc >> 8) MUST zero fill on left */ + } - result = (int)(crc ^ 0xFFFFFFFFU); + result = (crc ^ 0xFFFFFFFF); PyBuffer_Release(&pbin); - return PyInt_FromLong(result); + return PyLong_FromUnsignedLong(result & 0xffffffff); } #endif /* USE_ZLIB_CRC32 */ @@ -1061,7 +1058,7 @@ binascii_hexlify(PyObject *self, PyObject *args) char* retbuf; Py_ssize_t i, j; - if (!PyArg_ParseTuple(args, "s*:b2a_hex", &parg)) + if (!PyArg_ParseTuple(args, "y*:b2a_hex", &parg)) return NULL; argbuf = parg.buf; arglen = parg.len; @@ -1072,12 +1069,12 @@ binascii_hexlify(PyObject *self, PyObject *args) return PyErr_NoMemory(); } - retval = PyString_FromStringAndSize(NULL, arglen*2); + retval = PyBytes_FromStringAndSize(NULL, arglen*2); if (!retval) { PyBuffer_Release(&parg); return NULL; } - retbuf = PyString_AS_STRING(retval); + retbuf = PyBytes_AS_STRING(retval); /* make hex version of string, taken from shamodule.c */ for (i=j=0; i < arglen; i++) { @@ -1124,7 +1121,7 @@ binascii_unhexlify(PyObject *self, PyObject *args) char* retbuf; Py_ssize_t i, j; - if (!PyArg_ParseTuple(args, "s*:a2b_hex", &parg)) + if (!PyArg_ParseTuple(args, "y*:a2b_hex", &parg)) return NULL; argbuf = parg.buf; arglen = parg.len; @@ -1137,22 +1134,22 @@ binascii_unhexlify(PyObject *self, PyObject *args) */ if (arglen % 2) { PyBuffer_Release(&parg); - PyErr_SetString(PyExc_TypeError, "Odd-length string"); + PyErr_SetString(Error, "Odd-length string"); return NULL; } - retval = PyString_FromStringAndSize(NULL, (arglen/2)); + retval = PyBytes_FromStringAndSize(NULL, (arglen/2)); if (!retval) { PyBuffer_Release(&parg); return NULL; } - retbuf = PyString_AS_STRING(retval); + retbuf = PyBytes_AS_STRING(retval); for (i=j=0; i < arglen; i += 2) { int top = to_int(Py_CHARMASK(argbuf[i])); int bot = to_int(Py_CHARMASK(argbuf[i+1])); if (top == -1 || bot == -1) { - PyErr_SetString(PyExc_TypeError, + PyErr_SetString(Error, "Non-hexadecimal digit found"); goto finally; } @@ -1202,7 +1199,7 @@ binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs) static char *kwlist[] = {"data", "header", NULL}; int header = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|i", kwlist, &pdata, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*|i", kwlist, &pdata, &header)) return NULL; data = pdata.buf; @@ -1264,7 +1261,7 @@ binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs) out++; } } - if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) { + if ((rv = PyBytes_FromStringAndSize((char *)odata, out)) == NULL) { PyBuffer_Release(&pdata); PyMem_Free(odata); return NULL; @@ -1314,7 +1311,7 @@ binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs) int crlf = 0; unsigned char *p; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|iii", kwlist, &pdata, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*|iii", kwlist, &pdata, "etabs, &istext, &header)) return NULL; data = pdata.buf; @@ -1340,8 +1337,7 @@ binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs) ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) || ((data[in] < 33) && (data[in] != '\r') && (data[in] != '\n') && - (quotetabs || - (!quotetabs && ((data[in] != '\t') && (data[in] != ' ')))))) + (quotetabs || ((data[in] != '\t') && (data[in] != ' '))))) { if ((linelen + 3) >= MAXLINESIZE) { linelen = 0; @@ -1470,7 +1466,7 @@ binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs) } } } - if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) { + if ((rv = PyBytes_FromStringAndSize((char *)odata, out)) == NULL) { PyBuffer_Release(&pdata); PyMem_Free(odata); return NULL; @@ -1506,26 +1502,41 @@ static struct PyMethodDef binascii_module_methods[] = { }; -/* Initialization function for the module (*must* be called initbinascii) */ +/* Initialization function for the module (*must* be called PyInit_binascii) */ PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII"); + +static struct PyModuleDef binasciimodule = { + PyModuleDef_HEAD_INIT, + "binascii", + doc_binascii, + -1, + binascii_module_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initbinascii(void) +PyInit_binascii(void) { - PyObject *m, *d, *x; + PyObject *m, *d; /* Create the module and add the functions */ - m = Py_InitModule("binascii", binascii_module_methods); + m = PyModule_Create(&binasciimodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); - x = PyString_FromString(doc_binascii); - PyDict_SetItemString(d, "__doc__", x); - Py_XDECREF(x); - Error = PyErr_NewException("binascii.Error", NULL, NULL); + Error = PyErr_NewException("binascii.Error", PyExc_ValueError, NULL); PyDict_SetItemString(d, "Error", Error); Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL); PyDict_SetItemString(d, "Incomplete", Incomplete); + if (PyErr_Occurred()) { + Py_DECREF(m); + m = NULL; + } + return m; } diff --git a/Modules/bsddb.h b/Modules/bsddb.h deleted file mode 100644 index 3199e940a7a..00000000000 --- a/Modules/bsddb.h +++ /dev/null @@ -1,299 +0,0 @@ -/*---------------------------------------------------------------------- - Copyright (c) 1999-2001, Digital Creations, Fredericksburg, VA, USA - and Andrew Kuchling. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - o Redistributions of source code must retain the above copyright - notice, this list of conditions, and the disclaimer that follows. - - o 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. - - o Neither the name of Digital Creations nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS 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 DIGITAL - CREATIONS 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. -------------------------------------------------------------------------*/ - - -/* - * Handwritten code to wrap version 3.x of the Berkeley DB library, - * written to replace a SWIG-generated file. It has since been updated - * to compile with Berkeley DB versions 3.2 through 4.2. - * - * This module was started by Andrew Kuchling to remove the dependency - * on SWIG in a package by Gregory P. Smith who based his work on a - * similar package by Robin Dunn <robin@alldunn.com> which wrapped - * Berkeley DB 2.7.x. - * - * Development of this module then returned full circle back to Robin Dunn - * who worked on behalf of Digital Creations to complete the wrapping of - * the DB 3.x API and to build a solid unit test suite. Robin has - * since gone onto other projects (wxPython). - * - * Gregory P. Smith <greg@krypto.org> is once again the maintainer. - * - * Use the pybsddb-users@lists.sf.net mailing list for all questions. - * Things can change faster than the header of this file is updated. This - * file is shared with the PyBSDDB project at SourceForge: - * - * http://pybsddb.sf.net - * - * This file should remain backward compatible with Python 2.1, but see PEP - * 291 for the most current backward compatibility requirements: - * - * http://www.python.org/peps/pep-0291.html - * - * This module contains 6 types: - * - * DB (Database) - * DBCursor (Database Cursor) - * DBEnv (database environment) - * DBTxn (An explicit database transaction) - * DBLock (A lock handle) - * DBSequence (Sequence) - * - * New datatypes: - * - * DBLogCursor (Log Cursor) - * - */ - -/* --------------------------------------------------------------------- */ - -/* - * Portions of this module, associated unit tests and build scripts are the - * result of a contract with The Written Word (http://thewrittenword.com/) - * Many thanks go out to them for causing me to raise the bar on quality and - * functionality, resulting in a better bsddb3 package for all of us to use. - * - * --Robin - */ - -/* --------------------------------------------------------------------- */ - -/* - * Work to split it up into a separate header and to add a C API was - * contributed by Duncan Grisby <duncan@tideway.com>. See here: - * http://sourceforge.net/tracker/index.php?func=detail&aid=1551895&group_id=13900&atid=313900 - */ - -/* --------------------------------------------------------------------- */ - -#ifndef _BSDDB_H_ -#define _BSDDB_H_ - -#include <db.h> - - -/* 40 = 4.0, 33 = 3.3; this will break if the minor revision is > 9 */ -#define DBVER (DB_VERSION_MAJOR * 10 + DB_VERSION_MINOR) -#if DB_VERSION_MINOR > 9 -#error "eek! DBVER can't handle minor versions > 9" -#endif - -#define PY_BSDDB_VERSION "4.8.4.2" - -/* Python object definitions */ - -struct behaviourFlags { - /* What is the default behaviour when DB->get or DBCursor->get returns a - DB_NOTFOUND || DB_KEYEMPTY error? Return None or raise an exception? */ - unsigned int getReturnsNone : 1; - /* What is the default behaviour for DBCursor.set* methods when DBCursor->get - * returns a DB_NOTFOUND || DB_KEYEMPTY error? Return None or raise? */ - unsigned int cursorSetReturnsNone : 1; -}; - - - -struct DBObject; /* Forward declaration */ -struct DBCursorObject; /* Forward declaration */ -struct DBLogCursorObject; /* Forward declaration */ -struct DBTxnObject; /* Forward declaration */ -struct DBSequenceObject; /* Forward declaration */ - -typedef struct { - PyObject_HEAD - DB_ENV* db_env; - u_int32_t flags; /* saved flags from open() */ - int closed; - struct behaviourFlags moduleFlags; - PyObject* event_notifyCallback; - struct DBObject *children_dbs; - struct DBTxnObject *children_txns; - struct DBLogCursorObject *children_logcursors; - PyObject *private_obj; - PyObject *rep_transport; - PyObject *in_weakreflist; /* List of weak references */ -} DBEnvObject; - -typedef struct DBObject { - PyObject_HEAD - DB* db; - DBEnvObject* myenvobj; /* PyObject containing the DB_ENV */ - u_int32_t flags; /* saved flags from open() */ - u_int32_t setflags; /* saved flags from set_flags() */ - struct behaviourFlags moduleFlags; - struct DBTxnObject *txn; - struct DBCursorObject *children_cursors; -#if (DBVER >=43) - struct DBSequenceObject *children_sequences; -#endif - struct DBObject **sibling_prev_p; - struct DBObject *sibling_next; - struct DBObject **sibling_prev_p_txn; - struct DBObject *sibling_next_txn; - PyObject* associateCallback; - PyObject* btCompareCallback; - int primaryDBType; - PyObject *private_obj; - PyObject *in_weakreflist; /* List of weak references */ -} DBObject; - - -typedef struct DBCursorObject { - PyObject_HEAD - DBC* dbc; - struct DBCursorObject **sibling_prev_p; - struct DBCursorObject *sibling_next; - struct DBCursorObject **sibling_prev_p_txn; - struct DBCursorObject *sibling_next_txn; - DBObject* mydb; - struct DBTxnObject *txn; - PyObject *in_weakreflist; /* List of weak references */ -} DBCursorObject; - - -typedef struct DBTxnObject { - PyObject_HEAD - DB_TXN* txn; - DBEnvObject* env; - int flag_prepare; - struct DBTxnObject *parent_txn; - struct DBTxnObject **sibling_prev_p; - struct DBTxnObject *sibling_next; - struct DBTxnObject *children_txns; - struct DBObject *children_dbs; - struct DBSequenceObject *children_sequences; - struct DBCursorObject *children_cursors; - PyObject *in_weakreflist; /* List of weak references */ -} DBTxnObject; - - -typedef struct DBLogCursorObject { - PyObject_HEAD - DB_LOGC* logc; - DBEnvObject* env; - struct DBLogCursorObject **sibling_prev_p; - struct DBLogCursorObject *sibling_next; - PyObject *in_weakreflist; /* List of weak references */ -} DBLogCursorObject; - - -typedef struct { - PyObject_HEAD - DB_LOCK lock; - int lock_initialized; /* Signal if we actually have a lock */ - PyObject *in_weakreflist; /* List of weak references */ -} DBLockObject; - - -#if (DBVER >= 43) -typedef struct DBSequenceObject { - PyObject_HEAD - DB_SEQUENCE* sequence; - DBObject* mydb; - struct DBTxnObject *txn; - struct DBSequenceObject **sibling_prev_p; - struct DBSequenceObject *sibling_next; - struct DBSequenceObject **sibling_prev_p_txn; - struct DBSequenceObject *sibling_next_txn; - PyObject *in_weakreflist; /* List of weak references */ -} DBSequenceObject; -#endif - - -/* API structure for use by C code */ - -/* To access the structure from an external module, use code like the - following (error checking missed out for clarity): - - // If you are using Python before 3.2: - BSDDB_api* bsddb_api; - PyObject* mod; - PyObject* cobj; - - mod = PyImport_ImportModule("bsddb._bsddb"); - // Use "bsddb3._pybsddb" if you're using the standalone pybsddb add-on. - cobj = PyObject_GetAttrString(mod, "api"); - api = (BSDDB_api*)PyCObject_AsVoidPtr(cobj); - Py_DECREF(cobj); - Py_DECREF(mod); - - - // If you are using Python 3.2 or up: - BSDDB_api* bsddb_api; - - // Use "bsddb3._pybsddb.api" if you're using - // the standalone pybsddb add-on. - bsddb_api = (void **)PyCapsule_Import("bsddb._bsddb.api", 1); - - - The structure's members must not be changed. -*/ - -typedef struct { - /* Type objects */ - PyTypeObject* db_type; - PyTypeObject* dbcursor_type; - PyTypeObject* dblogcursor_type; - PyTypeObject* dbenv_type; - PyTypeObject* dbtxn_type; - PyTypeObject* dblock_type; -#if (DBVER >= 43) - PyTypeObject* dbsequence_type; -#endif - - /* Functions */ - int (*makeDBError)(int err); -} BSDDB_api; - - -#ifndef COMPILING_BSDDB_C - -/* If not inside _bsddb.c, define type check macros that use the api - structure. The calling code must have a value named bsddb_api - pointing to the api structure. -*/ - -#define DBObject_Check(v) ((v)->ob_type == bsddb_api->db_type) -#define DBCursorObject_Check(v) ((v)->ob_type == bsddb_api->dbcursor_type) -#define DBEnvObject_Check(v) ((v)->ob_type == bsddb_api->dbenv_type) -#define DBTxnObject_Check(v) ((v)->ob_type == bsddb_api->dbtxn_type) -#define DBLockObject_Check(v) ((v)->ob_type == bsddb_api->dblock_type) -#if (DBVER >= 43) -#define DBSequenceObject_Check(v) ((v)->ob_type == bsddb_api->dbsequence_type) -#endif - -#endif /* COMPILING_BSDDB_C */ - - -#endif /* _BSDDB_H_ */ diff --git a/Modules/bsddbmodule.c b/Modules/bsddbmodule.c deleted file mode 100644 index 578cf3df069..00000000000 --- a/Modules/bsddbmodule.c +++ /dev/null @@ -1,864 +0,0 @@ -/* Berkeley DB interface. - Author: Michael McLay - Hacked: Guido van Rossum - Btree and Recno additions plus sequence methods: David Ely - Hacked by Gustavo Niemeyer <niemeyer@conectiva.com> fixing recno - support. - - XXX To do: - - provide a way to access the various hash functions - - support more open flags - - The windows port of the Berkeley DB code is hard to find on the web: - www.nightmare.com/software.html -*/ - -#include "Python.h" -#ifdef WITH_THREAD -#include "pythread.h" -#endif - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#ifdef HAVE_DB_185_H -#include <db_185.h> -#else -#include <db.h> -#endif -/* Please don't include internal header files of the Berkeley db package - (it messes up the info required in the Setup file) */ - -typedef struct { - PyObject_HEAD - DB *di_bsddb; - int di_size; /* -1 means recompute */ - int di_type; -#ifdef WITH_THREAD - PyThread_type_lock di_lock; -#endif -} bsddbobject; - -static PyTypeObject Bsddbtype; - -#define is_bsddbobject(v) ((v)->ob_type == &Bsddbtype) -#define check_bsddbobject_open(v, r) if ((v)->di_bsddb == NULL) \ - { PyErr_SetString(BsddbError, \ - "BSDDB object has already been closed"); \ - return r; } - -static PyObject *BsddbError; - -static PyObject * -newdbhashobject(char *file, int flags, int mode, - int bsize, int ffactor, int nelem, int cachesize, - int hash, int lorder) -{ - bsddbobject *dp; - HASHINFO info; - - if ((dp = PyObject_New(bsddbobject, &Bsddbtype)) == NULL) - return NULL; - - info.bsize = bsize; - info.ffactor = ffactor; - info.nelem = nelem; - info.cachesize = cachesize; - info.hash = NULL; /* XXX should derive from hash argument */ - info.lorder = lorder; - -#ifdef O_BINARY - flags |= O_BINARY; -#endif - Py_BEGIN_ALLOW_THREADS - dp->di_bsddb = dbopen(file, flags, mode, DB_HASH, &info); - Py_END_ALLOW_THREADS - if (dp->di_bsddb == NULL) { - PyErr_SetFromErrno(BsddbError); -#ifdef WITH_THREAD - dp->di_lock = NULL; -#endif - Py_DECREF(dp); - return NULL; - } - - dp->di_size = -1; - dp->di_type = DB_HASH; - -#ifdef WITH_THREAD - dp->di_lock = PyThread_allocate_lock(); - if (dp->di_lock == NULL) { - PyErr_SetString(BsddbError, "can't allocate lock"); - Py_DECREF(dp); - return NULL; - } -#endif - - return (PyObject *)dp; -} - -static PyObject * -newdbbtobject(char *file, int flags, int mode, - int btflags, int cachesize, int maxkeypage, - int minkeypage, int psize, int lorder) -{ - bsddbobject *dp; - BTREEINFO info; - - if ((dp = PyObject_New(bsddbobject, &Bsddbtype)) == NULL) - return NULL; - - info.flags = btflags; - info.cachesize = cachesize; - info.maxkeypage = maxkeypage; - info.minkeypage = minkeypage; - info.psize = psize; - info.lorder = lorder; - info.compare = 0; /* Use default comparison functions, for now..*/ - info.prefix = 0; - -#ifdef O_BINARY - flags |= O_BINARY; -#endif - Py_BEGIN_ALLOW_THREADS - dp->di_bsddb = dbopen(file, flags, mode, DB_BTREE, &info); - Py_END_ALLOW_THREADS - if (dp->di_bsddb == NULL) { - PyErr_SetFromErrno(BsddbError); -#ifdef WITH_THREAD - dp->di_lock = NULL; -#endif - Py_DECREF(dp); - return NULL; - } - - dp->di_size = -1; - dp->di_type = DB_BTREE; - -#ifdef WITH_THREAD - dp->di_lock = PyThread_allocate_lock(); - if (dp->di_lock == NULL) { - PyErr_SetString(BsddbError, "can't allocate lock"); - Py_DECREF(dp); - return NULL; - } -#endif - - return (PyObject *)dp; -} - -static PyObject * -newdbrnobject(char *file, int flags, int mode, - int rnflags, int cachesize, int psize, int lorder, - size_t reclen, u_char bval, char *bfname) -{ - bsddbobject *dp; - RECNOINFO info; - int fd; - - if ((dp = PyObject_New(bsddbobject, &Bsddbtype)) == NULL) - return NULL; - - info.flags = rnflags; - info.cachesize = cachesize; - info.psize = psize; - info.lorder = lorder; - info.reclen = reclen; - info.bval = bval; - info.bfname = bfname; - -#ifdef O_BINARY - flags |= O_BINARY; -#endif - /* This is a hack to avoid a dbopen() bug that happens when - * it fails. */ - fd = open(file, flags); - if (fd == -1) { - dp->di_bsddb = NULL; - } - else { - close(fd); - Py_BEGIN_ALLOW_THREADS - dp->di_bsddb = dbopen(file, flags, mode, DB_RECNO, &info); - Py_END_ALLOW_THREADS - } - if (dp->di_bsddb == NULL) { - PyErr_SetFromErrno(BsddbError); -#ifdef WITH_THREAD - dp->di_lock = NULL; -#endif - Py_DECREF(dp); - return NULL; - } - - dp->di_size = -1; - dp->di_type = DB_RECNO; - -#ifdef WITH_THREAD - dp->di_lock = PyThread_allocate_lock(); - if (dp->di_lock == NULL) { - PyErr_SetString(BsddbError, "can't allocate lock"); - Py_DECREF(dp); - return NULL; - } -#endif - - return (PyObject *)dp; -} - -static void -bsddb_dealloc(bsddbobject *dp) -{ -#ifdef WITH_THREAD - if (dp->di_lock) { - PyThread_acquire_lock(dp->di_lock, 0); - PyThread_release_lock(dp->di_lock); - PyThread_free_lock(dp->di_lock); - dp->di_lock = NULL; - } -#endif - if (dp->di_bsddb != NULL) { - int status; - Py_BEGIN_ALLOW_THREADS - status = (dp->di_bsddb->close)(dp->di_bsddb); - Py_END_ALLOW_THREADS - if (status != 0) - fprintf(stderr, - "Python bsddb: close errno %d in dealloc\n", - errno); - } - PyObject_Del(dp); -} - -#ifdef WITH_THREAD -#define BSDDB_BGN_SAVE(_dp) \ - Py_BEGIN_ALLOW_THREADS PyThread_acquire_lock(_dp->di_lock,1); -#define BSDDB_END_SAVE(_dp) \ - PyThread_release_lock(_dp->di_lock); Py_END_ALLOW_THREADS -#else -#define BSDDB_BGN_SAVE(_dp) Py_BEGIN_ALLOW_THREADS -#define BSDDB_END_SAVE(_dp) Py_END_ALLOW_THREADS -#endif - -static Py_ssize_t -bsddb_length(bsddbobject *dp) -{ - check_bsddbobject_open(dp, -1); - if (dp->di_size < 0) { - DBT krec, drec; - int status; - int size = 0; - BSDDB_BGN_SAVE(dp) - for (status = (dp->di_bsddb->seq)(dp->di_bsddb, - &krec, &drec,R_FIRST); - status == 0; - status = (dp->di_bsddb->seq)(dp->di_bsddb, - &krec, &drec, R_NEXT)) - size++; - BSDDB_END_SAVE(dp) - if (status < 0) { - PyErr_SetFromErrno(BsddbError); - return -1; - } - dp->di_size = size; - } - return dp->di_size; -} - -static PyObject * -bsddb_subscript(bsddbobject *dp, PyObject *key) -{ - int status; - DBT krec, drec; - char *data = NULL; - char buf[4096]; - int size; - PyObject *result; - recno_t recno; - - if (dp->di_type == DB_RECNO) { - if (!PyArg_Parse(key, "i", &recno)) { - PyErr_SetString(PyExc_TypeError, - "key type must be integer"); - return NULL; - } - krec.data = &recno; - krec.size = sizeof(recno); - } - else { - if (!PyArg_Parse(key, "s#", &data, &size)) { - PyErr_SetString(PyExc_TypeError, - "key type must be string"); - return NULL; - } - krec.data = data; - krec.size = size; - } - check_bsddbobject_open(dp, NULL); - - BSDDB_BGN_SAVE(dp) - status = (dp->di_bsddb->get)(dp->di_bsddb, &krec, &drec, 0); - if (status == 0) { - if (drec.size > sizeof(buf)) data = malloc(drec.size); - else data = buf; - if (data!=NULL) memcpy(data,drec.data,drec.size); - } - BSDDB_END_SAVE(dp) - if (data==NULL) return PyErr_NoMemory(); - if (status != 0) { - if (status < 0) - PyErr_SetFromErrno(BsddbError); - else - PyErr_SetObject(PyExc_KeyError, key); - return NULL; - } - - result = PyString_FromStringAndSize(data, (int)drec.size); - if (data != buf) free(data); - return result; -} - -static int -bsddb_ass_sub(bsddbobject *dp, PyObject *key, PyObject *value) -{ - int status; - DBT krec, drec; - char *data; - int size; - recno_t recno; - - if (dp->di_type == DB_RECNO) { - if (!PyArg_Parse(key, "i", &recno)) { - PyErr_SetString(PyExc_TypeError, - "bsddb key type must be integer"); - return -1; - } - krec.data = &recno; - krec.size = sizeof(recno); - } - else { - if (!PyArg_Parse(key, "s#", &data, &size)) { - PyErr_SetString(PyExc_TypeError, - "bsddb key type must be string"); - return -1; - } - krec.data = data; - krec.size = size; - } - check_bsddbobject_open(dp, -1); - dp->di_size = -1; - if (value == NULL) { - BSDDB_BGN_SAVE(dp) - status = (dp->di_bsddb->del)(dp->di_bsddb, &krec, 0); - BSDDB_END_SAVE(dp) - } - else { - if (!PyArg_Parse(value, "s#", &data, &size)) { - PyErr_SetString(PyExc_TypeError, - "bsddb value type must be string"); - return -1; - } - drec.data = data; - drec.size = size; - BSDDB_BGN_SAVE(dp) - status = (dp->di_bsddb->put)(dp->di_bsddb, &krec, &drec, 0); - BSDDB_END_SAVE(dp) - } - if (status != 0) { - if (status < 0) - PyErr_SetFromErrno(BsddbError); - else - PyErr_SetObject(PyExc_KeyError, key); - return -1; - } - return 0; -} - -static PyMappingMethods bsddb_as_mapping = { - (lenfunc)bsddb_length, /*mp_length*/ - (binaryfunc)bsddb_subscript, /*mp_subscript*/ - (objobjargproc)bsddb_ass_sub, /*mp_ass_subscript*/ -}; - -static PyObject * -bsddb_close(bsddbobject *dp) -{ - if (dp->di_bsddb != NULL) { - int status; - BSDDB_BGN_SAVE(dp) - status = (dp->di_bsddb->close)(dp->di_bsddb); - BSDDB_END_SAVE(dp) - if (status != 0) { - dp->di_bsddb = NULL; - PyErr_SetFromErrno(BsddbError); - return NULL; - } - } - dp->di_bsddb = NULL; - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -bsddb_keys(bsddbobject *dp) -{ - PyObject *list, *item=NULL; - DBT krec, drec; - char *data=NULL,buf[4096]; - int status; - int err; - - check_bsddbobject_open(dp, NULL); - list = PyList_New(0); - if (list == NULL) - return NULL; - BSDDB_BGN_SAVE(dp) - status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_FIRST); - if (status == 0) { - if (krec.size > sizeof(buf)) data = malloc(krec.size); - else data = buf; - if (data != NULL) memcpy(data,krec.data,krec.size); - } - BSDDB_END_SAVE(dp) - if (status == 0 && data==NULL) return PyErr_NoMemory(); - while (status == 0) { - if (dp->di_type == DB_RECNO) - item = PyInt_FromLong(*((int*)data)); - else - item = PyString_FromStringAndSize(data, - (int)krec.size); - if (data != buf) free(data); - if (item == NULL) { - Py_DECREF(list); - return NULL; - } - err = PyList_Append(list, item); - Py_DECREF(item); - if (err != 0) { - Py_DECREF(list); - return NULL; - } - BSDDB_BGN_SAVE(dp) - status = (dp->di_bsddb->seq) - (dp->di_bsddb, &krec, &drec, R_NEXT); - if (status == 0) { - if (krec.size > sizeof(buf)) - data = malloc(krec.size); - else data = buf; - if (data != NULL) - memcpy(data,krec.data,krec.size); - } - BSDDB_END_SAVE(dp) - if (data == NULL) return PyErr_NoMemory(); - } - if (status < 0) { - PyErr_SetFromErrno(BsddbError); - Py_DECREF(list); - return NULL; - } - if (dp->di_size < 0) - dp->di_size = PyList_Size(list); /* We just did the work */ - return list; -} - -static PyObject * -bsddb_has_key(bsddbobject *dp, PyObject *args) -{ - DBT krec, drec; - int status; - char *data; - int size; - recno_t recno; - - if (dp->di_type == DB_RECNO) { - if (!PyArg_ParseTuple(args, "i;key type must be integer", - &recno)) { - return NULL; - } - krec.data = &recno; - krec.size = sizeof(recno); - } - else { - if (!PyArg_ParseTuple(args, "s#;key type must be string", - &data, &size)) { - return NULL; - } - krec.data = data; - krec.size = size; - } - check_bsddbobject_open(dp, NULL); - - BSDDB_BGN_SAVE(dp) - status = (dp->di_bsddb->get)(dp->di_bsddb, &krec, &drec, 0); - BSDDB_END_SAVE(dp) - if (status < 0) { - PyErr_SetFromErrno(BsddbError); - return NULL; - } - - return PyInt_FromLong(status == 0); -} - -static PyObject * -bsddb_set_location(bsddbobject *dp, PyObject *key) -{ - int status; - DBT krec, drec; - char *data = NULL; - char buf[4096]; - int size; - PyObject *result; - recno_t recno; - - if (dp->di_type == DB_RECNO) { - if (!PyArg_ParseTuple(key, "i;key type must be integer", - &recno)) { - return NULL; - } - krec.data = &recno; - krec.size = sizeof(recno); - } - else { - if (!PyArg_ParseTuple(key, "s#;key type must be string", - &data, &size)) { - return NULL; - } - krec.data = data; - krec.size = size; - } - check_bsddbobject_open(dp, NULL); - - BSDDB_BGN_SAVE(dp) - status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_CURSOR); - if (status == 0) { - if (drec.size > sizeof(buf)) data = malloc(drec.size); - else data = buf; - if (data!=NULL) memcpy(data,drec.data,drec.size); - } - BSDDB_END_SAVE(dp) - if (data==NULL) return PyErr_NoMemory(); - if (status != 0) { - if (status < 0) - PyErr_SetFromErrno(BsddbError); - else - PyErr_SetObject(PyExc_KeyError, key); - return NULL; - } - - if (dp->di_type == DB_RECNO) - result = Py_BuildValue("is#", *((int*)krec.data), - data, drec.size); - else - result = Py_BuildValue("s#s#", krec.data, krec.size, - data, drec.size); - if (data != buf) free(data); - return result; -} - -static PyObject * -bsddb_seq(bsddbobject *dp, int sequence_request) -{ - int status; - DBT krec, drec; - char *kdata=NULL,kbuf[4096]; - char *ddata=NULL,dbuf[4096]; - PyObject *result; - - check_bsddbobject_open(dp, NULL); - krec.data = 0; - krec.size = 0; - - BSDDB_BGN_SAVE(dp) - status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, - &drec, sequence_request); - if (status == 0) { - if (krec.size > sizeof(kbuf)) kdata = malloc(krec.size); - else kdata = kbuf; - if (kdata != NULL) memcpy(kdata,krec.data,krec.size); - if (drec.size > sizeof(dbuf)) ddata = malloc(drec.size); - else ddata = dbuf; - if (ddata != NULL) memcpy(ddata,drec.data,drec.size); - } - BSDDB_END_SAVE(dp) - if (status == 0) { - if ((kdata == NULL) || (ddata == NULL)) - return PyErr_NoMemory(); - } - else { - /* (status != 0) */ - if (status < 0) - PyErr_SetFromErrno(BsddbError); - else - PyErr_SetString(PyExc_KeyError, "no key/data pairs"); - return NULL; - } - - if (dp->di_type == DB_RECNO) - result = Py_BuildValue("is#", *((int*)kdata), - ddata, drec.size); - else - result = Py_BuildValue("s#s#", kdata, krec.size, - ddata, drec.size); - if (kdata != kbuf) free(kdata); - if (ddata != dbuf) free(ddata); - return result; -} - -static PyObject * -bsddb_next(bsddbobject *dp) -{ - return bsddb_seq(dp, R_NEXT); -} -static PyObject * -bsddb_previous(bsddbobject *dp) -{ - return bsddb_seq(dp, R_PREV); -} -static PyObject * -bsddb_first(bsddbobject *dp) -{ - return bsddb_seq(dp, R_FIRST); -} -static PyObject * -bsddb_last(bsddbobject *dp) -{ - return bsddb_seq(dp, R_LAST); -} -static PyObject * -bsddb_sync(bsddbobject *dp) -{ - int status; - - check_bsddbobject_open(dp, NULL); - BSDDB_BGN_SAVE(dp) - status = (dp->di_bsddb->sync)(dp->di_bsddb, 0); - BSDDB_END_SAVE(dp) - if (status != 0) { - PyErr_SetFromErrno(BsddbError); - return NULL; - } - return PyInt_FromLong(0); -} -static PyMethodDef bsddb_methods[] = { - {"close", (PyCFunction)bsddb_close, METH_NOARGS}, - {"keys", (PyCFunction)bsddb_keys, METH_NOARGS}, - {"has_key", (PyCFunction)bsddb_has_key, METH_VARARGS}, - {"set_location", (PyCFunction)bsddb_set_location, METH_VARARGS}, - {"next", (PyCFunction)bsddb_next, METH_NOARGS}, - {"previous", (PyCFunction)bsddb_previous, METH_NOARGS}, - {"first", (PyCFunction)bsddb_first, METH_NOARGS}, - {"last", (PyCFunction)bsddb_last, METH_NOARGS}, - {"sync", (PyCFunction)bsddb_sync, METH_NOARGS}, - {NULL, NULL} /* sentinel */ -}; - -static PyObject * -bsddb_getattr(PyObject *dp, char *name) -{ - return Py_FindMethod(bsddb_methods, dp, name); -} - -static PyTypeObject Bsddbtype = { - PyObject_HEAD_INIT(NULL) - 0, - "bsddb.bsddb", - sizeof(bsddbobject), - 0, - (destructor)bsddb_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)bsddb_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - &bsddb_as_mapping, /*tp_as_mapping*/ -}; - -static PyObject * -bsdhashopen(PyObject *self, PyObject *args) -{ - char *file; - char *flag = NULL; - int flags = O_RDONLY; - int mode = 0666; - int bsize = 0; - int ffactor = 0; - int nelem = 0; - int cachesize = 0; - int hash = 0; /* XXX currently ignored */ - int lorder = 0; - - if (!PyArg_ParseTuple(args, "z|siiiiiii:hashopen", - &file, &flag, &mode, - &bsize, &ffactor, &nelem, &cachesize, - &hash, &lorder)) - return NULL; - if (flag != NULL) { - /* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */ - if (flag[0] == 'r') - flags = O_RDONLY; - else if (flag[0] == 'w') - flags = O_RDWR; - else if (flag[0] == 'c') - flags = O_RDWR|O_CREAT; - else if (flag[0] == 'n') - flags = O_RDWR|O_CREAT|O_TRUNC; - else { - PyErr_SetString(BsddbError, - "Flag should begin with 'r', 'w', 'c' or 'n'"); - return NULL; - } - if (flag[1] == 'l') { -#if defined(O_EXLOCK) && defined(O_SHLOCK) - if (flag[0] == 'r') - flags |= O_SHLOCK; - else - flags |= O_EXLOCK; -#else - PyErr_SetString(BsddbError, - "locking not supported on this platform"); - return NULL; -#endif - } - } - return newdbhashobject(file, flags, mode, - bsize, ffactor, nelem, cachesize, hash, lorder); -} - -static PyObject * -bsdbtopen(PyObject *self, PyObject *args) -{ - char *file; - char *flag = NULL; - int flags = O_RDONLY; - int mode = 0666; - int cachesize = 0; - int maxkeypage = 0; - int minkeypage = 0; - int btflags = 0; - unsigned int psize = 0; - int lorder = 0; - - if (!PyArg_ParseTuple(args, "z|siiiiiii:btopen", - &file, &flag, &mode, - &btflags, &cachesize, &maxkeypage, &minkeypage, - &psize, &lorder)) - return NULL; - if (flag != NULL) { - /* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */ - if (flag[0] == 'r') - flags = O_RDONLY; - else if (flag[0] == 'w') - flags = O_RDWR; - else if (flag[0] == 'c') - flags = O_RDWR|O_CREAT; - else if (flag[0] == 'n') - flags = O_RDWR|O_CREAT|O_TRUNC; - else { - PyErr_SetString(BsddbError, - "Flag should begin with 'r', 'w', 'c' or 'n'"); - return NULL; - } - if (flag[1] == 'l') { -#if defined(O_EXLOCK) && defined(O_SHLOCK) - if (flag[0] == 'r') - flags |= O_SHLOCK; - else - flags |= O_EXLOCK; -#else - PyErr_SetString(BsddbError, - "locking not supported on this platform"); - return NULL; -#endif - } - } - return newdbbtobject(file, flags, mode, - btflags, cachesize, maxkeypage, minkeypage, - psize, lorder); -} - -static PyObject * -bsdrnopen(PyObject *self, PyObject *args) -{ - char *file; - char *flag = NULL; - int flags = O_RDONLY; - int mode = 0666; - int cachesize = 0; - int rnflags = 0; - unsigned int psize = 0; - int lorder = 0; - size_t reclen = 0; - char *bval = ""; - char *bfname = NULL; - - if (!PyArg_ParseTuple(args, "z|siiiiiiss:rnopen", - &file, &flag, &mode, - &rnflags, &cachesize, &psize, &lorder, - &reclen, &bval, &bfname)) - return NULL; - - if (flag != NULL) { - /* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */ - if (flag[0] == 'r') - flags = O_RDONLY; - else if (flag[0] == 'w') - flags = O_RDWR; - else if (flag[0] == 'c') - flags = O_RDWR|O_CREAT; - else if (flag[0] == 'n') - flags = O_RDWR|O_CREAT|O_TRUNC; - else { - PyErr_SetString(BsddbError, - "Flag should begin with 'r', 'w', 'c' or 'n'"); - return NULL; - } - if (flag[1] == 'l') { -#if defined(O_EXLOCK) && defined(O_SHLOCK) - if (flag[0] == 'r') - flags |= O_SHLOCK; - else - flags |= O_EXLOCK; -#else - PyErr_SetString(BsddbError, - "locking not supported on this platform"); - return NULL; -#endif - } - else if (flag[1] != '\0') { - PyErr_SetString(BsddbError, - "Flag char 2 should be 'l' or absent"); - return NULL; - } - } - return newdbrnobject(file, flags, mode, rnflags, cachesize, - psize, lorder, reclen, bval[0], bfname); -} - -static PyMethodDef bsddbmodule_methods[] = { - {"hashopen", (PyCFunction)bsdhashopen, METH_VARARGS}, - {"btopen", (PyCFunction)bsdbtopen, METH_VARARGS}, - {"rnopen", (PyCFunction)bsdrnopen, METH_VARARGS}, - /* strictly for use by dbhhash!!! */ - {"open", (PyCFunction)bsdhashopen, METH_VARARGS}, - {0, 0}, -}; - -PyMODINIT_FUNC -initbsddb185(void) { - PyObject *m, *d; - - if (PyErr_WarnPy3k("the bsddb185 module has been removed in " - "Python 3.0", 2) < 0) - return; - - Bsddbtype.ob_type = &PyType_Type; - m = Py_InitModule("bsddb185", bsddbmodule_methods); - if (m == NULL) - return; - d = PyModule_GetDict(m); - BsddbError = PyErr_NewException("bsddb.error", NULL, NULL); - if (BsddbError != NULL) - PyDict_SetItemString(d, "error", BsddbError); -} diff --git a/Modules/bz2module.c b/Modules/bz2module.c index a971b3eb015..4795965f433 100644 --- a/Modules/bz2module.c +++ b/Modules/bz2module.c @@ -34,7 +34,7 @@ typedef fpos_t Py_off_t; #error "Large file support, but neither off_t nor fpos_t is large enough." #endif -#define BUF(v) PyString_AS_STRING((PyStringObject *)v) +#define BUF(v) PyBytes_AS_STRING(v) #define MODE_CLOSED 0 #define MODE_READ 1 @@ -75,29 +75,17 @@ typedef fpos_t Py_off_t; #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) -/* Bits in f_newlinetypes */ -#define NEWLINE_UNKNOWN 0 /* No newline seen, yet */ -#define NEWLINE_CR 1 /* \r newline seen */ -#define NEWLINE_LF 2 /* \n newline seen */ -#define NEWLINE_CRLF 4 /* \r\n newline seen */ - /* ===================================================================== */ /* Structure definitions. */ typedef struct { PyObject_HEAD - PyObject *file; + FILE *rawfp; char* f_buf; /* Allocated readahead buffer */ char* f_bufend; /* Points after last occupied position */ char* f_bufptr; /* Current buffer position */ - int f_softspace; /* Flag used by 'print' command */ - - int f_univ_newline; /* Handle any newline convention */ - int f_newlinetypes; /* Types of newlines seen */ - int f_skipnextlf; /* Skip next \n */ - BZFILE *fp; int mode; Py_off_t pos; @@ -222,10 +210,10 @@ Util_NewBufferSize(size_t currentsize) static int Util_GrowBuffer(PyObject **buf) { - size_t size = PyString_GET_SIZE(*buf); + size_t size = PyBytes_GET_SIZE(*buf); size_t new_size = Util_NewBufferSize(size); if (new_size > size) { - return _PyString_Resize(buf, new_size); + return _PyBytes_Resize(buf, new_size); } else { /* overflow */ PyErr_SetString(PyExc_OverflowError, "Unable to allocate buffer - output too large"); @@ -245,12 +233,9 @@ Util_GetLine(BZ2FileObject *f, int n) PyObject *v; int bzerror; int bytes_read; - int newlinetypes = f->f_newlinetypes; - int skipnextlf = f->f_skipnextlf; - int univ_newline = f->f_univ_newline; total_v_size = n > 0 ? n : 100; - v = PyString_FromStringAndSize((char *)NULL, total_v_size); + v = PyBytes_FromStringAndSize((char *)NULL, total_v_size); if (v == NULL) return NULL; @@ -259,40 +244,14 @@ Util_GetLine(BZ2FileObject *f, int n) for (;;) { Py_BEGIN_ALLOW_THREADS - while (buf != end) { + do { bytes_read = BZ2_bzRead(&bzerror, f->fp, &c, 1); f->pos++; - if (bytes_read == 0) break; - if (univ_newline) { - if (skipnextlf) { - skipnextlf = 0; - if (c == '\n') { - /* Seeing a \n here with skipnextlf true means we - * saw a \r before. - */ - newlinetypes |= NEWLINE_CRLF; - if (bzerror != BZ_OK) break; - bytes_read = BZ2_bzRead(&bzerror, f->fp, &c, 1); - f->pos++; - if (bytes_read == 0) break; - } else { - newlinetypes |= NEWLINE_CR; - } - } - if (c == '\r') { - skipnextlf = 1; - c = '\n'; - } else if (c == '\n') - newlinetypes |= NEWLINE_LF; - } + if (bytes_read == 0) + break; *buf++ = c; - if (bzerror != BZ_OK || c == '\n') break; - } - if (univ_newline && bzerror == BZ_STREAM_END && skipnextlf) - newlinetypes |= NEWLINE_CR; + } while (bzerror == BZ_OK && c != '\n' && buf != end); Py_END_ALLOW_THREADS - f->f_newlinetypes = newlinetypes; - f->f_skipnextlf = skipnextlf; if (bzerror == BZ_STREAM_END) { f->size = f->pos; f->mode = MODE_READ_EOF; @@ -316,84 +275,20 @@ Util_GetLine(BZ2FileObject *f, int n) Py_DECREF(v); return NULL; } - if (_PyString_Resize(&v, total_v_size) < 0) + if (_PyBytes_Resize(&v, total_v_size) < 0) { return NULL; + } buf = BUF(v) + used_v_size; end = BUF(v) + total_v_size; } used_v_size = buf - BUF(v); - if (used_v_size != total_v_size) - _PyString_Resize(&v, used_v_size); - return v; -} - -/* This is a hacked version of Python's - * fileobject.c:Py_UniversalNewlineFread(). */ -size_t -Util_UnivNewlineRead(int *bzerror, BZFILE *stream, - char* buf, size_t n, BZ2FileObject *f) -{ - char *dst = buf; - int newlinetypes, skipnextlf; - - assert(buf != NULL); - assert(stream != NULL); - - if (!f->f_univ_newline) - return BZ2_bzRead(bzerror, stream, buf, n); - - newlinetypes = f->f_newlinetypes; - skipnextlf = f->f_skipnextlf; - - /* Invariant: n is the number of bytes remaining to be filled - * in the buffer. - */ - while (n) { - size_t nread; - int shortread; - char *src = dst; - - nread = BZ2_bzRead(bzerror, stream, dst, n); - assert(nread <= n); - n -= nread; /* assuming 1 byte out for each in; will adjust */ - shortread = n != 0; /* true iff EOF or error */ - while (nread--) { - char c = *src++; - if (c == '\r') { - /* Save as LF and set flag to skip next LF. */ - *dst++ = '\n'; - skipnextlf = 1; - } - else if (skipnextlf && c == '\n') { - /* Skip LF, and remember we saw CR LF. */ - skipnextlf = 0; - newlinetypes |= NEWLINE_CRLF; - ++n; - } - else { - /* Normal char to be stored in buffer. Also - * update the newlinetypes flag if either this - * is an LF or the previous char was a CR. - */ - if (c == '\n') - newlinetypes |= NEWLINE_LF; - else if (skipnextlf) - newlinetypes |= NEWLINE_CR; - *dst++ = c; - skipnextlf = 0; - } - } - if (shortread) { - /* If this is EOF, update type flags. */ - if (skipnextlf && *bzerror == BZ_STREAM_END) - newlinetypes |= NEWLINE_CR; - break; + if (used_v_size != total_v_size) { + if (_PyBytes_Resize(&v, used_v_size) < 0) { + v = NULL; } } - f->f_newlinetypes = newlinetypes; - f->f_skipnextlf = skipnextlf; - return dst - buf; + return v; } /* This is a hacked version of Python's fileobject.c:drop_readahead(). */ @@ -429,8 +324,7 @@ Util_ReadAhead(BZ2FileObject *f, int bufsize) return -1; } Py_BEGIN_ALLOW_THREADS - chunksize = Util_UnivNewlineRead(&bzerror, f->fp, f->f_buf, - bufsize, f); + chunksize = BZ2_bzRead(&bzerror, f->fp, f->f_buf, bufsize); Py_END_ALLOW_THREADS f->pos += chunksize; if (bzerror == BZ_STREAM_END) { @@ -448,10 +342,10 @@ Util_ReadAhead(BZ2FileObject *f, int bufsize) /* This is a hacked version of Python's * fileobject.c:readahead_get_line_skip(). */ -static PyStringObject * +static PyBytesObject * Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize) { - PyStringObject* s; + PyBytesObject* s; char *bufptr; char *buf; int len; @@ -462,17 +356,17 @@ Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize) len = f->f_bufend - f->f_bufptr; if (len == 0) - return (PyStringObject *) - PyString_FromStringAndSize(NULL, skip); + return (PyBytesObject *) + PyBytes_FromStringAndSize(NULL, skip); bufptr = memchr(f->f_bufptr, '\n', len); if (bufptr != NULL) { bufptr++; /* Count the '\n' */ len = bufptr - f->f_bufptr; - s = (PyStringObject *) - PyString_FromStringAndSize(NULL, skip+len); + s = (PyBytesObject *) + PyBytes_FromStringAndSize(NULL, skip+len); if (s == NULL) return NULL; - memcpy(PyString_AS_STRING(s)+skip, f->f_bufptr, len); + memcpy(PyBytes_AS_STRING(s)+skip, f->f_bufptr, len); f->f_bufptr = bufptr; if (bufptr == f->f_bufend) Util_DropReadAhead(f); @@ -486,7 +380,7 @@ Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize) PyMem_Free(buf); return NULL; } - memcpy(PyString_AS_STRING(s)+skip, bufptr, len); + memcpy(PyBytes_AS_STRING(s)+skip, bufptr, len); PyMem_Free(buf); } return s; @@ -519,7 +413,7 @@ BZ2File_read(BZ2FileObject *self, PyObject *args) case MODE_READ: break; case MODE_READ_EOF: - ret = PyString_FromString(""); + ret = PyBytes_FromStringAndSize("", 0); goto cleanup; case MODE_CLOSED: PyErr_SetString(PyExc_ValueError, @@ -545,17 +439,16 @@ BZ2File_read(BZ2FileObject *self, PyObject *args) "more than a Python string can hold"); goto cleanup; } - ret = PyString_FromStringAndSize((char *)NULL, buffersize); - if (ret == NULL) + ret = PyBytes_FromStringAndSize((char *)NULL, buffersize); + if (ret == NULL || buffersize == 0) goto cleanup; bytesread = 0; for (;;) { Py_BEGIN_ALLOW_THREADS - chunksize = Util_UnivNewlineRead(&bzerror, self->fp, - BUF(ret)+bytesread, - buffersize-bytesread, - self); + chunksize = BZ2_bzRead(&bzerror, self->fp, + BUF(ret)+bytesread, + buffersize-bytesread); self->pos += chunksize; Py_END_ALLOW_THREADS bytesread += chunksize; @@ -571,14 +464,19 @@ BZ2File_read(BZ2FileObject *self, PyObject *args) } if (bytesrequested < 0) { buffersize = Util_NewBufferSize(buffersize); - if (_PyString_Resize(&ret, buffersize) < 0) + if (_PyBytes_Resize(&ret, buffersize) < 0) { + ret = NULL; goto cleanup; + } } else { break; } } - if (bytesread != buffersize) - _PyString_Resize(&ret, bytesread); + if (bytesread != buffersize) { + if (_PyBytes_Resize(&ret, bytesread) < 0) { + ret = NULL; + } + } cleanup: RELEASE_LOCK(self); @@ -608,7 +506,7 @@ BZ2File_readline(BZ2FileObject *self, PyObject *args) case MODE_READ: break; case MODE_READ_EOF: - ret = PyString_FromString(""); + ret = PyBytes_FromStringAndSize("", 0); goto cleanup; case MODE_CLOSED: PyErr_SetString(PyExc_ValueError, @@ -625,7 +523,7 @@ BZ2File_readline(BZ2FileObject *self, PyObject *args) goto cleanup; if (sizehint == 0) - ret = PyString_FromString(""); + ret = PyBytes_FromStringAndSize("", 0); else ret = Util_GetLine(self, (sizehint < 0) ? 0 : sizehint); @@ -690,9 +588,8 @@ BZ2File_readlines(BZ2FileObject *self, PyObject *args) for (;;) { Py_BEGIN_ALLOW_THREADS - nread = Util_UnivNewlineRead(&bzerror, self->fp, - buffer+nfilled, - buffersize-nfilled, self); + nread = BZ2_bzRead(&bzerror, self->fp, + buffer+nfilled, buffersize-nfilled); self->pos += nread; Py_END_ALLOW_THREADS if (bzerror == BZ_STREAM_END) { @@ -723,17 +620,20 @@ BZ2File_readlines(BZ2FileObject *self, PyObject *args) } if (big_buffer == NULL) { /* Create the big buffer */ - big_buffer = PyString_FromStringAndSize( + big_buffer = PyBytes_FromStringAndSize( NULL, buffersize); if (big_buffer == NULL) goto error; - buffer = PyString_AS_STRING(big_buffer); + buffer = PyBytes_AS_STRING(big_buffer); memcpy(buffer, small_buffer, nfilled); } else { /* Grow the big buffer */ - _PyString_Resize(&big_buffer, buffersize); - buffer = PyString_AS_STRING(big_buffer); + if (_PyBytes_Resize(&big_buffer, buffersize) < 0){ + big_buffer = NULL; + goto error; + } + buffer = PyBytes_AS_STRING(big_buffer); } continue; } @@ -742,7 +642,7 @@ BZ2File_readlines(BZ2FileObject *self, PyObject *args) while (p != NULL) { /* Process complete lines */ p++; - line = PyString_FromStringAndSize(q, p-q); + line = PyBytes_FromStringAndSize(q, p-q); if (line == NULL) goto error; err = PyList_Append(list, line); @@ -765,7 +665,7 @@ BZ2File_readlines(BZ2FileObject *self, PyObject *args) } if (nfilled != 0) { /* Partial last line */ - line = PyString_FromStringAndSize(buffer, nfilled); + line = PyBytes_FromStringAndSize(buffer, nfilled); if (line == NULL) goto error; if (sizehint > 0) { @@ -775,7 +675,7 @@ BZ2File_readlines(BZ2FileObject *self, PyObject *args) Py_DECREF(line); goto error; } - PyString_Concat(&line, rest); + PyBytes_Concat(&line, rest); Py_DECREF(rest); if (line == NULL) goto error; @@ -794,13 +694,6 @@ BZ2File_readlines(BZ2FileObject *self, PyObject *args) return list; } -PyDoc_STRVAR(BZ2File_xreadlines__doc__, -"xreadlines() -> self\n\ -\n\ -For backward compatibility. BZ2File objects now include the performance\n\ -optimizations previously implemented in the xreadlines module.\n\ -"); - PyDoc_STRVAR(BZ2File_write__doc__, "write(data) -> None\n\ \n\ @@ -818,7 +711,7 @@ BZ2File_write(BZ2FileObject *self, PyObject *args) int len; int bzerror; - if (!PyArg_ParseTuple(args, "s*:write", &pbuf)) + if (!PyArg_ParseTuple(args, "y*:write", &pbuf)) return NULL; buf = pbuf.buf; len = pbuf.len; @@ -839,8 +732,6 @@ BZ2File_write(BZ2FileObject *self, PyObject *args) goto cleanup; } - self->f_softspace = 0; - Py_BEGIN_ALLOW_THREADS BZ2_bzWrite (&bzerror, self->fp, buf, len); self->pos += len; @@ -934,14 +825,14 @@ BZ2File_writelines(BZ2FileObject *self, PyObject *seq) if (j == 0) break; - /* Check that all entries are indeed strings. If not, + /* Check that all entries are indeed byte strings. If not, apply the same rules as for file.write() and convert the rets to strings. This is slow, but seems to be the only way since all conversion APIs could potentially execute Python code. */ for (i = 0; i < j; i++) { PyObject *v = PyList_GET_ITEM(list, i); - if (!PyString_Check(v)) { + if (!PyBytes_Check(v)) { const char *buffer; Py_ssize_t len; if (PyObject_AsCharBuffer(v, &buffer, &len)) { @@ -949,10 +840,10 @@ BZ2File_writelines(BZ2FileObject *self, PyObject *seq) "writelines() " "argument must be " "a sequence of " - "strings"); + "bytes objects"); goto error; } - line = PyString_FromStringAndSize(buffer, + line = PyBytes_FromStringAndSize(buffer, len); if (line == NULL) goto error; @@ -961,16 +852,14 @@ BZ2File_writelines(BZ2FileObject *self, PyObject *seq) } } - self->f_softspace = 0; - /* Since we are releasing the global lock, the following code may *not* execute Python code. */ Py_BEGIN_ALLOW_THREADS for (i = 0; i < j; i++) { line = PyList_GET_ITEM(list, i); - len = PyString_GET_SIZE(line); + len = PyBytes_GET_SIZE(line); BZ2_bzWrite (&bzerror, self->fp, - PyString_AS_STRING(line), len); + PyBytes_AS_STRING(line), len); if (bzerror != BZ_OK) { Py_BLOCK_THREADS Util_CatchBZ2Error(bzerror); @@ -1025,10 +914,10 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "O|i:seek", &offobj, &where)) return NULL; #if !defined(HAVE_LARGEFILE_SUPPORT) - offset = PyInt_AsLong(offobj); + offset = PyLong_AsLong(offobj); #else offset = PyLong_Check(offobj) ? - PyLong_AsLongLong(offobj) : PyInt_AsLong(offobj); + PyLong_AsLongLong(offobj) : PyLong_AsLong(offobj); #endif if (PyErr_Occurred()) return NULL; @@ -1056,10 +945,8 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args) assert(self->mode != MODE_READ_EOF); for (;;) { Py_BEGIN_ALLOW_THREADS - chunksize = Util_UnivNewlineRead( - &bzerror, self->fp, - buffer, buffersize, - self); + chunksize = BZ2_bzRead(&bzerror, self->fp, + buffer, buffersize); self->pos += chunksize; Py_END_ALLOW_THREADS @@ -1089,24 +976,14 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args) } else { /* we cannot move back, so rewind the stream */ BZ2_bzReadClose(&bzerror, self->fp); - if (self->fp) { - PyFile_DecUseCount((PyFileObject *)self->file); - self->fp = NULL; - } if (bzerror != BZ_OK) { Util_CatchBZ2Error(bzerror); goto cleanup; } - ret = PyObject_CallMethod(self->file, "seek", "(i)", 0); - if (!ret) - goto cleanup; - Py_DECREF(ret); - ret = NULL; + rewind(self->rawfp); self->pos = 0; - self->fp = BZ2_bzReadOpen(&bzerror, PyFile_AsFile(self->file), + self->fp = BZ2_bzReadOpen(&bzerror, self->rawfp, 0, 0, NULL, 0); - if (self->fp) - PyFile_IncUseCount((PyFileObject *)self->file); if (bzerror != BZ_OK) { Util_CatchBZ2Error(bzerror); goto cleanup; @@ -1128,8 +1005,7 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args) * condition above). buffersize is 8192. */ readsize = (size_t)(offset-bytesread); Py_BEGIN_ALLOW_THREADS - chunksize = Util_UnivNewlineRead(&bzerror, self->fp, - buffer, readsize, self); + chunksize = BZ2_bzRead(&bzerror, self->fp, buffer, readsize); self->pos += chunksize; Py_END_ALLOW_THREADS bytesread += chunksize; @@ -1172,7 +1048,7 @@ BZ2File_tell(BZ2FileObject *self, PyObject *args) } #if !defined(HAVE_LARGEFILE_SUPPORT) - ret = PyInt_FromLong(self->pos); + ret = PyLong_FromLong(self->pos); #else ret = PyLong_FromLongLong(self->pos); #endif @@ -1195,6 +1071,10 @@ BZ2File_close(BZ2FileObject *self) PyObject *ret = NULL; int bzerror = BZ_OK; + if (self->mode == MODE_CLOSED) { + Py_RETURN_NONE; + } + ACQUIRE_LOCK(self); switch (self->mode) { case MODE_READ: @@ -1206,16 +1086,15 @@ BZ2File_close(BZ2FileObject *self) 0, NULL, NULL); break; } - if (self->fp) { - PyFile_DecUseCount((PyFileObject *)self->file); - self->fp = NULL; - } self->mode = MODE_CLOSED; - ret = PyObject_CallMethod(self->file, "close", NULL); - if (bzerror != BZ_OK) { + fclose(self->rawfp); + self->rawfp = NULL; + if (bzerror == BZ_OK) { + Py_INCREF(Py_None); + ret = Py_None; + } + else { Util_CatchBZ2Error(bzerror); - Py_XDECREF(ret); - ret = NULL; } RELEASE_LOCK(self); @@ -1258,7 +1137,6 @@ static PyMethodDef BZ2File_methods[] = { {"read", (PyCFunction)BZ2File_read, METH_VARARGS, BZ2File_read__doc__}, {"readline", (PyCFunction)BZ2File_readline, METH_VARARGS, BZ2File_readline__doc__}, {"readlines", (PyCFunction)BZ2File_readlines, METH_VARARGS, BZ2File_readlines__doc__}, - {"xreadlines", (PyCFunction)BZ2File_getiter, METH_VARARGS, BZ2File_xreadlines__doc__}, {"write", (PyCFunction)BZ2File_write, METH_VARARGS, BZ2File_write__doc__}, {"writelines", (PyCFunction)BZ2File_writelines, METH_O, BZ2File_writelines__doc__}, {"seek", (PyCFunction)BZ2File_seek, METH_VARARGS, BZ2File_seek__doc__}, @@ -1273,88 +1151,29 @@ static PyMethodDef BZ2File_methods[] = { /* ===================================================================== */ /* Getters and setters of BZ2File. */ -/* This is a hacked version of Python's fileobject.c:get_newlines(). */ -static PyObject * -BZ2File_get_newlines(BZ2FileObject *self, void *closure) -{ - switch (self->f_newlinetypes) { - case NEWLINE_UNKNOWN: - Py_INCREF(Py_None); - return Py_None; - case NEWLINE_CR: - return PyString_FromString("\r"); - case NEWLINE_LF: - return PyString_FromString("\n"); - case NEWLINE_CR|NEWLINE_LF: - return Py_BuildValue("(ss)", "\r", "\n"); - case NEWLINE_CRLF: - return PyString_FromString("\r\n"); - case NEWLINE_CR|NEWLINE_CRLF: - return Py_BuildValue("(ss)", "\r", "\r\n"); - case NEWLINE_LF|NEWLINE_CRLF: - return Py_BuildValue("(ss)", "\n", "\r\n"); - case NEWLINE_CR|NEWLINE_LF|NEWLINE_CRLF: - return Py_BuildValue("(sss)", "\r", "\n", "\r\n"); - default: - PyErr_Format(PyExc_SystemError, - "Unknown newlines value 0x%x\n", - self->f_newlinetypes); - return NULL; - } -} - static PyObject * BZ2File_get_closed(BZ2FileObject *self, void *closure) { - return PyInt_FromLong(self->mode == MODE_CLOSED); -} - -static PyObject * -BZ2File_get_mode(BZ2FileObject *self, void *closure) -{ - return PyObject_GetAttrString(self->file, "mode"); -} - -static PyObject * -BZ2File_get_name(BZ2FileObject *self, void *closure) -{ - return PyObject_GetAttrString(self->file, "name"); + return PyLong_FromLong(self->mode == MODE_CLOSED); } static PyGetSetDef BZ2File_getset[] = { {"closed", (getter)BZ2File_get_closed, NULL, "True if the file is closed"}, - {"newlines", (getter)BZ2File_get_newlines, NULL, - "end-of-line convention used in this file"}, - {"mode", (getter)BZ2File_get_mode, NULL, - "file mode ('r', 'w', or 'U')"}, - {"name", (getter)BZ2File_get_name, NULL, - "file name"}, {NULL} /* Sentinel */ }; /* ===================================================================== */ -/* Members of BZ2File_Type. */ - -#undef OFF -#define OFF(x) offsetof(BZ2FileObject, x) - -static PyMemberDef BZ2File_members[] = { - {"softspace", T_INT, OFF(f_softspace), 0, - "flag indicating that a space needs to be printed; used by print"}, - {NULL} /* Sentinel */ -}; - -/* ===================================================================== */ /* Slot definitions for BZ2File_Type. */ static int BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs) { static char *kwlist[] = {"filename", "mode", "buffering", - "compresslevel", 0}; - PyObject *name; + "compresslevel", 0}; + PyObject *name_obj = NULL; + char *name; char *mode = "r"; int buffering = -1; int compresslevel = 9; @@ -1363,14 +1182,17 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs) self->size = -1; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|sii:BZ2File", - kwlist, &name, &mode, &buffering, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|sii:BZ2File", + kwlist, PyUnicode_FSConverter, &name_obj, + &mode, &buffering, &compresslevel)) return -1; + name = PyBytes_AsString(name_obj); if (compresslevel < 1 || compresslevel > 9) { PyErr_SetString(PyExc_ValueError, "compresslevel must be between 1 and 9"); + Py_DECREF(name_obj); return -1; } @@ -1387,14 +1209,6 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs) case 'b': break; - case 'U': -#ifdef __VMS - self->f_univ_newline = 0; -#else - self->f_univ_newline = 1; -#endif - break; - default: error = 1; break; @@ -1402,6 +1216,7 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs) if (error) { PyErr_Format(PyExc_ValueError, "invalid mode char %c", *mode); + Py_DECREF(name_obj); return -1; } mode++; @@ -1415,10 +1230,13 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs) mode = (mode_char == 'r') ? "rb" : "wb"; - self->file = PyObject_CallFunction((PyObject*)&PyFile_Type, "(Osi)", - name, mode, buffering); - if (self->file == NULL) + self->rawfp = fopen(name, mode); + Py_DECREF(name_obj); + if (self->rawfp == NULL) { + PyErr_SetFromErrno(PyExc_IOError); return -1; + } + /* XXX Ignore buffering */ /* From now on, we have stuff to dealloc, so jump to error label * instead of returning */ @@ -1432,26 +1250,24 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs) #endif if (mode_char == 'r') - self->fp = BZ2_bzReadOpen(&bzerror, - PyFile_AsFile(self->file), + self->fp = BZ2_bzReadOpen(&bzerror, self->rawfp, 0, 0, NULL, 0); else - self->fp = BZ2_bzWriteOpen(&bzerror, - PyFile_AsFile(self->file), + self->fp = BZ2_bzWriteOpen(&bzerror, self->rawfp, compresslevel, 0, 0); if (bzerror != BZ_OK) { Util_CatchBZ2Error(bzerror); goto error; } - PyFile_IncUseCount((PyFileObject *)self->file); self->mode = (mode_char == 'r') ? MODE_READ : MODE_WRITE; return 0; error: - Py_CLEAR(self->file); + fclose(self->rawfp); + self->rawfp = NULL; #ifdef WITH_THREAD if (self->lock) { PyThread_free_lock(self->lock); @@ -1479,12 +1295,9 @@ BZ2File_dealloc(BZ2FileObject *self) 0, NULL, NULL); break; } - if (self->fp) { - PyFile_DecUseCount((PyFileObject *)self->file); - self->fp = NULL; - } Util_DropReadAhead(self); - Py_XDECREF(self->file); + if (self->rawfp != NULL) + fclose(self->rawfp); Py_TYPE(self)->tp_free((PyObject *)self); } @@ -1506,7 +1319,7 @@ BZ2File_getiter(BZ2FileObject *self) static PyObject * BZ2File_iternext(BZ2FileObject *self) { - PyStringObject* ret; + PyBytesObject* ret; ACQUIRE_LOCK(self); if (self->mode == MODE_CLOSED) { RELEASE_LOCK(self); @@ -1516,7 +1329,7 @@ BZ2File_iternext(BZ2FileObject *self) } ret = Util_ReadAheadGetLineSkip(self, 0, READAHEAD_BUFSIZE); RELEASE_LOCK(self); - if (ret == NULL || PyString_GET_SIZE(ret) == 0) { + if (ret == NULL || PyBytes_GET_SIZE(ret) == 0) { Py_XDECREF(ret); return NULL; } @@ -1535,17 +1348,8 @@ writing. When opened for writing, the file will be created if it doesn't\n\ exist, and truncated otherwise. If the buffering argument is given, 0 means\n\ unbuffered, and larger numbers specify the buffer size. If compresslevel\n\ is given, must be a number between 1 and 9.\n\ -") -PyDoc_STR( -"\n\ -Add a 'U' to mode to open the file for input with universal newline\n\ -support. Any line ending in the input file will be seen as a '\\n' in\n\ -Python. Also, a file so opened gains the attribute 'newlines'; the value\n\ -for this attribute is one of None (no newline read yet), '\\r', '\\n',\n\ -'\\r\\n' or a tuple containing all the newline types seen. Universal\n\ -newlines are available only when reading.\n\ -") -; +Data read is always returned in bytes; data written ought to be bytes.\n\ +"); static PyTypeObject BZ2File_Type = { PyVarObject_HEAD_INIT(NULL, 0) @@ -1556,7 +1360,7 @@ static PyTypeObject BZ2File_Type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -1576,7 +1380,7 @@ static PyTypeObject BZ2File_Type = { (getiterfunc)BZ2File_getiter, /*tp_iter*/ (iternextfunc)BZ2File_iternext, /*tp_iternext*/ BZ2File_methods, /*tp_methods*/ - BZ2File_members, /*tp_members*/ + 0, /*tp_members*/ BZ2File_getset, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ @@ -1586,7 +1390,7 @@ static PyTypeObject BZ2File_Type = { (initproc)BZ2File_init, /*tp_init*/ PyType_GenericAlloc, /*tp_alloc*/ PyType_GenericNew, /*tp_new*/ - _PyObject_Del, /*tp_free*/ + PyObject_Free, /*tp_free*/ 0, /*tp_is_gc*/ }; @@ -1613,12 +1417,12 @@ BZ2Comp_compress(BZ2CompObject *self, PyObject *args) bz_stream *bzs = &self->bzs; int bzerror; - if (!PyArg_ParseTuple(args, "s*:compress", &pdata)) + if (!PyArg_ParseTuple(args, "y*:compress", &pdata)) return NULL; if (pdata.len == 0) { PyBuffer_Release(&pdata); - return PyString_FromString(""); + return PyBytes_FromStringAndSize("", 0); } ACQUIRE_LOCK(self); @@ -1628,7 +1432,7 @@ BZ2Comp_compress(BZ2CompObject *self, PyObject *args) goto error; } - ret = PyString_FromStringAndSize(NULL, SMALLCHUNK); + ret = PyBytes_FromStringAndSize(NULL, SMALLCHUNK); if (!ret) goto error; @@ -1637,7 +1441,7 @@ BZ2Comp_compress(BZ2CompObject *self, PyObject *args) input_left = pdata.len - bzs->avail_in; bzs->next_out = BUF(ret); - bzs->avail_out = PyString_GET_SIZE(ret); + bzs->avail_out = PyBytes_GET_SIZE(ret); for (;;) { char *saved_next_out; @@ -1659,20 +1463,20 @@ BZ2Comp_compress(BZ2CompObject *self, PyObject *args) input_left -= bzs->avail_in; } if (bzs->avail_out == 0) { - size_t buffer_left = PyString_GET_SIZE(ret) - output_size; + size_t buffer_left = PyBytes_GET_SIZE(ret) - output_size; if (buffer_left == 0) { if (Util_GrowBuffer(&ret) < 0) { BZ2_bzCompressEnd(bzs); goto error; } bzs->next_out = BUF(ret) + output_size; - buffer_left = PyString_GET_SIZE(ret) - output_size; + buffer_left = PyBytes_GET_SIZE(ret) - output_size; } bzs->avail_out = MIN(buffer_left, UINT_MAX); } } - if (_PyString_Resize(&ret, output_size) < 0) + if (_PyBytes_Resize(&ret, output_size) < 0) goto error; RELEASE_LOCK(self); @@ -1708,12 +1512,12 @@ BZ2Comp_flush(BZ2CompObject *self) } self->running = 0; - ret = PyString_FromStringAndSize(NULL, SMALLCHUNK); + ret = PyBytes_FromStringAndSize(NULL, SMALLCHUNK); if (!ret) goto error; bzs->next_out = BUF(ret); - bzs->avail_out = PyString_GET_SIZE(ret); + bzs->avail_out = PyBytes_GET_SIZE(ret); for (;;) { char *saved_next_out; @@ -1731,19 +1535,19 @@ BZ2Comp_flush(BZ2CompObject *self) goto error; } if (bzs->avail_out == 0) { - size_t buffer_left = PyString_GET_SIZE(ret) - output_size; + size_t buffer_left = PyBytes_GET_SIZE(ret) - output_size; if (buffer_left == 0) { if (Util_GrowBuffer(&ret) < 0) goto error; bzs->next_out = BUF(ret) + output_size; - buffer_left = PyString_GET_SIZE(ret) - output_size; + buffer_left = PyBytes_GET_SIZE(ret) - output_size; } bzs->avail_out = MIN(buffer_left, UINT_MAX); } } - if (output_size != PyString_GET_SIZE(ret)) - if (_PyString_Resize(&ret, output_size) < 0) + if (output_size != PyBytes_GET_SIZE(ret)) + if (_PyBytes_Resize(&ret, output_size) < 0) goto error; RELEASE_LOCK(self); @@ -1845,7 +1649,7 @@ static PyTypeObject BZ2Comp_Type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -1875,7 +1679,7 @@ static PyTypeObject BZ2Comp_Type = { (initproc)BZ2Comp_init, /*tp_init*/ PyType_GenericAlloc, /*tp_alloc*/ PyType_GenericNew, /*tp_new*/ - _PyObject_Del, /*tp_free*/ + PyObject_Free, /*tp_free*/ 0, /*tp_is_gc*/ }; @@ -1887,7 +1691,7 @@ static PyTypeObject BZ2Comp_Type = { #define OFF(x) offsetof(BZ2DecompObject, x) static PyMemberDef BZ2Decomp_members[] = { - {"unused_data", T_OBJECT, OFF(unused_data), RO}, + {"unused_data", T_OBJECT, OFF(unused_data), READONLY}, {NULL} /* Sentinel */ }; @@ -1915,7 +1719,7 @@ BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args) bz_stream *bzs = &self->bzs; int bzerror; - if (!PyArg_ParseTuple(args, "s*:decompress", &pdata)) + if (!PyArg_ParseTuple(args, "y*:decompress", &pdata)) return NULL; ACQUIRE_LOCK(self); @@ -1925,7 +1729,7 @@ BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args) goto error; } - ret = PyString_FromStringAndSize(NULL, SMALLCHUNK); + ret = PyBytes_FromStringAndSize(NULL, SMALLCHUNK); if (!ret) goto error; @@ -1934,7 +1738,7 @@ BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args) input_left = pdata.len - bzs->avail_in; bzs->next_out = BUF(ret); - bzs->avail_out = PyString_GET_SIZE(ret); + bzs->avail_out = PyBytes_GET_SIZE(ret); for (;;) { char *saved_next_out; @@ -1951,7 +1755,7 @@ BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args) if (input_left != 0) { Py_DECREF(self->unused_data); self->unused_data = - PyString_FromStringAndSize(bzs->next_in, input_left); + PyBytes_FromStringAndSize(bzs->next_in, input_left); if (self->unused_data == NULL) goto error; } @@ -1968,21 +1772,21 @@ BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args) input_left -= bzs->avail_in; } if (bzs->avail_out == 0) { - size_t buffer_left = PyString_GET_SIZE(ret) - output_size; + size_t buffer_left = PyBytes_GET_SIZE(ret) - output_size; if (buffer_left == 0) { if (Util_GrowBuffer(&ret) < 0) { BZ2_bzDecompressEnd(bzs); goto error; } bzs->next_out = BUF(ret) + output_size; - buffer_left = PyString_GET_SIZE(ret) - output_size; + buffer_left = PyBytes_GET_SIZE(ret) - output_size; } bzs->avail_out = MIN(buffer_left, UINT_MAX); } } - if (output_size != PyString_GET_SIZE(ret)) - if (_PyString_Resize(&ret, output_size) < 0) + if (output_size != PyBytes_GET_SIZE(ret)) + if (_PyBytes_Resize(&ret, output_size) < 0) goto error; RELEASE_LOCK(self); @@ -2021,7 +1825,7 @@ BZ2Decomp_init(BZ2DecompObject *self, PyObject *args, PyObject *kwargs) } #endif - self->unused_data = PyString_FromString(""); + self->unused_data = PyBytes_FromStringAndSize("", 0); if (!self->unused_data) goto error; @@ -2080,7 +1884,7 @@ static PyTypeObject BZ2Decomp_Type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -2110,7 +1914,7 @@ static PyTypeObject BZ2Decomp_Type = { (initproc)BZ2Decomp_init, /*tp_init*/ PyType_GenericAlloc, /*tp_alloc*/ PyType_GenericNew, /*tp_new*/ - _PyObject_Del, /*tp_free*/ + PyObject_Free, /*tp_free*/ 0, /*tp_is_gc*/ }; @@ -2140,7 +1944,7 @@ bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs) int bzerror; static char *kwlist[] = {"data", "compresslevel", 0}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|i", + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*|i", kwlist, &pdata, &compresslevel)) return NULL; @@ -2152,7 +1956,7 @@ bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } - ret = PyString_FromStringAndSize(NULL, SMALLCHUNK); + ret = PyBytes_FromStringAndSize(NULL, SMALLCHUNK); if (!ret) { PyBuffer_Release(&pdata); return NULL; @@ -2165,7 +1969,7 @@ bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs) input_left = pdata.len - bzs->avail_in; bzs->next_out = BUF(ret); - bzs->avail_out = PyString_GET_SIZE(ret); + bzs->avail_out = PyBytes_GET_SIZE(ret); bzerror = BZ2_bzCompressInit(bzs, compresslevel, 0, 0); if (bzerror != BZ_OK) { @@ -2204,7 +2008,7 @@ bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs) } } if (bzs->avail_out == 0) { - size_t buffer_left = PyString_GET_SIZE(ret) - output_size; + size_t buffer_left = PyBytes_GET_SIZE(ret) - output_size; if (buffer_left == 0) { if (Util_GrowBuffer(&ret) < 0) { BZ2_bzCompressEnd(bzs); @@ -2212,14 +2016,14 @@ bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } bzs->next_out = BUF(ret) + output_size; - buffer_left = PyString_GET_SIZE(ret) - output_size; + buffer_left = PyBytes_GET_SIZE(ret) - output_size; } bzs->avail_out = MIN(buffer_left, UINT_MAX); } } - if (output_size != PyString_GET_SIZE(ret)) - _PyString_Resize(&ret, output_size); /* Sets ret to NULL on failure. */ + if (output_size != PyBytes_GET_SIZE(ret)) + _PyBytes_Resize(&ret, output_size); /* Sets ret to NULL on failure. */ BZ2_bzCompressEnd(bzs); PyBuffer_Release(&pdata); @@ -2244,15 +2048,15 @@ bz2_decompress(PyObject *self, PyObject *args) bz_stream *bzs = &_bzs; int bzerror; - if (!PyArg_ParseTuple(args, "s*:decompress", &pdata)) + if (!PyArg_ParseTuple(args, "y*:decompress", &pdata)) return NULL; if (pdata.len == 0) { PyBuffer_Release(&pdata); - return PyString_FromString(""); + return PyBytes_FromStringAndSize("", 0); } - ret = PyString_FromStringAndSize(NULL, SMALLCHUNK); + ret = PyBytes_FromStringAndSize(NULL, SMALLCHUNK); if (!ret) { PyBuffer_Release(&pdata); return NULL; @@ -2265,7 +2069,7 @@ bz2_decompress(PyObject *self, PyObject *args) input_left = pdata.len - bzs->avail_in; bzs->next_out = BUF(ret); - bzs->avail_out = PyString_GET_SIZE(ret); + bzs->avail_out = PyBytes_GET_SIZE(ret); bzerror = BZ2_bzDecompressInit(bzs, 0, 0); if (bzerror != BZ_OK) { @@ -2306,7 +2110,7 @@ bz2_decompress(PyObject *self, PyObject *args) input_left -= bzs->avail_in; } if (bzs->avail_out == 0) { - size_t buffer_left = PyString_GET_SIZE(ret) - output_size; + size_t buffer_left = PyBytes_GET_SIZE(ret) - output_size; if (buffer_left == 0) { if (Util_GrowBuffer(&ret) < 0) { BZ2_bzDecompressEnd(bzs); @@ -2314,14 +2118,14 @@ bz2_decompress(PyObject *self, PyObject *args) return NULL; } bzs->next_out = BUF(ret) + output_size; - buffer_left = PyString_GET_SIZE(ret) - output_size; + buffer_left = PyBytes_GET_SIZE(ret) - output_size; } bzs->avail_out = MIN(buffer_left, UINT_MAX); } } - if (output_size != PyString_GET_SIZE(ret)) - _PyString_Resize(&ret, output_size); /* Sets ret to NULL on failure. */ + if (output_size != PyBytes_GET_SIZE(ret)) + _PyBytes_Resize(&ret, output_size); /* Sets ret to NULL on failure. */ BZ2_bzDecompressEnd(bzs); PyBuffer_Release(&pdata); @@ -2346,23 +2150,36 @@ interface, one shot (de)compression functions, and types for\n\ sequential (de)compression.\n\ "); + +static struct PyModuleDef bz2module = { + PyModuleDef_HEAD_INIT, + "bz2", + bz2__doc__, + -1, + bz2_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initbz2(void) +PyInit_bz2(void) { PyObject *m; if (PyType_Ready(&BZ2File_Type) < 0) - return; + return NULL; if (PyType_Ready(&BZ2Comp_Type) < 0) - return; + return NULL; if (PyType_Ready(&BZ2Decomp_Type) < 0) - return; + return NULL; - m = Py_InitModule3("bz2", bz2_methods, bz2__doc__); + m = PyModule_Create(&bz2module); if (m == NULL) - return; + return NULL; - PyModule_AddObject(m, "__author__", PyString_FromString(__author__)); + PyModule_AddObject(m, "__author__", PyUnicode_FromString(__author__)); Py_INCREF(&BZ2File_Type); PyModule_AddObject(m, "BZ2File", (PyObject *)&BZ2File_Type); @@ -2372,4 +2189,5 @@ initbz2(void) Py_INCREF(&BZ2Decomp_Type); PyModule_AddObject(m, "BZ2Decompressor", (PyObject *)&BZ2Decomp_Type); + return m; } diff --git a/Modules/cPickle.c b/Modules/cPickle.c deleted file mode 100644 index 48b5075ec2b..00000000000 --- a/Modules/cPickle.c +++ /dev/null @@ -1,6023 +0,0 @@ -#include "Python.h" -#include "cStringIO.h" -#include "structmember.h" - -PyDoc_STRVAR(cPickle_module_documentation, -"C implementation and optimization of the Python pickle module."); - -#ifndef Py_eval_input -#include <graminit.h> -#define Py_eval_input eval_input -#endif /* Py_eval_input */ - -#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL)) - -#define WRITE_BUF_SIZE 256 - -/* Bump this when new opcodes are added to the pickle protocol. */ -#define HIGHEST_PROTOCOL 2 - -/* - * Note: The UNICODE macro controls the TCHAR meaning of the win32 API. Since - * all headers have already been included here, we can safely redefine it. - */ -#ifdef UNICODE -# undef UNICODE -#endif - -/* - * Pickle opcodes. These must be kept in synch with pickle.py. Extensive - * docs are in pickletools.py. - */ -#define MARK '(' -#define STOP '.' -#define POP '0' -#define POP_MARK '1' -#define DUP '2' -#define FLOAT 'F' -#define BINFLOAT 'G' -#define INT 'I' -#define BININT 'J' -#define BININT1 'K' -#define LONG 'L' -#define BININT2 'M' -#define NONE 'N' -#define PERSID 'P' -#define BINPERSID 'Q' -#define REDUCE 'R' -#define STRING 'S' -#define BINSTRING 'T' -#define SHORT_BINSTRING 'U' -#define UNICODE 'V' -#define BINUNICODE 'X' -#define APPEND 'a' -#define BUILD 'b' -#define GLOBAL 'c' -#define DICT 'd' -#define EMPTY_DICT '}' -#define APPENDS 'e' -#define GET 'g' -#define BINGET 'h' -#define INST 'i' -#define LONG_BINGET 'j' -#define LIST 'l' -#define EMPTY_LIST ']' -#define OBJ 'o' -#define PUT 'p' -#define BINPUT 'q' -#define LONG_BINPUT 'r' -#define SETITEM 's' -#define TUPLE 't' -#define EMPTY_TUPLE ')' -#define SETITEMS 'u' - -/* Protocol 2. */ -#define PROTO '\x80' /* identify pickle protocol */ -#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */ -#define EXT1 '\x82' /* push object from extension registry; 1-byte index */ -#define EXT2 '\x83' /* ditto, but 2-byte index */ -#define EXT4 '\x84' /* ditto, but 4-byte index */ -#define TUPLE1 '\x85' /* build 1-tuple from stack top */ -#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */ -#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */ -#define NEWTRUE '\x88' /* push True */ -#define NEWFALSE '\x89' /* push False */ -#define LONG1 '\x8a' /* push long from < 256 bytes */ -#define LONG4 '\x8b' /* push really big long */ - -/* There aren't opcodes -- they're ways to pickle bools before protocol 2, - * so that unpicklers written before bools were introduced unpickle them - * as ints, but unpicklers after can recognize that bools were intended. - * Note that protocol 2 added direct ways to pickle bools. - */ -#undef TRUE -#define TRUE "I01\n" -#undef FALSE -#define FALSE "I00\n" - -/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements - * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will - * break if this gets out of synch with pickle.py, but it's unclear that - * would help anything either. - */ -#define BATCHSIZE 1000 - -static char MARKv = MARK; - -static PyObject *PickleError; -static PyObject *PicklingError; -static PyObject *UnpickleableError; -static PyObject *UnpicklingError; -static PyObject *BadPickleGet; - -/* As the name says, an empty tuple. */ -static PyObject *empty_tuple; - -/* copy_reg.dispatch_table, {type_object: pickling_function} */ -static PyObject *dispatch_table; - -/* For EXT[124] opcodes. */ -/* copy_reg._extension_registry, {(module_name, function_name): code} */ -static PyObject *extension_registry; -/* copy_reg._inverted_registry, {code: (module_name, function_name)} */ -static PyObject *inverted_registry; -/* copy_reg._extension_cache, {code: object} */ -static PyObject *extension_cache; - -/* For looking up name pairs in copy_reg._extension_registry. */ -static PyObject *two_tuple; - -static PyObject *__class___str, *__getinitargs___str, *__dict___str, - *__getstate___str, *__setstate___str, *__name___str, *__reduce___str, - *__reduce_ex___str, - *write_str, *append_str, - *read_str, *readline_str, *__main___str, - *dispatch_table_str; - -/************************************************************************* - Internal Data type for pickle data. */ - -typedef struct { - PyObject_HEAD - int length; /* number of initial slots in data currently used */ - int size; /* number of slots in data allocated */ - PyObject **data; -} Pdata; - -static void -Pdata_dealloc(Pdata *self) -{ - int i; - PyObject **p; - - for (i = self->length, p = self->data; --i >= 0; p++) { - Py_DECREF(*p); - } - if (self->data) - free(self->data); - PyObject_Del(self); -} - -static PyTypeObject PdataType = { - PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0, - (destructor)Pdata_dealloc, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, "" -}; - -#define Pdata_Check(O) (Py_TYPE(O) == &PdataType) - -static PyObject * -Pdata_New(void) -{ - Pdata *self; - - if (!(self = PyObject_New(Pdata, &PdataType))) - return NULL; - self->size = 8; - self->length = 0; - self->data = malloc(self->size * sizeof(PyObject*)); - if (self->data) - return (PyObject*)self; - Py_DECREF(self); - return PyErr_NoMemory(); -} - -static int -stackUnderflow(void) -{ - PyErr_SetString(UnpicklingError, "unpickling stack underflow"); - return -1; -} - -/* Retain only the initial clearto items. If clearto >= the current - * number of items, this is a (non-erroneous) NOP. - */ -static int -Pdata_clear(Pdata *self, int clearto) -{ - int i; - PyObject **p; - - if (clearto < 0) return stackUnderflow(); - if (clearto >= self->length) return 0; - - for (i = self->length, p = self->data + clearto; - --i >= clearto; - p++) { - Py_CLEAR(*p); - } - self->length = clearto; - - return 0; -} - -static int -Pdata_grow(Pdata *self) -{ - int bigger; - size_t nbytes; - PyObject **tmp; - - bigger = self->size << 1; - if (bigger <= 0) /* was 0, or new value overflows */ - goto nomemory; - if ((int)(size_t)bigger != bigger) - goto nomemory; - nbytes = (size_t)bigger * sizeof(PyObject *); - if (nbytes / sizeof(PyObject *) != (size_t)bigger) - goto nomemory; - tmp = realloc(self->data, nbytes); - if (tmp == NULL) - goto nomemory; - self->data = tmp; - self->size = bigger; - return 0; - - nomemory: - PyErr_NoMemory(); - return -1; -} - -/* D is a Pdata*. Pop the topmost element and store it into V, which - * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError - * is raised and V is set to NULL. D and V may be evaluated several times. - */ -#define PDATA_POP(D, V) { \ - if ((D)->length) \ - (V) = (D)->data[--((D)->length)]; \ - else { \ - PyErr_SetString(UnpicklingError, "bad pickle data"); \ - (V) = NULL; \ - } \ -} - -/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata* - * D. If the Pdata stack can't be grown to hold the new value, both - * raise MemoryError and execute "return ER". The difference is in ownership - * of O after: _PUSH transfers ownership of O from the caller to the stack - * (no incref of O is done, and in case of error O is decrefed), while - * _APPEND pushes a new reference. - */ - -/* Push O on stack D, giving ownership of O to the stack. */ -#define PDATA_PUSH(D, O, ER) { \ - if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \ - Pdata_grow((Pdata*)(D)) < 0) { \ - Py_DECREF(O); \ - return ER; \ - } \ - ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \ -} - -/* Push O on stack D, pushing a new reference. */ -#define PDATA_APPEND(D, O, ER) { \ - if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \ - Pdata_grow((Pdata*)(D)) < 0) \ - return ER; \ - Py_INCREF(O); \ - ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \ -} - - -static PyObject * -Pdata_popTuple(Pdata *self, int start) -{ - PyObject *r; - int i, j, l; - - l = self->length-start; - r = PyTuple_New(l); - if (r == NULL) - return NULL; - for (i = start, j = 0 ; j < l; i++, j++) - PyTuple_SET_ITEM(r, j, self->data[i]); - - self->length = start; - return r; -} - -static PyObject * -Pdata_popList(Pdata *self, int start) -{ - PyObject *r; - int i, j, l; - - l=self->length-start; - if (!( r=PyList_New(l))) return NULL; - for (i=start, j=0 ; j < l; i++, j++) - PyList_SET_ITEM(r, j, self->data[i]); - - self->length=start; - return r; -} - -/*************************************************************************/ - -#define ARG_TUP(self, o) { \ - if (self->arg || (self->arg=PyTuple_New(1))) { \ - Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \ - PyTuple_SET_ITEM(self->arg,0,o); \ - } \ - else { \ - Py_DECREF(o); \ - } \ -} - -#define FREE_ARG_TUP(self) { \ - if (Py_REFCNT(self->arg) > 1) { \ - Py_DECREF(self->arg); \ - self->arg=NULL; \ - } \ - } - -typedef struct Picklerobject { - PyObject_HEAD - FILE *fp; - PyObject *write; - PyObject *file; - PyObject *memo; - PyObject *arg; - PyObject *pers_func; - PyObject *inst_pers_func; - - /* pickle protocol number, >= 0 */ - int proto; - - /* bool, true if proto > 0 */ - int bin; - - int fast; /* Fast mode doesn't save in memo, don't use if circ ref */ - int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t); - char *write_buf; - int buf_size; - PyObject *dispatch_table; - int fast_container; /* count nested container dumps */ - PyObject *fast_memo; -} Picklerobject; - -#ifndef PY_CPICKLE_FAST_LIMIT -#define PY_CPICKLE_FAST_LIMIT 50 -#endif - -static PyTypeObject Picklertype; - -typedef struct Unpicklerobject { - PyObject_HEAD - FILE *fp; - PyObject *file; - PyObject *readline; - PyObject *read; - PyObject *memo; - PyObject *arg; - Pdata *stack; - PyObject *mark; - PyObject *pers_func; - PyObject *last_string; - int *marks; - int num_marks; - int marks_size; - Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t); - Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **); - int buf_size; - char *buf; - PyObject *find_class; -} Unpicklerobject; - -static PyTypeObject Unpicklertype; - -/* Forward decls that need the above structs */ -static int save(Picklerobject *, PyObject *, int); -static int put2(Picklerobject *, PyObject *); - -static -PyObject * -cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...) -{ - va_list va; - PyObject *args=0, *retval=0; - va_start(va, format); - - if (format) args = Py_VaBuildValue(format, va); - va_end(va); - if (format && ! args) return NULL; - if (stringformat && !(retval=PyString_FromString(stringformat))) - return NULL; - - if (retval) { - if (args) { - PyObject *v; - v=PyString_Format(retval, args); - Py_DECREF(retval); - Py_DECREF(args); - if (! v) return NULL; - retval=v; - } - } - else - if (args) retval=args; - else { - PyErr_SetObject(ErrType,Py_None); - return NULL; - } - PyErr_SetObject(ErrType,retval); - Py_DECREF(retval); - return NULL; -} - -static int -write_file(Picklerobject *self, const char *s, Py_ssize_t n) -{ - size_t nbyteswritten; - - if (s == NULL) { - return 0; - } - - if (n > INT_MAX) { - /* String too large */ - return -1; - } - - PyFile_IncUseCount((PyFileObject *)self->file); - Py_BEGIN_ALLOW_THREADS - nbyteswritten = fwrite(s, sizeof(char), n, self->fp); - Py_END_ALLOW_THREADS - PyFile_DecUseCount((PyFileObject *)self->file); - if (nbyteswritten != (size_t)n) { - PyErr_SetFromErrno(PyExc_IOError); - return -1; - } - - return (int)n; -} - -static int -write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n) -{ - if (s == NULL) { - return 0; - } - - if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) { - return -1; - } - - return (int)n; -} - -static int -write_none(Picklerobject *self, const char *s, Py_ssize_t n) -{ - if (s == NULL) return 0; - if (n > INT_MAX) return -1; - return (int)n; -} - -static int -write_other(Picklerobject *self, const char *s, Py_ssize_t _n) -{ - PyObject *py_str = 0, *junk = 0; - int n; - - if (_n > INT_MAX) - return -1; - n = (int)_n; - if (s == NULL) { - if (!( self->buf_size )) return 0; - py_str = PyString_FromStringAndSize(self->write_buf, - self->buf_size); - if (!py_str) - return -1; - } - else { - if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) { - if (write_other(self, NULL, 0) < 0) - return -1; - } - - if (n > WRITE_BUF_SIZE) { - if (!( py_str = - PyString_FromStringAndSize(s, n))) - return -1; - } - else { - memcpy(self->write_buf + self->buf_size, s, n); - self->buf_size += n; - return n; - } - } - - if (self->write) { - /* object with write method */ - ARG_TUP(self, py_str); - if (self->arg) { - junk = PyObject_Call(self->write, self->arg, NULL); - FREE_ARG_TUP(self); - } - if (junk) Py_DECREF(junk); - else return -1; - } - else - PDATA_PUSH(self->file, py_str, -1); - - self->buf_size = 0; - return n; -} - - -static Py_ssize_t -read_file(Unpicklerobject *self, char **s, Py_ssize_t n) -{ - size_t nbytesread; - - if (self->buf_size == 0) { - int size; - - size = ((n < 32) ? 32 : n); - if (!( self->buf = (char *)malloc(size))) { - PyErr_NoMemory(); - return -1; - } - - self->buf_size = size; - } - else if (n > self->buf_size) { - char *newbuf = (char *)realloc(self->buf, n); - if (!newbuf) { - PyErr_NoMemory(); - return -1; - } - self->buf = newbuf; - self->buf_size = n; - } - - PyFile_IncUseCount((PyFileObject *)self->file); - Py_BEGIN_ALLOW_THREADS - nbytesread = fread(self->buf, sizeof(char), n, self->fp); - Py_END_ALLOW_THREADS - PyFile_DecUseCount((PyFileObject *)self->file); - if (nbytesread != (size_t)n) { - if (feof(self->fp)) { - PyErr_SetNone(PyExc_EOFError); - return -1; - } - - PyErr_SetFromErrno(PyExc_IOError); - return -1; - } - - *s = self->buf; - - return n; -} - - -static Py_ssize_t -readline_file(Unpicklerobject *self, char **s) -{ - int i; - - if (self->buf_size == 0) { - if (!( self->buf = (char *)malloc(40))) { - PyErr_NoMemory(); - return -1; - } - self->buf_size = 40; - } - - i = 0; - while (1) { - int bigger; - char *newbuf; - for (; i < (self->buf_size - 1); i++) { - if (feof(self->fp) || - (self->buf[i] = getc(self->fp)) == '\n') { - self->buf[i + 1] = '\0'; - *s = self->buf; - return i + 1; - } - } - bigger = self->buf_size << 1; - if (bigger <= 0) { /* overflow */ - PyErr_NoMemory(); - return -1; - } - newbuf = (char *)realloc(self->buf, bigger); - if (!newbuf) { - PyErr_NoMemory(); - return -1; - } - self->buf = newbuf; - self->buf_size = bigger; - } -} - - -static Py_ssize_t -read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n) -{ - char *ptr; - - if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) { - PyErr_SetNone(PyExc_EOFError); - return -1; - } - - *s = ptr; - - return n; -} - - -static Py_ssize_t -readline_cStringIO(Unpicklerobject *self, char **s) -{ - Py_ssize_t n; - char *ptr; - - if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) { - return -1; - } - - *s = ptr; - - return n; -} - - -static Py_ssize_t -read_other(Unpicklerobject *self, char **s, Py_ssize_t n) -{ - PyObject *bytes, *str=0; - - if (!( bytes = PyInt_FromSsize_t(n))) return -1; - - ARG_TUP(self, bytes); - if (self->arg) { - str = PyObject_Call(self->read, self->arg, NULL); - FREE_ARG_TUP(self); - } - if (! str) return -1; - - Py_XDECREF(self->last_string); - self->last_string = str; - - if (! (*s = PyString_AsString(str))) return -1; - - if (PyString_GET_SIZE(str) != n) { - PyErr_SetNone(PyExc_EOFError); - return -1; - } - - return n; -} - - -static Py_ssize_t -readline_other(Unpicklerobject *self, char **s) -{ - PyObject *str; - Py_ssize_t str_size; - - if (!( str = PyObject_CallObject(self->readline, empty_tuple))) { - return -1; - } - - if ((str_size = PyString_Size(str)) < 0) - return -1; - - Py_XDECREF(self->last_string); - self->last_string = str; - - if (! (*s = PyString_AsString(str))) - return -1; - - return str_size; -} - -/* Copy the first n bytes from s into newly malloc'ed memory, plus a - * trailing 0 byte. Return a pointer to that, or NULL if out of memory. - * The caller is responsible for free()'ing the return value. - */ -static char * -pystrndup(const char *s, int n) -{ - char *r = (char *)malloc(n+1); - if (r == NULL) - return (char*)PyErr_NoMemory(); - memcpy(r, s, n); - r[n] = 0; - return r; -} - - -static int -get(Picklerobject *self, PyObject *id) -{ - PyObject *value, *mv; - long c_value; - char s[30]; - size_t len; - - if (!( mv = PyDict_GetItem(self->memo, id))) { - PyErr_SetObject(PyExc_KeyError, id); - return -1; - } - - if (!( value = PyTuple_GetItem(mv, 0))) - return -1; - - if (!( PyInt_Check(value))) { - PyErr_SetString(PicklingError, "no int where int expected in memo"); - return -1; - } - c_value = PyInt_AS_LONG((PyIntObject*)value); - - if (!self->bin) { - s[0] = GET; - PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value); - len = strlen(s); - } - else if (Pdata_Check(self->file)) { - if (write_other(self, NULL, 0) < 0) return -1; - PDATA_APPEND(self->file, mv, -1); - return 0; - } - else { - if (c_value < 256) { - s[0] = BINGET; - s[1] = (int)(c_value & 0xff); - len = 2; - } - else { - s[0] = LONG_BINGET; - s[1] = (int)(c_value & 0xff); - s[2] = (int)((c_value >> 8) & 0xff); - s[3] = (int)((c_value >> 16) & 0xff); - s[4] = (int)((c_value >> 24) & 0xff); - len = 5; - } - } - - if (self->write_func(self, s, len) < 0) - return -1; - - return 0; -} - - -static int -put(Picklerobject *self, PyObject *ob) -{ - if (Py_REFCNT(ob) < 2 || self->fast) - return 0; - - return put2(self, ob); -} - - -static int -put2(Picklerobject *self, PyObject *ob) -{ - char c_str[30]; - int p; - size_t len; - int res = -1; - PyObject *py_ob_id = 0, *memo_len = 0, *t = 0; - - if (self->fast) - return 0; - - if ((p = PyDict_Size(self->memo)) < 0) - goto finally; - - /* Make sure memo keys are positive! */ - /* XXX Why? - * XXX And does "positive" really mean non-negative? - * XXX pickle.py starts with PUT index 0, not 1. This makes for - * XXX gratuitous differences between the pickling modules. - */ - p++; - - if (!( py_ob_id = PyLong_FromVoidPtr(ob))) - goto finally; - - if (!( memo_len = PyInt_FromLong(p))) - goto finally; - - if (!( t = PyTuple_New(2))) - goto finally; - - PyTuple_SET_ITEM(t, 0, memo_len); - Py_INCREF(memo_len); - PyTuple_SET_ITEM(t, 1, ob); - Py_INCREF(ob); - - if (PyDict_SetItem(self->memo, py_ob_id, t) < 0) - goto finally; - - if (!self->bin) { - c_str[0] = PUT; - PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p); - len = strlen(c_str); - } - else if (Pdata_Check(self->file)) { - if (write_other(self, NULL, 0) < 0) return -1; - PDATA_APPEND(self->file, memo_len, -1); - res=0; /* Job well done ;) */ - goto finally; - } - else { - if (p >= 256) { - c_str[0] = LONG_BINPUT; - c_str[1] = (int)(p & 0xff); - c_str[2] = (int)((p >> 8) & 0xff); - c_str[3] = (int)((p >> 16) & 0xff); - c_str[4] = (int)((p >> 24) & 0xff); - len = 5; - } - else { - c_str[0] = BINPUT; - c_str[1] = p; - len = 2; - } - } - - if (self->write_func(self, c_str, len) < 0) - goto finally; - - res = 0; - - finally: - Py_XDECREF(py_ob_id); - Py_XDECREF(memo_len); - Py_XDECREF(t); - - return res; -} - -static PyObject * -whichmodule(PyObject *global, PyObject *global_name) -{ - Py_ssize_t i, j; - PyObject *module = 0, *modules_dict = 0, - *global_name_attr = 0, *name = 0; - - module = PyObject_GetAttrString(global, "__module__"); - if (module) - return module; - if (PyErr_ExceptionMatches(PyExc_AttributeError)) - PyErr_Clear(); - else - return NULL; - - if (!( modules_dict = PySys_GetObject("modules"))) - return NULL; - - i = 0; - while ((j = PyDict_Next(modules_dict, &i, &name, &module))) { - - if (PyObject_Compare(name, __main___str)==0) continue; - - global_name_attr = PyObject_GetAttr(module, global_name); - if (!global_name_attr) { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) - PyErr_Clear(); - else - return NULL; - continue; - } - - if (global_name_attr != global) { - Py_DECREF(global_name_attr); - continue; - } - - Py_DECREF(global_name_attr); - - break; - } - - /* The following implements the rule in pickle.py added in 1.5 - that used __main__ if no module is found. I don't actually - like this rule. jlf - */ - if (!j) { - name=__main___str; - } - - Py_INCREF(name); - return name; -} - - -static int -fast_save_enter(Picklerobject *self, PyObject *obj) -{ - /* if fast_container < 0, we're doing an error exit. */ - if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) { - PyObject *key = NULL; - if (self->fast_memo == NULL) { - self->fast_memo = PyDict_New(); - if (self->fast_memo == NULL) { - self->fast_container = -1; - return 0; - } - } - key = PyLong_FromVoidPtr(obj); - if (key == NULL) - return 0; - if (PyDict_GetItem(self->fast_memo, key)) { - Py_DECREF(key); - PyErr_Format(PyExc_ValueError, - "fast mode: can't pickle cyclic objects " - "including object type %s at %p", - Py_TYPE(obj)->tp_name, obj); - self->fast_container = -1; - return 0; - } - if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) { - Py_DECREF(key); - self->fast_container = -1; - return 0; - } - Py_DECREF(key); - } - return 1; -} - -int -fast_save_leave(Picklerobject *self, PyObject *obj) -{ - if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) { - PyObject *key = PyLong_FromVoidPtr(obj); - if (key == NULL) - return 0; - if (PyDict_DelItem(self->fast_memo, key) < 0) { - Py_DECREF(key); - return 0; - } - Py_DECREF(key); - } - return 1; -} - -static int -save_none(Picklerobject *self, PyObject *args) -{ - static char none = NONE; - if (self->write_func(self, &none, 1) < 0) - return -1; - - return 0; -} - -static int -save_bool(Picklerobject *self, PyObject *args) -{ - static const char *buf[2] = {FALSE, TRUE}; - static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1}; - long l = PyInt_AS_LONG((PyIntObject *)args); - - if (self->proto >= 2) { - char opcode = l ? NEWTRUE : NEWFALSE; - if (self->write_func(self, &opcode, 1) < 0) - return -1; - } - else if (self->write_func(self, buf[l], len[l]) < 0) - return -1; - return 0; -} - -static int -save_int(Picklerobject *self, PyObject *args) -{ - char c_str[32]; - long l = PyInt_AS_LONG((PyIntObject *)args); - int len = 0; - - if (!self->bin -#if SIZEOF_LONG > 4 - || l > 0x7fffffffL - || l < -0x80000000L -#endif - ) { - /* Text-mode pickle, or long too big to fit in the 4-byte - * signed BININT format: store as a string. - */ - c_str[0] = INT; - PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l); - if (self->write_func(self, c_str, strlen(c_str)) < 0) - return -1; - } - else { - /* Binary pickle and l fits in a signed 4-byte int. */ - c_str[1] = (int)( l & 0xff); - c_str[2] = (int)((l >> 8) & 0xff); - c_str[3] = (int)((l >> 16) & 0xff); - c_str[4] = (int)((l >> 24) & 0xff); - - if ((c_str[4] == 0) && (c_str[3] == 0)) { - if (c_str[2] == 0) { - c_str[0] = BININT1; - len = 2; - } - else { - c_str[0] = BININT2; - len = 3; - } - } - else { - c_str[0] = BININT; - len = 5; - } - - if (self->write_func(self, c_str, len) < 0) - return -1; - } - - return 0; -} - - -static int -save_long(Picklerobject *self, PyObject *args) -{ - Py_ssize_t size; - int res = -1; - PyObject *repr = NULL; - - static char l = LONG; - - if (self->proto >= 2) { - /* Linear-time pickling. */ - size_t nbits; - size_t nbytes; - unsigned char *pdata; - char c_str[5]; - int i; - int sign = _PyLong_Sign(args); - - if (sign == 0) { - /* It's 0 -- an empty bytestring. */ - c_str[0] = LONG1; - c_str[1] = 0; - i = self->write_func(self, c_str, 2); - if (i < 0) goto finally; - res = 0; - goto finally; - } - nbits = _PyLong_NumBits(args); - if (nbits == (size_t)-1 && PyErr_Occurred()) - goto finally; - /* How many bytes do we need? There are nbits >> 3 full - * bytes of data, and nbits & 7 leftover bits. If there - * are any leftover bits, then we clearly need another - * byte. Wnat's not so obvious is that we *probably* - * need another byte even if there aren't any leftovers: - * the most-significant bit of the most-significant byte - * acts like a sign bit, and it's usually got a sense - * opposite of the one we need. The exception is longs - * of the form -(2**(8*j-1)) for j > 0. Such a long is - * its own 256's-complement, so has the right sign bit - * even without the extra byte. That's a pain to check - * for in advance, though, so we always grab an extra - * byte at the start, and cut it back later if possible. - */ - nbytes = (nbits >> 3) + 1; - if (nbytes > INT_MAX) { - PyErr_SetString(PyExc_OverflowError, "long too large " - "to pickle"); - goto finally; - } - repr = PyString_FromStringAndSize(NULL, (int)nbytes); - if (repr == NULL) goto finally; - pdata = (unsigned char *)PyString_AS_STRING(repr); - i = _PyLong_AsByteArray((PyLongObject *)args, - pdata, nbytes, - 1 /* little endian */, 1 /* signed */); - if (i < 0) goto finally; - /* If the long is negative, this may be a byte more than - * needed. This is so iff the MSB is all redundant sign - * bits. - */ - if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff && - (pdata[nbytes - 2] & 0x80) != 0) - --nbytes; - - if (nbytes < 256) { - c_str[0] = LONG1; - c_str[1] = (char)nbytes; - size = 2; - } - else { - c_str[0] = LONG4; - size = (int)nbytes; - for (i = 1; i < 5; i++) { - c_str[i] = (char)(size & 0xff); - size >>= 8; - } - size = 5; - } - i = self->write_func(self, c_str, size); - if (i < 0) goto finally; - i = self->write_func(self, (char *)pdata, (int)nbytes); - if (i < 0) goto finally; - res = 0; - goto finally; - } - - /* proto < 2: write the repr and newline. This is quadratic-time - * (in the number of digits), in both directions. - */ - if (!( repr = PyObject_Repr(args))) - goto finally; - - if ((size = PyString_Size(repr)) < 0) - goto finally; - - if (self->write_func(self, &l, 1) < 0) - goto finally; - - if (self->write_func(self, - PyString_AS_STRING((PyStringObject *)repr), - size) < 0) - goto finally; - - if (self->write_func(self, "\n", 1) < 0) - goto finally; - - res = 0; - - finally: - Py_XDECREF(repr); - return res; -} - - -static int -save_float(Picklerobject *self, PyObject *args) -{ - double x = PyFloat_AS_DOUBLE((PyFloatObject *)args); - - if (self->bin) { - char str[9]; - str[0] = BINFLOAT; - if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0) - return -1; - if (self->write_func(self, str, 9) < 0) - return -1; - } - else { - int result = -1; - char *buf = NULL; - char op = FLOAT; - - if (self->write_func(self, &op, 1) < 0) - goto done; - - buf = PyOS_double_to_string(x, 'g', 17, 0, NULL); - if (!buf) { - PyErr_NoMemory(); - goto done; - } - - if (self->write_func(self, buf, strlen(buf)) < 0) - goto done; - - if (self->write_func(self, "\n", 1) < 0) - goto done; - - result = 0; -done: - PyMem_Free(buf); - return result; - } - - return 0; -} - - -static int -save_string(Picklerobject *self, PyObject *args, int doput) -{ - int size, len; - PyObject *repr=0; - - if ((size = PyString_Size(args)) < 0) - return -1; - - if (!self->bin) { - char *repr_str; - - static char string = STRING; - - if (!( repr = PyObject_Repr(args))) - return -1; - - if ((len = PyString_Size(repr)) < 0) - goto err; - repr_str = PyString_AS_STRING((PyStringObject *)repr); - - if (self->write_func(self, &string, 1) < 0) - goto err; - - if (self->write_func(self, repr_str, len) < 0) - goto err; - - if (self->write_func(self, "\n", 1) < 0) - goto err; - - Py_XDECREF(repr); - } - else { - int i; - char c_str[5]; - - if (size < 256) { - c_str[0] = SHORT_BINSTRING; - c_str[1] = size; - len = 2; - } - else if (size <= INT_MAX) { - c_str[0] = BINSTRING; - for (i = 1; i < 5; i++) - c_str[i] = (int)(size >> ((i - 1) * 8)); - len = 5; - } - else - return -1; /* string too large */ - - if (self->write_func(self, c_str, len) < 0) - return -1; - - if (size > 128 && Pdata_Check(self->file)) { - if (write_other(self, NULL, 0) < 0) return -1; - PDATA_APPEND(self->file, args, -1); - } - else { - if (self->write_func(self, - PyString_AS_STRING( - (PyStringObject *)args), - size) < 0) - return -1; - } - } - - if (doput) - if (put(self, args) < 0) - return -1; - - return 0; - - err: - Py_XDECREF(repr); - return -1; -} - - -#ifdef Py_USING_UNICODE -/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates - backslash and newline characters to \uXXXX escapes. */ -static PyObject * -modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size) -{ - PyObject *repr; - char *p; - char *q; - - static const char *hexdigit = "0123456789abcdef"; -#ifdef Py_UNICODE_WIDE - const Py_ssize_t expandsize = 10; -#else - const Py_ssize_t expandsize = 6; -#endif - - if (size > PY_SSIZE_T_MAX / expandsize) - return PyErr_NoMemory(); - - repr = PyString_FromStringAndSize(NULL, expandsize * size); - if (repr == NULL) - return NULL; - if (size == 0) - return repr; - - p = q = PyString_AS_STRING(repr); - while (size-- > 0) { - Py_UNICODE ch = *s++; -#ifdef Py_UNICODE_WIDE - /* Map 32-bit characters to '\Uxxxxxxxx' */ - if (ch >= 0x10000) { - *p++ = '\\'; - *p++ = 'U'; - *p++ = hexdigit[(ch >> 28) & 0xf]; - *p++ = hexdigit[(ch >> 24) & 0xf]; - *p++ = hexdigit[(ch >> 20) & 0xf]; - *p++ = hexdigit[(ch >> 16) & 0xf]; - *p++ = hexdigit[(ch >> 12) & 0xf]; - *p++ = hexdigit[(ch >> 8) & 0xf]; - *p++ = hexdigit[(ch >> 4) & 0xf]; - *p++ = hexdigit[ch & 15]; - } - else -#else - /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */ - if (ch >= 0xD800 && ch < 0xDC00) { - Py_UNICODE ch2; - Py_UCS4 ucs; - - ch2 = *s++; - size--; - if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { - ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000; - *p++ = '\\'; - *p++ = 'U'; - *p++ = hexdigit[(ucs >> 28) & 0xf]; - *p++ = hexdigit[(ucs >> 24) & 0xf]; - *p++ = hexdigit[(ucs >> 20) & 0xf]; - *p++ = hexdigit[(ucs >> 16) & 0xf]; - *p++ = hexdigit[(ucs >> 12) & 0xf]; - *p++ = hexdigit[(ucs >> 8) & 0xf]; - *p++ = hexdigit[(ucs >> 4) & 0xf]; - *p++ = hexdigit[ucs & 0xf]; - continue; - } - /* Fall through: isolated surrogates are copied as-is */ - s--; - size++; - } -#endif - /* Map 16-bit characters to '\uxxxx' */ - if (ch >= 256 || ch == '\\' || ch == '\n') { - *p++ = '\\'; - *p++ = 'u'; - *p++ = hexdigit[(ch >> 12) & 0xf]; - *p++ = hexdigit[(ch >> 8) & 0xf]; - *p++ = hexdigit[(ch >> 4) & 0xf]; - *p++ = hexdigit[ch & 15]; - } - /* Copy everything else as-is */ - else - *p++ = (char) ch; - } - *p = '\0'; - _PyString_Resize(&repr, p - q); - return repr; -} - -static int -save_unicode(Picklerobject *self, PyObject *args, int doput) -{ - Py_ssize_t size, len; - PyObject *repr=0; - - if (!PyUnicode_Check(args)) - return -1; - - if (!self->bin) { - char *repr_str; - static char string = UNICODE; - - repr = modified_EncodeRawUnicodeEscape( - PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args)); - if (!repr) - return -1; - - if ((len = PyString_Size(repr)) < 0) - goto err; - repr_str = PyString_AS_STRING((PyStringObject *)repr); - - if (self->write_func(self, &string, 1) < 0) - goto err; - - if (self->write_func(self, repr_str, len) < 0) - goto err; - - if (self->write_func(self, "\n", 1) < 0) - goto err; - - Py_XDECREF(repr); - } - else { - int i; - char c_str[5]; - - if (!( repr = PyUnicode_AsUTF8String(args))) - return -1; - - if ((size = PyString_Size(repr)) < 0) - goto err; - if (size > INT_MAX) - return -1; /* string too large */ - - c_str[0] = BINUNICODE; - for (i = 1; i < 5; i++) - c_str[i] = (int)(size >> ((i - 1) * 8)); - len = 5; - - if (self->write_func(self, c_str, len) < 0) - goto err; - - if (size > 128 && Pdata_Check(self->file)) { - if (write_other(self, NULL, 0) < 0) - goto err; - PDATA_APPEND(self->file, repr, -1); - } - else { - if (self->write_func(self, PyString_AS_STRING(repr), - size) < 0) - goto err; - } - - Py_DECREF(repr); - } - - if (doput) - if (put(self, args) < 0) - return -1; - - return 0; - - err: - Py_XDECREF(repr); - return -1; -} -#endif - -/* A helper for save_tuple. Push the len elements in tuple t on the stack. */ -static int -store_tuple_elements(Picklerobject *self, PyObject *t, int len) -{ - int i; - int res = -1; /* guilty until proved innocent */ - - assert(PyTuple_Size(t) == len); - - for (i = 0; i < len; i++) { - PyObject *element = PyTuple_GET_ITEM(t, i); - - if (element == NULL) - goto finally; - if (save(self, element, 0) < 0) - goto finally; - } - res = 0; - - finally: - return res; -} - -/* Tuples are ubiquitous in the pickle protocols, so many techniques are - * used across protocols to minimize the space needed to pickle them. - * Tuples are also the only builtin immutable type that can be recursive - * (a tuple can be reached from itself), and that requires some subtle - * magic so that it works in all cases. IOW, this is a long routine. - */ -static int -save_tuple(Picklerobject *self, PyObject *args) -{ - PyObject *py_tuple_id = NULL; - int len, i; - int res = -1; - - static char tuple = TUPLE; - static char pop = POP; - static char pop_mark = POP_MARK; - static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3}; - - if ((len = PyTuple_Size(args)) < 0) - goto finally; - - if (len == 0) { - char c_str[2]; - - if (self->proto) { - c_str[0] = EMPTY_TUPLE; - len = 1; - } - else { - c_str[0] = MARK; - c_str[1] = TUPLE; - len = 2; - } - if (self->write_func(self, c_str, len) >= 0) - res = 0; - /* Don't memoize an empty tuple. */ - goto finally; - } - - /* A non-empty tuple. */ - - /* id(tuple) isn't in the memo now. If it shows up there after - * saving the tuple elements, the tuple must be recursive, in - * which case we'll pop everything we put on the stack, and fetch - * its value from the memo. - */ - py_tuple_id = PyLong_FromVoidPtr(args); - if (py_tuple_id == NULL) - goto finally; - - if (len <= 3 && self->proto >= 2) { - /* Use TUPLE{1,2,3} opcodes. */ - if (store_tuple_elements(self, args, len) < 0) - goto finally; - if (PyDict_GetItem(self->memo, py_tuple_id)) { - /* pop the len elements */ - for (i = 0; i < len; ++i) - if (self->write_func(self, &pop, 1) < 0) - goto finally; - /* fetch from memo */ - if (get(self, py_tuple_id) < 0) - goto finally; - res = 0; - goto finally; - } - /* Not recursive. */ - if (self->write_func(self, len2opcode + len, 1) < 0) - goto finally; - goto memoize; - } - - /* proto < 2 and len > 0, or proto >= 2 and len > 3. - * Generate MARK elt1 elt2 ... TUPLE - */ - if (self->write_func(self, &MARKv, 1) < 0) - goto finally; - - if (store_tuple_elements(self, args, len) < 0) - goto finally; - - if (PyDict_GetItem(self->memo, py_tuple_id)) { - /* pop the stack stuff we pushed */ - if (self->bin) { - if (self->write_func(self, &pop_mark, 1) < 0) - goto finally; - } - else { - /* Note that we pop one more than len, to remove - * the MARK too. - */ - for (i = 0; i <= len; i++) - if (self->write_func(self, &pop, 1) < 0) - goto finally; - } - /* fetch from memo */ - if (get(self, py_tuple_id) >= 0) - res = 0; - goto finally; - } - - /* Not recursive. */ - if (self->write_func(self, &tuple, 1) < 0) - goto finally; - - memoize: - if (put(self, args) >= 0) - res = 0; - - finally: - Py_XDECREF(py_tuple_id); - return res; -} - -/* iter is an iterator giving items, and we batch up chunks of - * MARK item item ... item APPENDS - * opcode sequences. Calling code should have arranged to first create an - * empty list, or list-like object, for the APPENDS to operate on. - * Returns 0 on success, <0 on error. - */ -static int -batch_list(Picklerobject *self, PyObject *iter) -{ - PyObject *obj = NULL; - PyObject *firstitem = NULL; - int i, n; - - static char append = APPEND; - static char appends = APPENDS; - - assert(iter != NULL); - - if (self->proto == 0) { - /* APPENDS isn't available; do one at a time. */ - for (;;) { - obj = PyIter_Next(iter); - if (obj == NULL) { - if (PyErr_Occurred()) - return -1; - break; - } - i = save(self, obj, 0); - Py_DECREF(obj); - if (i < 0) - return -1; - if (self->write_func(self, &append, 1) < 0) - return -1; - } - return 0; - } - - /* proto > 0: write in batches of BATCHSIZE. */ - do { - /* Get first item */ - firstitem = PyIter_Next(iter); - if (firstitem == NULL) { - if (PyErr_Occurred()) - goto BatchFailed; - - /* nothing more to add */ - break; - } - - /* Try to get a second item */ - obj = PyIter_Next(iter); - if (obj == NULL) { - if (PyErr_Occurred()) - goto BatchFailed; - - /* Only one item to write */ - if (save(self, firstitem, 0) < 0) - goto BatchFailed; - if (self->write_func(self, &append, 1) < 0) - goto BatchFailed; - Py_CLEAR(firstitem); - break; - } - - /* More than one item to write */ - - /* Pump out MARK, items, APPENDS. */ - if (self->write_func(self, &MARKv, 1) < 0) - goto BatchFailed; - - if (save(self, firstitem, 0) < 0) - goto BatchFailed; - Py_CLEAR(firstitem); - n = 1; - - /* Fetch and save up to BATCHSIZE items */ - while (obj) { - if (save(self, obj, 0) < 0) - goto BatchFailed; - Py_CLEAR(obj); - n += 1; - - if (n == BATCHSIZE) - break; - - obj = PyIter_Next(iter); - if (obj == NULL) { - if (PyErr_Occurred()) - goto BatchFailed; - break; - } - } - - if (self->write_func(self, &appends, 1) < 0) - goto BatchFailed; - - } while (n == BATCHSIZE); - return 0; - -BatchFailed: - Py_XDECREF(firstitem); - Py_XDECREF(obj); - return -1; -} - -static int -save_list(Picklerobject *self, PyObject *args) -{ - int res = -1; - char s[3]; - int len; - PyObject *iter; - - if (self->fast && !fast_save_enter(self, args)) - goto finally; - - /* Create an empty list. */ - if (self->bin) { - s[0] = EMPTY_LIST; - len = 1; - } - else { - s[0] = MARK; - s[1] = LIST; - len = 2; - } - - if (self->write_func(self, s, len) < 0) - goto finally; - - /* Get list length, and bow out early if empty. */ - if ((len = PyList_Size(args)) < 0) - goto finally; - - /* Memoize. */ - if (len == 0) { - if (put(self, args) >= 0) - res = 0; - goto finally; - } - if (put2(self, args) < 0) - goto finally; - - /* Materialize the list elements. */ - iter = PyObject_GetIter(args); - if (iter == NULL) - goto finally; - - if (Py_EnterRecursiveCall(" while pickling an object") == 0) - { - res = batch_list(self, iter); - Py_LeaveRecursiveCall(); - } - Py_DECREF(iter); - - finally: - if (self->fast && !fast_save_leave(self, args)) - res = -1; - - return res; -} - - -/* iter is an iterator giving (key, value) pairs, and we batch up chunks of - * MARK key value ... key value SETITEMS - * opcode sequences. Calling code should have arranged to first create an - * empty dict, or dict-like object, for the SETITEMS to operate on. - * Returns 0 on success, <0 on error. - * - * This is very much like batch_list(). The difference between saving - * elements directly, and picking apart two-tuples, is so long-winded at - * the C level, though, that attempts to combine these routines were too - * ugly to bear. - */ -static int -batch_dict(Picklerobject *self, PyObject *iter) -{ - PyObject *p = NULL; - PyObject *firstitem = NULL; - int i, n; - - static char setitem = SETITEM; - static char setitems = SETITEMS; - - assert(iter != NULL); - - if (self->proto == 0) { - /* SETITEMS isn't available; do one at a time. */ - for (;;) { - p = PyIter_Next(iter); - if (p == NULL) { - if (PyErr_Occurred()) - return -1; - break; - } - if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) { - PyErr_SetString(PyExc_TypeError, "dict items " - "iterator must return 2-tuples"); - return -1; - } - i = save(self, PyTuple_GET_ITEM(p, 0), 0); - if (i >= 0) - i = save(self, PyTuple_GET_ITEM(p, 1), 0); - Py_DECREF(p); - if (i < 0) - return -1; - if (self->write_func(self, &setitem, 1) < 0) - return -1; - } - return 0; - } - - /* proto > 0: write in batches of BATCHSIZE. */ - do { - /* Get first item */ - firstitem = PyIter_Next(iter); - if (firstitem == NULL) { - if (PyErr_Occurred()) - goto BatchFailed; - - /* nothing more to add */ - break; - } - if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) { - PyErr_SetString(PyExc_TypeError, "dict items " - "iterator must return 2-tuples"); - goto BatchFailed; - } - - /* Try to get a second item */ - p = PyIter_Next(iter); - if (p == NULL) { - if (PyErr_Occurred()) - goto BatchFailed; - - /* Only one item to write */ - if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) - goto BatchFailed; - if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) - goto BatchFailed; - if (self->write_func(self, &setitem, 1) < 0) - goto BatchFailed; - Py_CLEAR(firstitem); - break; - } - - /* More than one item to write */ - - /* Pump out MARK, items, SETITEMS. */ - if (self->write_func(self, &MARKv, 1) < 0) - goto BatchFailed; - - if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) - goto BatchFailed; - if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) - goto BatchFailed; - Py_CLEAR(firstitem); - n = 1; - - /* Fetch and save up to BATCHSIZE items */ - while (p) { - if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) { - PyErr_SetString(PyExc_TypeError, "dict items " - "iterator must return 2-tuples"); - goto BatchFailed; - } - if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0) - goto BatchFailed; - if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0) - goto BatchFailed; - Py_CLEAR(p); - n += 1; - - if (n == BATCHSIZE) - break; - - p = PyIter_Next(iter); - if (p == NULL) { - if (PyErr_Occurred()) - goto BatchFailed; - break; - } - } - - if (self->write_func(self, &setitems, 1) < 0) - goto BatchFailed; - - } while (n == BATCHSIZE); - return 0; - -BatchFailed: - Py_XDECREF(firstitem); - Py_XDECREF(p); - return -1; -} - -/* This is a variant of batch_dict() above that specializes for dicts, with no - * support for dict subclasses. Like batch_dict(), we batch up chunks of - * MARK key value ... key value SETITEMS - * opcode sequences. Calling code should have arranged to first create an - * empty dict, or dict-like object, for the SETITEMS to operate on. - * Returns 0 on success, -1 on error. - * - * Note that this currently doesn't work for protocol 0. - */ -static int -batch_dict_exact(Picklerobject *self, PyObject *obj) -{ - PyObject *key = NULL, *value = NULL; - int i; - Py_ssize_t dict_size, ppos = 0; - - static char setitem = SETITEM; - static char setitems = SETITEMS; - - assert(obj != NULL); - assert(self->proto > 0); - - dict_size = PyDict_Size(obj); - - /* Special-case len(d) == 1 to save space. */ - if (dict_size == 1) { - PyDict_Next(obj, &ppos, &key, &value); - if (save(self, key, 0) < 0) - return -1; - if (save(self, value, 0) < 0) - return -1; - if (self->write_func(self, &setitem, 1) < 0) - return -1; - return 0; - } - - /* Write in batches of BATCHSIZE. */ - do { - i = 0; - if (self->write_func(self, &MARKv, 1) < 0) - return -1; - while (PyDict_Next(obj, &ppos, &key, &value)) { - if (save(self, key, 0) < 0) - return -1; - if (save(self, value, 0) < 0) - return -1; - if (++i == BATCHSIZE) - break; - } - if (self->write_func(self, &setitems, 1) < 0) - return -1; - if (PyDict_Size(obj) != dict_size) { - PyErr_Format( - PyExc_RuntimeError, - "dictionary changed size during iteration"); - return -1; - } - - } while (i == BATCHSIZE); - return 0; -} - -static int -save_dict(Picklerobject *self, PyObject *args) -{ - int res = -1; - char s[3]; - int len; - - if (self->fast && !fast_save_enter(self, args)) - goto finally; - - /* Create an empty dict. */ - if (self->bin) { - s[0] = EMPTY_DICT; - len = 1; - } - else { - s[0] = MARK; - s[1] = DICT; - len = 2; - } - - if (self->write_func(self, s, len) < 0) - goto finally; - - /* Get dict size, and bow out early if empty. */ - if ((len = PyDict_Size(args)) < 0) - goto finally; - - if (len == 0) { - if (put(self, args) >= 0) - res = 0; - goto finally; - } - if (put2(self, args) < 0) - goto finally; - - /* Materialize the dict items. */ - if (PyDict_CheckExact(args) && self->proto > 0) { - /* We can take certain shortcuts if we know this is a dict and - not a dict subclass. */ - if (Py_EnterRecursiveCall(" while pickling an object") == 0) { - res = batch_dict_exact(self, args); - Py_LeaveRecursiveCall(); - } - } else { - PyObject *iter = PyObject_CallMethod(args, "iteritems", "()"); - if (iter == NULL) - goto finally; - if (Py_EnterRecursiveCall(" while pickling an object") == 0) { - res = batch_dict(self, iter); - Py_LeaveRecursiveCall(); - } - Py_DECREF(iter); - } - - finally: - if (self->fast && !fast_save_leave(self, args)) - res = -1; - - return res; -} - - -static int -save_inst(Picklerobject *self, PyObject *args) -{ - PyObject *class = 0, *module = 0, *name = 0, *state = 0, - *getinitargs_func = 0, *getstate_func = 0, *class_args = 0; - char *module_str, *name_str; - int module_size, name_size, res = -1; - - static char inst = INST, obj = OBJ, build = BUILD; - - if (self->fast && !fast_save_enter(self, args)) - goto finally; - - if (self->write_func(self, &MARKv, 1) < 0) - goto finally; - - if (!( class = PyObject_GetAttr(args, __class___str))) - goto finally; - - if (self->bin) { - if (save(self, class, 0) < 0) - goto finally; - } - - if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) { - PyObject *element = 0; - int i, len; - - if (!( class_args = - PyObject_Call(getinitargs_func, empty_tuple, NULL))) - goto finally; - - if ((len = PyObject_Size(class_args)) < 0) - goto finally; - - for (i = 0; i < len; i++) { - if (!( element = PySequence_GetItem(class_args, i))) - goto finally; - - if (save(self, element, 0) < 0) { - Py_DECREF(element); - goto finally; - } - - Py_DECREF(element); - } - } - else { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) - PyErr_Clear(); - else - goto finally; - } - - if (!self->bin) { - if (!( name = ((PyClassObject *)class)->cl_name )) { - PyErr_SetString(PicklingError, "class has no name"); - goto finally; - } - - if (!( module = whichmodule(class, name))) - goto finally; - - - if ((module_size = PyString_Size(module)) < 0 || - (name_size = PyString_Size(name)) < 0) - goto finally; - - module_str = PyString_AS_STRING((PyStringObject *)module); - name_str = PyString_AS_STRING((PyStringObject *)name); - - if (self->write_func(self, &inst, 1) < 0) - goto finally; - - if (self->write_func(self, module_str, module_size) < 0) - goto finally; - - if (self->write_func(self, "\n", 1) < 0) - goto finally; - - if (self->write_func(self, name_str, name_size) < 0) - goto finally; - - if (self->write_func(self, "\n", 1) < 0) - goto finally; - } - else if (self->write_func(self, &obj, 1) < 0) { - goto finally; - } - - if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) { - state = PyObject_Call(getstate_func, empty_tuple, NULL); - if (!state) - goto finally; - } - else { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) - PyErr_Clear(); - else - goto finally; - - if (!( state = PyObject_GetAttr(args, __dict___str))) { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) - PyErr_Clear(); - else - goto finally; - res = 0; - goto finally; - } - } - - if (!PyDict_Check(state)) { - if (put2(self, args) < 0) - goto finally; - } - else { - if (put(self, args) < 0) - goto finally; - } - - if (save(self, state, 0) < 0) - goto finally; - - if (self->write_func(self, &build, 1) < 0) - goto finally; - - res = 0; - - finally: - if (self->fast && !fast_save_leave(self, args)) - res = -1; - - Py_XDECREF(module); - Py_XDECREF(class); - Py_XDECREF(state); - Py_XDECREF(getinitargs_func); - Py_XDECREF(getstate_func); - Py_XDECREF(class_args); - - return res; -} - - -static int -save_global(Picklerobject *self, PyObject *args, PyObject *name) -{ - PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0; - char *name_str, *module_str; - int module_size, name_size, res = -1; - - static char global = GLOBAL; - - if (name) { - global_name = name; - Py_INCREF(global_name); - } - else { - if (!( global_name = PyObject_GetAttr(args, __name___str))) - goto finally; - } - - if (!( module = whichmodule(args, global_name))) - goto finally; - - if ((module_size = PyString_Size(module)) < 0 || - (name_size = PyString_Size(global_name)) < 0) - goto finally; - - module_str = PyString_AS_STRING((PyStringObject *)module); - name_str = PyString_AS_STRING((PyStringObject *)global_name); - - /* XXX This can be doing a relative import. Clearly it shouldn't, - but I don't know how to stop it. :-( */ - mod = PyImport_ImportModule(module_str); - if (mod == NULL) { - cPickle_ErrFormat(PicklingError, - "Can't pickle %s: import of module %s " - "failed", - "OS", args, module); - goto finally; - } - klass = PyObject_GetAttrString(mod, name_str); - if (klass == NULL) { - cPickle_ErrFormat(PicklingError, - "Can't pickle %s: attribute lookup %s.%s " - "failed", - "OSS", args, module, global_name); - goto finally; - } - if (klass != args) { - Py_DECREF(klass); - cPickle_ErrFormat(PicklingError, - "Can't pickle %s: it's not the same object " - "as %s.%s", - "OSS", args, module, global_name); - goto finally; - } - Py_DECREF(klass); - - if (self->proto >= 2) { - /* See whether this is in the extension registry, and if - * so generate an EXT opcode. - */ - PyObject *py_code; /* extension code as Python object */ - long code; /* extension code as C value */ - char c_str[5]; - int n; - - PyTuple_SET_ITEM(two_tuple, 0, module); - PyTuple_SET_ITEM(two_tuple, 1, global_name); - py_code = PyDict_GetItem(extension_registry, two_tuple); - if (py_code == NULL) - goto gen_global; /* not registered */ - - /* Verify py_code has the right type and value. */ - if (!PyInt_Check(py_code)) { - cPickle_ErrFormat(PicklingError, "Can't pickle %s: " - "extension code %s isn't an integer", - "OO", args, py_code); - goto finally; - } - code = PyInt_AS_LONG(py_code); - if (code <= 0 || code > 0x7fffffffL) { - cPickle_ErrFormat(PicklingError, "Can't pickle %s: " - "extension code %ld is out of range", - "Ol", args, code); - goto finally; - } - - /* Generate an EXT opcode. */ - if (code <= 0xff) { - c_str[0] = EXT1; - c_str[1] = (char)code; - n = 2; - } - else if (code <= 0xffff) { - c_str[0] = EXT2; - c_str[1] = (char)(code & 0xff); - c_str[2] = (char)((code >> 8) & 0xff); - n = 3; - } - else { - c_str[0] = EXT4; - c_str[1] = (char)(code & 0xff); - c_str[2] = (char)((code >> 8) & 0xff); - c_str[3] = (char)((code >> 16) & 0xff); - c_str[4] = (char)((code >> 24) & 0xff); - n = 5; - } - - if (self->write_func(self, c_str, n) >= 0) - res = 0; - goto finally; /* and don't memoize */ - } - - gen_global: - if (self->write_func(self, &global, 1) < 0) - goto finally; - - if (self->write_func(self, module_str, module_size) < 0) - goto finally; - - if (self->write_func(self, "\n", 1) < 0) - goto finally; - - if (self->write_func(self, name_str, name_size) < 0) - goto finally; - - if (self->write_func(self, "\n", 1) < 0) - goto finally; - - if (put(self, args) < 0) - goto finally; - - res = 0; - - finally: - Py_XDECREF(module); - Py_XDECREF(global_name); - Py_XDECREF(mod); - - return res; -} - -static int -save_pers(Picklerobject *self, PyObject *args, PyObject *f) -{ - PyObject *pid = 0; - int size, res = -1; - - static char persid = PERSID, binpersid = BINPERSID; - - Py_INCREF(args); - ARG_TUP(self, args); - if (self->arg) { - pid = PyObject_Call(f, self->arg, NULL); - FREE_ARG_TUP(self); - } - if (! pid) return -1; - - if (pid != Py_None) { - if (!self->bin) { - if (!PyString_Check(pid)) { - PyErr_SetString(PicklingError, - "persistent id must be string"); - goto finally; - } - - if (self->write_func(self, &persid, 1) < 0) - goto finally; - - if ((size = PyString_Size(pid)) < 0) - goto finally; - - if (self->write_func(self, - PyString_AS_STRING( - (PyStringObject *)pid), - size) < 0) - goto finally; - - if (self->write_func(self, "\n", 1) < 0) - goto finally; - - res = 1; - goto finally; - } - else if (save(self, pid, 1) >= 0) { - if (self->write_func(self, &binpersid, 1) < 0) - res = -1; - else - res = 1; - } - - goto finally; - } - - res = 0; - - finally: - Py_XDECREF(pid); - - return res; -} - -/* We're saving ob, and args is the 2-thru-5 tuple returned by the - * appropriate __reduce__ method for ob. - */ -static int -save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob) -{ - PyObject *callable; - PyObject *argtup; - PyObject *state = NULL; - PyObject *listitems = Py_None; - PyObject *dictitems = Py_None; - Py_ssize_t size; - - int use_newobj = self->proto >= 2; - - static char reduce = REDUCE; - static char build = BUILD; - static char newobj = NEWOBJ; - - size = PyTuple_Size(args); - if (size < 2 || size > 5) { - cPickle_ErrFormat(PicklingError, "tuple returned by " - "%s must contain 2 through 5 elements", - "O", fn); - return -1; - } - - if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5, - &callable, - &argtup, - &state, - &listitems, - &dictitems)) - return -1; - - if (!PyTuple_Check(argtup)) { - cPickle_ErrFormat(PicklingError, "Second element of " - "tuple returned by %s must be a tuple", - "O", fn); - return -1; - } - - if (state == Py_None) - state = NULL; - - if (listitems == Py_None) - listitems = NULL; - else if (!PyIter_Check(listitems)) { - cPickle_ErrFormat(PicklingError, "Fourth element of " - "tuple returned by %s must be an iterator, not %s", - "Os", fn, Py_TYPE(listitems)->tp_name); - return -1; - } - - if (dictitems == Py_None) - dictitems = NULL; - else if (!PyIter_Check(dictitems)) { - cPickle_ErrFormat(PicklingError, "Fifth element of " - "tuple returned by %s must be an iterator, not %s", - "Os", fn, Py_TYPE(dictitems)->tp_name); - return -1; - } - - /* Protocol 2 special case: if callable's name is __newobj__, use - * NEWOBJ. This consumes a lot of code. - */ - if (use_newobj) { - PyObject *temp = PyObject_GetAttr(callable, __name___str); - - if (temp == NULL) { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) - PyErr_Clear(); - else - return -1; - use_newobj = 0; - } - else { - use_newobj = PyString_Check(temp) && - strcmp(PyString_AS_STRING(temp), - "__newobj__") == 0; - Py_DECREF(temp); - } - } - if (use_newobj) { - PyObject *cls; - PyObject *newargtup; - int n, i; - - /* Sanity checks. */ - n = PyTuple_Size(argtup); - if (n < 1) { - PyErr_SetString(PicklingError, "__newobj__ arglist " - "is empty"); - return -1; - } - - cls = PyTuple_GET_ITEM(argtup, 0); - if (! PyObject_HasAttrString(cls, "__new__")) { - PyErr_SetString(PicklingError, "args[0] from " - "__newobj__ args has no __new__"); - return -1; - } - - /* XXX How could ob be NULL? */ - if (ob != NULL) { - PyObject *ob_dot_class; - - ob_dot_class = PyObject_GetAttr(ob, __class___str); - if (ob_dot_class == NULL) { - if (PyErr_ExceptionMatches( - PyExc_AttributeError)) - PyErr_Clear(); - else - return -1; - } - i = ob_dot_class != cls; /* true iff a problem */ - Py_XDECREF(ob_dot_class); - if (i) { - PyErr_SetString(PicklingError, "args[0] from " - "__newobj__ args has the wrong class"); - return -1; - } - } - - /* Save the class and its __new__ arguments. */ - if (save(self, cls, 0) < 0) - return -1; - - newargtup = PyTuple_New(n-1); /* argtup[1:] */ - if (newargtup == NULL) - return -1; - for (i = 1; i < n; ++i) { - PyObject *temp = PyTuple_GET_ITEM(argtup, i); - Py_INCREF(temp); - PyTuple_SET_ITEM(newargtup, i-1, temp); - } - i = save(self, newargtup, 0); - Py_DECREF(newargtup); - if (i < 0) - return -1; - - /* Add NEWOBJ opcode. */ - if (self->write_func(self, &newobj, 1) < 0) - return -1; - } - else { - /* Not using NEWOBJ. */ - if (save(self, callable, 0) < 0 || - save(self, argtup, 0) < 0 || - self->write_func(self, &reduce, 1) < 0) - return -1; - } - - /* Memoize. */ - /* XXX How can ob be NULL? */ - if (ob != NULL) { - if (state && !PyDict_Check(state)) { - if (put2(self, ob) < 0) - return -1; - } - else if (put(self, ob) < 0) - return -1; - } - - - if (listitems && batch_list(self, listitems) < 0) - return -1; - - if (dictitems && batch_dict(self, dictitems) < 0) - return -1; - - if (state) { - if (save(self, state, 0) < 0 || - self->write_func(self, &build, 1) < 0) - return -1; - } - - return 0; -} - -static int -save(Picklerobject *self, PyObject *args, int pers_save) -{ - PyTypeObject *type; - PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0; - int res = -1; - int tmp; - - if (Py_EnterRecursiveCall(" while pickling an object")) - return -1; - - if (!pers_save && self->pers_func) { - if ((tmp = save_pers(self, args, self->pers_func)) != 0) { - res = tmp; - goto finally; - } - } - - if (args == Py_None) { - res = save_none(self, args); - goto finally; - } - - type = Py_TYPE(args); - - switch (type->tp_name[0]) { - case 'b': - if (args == Py_False || args == Py_True) { - res = save_bool(self, args); - goto finally; - } - break; - case 'i': - if (type == &PyInt_Type) { - res = save_int(self, args); - goto finally; - } - break; - - case 'l': - if (type == &PyLong_Type) { - res = save_long(self, args); - goto finally; - } - break; - - case 'f': - if (type == &PyFloat_Type) { - res = save_float(self, args); - goto finally; - } - break; - - case 't': - if (type == &PyTuple_Type && PyTuple_Size(args) == 0) { - res = save_tuple(self, args); - goto finally; - } - break; - - case 's': - if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) { - res = save_string(self, args, 0); - goto finally; - } - break; - -#ifdef Py_USING_UNICODE - case 'u': - if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) { - res = save_unicode(self, args, 0); - goto finally; - } - break; -#endif - } - - if (Py_REFCNT(args) > 1) { - if (!( py_ob_id = PyLong_FromVoidPtr(args))) - goto finally; - - if (PyDict_GetItem(self->memo, py_ob_id)) { - if (get(self, py_ob_id) < 0) - goto finally; - - res = 0; - goto finally; - } - } - - switch (type->tp_name[0]) { - case 's': - if (type == &PyString_Type) { - res = save_string(self, args, 1); - goto finally; - } - break; - -#ifdef Py_USING_UNICODE - case 'u': - if (type == &PyUnicode_Type) { - res = save_unicode(self, args, 1); - goto finally; - } - break; -#endif - - case 't': - if (type == &PyTuple_Type) { - res = save_tuple(self, args); - goto finally; - } - if (type == &PyType_Type) { - res = save_global(self, args, NULL); - goto finally; - } - break; - - case 'l': - if (type == &PyList_Type) { - res = save_list(self, args); - goto finally; - } - break; - - case 'd': - if (type == &PyDict_Type) { - res = save_dict(self, args); - goto finally; - } - break; - - case 'i': - if (type == &PyInstance_Type) { - res = save_inst(self, args); - goto finally; - } - break; - - case 'c': - if (type == &PyClass_Type) { - res = save_global(self, args, NULL); - goto finally; - } - break; - - case 'f': - if (type == &PyFunction_Type) { - res = save_global(self, args, NULL); - if (res && PyErr_ExceptionMatches(PickleError)) { - /* fall back to reduce */ - PyErr_Clear(); - break; - } - goto finally; - } - break; - - case 'b': - if (type == &PyCFunction_Type) { - res = save_global(self, args, NULL); - goto finally; - } - } - - if (!pers_save && self->inst_pers_func) { - if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) { - res = tmp; - goto finally; - } - } - - /* Get a reduction callable, and call it. This may come from - * copy_reg.dispatch_table, the object's __reduce_ex__ method, - * or the object's __reduce__ method. - */ - __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type); - if (__reduce__ != NULL) { - Py_INCREF(__reduce__); - Py_INCREF(args); - ARG_TUP(self, args); - if (self->arg) { - t = PyObject_Call(__reduce__, self->arg, NULL); - FREE_ARG_TUP(self); - } - } - else { - if (PyType_IsSubtype(type, &PyType_Type)) { - res = save_global(self, args, NULL); - goto finally; - } - - /* Check for a __reduce_ex__ method. */ - __reduce__ = PyObject_GetAttr(args, __reduce_ex___str); - if (__reduce__ != NULL) { - t = PyInt_FromLong(self->proto); - if (t != NULL) { - ARG_TUP(self, t); - t = NULL; - if (self->arg) { - t = PyObject_Call(__reduce__, - self->arg, NULL); - FREE_ARG_TUP(self); - } - } - } - else { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) - PyErr_Clear(); - else - goto finally; - /* Check for a __reduce__ method. */ - __reduce__ = PyObject_GetAttr(args, __reduce___str); - if (__reduce__ != NULL) { - t = PyObject_Call(__reduce__, - empty_tuple, NULL); - } - else { - PyErr_SetObject(UnpickleableError, args); - goto finally; - } - } - } - - if (t == NULL) - goto finally; - - if (PyString_Check(t)) { - res = save_global(self, args, t); - goto finally; - } - - if (!PyTuple_Check(t)) { - cPickle_ErrFormat(PicklingError, "Value returned by " - "%s must be string or tuple", - "O", __reduce__); - goto finally; - } - - res = save_reduce(self, t, __reduce__, args); - - finally: - Py_LeaveRecursiveCall(); - Py_XDECREF(py_ob_id); - Py_XDECREF(__reduce__); - Py_XDECREF(t); - - return res; -} - - -static int -dump(Picklerobject *self, PyObject *args) -{ - static char stop = STOP; - - if (self->proto >= 2) { - char bytes[2]; - - bytes[0] = PROTO; - assert(self->proto >= 0 && self->proto < 256); - bytes[1] = (char)self->proto; - if (self->write_func(self, bytes, 2) < 0) - return -1; - } - - if (save(self, args, 0) < 0) - return -1; - - if (self->write_func(self, &stop, 1) < 0) - return -1; - - if (self->write_func(self, NULL, 0) < 0) - return -1; - - return 0; -} - -static PyObject * -Pickle_clear_memo(Picklerobject *self, PyObject *args) -{ - if (self->memo) - PyDict_Clear(self->memo); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -Pickle_getvalue(Picklerobject *self, PyObject *args) -{ - int l, i, rsize, ssize, clear=1, lm; - long ik; - PyObject *k, *r; - char *s, *p, *have_get; - Pdata *data; - - /* Can be called by Python code or C code */ - if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear)) - return NULL; - - /* Check to make sure we are based on a list */ - if (! Pdata_Check(self->file)) { - PyErr_SetString(PicklingError, - "Attempt to getvalue() a non-list-based pickler"); - return NULL; - } - - /* flush write buffer */ - if (write_other(self, NULL, 0) < 0) return NULL; - - data=(Pdata*)self->file; - l=data->length; - - /* set up an array to hold get/put status */ - lm = PyDict_Size(self->memo); - if (lm < 0) return NULL; - lm++; - have_get = malloc(lm); - if (have_get == NULL) return PyErr_NoMemory(); - memset(have_get, 0, lm); - - /* Scan for gets. */ - for (rsize = 0, i = l; --i >= 0; ) { - k = data->data[i]; - - if (PyString_Check(k)) - rsize += PyString_GET_SIZE(k); - - else if (PyInt_Check(k)) { /* put */ - ik = PyInt_AS_LONG((PyIntObject*)k); - if (ik >= lm || ik == 0) { - PyErr_SetString(PicklingError, - "Invalid get data"); - goto err; - } - if (have_get[ik]) /* with matching get */ - rsize += ik < 256 ? 2 : 5; - } - - else if (! (PyTuple_Check(k) && - PyTuple_GET_SIZE(k) == 2 && - PyInt_Check((k = PyTuple_GET_ITEM(k, 0)))) - ) { - PyErr_SetString(PicklingError, - "Unexpected data in internal list"); - goto err; - } - - else { /* put */ - ik = PyInt_AS_LONG((PyIntObject *)k); - if (ik >= lm || ik == 0) { - PyErr_SetString(PicklingError, - "Invalid get data"); - return NULL; - } - have_get[ik] = 1; - rsize += ik < 256 ? 2 : 5; - } - } - - /* Now generate the result */ - r = PyString_FromStringAndSize(NULL, rsize); - if (r == NULL) goto err; - s = PyString_AS_STRING((PyStringObject *)r); - - for (i = 0; i < l; i++) { - k = data->data[i]; - - if (PyString_Check(k)) { - ssize = PyString_GET_SIZE(k); - if (ssize) { - p=PyString_AS_STRING((PyStringObject *)k); - while (--ssize >= 0) - *s++ = *p++; - } - } - - else if (PyTuple_Check(k)) { /* get */ - ik = PyInt_AS_LONG((PyIntObject *) - PyTuple_GET_ITEM(k, 0)); - if (ik < 256) { - *s++ = BINGET; - *s++ = (int)(ik & 0xff); - } - else { - *s++ = LONG_BINGET; - *s++ = (int)(ik & 0xff); - *s++ = (int)((ik >> 8) & 0xff); - *s++ = (int)((ik >> 16) & 0xff); - *s++ = (int)((ik >> 24) & 0xff); - } - } - - else { /* put */ - ik = PyInt_AS_LONG((PyIntObject*)k); - - if (have_get[ik]) { /* with matching get */ - if (ik < 256) { - *s++ = BINPUT; - *s++ = (int)(ik & 0xff); - } - else { - *s++ = LONG_BINPUT; - *s++ = (int)(ik & 0xff); - *s++ = (int)((ik >> 8) & 0xff); - *s++ = (int)((ik >> 16) & 0xff); - *s++ = (int)((ik >> 24) & 0xff); - } - } - } - } - - if (clear) { - PyDict_Clear(self->memo); - Pdata_clear(data, 0); - } - - free(have_get); - return r; - err: - free(have_get); - return NULL; -} - -static PyObject * -Pickler_dump(Picklerobject *self, PyObject *args) -{ - PyObject *ob; - int get=0; - - if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get))) - return NULL; - - if (dump(self, ob) < 0) - return NULL; - - if (get) return Pickle_getvalue(self, NULL); - - /* XXX Why does dump() return self? */ - Py_INCREF(self); - return (PyObject*)self; -} - - -static struct PyMethodDef Pickler_methods[] = -{ - {"dump", (PyCFunction)Pickler_dump, METH_VARARGS, - PyDoc_STR("dump(object) -- " - "Write an object in pickle format to the object's pickle stream")}, - {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS, - PyDoc_STR("clear_memo() -- Clear the picklers memo")}, - {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS, - PyDoc_STR("getvalue() -- Finish picking a list-based pickle")}, - {NULL, NULL} /* sentinel */ -}; - - -static Picklerobject * -newPicklerobject(PyObject *file, int proto) -{ - Picklerobject *self; - - if (proto < 0) - proto = HIGHEST_PROTOCOL; - if (proto > HIGHEST_PROTOCOL) { - PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; " - "the highest available protocol is %d", - proto, HIGHEST_PROTOCOL); - return NULL; - } - - self = PyObject_GC_New(Picklerobject, &Picklertype); - if (self == NULL) - return NULL; - self->proto = proto; - self->bin = proto > 0; - self->fp = NULL; - self->write = NULL; - self->memo = NULL; - self->arg = NULL; - self->pers_func = NULL; - self->inst_pers_func = NULL; - self->write_buf = NULL; - self->fast = 0; - self->fast_container = 0; - self->fast_memo = NULL; - self->buf_size = 0; - self->dispatch_table = NULL; - - self->file = NULL; - if (file) - Py_INCREF(file); - else { - file = Pdata_New(); - if (file == NULL) - goto err; - } - self->file = file; - - if (!( self->memo = PyDict_New())) - goto err; - - if (PyFile_Check(file)) { - self->fp = PyFile_AsFile(file); - if (self->fp == NULL) { - PyErr_SetString(PyExc_ValueError, - "I/O operation on closed file"); - goto err; - } - self->write_func = write_file; - } - else if (PycStringIO_OutputCheck(file)) { - self->write_func = write_cStringIO; - } - else if (file == Py_None) { - self->write_func = write_none; - } - else { - self->write_func = write_other; - - if (! Pdata_Check(file)) { - self->write = PyObject_GetAttr(file, write_str); - if (!self->write) { - PyErr_Clear(); - PyErr_SetString(PyExc_TypeError, - "argument must have 'write' " - "attribute"); - goto err; - } - } - - self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE); - if (self->write_buf == NULL) { - PyErr_NoMemory(); - goto err; - } - } - - if (PyEval_GetRestricted()) { - /* Restricted execution, get private tables */ - PyObject *m = PyImport_ImportModule("copy_reg"); - - if (m == NULL) - goto err; - self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str); - Py_DECREF(m); - if (self->dispatch_table == NULL) - goto err; - } - else { - self->dispatch_table = dispatch_table; - Py_INCREF(dispatch_table); - } - PyObject_GC_Track(self); - - return self; - - err: - Py_DECREF(self); - return NULL; -} - - -static PyObject * -get_Pickler(PyObject *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"file", "protocol", NULL}; - PyObject *file = NULL; - int proto = 0; - - /* XXX - * The documented signature is Pickler(file, protocol=0), but this - * accepts Pickler() and Pickler(integer) too. The meaning then - * is clear as mud, undocumented, and not supported by pickle.py. - * I'm told Zope uses this, but I haven't traced into this code - * far enough to figure out what it means. - */ - if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) { - PyErr_Clear(); - proto = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler", - kwlist, &file, &proto)) - return NULL; - } - return (PyObject *)newPicklerobject(file, proto); -} - - -static void -Pickler_dealloc(Picklerobject *self) -{ - PyObject_GC_UnTrack(self); - Py_XDECREF(self->write); - Py_XDECREF(self->memo); - Py_XDECREF(self->fast_memo); - Py_XDECREF(self->arg); - Py_XDECREF(self->file); - Py_XDECREF(self->pers_func); - Py_XDECREF(self->inst_pers_func); - Py_XDECREF(self->dispatch_table); - PyMem_Free(self->write_buf); - Py_TYPE(self)->tp_free((PyObject *)self); -} - -static int -Pickler_traverse(Picklerobject *self, visitproc visit, void *arg) -{ - Py_VISIT(self->write); - Py_VISIT(self->memo); - Py_VISIT(self->fast_memo); - Py_VISIT(self->arg); - Py_VISIT(self->file); - Py_VISIT(self->pers_func); - Py_VISIT(self->inst_pers_func); - Py_VISIT(self->dispatch_table); - return 0; -} - -static int -Pickler_clear(Picklerobject *self) -{ - Py_CLEAR(self->write); - Py_CLEAR(self->memo); - Py_CLEAR(self->fast_memo); - Py_CLEAR(self->arg); - Py_CLEAR(self->file); - Py_CLEAR(self->pers_func); - Py_CLEAR(self->inst_pers_func); - Py_CLEAR(self->dispatch_table); - return 0; -} - -static PyObject * -Pickler_get_pers_func(Picklerobject *p) -{ - if (p->pers_func == NULL) - PyErr_SetString(PyExc_AttributeError, "persistent_id"); - else - Py_INCREF(p->pers_func); - return p->pers_func; -} - -static int -Pickler_set_pers_func(Picklerobject *p, PyObject *v) -{ - if (v == NULL) { - PyErr_SetString(PyExc_TypeError, - "attribute deletion is not supported"); - return -1; - } - Py_XDECREF(p->pers_func); - Py_INCREF(v); - p->pers_func = v; - return 0; -} - -static int -Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v) -{ - if (v == NULL) { - PyErr_SetString(PyExc_TypeError, - "attribute deletion is not supported"); - return -1; - } - Py_XDECREF(p->inst_pers_func); - Py_INCREF(v); - p->inst_pers_func = v; - return 0; -} - -static PyObject * -Pickler_get_memo(Picklerobject *p) -{ - if (p->memo == NULL) - PyErr_SetString(PyExc_AttributeError, "memo"); - else - Py_INCREF(p->memo); - return p->memo; -} - -static int -Pickler_set_memo(Picklerobject *p, PyObject *v) -{ - if (v == NULL) { - PyErr_SetString(PyExc_TypeError, - "attribute deletion is not supported"); - return -1; - } - if (!PyDict_Check(v)) { - PyErr_SetString(PyExc_TypeError, "memo must be a dictionary"); - return -1; - } - Py_XDECREF(p->memo); - Py_INCREF(v); - p->memo = v; - return 0; -} - -static PyObject * -Pickler_get_error(Picklerobject *p) -{ - /* why is this an attribute on the Pickler? */ - Py_INCREF(PicklingError); - return PicklingError; -} - -static PyMemberDef Pickler_members[] = { - {"binary", T_INT, offsetof(Picklerobject, bin)}, - {"fast", T_INT, offsetof(Picklerobject, fast)}, - {NULL} -}; - -static PyGetSetDef Pickler_getsets[] = { - {"persistent_id", (getter)Pickler_get_pers_func, - (setter)Pickler_set_pers_func}, - {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func}, - {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo}, - {"PicklingError", (getter)Pickler_get_error, NULL}, - {NULL} -}; - -PyDoc_STRVAR(Picklertype__doc__, -"Objects that know how to pickle objects\n"); - -static PyTypeObject Picklertype = { - PyVarObject_HEAD_INIT(NULL, 0) - "cPickle.Pickler", /*tp_name*/ - sizeof(Picklerobject), /*tp_basicsize*/ - 0, - (destructor)Pickler_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 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 */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, - Picklertype__doc__, /* tp_doc */ - (traverseproc)Pickler_traverse, /* tp_traverse */ - (inquiry)Pickler_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - Pickler_methods, /* tp_methods */ - Pickler_members, /* tp_members */ - Pickler_getsets, /* tp_getset */ -}; - -static PyObject * -find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc) -{ - PyObject *global = 0, *module; - - if (fc) { - if (fc==Py_None) { - PyErr_SetString(UnpicklingError, "Global and instance " - "pickles are not supported."); - return NULL; - } - return PyObject_CallFunctionObjArgs(fc, py_module_name, - py_global_name, NULL); - } - - module = PySys_GetObject("modules"); - if (module == NULL) - return NULL; - - module = PyDict_GetItem(module, py_module_name); - if (module == NULL) { - module = PyImport_Import(py_module_name); - if (!module) - return NULL; - global = PyObject_GetAttr(module, py_global_name); - Py_DECREF(module); - } - else - global = PyObject_GetAttr(module, py_global_name); - return global; -} - -static int -marker(Unpicklerobject *self) -{ - if (self->num_marks < 1) { - PyErr_SetString(UnpicklingError, "could not find MARK"); - return -1; - } - - return self->marks[--self->num_marks]; -} - - -static int -load_none(Unpicklerobject *self) -{ - PDATA_APPEND(self->stack, Py_None, -1); - return 0; -} - -static int -bad_readline(void) -{ - PyErr_SetString(UnpicklingError, "pickle data was truncated"); - return -1; -} - -static int -load_int(Unpicklerobject *self) -{ - PyObject *py_int = 0; - char *endptr, *s; - int len, res = -1; - long l; - - if ((len = self->readline_func(self, &s)) < 0) return -1; - if (len < 2) return bad_readline(); - if (!( s=pystrndup(s,len))) return -1; - - errno = 0; - l = strtol(s, &endptr, 0); - - if (errno || (*endptr != '\n') || (endptr[1] != '\0')) { - /* Hm, maybe we've got something long. Let's try reading - it as a Python long object. */ - errno = 0; - py_int = PyLong_FromString(s, NULL, 0); - if (py_int == NULL) { - PyErr_SetString(PyExc_ValueError, - "could not convert string to int"); - goto finally; - } - } - else { - if (len == 3 && (l == 0 || l == 1)) { - if (!( py_int = PyBool_FromLong(l))) goto finally; - } - else { - if (!( py_int = PyInt_FromLong(l))) goto finally; - } - } - - free(s); - PDATA_PUSH(self->stack, py_int, -1); - return 0; - - finally: - free(s); - - return res; -} - -static int -load_bool(Unpicklerobject *self, PyObject *boolean) -{ - assert(boolean == Py_True || boolean == Py_False); - PDATA_APPEND(self->stack, boolean, -1); - return 0; -} - -/* s contains x bytes of a little-endian integer. Return its value as a - * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian - * int, but when x is 4 it's a signed one. This is an historical source - * of x-platform bugs. - */ -static long -calc_binint(char *s, int x) -{ - unsigned char c; - int i; - long l; - - for (i = 0, l = 0L; i < x; i++) { - c = (unsigned char)s[i]; - l |= (long)c << (i * 8); - } -#if SIZEOF_LONG > 4 - /* Unlike BININT1 and BININT2, BININT (more accurately BININT4) - * is signed, so on a box with longs bigger than 4 bytes we need - * to extend a BININT's sign bit to the full width. - */ - if (x == 4 && l & (1L << 31)) - l |= (~0L) << 32; -#endif - return l; -} - - -static int -load_binintx(Unpicklerobject *self, char *s, int x) -{ - PyObject *py_int = 0; - long l; - - l = calc_binint(s, x); - - if (!( py_int = PyInt_FromLong(l))) - return -1; - - PDATA_PUSH(self->stack, py_int, -1); - return 0; -} - - -static int -load_binint(Unpicklerobject *self) -{ - char *s; - - if (self->read_func(self, &s, 4) < 0) - return -1; - - return load_binintx(self, s, 4); -} - - -static int -load_binint1(Unpicklerobject *self) -{ - char *s; - - if (self->read_func(self, &s, 1) < 0) - return -1; - - return load_binintx(self, s, 1); -} - - -static int -load_binint2(Unpicklerobject *self) -{ - char *s; - - if (self->read_func(self, &s, 2) < 0) - return -1; - - return load_binintx(self, s, 2); -} - -static int -load_long(Unpicklerobject *self) -{ - PyObject *l = 0; - char *end, *s; - int len, res = -1; - - if ((len = self->readline_func(self, &s)) < 0) return -1; - if (len < 2) return bad_readline(); - if (!( s=pystrndup(s,len))) return -1; - - if (!( l = PyLong_FromString(s, &end, 0))) - goto finally; - - free(s); - PDATA_PUSH(self->stack, l, -1); - return 0; - - finally: - free(s); - - return res; -} - -/* 'size' bytes contain the # of bytes of little-endian 256's-complement - * data following. - */ -static int -load_counted_long(Unpicklerobject *self, int size) -{ - Py_ssize_t i; - char *nbytes; - unsigned char *pdata; - PyObject *along; - - assert(size == 1 || size == 4); - i = self->read_func(self, &nbytes, size); - if (i < 0) return -1; - - size = calc_binint(nbytes, size); - if (size < 0) { - /* Corrupt or hostile pickle -- we never write one like - * this. - */ - PyErr_SetString(UnpicklingError, "LONG pickle has negative " - "byte count"); - return -1; - } - - if (size == 0) - along = PyLong_FromLong(0L); - else { - /* Read the raw little-endian bytes & convert. */ - i = self->read_func(self, (char **)&pdata, size); - if (i < 0) return -1; - along = _PyLong_FromByteArray(pdata, (size_t)size, - 1 /* little endian */, 1 /* signed */); - } - if (along == NULL) - return -1; - PDATA_PUSH(self->stack, along, -1); - return 0; -} - -static int -load_float(Unpicklerobject *self) -{ - PyObject *py_float = 0; - char *endptr, *s; - int len, res = -1; - double d; - - if ((len = self->readline_func(self, &s)) < 0) return -1; - if (len < 2) return bad_readline(); - if (!( s=pystrndup(s,len))) return -1; - - d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError); - - if (d == -1.0 && PyErr_Occurred()) { - goto finally; - } else if ((endptr[0] != '\n') || (endptr[1] != '\0')) { - PyErr_SetString(PyExc_ValueError, - "could not convert string to float"); - goto finally; - } - - if (!( py_float = PyFloat_FromDouble(d))) - goto finally; - - free(s); - PDATA_PUSH(self->stack, py_float, -1); - return 0; - - finally: - free(s); - - return res; -} - -static int -load_binfloat(Unpicklerobject *self) -{ - PyObject *py_float; - double x; - char *p; - - if (self->read_func(self, &p, 8) < 0) - return -1; - - x = _PyFloat_Unpack8((unsigned char *)p, 0); - if (x == -1.0 && PyErr_Occurred()) - return -1; - - py_float = PyFloat_FromDouble(x); - if (py_float == NULL) - return -1; - - PDATA_PUSH(self->stack, py_float, -1); - return 0; -} - -static int -load_string(Unpicklerobject *self) -{ - PyObject *str = 0; - int len, res = -1; - char *s, *p; - - if ((len = self->readline_func(self, &s)) < 0) return -1; - if (len < 2) return bad_readline(); - if (!( s=pystrndup(s,len))) return -1; - - - /* Strip outermost quotes */ - while (s[len-1] <= ' ') - len--; - if(s[0]=='"' && s[len-1]=='"'){ - s[len-1] = '\0'; - p = s + 1 ; - len -= 2; - } else if(s[0]=='\'' && s[len-1]=='\''){ - s[len-1] = '\0'; - p = s + 1 ; - len -= 2; - } else - goto insecure; - /********************************************/ - - str = PyString_DecodeEscape(p, len, NULL, 0, NULL); - free(s); - if (str) { - PDATA_PUSH(self->stack, str, -1); - res = 0; - } - return res; - - insecure: - free(s); - PyErr_SetString(PyExc_ValueError,"insecure string pickle"); - return -1; -} - - -static int -load_binstring(Unpicklerobject *self) -{ - PyObject *py_string = 0; - long l; - char *s; - - if (self->read_func(self, &s, 4) < 0) return -1; - - l = calc_binint(s, 4); - if (l < 0) { - /* Corrupt or hostile pickle -- we never write one like - * this. - */ - PyErr_SetString(UnpicklingError, - "BINSTRING pickle has negative byte count"); - return -1; - } - - if (self->read_func(self, &s, l) < 0) - return -1; - - if (!( py_string = PyString_FromStringAndSize(s, l))) - return -1; - - PDATA_PUSH(self->stack, py_string, -1); - return 0; -} - - -static int -load_short_binstring(Unpicklerobject *self) -{ - PyObject *py_string = 0; - unsigned char l; - char *s; - - if (self->read_func(self, &s, 1) < 0) - return -1; - - l = (unsigned char)s[0]; - - if (self->read_func(self, &s, l) < 0) return -1; - - if (!( py_string = PyString_FromStringAndSize(s, l))) return -1; - - PDATA_PUSH(self->stack, py_string, -1); - return 0; -} - - -#ifdef Py_USING_UNICODE -static int -load_unicode(Unpicklerobject *self) -{ - PyObject *str = 0; - int len, res = -1; - char *s; - - if ((len = self->readline_func(self, &s)) < 0) return -1; - if (len < 1) return bad_readline(); - - if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL))) - goto finally; - - PDATA_PUSH(self->stack, str, -1); - return 0; - - finally: - return res; -} -#endif - - -#ifdef Py_USING_UNICODE -static int -load_binunicode(Unpicklerobject *self) -{ - PyObject *unicode; - long l; - char *s; - - if (self->read_func(self, &s, 4) < 0) return -1; - - l = calc_binint(s, 4); - if (l < 0) { - /* Corrupt or hostile pickle -- we never write one like - * this. - */ - PyErr_SetString(UnpicklingError, - "BINUNICODE pickle has negative byte count"); - return -1; - } - - if (self->read_func(self, &s, l) < 0) - return -1; - - if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL))) - return -1; - - PDATA_PUSH(self->stack, unicode, -1); - return 0; -} -#endif - - -static int -load_tuple(Unpicklerobject *self) -{ - PyObject *tup; - int i; - - if ((i = marker(self)) < 0) return -1; - if (!( tup=Pdata_popTuple(self->stack, i))) return -1; - PDATA_PUSH(self->stack, tup, -1); - return 0; -} - -static int -load_counted_tuple(Unpicklerobject *self, int len) -{ - PyObject *tup = PyTuple_New(len); - - if (tup == NULL) - return -1; - - while (--len >= 0) { - PyObject *element; - - PDATA_POP(self->stack, element); - if (element == NULL) - return -1; - PyTuple_SET_ITEM(tup, len, element); - } - PDATA_PUSH(self->stack, tup, -1); - return 0; -} - -static int -load_empty_list(Unpicklerobject *self) -{ - PyObject *list; - - if (!( list=PyList_New(0))) return -1; - PDATA_PUSH(self->stack, list, -1); - return 0; -} - -static int -load_empty_dict(Unpicklerobject *self) -{ - PyObject *dict; - - if (!( dict=PyDict_New())) return -1; - PDATA_PUSH(self->stack, dict, -1); - return 0; -} - - -static int -load_list(Unpicklerobject *self) -{ - PyObject *list = 0; - int i; - - if ((i = marker(self)) < 0) return -1; - if (!( list=Pdata_popList(self->stack, i))) return -1; - PDATA_PUSH(self->stack, list, -1); - return 0; -} - -static int -load_dict(Unpicklerobject *self) -{ - PyObject *dict, *key, *value; - int i, j, k; - - if ((i = marker(self)) < 0) return -1; - j=self->stack->length; - - if (!( dict = PyDict_New())) return -1; - - for (k = i+1; k < j; k += 2) { - key =self->stack->data[k-1]; - value=self->stack->data[k ]; - if (PyDict_SetItem(dict, key, value) < 0) { - Py_DECREF(dict); - return -1; - } - } - Pdata_clear(self->stack, i); - PDATA_PUSH(self->stack, dict, -1); - return 0; -} - -static PyObject * -Instance_New(PyObject *cls, PyObject *args) -{ - PyObject *r = 0; - - if (PyClass_Check(cls)) { - int l; - - if ((l=PyObject_Size(args)) < 0) goto err; - if (!( l )) { - PyObject *__getinitargs__; - - __getinitargs__ = PyObject_GetAttr(cls, - __getinitargs___str); - if (!__getinitargs__) { - /* We have a class with no __getinitargs__, - so bypass usual construction */ - PyObject *inst; - - PyErr_Clear(); - if (!( inst=PyInstance_NewRaw(cls, NULL))) - goto err; - return inst; - } - Py_DECREF(__getinitargs__); - } - - if ((r=PyInstance_New(cls, args, NULL))) return r; - else goto err; - } - - if ((r=PyObject_CallObject(cls, args))) return r; - - err: - { - PyObject *tp, *v, *tb, *tmp_value; - - PyErr_Fetch(&tp, &v, &tb); - tmp_value = v; - /* NULL occurs when there was a KeyboardInterrupt */ - if (tmp_value == NULL) - tmp_value = Py_None; - if ((r = PyTuple_Pack(3, tmp_value, cls, args))) { - Py_XDECREF(v); - v=r; - } - PyErr_Restore(tp,v,tb); - } - return NULL; -} - - -static int -load_obj(Unpicklerobject *self) -{ - PyObject *class, *tup, *obj=0; - int i; - - if ((i = marker(self)) < 0) return -1; - if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1; - PDATA_POP(self->stack, class); - if (class) { - obj = Instance_New(class, tup); - Py_DECREF(class); - } - Py_DECREF(tup); - - if (! obj) return -1; - PDATA_PUSH(self->stack, obj, -1); - return 0; -} - - -static int -load_inst(Unpicklerobject *self) -{ - PyObject *tup, *class=0, *obj=0, *module_name, *class_name; - int i, len; - char *s; - - if ((i = marker(self)) < 0) return -1; - - if ((len = self->readline_func(self, &s)) < 0) return -1; - if (len < 2) return bad_readline(); - module_name = PyString_FromStringAndSize(s, len - 1); - if (!module_name) return -1; - - if ((len = self->readline_func(self, &s)) >= 0) { - if (len < 2) return bad_readline(); - if ((class_name = PyString_FromStringAndSize(s, len - 1))) { - class = find_class(module_name, class_name, - self->find_class); - Py_DECREF(class_name); - } - } - Py_DECREF(module_name); - - if (! class) return -1; - - if ((tup=Pdata_popTuple(self->stack, i))) { - obj = Instance_New(class, tup); - Py_DECREF(tup); - } - Py_DECREF(class); - - if (! obj) return -1; - - PDATA_PUSH(self->stack, obj, -1); - return 0; -} - -static int -load_newobj(Unpicklerobject *self) -{ - PyObject *args = NULL; - PyObject *clsraw = NULL; - PyTypeObject *cls; /* clsraw cast to its true type */ - PyObject *obj; - - /* Stack is ... cls argtuple, and we want to call - * cls.__new__(cls, *argtuple). - */ - PDATA_POP(self->stack, args); - if (args == NULL) goto Fail; - if (! PyTuple_Check(args)) { - PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg " - "tuple."); - goto Fail; - } - - PDATA_POP(self->stack, clsraw); - cls = (PyTypeObject *)clsraw; - if (cls == NULL) goto Fail; - if (! PyType_Check(cls)) { - PyErr_SetString(UnpicklingError, "NEWOBJ class argument " - "isn't a type object"); - goto Fail; - } - if (cls->tp_new == NULL) { - PyErr_SetString(UnpicklingError, "NEWOBJ class argument " - "has NULL tp_new"); - goto Fail; - } - - /* Call __new__. */ - obj = cls->tp_new(cls, args, NULL); - if (obj == NULL) goto Fail; - - Py_DECREF(args); - Py_DECREF(clsraw); - PDATA_PUSH(self->stack, obj, -1); - return 0; - - Fail: - Py_XDECREF(args); - Py_XDECREF(clsraw); - return -1; -} - -static int -load_global(Unpicklerobject *self) -{ - PyObject *class = 0, *module_name = 0, *class_name = 0; - int len; - char *s; - - if ((len = self->readline_func(self, &s)) < 0) return -1; - if (len < 2) return bad_readline(); - module_name = PyString_FromStringAndSize(s, len - 1); - if (!module_name) return -1; - - if ((len = self->readline_func(self, &s)) >= 0) { - if (len < 2) { - Py_DECREF(module_name); - return bad_readline(); - } - if ((class_name = PyString_FromStringAndSize(s, len - 1))) { - class = find_class(module_name, class_name, - self->find_class); - Py_DECREF(class_name); - } - } - Py_DECREF(module_name); - - if (! class) return -1; - PDATA_PUSH(self->stack, class, -1); - return 0; -} - - -static int -load_persid(Unpicklerobject *self) -{ - PyObject *pid = 0; - int len; - char *s; - - if (self->pers_func) { - if ((len = self->readline_func(self, &s)) < 0) return -1; - if (len < 2) return bad_readline(); - - pid = PyString_FromStringAndSize(s, len - 1); - if (!pid) return -1; - - if (PyList_Check(self->pers_func)) { - if (PyList_Append(self->pers_func, pid) < 0) { - Py_DECREF(pid); - return -1; - } - } - else { - ARG_TUP(self, pid); - if (self->arg) { - pid = PyObject_Call(self->pers_func, self->arg, - NULL); - FREE_ARG_TUP(self); - } - } - - if (! pid) return -1; - - PDATA_PUSH(self->stack, pid, -1); - return 0; - } - else { - PyErr_SetString(UnpicklingError, - "A load persistent id instruction was encountered,\n" - "but no persistent_load function was specified."); - return -1; - } -} - -static int -load_binpersid(Unpicklerobject *self) -{ - PyObject *pid = 0; - - if (self->pers_func) { - PDATA_POP(self->stack, pid); - if (! pid) return -1; - - if (PyList_Check(self->pers_func)) { - if (PyList_Append(self->pers_func, pid) < 0) { - Py_DECREF(pid); - return -1; - } - } - else { - ARG_TUP(self, pid); - if (self->arg) { - pid = PyObject_Call(self->pers_func, self->arg, - NULL); - FREE_ARG_TUP(self); - } - if (! pid) return -1; - } - - PDATA_PUSH(self->stack, pid, -1); - return 0; - } - else { - PyErr_SetString(UnpicklingError, - "A load persistent id instruction was encountered,\n" - "but no persistent_load function was specified."); - return -1; - } -} - - -static int -load_pop(Unpicklerobject *self) -{ - int len = self->stack->length; - - /* Note that we split the (pickle.py) stack into two stacks, - an object stack and a mark stack. We have to be clever and - pop the right one. We do this by looking at the top of the - mark stack first, and only signalling a stack underflow if - the object stack is empty and the mark stack doesn't match - our expectations. - */ - if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) { - self->num_marks--; - } else if (len > 0) { - len--; - Py_DECREF(self->stack->data[len]); - self->stack->length = len; - } else { - return stackUnderflow(); - } - return 0; -} - - -static int -load_pop_mark(Unpicklerobject *self) -{ - int i; - - if ((i = marker(self)) < 0) - return -1; - - Pdata_clear(self->stack, i); - - return 0; -} - - -static int -load_dup(Unpicklerobject *self) -{ - PyObject *last; - int len; - - if ((len = self->stack->length) <= 0) return stackUnderflow(); - last=self->stack->data[len-1]; - Py_INCREF(last); - PDATA_PUSH(self->stack, last, -1); - return 0; -} - - -static int -load_get(Unpicklerobject *self) -{ - PyObject *py_str = 0, *value = 0; - int len; - char *s; - int rc; - - if ((len = self->readline_func(self, &s)) < 0) return -1; - if (len < 2) return bad_readline(); - - if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1; - - value = PyDict_GetItem(self->memo, py_str); - if (! value) { - PyErr_SetObject(BadPickleGet, py_str); - rc = -1; - } - else { - PDATA_APPEND(self->stack, value, -1); - rc = 0; - } - - Py_DECREF(py_str); - return rc; -} - - -static int -load_binget(Unpicklerobject *self) -{ - PyObject *py_key = 0, *value = 0; - unsigned char key; - char *s; - int rc; - - if (self->read_func(self, &s, 1) < 0) return -1; - - key = (unsigned char)s[0]; - if (!( py_key = PyInt_FromLong((long)key))) return -1; - - value = PyDict_GetItem(self->memo, py_key); - if (! value) { - PyErr_SetObject(BadPickleGet, py_key); - rc = -1; - } - else { - PDATA_APPEND(self->stack, value, -1); - rc = 0; - } - - Py_DECREF(py_key); - return rc; -} - - -static int -load_long_binget(Unpicklerobject *self) -{ - PyObject *py_key = 0, *value = 0; - unsigned char c; - char *s; - long key; - int rc; - - if (self->read_func(self, &s, 4) < 0) return -1; - - c = (unsigned char)s[0]; - key = (long)c; - c = (unsigned char)s[1]; - key |= (long)c << 8; - c = (unsigned char)s[2]; - key |= (long)c << 16; - c = (unsigned char)s[3]; - key |= (long)c << 24; - - if (!( py_key = PyInt_FromLong((long)key))) return -1; - - value = PyDict_GetItem(self->memo, py_key); - if (! value) { - PyErr_SetObject(BadPickleGet, py_key); - rc = -1; - } - else { - PDATA_APPEND(self->stack, value, -1); - rc = 0; - } - - Py_DECREF(py_key); - return rc; -} - -/* Push an object from the extension registry (EXT[124]). nbytes is - * the number of bytes following the opcode, holding the index (code) value. - */ -static int -load_extension(Unpicklerobject *self, int nbytes) -{ - char *codebytes; /* the nbytes bytes after the opcode */ - long code; /* calc_binint returns long */ - PyObject *py_code; /* code as a Python int */ - PyObject *obj; /* the object to push */ - PyObject *pair; /* (module_name, class_name) */ - PyObject *module_name, *class_name; - - assert(nbytes == 1 || nbytes == 2 || nbytes == 4); - if (self->read_func(self, &codebytes, nbytes) < 0) return -1; - code = calc_binint(codebytes, nbytes); - if (code <= 0) { /* note that 0 is forbidden */ - /* Corrupt or hostile pickle. */ - PyErr_SetString(UnpicklingError, "EXT specifies code <= 0"); - return -1; - } - - /* Look for the code in the cache. */ - py_code = PyInt_FromLong(code); - if (py_code == NULL) return -1; - obj = PyDict_GetItem(extension_cache, py_code); - if (obj != NULL) { - /* Bingo. */ - Py_DECREF(py_code); - PDATA_APPEND(self->stack, obj, -1); - return 0; - } - - /* Look up the (module_name, class_name) pair. */ - pair = PyDict_GetItem(inverted_registry, py_code); - if (pair == NULL) { - Py_DECREF(py_code); - PyErr_Format(PyExc_ValueError, "unregistered extension " - "code %ld", code); - return -1; - } - /* Since the extension registry is manipulable via Python code, - * confirm that pair is really a 2-tuple of strings. - */ - if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 || - !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) || - !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) { - Py_DECREF(py_code); - PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] " - "isn't a 2-tuple of strings", code); - return -1; - } - /* Load the object. */ - obj = find_class(module_name, class_name, self->find_class); - if (obj == NULL) { - Py_DECREF(py_code); - return -1; - } - /* Cache code -> obj. */ - code = PyDict_SetItem(extension_cache, py_code, obj); - Py_DECREF(py_code); - if (code < 0) { - Py_DECREF(obj); - return -1; - } - PDATA_PUSH(self->stack, obj, -1); - return 0; -} - -static int -load_put(Unpicklerobject *self) -{ - PyObject *py_str = 0, *value = 0; - int len, l; - char *s; - - if ((l = self->readline_func(self, &s)) < 0) return -1; - if (l < 2) return bad_readline(); - if (!( len=self->stack->length )) return stackUnderflow(); - if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1; - value=self->stack->data[len-1]; - l=PyDict_SetItem(self->memo, py_str, value); - Py_DECREF(py_str); - return l; -} - - -static int -load_binput(Unpicklerobject *self) -{ - PyObject *py_key = 0, *value = 0; - unsigned char key; - char *s; - int len; - - if (self->read_func(self, &s, 1) < 0) return -1; - if (!( (len=self->stack->length) > 0 )) return stackUnderflow(); - - key = (unsigned char)s[0]; - - if (!( py_key = PyInt_FromLong((long)key))) return -1; - value=self->stack->data[len-1]; - len=PyDict_SetItem(self->memo, py_key, value); - Py_DECREF(py_key); - return len; -} - - -static int -load_long_binput(Unpicklerobject *self) -{ - PyObject *py_key = 0, *value = 0; - long key; - unsigned char c; - char *s; - int len; - - if (self->read_func(self, &s, 4) < 0) return -1; - if (!( len=self->stack->length )) return stackUnderflow(); - - c = (unsigned char)s[0]; - key = (long)c; - c = (unsigned char)s[1]; - key |= (long)c << 8; - c = (unsigned char)s[2]; - key |= (long)c << 16; - c = (unsigned char)s[3]; - key |= (long)c << 24; - - if (!( py_key = PyInt_FromLong(key))) return -1; - value=self->stack->data[len-1]; - len=PyDict_SetItem(self->memo, py_key, value); - Py_DECREF(py_key); - return len; -} - - -static int -do_append(Unpicklerobject *self, int x) -{ - PyObject *value = 0, *list = 0, *append_method = 0; - int len, i; - - len=self->stack->length; - if (!( len >= x && x > 0 )) return stackUnderflow(); - /* nothing to do */ - if (len==x) return 0; - - list=self->stack->data[x-1]; - - if (PyList_Check(list)) { - PyObject *slice; - int list_len; - - slice=Pdata_popList(self->stack, x); - if (! slice) return -1; - list_len = PyList_GET_SIZE(list); - i=PyList_SetSlice(list, list_len, list_len, slice); - Py_DECREF(slice); - return i; - } - else { - - if (!( append_method = PyObject_GetAttr(list, append_str))) - return -1; - - for (i = x; i < len; i++) { - PyObject *junk; - - value=self->stack->data[i]; - junk=0; - ARG_TUP(self, value); - if (self->arg) { - junk = PyObject_Call(append_method, self->arg, - NULL); - FREE_ARG_TUP(self); - } - if (! junk) { - Pdata_clear(self->stack, i+1); - self->stack->length=x; - Py_DECREF(append_method); - return -1; - } - Py_DECREF(junk); - } - self->stack->length=x; - Py_DECREF(append_method); - } - - return 0; -} - - -static int -load_append(Unpicklerobject *self) -{ - return do_append(self, self->stack->length - 1); -} - - -static int -load_appends(Unpicklerobject *self) -{ - return do_append(self, marker(self)); -} - - -static int -do_setitems(Unpicklerobject *self, int x) -{ - PyObject *value = 0, *key = 0, *dict = 0; - int len, i, r=0; - - if (!( (len=self->stack->length) >= x - && x > 0 )) return stackUnderflow(); - - dict=self->stack->data[x-1]; - - for (i = x+1; i < len; i += 2) { - key =self->stack->data[i-1]; - value=self->stack->data[i ]; - if (PyObject_SetItem(dict, key, value) < 0) { - r=-1; - break; - } - } - - Pdata_clear(self->stack, x); - - return r; -} - - -static int -load_setitem(Unpicklerobject *self) -{ - return do_setitems(self, self->stack->length - 2); -} - -static int -load_setitems(Unpicklerobject *self) -{ - return do_setitems(self, marker(self)); -} - - -static int -load_build(Unpicklerobject *self) -{ - PyObject *state, *inst, *slotstate; - PyObject *__setstate__; - PyObject *d_key, *d_value; - Py_ssize_t i; - int res = -1; - - /* Stack is ... instance, state. We want to leave instance at - * the stack top, possibly mutated via instance.__setstate__(state). - */ - if (self->stack->length < 2) - return stackUnderflow(); - PDATA_POP(self->stack, state); - if (state == NULL) - return -1; - inst = self->stack->data[self->stack->length - 1]; - - __setstate__ = PyObject_GetAttr(inst, __setstate___str); - if (__setstate__ != NULL) { - PyObject *junk = NULL; - - /* The explicit __setstate__ is responsible for everything. */ - ARG_TUP(self, state); - if (self->arg) { - junk = PyObject_Call(__setstate__, self->arg, NULL); - FREE_ARG_TUP(self); - } - Py_DECREF(__setstate__); - if (junk == NULL) - return -1; - Py_DECREF(junk); - return 0; - } - if (!PyErr_ExceptionMatches(PyExc_AttributeError)) - return -1; - PyErr_Clear(); - - /* A default __setstate__. First see whether state embeds a - * slot state dict too (a proto 2 addition). - */ - if (PyTuple_Check(state) && PyTuple_Size(state) == 2) { - PyObject *temp = state; - state = PyTuple_GET_ITEM(temp, 0); - slotstate = PyTuple_GET_ITEM(temp, 1); - Py_INCREF(state); - Py_INCREF(slotstate); - Py_DECREF(temp); - } - else - slotstate = NULL; - - /* Set inst.__dict__ from the state dict (if any). */ - if (state != Py_None) { - PyObject *dict; - if (! PyDict_Check(state)) { - PyErr_SetString(UnpicklingError, "state is not a " - "dictionary"); - goto finally; - } - dict = PyObject_GetAttr(inst, __dict___str); - if (dict == NULL) - goto finally; - - i = 0; - while (PyDict_Next(state, &i, &d_key, &d_value)) { - /* normally the keys for instance attributes are - interned. we should try to do that here. */ - Py_INCREF(d_key); - if (PyString_CheckExact(d_key)) - PyString_InternInPlace(&d_key); - if (PyObject_SetItem(dict, d_key, d_value) < 0) { - Py_DECREF(d_key); - goto finally; - } - Py_DECREF(d_key); - } - Py_DECREF(dict); - } - - /* Also set instance attributes from the slotstate dict (if any). */ - if (slotstate != NULL) { - if (! PyDict_Check(slotstate)) { - PyErr_SetString(UnpicklingError, "slot state is not " - "a dictionary"); - goto finally; - } - i = 0; - while (PyDict_Next(slotstate, &i, &d_key, &d_value)) { - if (PyObject_SetAttr(inst, d_key, d_value) < 0) - goto finally; - } - } - res = 0; - - finally: - Py_DECREF(state); - Py_XDECREF(slotstate); - return res; -} - - -static int -load_mark(Unpicklerobject *self) -{ - int s; - - /* Note that we split the (pickle.py) stack into two stacks, an - object stack and a mark stack. Here we push a mark onto the - mark stack. - */ - - if ((self->num_marks + 1) >= self->marks_size) { - int *marks; - s=self->marks_size+20; - if (s <= self->num_marks) s=self->num_marks + 1; - if (self->marks == NULL) - marks=(int *)malloc(s * sizeof(int)); - else - marks=(int *)realloc(self->marks, - s * sizeof(int)); - if (!marks) { - PyErr_NoMemory(); - return -1; - } - self->marks = marks; - self->marks_size = s; - } - - self->marks[self->num_marks++] = self->stack->length; - - return 0; -} - -static int -load_reduce(Unpicklerobject *self) -{ - PyObject *callable = 0, *arg_tup = 0, *ob = 0; - - PDATA_POP(self->stack, arg_tup); - if (! arg_tup) return -1; - PDATA_POP(self->stack, callable); - if (callable) { - ob = Instance_New(callable, arg_tup); - Py_DECREF(callable); - } - Py_DECREF(arg_tup); - - if (! ob) return -1; - - PDATA_PUSH(self->stack, ob, -1); - return 0; -} - -/* Just raises an error if we don't know the protocol specified. PROTO - * is the first opcode for protocols >= 2. - */ -static int -load_proto(Unpicklerobject *self) -{ - int i; - char *protobyte; - - i = self->read_func(self, &protobyte, 1); - if (i < 0) - return -1; - - i = calc_binint(protobyte, 1); - /* No point checking for < 0, since calc_binint returns an unsigned - * int when chewing on 1 byte. - */ - assert(i >= 0); - if (i <= HIGHEST_PROTOCOL) - return 0; - - PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i); - return -1; -} - -static PyObject * -load(Unpicklerobject *self) -{ - PyObject *err = 0, *val = 0; - char *s; - - self->num_marks = 0; - if (self->stack->length) Pdata_clear(self->stack, 0); - - while (1) { - if (self->read_func(self, &s, 1) < 0) - break; - - switch (s[0]) { - case NONE: - if (load_none(self) < 0) - break; - continue; - - case BININT: - if (load_binint(self) < 0) - break; - continue; - - case BININT1: - if (load_binint1(self) < 0) - break; - continue; - - case BININT2: - if (load_binint2(self) < 0) - break; - continue; - - case INT: - if (load_int(self) < 0) - break; - continue; - - case LONG: - if (load_long(self) < 0) - break; - continue; - - case LONG1: - if (load_counted_long(self, 1) < 0) - break; - continue; - - case LONG4: - if (load_counted_long(self, 4) < 0) - break; - continue; - - case FLOAT: - if (load_float(self) < 0) - break; - continue; - - case BINFLOAT: - if (load_binfloat(self) < 0) - break; - continue; - - case BINSTRING: - if (load_binstring(self) < 0) - break; - continue; - - case SHORT_BINSTRING: - if (load_short_binstring(self) < 0) - break; - continue; - - case STRING: - if (load_string(self) < 0) - break; - continue; - -#ifdef Py_USING_UNICODE - case UNICODE: - if (load_unicode(self) < 0) - break; - continue; - - case BINUNICODE: - if (load_binunicode(self) < 0) - break; - continue; -#endif - - case EMPTY_TUPLE: - if (load_counted_tuple(self, 0) < 0) - break; - continue; - - case TUPLE1: - if (load_counted_tuple(self, 1) < 0) - break; - continue; - - case TUPLE2: - if (load_counted_tuple(self, 2) < 0) - break; - continue; - - case TUPLE3: - if (load_counted_tuple(self, 3) < 0) - break; - continue; - - case TUPLE: - if (load_tuple(self) < 0) - break; - continue; - - case EMPTY_LIST: - if (load_empty_list(self) < 0) - break; - continue; - - case LIST: - if (load_list(self) < 0) - break; - continue; - - case EMPTY_DICT: - if (load_empty_dict(self) < 0) - break; - continue; - - case DICT: - if (load_dict(self) < 0) - break; - continue; - - case OBJ: - if (load_obj(self) < 0) - break; - continue; - - case INST: - if (load_inst(self) < 0) - break; - continue; - - case NEWOBJ: - if (load_newobj(self) < 0) - break; - continue; - - case GLOBAL: - if (load_global(self) < 0) - break; - continue; - - case APPEND: - if (load_append(self) < 0) - break; - continue; - - case APPENDS: - if (load_appends(self) < 0) - break; - continue; - - case BUILD: - if (load_build(self) < 0) - break; - continue; - - case DUP: - if (load_dup(self) < 0) - break; - continue; - - case BINGET: - if (load_binget(self) < 0) - break; - continue; - - case LONG_BINGET: - if (load_long_binget(self) < 0) - break; - continue; - - case GET: - if (load_get(self) < 0) - break; - continue; - - case EXT1: - if (load_extension(self, 1) < 0) - break; - continue; - - case EXT2: - if (load_extension(self, 2) < 0) - break; - continue; - - case EXT4: - if (load_extension(self, 4) < 0) - break; - continue; - case MARK: - if (load_mark(self) < 0) - break; - continue; - - case BINPUT: - if (load_binput(self) < 0) - break; - continue; - - case LONG_BINPUT: - if (load_long_binput(self) < 0) - break; - continue; - - case PUT: - if (load_put(self) < 0) - break; - continue; - - case POP: - if (load_pop(self) < 0) - break; - continue; - - case POP_MARK: - if (load_pop_mark(self) < 0) - break; - continue; - - case SETITEM: - if (load_setitem(self) < 0) - break; - continue; - - case SETITEMS: - if (load_setitems(self) < 0) - break; - continue; - - case STOP: - break; - - case PERSID: - if (load_persid(self) < 0) - break; - continue; - - case BINPERSID: - if (load_binpersid(self) < 0) - break; - continue; - - case REDUCE: - if (load_reduce(self) < 0) - break; - continue; - - case PROTO: - if (load_proto(self) < 0) - break; - continue; - - case NEWTRUE: - if (load_bool(self, Py_True) < 0) - break; - continue; - - case NEWFALSE: - if (load_bool(self, Py_False) < 0) - break; - continue; - - case '\0': - /* end of file */ - PyErr_SetNone(PyExc_EOFError); - break; - - default: - cPickle_ErrFormat(UnpicklingError, - "invalid load key, '%s'.", - "c", s[0]); - return NULL; - } - - break; - } - - if ((err = PyErr_Occurred())) { - if (err == PyExc_EOFError) { - PyErr_SetNone(PyExc_EOFError); - } - return NULL; - } - - PDATA_POP(self->stack, val); - return val; -} - - -/* No-load functions to support noload, which is used to - find persistent references. */ - -static int -noload_obj(Unpicklerobject *self) -{ - int i; - - if ((i = marker(self)) < 0) return -1; - return Pdata_clear(self->stack, i+1); -} - - -static int -noload_inst(Unpicklerobject *self) -{ - int i; - char *s; - - if ((i = marker(self)) < 0) return -1; - Pdata_clear(self->stack, i); - if (self->readline_func(self, &s) < 0) return -1; - if (self->readline_func(self, &s) < 0) return -1; - PDATA_APPEND(self->stack, Py_None, -1); - return 0; -} - -static int -noload_newobj(Unpicklerobject *self) -{ - PyObject *obj; - - PDATA_POP(self->stack, obj); /* pop argtuple */ - if (obj == NULL) return -1; - Py_DECREF(obj); - - PDATA_POP(self->stack, obj); /* pop cls */ - if (obj == NULL) return -1; - Py_DECREF(obj); - - PDATA_APPEND(self->stack, Py_None, -1); - return 0; -} - -static int -noload_global(Unpicklerobject *self) -{ - char *s; - - if (self->readline_func(self, &s) < 0) return -1; - if (self->readline_func(self, &s) < 0) return -1; - PDATA_APPEND(self->stack, Py_None,-1); - return 0; -} - -static int -noload_reduce(Unpicklerobject *self) -{ - - if (self->stack->length < 2) return stackUnderflow(); - Pdata_clear(self->stack, self->stack->length-2); - PDATA_APPEND(self->stack, Py_None,-1); - return 0; -} - -static int -noload_build(Unpicklerobject *self) { - - if (self->stack->length < 1) return stackUnderflow(); - Pdata_clear(self->stack, self->stack->length-1); - return 0; -} - -static int -noload_extension(Unpicklerobject *self, int nbytes) -{ - char *codebytes; - - assert(nbytes == 1 || nbytes == 2 || nbytes == 4); - if (self->read_func(self, &codebytes, nbytes) < 0) return -1; - PDATA_APPEND(self->stack, Py_None, -1); - return 0; -} - -static int -noload_append(Unpicklerobject *self) -{ - return Pdata_clear(self->stack, self->stack->length - 1); -} - -static int -noload_appends(Unpicklerobject *self) -{ - int i; - if ((i = marker(self)) < 0) return -1; - return Pdata_clear(self->stack, i); -} - -static int -noload_setitem(Unpicklerobject *self) -{ - return Pdata_clear(self->stack, self->stack->length - 2); -} - -static int -noload_setitems(Unpicklerobject *self) -{ - int i; - if ((i = marker(self)) < 0) return -1; - return Pdata_clear(self->stack, i); -} - -static PyObject * -noload(Unpicklerobject *self) -{ - PyObject *err = 0, *val = 0; - char *s; - - self->num_marks = 0; - Pdata_clear(self->stack, 0); - - while (1) { - if (self->read_func(self, &s, 1) < 0) - break; - - switch (s[0]) { - case NONE: - if (load_none(self) < 0) - break; - continue; - - case BININT: - if (load_binint(self) < 0) - break; - continue; - - case BININT1: - if (load_binint1(self) < 0) - break; - continue; - - case BININT2: - if (load_binint2(self) < 0) - break; - continue; - - case INT: - if (load_int(self) < 0) - break; - continue; - - case LONG: - if (load_long(self) < 0) - break; - continue; - - case LONG1: - if (load_counted_long(self, 1) < 0) - break; - continue; - - case LONG4: - if (load_counted_long(self, 4) < 0) - break; - continue; - - case FLOAT: - if (load_float(self) < 0) - break; - continue; - - case BINFLOAT: - if (load_binfloat(self) < 0) - break; - continue; - - case BINSTRING: - if (load_binstring(self) < 0) - break; - continue; - - case SHORT_BINSTRING: - if (load_short_binstring(self) < 0) - break; - continue; - - case STRING: - if (load_string(self) < 0) - break; - continue; - -#ifdef Py_USING_UNICODE - case UNICODE: - if (load_unicode(self) < 0) - break; - continue; - - case BINUNICODE: - if (load_binunicode(self) < 0) - break; - continue; -#endif - - case EMPTY_TUPLE: - if (load_counted_tuple(self, 0) < 0) - break; - continue; - - case TUPLE1: - if (load_counted_tuple(self, 1) < 0) - break; - continue; - - case TUPLE2: - if (load_counted_tuple(self, 2) < 0) - break; - continue; - - case TUPLE3: - if (load_counted_tuple(self, 3) < 0) - break; - continue; - - case TUPLE: - if (load_tuple(self) < 0) - break; - continue; - - case EMPTY_LIST: - if (load_empty_list(self) < 0) - break; - continue; - - case LIST: - if (load_list(self) < 0) - break; - continue; - - case EMPTY_DICT: - if (load_empty_dict(self) < 0) - break; - continue; - - case DICT: - if (load_dict(self) < 0) - break; - continue; - - case OBJ: - if (noload_obj(self) < 0) - break; - continue; - - case INST: - if (noload_inst(self) < 0) - break; - continue; - - case NEWOBJ: - if (noload_newobj(self) < 0) - break; - continue; - - case GLOBAL: - if (noload_global(self) < 0) - break; - continue; - - case APPEND: - if (noload_append(self) < 0) - break; - continue; - - case APPENDS: - if (noload_appends(self) < 0) - break; - continue; - - case BUILD: - if (noload_build(self) < 0) - break; - continue; - - case DUP: - if (load_dup(self) < 0) - break; - continue; - - case BINGET: - if (load_binget(self) < 0) - break; - continue; - - case LONG_BINGET: - if (load_long_binget(self) < 0) - break; - continue; - - case GET: - if (load_get(self) < 0) - break; - continue; - - case EXT1: - if (noload_extension(self, 1) < 0) - break; - continue; - - case EXT2: - if (noload_extension(self, 2) < 0) - break; - continue; - - case EXT4: - if (noload_extension(self, 4) < 0) - break; - continue; - - case MARK: - if (load_mark(self) < 0) - break; - continue; - - case BINPUT: - if (load_binput(self) < 0) - break; - continue; - - case LONG_BINPUT: - if (load_long_binput(self) < 0) - break; - continue; - - case PUT: - if (load_put(self) < 0) - break; - continue; - - case POP: - if (load_pop(self) < 0) - break; - continue; - - case POP_MARK: - if (load_pop_mark(self) < 0) - break; - continue; - - case SETITEM: - if (noload_setitem(self) < 0) - break; - continue; - - case SETITEMS: - if (noload_setitems(self) < 0) - break; - continue; - - case STOP: - break; - - case PERSID: - if (load_persid(self) < 0) - break; - continue; - - case BINPERSID: - if (load_binpersid(self) < 0) - break; - continue; - - case REDUCE: - if (noload_reduce(self) < 0) - break; - continue; - - case PROTO: - if (load_proto(self) < 0) - break; - continue; - - case NEWTRUE: - if (load_bool(self, Py_True) < 0) - break; - continue; - - case NEWFALSE: - if (load_bool(self, Py_False) < 0) - break; - continue; - default: - cPickle_ErrFormat(UnpicklingError, - "invalid load key, '%s'.", - "c", s[0]); - return NULL; - } - - break; - } - - if ((err = PyErr_Occurred())) { - if (err == PyExc_EOFError) { - PyErr_SetNone(PyExc_EOFError); - } - return NULL; - } - - PDATA_POP(self->stack, val); - return val; -} - - -static PyObject * -Unpickler_load(Unpicklerobject *self, PyObject *unused) -{ - return load(self); -} - -static PyObject * -Unpickler_noload(Unpicklerobject *self, PyObject *unused) -{ - return noload(self); -} - - -static struct PyMethodDef Unpickler_methods[] = { - {"load", (PyCFunction)Unpickler_load, METH_NOARGS, - PyDoc_STR("load() -- Load a pickle") - }, - {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS, - PyDoc_STR( - "noload() -- not load a pickle, but go through most of the motions\n" - "\n" - "This function can be used to read past a pickle without instantiating\n" - "any objects or importing any modules. It can also be used to find all\n" - "persistent references without instantiating any objects or importing\n" - "any modules.\n") - }, - {NULL, NULL} /* sentinel */ -}; - - -static Unpicklerobject * -newUnpicklerobject(PyObject *f) -{ - Unpicklerobject *self; - - if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype))) - return NULL; - - self->file = NULL; - self->arg = NULL; - self->stack = (Pdata*)Pdata_New(); - self->pers_func = NULL; - self->last_string = NULL; - self->marks = NULL; - self->num_marks = 0; - self->marks_size = 0; - self->buf_size = 0; - self->read = NULL; - self->readline = NULL; - self->find_class = NULL; - - if (!( self->memo = PyDict_New())) - goto err; - - if (!self->stack) - goto err; - - Py_INCREF(f); - self->file = f; - - /* Set read, readline based on type of f */ - if (PyFile_Check(f)) { - self->fp = PyFile_AsFile(f); - if (self->fp == NULL) { - PyErr_SetString(PyExc_ValueError, - "I/O operation on closed file"); - goto err; - } - self->read_func = read_file; - self->readline_func = readline_file; - } - else if (PycStringIO_InputCheck(f)) { - self->fp = NULL; - self->read_func = read_cStringIO; - self->readline_func = readline_cStringIO; - } - else { - - self->fp = NULL; - self->read_func = read_other; - self->readline_func = readline_other; - - if (!( (self->readline = PyObject_GetAttr(f, readline_str)) && - (self->read = PyObject_GetAttr(f, read_str)))) { - PyErr_Clear(); - PyErr_SetString( PyExc_TypeError, - "argument must have 'read' and " - "'readline' attributes" ); - goto err; - } - } - PyObject_GC_Track(self); - - return self; - - err: - Py_DECREF((PyObject *)self); - return NULL; -} - - -static PyObject * -get_Unpickler(PyObject *self, PyObject *file) -{ - return (PyObject *)newUnpicklerobject(file); -} - - -static void -Unpickler_dealloc(Unpicklerobject *self) -{ - PyObject_GC_UnTrack((PyObject *)self); - Py_XDECREF(self->readline); - Py_XDECREF(self->read); - Py_XDECREF(self->file); - Py_XDECREF(self->memo); - Py_XDECREF(self->stack); - Py_XDECREF(self->pers_func); - Py_XDECREF(self->arg); - Py_XDECREF(self->last_string); - Py_XDECREF(self->find_class); - - if (self->marks) { - free(self->marks); - } - - if (self->buf_size) { - free(self->buf); - } - - Py_TYPE(self)->tp_free((PyObject *)self); -} - -static int -Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg) -{ - Py_VISIT(self->readline); - Py_VISIT(self->read); - Py_VISIT(self->file); - Py_VISIT(self->memo); - Py_VISIT(self->stack); - Py_VISIT(self->pers_func); - Py_VISIT(self->arg); - Py_VISIT(self->last_string); - Py_VISIT(self->find_class); - return 0; -} - -static int -Unpickler_clear(Unpicklerobject *self) -{ - Py_CLEAR(self->readline); - Py_CLEAR(self->read); - Py_CLEAR(self->file); - Py_CLEAR(self->memo); - Py_CLEAR(self->stack); - Py_CLEAR(self->pers_func); - Py_CLEAR(self->arg); - Py_CLEAR(self->last_string); - Py_CLEAR(self->find_class); - return 0; -} - -static PyObject * -Unpickler_getattr(Unpicklerobject *self, char *name) -{ - if (!strcmp(name, "persistent_load")) { - if (!self->pers_func) { - PyErr_SetString(PyExc_AttributeError, name); - return NULL; - } - - Py_INCREF(self->pers_func); - return self->pers_func; - } - - if (!strcmp(name, "find_global")) { - if (!self->find_class) { - PyErr_SetString(PyExc_AttributeError, name); - return NULL; - } - - Py_INCREF(self->find_class); - return self->find_class; - } - - if (!strcmp(name, "memo")) { - if (!self->memo) { - PyErr_SetString(PyExc_AttributeError, name); - return NULL; - } - - Py_INCREF(self->memo); - return self->memo; - } - - if (!strcmp(name, "UnpicklingError")) { - Py_INCREF(UnpicklingError); - return UnpicklingError; - } - - return Py_FindMethod(Unpickler_methods, (PyObject *)self, name); -} - - -static int -Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) -{ - - if (!strcmp(name, "persistent_load")) { - Py_XDECREF(self->pers_func); - self->pers_func = value; - Py_XINCREF(value); - return 0; - } - - if (!strcmp(name, "find_global")) { - Py_XDECREF(self->find_class); - self->find_class = value; - Py_XINCREF(value); - return 0; - } - - if (! value) { - PyErr_SetString(PyExc_TypeError, - "attribute deletion is not supported"); - return -1; - } - - if (strcmp(name, "memo") == 0) { - if (!PyDict_Check(value)) { - PyErr_SetString(PyExc_TypeError, - "memo must be a dictionary"); - return -1; - } - Py_XDECREF(self->memo); - self->memo = value; - Py_INCREF(value); - return 0; - } - - PyErr_SetString(PyExc_AttributeError, name); - return -1; -} - -/* --------------------------------------------------------------------------- - * Module-level functions. - */ - -/* dump(obj, file, protocol=0). */ -static PyObject * -cpm_dump(PyObject *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"obj", "file", "protocol", NULL}; - PyObject *ob, *file, *res = NULL; - Picklerobject *pickler = 0; - int proto = 0; - - if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist, - &ob, &file, &proto))) - goto finally; - - if (!( pickler = newPicklerobject(file, proto))) - goto finally; - - if (dump(pickler, ob) < 0) - goto finally; - - Py_INCREF(Py_None); - res = Py_None; - - finally: - Py_XDECREF(pickler); - - return res; -} - - -/* dumps(obj, protocol=0). */ -static PyObject * -cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"obj", "protocol", NULL}; - PyObject *ob, *file = 0, *res = NULL; - Picklerobject *pickler = 0; - int proto = 0; - - if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist, - &ob, &proto))) - goto finally; - - if (!( file = PycStringIO->NewOutput(128))) - goto finally; - - if (!( pickler = newPicklerobject(file, proto))) - goto finally; - - if (dump(pickler, ob) < 0) - goto finally; - - res = PycStringIO->cgetvalue(file); - - finally: - Py_XDECREF(pickler); - Py_XDECREF(file); - - return res; -} - - -/* load(fileobj). */ -static PyObject * -cpm_load(PyObject *self, PyObject *ob) -{ - Unpicklerobject *unpickler = 0; - PyObject *res = NULL; - - if (!( unpickler = newUnpicklerobject(ob))) - goto finally; - - res = load(unpickler); - - finally: - Py_XDECREF(unpickler); - - return res; -} - - -/* loads(string) */ -static PyObject * -cpm_loads(PyObject *self, PyObject *args) -{ - PyObject *ob, *file = 0, *res = NULL; - Unpicklerobject *unpickler = 0; - - if (!( PyArg_ParseTuple(args, "S:loads", &ob))) - goto finally; - - if (!( file = PycStringIO->NewInput(ob))) - goto finally; - - if (!( unpickler = newUnpicklerobject(file))) - goto finally; - - res = load(unpickler); - - finally: - Py_XDECREF(file); - Py_XDECREF(unpickler); - - return res; -} - - -PyDoc_STRVAR(Unpicklertype__doc__, -"Objects that know how to unpickle"); - -static PyTypeObject Unpicklertype = { - PyVarObject_HEAD_INIT(NULL, 0) - "cPickle.Unpickler", /*tp_name*/ - sizeof(Unpicklerobject), /*tp_basicsize*/ - 0, - (destructor)Unpickler_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - (getattrfunc)Unpickler_getattr, /* tp_getattr */ - (setattrfunc)Unpickler_setattr, /* tp_setattr */ - 0, /* tp_compare */ - 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 | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, - Unpicklertype__doc__, /* tp_doc */ - (traverseproc)Unpickler_traverse, /* tp_traverse */ - (inquiry)Unpickler_clear, /* tp_clear */ -}; - -static struct PyMethodDef cPickle_methods[] = { - {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS, - PyDoc_STR("dump(obj, file, protocol=0) -- " - "Write an object in pickle format to the given file.\n" - "\n" - "See the Pickler docstring for the meaning of optional argument proto.") - }, - - {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS, - PyDoc_STR("dumps(obj, protocol=0) -- " - "Return a string containing an object in pickle format.\n" - "\n" - "See the Pickler docstring for the meaning of optional argument proto.") - }, - - {"load", (PyCFunction)cpm_load, METH_O, - PyDoc_STR("load(file) -- Load a pickle from the given file")}, - - {"loads", (PyCFunction)cpm_loads, METH_VARARGS, - PyDoc_STR("loads(string) -- Load a pickle from the given string")}, - - {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS, - PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n" - "\n" - "This takes a file-like object for writing a pickle data stream.\n" - "The optional proto argument tells the pickler to use the given\n" - "protocol; supported protocols are 0, 1, 2. The default\n" - "protocol is 0, to be backwards compatible. (Protocol 0 is the\n" - "only protocol that can be written to a file opened in text\n" - "mode and read back successfully. When using a protocol higher\n" - "than 0, make sure the file is opened in binary mode, both when\n" - "pickling and unpickling.)\n" - "\n" - "Protocol 1 is more efficient than protocol 0; protocol 2 is\n" - "more efficient than protocol 1.\n" - "\n" - "Specifying a negative protocol version selects the highest\n" - "protocol version supported. The higher the protocol used, the\n" - "more recent the version of Python needed to read the pickle\n" - "produced.\n" - "\n" - "The file parameter must have a write() method that accepts a single\n" - "string argument. It can thus be an open file object, a StringIO\n" - "object, or any other custom object that meets this interface.\n") - }, - - {"Unpickler", (PyCFunction)get_Unpickler, METH_O, - PyDoc_STR("Unpickler(file) -- Create an unpickler.")}, - - { NULL, NULL } -}; - -static int -init_stuff(PyObject *module_dict) -{ - PyObject *copyreg, *t, *r; - -#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1; - - if (PyType_Ready(&Unpicklertype) < 0) - return -1; - if (PyType_Ready(&Picklertype) < 0) - return -1; - - INIT_STR(__class__); - INIT_STR(__getinitargs__); - INIT_STR(__dict__); - INIT_STR(__getstate__); - INIT_STR(__setstate__); - INIT_STR(__name__); - INIT_STR(__main__); - INIT_STR(__reduce__); - INIT_STR(__reduce_ex__); - INIT_STR(write); - INIT_STR(append); - INIT_STR(read); - INIT_STR(readline); - INIT_STR(dispatch_table); - - if (!( copyreg = PyImport_ImportModule("copy_reg"))) - return -1; - - /* This is special because we want to use a different - one in restricted mode. */ - dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str); - if (!dispatch_table) return -1; - - extension_registry = PyObject_GetAttrString(copyreg, - "_extension_registry"); - if (!extension_registry) return -1; - - inverted_registry = PyObject_GetAttrString(copyreg, - "_inverted_registry"); - if (!inverted_registry) return -1; - - extension_cache = PyObject_GetAttrString(copyreg, - "_extension_cache"); - if (!extension_cache) return -1; - - Py_DECREF(copyreg); - - if (!(empty_tuple = PyTuple_New(0))) - return -1; - - two_tuple = PyTuple_New(2); - if (two_tuple == NULL) - return -1; - /* We use this temp container with no regard to refcounts, or to - * keeping containees alive. Exempt from GC, because we don't - * want anything looking at two_tuple() by magic. - */ - PyObject_GC_UnTrack(two_tuple); - - /* Ugh */ - if (!( t=PyImport_ImportModule("__builtin__"))) return -1; - if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0) - return -1; - - if (!( t=PyDict_New())) return -1; - if (!( r=PyRun_String( - "def __str__(self):\n" - " return self.args and ('%s' % self.args[0]) or '(what)'\n", - Py_file_input, - module_dict, t) )) return -1; - Py_DECREF(r); - - PickleError = PyErr_NewException("cPickle.PickleError", NULL, t); - if (!PickleError) - return -1; - - Py_DECREF(t); - - PicklingError = PyErr_NewException("cPickle.PicklingError", - PickleError, NULL); - if (!PicklingError) - return -1; - - if (!( t=PyDict_New())) return -1; - if (!( r=PyRun_String( - "def __str__(self):\n" - " a=self.args\n" - " a=a and type(a[0]) or '(what)'\n" - " return 'Cannot pickle %s objects' % a\n" - , Py_file_input, - module_dict, t) )) return -1; - Py_DECREF(r); - - if (!( UnpickleableError = PyErr_NewException( - "cPickle.UnpickleableError", PicklingError, t))) - return -1; - - Py_DECREF(t); - - if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError", - PickleError, NULL))) - return -1; - - if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet", - UnpicklingError, NULL))) - return -1; - - if (PyDict_SetItemString(module_dict, "PickleError", - PickleError) < 0) - return -1; - - if (PyDict_SetItemString(module_dict, "PicklingError", - PicklingError) < 0) - return -1; - - if (PyDict_SetItemString(module_dict, "UnpicklingError", - UnpicklingError) < 0) - return -1; - - if (PyDict_SetItemString(module_dict, "UnpickleableError", - UnpickleableError) < 0) - return -1; - - if (PyDict_SetItemString(module_dict, "BadPickleGet", - BadPickleGet) < 0) - return -1; - - PycString_IMPORT; - - return 0; -} - -#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ -#define PyMODINIT_FUNC void -#endif -PyMODINIT_FUNC -initcPickle(void) -{ - PyObject *m, *d, *di, *v, *k; - Py_ssize_t i; - char *rev = "1.71"; /* XXX when does this change? */ - PyObject *format_version; - PyObject *compatible_formats; - - Py_TYPE(&Picklertype) = &PyType_Type; - Py_TYPE(&Unpicklertype) = &PyType_Type; - Py_TYPE(&PdataType) = &PyType_Type; - - /* Initialize some pieces. We need to do this before module creation, - * so we're forced to use a temporary dictionary. :( - */ - di = PyDict_New(); - if (!di) return; - if (init_stuff(di) < 0) return; - - /* Create the module and add the functions */ - m = Py_InitModule4("cPickle", cPickle_methods, - cPickle_module_documentation, - (PyObject*)NULL,PYTHON_API_VERSION); - if (m == NULL) - return; - - /* Add some symbolic constants to the module */ - d = PyModule_GetDict(m); - v = PyString_FromString(rev); - PyDict_SetItemString(d, "__version__", v); - Py_XDECREF(v); - - /* Copy data from di. Waaa. */ - for (i=0; PyDict_Next(di, &i, &k, &v); ) { - if (PyObject_SetItem(d, k, v) < 0) { - Py_DECREF(di); - return; - } - } - Py_DECREF(di); - - i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL); - if (i < 0) - return; - - /* These are purely informational; no code uses them. */ - /* File format version we write. */ - format_version = PyString_FromString("2.0"); - /* Format versions we can read. */ - compatible_formats = Py_BuildValue("[sssss]", - "1.0", /* Original protocol 0 */ - "1.1", /* Protocol 0 + INST */ - "1.2", /* Original protocol 1 */ - "1.3", /* Protocol 1 + BINFLOAT */ - "2.0"); /* Original protocol 2 */ - PyDict_SetItemString(d, "format_version", format_version); - PyDict_SetItemString(d, "compatible_formats", compatible_formats); - Py_XDECREF(format_version); - Py_XDECREF(compatible_formats); -} diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c deleted file mode 100644 index a19a31e9d35..00000000000 --- a/Modules/cStringIO.c +++ /dev/null @@ -1,760 +0,0 @@ - -#include "Python.h" -#include "import.h" -#include "cStringIO.h" -#include "structmember.h" - -PyDoc_STRVAR(cStringIO_module_documentation, -"A simple fast partial StringIO replacement.\n" -"\n" -"This module provides a simple useful replacement for\n" -"the StringIO module that is written in C. It does not provide the\n" -"full generality of StringIO, but it provides enough for most\n" -"applications and is especially useful in conjunction with the\n" -"pickle module.\n" -"\n" -"Usage:\n" -"\n" -" from cStringIO import StringIO\n" -"\n" -" an_output_stream=StringIO()\n" -" an_output_stream.write(some_stuff)\n" -" ...\n" -" value=an_output_stream.getvalue()\n" -"\n" -" an_input_stream=StringIO(a_string)\n" -" spam=an_input_stream.readline()\n" -" spam=an_input_stream.read(5)\n" -" an_input_stream.seek(0) # OK, start over\n" -" spam=an_input_stream.read() # and read it all\n" -" \n" -"If someone else wants to provide a more complete implementation,\n" -"go for it. :-) \n" -"\n" -"cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n"); - -/* Declaration for file-like objects that manage data as strings - - The IOobject type should be though of as a common base type for - Iobjects, which provide input (read-only) StringIO objects and - Oobjects, which provide read-write objects. Most of the methods - depend only on common data. -*/ - -typedef struct { - PyObject_HEAD - char *buf; - Py_ssize_t pos, string_size; -} IOobject; - -#define IOOOBJECT(O) ((IOobject*)(O)) - -/* Declarations for objects of type StringO */ - -typedef struct { /* Subtype of IOobject */ - PyObject_HEAD - char *buf; - Py_ssize_t pos, string_size; - - Py_ssize_t buf_size; - int softspace; -} Oobject; - -/* Declarations for objects of type StringI */ - -typedef struct { /* Subtype of IOobject */ - PyObject_HEAD - char *buf; - Py_ssize_t pos, string_size; - /* We store a reference to the object here in order to keep - the buffer alive during the lifetime of the Iobject. */ - PyObject *pbuf; -} Iobject; - -/* IOobject (common) methods */ - -PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing."); - -static int -IO__opencheck(IOobject *self) { - if (!self->buf) { - PyErr_SetString(PyExc_ValueError, - "I/O operation on closed file"); - return 0; - } - return 1; -} - -static PyObject * -IO_get_closed(IOobject *self, void *closure) -{ - PyObject *result = Py_False; - - if (self->buf == NULL) - result = Py_True; - Py_INCREF(result); - return result; -} - -static PyGetSetDef file_getsetlist[] = { - {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"}, - {0}, -}; - -static PyObject * -IO_flush(IOobject *self, PyObject *unused) { - - if (!IO__opencheck(self)) return NULL; - - Py_INCREF(Py_None); - return Py_None; -} - -PyDoc_STRVAR(IO_getval__doc__, -"getvalue([use_pos]) -- Get the string value." -"\n" -"If use_pos is specified and is a true value, then the string returned\n" -"will include only the text up to the current file position.\n"); - -static PyObject * -IO_cgetval(PyObject *self) { - if (!IO__opencheck(IOOOBJECT(self))) return NULL; - assert(IOOOBJECT(self)->pos >= 0); - return PyString_FromStringAndSize(((IOobject*)self)->buf, - ((IOobject*)self)->pos); -} - -static PyObject * -IO_getval(IOobject *self, PyObject *args) { - PyObject *use_pos=Py_None; - int b; - Py_ssize_t s; - - if (!IO__opencheck(self)) return NULL; - if (!PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL; - - b = PyObject_IsTrue(use_pos); - if (b < 0) - return NULL; - if (b) { - s=self->pos; - if (s > self->string_size) s=self->string_size; - } - else - s=self->string_size; - assert(self->pos >= 0); - return PyString_FromStringAndSize(self->buf, s); -} - -PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0"); - -static PyObject * -IO_isatty(IOobject *self, PyObject *unused) { - if (!IO__opencheck(self)) return NULL; - Py_INCREF(Py_False); - return Py_False; -} - -PyDoc_STRVAR(IO_read__doc__, -"read([s]) -- Read s characters, or the rest of the string"); - -static int -IO_cread(PyObject *self, char **output, Py_ssize_t n) { - Py_ssize_t l; - - if (!IO__opencheck(IOOOBJECT(self))) return -1; - assert(IOOOBJECT(self)->pos >= 0); - assert(IOOOBJECT(self)->string_size >= 0); - l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos; - if (n < 0 || n > l) { - n = l; - if (n < 0) n=0; - } - - *output=((IOobject*)self)->buf + ((IOobject*)self)->pos; - ((IOobject*)self)->pos += n; - return n; -} - -static PyObject * -IO_read(IOobject *self, PyObject *args) { - Py_ssize_t n = -1; - char *output = NULL; - - if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL; - - if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL; - - return PyString_FromStringAndSize(output, n); -} - -PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line"); - -static int -IO_creadline(PyObject *self, char **output) { - char *n, *s; - Py_ssize_t l; - - if (!IO__opencheck(IOOOBJECT(self))) return -1; - - for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos, - s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size; - n < s && *n != '\n'; n++); - - if (n < s) n++; - - *output=((IOobject*)self)->buf + ((IOobject*)self)->pos; - l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos; - - assert(IOOOBJECT(self)->pos <= PY_SSIZE_T_MAX - l); - assert(IOOOBJECT(self)->pos >= 0); - assert(IOOOBJECT(self)->string_size >= 0); - - ((IOobject*)self)->pos += l; - return (int)l; -} - -static PyObject * -IO_readline(IOobject *self, PyObject *args) { - int n, m=-1; - char *output; - - if (args) - if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL; - - if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL; - if (m >= 0 && m < n) { - m = n - m; - n -= m; - self->pos -= m; - } - assert(IOOOBJECT(self)->pos >= 0); - return PyString_FromStringAndSize(output, n); -} - -PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines"); - -static PyObject * -IO_readlines(IOobject *self, PyObject *args) { - int n; - char *output; - PyObject *result, *line; - int hint = 0, length = 0; - - if (!PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL; - - result = PyList_New(0); - if (!result) - return NULL; - - while (1){ - if ( (n = IO_creadline((PyObject*)self,&output)) < 0) - goto err; - if (n == 0) - break; - line = PyString_FromStringAndSize (output, n); - if (!line) - goto err; - if (PyList_Append (result, line) == -1) { - Py_DECREF (line); - goto err; - } - Py_DECREF (line); - length += n; - if (hint > 0 && length >= hint) - break; - } - return result; - err: - Py_DECREF(result); - return NULL; -} - -PyDoc_STRVAR(IO_reset__doc__, -"reset() -- Reset the file position to the beginning"); - -static PyObject * -IO_reset(IOobject *self, PyObject *unused) { - - if (!IO__opencheck(self)) return NULL; - - self->pos = 0; - - Py_INCREF(Py_None); - return Py_None; -} - -PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position."); - -static PyObject * -IO_tell(IOobject *self, PyObject *unused) { - - if (!IO__opencheck(self)) return NULL; - - assert(self->pos >= 0); - return PyInt_FromSsize_t(self->pos); -} - -PyDoc_STRVAR(IO_truncate__doc__, -"truncate(): truncate the file at the current position."); - -static PyObject * -IO_truncate(IOobject *self, PyObject *args) { - Py_ssize_t pos = -1; - - if (!IO__opencheck(self)) return NULL; - if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL; - - if (PyTuple_Size(args) == 0) { - /* No argument passed, truncate to current position */ - pos = self->pos; - } - - if (pos < 0) { - errno = EINVAL; - PyErr_SetFromErrno(PyExc_IOError); - return NULL; - } - - if (self->string_size > pos) self->string_size = pos; - self->pos = self->string_size; - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -IO_iternext(Iobject *self) -{ - PyObject *next; - next = IO_readline((IOobject *)self, NULL); - if (!next) - return NULL; - if (!PyString_GET_SIZE(next)) { - Py_DECREF(next); - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - return next; -} - - - - -/* Read-write object methods */ - -PyDoc_STRVAR(IO_seek__doc__, -"seek(position) -- set the current position\n" -"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF"); - -static PyObject * -IO_seek(Iobject *self, PyObject *args) { - Py_ssize_t position; - int mode = 0; - - if (!IO__opencheck(IOOOBJECT(self))) return NULL; - if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode)) - return NULL; - - if (mode == 2) { - position += self->string_size; - } - else if (mode == 1) { - position += self->pos; - } - - if (position < 0) position=0; - - self->pos=position; - - Py_INCREF(Py_None); - return Py_None; -} - -PyDoc_STRVAR(O_write__doc__, -"write(s) -- Write a string to the file" -"\n\nNote (hack:) writing None resets the buffer"); - - -static int -O_cwrite(PyObject *self, const char *c, Py_ssize_t l) { - Py_ssize_t newl; - Oobject *oself; - char *newbuf; - - if (!IO__opencheck(IOOOBJECT(self))) return -1; - oself = (Oobject *)self; - - newl = oself->pos+l; - if (newl >= oself->buf_size) { - oself->buf_size *= 2; - if (oself->buf_size <= newl) { - assert(newl + 1 < INT_MAX); - oself->buf_size = (int)(newl+1); - } - newbuf = (char*)realloc(oself->buf, oself->buf_size); - if (!newbuf) { - PyErr_SetString(PyExc_MemoryError,"out of memory"); - free(oself->buf); - oself->buf = 0; - oself->buf_size = oself->pos = 0; - return -1; - } - oself->buf = newbuf; - } - - if (oself->string_size < oself->pos) { - /* In case of overseek, pad with null bytes the buffer region between - the end of stream and the current position. - - 0 lo string_size hi - | |<---used--->|<----------available----------->| - | | <--to pad-->|<---to write---> | - 0 buf position - */ - memset(oself->buf + oself->string_size, '\0', - (oself->pos - oself->string_size) * sizeof(char)); - } - - memcpy(oself->buf+oself->pos,c,l); - - assert(oself->pos + l < INT_MAX); - oself->pos += (int)l; - - if (oself->string_size < oself->pos) { - oself->string_size = oself->pos; - } - - return (int)l; -} - -static PyObject * -O_write(Oobject *self, PyObject *args) { - char *c; - int l; - - if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL; - - if (O_cwrite((PyObject*)self,c,l) < 0) return NULL; - - Py_INCREF(Py_None); - return Py_None; -} - -PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held."); - -static PyObject * -O_close(Oobject *self, PyObject *unused) { - if (self->buf != NULL) free(self->buf); - self->buf = NULL; - - self->pos = self->string_size = self->buf_size = 0; - - Py_INCREF(Py_None); - return Py_None; -} - -PyDoc_STRVAR(O_writelines__doc__, -"writelines(sequence_of_strings) -> None. Write the strings to the file.\n" -"\n" -"Note that newlines are not added. The sequence can be any iterable object\n" -"producing strings. This is equivalent to calling write() for each string."); -static PyObject * -O_writelines(Oobject *self, PyObject *args) { - PyObject *it, *s; - - it = PyObject_GetIter(args); - if (it == NULL) - return NULL; - while ((s = PyIter_Next(it)) != NULL) { - Py_ssize_t n; - char *c; - if (PyString_AsStringAndSize(s, &c, &n) == -1) { - Py_DECREF(it); - Py_DECREF(s); - return NULL; - } - if (O_cwrite((PyObject *)self, c, n) == -1) { - Py_DECREF(it); - Py_DECREF(s); - return NULL; - } - Py_DECREF(s); - } - - Py_DECREF(it); - - /* See if PyIter_Next failed */ - if (PyErr_Occurred()) - return NULL; - - Py_RETURN_NONE; -} -static struct PyMethodDef O_methods[] = { - /* Common methods: */ - {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__}, - {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__}, - {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__}, - {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__}, - {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__}, - {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__}, - {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__}, - {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__}, - {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__}, - {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__}, - - /* Read-write StringIO specific methods: */ - {"close", (PyCFunction)O_close, METH_NOARGS, O_close__doc__}, - {"write", (PyCFunction)O_write, METH_VARARGS, O_write__doc__}, - {"writelines", (PyCFunction)O_writelines, METH_O, O_writelines__doc__}, - {NULL, NULL} /* sentinel */ -}; - -static PyMemberDef O_memberlist[] = { - {"softspace", T_INT, offsetof(Oobject, softspace), 0, - "flag indicating that a space needs to be printed; used by print"}, - /* getattr(f, "closed") is implemented without this table */ - {NULL} /* Sentinel */ -}; - -static void -O_dealloc(Oobject *self) { - if (self->buf != NULL) - free(self->buf); - PyObject_Del(self); -} - -PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings."); - -static PyTypeObject Otype = { - PyVarObject_HEAD_INIT(NULL, 0) - "cStringIO.StringO", /*tp_name*/ - sizeof(Oobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)O_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr */ - 0, /*tp_setattr */ - 0, /*tp_compare*/ - 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*/ - Otype__doc__, /*tp_doc */ - 0, /*tp_traverse */ - 0, /*tp_clear */ - 0, /*tp_richcompare */ - 0, /*tp_weaklistoffset */ - PyObject_SelfIter, /*tp_iter */ - (iternextfunc)IO_iternext, /*tp_iternext */ - O_methods, /*tp_methods */ - O_memberlist, /*tp_members */ - file_getsetlist, /*tp_getset */ -}; - -static PyObject * -newOobject(int size) { - Oobject *self; - - self = PyObject_New(Oobject, &Otype); - if (self == NULL) - return NULL; - self->pos=0; - self->string_size = 0; - self->softspace = 0; - - self->buf = (char *)malloc(size); - if (!self->buf) { - PyErr_SetString(PyExc_MemoryError,"out of memory"); - self->buf_size = 0; - Py_DECREF(self); - return NULL; - } - - self->buf_size=size; - return (PyObject*)self; -} - -/* End of code for StringO objects */ -/* -------------------------------------------------------- */ - -static PyObject * -I_close(Iobject *self, PyObject *unused) { - Py_CLEAR(self->pbuf); - self->buf = NULL; - - self->pos = self->string_size = 0; - - Py_INCREF(Py_None); - return Py_None; -} - -static struct PyMethodDef I_methods[] = { - /* Common methods: */ - {"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__}, - {"getvalue", (PyCFunction)IO_getval, METH_VARARGS, IO_getval__doc__}, - {"isatty", (PyCFunction)IO_isatty, METH_NOARGS, IO_isatty__doc__}, - {"read", (PyCFunction)IO_read, METH_VARARGS, IO_read__doc__}, - {"readline", (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__}, - {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__}, - {"reset", (PyCFunction)IO_reset, METH_NOARGS, IO_reset__doc__}, - {"seek", (PyCFunction)IO_seek, METH_VARARGS, IO_seek__doc__}, - {"tell", (PyCFunction)IO_tell, METH_NOARGS, IO_tell__doc__}, - {"truncate", (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__}, - - /* Read-only StringIO specific methods: */ - {"close", (PyCFunction)I_close, METH_NOARGS, O_close__doc__}, - {NULL, NULL} -}; - -static void -I_dealloc(Iobject *self) { - Py_XDECREF(self->pbuf); - PyObject_Del(self); -} - - -PyDoc_STRVAR(Itype__doc__, -"Simple type for treating strings as input file streams"); - -static PyTypeObject Itype = { - PyVarObject_HEAD_INIT(NULL, 0) - "cStringIO.StringI", /*tp_name*/ - sizeof(Iobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)I_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /* tp_getattr */ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 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 */ - Itype__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)IO_iternext, /* tp_iternext */ - I_methods, /* tp_methods */ - 0, /* tp_members */ - file_getsetlist, /* tp_getset */ -}; - -static PyObject * -newIobject(PyObject *s) { - Iobject *self; - char *buf; - Py_ssize_t size; - - if (PyUnicode_Check(s)) { - if (PyObject_AsCharBuffer(s, (const char **)&buf, &size) != 0) - return NULL; - } - else if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) { - PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found", - s->ob_type->tp_name); - return NULL; - } - - self = PyObject_New(Iobject, &Itype); - if (!self) return NULL; - Py_INCREF(s); - self->buf=buf; - self->string_size=size; - self->pbuf=s; - self->pos=0; - - return (PyObject*)self; -} - -/* End of code for StringI objects */ -/* -------------------------------------------------------- */ - - -PyDoc_STRVAR(IO_StringIO__doc__, -"StringIO([s]) -- Return a StringIO-like stream for reading or writing"); - -static PyObject * -IO_StringIO(PyObject *self, PyObject *args) { - PyObject *s=0; - - if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL; - - if (s) return newIobject(s); - return newOobject(128); -} - -/* List of methods defined in the module */ - -static struct PyMethodDef IO_methods[] = { - {"StringIO", (PyCFunction)IO_StringIO, - METH_VARARGS, IO_StringIO__doc__}, - {NULL, NULL} /* sentinel */ -}; - - -/* Initialization function for the module (*must* be called initcStringIO) */ - -static struct PycStringIO_CAPI CAPI = { - IO_cread, - IO_creadline, - O_cwrite, - IO_cgetval, - newOobject, - newIobject, - &Itype, - &Otype, -}; - -#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ -#define PyMODINIT_FUNC void -#endif -PyMODINIT_FUNC -initcStringIO(void) { - PyObject *m, *d, *v; - - - /* Create the module and add the functions */ - m = Py_InitModule4("cStringIO", IO_methods, - cStringIO_module_documentation, - (PyObject*)NULL,PYTHON_API_VERSION); - if (m == NULL) return; - - /* Add some symbolic constants to the module */ - d = PyModule_GetDict(m); - - /* Export C API */ - Py_TYPE(&Itype)=&PyType_Type; - Py_TYPE(&Otype)=&PyType_Type; - if (PyType_Ready(&Otype) < 0) return; - if (PyType_Ready(&Itype) < 0) return; - v = PyCapsule_New(&CAPI, PycStringIO_CAPSULE_NAME, NULL); - PyDict_SetItemString(d,"cStringIO_CAPI", v); - Py_XDECREF(v); - - /* Export Types */ - PyDict_SetItemString(d,"InputType", (PyObject*)&Itype); - PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype); - - /* Maybe make certain warnings go away */ - if (0) PycString_IMPORT; -} diff --git a/Modules/cdmodule.c b/Modules/cdmodule.c deleted file mode 100644 index 8dfb769b28e..00000000000 --- a/Modules/cdmodule.c +++ /dev/null @@ -1,800 +0,0 @@ -/* CD module -- interface to Mark Callow's and Roger Chickering's */ - /* CD Audio Library (CD). */ - -#include <sys/types.h> -#include <cdaudio.h> -#include "Python.h" - -#define NCALLBACKS 8 - -typedef struct { - PyObject_HEAD - CDPLAYER *ob_cdplayer; -} cdplayerobject; - -static PyObject *CdError; /* exception cd.error */ - -static PyObject * -CD_allowremoval(cdplayerobject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, ":allowremoval")) - return NULL; - - CDallowremoval(self->ob_cdplayer); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_preventremoval(cdplayerobject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, ":preventremoval")) - return NULL; - - CDpreventremoval(self->ob_cdplayer); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_bestreadsize(cdplayerobject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, ":bestreadsize")) - return NULL; - - return PyInt_FromLong((long) CDbestreadsize(self->ob_cdplayer)); -} - -static PyObject * -CD_close(cdplayerobject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, ":close")) - return NULL; - - if (!CDclose(self->ob_cdplayer)) { - PyErr_SetFromErrno(CdError); /* XXX - ??? */ - return NULL; - } - self->ob_cdplayer = NULL; - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_eject(cdplayerobject *self, PyObject *args) -{ - CDSTATUS status; - - if (!PyArg_ParseTuple(args, ":eject")) - return NULL; - - if (!CDeject(self->ob_cdplayer)) { - if (CDgetstatus(self->ob_cdplayer, &status) && - status.state == CD_NODISC) - PyErr_SetString(CdError, "no disc in player"); - else - PyErr_SetString(CdError, "eject failed"); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_getstatus(cdplayerobject *self, PyObject *args) -{ - CDSTATUS status; - - if (!PyArg_ParseTuple(args, ":getstatus")) - return NULL; - - if (!CDgetstatus(self->ob_cdplayer, &status)) { - PyErr_SetFromErrno(CdError); /* XXX - ??? */ - return NULL; - } - - return Py_BuildValue("(ii(iii)(iii)(iii)iiii)", status.state, - status.track, status.min, status.sec, status.frame, - status.abs_min, status.abs_sec, status.abs_frame, - status.total_min, status.total_sec, status.total_frame, - status.first, status.last, status.scsi_audio, - status.cur_block); -} - -static PyObject * -CD_gettrackinfo(cdplayerobject *self, PyObject *args) -{ - int track; - CDTRACKINFO info; - CDSTATUS status; - - if (!PyArg_ParseTuple(args, "i:gettrackinfo", &track)) - return NULL; - - if (!CDgettrackinfo(self->ob_cdplayer, track, &info)) { - if (CDgetstatus(self->ob_cdplayer, &status) && - status.state == CD_NODISC) - PyErr_SetString(CdError, "no disc in player"); - else - PyErr_SetString(CdError, "gettrackinfo failed"); - return NULL; - } - - return Py_BuildValue("((iii)(iii))", - info.start_min, info.start_sec, info.start_frame, - info.total_min, info.total_sec, info.total_frame); -} - -static PyObject * -CD_msftoblock(cdplayerobject *self, PyObject *args) -{ - int min, sec, frame; - - if (!PyArg_ParseTuple(args, "iii:msftoblock", &min, &sec, &frame)) - return NULL; - - return PyInt_FromLong((long) CDmsftoblock(self->ob_cdplayer, - min, sec, frame)); -} - -static PyObject * -CD_play(cdplayerobject *self, PyObject *args) -{ - int start, play; - CDSTATUS status; - - if (!PyArg_ParseTuple(args, "ii:play", &start, &play)) - return NULL; - - if (!CDplay(self->ob_cdplayer, start, play)) { - if (CDgetstatus(self->ob_cdplayer, &status) && - status.state == CD_NODISC) - PyErr_SetString(CdError, "no disc in player"); - else - PyErr_SetString(CdError, "play failed"); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_playabs(cdplayerobject *self, PyObject *args) -{ - int min, sec, frame, play; - CDSTATUS status; - - if (!PyArg_ParseTuple(args, "iiii:playabs", &min, &sec, &frame, &play)) - return NULL; - - if (!CDplayabs(self->ob_cdplayer, min, sec, frame, play)) { - if (CDgetstatus(self->ob_cdplayer, &status) && - status.state == CD_NODISC) - PyErr_SetString(CdError, "no disc in player"); - else - PyErr_SetString(CdError, "playabs failed"); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_playtrack(cdplayerobject *self, PyObject *args) -{ - int start, play; - CDSTATUS status; - - if (!PyArg_ParseTuple(args, "ii:playtrack", &start, &play)) - return NULL; - - if (!CDplaytrack(self->ob_cdplayer, start, play)) { - if (CDgetstatus(self->ob_cdplayer, &status) && - status.state == CD_NODISC) - PyErr_SetString(CdError, "no disc in player"); - else - PyErr_SetString(CdError, "playtrack failed"); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_playtrackabs(cdplayerobject *self, PyObject *args) -{ - int track, min, sec, frame, play; - CDSTATUS status; - - if (!PyArg_ParseTuple(args, "iiiii:playtrackabs", &track, &min, &sec, - &frame, &play)) - return NULL; - - if (!CDplaytrackabs(self->ob_cdplayer, track, min, sec, frame, play)) { - if (CDgetstatus(self->ob_cdplayer, &status) && - status.state == CD_NODISC) - PyErr_SetString(CdError, "no disc in player"); - else - PyErr_SetString(CdError, "playtrackabs failed"); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_readda(cdplayerobject *self, PyObject *args) -{ - int numframes, n; - PyObject *result; - - if (!PyArg_ParseTuple(args, "i:readda", &numframes)) - return NULL; - - result = PyString_FromStringAndSize(NULL, numframes * sizeof(CDFRAME)); - if (result == NULL) - return NULL; - - n = CDreadda(self->ob_cdplayer, - (CDFRAME *) PyString_AsString(result), numframes); - if (n == -1) { - Py_DECREF(result); - PyErr_SetFromErrno(CdError); - return NULL; - } - if (n < numframes) - _PyString_Resize(&result, n * sizeof(CDFRAME)); - - return result; -} - -static PyObject * -CD_seek(cdplayerobject *self, PyObject *args) -{ - int min, sec, frame; - long PyTryBlock; - - if (!PyArg_ParseTuple(args, "iii:seek", &min, &sec, &frame)) - return NULL; - - PyTryBlock = CDseek(self->ob_cdplayer, min, sec, frame); - if (PyTryBlock == -1) { - PyErr_SetFromErrno(CdError); - return NULL; - } - - return PyInt_FromLong(PyTryBlock); -} - -static PyObject * -CD_seektrack(cdplayerobject *self, PyObject *args) -{ - int track; - long PyTryBlock; - - if (!PyArg_ParseTuple(args, "i:seektrack", &track)) - return NULL; - - PyTryBlock = CDseektrack(self->ob_cdplayer, track); - if (PyTryBlock == -1) { - PyErr_SetFromErrno(CdError); - return NULL; - } - - return PyInt_FromLong(PyTryBlock); -} - -static PyObject * -CD_seekblock(cdplayerobject *self, PyObject *args) -{ - unsigned long PyTryBlock; - - if (!PyArg_ParseTuple(args, "l:seekblock", &PyTryBlock)) - return NULL; - - PyTryBlock = CDseekblock(self->ob_cdplayer, PyTryBlock); - if (PyTryBlock == (unsigned long) -1) { - PyErr_SetFromErrno(CdError); - return NULL; - } - - return PyInt_FromLong(PyTryBlock); -} - -static PyObject * -CD_stop(cdplayerobject *self, PyObject *args) -{ - CDSTATUS status; - - if (!PyArg_ParseTuple(args, ":stop")) - return NULL; - - if (!CDstop(self->ob_cdplayer)) { - if (CDgetstatus(self->ob_cdplayer, &status) && - status.state == CD_NODISC) - PyErr_SetString(CdError, "no disc in player"); - else - PyErr_SetString(CdError, "stop failed"); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_togglepause(cdplayerobject *self, PyObject *args) -{ - CDSTATUS status; - - if (!PyArg_ParseTuple(args, ":togglepause")) - return NULL; - - if (!CDtogglepause(self->ob_cdplayer)) { - if (CDgetstatus(self->ob_cdplayer, &status) && - status.state == CD_NODISC) - PyErr_SetString(CdError, "no disc in player"); - else - PyErr_SetString(CdError, "togglepause failed"); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyMethodDef cdplayer_methods[] = { - {"allowremoval", (PyCFunction)CD_allowremoval, METH_VARARGS}, - {"bestreadsize", (PyCFunction)CD_bestreadsize, METH_VARARGS}, - {"close", (PyCFunction)CD_close, METH_VARARGS}, - {"eject", (PyCFunction)CD_eject, METH_VARARGS}, - {"getstatus", (PyCFunction)CD_getstatus, METH_VARARGS}, - {"gettrackinfo", (PyCFunction)CD_gettrackinfo, METH_VARARGS}, - {"msftoblock", (PyCFunction)CD_msftoblock, METH_VARARGS}, - {"play", (PyCFunction)CD_play, METH_VARARGS}, - {"playabs", (PyCFunction)CD_playabs, METH_VARARGS}, - {"playtrack", (PyCFunction)CD_playtrack, METH_VARARGS}, - {"playtrackabs", (PyCFunction)CD_playtrackabs, METH_VARARGS}, - {"preventremoval", (PyCFunction)CD_preventremoval, METH_VARARGS}, - {"readda", (PyCFunction)CD_readda, METH_VARARGS}, - {"seek", (PyCFunction)CD_seek, METH_VARARGS}, - {"seekblock", (PyCFunction)CD_seekblock, METH_VARARGS}, - {"seektrack", (PyCFunction)CD_seektrack, METH_VARARGS}, - {"stop", (PyCFunction)CD_stop, METH_VARARGS}, - {"togglepause", (PyCFunction)CD_togglepause, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - -static void -cdplayer_dealloc(cdplayerobject *self) -{ - if (self->ob_cdplayer != NULL) - CDclose(self->ob_cdplayer); - PyObject_Del(self); -} - -static PyObject * -cdplayer_getattr(cdplayerobject *self, char *name) -{ - if (self->ob_cdplayer == NULL) { - PyErr_SetString(PyExc_RuntimeError, "no player active"); - return NULL; - } - return Py_FindMethod(cdplayer_methods, (PyObject *)self, name); -} - -PyTypeObject CdPlayertype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "cd.cdplayer", /*tp_name*/ - sizeof(cdplayerobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)cdplayer_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)cdplayer_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ -}; - -static PyObject * -newcdplayerobject(CDPLAYER *cdp) -{ - cdplayerobject *p; - - p = PyObject_New(cdplayerobject, &CdPlayertype); - if (p == NULL) - return NULL; - p->ob_cdplayer = cdp; - return (PyObject *) p; -} - -static PyObject * -CD_open(PyObject *self, PyObject *args) -{ - char *dev, *direction; - CDPLAYER *cdp; - - /* - * Variable number of args. - * First defaults to "None", second defaults to "r". - */ - dev = NULL; - direction = "r"; - if (!PyArg_ParseTuple(args, "|zs:open", &dev, &direction)) - return NULL; - - cdp = CDopen(dev, direction); - if (cdp == NULL) { - PyErr_SetFromErrno(CdError); - return NULL; - } - - return newcdplayerobject(cdp); -} - -typedef struct { - PyObject_HEAD - CDPARSER *ob_cdparser; - struct { - PyObject *ob_cdcallback; - PyObject *ob_cdcallbackarg; - } ob_cdcallbacks[NCALLBACKS]; -} cdparserobject; - -static void -CD_callback(void *arg, CDDATATYPES type, void *data) -{ - PyObject *result, *args, *v = NULL; - char *p; - int i; - cdparserobject *self; - - self = (cdparserobject *) arg; - args = PyTuple_New(3); - if (args == NULL) - return; - Py_INCREF(self->ob_cdcallbacks[type].ob_cdcallbackarg); - PyTuple_SetItem(args, 0, self->ob_cdcallbacks[type].ob_cdcallbackarg); - PyTuple_SetItem(args, 1, PyInt_FromLong((long) type)); - switch (type) { - case cd_audio: - v = PyString_FromStringAndSize(data, CDDA_DATASIZE); - break; - case cd_pnum: - case cd_index: - v = PyInt_FromLong(((CDPROGNUM *) data)->value); - break; - case cd_ptime: - case cd_atime: -#define ptr ((struct cdtimecode *) data) - v = Py_BuildValue("(iii)", - ptr->mhi * 10 + ptr->mlo, - ptr->shi * 10 + ptr->slo, - ptr->fhi * 10 + ptr->flo); -#undef ptr - break; - case cd_catalog: - v = PyString_FromStringAndSize(NULL, 13); - p = PyString_AsString(v); - for (i = 0; i < 13; i++) - *p++ = ((char *) data)[i] + '0'; - break; - case cd_ident: -#define ptr ((struct cdident *) data) - v = PyString_FromStringAndSize(NULL, 12); - p = PyString_AsString(v); - CDsbtoa(p, ptr->country, 2); - p += 2; - CDsbtoa(p, ptr->owner, 3); - p += 3; - *p++ = ptr->year[0] + '0'; - *p++ = ptr->year[1] + '0'; - *p++ = ptr->serial[0] + '0'; - *p++ = ptr->serial[1] + '0'; - *p++ = ptr->serial[2] + '0'; - *p++ = ptr->serial[3] + '0'; - *p++ = ptr->serial[4] + '0'; -#undef ptr - break; - case cd_control: - v = PyInt_FromLong((long) *((unchar *) data)); - break; - } - PyTuple_SetItem(args, 2, v); - if (PyErr_Occurred()) { - Py_DECREF(args); - return; - } - - result = PyEval_CallObject(self->ob_cdcallbacks[type].ob_cdcallback, - args); - Py_DECREF(args); - Py_XDECREF(result); -} - -static PyObject * -CD_deleteparser(cdparserobject *self, PyObject *args) -{ - int i; - - if (!PyArg_ParseTuple(args, ":deleteparser")) - return NULL; - - CDdeleteparser(self->ob_cdparser); - self->ob_cdparser = NULL; - - /* no sense in keeping the callbacks, so remove them */ - for (i = 0; i < NCALLBACKS; i++) { - Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallback); - self->ob_cdcallbacks[i].ob_cdcallback = NULL; - Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallbackarg); - self->ob_cdcallbacks[i].ob_cdcallbackarg = NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_parseframe(cdparserobject *self, PyObject *args) -{ - char *cdfp; - int length; - CDFRAME *p; - - if (!PyArg_ParseTuple(args, "s#:parseframe", &cdfp, &length)) - return NULL; - - if (length % sizeof(CDFRAME) != 0) { - PyErr_SetString(PyExc_TypeError, "bad length"); - return NULL; - } - - p = (CDFRAME *) cdfp; - while (length > 0) { - CDparseframe(self->ob_cdparser, p); - length -= sizeof(CDFRAME); - p++; - if (PyErr_Occurred()) - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_removecallback(cdparserobject *self, PyObject *args) -{ - int type; - - if (!PyArg_ParseTuple(args, "i:removecallback", &type)) - return NULL; - - if (type < 0 || type >= NCALLBACKS) { - PyErr_SetString(PyExc_TypeError, "bad type"); - return NULL; - } - - CDremovecallback(self->ob_cdparser, (CDDATATYPES) type); - - Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallback); - self->ob_cdcallbacks[type].ob_cdcallback = NULL; - - Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallbackarg); - self->ob_cdcallbacks[type].ob_cdcallbackarg = NULL; - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_resetparser(cdparserobject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, ":resetparser")) - return NULL; - - CDresetparser(self->ob_cdparser); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -CD_addcallback(cdparserobject *self, PyObject *args) -{ - int type; - PyObject *func, *funcarg; - - /* XXX - more work here */ - if (!PyArg_ParseTuple(args, "iOO:addcallback", &type, &func, &funcarg)) - return NULL; - - if (type < 0 || type >= NCALLBACKS) { - PyErr_SetString(PyExc_TypeError, "argument out of range"); - return NULL; - } - -#ifdef CDsetcallback - CDaddcallback(self->ob_cdparser, (CDDATATYPES) type, CD_callback, - (void *) self); -#else - CDsetcallback(self->ob_cdparser, (CDDATATYPES) type, CD_callback, - (void *) self); -#endif - Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallback); - Py_INCREF(func); - self->ob_cdcallbacks[type].ob_cdcallback = func; - Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallbackarg); - Py_INCREF(funcarg); - self->ob_cdcallbacks[type].ob_cdcallbackarg = funcarg; - -/* - if (type == cd_audio) { - sigfpe_[_UNDERFL].repls = _ZERO; - handle_sigfpes(_ON, _EN_UNDERFL, NULL, - _ABORT_ON_ERROR, NULL); - } -*/ - - Py_INCREF(Py_None); - return Py_None; -} - -static PyMethodDef cdparser_methods[] = { - {"addcallback", (PyCFunction)CD_addcallback, METH_VARARGS}, - {"deleteparser", (PyCFunction)CD_deleteparser, METH_VARARGS}, - {"parseframe", (PyCFunction)CD_parseframe, METH_VARARGS}, - {"removecallback", (PyCFunction)CD_removecallback, METH_VARARGS}, - {"resetparser", (PyCFunction)CD_resetparser, METH_VARARGS}, - /* backward compatibility */ - {"setcallback", (PyCFunction)CD_addcallback, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - -static void -cdparser_dealloc(cdparserobject *self) -{ - int i; - - for (i = 0; i < NCALLBACKS; i++) { - Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallback); - self->ob_cdcallbacks[i].ob_cdcallback = NULL; - Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallbackarg); - self->ob_cdcallbacks[i].ob_cdcallbackarg = NULL; - } - CDdeleteparser(self->ob_cdparser); - PyObject_Del(self); -} - -static PyObject * -cdparser_getattr(cdparserobject *self, char *name) -{ - if (self->ob_cdparser == NULL) { - PyErr_SetString(PyExc_RuntimeError, "no parser active"); - return NULL; - } - - return Py_FindMethod(cdparser_methods, (PyObject *)self, name); -} - -PyTypeObject CdParsertype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "cd.cdparser", /*tp_name*/ - sizeof(cdparserobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)cdparser_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)cdparser_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ -}; - -static PyObject * -newcdparserobject(CDPARSER *cdp) -{ - cdparserobject *p; - int i; - - p = PyObject_New(cdparserobject, &CdParsertype); - if (p == NULL) - return NULL; - p->ob_cdparser = cdp; - for (i = 0; i < NCALLBACKS; i++) { - p->ob_cdcallbacks[i].ob_cdcallback = NULL; - p->ob_cdcallbacks[i].ob_cdcallbackarg = NULL; - } - return (PyObject *) p; -} - -static PyObject * -CD_createparser(PyObject *self, PyObject *args) -{ - CDPARSER *cdp; - - if (!PyArg_ParseTuple(args, ":createparser")) - return NULL; - cdp = CDcreateparser(); - if (cdp == NULL) { - PyErr_SetString(CdError, "createparser failed"); - return NULL; - } - - return newcdparserobject(cdp); -} - -static PyObject * -CD_msftoframe(PyObject *self, PyObject *args) -{ - int min, sec, frame; - - if (!PyArg_ParseTuple(args, "iii:msftoframe", &min, &sec, &frame)) - return NULL; - - return PyInt_FromLong((long) CDmsftoframe(min, sec, frame)); -} - -static PyMethodDef CD_methods[] = { - {"open", (PyCFunction)CD_open, METH_VARARGS}, - {"createparser", (PyCFunction)CD_createparser, METH_VARARGS}, - {"msftoframe", (PyCFunction)CD_msftoframe, METH_VARARGS}, - {NULL, NULL} /* Sentinel */ -}; - -void -initcd(void) -{ - PyObject *m, *d; - - if (PyErr_WarnPy3k("the cd module has been removed in " - "Python 3.0", 2) < 0) - return; - - m = Py_InitModule("cd", CD_methods); - if (m == NULL) - return; - d = PyModule_GetDict(m); - - CdError = PyErr_NewException("cd.error", NULL, NULL); - PyDict_SetItemString(d, "error", CdError); - - /* Identifiers for the different types of callbacks from the parser */ - PyDict_SetItemString(d, "audio", PyInt_FromLong((long) cd_audio)); - PyDict_SetItemString(d, "pnum", PyInt_FromLong((long) cd_pnum)); - PyDict_SetItemString(d, "index", PyInt_FromLong((long) cd_index)); - PyDict_SetItemString(d, "ptime", PyInt_FromLong((long) cd_ptime)); - PyDict_SetItemString(d, "atime", PyInt_FromLong((long) cd_atime)); - PyDict_SetItemString(d, "catalog", PyInt_FromLong((long) cd_catalog)); - PyDict_SetItemString(d, "ident", PyInt_FromLong((long) cd_ident)); - PyDict_SetItemString(d, "control", PyInt_FromLong((long) cd_control)); - - /* Block size information for digital audio data */ - PyDict_SetItemString(d, "DATASIZE", - PyInt_FromLong((long) CDDA_DATASIZE)); - PyDict_SetItemString(d, "BLOCKSIZE", - PyInt_FromLong((long) CDDA_BLOCKSIZE)); - - /* Possible states for the cd player */ - PyDict_SetItemString(d, "ERROR", PyInt_FromLong((long) CD_ERROR)); - PyDict_SetItemString(d, "NODISC", PyInt_FromLong((long) CD_NODISC)); - PyDict_SetItemString(d, "READY", PyInt_FromLong((long) CD_READY)); - PyDict_SetItemString(d, "PLAYING", PyInt_FromLong((long) CD_PLAYING)); - PyDict_SetItemString(d, "PAUSED", PyInt_FromLong((long) CD_PAUSED)); - PyDict_SetItemString(d, "STILL", PyInt_FromLong((long) CD_STILL)); -#ifdef CD_CDROM /* only newer versions of the library */ - PyDict_SetItemString(d, "CDROM", PyInt_FromLong((long) CD_CDROM)); -#endif -} diff --git a/Modules/cgen.py b/Modules/cgen.py deleted file mode 100644 index c63962b11d8..00000000000 --- a/Modules/cgen.py +++ /dev/null @@ -1,523 +0,0 @@ -######################################################################## -# Copyright (c) 2000, BeOpen.com. -# Copyright (c) 1995-2000, Corporation for National Research Initiatives. -# Copyright (c) 1990-1995, Stichting Mathematisch Centrum. -# All rights reserved. -# -# See the file "Misc/COPYRIGHT" for information on usage and -# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. -######################################################################## - -# Python script to parse cstubs file for gl and generate C stubs. -# usage: python cgen.py <cstubs >glmodule.c -# -# NOTE: You must first make a python binary without the "GL" option -# before you can run this, when building Python for the first time. -# See comments in the Makefile. -# -# XXX BUG return arrays generate wrong code -# XXX need to change error returns into gotos to free mallocked arrays -from warnings import warnpy3k -warnpy3k("the cgen module has been removed in Python 3.0", stacklevel=2) -del warnpy3k - - -import string -import sys - - -# Function to print to stderr -# -def err(*args): - savestdout = sys.stdout - try: - sys.stdout = sys.stderr - for i in args: - print i, - print - finally: - sys.stdout = savestdout - - -# The set of digits that form a number -# -digits = '0123456789' - - -# Function to extract a string of digits from the front of the string. -# Returns the leading string of digits and the remaining string. -# If no number is found, returns '' and the original string. -# -def getnum(s): - n = '' - while s and s[0] in digits: - n = n + s[0] - s = s[1:] - return n, s - - -# Function to check if a string is a number -# -def isnum(s): - if not s: return False - for c in s: - if not c in digits: return False - return True - - -# Allowed function return types -# -return_types = ['void', 'short', 'long'] - - -# Allowed function argument types -# -arg_types = ['char', 'string', 'short', 'u_short', 'float', 'long', 'double'] - - -# Need to classify arguments as follows -# simple input variable -# simple output variable -# input array -# output array -# input giving size of some array -# -# Array dimensions can be specified as follows -# constant -# argN -# constant * argN -# retval -# constant * retval -# -# The dimensions given as constants * something are really -# arrays of points where points are 2- 3- or 4-tuples -# -# We have to consider three lists: -# python input arguments -# C stub arguments (in & out) -# python output arguments (really return values) -# -# There is a mapping from python input arguments to the input arguments -# of the C stub, and a further mapping from C stub arguments to the -# python return values - - -# Exception raised by checkarg() and generate() -# -arg_error = 'bad arg' - - -# Function to check one argument. -# Arguments: the type and the arg "name" (really mode plus subscript). -# Raises arg_error if something's wrong. -# Return type, mode, factor, rest of subscript; factor and rest may be empty. -# -def checkarg(type, arg): - # - # Turn "char *x" into "string x". - # - if type == 'char' and arg[0] == '*': - type = 'string' - arg = arg[1:] - # - # Check that the type is supported. - # - if type not in arg_types: - raise arg_error, ('bad type', type) - if type[:2] == 'u_': - type = 'unsigned ' + type[2:] - # - # Split it in the mode (first character) and the rest. - # - mode, rest = arg[:1], arg[1:] - # - # The mode must be 's' for send (= input) or 'r' for return argument. - # - if mode not in ('r', 's'): - raise arg_error, ('bad arg mode', mode) - # - # Is it a simple argument: if so, we are done. - # - if not rest: - return type, mode, '', '' - # - # Not a simple argument; must be an array. - # The 'rest' must be a subscript enclosed in [ and ]. - # The subscript must be one of the following forms, - # otherwise we don't handle it (where N is a number): - # N - # argN - # retval - # N*argN - # N*retval - # - if rest[:1] <> '[' or rest[-1:] <> ']': - raise arg_error, ('subscript expected', rest) - sub = rest[1:-1] - # - # Is there a leading number? - # - num, sub = getnum(sub) - if num: - # There is a leading number - if not sub: - # The subscript is just a number - return type, mode, num, '' - if sub[:1] == '*': - # There is a factor prefix - sub = sub[1:] - else: - raise arg_error, ('\'*\' expected', sub) - if sub == 'retval': - # size is retval -- must be a reply argument - if mode <> 'r': - raise arg_error, ('non-r mode with [retval]', mode) - elif not isnum(sub) and (sub[:3] <> 'arg' or not isnum(sub[3:])): - raise arg_error, ('bad subscript', sub) - # - return type, mode, num, sub - - -# List of functions for which we have generated stubs -# -functions = [] - - -# Generate the stub for the given function, using the database of argument -# information build by successive calls to checkarg() -# -def generate(type, func, database): - # - # Check that we can handle this case: - # no variable size reply arrays yet - # - n_in_args = 0 - n_out_args = 0 - # - for a_type, a_mode, a_factor, a_sub in database: - if a_mode == 's': - n_in_args = n_in_args + 1 - elif a_mode == 'r': - n_out_args = n_out_args + 1 - else: - # Can't happen - raise arg_error, ('bad a_mode', a_mode) - if (a_mode == 'r' and a_sub) or a_sub == 'retval': - err('Function', func, 'too complicated:', - a_type, a_mode, a_factor, a_sub) - print '/* XXX Too complicated to generate code for */' - return - # - functions.append(func) - # - # Stub header - # - print - print 'static PyObject *' - print 'gl_' + func + '(self, args)' - print '\tPyObject *self;' - print '\tPyObject *args;' - print '{' - # - # Declare return value if any - # - if type <> 'void': - print '\t' + type, 'retval;' - # - # Declare arguments - # - for i in range(len(database)): - a_type, a_mode, a_factor, a_sub = database[i] - print '\t' + a_type, - brac = ket = '' - if a_sub and not isnum(a_sub): - if a_factor: - brac = '(' - ket = ')' - print brac + '*', - print 'arg' + repr(i+1) + ket, - if a_sub and isnum(a_sub): - print '[', a_sub, ']', - if a_factor: - print '[', a_factor, ']', - print ';' - # - # Find input arguments derived from array sizes - # - for i in range(len(database)): - a_type, a_mode, a_factor, a_sub = database[i] - if a_mode == 's' and a_sub[:3] == 'arg' and isnum(a_sub[3:]): - # Sending a variable-length array - n = eval(a_sub[3:]) - if 1 <= n <= len(database): - b_type, b_mode, b_factor, b_sub = database[n-1] - if b_mode == 's': - database[n-1] = b_type, 'i', a_factor, repr(i) - n_in_args = n_in_args - 1 - # - # Assign argument positions in the Python argument list - # - in_pos = [] - i_in = 0 - for i in range(len(database)): - a_type, a_mode, a_factor, a_sub = database[i] - if a_mode == 's': - in_pos.append(i_in) - i_in = i_in + 1 - else: - in_pos.append(-1) - # - # Get input arguments - # - for i in range(len(database)): - a_type, a_mode, a_factor, a_sub = database[i] - if a_type[:9] == 'unsigned ': - xtype = a_type[9:] - else: - xtype = a_type - if a_mode == 'i': - # - # Implicit argument; - # a_factor is divisor if present, - # a_sub indicates which arg (`database index`) - # - j = eval(a_sub) - print '\tif', - print '(!geti' + xtype + 'arraysize(args,', - print repr(n_in_args) + ',', - print repr(in_pos[j]) + ',', - if xtype <> a_type: - print '('+xtype+' *)', - print '&arg' + repr(i+1) + '))' - print '\t\treturn NULL;' - if a_factor: - print '\targ' + repr(i+1), - print '= arg' + repr(i+1), - print '/', a_factor + ';' - elif a_mode == 's': - if a_sub and not isnum(a_sub): - # Allocate memory for varsize array - print '\tif ((arg' + repr(i+1), '=', - if a_factor: - print '('+a_type+'(*)['+a_factor+'])', - print 'PyMem_NEW(' + a_type, ',', - if a_factor: - print a_factor, '*', - print a_sub, ')) == NULL)' - print '\t\treturn PyErr_NoMemory();' - print '\tif', - if a_factor or a_sub: # Get a fixed-size array array - print '(!geti' + xtype + 'array(args,', - print repr(n_in_args) + ',', - print repr(in_pos[i]) + ',', - if a_factor: print a_factor, - if a_factor and a_sub: print '*', - if a_sub: print a_sub, - print ',', - if (a_sub and a_factor) or xtype <> a_type: - print '('+xtype+' *)', - print 'arg' + repr(i+1) + '))' - else: # Get a simple variable - print '(!geti' + xtype + 'arg(args,', - print repr(n_in_args) + ',', - print repr(in_pos[i]) + ',', - if xtype <> a_type: - print '('+xtype+' *)', - print '&arg' + repr(i+1) + '))' - print '\t\treturn NULL;' - # - # Begin of function call - # - if type <> 'void': - print '\tretval =', func + '(', - else: - print '\t' + func + '(', - # - # Argument list - # - for i in range(len(database)): - if i > 0: print ',', - a_type, a_mode, a_factor, a_sub = database[i] - if a_mode == 'r' and not a_factor: - print '&', - print 'arg' + repr(i+1), - # - # End of function call - # - print ');' - # - # Free varsize arrays - # - for i in range(len(database)): - a_type, a_mode, a_factor, a_sub = database[i] - if a_mode == 's' and a_sub and not isnum(a_sub): - print '\tPyMem_DEL(arg' + repr(i+1) + ');' - # - # Return - # - if n_out_args: - # - # Multiple return values -- construct a tuple - # - if type <> 'void': - n_out_args = n_out_args + 1 - if n_out_args == 1: - for i in range(len(database)): - a_type, a_mode, a_factor, a_sub = database[i] - if a_mode == 'r': - break - else: - raise arg_error, 'expected r arg not found' - print '\treturn', - print mkobject(a_type, 'arg' + repr(i+1)) + ';' - else: - print '\t{ PyObject *v = PyTuple_New(', - print n_out_args, ');' - print '\t if (v == NULL) return NULL;' - i_out = 0 - if type <> 'void': - print '\t PyTuple_SetItem(v,', - print repr(i_out) + ',', - print mkobject(type, 'retval') + ');' - i_out = i_out + 1 - for i in range(len(database)): - a_type, a_mode, a_factor, a_sub = database[i] - if a_mode == 'r': - print '\t PyTuple_SetItem(v,', - print repr(i_out) + ',', - s = mkobject(a_type, 'arg' + repr(i+1)) - print s + ');' - i_out = i_out + 1 - print '\t return v;' - print '\t}' - else: - # - # Simple function return - # Return None or return value - # - if type == 'void': - print '\tPy_INCREF(Py_None);' - print '\treturn Py_None;' - else: - print '\treturn', mkobject(type, 'retval') + ';' - # - # Stub body closing brace - # - print '}' - - -# Subroutine to return a function call to mknew<type>object(<arg>) -# -def mkobject(type, arg): - if type[:9] == 'unsigned ': - type = type[9:] - return 'mknew' + type + 'object((' + type + ') ' + arg + ')' - return 'mknew' + type + 'object(' + arg + ')' - - -defined_archs = [] - -# usage: cgen [ -Dmach ... ] [ file ] -for arg in sys.argv[1:]: - if arg[:2] == '-D': - defined_archs.append(arg[2:]) - else: - # Open optional file argument - sys.stdin = open(arg, 'r') - - -# Input line number -lno = 0 - - -# Input is divided in two parts, separated by a line containing '%%'. -# <part1> -- literally copied to stdout -# <part2> -- stub definitions - -# Variable indicating the current input part. -# -part = 1 - -# Main loop over the input -# -while 1: - try: - line = raw_input() - except EOFError: - break - # - lno = lno+1 - words = string.split(line) - # - if part == 1: - # - # In part 1, copy everything literally - # except look for a line of just '%%' - # - if words == ['%%']: - part = part + 1 - else: - # - # Look for names of manually written - # stubs: a single percent followed by the name - # of the function in Python. - # The stub name is derived by prefixing 'gl_'. - # - if words and words[0][0] == '%': - func = words[0][1:] - if (not func) and words[1:]: - func = words[1] - if func: - functions.append(func) - else: - print line - continue - if not words: - continue # skip empty line - elif words[0] == 'if': - # if XXX rest - # if !XXX rest - if words[1][0] == '!': - if words[1][1:] in defined_archs: - continue - elif words[1] not in defined_archs: - continue - words = words[2:] - if words[0] == '#include': - print line - elif words[0][:1] == '#': - pass # ignore comment - elif words[0] not in return_types: - err('Line', lno, ': bad return type :', words[0]) - elif len(words) < 2: - err('Line', lno, ': no funcname :', line) - else: - if len(words) % 2 <> 0: - err('Line', lno, ': odd argument list :', words[2:]) - else: - database = [] - try: - for i in range(2, len(words), 2): - x = checkarg(words[i], words[i+1]) - database.append(x) - print - print '/*', - for w in words: print w, - print '*/' - generate(words[0], words[1], database) - except arg_error, msg: - err('Line', lno, ':', msg) - - -print -print 'static struct PyMethodDef gl_methods[] = {' -for func in functions: - print '\t{"' + func + '", gl_' + func + '},' -print '\t{NULL, NULL} /* Sentinel */' -print '};' -print -print 'void' -print 'initgl()' -print '{' -print '\t(void) Py_InitModule("gl", gl_methods);' -print '}' diff --git a/Modules/cgensupport.c b/Modules/cgensupport.c deleted file mode 100644 index aad43a24edf..00000000000 --- a/Modules/cgensupport.c +++ /dev/null @@ -1,310 +0,0 @@ - -/* Functions used by cgen output */ - -#include "Python.h" -#include "cgensupport.h" - - -/* Functions to extract arguments. - These needs to know the total number of arguments supplied, - since the argument list is a tuple only of there is more than - one argument. */ - -int -PyArg_GetObject(register PyObject *args, int nargs, int i, PyObject **p_arg) -{ - if (nargs != 1) { - if (args == NULL || !PyTuple_Check(args) || - nargs != PyTuple_Size(args) || - i < 0 || i >= nargs) { - return PyErr_BadArgument(); - } - else { - args = PyTuple_GetItem(args, i); - } - } - if (args == NULL) { - return PyErr_BadArgument(); - } - *p_arg = args; - return 1; -} - -int -PyArg_GetLong(register PyObject *args, int nargs, int i, long *p_arg) -{ - if (nargs != 1) { - if (args == NULL || !PyTuple_Check(args) || - nargs != PyTuple_Size(args) || - i < 0 || i >= nargs) { - return PyErr_BadArgument(); - } - args = PyTuple_GetItem(args, i); - } - if (args == NULL || !PyInt_Check(args)) { - return PyErr_BadArgument(); - } - *p_arg = PyInt_AsLong(args); - return 1; -} - -int -PyArg_GetShort(register PyObject *args, int nargs, int i, short *p_arg) -{ - long x; - if (!PyArg_GetLong(args, nargs, i, &x)) - return 0; - *p_arg = (short) x; - return 1; -} - -static int -extractdouble(register PyObject *v, double *p_arg) -{ - if (v == NULL) { - /* Fall through to error return at end of function */ - } - else if (PyFloat_Check(v)) { - *p_arg = PyFloat_AS_DOUBLE((PyFloatObject *)v); - return 1; - } - else if (PyInt_Check(v)) { - *p_arg = PyInt_AS_LONG((PyIntObject *)v); - return 1; - } - else if (PyLong_Check(v)) { - *p_arg = PyLong_AsDouble(v); - return 1; - } - return PyErr_BadArgument(); -} - -static int -extractfloat(register PyObject *v, float *p_arg) -{ - if (v == NULL) { - /* Fall through to error return at end of function */ - } - else if (PyFloat_Check(v)) { - *p_arg = (float) PyFloat_AS_DOUBLE((PyFloatObject *)v); - return 1; - } - else if (PyInt_Check(v)) { - *p_arg = (float) PyInt_AS_LONG((PyIntObject *)v); - return 1; - } - else if (PyLong_Check(v)) { - *p_arg = (float) PyLong_AsDouble(v); - return 1; - } - return PyErr_BadArgument(); -} - -int -PyArg_GetFloat(register PyObject *args, int nargs, int i, float *p_arg) -{ - PyObject *v; - float x; - if (!PyArg_GetObject(args, nargs, i, &v)) - return 0; - if (!extractfloat(v, &x)) - return 0; - *p_arg = x; - return 1; -} - -int -PyArg_GetString(PyObject *args, int nargs, int i, string *p_arg) -{ - PyObject *v; - if (!PyArg_GetObject(args, nargs, i, &v)) - return 0; - if (!PyString_Check(v)) { - return PyErr_BadArgument(); - } - *p_arg = PyString_AsString(v); - return 1; -} - -int -PyArg_GetChar(PyObject *args, int nargs, int i, char *p_arg) -{ - string x; - if (!PyArg_GetString(args, nargs, i, &x)) - return 0; - if (x[0] == '\0' || x[1] != '\0') { - /* Not exactly one char */ - return PyErr_BadArgument(); - } - *p_arg = x[0]; - return 1; -} - -int -PyArg_GetLongArraySize(PyObject *args, int nargs, int i, long *p_arg) -{ - PyObject *v; - if (!PyArg_GetObject(args, nargs, i, &v)) - return 0; - if (PyTuple_Check(v)) { - *p_arg = PyTuple_Size(v); - return 1; - } - if (PyList_Check(v)) { - *p_arg = PyList_Size(v); - return 1; - } - return PyErr_BadArgument(); -} - -int -PyArg_GetShortArraySize(PyObject *args, int nargs, int i, short *p_arg) -{ - long x; - if (!PyArg_GetLongArraySize(args, nargs, i, &x)) - return 0; - *p_arg = (short) x; - return 1; -} - -/* XXX The following four are too similar. Should share more code. */ - -int -PyArg_GetLongArray(PyObject *args, int nargs, int i, int n, long *p_arg) -{ - PyObject *v, *w; - if (!PyArg_GetObject(args, nargs, i, &v)) - return 0; - if (PyTuple_Check(v)) { - if (PyTuple_Size(v) != n) { - return PyErr_BadArgument(); - } - for (i = 0; i < n; i++) { - w = PyTuple_GetItem(v, i); - if (!PyInt_Check(w)) { - return PyErr_BadArgument(); - } - p_arg[i] = PyInt_AsLong(w); - } - return 1; - } - else if (PyList_Check(v)) { - if (PyList_Size(v) != n) { - return PyErr_BadArgument(); - } - for (i = 0; i < n; i++) { - w = PyList_GetItem(v, i); - if (!PyInt_Check(w)) { - return PyErr_BadArgument(); - } - p_arg[i] = PyInt_AsLong(w); - } - return 1; - } - else { - return PyErr_BadArgument(); - } -} - -int -PyArg_GetShortArray(PyObject *args, int nargs, int i, int n, short *p_arg) -{ - PyObject *v, *w; - if (!PyArg_GetObject(args, nargs, i, &v)) - return 0; - if (PyTuple_Check(v)) { - if (PyTuple_Size(v) != n) { - return PyErr_BadArgument(); - } - for (i = 0; i < n; i++) { - w = PyTuple_GetItem(v, i); - if (!PyInt_Check(w)) { - return PyErr_BadArgument(); - } - p_arg[i] = (short) PyInt_AsLong(w); - } - return 1; - } - else if (PyList_Check(v)) { - if (PyList_Size(v) != n) { - return PyErr_BadArgument(); - } - for (i = 0; i < n; i++) { - w = PyList_GetItem(v, i); - if (!PyInt_Check(w)) { - return PyErr_BadArgument(); - } - p_arg[i] = (short) PyInt_AsLong(w); - } - return 1; - } - else { - return PyErr_BadArgument(); - } -} - -int -PyArg_GetDoubleArray(PyObject *args, int nargs, int i, int n, double *p_arg) -{ - PyObject *v, *w; - if (!PyArg_GetObject(args, nargs, i, &v)) - return 0; - if (PyTuple_Check(v)) { - if (PyTuple_Size(v) != n) { - return PyErr_BadArgument(); - } - for (i = 0; i < n; i++) { - w = PyTuple_GetItem(v, i); - if (!extractdouble(w, &p_arg[i])) - return 0; - } - return 1; - } - else if (PyList_Check(v)) { - if (PyList_Size(v) != n) { - return PyErr_BadArgument(); - } - for (i = 0; i < n; i++) { - w = PyList_GetItem(v, i); - if (!extractdouble(w, &p_arg[i])) - return 0; - } - return 1; - } - else { - return PyErr_BadArgument(); - } -} - -int -PyArg_GetFloatArray(PyObject *args, int nargs, int i, int n, float *p_arg) -{ - PyObject *v, *w; - if (!PyArg_GetObject(args, nargs, i, &v)) - return 0; - if (PyTuple_Check(v)) { - if (PyTuple_Size(v) != n) { - return PyErr_BadArgument(); - } - for (i = 0; i < n; i++) { - w = PyTuple_GetItem(v, i); - if (!extractfloat(w, &p_arg[i])) - return 0; - } - return 1; - } - else if (PyList_Check(v)) { - if (PyList_Size(v) != n) { - return PyErr_BadArgument(); - } - for (i = 0; i < n; i++) { - w = PyList_GetItem(v, i); - if (!extractfloat(w, &p_arg[i])) - return 0; - } - return 1; - } - else { - return PyErr_BadArgument(); - } -} diff --git a/Modules/cgensupport.h b/Modules/cgensupport.h deleted file mode 100644 index 27e12611a37..00000000000 --- a/Modules/cgensupport.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef Py_CGENSUPPORT_H -#define Py_CGENSUPPORT_H -#ifdef __cplusplus -extern "C" { -#endif - - -/* Definitions used by cgen output */ - -/* XXX This file is obsolete. It is *only* used by glmodule.c. */ - -typedef char *string; - -#define mknewlongobject(x) PyInt_FromLong(x) -#define mknewshortobject(x) PyInt_FromLong((long)x) -#define mknewfloatobject(x) PyFloat_FromDouble(x) -#define mknewcharobject(ch) Py_BuildValue("c", ch) - -#define getichararg PyArg_GetChar -#define getidoublearray PyArg_GetDoubleArray -#define getifloatarg PyArg_GetFloat -#define getifloatarray PyArg_GetFloatArray -#define getilongarg PyArg_GetLong -#define getilongarray PyArg_GetLongArray -#define getilongarraysize PyArg_GetLongArraySize -#define getiobjectarg PyArg_GetObject -#define getishortarg PyArg_GetShort -#define getishortarray PyArg_GetShortArray -#define getishortarraysize PyArg_GetShortArraySize -#define getistringarg PyArg_GetString - -extern int PyArg_GetObject(PyObject *args, int nargs, - int i, PyObject **p_a); -extern int PyArg_GetLong(PyObject *args, int nargs, - int i, long *p_a); -extern int PyArg_GetShort(PyObject *args, int nargs, - int i, short *p_a); -extern int PyArg_GetFloat(PyObject *args, int nargs, - int i, float *p_a); -extern int PyArg_GetString(PyObject *args, int nargs, - int i, string *p_a); -extern int PyArg_GetChar(PyObject *args, int nargs, - int i, char *p_a); -extern int PyArg_GetLongArray(PyObject *args, int nargs, - int i, int n, long *p_a); -extern int PyArg_GetShortArray(PyObject *args, int nargs, - int i, int n, short *p_a); -extern int PyArg_GetDoubleArray(PyObject *args, int nargs, - int i, int n, double *p_a); -extern int PyArg_GetFloatArray(PyObject *args, int nargs, - int i, int n, float *p_a); -extern int PyArg_GetLongArraySize(PyObject *args, int nargs, - int i, long *p_a); -extern int PyArg_GetShortArraySize(PyObject *args, int nargs, - int i, short *p_a); -extern int PyArg_GetDoubleArraySize(PyObject *args, int nargs, - int i, double *p_a); -extern int PyArg_GetFloatArraySize(PyObject *args, int nargs, - int i, float *p_a); - -#ifdef __cplusplus -} -#endif -#endif /* !Py_CGENSUPPORT_H */ diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h index 7e8390a2d11..ab0682a9fa9 100644 --- a/Modules/cjkcodecs/cjkcodecs.h +++ b/Modules/cjkcodecs/cjkcodecs.h @@ -239,6 +239,8 @@ static const struct dbcs_map *mapping_list; static const MultibyteCodec *codec_list = \ (const MultibyteCodec *)_codec_list; + + static PyObject * getmultibytecodec(void) { @@ -261,17 +263,19 @@ getcodec(PyObject *self, PyObject *encoding) const MultibyteCodec *codec; const char *enc; - if (!PyString_Check(encoding)) { + if (!PyUnicode_Check(encoding)) { PyErr_SetString(PyExc_TypeError, "encoding name must be a string."); return NULL; } + enc = _PyUnicode_AsString(encoding); + if (enc == NULL) + return NULL; cofunc = getmultibytecodec(); if (cofunc == NULL) return NULL; - enc = PyString_AS_STRING(encoding); for (codec = codec_list; codec->encoding[0]; codec++) if (strcmp(codec->encoding, enc) == 0) break; @@ -387,12 +391,24 @@ errorexit: #endif #define I_AM_A_MODULE_FOR(loc) \ - void \ - init_codecs_##loc(void) \ + static struct PyModuleDef __module = { \ + PyModuleDef_HEAD_INIT, \ + "_codecs_"#loc, \ + NULL, \ + 0, \ + __methods, \ + NULL, \ + NULL, \ + NULL, \ + NULL \ + }; \ + PyObject* \ + PyInit__codecs_##loc(void) \ { \ - PyObject *m = Py_InitModule("_codecs_" #loc, __methods);\ + PyObject *m = PyModule_Create(&__module); \ if (m != NULL) \ (void)register_maps(m); \ + return m; \ } #endif diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 14fed3ef38a..7b04f020c9c 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -65,7 +65,7 @@ make_tuple(PyObject *object, Py_ssize_t len) } PyTuple_SET_ITEM(v, 0, object); - w = PyInt_FromSsize_t(len); + w = PyLong_FromSsize_t(len); if (w == NULL) { Py_DECREF(v); return NULL; @@ -85,16 +85,20 @@ internal_error_callback(const char *errors) else if (strcmp(errors, "replace") == 0) return ERROR_REPLACE; else - return PyString_FromString(errors); + return PyUnicode_FromString(errors); } static PyObject * call_error_callback(PyObject *errors, PyObject *exc) { PyObject *args, *cb, *r; + const char *str; - assert(PyString_Check(errors)); - cb = PyCodec_LookupError(PyString_AS_STRING(errors)); + assert(PyUnicode_Check(errors)); + str = _PyUnicode_AsString(errors); + if (str == NULL) + return NULL; + cb = PyCodec_LookupError(str); if (cb == NULL) return NULL; @@ -129,7 +133,7 @@ codecctx_errors_get(MultibyteStatefulCodecContext *self) return self->errors; } - return PyString_FromString(errors); + return PyUnicode_FromString(errors); } static int @@ -137,13 +141,18 @@ codecctx_errors_set(MultibyteStatefulCodecContext *self, PyObject *value, void *closure) { PyObject *cb; + const char *str; - if (!PyString_Check(value)) { + if (!PyUnicode_Check(value)) { PyErr_SetString(PyExc_TypeError, "errors must be a string"); return -1; } - cb = internal_error_callback(PyString_AS_STRING(value)); + str = _PyUnicode_AsString(value); + if (str == NULL) + return -1; + + cb = internal_error_callback(str); if (cb == NULL) return -1; @@ -166,19 +175,19 @@ expand_encodebuffer(MultibyteEncodeBuffer *buf, Py_ssize_t esize) Py_ssize_t orgpos, orgsize, incsize; orgpos = (Py_ssize_t)((char *)buf->outbuf - - PyString_AS_STRING(buf->outobj)); - orgsize = PyString_GET_SIZE(buf->outobj); + PyBytes_AS_STRING(buf->outobj)); + orgsize = PyBytes_GET_SIZE(buf->outobj); incsize = (esize < (orgsize >> 1) ? (orgsize >> 1) | 1 : esize); if (orgsize > PY_SSIZE_T_MAX - incsize) return -1; - if (_PyString_Resize(&buf->outobj, orgsize + incsize) == -1) + if (_PyBytes_Resize(&buf->outobj, orgsize + incsize) == -1) return -1; - buf->outbuf = (unsigned char *)PyString_AS_STRING(buf->outobj) +orgpos; - buf->outbuf_end = (unsigned char *)PyString_AS_STRING(buf->outobj) - + PyString_GET_SIZE(buf->outobj); + buf->outbuf = (unsigned char *)PyBytes_AS_STRING(buf->outobj) +orgpos; + buf->outbuf_end = (unsigned char *)PyBytes_AS_STRING(buf->outobj) + + PyBytes_GET_SIZE(buf->outobj); return 0; } @@ -308,8 +317,7 @@ multibytecodec_encerror(MultibyteCodec *codec, if (!PyTuple_Check(retobj) || PyTuple_GET_SIZE(retobj) != 2 || !PyUnicode_Check((tobj = PyTuple_GET_ITEM(retobj, 0))) || - !(PyInt_Check(PyTuple_GET_ITEM(retobj, 1)) || - PyLong_Check(PyTuple_GET_ITEM(retobj, 1)))) { + !PyLong_Check(PyTuple_GET_ITEM(retobj, 1))) { PyErr_SetString(PyExc_TypeError, "encoding error handler must return " "(unicode, int) tuple"); @@ -326,13 +334,14 @@ multibytecodec_encerror(MultibyteCodec *codec, goto errorexit; } - retstrsize = PyString_GET_SIZE(retstr); + assert(PyBytes_Check(retstr)); + retstrsize = PyBytes_GET_SIZE(retstr); REQUIRE_ENCODEBUFFER(buf, retstrsize); - memcpy(buf->outbuf, PyString_AS_STRING(retstr), retstrsize); + memcpy(buf->outbuf, PyBytes_AS_STRING(retstr), retstrsize); buf->outbuf += retstrsize; - newpos = PyInt_AsSsize_t(PyTuple_GET_ITEM(retobj, 1)); + 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) { @@ -427,8 +436,7 @@ multibytecodec_decerror(MultibyteCodec *codec, if (!PyTuple_Check(retobj) || PyTuple_GET_SIZE(retobj) != 2 || !PyUnicode_Check((retuni = PyTuple_GET_ITEM(retobj, 0))) || - !(PyInt_Check(PyTuple_GET_ITEM(retobj, 1)) || - PyLong_Check(PyTuple_GET_ITEM(retobj, 1)))) { + !PyLong_Check(PyTuple_GET_ITEM(retobj, 1))) { PyErr_SetString(PyExc_TypeError, "decoding error handler must return " "(unicode, int) tuple"); @@ -443,7 +451,7 @@ multibytecodec_decerror(MultibyteCodec *codec, buf->outbuf += retunisize; } - newpos = PyInt_AsSsize_t(PyTuple_GET_ITEM(retobj, 1)); + 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) { @@ -472,7 +480,7 @@ multibytecodec_encode(MultibyteCodec *codec, Py_ssize_t finalsize, r = 0; if (datalen == 0 && !(flags & MBENC_RESET)) - return PyString_FromString(""); + return PyBytes_FromStringAndSize(NULL, 0); buf.excobj = NULL; buf.inbuf = buf.inbuf_top = *data; @@ -483,11 +491,11 @@ multibytecodec_encode(MultibyteCodec *codec, goto errorexit; } - buf.outobj = PyString_FromStringAndSize(NULL, datalen * 2 + 16); + buf.outobj = PyBytes_FromStringAndSize(NULL, datalen * 2 + 16); if (buf.outobj == NULL) goto errorexit; - buf.outbuf = (unsigned char *)PyString_AS_STRING(buf.outobj); - buf.outbuf_end = buf.outbuf + PyString_GET_SIZE(buf.outobj); + 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; @@ -521,13 +529,13 @@ multibytecodec_encode(MultibyteCodec *codec, } finalsize = (Py_ssize_t)((char *)buf.outbuf - - PyString_AS_STRING(buf.outobj)); + PyBytes_AS_STRING(buf.outobj)); - if (finalsize != PyString_GET_SIZE(buf.outobj)) - if (_PyString_Resize(&buf.outobj, finalsize) == -1) + if (finalsize != PyBytes_GET_SIZE(buf.outobj)) + if (_PyBytes_Resize(&buf.outobj, finalsize) == -1) goto errorexit; - *data = buf.inbuf; + *data = buf.inbuf; Py_XDECREF(buf.excobj); return buf.outobj; @@ -554,7 +562,7 @@ MultibyteCodec_Encode(MultibyteCodecObject *self, if (PyUnicode_Check(arg)) ucvt = NULL; else { - arg = ucvt = PyObject_Unicode(arg); + arg = ucvt = PyObject_Str(arg); if (arg == NULL) return NULL; else if (!PyUnicode_Check(arg)) { @@ -604,7 +612,7 @@ MultibyteCodec_Decode(MultibyteCodecObject *self, const char *data, *errors = NULL; Py_ssize_t datalen, finalsize; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|z:decode", + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*|z:decode", codeckwarglist, &pdata, &errors)) return NULL; data = pdata.buf; @@ -697,7 +705,7 @@ static PyTypeObject MultibyteCodec_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -738,7 +746,7 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx, if (PyUnicode_Check(unistr)) ucvt = NULL; else { - unistr = ucvt = PyObject_Unicode(unistr); + unistr = ucvt = PyObject_Str(unistr); if (unistr == NULL) return NULL; else if (!PyUnicode_Check(unistr)) { @@ -982,7 +990,7 @@ static PyTypeObject MultibyteIncrementalEncoder_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1030,7 +1038,7 @@ mbidecoder_decode(MultibyteIncrementalDecoderObject *self, Py_ssize_t wsize, finalsize = 0, size, origpending; int final = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|i:decode", + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*|i:decode", incrementalkwarglist, &pdata, &final)) return NULL; data = pdata.buf; @@ -1191,7 +1199,7 @@ static PyTypeObject MultibyteIncrementalDecoder_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1255,39 +1263,40 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self, if (cres == NULL) goto errorexit; - if (!PyString_Check(cres)) { - PyErr_SetString(PyExc_TypeError, - "stream function returned a " - "non-string object"); + if (!PyBytes_Check(cres)) { + PyErr_Format(PyExc_TypeError, + "stream function returned a " + "non-bytes object (%.100s)", + cres->ob_type->tp_name); goto errorexit; } - endoffile = (PyString_GET_SIZE(cres) == 0); + endoffile = (PyBytes_GET_SIZE(cres) == 0); if (self->pendingsize > 0) { PyObject *ctr; char *ctrdata; - if (PyString_GET_SIZE(cres) > PY_SSIZE_T_MAX - self->pendingsize) { + if (PyBytes_GET_SIZE(cres) > PY_SSIZE_T_MAX - self->pendingsize) { PyErr_NoMemory(); goto errorexit; } - rsize = PyString_GET_SIZE(cres) + self->pendingsize; - ctr = PyString_FromStringAndSize(NULL, rsize); + rsize = PyBytes_GET_SIZE(cres) + self->pendingsize; + ctr = PyBytes_FromStringAndSize(NULL, rsize); if (ctr == NULL) goto errorexit; - ctrdata = PyString_AS_STRING(ctr); + ctrdata = PyBytes_AS_STRING(ctr); memcpy(ctrdata, self->pending, self->pendingsize); memcpy(ctrdata + self->pendingsize, - PyString_AS_STRING(cres), - PyString_GET_SIZE(cres)); + PyBytes_AS_STRING(cres), + PyBytes_GET_SIZE(cres)); Py_DECREF(cres); cres = ctr; self->pendingsize = 0; } - rsize = PyString_GET_SIZE(cres); - if (decoder_prepare_buffer(&buf, PyString_AS_STRING(cres), + rsize = PyBytes_GET_SIZE(cres); + if (decoder_prepare_buffer(&buf, PyBytes_AS_STRING(cres), rsize) != 0) goto errorexit; @@ -1345,13 +1354,16 @@ mbstreamreader_read(MultibyteStreamReaderObject *self, PyObject *args) if (sizeobj == Py_None || sizeobj == NULL) size = -1; - else if (PyInt_Check(sizeobj)) - size = PyInt_AsSsize_t(sizeobj); + else if (PyLong_Check(sizeobj)) + size = PyLong_AsSsize_t(sizeobj); else { PyErr_SetString(PyExc_TypeError, "arg 1 must be an integer"); return NULL; } + if (size == -1 && PyErr_Occurred()) + return NULL; + return mbstreamreader_iread(self, "read", size); } @@ -1366,13 +1378,16 @@ mbstreamreader_readline(MultibyteStreamReaderObject *self, PyObject *args) if (sizeobj == Py_None || sizeobj == NULL) size = -1; - else if (PyInt_Check(sizeobj)) - size = PyInt_AsSsize_t(sizeobj); + else if (PyLong_Check(sizeobj)) + size = PyLong_AsSsize_t(sizeobj); else { PyErr_SetString(PyExc_TypeError, "arg 1 must be an integer"); return NULL; } + if (size == -1 && PyErr_Occurred()) + return NULL; + return mbstreamreader_iread(self, "readline", size); } @@ -1387,13 +1402,16 @@ mbstreamreader_readlines(MultibyteStreamReaderObject *self, PyObject *args) if (sizehintobj == Py_None || sizehintobj == NULL) sizehint = -1; - else if (PyInt_Check(sizehintobj)) - sizehint = PyInt_AsSsize_t(sizehintobj); + else if (PyLong_Check(sizehintobj)) + sizehint = PyLong_AsSsize_t(sizehintobj); else { PyErr_SetString(PyExc_TypeError, "arg 1 must be an integer"); return NULL; } + if (sizehint == -1 && PyErr_Occurred()) + return NULL; + r = mbstreamreader_iread(self, "read", sizehint); if (r == NULL) return NULL; @@ -1511,7 +1529,7 @@ static PyTypeObject MultibyteStreamReader_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1622,7 +1640,8 @@ mbstreamwriter_reset(MultibyteStreamWriterObject *self) if (pwrt == NULL) return NULL; - if (PyString_Size(pwrt) > 0) { + assert(PyBytes_Check(pwrt)); + if (PyBytes_Size(pwrt) > 0) { PyObject *wr; wr = PyObject_CallMethod(self->stream, "write", "O", pwrt); if (wr == NULL) { @@ -1730,7 +1749,7 @@ static PyTypeObject MultibyteStreamWriter_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1796,8 +1815,21 @@ static struct PyMethodDef __methods[] = { {NULL, NULL}, }; + +static struct PyModuleDef _multibytecodecmodule = { + PyModuleDef_HEAD_INIT, + "_multibytecodec", + NULL, + -1, + __methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_multibytecodec(void) +PyInit__multibytecodec(void) { int i; PyObject *m; @@ -1810,20 +1842,24 @@ init_multibytecodec(void) }; if (PyType_Ready(&MultibyteCodec_Type) < 0) - return; + return NULL; - m = Py_InitModule("_multibytecodec", __methods); + m = PyModule_Create(&_multibytecodecmodule); if (m == NULL) - return; + return NULL; for (i = 0; typelist[i] != NULL; i++) { if (PyType_Ready(typelist[i]) < 0) - return; + return NULL; Py_INCREF(typelist[i]); PyModule_AddObject(m, typelist[i]->tp_name, (PyObject *)typelist[i]); } - if (PyErr_Occurred()) + if (PyErr_Occurred()) { Py_FatalError("can't initialize the _multibytecodec module"); + Py_DECREF(m); + m = NULL; + } + return m; } diff --git a/Modules/clmodule.c b/Modules/clmodule.c deleted file mode 100644 index e5d568f204d..00000000000 --- a/Modules/clmodule.c +++ /dev/null @@ -1,2563 +0,0 @@ - - -/* Cl objects */ - -#define CLDEBUG - -#include <stdarg.h> -#include <cl.h> -#if defined(CL_JPEG_SOFTWARE) && !defined(CL_JPEG_COSMO) -#include <dmedia/cl_cosmo.h> -#endif -#include "Python.h" - -typedef struct { - PyObject_HEAD - int ob_isCompressor; /* Compressor or Decompressor */ - CL_Handle ob_compressorHdl; - int *ob_paramtypes; - int ob_nparams; -} clobject; - -static PyObject *ClError; /* exception cl.error */ - -static int error_handler_called = 0; - -/* - * We want to use the function prototypes that are available in the C - * compiler on the SGI. Because of that, we need to declare the first - * argument of the compressor and decompressor methods as "object *", - * even though they are really "clobject *". Therefore we cast the - * argument to the proper type using this macro. - */ -#define SELF ((clobject *) self) - -/******************************************************************** - Utility routines. -********************************************************************/ -static void -cl_ErrorHandler(CL_Handle handle, int code, const char *fmt, ...) -{ - va_list ap; - char errbuf[BUFSIZ]; /* hopefully big enough */ - char *p; - - if (PyErr_Occurred()) /* don't change existing error */ - return; - error_handler_called = 1; - va_start(ap, fmt); - vsprintf(errbuf, fmt, ap); - va_end(ap); - p = &errbuf[strlen(errbuf) - 1]; /* swat the line feed */ - if (*p == '\n') - *p = 0; - PyErr_SetString(ClError, errbuf); -} - -/* - * This assumes that params are always in the range 0 to some maximum. - */ -static int -param_type_is_float(clobject *self, int param) -{ - int bufferlength; - - if (self->ob_paramtypes == NULL) { - error_handler_called = 0; - bufferlength = clQueryParams(self->ob_compressorHdl, 0, 0); - if (error_handler_called) - return -1; - - self->ob_paramtypes = PyMem_NEW(int, bufferlength); - if (self->ob_paramtypes == NULL) - return -1; - self->ob_nparams = bufferlength / 2; - - (void) clQueryParams(self->ob_compressorHdl, - self->ob_paramtypes, bufferlength); - if (error_handler_called) { - PyMem_DEL(self->ob_paramtypes); - self->ob_paramtypes = NULL; - return -1; - } - } - - if (param < 0 || param >= self->ob_nparams) - return -1; - - if (self->ob_paramtypes[param*2 + 1] == CL_FLOATING_ENUM_VALUE || - self->ob_paramtypes[param*2 + 1] == CL_FLOATING_RANGE_VALUE) - return 1; - else - return 0; -} - -/******************************************************************** - Single image compression/decompression. -********************************************************************/ -static PyObject * -cl_CompressImage(PyObject *self, PyObject *args) -{ - int compressionScheme, width, height, originalFormat; - float compressionRatio; - int frameBufferSize, compressedBufferSize; - char *frameBuffer; - PyObject *compressedBuffer; - - if (!PyArg_ParseTuple(args, "iiiifs#", &compressionScheme, - &width, &height, - &originalFormat, &compressionRatio, &frameBuffer, - &frameBufferSize)) - return NULL; - - retry: - compressedBuffer = PyString_FromStringAndSize(NULL, frameBufferSize); - if (compressedBuffer == NULL) - return NULL; - - compressedBufferSize = frameBufferSize; - error_handler_called = 0; - if (clCompressImage(compressionScheme, width, height, originalFormat, - compressionRatio, (void *) frameBuffer, - &compressedBufferSize, - (void *) PyString_AsString(compressedBuffer)) - == FAILURE || error_handler_called) { - Py_DECREF(compressedBuffer); - if (!error_handler_called) - PyErr_SetString(ClError, "clCompressImage failed"); - return NULL; - } - - if (compressedBufferSize > frameBufferSize) { - frameBufferSize = compressedBufferSize; - Py_DECREF(compressedBuffer); - goto retry; - } - - if (compressedBufferSize < frameBufferSize) - _PyString_Resize(&compressedBuffer, compressedBufferSize); - - return compressedBuffer; -} - -static PyObject * -cl_DecompressImage(PyObject *self, PyObject *args) -{ - int compressionScheme, width, height, originalFormat; - char *compressedBuffer; - int compressedBufferSize, frameBufferSize; - PyObject *frameBuffer; - - if (!PyArg_ParseTuple(args, "iiiis#", &compressionScheme, &width, &height, - &originalFormat, &compressedBuffer, - &compressedBufferSize)) - return NULL; - - frameBufferSize = width * height * CL_BytesPerPixel(originalFormat); - - frameBuffer = PyString_FromStringAndSize(NULL, frameBufferSize); - if (frameBuffer == NULL) - return NULL; - - error_handler_called = 0; - if (clDecompressImage(compressionScheme, width, height, originalFormat, - compressedBufferSize, compressedBuffer, - (void *) PyString_AsString(frameBuffer)) - == FAILURE || error_handler_called) { - Py_DECREF(frameBuffer); - if (!error_handler_called) - PyErr_SetString(ClError, "clDecompressImage failed"); - return NULL; - } - - return frameBuffer; -} - -/******************************************************************** - Sequential compression/decompression. -********************************************************************/ -#define CheckCompressor(self) if ((self)->ob_compressorHdl == NULL) { \ - PyErr_SetString(PyExc_RuntimeError, "(de)compressor not active"); \ - return NULL; \ -} - -static PyObject * -doClose(clobject *self, int (*close_func)(CL_Handle)) -{ - CheckCompressor(self); - - error_handler_called = 0; - if ((*close_func)(self->ob_compressorHdl) == FAILURE || - error_handler_called) { - if (!error_handler_called) - PyErr_SetString(ClError, "close failed"); - return NULL; - } - - self->ob_compressorHdl = NULL; - - if (self->ob_paramtypes) - PyMem_DEL(self->ob_paramtypes); - self->ob_paramtypes = NULL; - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -clm_CloseCompressor(PyObject *self) -{ - return doClose(SELF, clCloseCompressor); -} - -static PyObject * -clm_CloseDecompressor(PyObject *self) -{ - return doClose(SELF, clCloseDecompressor); -} - -static PyObject * -clm_Compress(PyObject *self, PyObject *args) -{ - int numberOfFrames; - int frameBufferSize, compressedBufferSize, size; - char *frameBuffer; - PyObject *data; - - CheckCompressor(SELF); - - if (!PyArg_Parse(args, "(is#)", &numberOfFrames, - &frameBuffer, &frameBufferSize)) - return NULL; - - error_handler_called = 0; - size = clGetParam(SELF->ob_compressorHdl, CL_COMPRESSED_BUFFER_SIZE); - compressedBufferSize = size; - if (error_handler_called) - return NULL; - - data = PyString_FromStringAndSize(NULL, size); - if (data == NULL) - return NULL; - - error_handler_called = 0; - if (clCompress(SELF->ob_compressorHdl, numberOfFrames, - (void *) frameBuffer, &compressedBufferSize, - (void *) PyString_AsString(data)) == FAILURE || - error_handler_called) { - Py_DECREF(data); - if (!error_handler_called) - PyErr_SetString(ClError, "compress failed"); - return NULL; - } - - if (compressedBufferSize < size) - if (_PyString_Resize(&data, compressedBufferSize)) - return NULL; - - if (compressedBufferSize > size) { - /* we didn't get all "compressed" data */ - Py_DECREF(data); - PyErr_SetString(ClError, - "compressed data is more than fitted"); - return NULL; - } - - return data; -} - -static PyObject * -clm_Decompress(PyObject *self, PyObject *args) -{ - PyObject *data; - int numberOfFrames; - char *compressedData; - int compressedDataSize, dataSize; - - CheckCompressor(SELF); - - if (!PyArg_Parse(args, "(is#)", &numberOfFrames, &compressedData, - &compressedDataSize)) - return NULL; - - error_handler_called = 0; - dataSize = clGetParam(SELF->ob_compressorHdl, CL_FRAME_BUFFER_SIZE); - if (error_handler_called) - return NULL; - - data = PyString_FromStringAndSize(NULL, dataSize); - if (data == NULL) - return NULL; - - error_handler_called = 0; - if (clDecompress(SELF->ob_compressorHdl, numberOfFrames, - compressedDataSize, (void *) compressedData, - (void *) PyString_AsString(data)) == FAILURE || - error_handler_called) { - Py_DECREF(data); - if (!error_handler_called) - PyErr_SetString(ClError, "decompress failed"); - return NULL; - } - - return data; -} - -static PyObject * -doParams(clobject *self, PyObject *args, int (*func)(CL_Handle, int *, int), - int modified) -{ - PyObject *list, *v; - int *PVbuffer; - int length; - int i; - float number; - - CheckCompressor(self); - - if (!PyArg_Parse(args, "O", &list)) - return NULL; - if (!PyList_Check(list)) { - PyErr_BadArgument(); - return NULL; - } - length = PyList_Size(list); - PVbuffer = PyMem_NEW(int, length); - if (PVbuffer == NULL) - return PyErr_NoMemory(); - for (i = 0; i < length; i++) { - v = PyList_GetItem(list, i); - if (PyFloat_Check(v)) { - number = PyFloat_AsDouble(v); - PVbuffer[i] = CL_TypeIsInt(number); - } else if (PyInt_Check(v)) { - PVbuffer[i] = PyInt_AsLong(v); - if ((i & 1) && - param_type_is_float(self, PVbuffer[i-1]) > 0) { - number = PVbuffer[i]; - PVbuffer[i] = CL_TypeIsInt(number); - } - } else { - PyMem_DEL(PVbuffer); - PyErr_BadArgument(); - return NULL; - } - } - - error_handler_called = 0; - (*func)(self->ob_compressorHdl, PVbuffer, length); - if (error_handler_called) { - PyMem_DEL(PVbuffer); - return NULL; - } - - if (modified) { - for (i = 0; i < length; i++) { - if ((i & 1) && - param_type_is_float(self, PVbuffer[i-1]) > 0) { - number = CL_TypeIsFloat(PVbuffer[i]); - v = PyFloat_FromDouble(number); - } else - v = PyInt_FromLong(PVbuffer[i]); - PyList_SetItem(list, i, v); - } - } - - PyMem_DEL(PVbuffer); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -clm_GetParams(PyObject *self, PyObject *args) -{ - return doParams(SELF, args, clGetParams, 1); -} - -static PyObject * -clm_SetParams(PyObject *self, PyObject *args) -{ - return doParams(SELF, args, clSetParams, 0); -} - -static PyObject * -do_get(clobject *self, PyObject *args, int (*func)(CL_Handle, int)) -{ - int paramID, value; - float fvalue; - - CheckCompressor(self); - - if (!PyArg_Parse(args, "i", ¶mID)) - return NULL; - - error_handler_called = 0; - value = (*func)(self->ob_compressorHdl, paramID); - if (error_handler_called) - return NULL; - - if (param_type_is_float(self, paramID) > 0) { - fvalue = CL_TypeIsFloat(value); - return PyFloat_FromDouble(fvalue); - } - - return PyInt_FromLong(value); -} - -static PyObject * -clm_GetParam(PyObject *self, PyObject *args) -{ - return do_get(SELF, args, clGetParam); -} - -static PyObject * -clm_GetDefault(PyObject *self, PyObject *args) -{ - return do_get(SELF, args, clGetDefault); -} - -static PyObject * -clm_SetParam(PyObject *self, PyObject *args) -{ - int paramID, value; - float fvalue; - - CheckCompressor(SELF); - - if (!PyArg_Parse(args, "(ii)", ¶mID, &value)) { - PyErr_Clear(); - if (!PyArg_Parse(args, "(if)", ¶mID, &fvalue)) { - PyErr_Clear(); - PyErr_SetString(PyExc_TypeError, - "bad argument list (format '(ii)' or '(if)')"); - return NULL; - } - value = CL_TypeIsInt(fvalue); - } else { - if (param_type_is_float(SELF, paramID) > 0) { - fvalue = value; - value = CL_TypeIsInt(fvalue); - } - } - - error_handler_called = 0; - value = clSetParam(SELF->ob_compressorHdl, paramID, value); - if (error_handler_called) - return NULL; - - if (param_type_is_float(SELF, paramID) > 0) - return PyFloat_FromDouble(CL_TypeIsFloat(value)); - else - return PyInt_FromLong(value); -} - -static PyObject * -clm_GetParamID(PyObject *self, PyObject *args) -{ - char *name; - int value; - - CheckCompressor(SELF); - - if (!PyArg_Parse(args, "s", &name)) - return NULL; - - error_handler_called = 0; - value = clGetParamID(SELF->ob_compressorHdl, name); - if (value == FAILURE || error_handler_called) { - if (!error_handler_called) - PyErr_SetString(ClError, "getparamid failed"); - return NULL; - } - - return PyInt_FromLong(value); -} - -static PyObject * -clm_QueryParams(PyObject *self) -{ - int bufferlength; - int *PVbuffer; - PyObject *list; - int i; - - CheckCompressor(SELF); - - error_handler_called = 0; - bufferlength = clQueryParams(SELF->ob_compressorHdl, 0, 0); - if (error_handler_called) - return NULL; - - PVbuffer = PyMem_NEW(int, bufferlength); - if (PVbuffer == NULL) - return PyErr_NoMemory(); - - bufferlength = clQueryParams(SELF->ob_compressorHdl, PVbuffer, - bufferlength); - if (error_handler_called) { - PyMem_DEL(PVbuffer); - return NULL; - } - - list = PyList_New(bufferlength); - if (list == NULL) { - PyMem_DEL(PVbuffer); - return NULL; - } - - for (i = 0; i < bufferlength; i++) { - if (i & 1) - PyList_SetItem(list, i, PyInt_FromLong(PVbuffer[i])); - else if (PVbuffer[i] == 0) { - Py_INCREF(Py_None); - PyList_SetItem(list, i, Py_None); - } else - PyList_SetItem(list, i, - PyString_FromString((char *) PVbuffer[i])); - } - - PyMem_DEL(PVbuffer); - - return list; -} - -static PyObject * -clm_GetMinMax(PyObject *self, PyObject *args) -{ - int param, min, max; - float fmin, fmax; - - CheckCompressor(SELF); - - if (!PyArg_Parse(args, "i", ¶m)) - return NULL; - - clGetMinMax(SELF->ob_compressorHdl, param, &min, &max); - - if (param_type_is_float(SELF, param) > 0) { - fmin = CL_TypeIsFloat(min); - fmax = CL_TypeIsFloat(max); - return Py_BuildValue("(ff)", fmin, fmax); - } - - return Py_BuildValue("(ii)", min, max); -} - -static PyObject * -clm_GetName(PyObject *self, PyObject *args) -{ - int param; - char *name; - - CheckCompressor(SELF); - - if (!PyArg_Parse(args, "i", ¶m)) - return NULL; - - error_handler_called = 0; - name = clGetName(SELF->ob_compressorHdl, param); - if (name == NULL || error_handler_called) { - if (!error_handler_called) - PyErr_SetString(ClError, "getname failed"); - return NULL; - } - - return PyString_FromString(name); -} - -static PyObject * -clm_QuerySchemeFromHandle(PyObject *self) -{ - CheckCompressor(SELF); - return PyInt_FromLong(clQuerySchemeFromHandle(SELF->ob_compressorHdl)); -} - -static PyObject * -clm_ReadHeader(PyObject *self, PyObject *args) -{ - char *header; - int headerSize; - - CheckCompressor(SELF); - - if (!PyArg_Parse(args, "s#", &header, &headerSize)) - return NULL; - - return PyInt_FromLong(clReadHeader(SELF->ob_compressorHdl, - headerSize, header)); -} - -static PyMethodDef compressor_methods[] = { - {"close", clm_CloseCompressor, METH_NOARGS}, /* alias */ - {"CloseCompressor", clm_CloseCompressor, METH_NOARGS}, - {"Compress", clm_Compress, METH_OLDARGS}, - {"GetDefault", clm_GetDefault, METH_OLDARGS}, - {"GetMinMax", clm_GetMinMax, METH_OLDARGS}, - {"GetName", clm_GetName, METH_OLDARGS}, - {"GetParam", clm_GetParam, METH_OLDARGS}, - {"GetParamID", clm_GetParamID, METH_OLDARGS}, - {"GetParams", clm_GetParams, METH_OLDARGS}, - {"QueryParams", clm_QueryParams, METH_NOARGS}, - {"QuerySchemeFromHandle",clm_QuerySchemeFromHandle, METH_NOARGS}, - {"SetParam", clm_SetParam, METH_OLDARGS}, - {"SetParams", clm_SetParams, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -static PyMethodDef decompressor_methods[] = { - {"close", clm_CloseDecompressor, METH_NOARGS}, /* alias */ - {"CloseDecompressor", clm_CloseDecompressor, METH_NOARGS}, - {"Decompress", clm_Decompress, METH_OLDARGS}, - {"GetDefault", clm_GetDefault, METH_OLDARGS}, - {"GetMinMax", clm_GetMinMax, METH_OLDARGS}, - {"GetName", clm_GetName, METH_OLDARGS}, - {"GetParam", clm_GetParam, METH_OLDARGS}, - {"GetParamID", clm_GetParamID, METH_OLDARGS}, - {"GetParams", clm_GetParams, METH_OLDARGS}, - {"ReadHeader", clm_ReadHeader, METH_OLDARGS}, - {"QueryParams", clm_QueryParams, METH_NOARGS}, - {"QuerySchemeFromHandle",clm_QuerySchemeFromHandle, METH_NOARGS}, - {"SetParam", clm_SetParam, METH_OLDARGS}, - {"SetParams", clm_SetParams, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -static void -cl_dealloc(PyObject *self) -{ - if (SELF->ob_compressorHdl) { - if (SELF->ob_isCompressor) - clCloseCompressor(SELF->ob_compressorHdl); - else - clCloseDecompressor(SELF->ob_compressorHdl); - } - PyObject_Del(self); -} - -static PyObject * -cl_getattr(PyObject *self, char *name) -{ - if (SELF->ob_isCompressor) - return Py_FindMethod(compressor_methods, self, name); - else - return Py_FindMethod(decompressor_methods, self, name); -} - -static PyTypeObject Cltype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "cl.cl", /*tp_name*/ - sizeof(clobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)cl_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)cl_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ -}; - -static PyObject * -doOpen(PyObject *self, PyObject *args, int (*open_func)(int, CL_Handle *), - int iscompressor) -{ - int scheme; - clobject *new; - - if (!PyArg_ParseTuple(args, "i", &scheme)) - return NULL; - - new = PyObject_New(clobject, &Cltype); - if (new == NULL) - return NULL; - - new->ob_compressorHdl = NULL; - new->ob_isCompressor = iscompressor; - new->ob_paramtypes = NULL; - - error_handler_called = 0; - if ((*open_func)(scheme, &new->ob_compressorHdl) == FAILURE || - error_handler_called) { - Py_DECREF(new); - if (!error_handler_called) - PyErr_SetString(ClError, "Open(De)Compressor failed"); - return NULL; - } - return (PyObject *)new; -} - -static PyObject * -cl_OpenCompressor(PyObject *self, PyObject *args) -{ - return doOpen(self, args, clOpenCompressor, 1); -} - -static PyObject * -cl_OpenDecompressor(PyObject *self, PyObject *args) -{ - return doOpen(self, args, clOpenDecompressor, 0); -} - -static PyObject * -cl_QueryScheme(PyObject *self, PyObject *args) -{ - char *header; - int headerlen; - int scheme; - - if (!PyArg_ParseTuple(args, "s#", &header, &headerlen)) - return NULL; - - scheme = clQueryScheme(header); - if (scheme < 0) { - PyErr_SetString(ClError, "unknown compression scheme"); - return NULL; - } - - return PyInt_FromLong(scheme); -} - -static PyObject * -cl_QueryMaxHeaderSize(PyObject *self, PyObject *args) -{ - int scheme; - - if (!PyArg_ParseTuple(args, "i", &scheme)) - return NULL; - - return PyInt_FromLong(clQueryMaxHeaderSize(scheme)); -} - -static PyObject * -cl_QueryAlgorithms(PyObject *self, PyObject *args) -{ - int algorithmMediaType; - int bufferlength; - int *PVbuffer; - PyObject *list; - int i; - - if (!PyArg_ParseTuple(args, "i", &algorithmMediaType)) - return NULL; - - error_handler_called = 0; - bufferlength = clQueryAlgorithms(algorithmMediaType, 0, 0); - if (error_handler_called) - return NULL; - - PVbuffer = PyMem_NEW(int, bufferlength); - if (PVbuffer == NULL) - return PyErr_NoMemory(); - - bufferlength = clQueryAlgorithms(algorithmMediaType, PVbuffer, - bufferlength); - if (error_handler_called) { - PyMem_DEL(PVbuffer); - return NULL; - } - - list = PyList_New(bufferlength); - if (list == NULL) { - PyMem_DEL(PVbuffer); - return NULL; - } - - for (i = 0; i < bufferlength; i++) { - if (i & 1) - PyList_SetItem(list, i, PyInt_FromLong(PVbuffer[i])); - else if (PVbuffer[i] == 0) { - Py_INCREF(Py_None); - PyList_SetItem(list, i, Py_None); - } else - PyList_SetItem(list, i, - PyString_FromString((char *) PVbuffer[i])); - } - - PyMem_DEL(PVbuffer); - - return list; -} - -static PyObject * -cl_QuerySchemeFromName(PyObject *self, PyObject *args) -{ - int algorithmMediaType; - char *name; - int scheme; - - if (!PyArg_ParseTuple(args, "is", &algorithmMediaType, &name)) - return NULL; - - error_handler_called = 0; - scheme = clQuerySchemeFromName(algorithmMediaType, name); - if (error_handler_called) { - PyErr_SetString(ClError, "unknown compression scheme"); - return NULL; - } - - return PyInt_FromLong(scheme); -} - -static PyObject * -cl_GetAlgorithmName(PyObject *self, PyObject *args) -{ - int scheme; - char *name; - - if (!PyArg_ParseTuple(args, "i", &scheme)) - return NULL; - - name = clGetAlgorithmName(scheme); - if (name == 0) { - PyErr_SetString(ClError, "unknown compression scheme"); - return NULL; - } - - return PyString_FromString(name); -} - -static PyObject * -do_set(PyObject *self, PyObject *args, int (*func)(int, int, int)) -{ - int scheme, paramID, value; - float fvalue; - int is_float = 0; - - if (!PyArg_ParseTuple(args, "iii", &scheme, ¶mID, &value)) { - PyErr_Clear(); - if (!PyArg_ParseTuple(args, "iif", &scheme, ¶mID, &fvalue)) { - PyErr_Clear(); - PyErr_SetString(PyExc_TypeError, - "bad argument list (format '(iii)' or '(iif)')"); - return NULL; - } - value = CL_TypeIsInt(fvalue); - is_float = 1; - } else { - /* check some parameters which we know to be floats */ - switch (scheme) { - case CL_COMPRESSION_RATIO: - case CL_SPEED: - fvalue = value; - value = CL_TypeIsInt(fvalue); - is_float = 1; - break; - } - } - - error_handler_called = 0; - value = (*func)(scheme, paramID, value); - if (error_handler_called) - return NULL; - - if (is_float) - return PyFloat_FromDouble(CL_TypeIsFloat(value)); - else - return PyInt_FromLong(value); -} - -static PyObject * -cl_SetDefault(PyObject *self, PyObject *args) -{ - return do_set(self, args, clSetDefault); -} - -static PyObject * -cl_SetMin(PyObject *self, PyObject *args) -{ - return do_set(self, args, clSetMin); -} - -static PyObject * -cl_SetMax(PyObject *self, PyObject *args) -{ - return do_set(self, args, clSetMax); -} - -#define func(name, handler) \ -static PyObject *cl_##name(PyObject *self, PyObject *args) \ -{ \ - int x; \ - if (!PyArg_ParseTuple(args, "i", &x)) return NULL; \ - return Py##handler(CL_##name(x)); \ -} - -#define func2(name, handler) \ -static PyObject *cl_##name(PyObject *self, PyObject *args) \ -{ \ - int a1, a2; \ - if (!PyArg_ParseTuple(args, "ii", &a1, &a2)) return NULL; \ - return Py##handler(CL_##name(a1, a2)); \ -} - -func(BytesPerSample, Int_FromLong) -func(BytesPerPixel, Int_FromLong) -func(AudioFormatName, String_FromString) -func(VideoFormatName, String_FromString) -func(AlgorithmNumber, Int_FromLong) -func(AlgorithmType, Int_FromLong) -func2(Algorithm, Int_FromLong) -func(ParamNumber, Int_FromLong) -func(ParamType, Int_FromLong) -func2(ParamID, Int_FromLong) - -#ifdef CLDEBUG - static PyObject * -cvt_type(PyObject *self, PyObject *args) -{ - int number; - float fnumber; - - if (PyArg_Parse(args, "i", &number)) - return PyFloat_FromDouble(CL_TypeIsFloat(number)); - else { - PyErr_Clear(); - if (PyArg_Parse(args, "f", &fnumber)) - return PyInt_FromLong(CL_TypeIsInt(fnumber)); - return NULL; - } -} -#endif - -static PyMethodDef cl_methods[] = { - {"CompressImage", cl_CompressImage, METH_VARARGS}, - {"DecompressImage", cl_DecompressImage, METH_VARARGS}, - {"GetAlgorithmName", cl_GetAlgorithmName, METH_VARARGS}, - {"OpenCompressor", cl_OpenCompressor, METH_VARARGS}, - {"OpenDecompressor", cl_OpenDecompressor, METH_VARARGS}, - {"QueryAlgorithms", cl_QueryAlgorithms, METH_VARARGS}, - {"QueryMaxHeaderSize", cl_QueryMaxHeaderSize, METH_VARARGS}, - {"QueryScheme", cl_QueryScheme, METH_VARARGS}, - {"QuerySchemeFromName", cl_QuerySchemeFromName, METH_VARARGS}, - {"SetDefault", cl_SetDefault, METH_VARARGS}, - {"SetMax", cl_SetMax, METH_VARARGS}, - {"SetMin", cl_SetMin, METH_VARARGS}, - {"BytesPerSample", cl_BytesPerSample, METH_VARARGS}, - {"BytesPerPixel", cl_BytesPerPixel, METH_VARARGS}, - {"AudioFormatName", cl_AudioFormatName, METH_VARARGS}, - {"VideoFormatName", cl_VideoFormatName, METH_VARARGS}, - {"AlgorithmNumber", cl_AlgorithmNumber, METH_VARARGS}, - {"AlgorithmType", cl_AlgorithmType, METH_VARARGS}, - {"Algorithm", cl_Algorithm, METH_VARARGS}, - {"ParamNumber", cl_ParamNumber, METH_VARARGS}, - {"ParamType", cl_ParamType, METH_VARARGS}, - {"ParamID", cl_ParamID, METH_VARARGS}, -#ifdef CLDEBUG - {"cvt_type", cvt_type, METH_VARARGS}, -#endif - {NULL, NULL} /* Sentinel */ -}; - -#ifdef CL_JPEG_SOFTWARE -#define IRIX_5_3_LIBRARY -#endif - -void -initcl(void) -{ - PyObject *m, *d, *x; - - if (PyErr_WarnPy3k("the cl module has been removed in " - "Python 3.0", 2) < 0) - return; - - m = Py_InitModule("cl", cl_methods); - if (m == NULL) - return; - d = PyModule_GetDict(m); - - ClError = PyErr_NewException("cl.error", NULL, NULL); - (void) PyDict_SetItemString(d, "error", ClError); - -#ifdef CL_ADDED_ALGORITHM_ERROR - x = PyInt_FromLong(CL_ADDED_ALGORITHM_ERROR); - if (x == NULL || PyDict_SetItemString(d, "ADDED_ALGORITHM_ERROR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ALAW - x = PyInt_FromLong(CL_ALAW); - if (x == NULL || PyDict_SetItemString(d, "ALAW", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ALGORITHM_ID - x = PyInt_FromLong(CL_ALGORITHM_ID); - if (x == NULL || PyDict_SetItemString(d, "ALGORITHM_ID", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ALGORITHM_TABLE_FULL - x = PyInt_FromLong(CL_ALGORITHM_TABLE_FULL); - if (x == NULL || PyDict_SetItemString(d, "ALGORITHM_TABLE_FULL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ALGORITHM_VERSION - x = PyInt_FromLong(CL_ALGORITHM_VERSION); - if (x == NULL || PyDict_SetItemString(d, "ALGORITHM_VERSION", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ALG_AUDIO - x = PyInt_FromLong(CL_ALG_AUDIO); - if (x == NULL || PyDict_SetItemString(d, "ALG_AUDIO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ALG_VIDEO - x = PyInt_FromLong(CL_ALG_VIDEO); - if (x == NULL || PyDict_SetItemString(d, "ALG_VIDEO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AUDIO - x = PyInt_FromLong(CL_AUDIO); - if (x == NULL || PyDict_SetItemString(d, "AUDIO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_BITRATE_POLICY - x = PyInt_FromLong(CL_AWARE_BITRATE_POLICY); - if (x == NULL || PyDict_SetItemString(d, "AWARE_BITRATE_POLICY", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_BITRATE_TARGET - x = PyInt_FromLong(CL_AWARE_BITRATE_TARGET); - if (x == NULL || PyDict_SetItemString(d, "AWARE_BITRATE_TARGET", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_CHANNEL_POLICY - x = PyInt_FromLong(CL_AWARE_CHANNEL_POLICY); - if (x == NULL || PyDict_SetItemString(d, "AWARE_CHANNEL_POLICY", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_CONST_QUAL - x = PyInt_FromLong(CL_AWARE_CONST_QUAL); - if (x == NULL || PyDict_SetItemString(d, "AWARE_CONST_QUAL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_ERROR - x = PyInt_FromLong(CL_AWARE_ERROR); - if (x == NULL || PyDict_SetItemString(d, "AWARE_ERROR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_FIXED_RATE - x = PyInt_FromLong(CL_AWARE_FIXED_RATE); - if (x == NULL || PyDict_SetItemString(d, "AWARE_FIXED_RATE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_INDEPENDENT - x = PyInt_FromLong(CL_AWARE_INDEPENDENT); - if (x == NULL || PyDict_SetItemString(d, "AWARE_INDEPENDENT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_JOINT_STEREO - x = PyInt_FromLong(CL_AWARE_JOINT_STEREO); - if (x == NULL || PyDict_SetItemString(d, "AWARE_JOINT_STEREO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_LAYER - x = PyInt_FromLong(CL_AWARE_LAYER); - if (x == NULL || PyDict_SetItemString(d, "AWARE_LAYER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_LOSSLESS - x = PyInt_FromLong(CL_AWARE_LOSSLESS); - if (x == NULL || PyDict_SetItemString(d, "AWARE_LOSSLESS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_MPEG_AUDIO - x = PyInt_FromLong(CL_AWARE_MPEG_AUDIO); - if (x == NULL || PyDict_SetItemString(d, "AWARE_MPEG_AUDIO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_MPEG_LAYER_I - x = PyInt_FromLong(CL_AWARE_MPEG_LAYER_I); - if (x == NULL || PyDict_SetItemString(d, "AWARE_MPEG_LAYER_I", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_MPEG_LAYER_II - x = PyInt_FromLong(CL_AWARE_MPEG_LAYER_II); - if (x == NULL || PyDict_SetItemString(d, "AWARE_MPEG_LAYER_II", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_MULTIRATE - x = PyInt_FromLong(CL_AWARE_MULTIRATE); - if (x == NULL || PyDict_SetItemString(d, "AWARE_MULTIRATE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_NOISE_MARGIN - x = PyInt_FromLong(CL_AWARE_NOISE_MARGIN); - if (x == NULL || PyDict_SetItemString(d, "AWARE_NOISE_MARGIN", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_AWARE_STEREO - x = PyInt_FromLong(CL_AWARE_STEREO); - if (x == NULL || PyDict_SetItemString(d, "AWARE_STEREO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_ALGORITHM_NAME - x = PyInt_FromLong(CL_BAD_ALGORITHM_NAME); - if (x == NULL || PyDict_SetItemString(d, "BAD_ALGORITHM_NAME", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_ALGORITHM_TYPE - x = PyInt_FromLong(CL_BAD_ALGORITHM_TYPE); - if (x == NULL || PyDict_SetItemString(d, "BAD_ALGORITHM_TYPE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BLOCK_SIZE - x = PyInt_FromLong(CL_BAD_BLOCK_SIZE); - if (x == NULL || PyDict_SetItemString(d, "BAD_BLOCK_SIZE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BOARD - x = PyInt_FromLong(CL_BAD_BOARD); - if (x == NULL || PyDict_SetItemString(d, "BAD_BOARD", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BUFFERING - x = PyInt_FromLong(CL_BAD_BUFFERING); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFERING", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BUFFERLENGTH_NEG - x = PyInt_FromLong(CL_BAD_BUFFERLENGTH_NEG); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFERLENGTH_NEG", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BUFFERLENGTH_ODD - x = PyInt_FromLong(CL_BAD_BUFFERLENGTH_ODD); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFERLENGTH_ODD", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BUFFER_EXISTS - x = PyInt_FromLong(CL_BAD_BUFFER_EXISTS); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFER_EXISTS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BUFFER_HANDLE - x = PyInt_FromLong(CL_BAD_BUFFER_HANDLE); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFER_HANDLE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BUFFER_POINTER - x = PyInt_FromLong(CL_BAD_BUFFER_POINTER); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFER_POINTER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BUFFER_QUERY_SIZE - x = PyInt_FromLong(CL_BAD_BUFFER_QUERY_SIZE); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFER_QUERY_SIZE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BUFFER_SIZE - x = PyInt_FromLong(CL_BAD_BUFFER_SIZE); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFER_SIZE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BUFFER_SIZE_POINTER - x = PyInt_FromLong(CL_BAD_BUFFER_SIZE_POINTER); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFER_SIZE_POINTER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_BUFFER_TYPE - x = PyInt_FromLong(CL_BAD_BUFFER_TYPE); - if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFER_TYPE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_COMPRESSION_SCHEME - x = PyInt_FromLong(CL_BAD_COMPRESSION_SCHEME); - if (x == NULL || PyDict_SetItemString(d, "BAD_COMPRESSION_SCHEME", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_COMPRESSOR_HANDLE - x = PyInt_FromLong(CL_BAD_COMPRESSOR_HANDLE); - if (x == NULL || PyDict_SetItemString(d, "BAD_COMPRESSOR_HANDLE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_COMPRESSOR_HANDLE_POINTER - x = PyInt_FromLong(CL_BAD_COMPRESSOR_HANDLE_POINTER); - if (x == NULL || PyDict_SetItemString(d, "BAD_COMPRESSOR_HANDLE_POINTER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_FRAME_SIZE - x = PyInt_FromLong(CL_BAD_FRAME_SIZE); - if (x == NULL || PyDict_SetItemString(d, "BAD_FRAME_SIZE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_FUNCTIONALITY - x = PyInt_FromLong(CL_BAD_FUNCTIONALITY); - if (x == NULL || PyDict_SetItemString(d, "BAD_FUNCTIONALITY", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_FUNCTION_POINTER - x = PyInt_FromLong(CL_BAD_FUNCTION_POINTER); - if (x == NULL || PyDict_SetItemString(d, "BAD_FUNCTION_POINTER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_HEADER_SIZE - x = PyInt_FromLong(CL_BAD_HEADER_SIZE); - if (x == NULL || PyDict_SetItemString(d, "BAD_HEADER_SIZE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_INITIAL_VALUE - x = PyInt_FromLong(CL_BAD_INITIAL_VALUE); - if (x == NULL || PyDict_SetItemString(d, "BAD_INITIAL_VALUE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_INTERNAL_FORMAT - x = PyInt_FromLong(CL_BAD_INTERNAL_FORMAT); - if (x == NULL || PyDict_SetItemString(d, "BAD_INTERNAL_FORMAT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_LICENSE - x = PyInt_FromLong(CL_BAD_LICENSE); - if (x == NULL || PyDict_SetItemString(d, "BAD_LICENSE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_MIN_GT_MAX - x = PyInt_FromLong(CL_BAD_MIN_GT_MAX); - if (x == NULL || PyDict_SetItemString(d, "BAD_MIN_GT_MAX", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_NO_BUFFERSPACE - x = PyInt_FromLong(CL_BAD_NO_BUFFERSPACE); - if (x == NULL || PyDict_SetItemString(d, "BAD_NO_BUFFERSPACE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_NUMBER_OF_BLOCKS - x = PyInt_FromLong(CL_BAD_NUMBER_OF_BLOCKS); - if (x == NULL || PyDict_SetItemString(d, "BAD_NUMBER_OF_BLOCKS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_PARAM - x = PyInt_FromLong(CL_BAD_PARAM); - if (x == NULL || PyDict_SetItemString(d, "BAD_PARAM", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_PARAM_ID_POINTER - x = PyInt_FromLong(CL_BAD_PARAM_ID_POINTER); - if (x == NULL || PyDict_SetItemString(d, "BAD_PARAM_ID_POINTER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_PARAM_TYPE - x = PyInt_FromLong(CL_BAD_PARAM_TYPE); - if (x == NULL || PyDict_SetItemString(d, "BAD_PARAM_TYPE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_POINTER - x = PyInt_FromLong(CL_BAD_POINTER); - if (x == NULL || PyDict_SetItemString(d, "BAD_POINTER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_PVBUFFER - x = PyInt_FromLong(CL_BAD_PVBUFFER); - if (x == NULL || PyDict_SetItemString(d, "BAD_PVBUFFER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_SCHEME_POINTER - x = PyInt_FromLong(CL_BAD_SCHEME_POINTER); - if (x == NULL || PyDict_SetItemString(d, "BAD_SCHEME_POINTER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_STREAM_HEADER - x = PyInt_FromLong(CL_BAD_STREAM_HEADER); - if (x == NULL || PyDict_SetItemString(d, "BAD_STREAM_HEADER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_STRING_POINTER - x = PyInt_FromLong(CL_BAD_STRING_POINTER); - if (x == NULL || PyDict_SetItemString(d, "BAD_STRING_POINTER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BAD_TEXT_STRING_PTR - x = PyInt_FromLong(CL_BAD_TEXT_STRING_PTR); - if (x == NULL || PyDict_SetItemString(d, "BAD_TEXT_STRING_PTR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BEST_FIT - x = PyInt_FromLong(CL_BEST_FIT); - if (x == NULL || PyDict_SetItemString(d, "BEST_FIT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BIDIRECTIONAL - x = PyInt_FromLong(CL_BIDIRECTIONAL); - if (x == NULL || PyDict_SetItemString(d, "BIDIRECTIONAL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BITRATE - x = PyInt_FromLong(CL_BITRATE); - if (x == NULL || PyDict_SetItemString(d, "BITRATE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BITRATE_POLICY - x = PyInt_FromLong(CL_BITRATE_POLICY); - if (x == NULL || PyDict_SetItemString(d, "BITRATE_POLICY", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BITRATE_TARGET - x = PyInt_FromLong(CL_BITRATE_TARGET); - if (x == NULL || PyDict_SetItemString(d, "BITRATE_TARGET", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BITS_PER_COMPONENT - x = PyInt_FromLong(CL_BITS_PER_COMPONENT); - if (x == NULL || PyDict_SetItemString(d, "BITS_PER_COMPONENT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BLENDING - x = PyInt_FromLong(CL_BLENDING); - if (x == NULL || PyDict_SetItemString(d, "BLENDING", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BLOCK_SIZE - x = PyInt_FromLong(CL_BLOCK_SIZE); - if (x == NULL || PyDict_SetItemString(d, "BLOCK_SIZE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BOTTOM_UP - x = PyInt_FromLong(CL_BOTTOM_UP); - if (x == NULL || PyDict_SetItemString(d, "BOTTOM_UP", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BUFFER_NOT_CREATED - x = PyInt_FromLong(CL_BUFFER_NOT_CREATED); - if (x == NULL || PyDict_SetItemString(d, "BUFFER_NOT_CREATED", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BUF_COMPRESSED - x = PyInt_FromLong(CL_BUF_COMPRESSED); - if (x == NULL || PyDict_SetItemString(d, "BUF_COMPRESSED", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BUF_DATA - x = PyInt_FromLong(CL_BUF_DATA); - if (x == NULL || PyDict_SetItemString(d, "BUF_DATA", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_BUF_FRAME - x = PyInt_FromLong(CL_BUF_FRAME); - if (x == NULL || PyDict_SetItemString(d, "BUF_FRAME", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_CHANNEL_POLICY - x = PyInt_FromLong(CL_CHANNEL_POLICY); - if (x == NULL || PyDict_SetItemString(d, "CHANNEL_POLICY", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_CHROMA_THRESHOLD - x = PyInt_FromLong(CL_CHROMA_THRESHOLD); - if (x == NULL || PyDict_SetItemString(d, "CHROMA_THRESHOLD", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_CODEC - x = PyInt_FromLong(CL_CODEC); - if (x == NULL || PyDict_SetItemString(d, "CODEC", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_COMPONENTS - x = PyInt_FromLong(CL_COMPONENTS); - if (x == NULL || PyDict_SetItemString(d, "COMPONENTS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_COMPRESSED_BUFFER_SIZE - x = PyInt_FromLong(CL_COMPRESSED_BUFFER_SIZE); - if (x == NULL || PyDict_SetItemString(d, "COMPRESSED_BUFFER_SIZE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_COMPRESSION_RATIO - x = PyInt_FromLong(CL_COMPRESSION_RATIO); - if (x == NULL || PyDict_SetItemString(d, "COMPRESSION_RATIO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_COMPRESSOR - x = PyInt_FromLong(CL_COMPRESSOR); - if (x == NULL || PyDict_SetItemString(d, "COMPRESSOR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_CONTINUOUS_BLOCK - x = PyInt_FromLong(CL_CONTINUOUS_BLOCK); - if (x == NULL || PyDict_SetItemString(d, "CONTINUOUS_BLOCK", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_CONTINUOUS_NONBLOCK - x = PyInt_FromLong(CL_CONTINUOUS_NONBLOCK); - if (x == NULL || PyDict_SetItemString(d, "CONTINUOUS_NONBLOCK", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_COSMO_CODEC_CONTROL - x = PyInt_FromLong(CL_COSMO_CODEC_CONTROL); - if (x == NULL || PyDict_SetItemString(d, "COSMO_CODEC_CONTROL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_COSMO_NUM_PARAMS - x = PyInt_FromLong(CL_COSMO_NUM_PARAMS); - if (x == NULL || PyDict_SetItemString(d, "COSMO_NUM_PARAMS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_COSMO_VALUE_BASE - x = PyInt_FromLong(CL_COSMO_VALUE_BASE); - if (x == NULL || PyDict_SetItemString(d, "COSMO_VALUE_BASE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_COSMO_VIDEO_MANUAL_CONTROL - x = PyInt_FromLong(CL_COSMO_VIDEO_MANUAL_CONTROL); - if (x == NULL || PyDict_SetItemString(d, "COSMO_VIDEO_MANUAL_CONTROL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_COSMO_VIDEO_TRANSFER_MODE - x = PyInt_FromLong(CL_COSMO_VIDEO_TRANSFER_MODE); - if (x == NULL || PyDict_SetItemString(d, "COSMO_VIDEO_TRANSFER_MODE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_DATA - x = PyInt_FromLong(CL_DATA); - if (x == NULL || PyDict_SetItemString(d, "DATA", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_DECOMPRESSOR - x = PyInt_FromLong(CL_DECOMPRESSOR); - if (x == NULL || PyDict_SetItemString(d, "DECOMPRESSOR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_DSO_ERROR - x = PyInt_FromLong(CL_DSO_ERROR); - if (x == NULL || PyDict_SetItemString(d, "DSO_ERROR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_EDGE_THRESHOLD - x = PyInt_FromLong(CL_EDGE_THRESHOLD); - if (x == NULL || PyDict_SetItemString(d, "EDGE_THRESHOLD", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ENABLE_IMAGEINFO - x = PyInt_FromLong(CL_ENABLE_IMAGEINFO); - if (x == NULL || PyDict_SetItemString(d, "ENABLE_IMAGEINFO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_END_OF_SEQUENCE - x = PyInt_FromLong(CL_END_OF_SEQUENCE); - if (x == NULL || PyDict_SetItemString(d, "END_OF_SEQUENCE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ENUM_VALUE - x = PyInt_FromLong(CL_ENUM_VALUE); - if (x == NULL || PyDict_SetItemString(d, "ENUM_VALUE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_EXACT_COMPRESSION_RATIO - x = PyInt_FromLong(CL_EXACT_COMPRESSION_RATIO); - if (x == NULL || PyDict_SetItemString(d, "EXACT_COMPRESSION_RATIO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_EXTERNAL_DEVICE - x = PyInt_FromLong((long) CL_EXTERNAL_DEVICE); - if (x == NULL || PyDict_SetItemString(d, "EXTERNAL_DEVICE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FLOATING_ENUM_VALUE - x = PyInt_FromLong(CL_FLOATING_ENUM_VALUE); - if (x == NULL || PyDict_SetItemString(d, "FLOATING_ENUM_VALUE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FLOATING_RANGE_VALUE - x = PyInt_FromLong(CL_FLOATING_RANGE_VALUE); - if (x == NULL || PyDict_SetItemString(d, "FLOATING_RANGE_VALUE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT - x = PyInt_FromLong(CL_FORMAT); - if (x == NULL || PyDict_SetItemString(d, "FORMAT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_ABGR - x = PyInt_FromLong(CL_FORMAT_ABGR); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_ABGR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_BGR - x = PyInt_FromLong(CL_FORMAT_BGR); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_BGR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_BGR233 - x = PyInt_FromLong(CL_FORMAT_BGR233); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_BGR233", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_GRAYSCALE - x = PyInt_FromLong(CL_FORMAT_GRAYSCALE); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_GRAYSCALE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_MONO - x = PyInt_FromLong(CL_FORMAT_MONO); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_MONO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_RBG323 - x = PyInt_FromLong(CL_FORMAT_RBG323); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_RBG323", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_STEREO_INTERLEAVED - x = PyInt_FromLong(CL_FORMAT_STEREO_INTERLEAVED); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_STEREO_INTERLEAVED", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_XBGR - x = PyInt_FromLong(CL_FORMAT_XBGR); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_XBGR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_YCbCr - x = PyInt_FromLong(CL_FORMAT_YCbCr); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_YCbCr", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_YCbCr422 - x = PyInt_FromLong(CL_FORMAT_YCbCr422); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_YCbCr422", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FORMAT_YCbCr422DC - x = PyInt_FromLong(CL_FORMAT_YCbCr422DC); - if (x == NULL || PyDict_SetItemString(d, "FORMAT_YCbCr422DC", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FRAME - x = PyInt_FromLong(CL_FRAME); - if (x == NULL || PyDict_SetItemString(d, "FRAME", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FRAMES_PER_CHUNK - x = PyInt_FromLong(CL_FRAMES_PER_CHUNK); - if (x == NULL || PyDict_SetItemString(d, "FRAMES_PER_CHUNK", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FRAME_BUFFER_SIZE - x = PyInt_FromLong(CL_FRAME_BUFFER_SIZE); - if (x == NULL || PyDict_SetItemString(d, "FRAME_BUFFER_SIZE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FRAME_BUFFER_SIZE_ZERO - x = PyInt_FromLong(CL_FRAME_BUFFER_SIZE_ZERO); - if (x == NULL || PyDict_SetItemString(d, "FRAME_BUFFER_SIZE_ZERO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FRAME_INDEX - x = PyInt_FromLong(CL_FRAME_INDEX); - if (x == NULL || PyDict_SetItemString(d, "FRAME_INDEX", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FRAME_RATE - x = PyInt_FromLong(CL_FRAME_RATE); - if (x == NULL || PyDict_SetItemString(d, "FRAME_RATE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FRAME_SIZE - x = PyInt_FromLong(CL_FRAME_SIZE); - if (x == NULL || PyDict_SetItemString(d, "FRAME_SIZE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_FRAME_TYPE - x = PyInt_FromLong(CL_FRAME_TYPE); - if (x == NULL || PyDict_SetItemString(d, "FRAME_TYPE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_G711_ALAW - x = PyInt_FromLong(CL_G711_ALAW); - if (x == NULL || PyDict_SetItemString(d, "G711_ALAW", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_G711_ALAW_SOFTWARE - x = PyInt_FromLong(CL_G711_ALAW_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "G711_ALAW_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_G711_ULAW - x = PyInt_FromLong(CL_G711_ULAW); - if (x == NULL || PyDict_SetItemString(d, "G711_ULAW", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_G711_ULAW_SOFTWARE - x = PyInt_FromLong(CL_G711_ULAW_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "G711_ULAW_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_GRAYSCALE - x = PyInt_FromLong(CL_GRAYSCALE); - if (x == NULL || PyDict_SetItemString(d, "GRAYSCALE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_HDCC - x = PyInt_FromLong(CL_HDCC); - if (x == NULL || PyDict_SetItemString(d, "HDCC", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_HDCC_SAMPLES_PER_TILE - x = PyInt_FromLong(CL_HDCC_SAMPLES_PER_TILE); - if (x == NULL || PyDict_SetItemString(d, "HDCC_SAMPLES_PER_TILE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_HDCC_SOFTWARE - x = PyInt_FromLong(CL_HDCC_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "HDCC_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_HDCC_TILE_THRESHOLD - x = PyInt_FromLong(CL_HDCC_TILE_THRESHOLD); - if (x == NULL || PyDict_SetItemString(d, "HDCC_TILE_THRESHOLD", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_HEADER_START_CODE - x = PyInt_FromLong(CL_HEADER_START_CODE); - if (x == NULL || PyDict_SetItemString(d, "HEADER_START_CODE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_IMAGEINFO_FIELDMASK - x = PyInt_FromLong(CL_IMAGEINFO_FIELDMASK); - if (x == NULL || PyDict_SetItemString(d, "IMAGEINFO_FIELDMASK", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_IMAGE_CROP_BOTTOM - x = PyInt_FromLong(CL_IMAGE_CROP_BOTTOM); - if (x == NULL || PyDict_SetItemString(d, "IMAGE_CROP_BOTTOM", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_IMAGE_CROP_LEFT - x = PyInt_FromLong(CL_IMAGE_CROP_LEFT); - if (x == NULL || PyDict_SetItemString(d, "IMAGE_CROP_LEFT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_IMAGE_CROP_RIGHT - x = PyInt_FromLong(CL_IMAGE_CROP_RIGHT); - if (x == NULL || PyDict_SetItemString(d, "IMAGE_CROP_RIGHT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_IMAGE_CROP_TOP - x = PyInt_FromLong(CL_IMAGE_CROP_TOP); - if (x == NULL || PyDict_SetItemString(d, "IMAGE_CROP_TOP", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_IMAGE_HEIGHT - x = PyInt_FromLong(CL_IMAGE_HEIGHT); - if (x == NULL || PyDict_SetItemString(d, "IMAGE_HEIGHT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_IMAGE_WIDTH - x = PyInt_FromLong(CL_IMAGE_WIDTH); - if (x == NULL || PyDict_SetItemString(d, "IMAGE_WIDTH", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_IMPACT_CODEC_CONTROL - x = PyInt_FromLong(CL_IMPACT_CODEC_CONTROL); - if (x == NULL || PyDict_SetItemString(d, "IMPACT_CODEC_CONTROL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_IMPACT_FRAME_INTERLEAVE - x = PyInt_FromLong(CL_IMPACT_FRAME_INTERLEAVE); - if (x == NULL || PyDict_SetItemString(d, "IMPACT_FRAME_INTERLEAVE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_IMPACT_NUM_PARAMS - x = PyInt_FromLong(CL_IMPACT_NUM_PARAMS); - if (x == NULL || PyDict_SetItemString(d, "IMPACT_NUM_PARAMS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_INTERNAL_FORMAT - x = PyInt_FromLong(CL_INTERNAL_FORMAT); - if (x == NULL || PyDict_SetItemString(d, "INTERNAL_FORMAT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_INTERNAL_IMAGE_HEIGHT - x = PyInt_FromLong(CL_INTERNAL_IMAGE_HEIGHT); - if (x == NULL || PyDict_SetItemString(d, "INTERNAL_IMAGE_HEIGHT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_INTERNAL_IMAGE_WIDTH - x = PyInt_FromLong(CL_INTERNAL_IMAGE_WIDTH); - if (x == NULL || PyDict_SetItemString(d, "INTERNAL_IMAGE_WIDTH", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_INTRA - x = PyInt_FromLong(CL_INTRA); - if (x == NULL || PyDict_SetItemString(d, "INTRA", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_JPEG - x = PyInt_FromLong(CL_JPEG); - if (x == NULL || PyDict_SetItemString(d, "JPEG", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_JPEG_COSMO - x = PyInt_FromLong(CL_JPEG_COSMO); - if (x == NULL || PyDict_SetItemString(d, "JPEG_COSMO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_JPEG_ERROR - x = PyInt_FromLong(CL_JPEG_ERROR); - if (x == NULL || PyDict_SetItemString(d, "JPEG_ERROR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_JPEG_IMPACT - x = PyInt_FromLong(CL_JPEG_IMPACT); - if (x == NULL || PyDict_SetItemString(d, "JPEG_IMPACT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_JPEG_NUM_PARAMS - x = PyInt_FromLong(CL_JPEG_NUM_PARAMS); - if (x == NULL || PyDict_SetItemString(d, "JPEG_NUM_PARAMS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_JPEG_QUALITY_FACTOR - x = PyInt_FromLong(CL_JPEG_QUALITY_FACTOR); - if (x == NULL || PyDict_SetItemString(d, "JPEG_QUALITY_FACTOR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_JPEG_QUANTIZATION_TABLES - x = PyInt_FromLong(CL_JPEG_QUANTIZATION_TABLES); - if (x == NULL || PyDict_SetItemString(d, "JPEG_QUANTIZATION_TABLES", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_JPEG_SOFTWARE - x = PyInt_FromLong(CL_JPEG_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "JPEG_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_JPEG_STREAM_HEADERS - x = PyInt_FromLong(CL_JPEG_STREAM_HEADERS); - if (x == NULL || PyDict_SetItemString(d, "JPEG_STREAM_HEADERS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_KEYFRAME - x = PyInt_FromLong(CL_KEYFRAME); - if (x == NULL || PyDict_SetItemString(d, "KEYFRAME", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_KEYFRAME_DISTANCE - x = PyInt_FromLong(CL_KEYFRAME_DISTANCE); - if (x == NULL || PyDict_SetItemString(d, "KEYFRAME_DISTANCE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_LAST_FRAME_INDEX - x = PyInt_FromLong(CL_LAST_FRAME_INDEX); - if (x == NULL || PyDict_SetItemString(d, "LAST_FRAME_INDEX", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_LAYER - x = PyInt_FromLong(CL_LAYER); - if (x == NULL || PyDict_SetItemString(d, "LAYER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_LUMA_THRESHOLD - x = PyInt_FromLong(CL_LUMA_THRESHOLD); - if (x == NULL || PyDict_SetItemString(d, "LUMA_THRESHOLD", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MAX_NUMBER_OF_AUDIO_ALGORITHMS - x = PyInt_FromLong(CL_MAX_NUMBER_OF_AUDIO_ALGORITHMS); - if (x == NULL || PyDict_SetItemString(d, "MAX_NUMBER_OF_AUDIO_ALGORITHMS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MAX_NUMBER_OF_FORMATS - x = PyInt_FromLong(CL_MAX_NUMBER_OF_FORMATS); - if (x == NULL || PyDict_SetItemString(d, "MAX_NUMBER_OF_FORMATS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MAX_NUMBER_OF_ORIGINAL_FORMATS - x = PyInt_FromLong(CL_MAX_NUMBER_OF_ORIGINAL_FORMATS); - if (x == NULL || PyDict_SetItemString(d, "MAX_NUMBER_OF_ORIGINAL_FORMATS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MAX_NUMBER_OF_PARAMS - x = PyInt_FromLong(CL_MAX_NUMBER_OF_PARAMS); - if (x == NULL || PyDict_SetItemString(d, "MAX_NUMBER_OF_PARAMS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MAX_NUMBER_OF_VIDEO_ALGORITHMS - x = PyInt_FromLong(CL_MAX_NUMBER_OF_VIDEO_ALGORITHMS); - if (x == NULL || PyDict_SetItemString(d, "MAX_NUMBER_OF_VIDEO_ALGORITHMS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MONO - x = PyInt_FromLong(CL_MONO); - if (x == NULL || PyDict_SetItemString(d, "MONO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_AUDIO_AWARE - x = PyInt_FromLong(CL_MPEG1_AUDIO_AWARE); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_AUDIO_AWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_AUDIO_LAYER - x = PyInt_FromLong(CL_MPEG1_AUDIO_LAYER); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_AUDIO_LAYER", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_AUDIO_LAYER_I - x = PyInt_FromLong(CL_MPEG1_AUDIO_LAYER_I); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_AUDIO_LAYER_I", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_AUDIO_LAYER_II - x = PyInt_FromLong(CL_MPEG1_AUDIO_LAYER_II); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_AUDIO_LAYER_II", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_AUDIO_MODE - x = PyInt_FromLong(CL_MPEG1_AUDIO_MODE); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_AUDIO_MODE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_AUDIO_MODE_DUAL - x = PyInt_FromLong(CL_MPEG1_AUDIO_MODE_DUAL); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_AUDIO_MODE_DUAL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_AUDIO_MODE_JOINT - x = PyInt_FromLong(CL_MPEG1_AUDIO_MODE_JOINT); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_AUDIO_MODE_JOINT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_AUDIO_MODE_SINGLE - x = PyInt_FromLong(CL_MPEG1_AUDIO_MODE_SINGLE); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_AUDIO_MODE_SINGLE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_AUDIO_MODE_STEREO - x = PyInt_FromLong(CL_MPEG1_AUDIO_MODE_STEREO); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_AUDIO_MODE_STEREO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_AUDIO_SOFTWARE - x = PyInt_FromLong(CL_MPEG1_AUDIO_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_AUDIO_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_END_OF_STREAM - x = PyInt_FromLong(CL_MPEG1_END_OF_STREAM); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_END_OF_STREAM", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_ERROR - x = PyInt_FromLong(CL_MPEG1_ERROR); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_ERROR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_NUM_PARAMS - x = PyInt_FromLong(CL_MPEG1_NUM_PARAMS); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_NUM_PARAMS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_M - x = PyInt_FromLong(CL_MPEG1_VIDEO_M); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_M", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_B_X - x = PyInt_FromLong(CL_MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_B_X); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_B_X", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_B_Y - x = PyInt_FromLong(CL_MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_B_Y); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_B_Y", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_P_X - x = PyInt_FromLong(CL_MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_P_X); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_P_X", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_P_Y - x = PyInt_FromLong(CL_MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_P_Y); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_MAX_MOTION_VECTOR_LENGTH_P_Y", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_N - x = PyInt_FromLong(CL_MPEG1_VIDEO_N); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_N", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_SOFTNESS - x = PyInt_FromLong(CL_MPEG1_VIDEO_SOFTNESS); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_SOFTNESS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_SOFTNESS_MAXIMUM - x = PyInt_FromLong(CL_MPEG1_VIDEO_SOFTNESS_MAXIMUM); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_SOFTNESS_MAXIMUM", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_SOFTNESS_MEDIUM - x = PyInt_FromLong(CL_MPEG1_VIDEO_SOFTNESS_MEDIUM); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_SOFTNESS_MEDIUM", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_SOFTNESS_NONE - x = PyInt_FromLong(CL_MPEG1_VIDEO_SOFTNESS_NONE); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_SOFTNESS_NONE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG1_VIDEO_SOFTWARE - x = PyInt_FromLong(CL_MPEG1_VIDEO_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "MPEG1_VIDEO_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MPEG_VIDEO - x = PyInt_FromLong(CL_MPEG_VIDEO); - if (x == NULL || PyDict_SetItemString(d, "MPEG_VIDEO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MULTIRATE_AWARE - x = PyInt_FromLong(CL_MULTIRATE_AWARE); - if (x == NULL || PyDict_SetItemString(d, "MULTIRATE_AWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC1 - x = PyInt_FromLong(CL_MVC1); - if (x == NULL || PyDict_SetItemString(d, "MVC1", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC1_SOFTWARE - x = PyInt_FromLong(CL_MVC1_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "MVC1_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC2 - x = PyInt_FromLong(CL_MVC2); - if (x == NULL || PyDict_SetItemString(d, "MVC2", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC2_BLENDING - x = PyInt_FromLong(CL_MVC2_BLENDING); - if (x == NULL || PyDict_SetItemString(d, "MVC2_BLENDING", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC2_BLENDING_OFF - x = PyInt_FromLong(CL_MVC2_BLENDING_OFF); - if (x == NULL || PyDict_SetItemString(d, "MVC2_BLENDING_OFF", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC2_BLENDING_ON - x = PyInt_FromLong(CL_MVC2_BLENDING_ON); - if (x == NULL || PyDict_SetItemString(d, "MVC2_BLENDING_ON", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC2_CHROMA_THRESHOLD - x = PyInt_FromLong(CL_MVC2_CHROMA_THRESHOLD); - if (x == NULL || PyDict_SetItemString(d, "MVC2_CHROMA_THRESHOLD", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC2_EDGE_THRESHOLD - x = PyInt_FromLong(CL_MVC2_EDGE_THRESHOLD); - if (x == NULL || PyDict_SetItemString(d, "MVC2_EDGE_THRESHOLD", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC2_ERROR - x = PyInt_FromLong(CL_MVC2_ERROR); - if (x == NULL || PyDict_SetItemString(d, "MVC2_ERROR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC2_LUMA_THRESHOLD - x = PyInt_FromLong(CL_MVC2_LUMA_THRESHOLD); - if (x == NULL || PyDict_SetItemString(d, "MVC2_LUMA_THRESHOLD", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC2_SOFTWARE - x = PyInt_FromLong(CL_MVC2_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "MVC2_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC3_QUALITY_LEVEL - x = PyInt_FromLong(CL_MVC3_QUALITY_LEVEL); - if (x == NULL || PyDict_SetItemString(d, "MVC3_QUALITY_LEVEL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_MVC3_SOFTWARE - x = PyInt_FromLong(CL_MVC3_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "MVC3_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_NEXT_NOT_AVAILABLE - x = PyInt_FromLong(CL_NEXT_NOT_AVAILABLE); - if (x == NULL || PyDict_SetItemString(d, "NEXT_NOT_AVAILABLE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_NOISE_MARGIN - x = PyInt_FromLong(CL_NOISE_MARGIN); - if (x == NULL || PyDict_SetItemString(d, "NOISE_MARGIN", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_NONE - x = PyInt_FromLong(CL_NONE); - if (x == NULL || PyDict_SetItemString(d, "NONE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_NUMBER_OF_FORMATS - x = PyInt_FromLong(CL_NUMBER_OF_FORMATS); - if (x == NULL || PyDict_SetItemString(d, "NUMBER_OF_FORMATS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_NUMBER_OF_FRAMES - x = PyInt_FromLong(CL_NUMBER_OF_FRAMES); - if (x == NULL || PyDict_SetItemString(d, "NUMBER_OF_FRAMES", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_NUMBER_OF_PARAMS - x = PyInt_FromLong(CL_NUMBER_OF_PARAMS); - if (x == NULL || PyDict_SetItemString(d, "NUMBER_OF_PARAMS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_NUMBER_OF_PARAMS_FREEZE - x = PyInt_FromLong(CL_NUMBER_OF_PARAMS_FREEZE); - if (x == NULL || PyDict_SetItemString(d, "NUMBER_OF_PARAMS_FREEZE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_NUMBER_OF_VIDEO_FORMATS - x = PyInt_FromLong(CL_NUMBER_OF_VIDEO_FORMATS); - if (x == NULL || PyDict_SetItemString(d, "NUMBER_OF_VIDEO_FORMATS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ORIENTATION - x = PyInt_FromLong(CL_ORIENTATION); - if (x == NULL || PyDict_SetItemString(d, "ORIENTATION", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ORIGINAL_FORMAT - x = PyInt_FromLong(CL_ORIGINAL_FORMAT); - if (x == NULL || PyDict_SetItemString(d, "ORIGINAL_FORMAT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_PARAM_OUT_OF_RANGE - x = PyInt_FromLong(CL_PARAM_OUT_OF_RANGE); - if (x == NULL || PyDict_SetItemString(d, "PARAM_OUT_OF_RANGE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_PIXEL_ASPECT - x = PyInt_FromLong(CL_PIXEL_ASPECT); - if (x == NULL || PyDict_SetItemString(d, "PIXEL_ASPECT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_PREDICTED - x = PyInt_FromLong(CL_PREDICTED); - if (x == NULL || PyDict_SetItemString(d, "PREDICTED", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_PREROLL - x = PyInt_FromLong(CL_PREROLL); - if (x == NULL || PyDict_SetItemString(d, "PREROLL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_QUALITY_FACTOR - x = PyInt_FromLong(CL_QUALITY_FACTOR); - if (x == NULL || PyDict_SetItemString(d, "QUALITY_FACTOR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_QUALITY_LEVEL - x = PyInt_FromLong(CL_QUALITY_LEVEL); - if (x == NULL || PyDict_SetItemString(d, "QUALITY_LEVEL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_QUALITY_SPATIAL - x = PyInt_FromLong(CL_QUALITY_SPATIAL); - if (x == NULL || PyDict_SetItemString(d, "QUALITY_SPATIAL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_QUALITY_TEMPORAL - x = PyInt_FromLong(CL_QUALITY_TEMPORAL); - if (x == NULL || PyDict_SetItemString(d, "QUALITY_TEMPORAL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_QUANTIZATION_TABLES - x = PyInt_FromLong(CL_QUANTIZATION_TABLES); - if (x == NULL || PyDict_SetItemString(d, "QUANTIZATION_TABLES", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RANGE_VALUE - x = PyInt_FromLong(CL_RANGE_VALUE); - if (x == NULL || PyDict_SetItemString(d, "RANGE_VALUE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RGB - x = PyInt_FromLong(CL_RGB); - if (x == NULL || PyDict_SetItemString(d, "RGB", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RGB332 - x = PyInt_FromLong(CL_RGB332); - if (x == NULL || PyDict_SetItemString(d, "RGB332", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RGB8 - x = PyInt_FromLong(CL_RGB8); - if (x == NULL || PyDict_SetItemString(d, "RGB8", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RGBA - x = PyInt_FromLong(CL_RGBA); - if (x == NULL || PyDict_SetItemString(d, "RGBA", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RGBX - x = PyInt_FromLong(CL_RGBX); - if (x == NULL || PyDict_SetItemString(d, "RGBX", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RLE - x = PyInt_FromLong(CL_RLE); - if (x == NULL || PyDict_SetItemString(d, "RLE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RLE24 - x = PyInt_FromLong(CL_RLE24); - if (x == NULL || PyDict_SetItemString(d, "RLE24", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RLE24_SOFTWARE - x = PyInt_FromLong(CL_RLE24_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "RLE24_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RLE_SOFTWARE - x = PyInt_FromLong(CL_RLE_SOFTWARE); - if (x == NULL || PyDict_SetItemString(d, "RLE_SOFTWARE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RTR - x = PyInt_FromLong(CL_RTR); - if (x == NULL || PyDict_SetItemString(d, "RTR", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RTR1 - x = PyInt_FromLong(CL_RTR1); - if (x == NULL || PyDict_SetItemString(d, "RTR1", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_RTR_QUALITY_LEVEL - x = PyInt_FromLong(CL_RTR_QUALITY_LEVEL); - if (x == NULL || PyDict_SetItemString(d, "RTR_QUALITY_LEVEL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_SAMPLES_PER_TILE - x = PyInt_FromLong(CL_SAMPLES_PER_TILE); - if (x == NULL || PyDict_SetItemString(d, "SAMPLES_PER_TILE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_SCHEME_BUSY - x = PyInt_FromLong(CL_SCHEME_BUSY); - if (x == NULL || PyDict_SetItemString(d, "SCHEME_BUSY", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_SCHEME_NOT_AVAILABLE - x = PyInt_FromLong(CL_SCHEME_NOT_AVAILABLE); - if (x == NULL || PyDict_SetItemString(d, "SCHEME_NOT_AVAILABLE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_SPEED - x = PyInt_FromLong(CL_SPEED); - if (x == NULL || PyDict_SetItemString(d, "SPEED", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_STEREO_INTERLEAVED - x = PyInt_FromLong(CL_STEREO_INTERLEAVED); - if (x == NULL || PyDict_SetItemString(d, "STEREO_INTERLEAVED", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_STREAM_HEADERS - x = PyInt_FromLong(CL_STREAM_HEADERS); - if (x == NULL || PyDict_SetItemString(d, "STREAM_HEADERS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_TILE_THRESHOLD - x = PyInt_FromLong(CL_TILE_THRESHOLD); - if (x == NULL || PyDict_SetItemString(d, "TILE_THRESHOLD", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_TOP_DOWN - x = PyInt_FromLong(CL_TOP_DOWN); - if (x == NULL || PyDict_SetItemString(d, "TOP_DOWN", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_ULAW - x = PyInt_FromLong(CL_ULAW); - if (x == NULL || PyDict_SetItemString(d, "ULAW", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_UNCOMPRESSED - x = PyInt_FromLong(CL_UNCOMPRESSED); - if (x == NULL || PyDict_SetItemString(d, "UNCOMPRESSED", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_UNCOMPRESSED_AUDIO - x = PyInt_FromLong(CL_UNCOMPRESSED_AUDIO); - if (x == NULL || PyDict_SetItemString(d, "UNCOMPRESSED_AUDIO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_UNCOMPRESSED_VIDEO - x = PyInt_FromLong(CL_UNCOMPRESSED_VIDEO); - if (x == NULL || PyDict_SetItemString(d, "UNCOMPRESSED_VIDEO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_UNKNOWN_SCHEME - x = PyInt_FromLong(CL_UNKNOWN_SCHEME); - if (x == NULL || PyDict_SetItemString(d, "UNKNOWN_SCHEME", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_VIDEO - x = PyInt_FromLong(CL_VIDEO); - if (x == NULL || PyDict_SetItemString(d, "VIDEO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_Y - x = PyInt_FromLong(CL_Y); - if (x == NULL || PyDict_SetItemString(d, "Y", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_YCbCr - x = PyInt_FromLong(CL_YCbCr); - if (x == NULL || PyDict_SetItemString(d, "YCbCr", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_YCbCr422 - x = PyInt_FromLong(CL_YCbCr422); - if (x == NULL || PyDict_SetItemString(d, "YCbCr422", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_YCbCr422DC - x = PyInt_FromLong(CL_YCbCr422DC); - if (x == NULL || PyDict_SetItemString(d, "YCbCr422DC", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_YCbCr422HC - x = PyInt_FromLong(CL_YCbCr422HC); - if (x == NULL || PyDict_SetItemString(d, "YCbCr422HC", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_YUV - x = PyInt_FromLong(CL_YUV); - if (x == NULL || PyDict_SetItemString(d, "YUV", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_YUV422 - x = PyInt_FromLong(CL_YUV422); - if (x == NULL || PyDict_SetItemString(d, "YUV422", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_YUV422DC - x = PyInt_FromLong(CL_YUV422DC); - if (x == NULL || PyDict_SetItemString(d, "YUV422DC", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef CL_YUV422HC - x = PyInt_FromLong(CL_YUV422HC); - if (x == NULL || PyDict_SetItemString(d, "YUV422HC", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef AWCMP_STEREO - x = PyInt_FromLong(AWCMP_STEREO); - if (x == NULL || PyDict_SetItemString(d, "AWCMP_STEREO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef AWCMP_JOINT_STEREO - x = PyInt_FromLong(AWCMP_JOINT_STEREO); - if (x == NULL || PyDict_SetItemString(d, "AWCMP_JOINT_STEREO", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef AWCMP_INDEPENDENT - x = PyInt_FromLong(AWCMP_INDEPENDENT); - if (x == NULL || PyDict_SetItemString(d, "AWCMP_INDEPENDENT", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef AWCMP_FIXED_RATE - x = PyInt_FromLong(AWCMP_FIXED_RATE); - if (x == NULL || PyDict_SetItemString(d, "AWCMP_FIXED_RATE", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef AWCMP_CONST_QUAL - x = PyInt_FromLong(AWCMP_CONST_QUAL); - if (x == NULL || PyDict_SetItemString(d, "AWCMP_CONST_QUAL", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef AWCMP_LOSSLESS - x = PyInt_FromLong(AWCMP_LOSSLESS); - if (x == NULL || PyDict_SetItemString(d, "AWCMP_LOSSLESS", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef AWCMP_MPEG_LAYER_I - x = PyInt_FromLong(AWCMP_MPEG_LAYER_I); - if (x == NULL || PyDict_SetItemString(d, "AWCMP_MPEG_LAYER_I", x) < 0) - return; - Py_DECREF(x); -#endif -#ifdef AWCMP_MPEG_LAYER_II - x = PyInt_FromLong(AWCMP_MPEG_LAYER_II); - if (x == NULL || PyDict_SetItemString(d, "AWCMP_MPEG_LAYER_II", x) < 0) - return; - Py_DECREF(x); -#endif - - (void) clSetErrorHandler(cl_ErrorHandler); -} diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 0dc6bdb3968..3021cf0466a 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -1024,6 +1024,19 @@ PyDoc_STRVAR(cmath_rect_doc, Convert from polar coordinates to rectangular coordinates."); static PyObject * +cmath_isfinite(PyObject *self, PyObject *args) +{ + Py_complex z; + if (!PyArg_ParseTuple(args, "D:isfinite", &z)) + return NULL; + return PyBool_FromLong(Py_IS_FINITE(z.real) && Py_IS_FINITE(z.imag)); +} + +PyDoc_STRVAR(cmath_isfinite_doc, +"isfinite(z) -> bool\n\ +Return True if both the real and imaginary parts of z are finite, else False."); + +static PyObject * cmath_isnan(PyObject *self, PyObject *args) { Py_complex z; @@ -1065,6 +1078,7 @@ static PyMethodDef cmath_methods[] = { {"cos", cmath_cos, METH_VARARGS, c_cos_doc}, {"cosh", cmath_cosh, METH_VARARGS, c_cosh_doc}, {"exp", cmath_exp, METH_VARARGS, c_exp_doc}, + {"isfinite", cmath_isfinite, METH_VARARGS, cmath_isfinite_doc}, {"isinf", cmath_isinf, METH_VARARGS, cmath_isinf_doc}, {"isnan", cmath_isnan, METH_VARARGS, cmath_isnan_doc}, {"log", cmath_log, METH_VARARGS, cmath_log_doc}, @@ -1080,14 +1094,27 @@ static PyMethodDef cmath_methods[] = { {NULL, NULL} /* sentinel */ }; + +static struct PyModuleDef cmathmodule = { + PyModuleDef_HEAD_INIT, + "cmath", + module_doc, + -1, + cmath_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initcmath(void) +PyInit_cmath(void) { PyObject *m; - m = Py_InitModule3("cmath", cmath_methods, module_doc); + m = PyModule_Create(&cmathmodule); if (m == NULL) - return; + return NULL; PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI)); @@ -1207,4 +1234,5 @@ initcmath(void) C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N) C(N,N) C(N,N) C(N,0.) C(N,0.) C(N,N) C(N,N) C(N,N) }) + return m; } diff --git a/Modules/config.c.in b/Modules/config.c.in index faa427ace25..34d44d5a880 100644 --- a/Modules/config.c.in +++ b/Modules/config.c.in @@ -24,11 +24,12 @@ extern "C" { /* -- ADDMODULE MARKER 1 -- */ -extern void PyMarshal_Init(void); -extern void initimp(void); -extern void initgc(void); -extern void init_ast(void); -extern void _PyWarnings_Init(void); +extern PyObject* PyMarshal_Init(void); +extern PyObject* PyInit_imp(void); +extern PyObject* PyInit_gc(void); +extern PyObject* PyInit__ast(void); +extern PyObject* _PyWarnings_Init(void); +extern PyObject* PyInit__string(void); struct _inittab _PyImport_Inittab[] = { @@ -38,23 +39,25 @@ struct _inittab _PyImport_Inittab[] = { {"marshal", PyMarshal_Init}, /* This lives in import.c */ - {"imp", initimp}, + {"imp", PyInit_imp}, /* This lives in Python/Python-ast.c */ - {"_ast", init_ast}, + {"_ast", PyInit__ast}, /* These entries are here for sys.builtin_module_names */ {"__main__", NULL}, - {"__builtin__", NULL}, + {"builtins", NULL}, {"sys", NULL}, - {"exceptions", NULL}, /* This lives in gcmodule.c */ - {"gc", initgc}, + {"gc", PyInit_gc}, /* This lives in _warnings.c */ {"_warnings", _PyWarnings_Init}, + /* This lives in Objects/unicodeobject.c */ + {"_string", PyInit__string}, + /* Sentinel */ {0, 0} }; diff --git a/Modules/cryptmodule.c b/Modules/cryptmodule.c index 76de54f034b..d5a42ff9513 100644 --- a/Modules/cryptmodule.c +++ b/Modules/cryptmodule.c @@ -42,8 +42,21 @@ static PyMethodDef crypt_methods[] = { {NULL, NULL} /* sentinel */ }; + +static struct PyModuleDef cryptmodule = { + PyModuleDef_HEAD_INIT, + "crypt", + NULL, + -1, + crypt_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initcrypt(void) +PyInit_crypt(void) { - Py_InitModule("crypt", crypt_methods); + return PyModule_Create(&cryptmodule); } diff --git a/Modules/cstubs b/Modules/cstubs deleted file mode 100644 index 53bd4ab3106..00000000000 --- a/Modules/cstubs +++ /dev/null @@ -1,1364 +0,0 @@ - -/* -Input used to generate the Python module "glmodule.c". -The stub generator is a Python script called "cgen.py". - -Each definition must be contained on one line: - -<returntype> <name> <type> <arg> <type> <arg> - -<returntype> can be: void, short, long (XXX maybe others?) - -<type> can be: char, string, short, float, long, or double - string indicates a null terminated string; - if <type> is char and <arg> begins with a *, the * is stripped - and <type> is changed into string - -<arg> has the form <mode> or <mode>[<subscript>] - where <mode> can be - s: arg is sent - r: arg is received (arg is a pointer) - and <subscript> can be (N and I are numbers): - N - argI - retval - N*argI - N*I - N*retval - In the case where the subscript consists of two parts - separated by *, the first part is the width of the matrix, and - the second part is the length of the matrix. This order is - opposite from the order used in C to declare a two-dimensional - matrix. -*/ - -/* - * An attempt has been made to make this module switch threads on qread - * calls. It is far from safe, though. - */ - -#include <gl.h> -#include <device.h> - -#ifdef __sgi -extern int devport(); -extern int textwritemask(); -extern int pagewritemask(); -extern int gewrite(); -extern int gettp(); -#endif - -#include "Python.h" -#include "cgensupport.h" - -/* -Some stubs are too complicated for the stub generator. -We can include manually written versions of them here. -A line starting with '%' gives the name of the function so the stub -generator can include it in the table of functions. -*/ - -% qread - -static PyObject * -gl_qread(self, args) - PyObject *self; - PyObject *args; -{ - long retval; - short arg1 ; - Py_BEGIN_ALLOW_THREADS - retval = qread( & arg1 ); - Py_END_ALLOW_THREADS - { PyObject *v = PyTuple_New( 2 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewlongobject(retval)); - PyTuple_SetItem(v, 1, mknewshortobject(arg1)); - return v; - } -} - - -/* -varray -- an array of v.. calls. -The argument is an array (maybe list or tuple) of points. -Each point must be a tuple or list of coordinates (x, y, z). -The points may be 2- or 3-dimensional but must all have the -same dimension. Float and int values may be mixed however. -The points are always converted to 3D double precision points -by assuming z=0.0 if necessary (as indicated in the man page), -and for each point v3d() is called. -*/ - -% varray - -static PyObject * -gl_varray(self, args) - PyObject *self; - PyObject *args; -{ - PyObject *v, *w=NULL; - int i, n, width; - double vec[3]; - PyObject * (*getitem)(PyObject *, int); - - if (!PyArg_GetObject(args, 1, 0, &v)) - return NULL; - - if (PyList_Check(v)) { - n = PyList_Size(v); - getitem = PyList_GetItem; - } - else if (PyTuple_Check(v)) { - n = PyTuple_Size(v); - getitem = PyTuple_GetItem; - } - else { - PyErr_BadArgument(); - return NULL; - } - - if (n == 0) { - Py_INCREF(Py_None); - return Py_None; - } - if (n > 0) - w = (*getitem)(v, 0); - - width = 0; - if (w == NULL) { - } - else if (PyList_Check(w)) { - width = PyList_Size(w); - } - else if (PyTuple_Check(w)) { - width = PyTuple_Size(w); - } - - switch (width) { - case 2: - vec[2] = 0.0; - /* Fall through */ - case 3: - break; - default: - PyErr_BadArgument(); - return NULL; - } - - for (i = 0; i < n; i++) { - w = (*getitem)(v, i); - if (!PyArg_GetDoubleArray(w, 1, 0, width, vec)) - return NULL; - v3d(vec); - } - - Py_INCREF(Py_None); - return Py_None; -} - -/* -vnarray, nvarray -- an array of n3f and v3f calls. -The argument is an array (list or tuple) of pairs of points and normals. -Each pair is a tuple (NOT a list) of a point and a normal for that point. -Each point or normal must be a tuple (NOT a list) of coordinates (x, y, z). -Three coordinates must be given. Float and int values may be mixed. -For each pair, n3f() is called for the normal, and then v3f() is called -for the vector. - -vnarray and nvarray differ only in the order of the vector and normal in -the pair: vnarray expects (v, n) while nvarray expects (n, v). -*/ - -static PyObject *gen_nvarray(); /* Forward */ - -% nvarray - -static PyObject * -gl_nvarray(self, args) - PyObject *self; - PyObject *args; -{ - return gen_nvarray(args, 0); -} - -% vnarray - -static PyObject * -gl_vnarray(self, args) - PyObject *self; - PyObject *args; -{ - return gen_nvarray(args, 1); -} - -/* Generic, internal version of {nv,nv}array: inorm indicates the - argument order, 0: normal first, 1: vector first. */ - -static PyObject * -gen_nvarray(args, inorm) - PyObject *args; - int inorm; -{ - PyObject *v, *w, *wnorm, *wvec; - int i, n; - float norm[3], vec[3]; - PyObject * (*getitem)(PyObject *, int); - - if (!PyArg_GetObject(args, 1, 0, &v)) - return NULL; - - if (PyList_Check(v)) { - n = PyList_Size(v); - getitem = PyList_GetItem; - } - else if (PyTuple_Check(v)) { - n = PyTuple_Size(v); - getitem = PyTuple_GetItem; - } - else { - PyErr_BadArgument(); - return NULL; - } - - for (i = 0; i < n; i++) { - w = (*getitem)(v, i); - if (!PyTuple_Check(w) || PyTuple_Size(w) != 2) { - PyErr_BadArgument(); - return NULL; - } - wnorm = PyTuple_GetItem(w, inorm); - wvec = PyTuple_GetItem(w, 1 - inorm); - if (!PyArg_GetFloatArray(wnorm, 1, 0, 3, norm) || - !PyArg_GetFloatArray(wvec, 1, 0, 3, vec)) - return NULL; - n3f(norm); - v3f(vec); - } - - Py_INCREF(Py_None); - return Py_None; -} - -/* nurbssurface(s_knots[], t_knots[], ctl[][], s_order, t_order, type). - The dimensions of ctl[] are computed as follows: - [len(s_knots) - s_order], [len(t_knots) - t_order] -*/ - -% nurbssurface - -static PyObject * -gl_nurbssurface(self, args) - PyObject *self; - PyObject *args; -{ - long arg1 ; - double * arg2 ; - long arg3 ; - double * arg4 ; - double *arg5 ; - long arg6 ; - long arg7 ; - long arg8 ; - long ncoords; - long s_byte_stride, t_byte_stride; - long s_nctl, t_nctl; - long s, t; - PyObject *v, *w, *pt; - double *pnext; - if (!PyArg_GetLongArraySize(args, 6, 0, &arg1)) - return NULL; - if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) { - return PyErr_NoMemory(); - } - if (!PyArg_GetDoubleArray(args, 6, 0, arg1 , arg2)) - return NULL; - if (!PyArg_GetLongArraySize(args, 6, 1, &arg3)) - return NULL; - if ((arg4 = PyMem_NEW(double, arg3 )) == NULL) { - return PyErr_NoMemory(); - } - if (!PyArg_GetDoubleArray(args, 6, 1, arg3 , arg4)) - return NULL; - if (!PyArg_GetLong(args, 6, 3, &arg6)) - return NULL; - if (!PyArg_GetLong(args, 6, 4, &arg7)) - return NULL; - if (!PyArg_GetLong(args, 6, 5, &arg8)) - return NULL; - if (arg8 == N_XYZ) - ncoords = 3; - else if (arg8 == N_XYZW) - ncoords = 4; - else { - PyErr_BadArgument(); - return NULL; - } - s_nctl = arg1 - arg6; - t_nctl = arg3 - arg7; - if (!PyArg_GetObject(args, 6, 2, &v)) - return NULL; - if (!PyList_Check(v) || PyList_Size(v) != s_nctl) { - PyErr_BadArgument(); - return NULL; - } - if ((arg5 = PyMem_NEW(double, s_nctl*t_nctl*ncoords )) == NULL) { - return PyErr_NoMemory(); - } - pnext = arg5; - for (s = 0; s < s_nctl; s++) { - w = PyList_GetItem(v, s); - if (w == NULL || !PyList_Check(w) || - PyList_Size(w) != t_nctl) { - PyErr_BadArgument(); - return NULL; - } - for (t = 0; t < t_nctl; t++) { - pt = PyList_GetItem(w, t); - if (!PyArg_GetDoubleArray(pt, 1, 0, ncoords, pnext)) - return NULL; - pnext += ncoords; - } - } - s_byte_stride = sizeof(double) * ncoords; - t_byte_stride = s_byte_stride * s_nctl; - nurbssurface( arg1 , arg2 , arg3 , arg4 , - s_byte_stride , t_byte_stride , arg5 , arg6 , arg7 , arg8 ); - PyMem_DEL(arg2); - PyMem_DEL(arg4); - PyMem_DEL(arg5); - Py_INCREF(Py_None); - return Py_None; -} - -/* nurbscurve(knots, ctlpoints, order, type). - The length of ctlpoints is len(knots)-order. */ - -%nurbscurve - -static PyObject * -gl_nurbscurve(self, args) - PyObject *self; - PyObject *args; -{ - long arg1 ; - double * arg2 ; - long arg3 ; - double * arg4 ; - long arg5 ; - long arg6 ; - int ncoords, npoints; - int i; - PyObject *v; - double *pnext; - if (!PyArg_GetLongArraySize(args, 4, 0, &arg1)) - return NULL; - if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) { - return PyErr_NoMemory(); - } - if (!PyArg_GetDoubleArray(args, 4, 0, arg1 , arg2)) - return NULL; - if (!PyArg_GetLong(args, 4, 2, &arg5)) - return NULL; - if (!PyArg_GetLong(args, 4, 3, &arg6)) - return NULL; - if (arg6 == N_ST) - ncoords = 2; - else if (arg6 == N_STW) - ncoords = 3; - else { - PyErr_BadArgument(); - return NULL; - } - npoints = arg1 - arg5; - if (!PyArg_GetObject(args, 4, 1, &v)) - return NULL; - if (!PyList_Check(v) || PyList_Size(v) != npoints) { - PyErr_BadArgument(); - return NULL; - } - if ((arg4 = PyMem_NEW(double, npoints*ncoords )) == NULL) { - return PyErr_NoMemory(); - } - pnext = arg4; - for (i = 0; i < npoints; i++) { - if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext)) - return NULL; - pnext += ncoords; - } - arg3 = (sizeof(double)) * ncoords; - nurbscurve( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 ); - PyMem_DEL(arg2); - PyMem_DEL(arg4); - Py_INCREF(Py_None); - return Py_None; -} - -/* pwlcurve(points, type). - Points is a list of points. Type must be N_ST. */ - -%pwlcurve - -static PyObject * -gl_pwlcurve(self, args) - PyObject *self; - PyObject *args; -{ - PyObject *v; - long type; - double *data, *pnext; - long npoints, ncoords; - int i; - if (!PyArg_GetObject(args, 2, 0, &v)) - return NULL; - if (!PyArg_GetLong(args, 2, 1, &type)) - return NULL; - if (!PyList_Check(v)) { - PyErr_BadArgument(); - return NULL; - } - npoints = PyList_Size(v); - if (type == N_ST) - ncoords = 2; - else { - PyErr_BadArgument(); - return NULL; - } - if ((data = PyMem_NEW(double, npoints*ncoords)) == NULL) { - return PyErr_NoMemory(); - } - pnext = data; - for (i = 0; i < npoints; i++) { - if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext)) - return NULL; - pnext += ncoords; - } - pwlcurve(npoints, data, sizeof(double)*ncoords, type); - PyMem_DEL(data); - Py_INCREF(Py_None); - return Py_None; -} - - -/* Picking and Selecting */ - -static short *pickbuffer = NULL; -static long pickbuffersize; - -static PyObject * -pick_select(args, func) - PyObject *args; - void (*func)(); -{ - if (!PyArg_GetLong(args, 1, 0, &pickbuffersize)) - return NULL; - if (pickbuffer != NULL) { - PyErr_SetString(PyExc_RuntimeError, - "pick/gselect: already picking/selecting"); - return NULL; - } - if ((pickbuffer = PyMem_NEW(short, pickbuffersize)) == NULL) { - return PyErr_NoMemory(); - } - (*func)(pickbuffer, pickbuffersize); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -endpick_select(args, func) - PyObject *args; - long (*func)(); -{ - PyObject *v, *w; - int i, nhits, n; - if (!PyArg_NoArgs(args)) - return NULL; - if (pickbuffer == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "endpick/endselect: not in pick/select mode"); - return NULL; - } - nhits = (*func)(pickbuffer); - if (nhits < 0) { - nhits = -nhits; /* How to report buffer overflow otherwise? */ - } - /* Scan the buffer to see how many integers */ - n = 0; - for (; nhits > 0; nhits--) { - n += 1 + pickbuffer[n]; - } - v = PyList_New(n); - if (v == NULL) - return NULL; - /* XXX Could do it nicer and interpret the data structure here, - returning a list of lists. But this can be done in Python... */ - for (i = 0; i < n; i++) { - w = PyInt_FromLong((long)pickbuffer[i]); - if (w == NULL) { - Py_DECREF(v); - return NULL; - } - PyList_SetItem(v, i, w); - } - PyMem_DEL(pickbuffer); - pickbuffer = NULL; - return v; -} - -extern void pick(), gselect(); -extern long endpick(), endselect(); - -%pick -static PyObject *gl_pick(self, args) PyObject *self, *args; { - return pick_select(args, pick); -} - -%endpick -static PyObject *gl_endpick(self, args) PyObject *self, *args; { - return endpick_select(args, endpick); -} - -%gselect -static PyObject *gl_gselect(self, args) PyObject *self, *args; { - return pick_select(args, gselect); -} - -%endselect -static PyObject *gl_endselect(self, args) PyObject *self, *args; { - return endpick_select(args, endselect); -} - - -/* XXX The generator botches this one. Here's a quick hack to fix it. */ - -/* XXX The generator botches this one. Here's a quick hack to fix it. */ - -% getmatrix float r[16] - -static PyObject * -gl_getmatrix(self, args) - PyObject *self; - PyObject *args; -{ - Matrix arg1; - PyObject *v, *w; - int i, j; - getmatrix( arg1 ); - v = PyList_New(16); - if (v == NULL) { - return PyErr_NoMemory(); - } - for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) { - w = mknewfloatobject(arg1[i][j]); - if (w == NULL) { - Py_DECREF(v); - return NULL; - } - PyList_SetItem(v, i*4+j, w); - } - return v; -} - -/* Here's an alternate version that returns a 4x4 matrix instead of - a vector. Unfortunately it is incompatible with loadmatrix and - multmatrix... */ - -% altgetmatrix float r[4][4] - -static PyObject * -gl_altgetmatrix(self, args) - PyObject *self; - PyObject *args; -{ - Matrix arg1; - PyObject *v, *w; - int i, j; - getmatrix( arg1 ); - v = PyList_New(4); - if (v == NULL) { - return NULL; - } - for (i = 0; i < 4; i++) { - w = PyList_New(4); - if (w == NULL) { - Py_DECREF(v); - return NULL; - } - PyList_SetItem(v, i, w); - } - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - w = mknewfloatobject(arg1[i][j]); - if (w == NULL) { - Py_DECREF(v); - return NULL; - } - PyList_SetItem(PyList_GetItem(v, i), j, w); - } - } - return v; -} - -% lrectwrite - -static PyObject * -gl_lrectwrite(self, args) - PyObject *self; - PyObject *args; -{ - short x1 ; - short y1 ; - short x2 ; - short y2 ; - string parray ; - PyObject *s; -#if 0 - int pixcount; -#endif - if (!PyArg_GetShort(args, 5, 0, &x1)) - return NULL; - if (!PyArg_GetShort(args, 5, 1, &y1)) - return NULL; - if (!PyArg_GetShort(args, 5, 2, &x2)) - return NULL; - if (!PyArg_GetShort(args, 5, 3, &y2)) - return NULL; - if (!PyArg_GetString(args, 5, 4, &parray)) - return NULL; - if (!PyArg_GetObject(args, 5, 4, &s)) - return NULL; -#if 0 -/* Don't check this, it breaks experiments with pixmode(PM_SIZE, ...) */ - pixcount = (long)(x2+1-x1) * (long)(y2+1-y1); - if (!PyString_Check(s) || PyString_Size(s) != pixcount*sizeof(long)) { - PyErr_SetString(PyExc_RuntimeError, - "string arg to lrectwrite has wrong size"); - return NULL; - } -#endif - lrectwrite( x1 , y1 , x2 , y2 , (unsigned long *) parray ); - Py_INCREF(Py_None); - return Py_None; -} - -% lrectread - -static PyObject * -gl_lrectread(self, args) - PyObject *self; - PyObject *args; -{ - short x1 ; - short y1 ; - short x2 ; - short y2 ; - PyObject *parray; - int pixcount; - if (!PyArg_GetShort(args, 4, 0, &x1)) - return NULL; - if (!PyArg_GetShort(args, 4, 1, &y1)) - return NULL; - if (!PyArg_GetShort(args, 4, 2, &x2)) - return NULL; - if (!PyArg_GetShort(args, 4, 3, &y2)) - return NULL; - pixcount = (long)(x2+1-x1) * (long)(y2+1-y1); - parray = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long)); - if (parray == NULL) - return NULL; /* No memory */ - lrectread(x1, y1, x2, y2, (unsigned long *) PyString_AsString(parray)); - return parray; -} - -% readdisplay - -static PyObject * -gl_readdisplay(self, args) - PyObject *self; - PyObject *args; -{ - short x1, y1, x2, y2; - unsigned long *parray, hints; - long size, size_ret; - PyObject *rv; - - if ( !PyArg_Parse(args, "hhhhl", &x1, &y1, &x2, &y2, &hints) ) - return 0; - size = (long)(x2+1-x1) * (long)(y2+1-y1); - rv = PyString_FromStringAndSize((char *)NULL, size*sizeof(long)); - if ( rv == NULL ) - return NULL; - parray = (unsigned long *)PyString_AsString(rv); - size_ret = readdisplay(x1, y1, x2, y2, parray, hints); - if ( size_ret != size ) { - printf("gl_readdisplay: got %ld pixels, expected %ld\n", - size_ret, size); - PyErr_SetString(PyExc_RuntimeError, "readdisplay returned unexpected length"); - return NULL; - } - return rv; -} - -/* Desperately needed, here are tools to compress and decompress - the data manipulated by lrectread/lrectwrite. - - gl.packrect(width, height, packfactor, bigdata) --> smalldata - makes 'bigdata' 4*(packfactor**2) times smaller by: - - turning it into B/W (a factor 4) - - replacing squares of size pacfactor by one - representative - - gl.unpackrect(width, height, packfactor, smalldata) --> bigdata - is the inverse; the numeric arguments must be *the same*. - - Both work best if width and height are multiples of packfactor - (in fact unpackrect will leave garbage bytes). -*/ - -% packrect - -static PyObject * -gl_packrect(self, args) - PyObject *self; - PyObject *args; -{ - long width, height, packfactor; - char *s; - PyObject *unpacked, *packed; - int pixcount, packedcount, x, y, r, g, b; - unsigned long pixel; - unsigned char *p; - unsigned long *parray; - if (!PyArg_GetLong(args, 4, 0, &width)) - return NULL; - if (!PyArg_GetLong(args, 4, 1, &height)) - return NULL; - if (!PyArg_GetLong(args, 4, 2, &packfactor)) - return NULL; - if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */ - return NULL; - if (!PyArg_GetObject(args, 4, 3, &unpacked)) - return NULL; - if (width <= 0 || height <= 0 || packfactor <= 0) { - PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0"); - return NULL; - } - pixcount = width*height; - packedcount = ((width+packfactor-1)/packfactor) * - ((height+packfactor-1)/packfactor); - if (PyString_Size(unpacked) != pixcount*sizeof(long)) { - PyErr_SetString(PyExc_RuntimeError, - "string arg to packrect has wrong size"); - return NULL; - } - packed = PyString_FromStringAndSize((char *)NULL, packedcount); - if (packed == NULL) - return NULL; - parray = (unsigned long *) PyString_AsString(unpacked); - p = (unsigned char *) PyString_AsString(packed); - for (y = 0; y < height; y += packfactor, parray += packfactor*width) { - for (x = 0; x < width; x += packfactor) { - pixel = parray[x]; - r = pixel & 0xff; - g = (pixel >> 8) & 0xff; - b = (pixel >> 16) & 0xff; - *p++ = (30*r+59*g+11*b) / 100; - } - } - return packed; -} - -% unpackrect - -static unsigned long unpacktab[256]; -static int unpacktab_inited = 0; - -static PyObject * -gl_unpackrect(self, args) - PyObject *self; - PyObject *args; -{ - long width, height, packfactor; - char *s; - PyObject *unpacked, *packed; - int pixcount, packedcount; - register unsigned char *p; - register unsigned long *parray; - if (!unpacktab_inited) { - register int white; - for (white = 256; --white >= 0; ) - unpacktab[white] = white * 0x010101L; - unpacktab_inited++; - } - if (!PyArg_GetLong(args, 4, 0, &width)) - return NULL; - if (!PyArg_GetLong(args, 4, 1, &height)) - return NULL; - if (!PyArg_GetLong(args, 4, 2, &packfactor)) - return NULL; - if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */ - return NULL; - if (!PyArg_GetObject(args, 4, 3, &packed)) - return NULL; - if (width <= 0 || height <= 0 || packfactor <= 0) { - PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0"); - return NULL; - } - pixcount = width*height; - packedcount = ((width+packfactor-1)/packfactor) * - ((height+packfactor-1)/packfactor); - if (PyString_Size(packed) != packedcount) { - PyErr_SetString(PyExc_RuntimeError, - "string arg to unpackrect has wrong size"); - return NULL; - } - unpacked = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long)); - if (unpacked == NULL) - return NULL; - parray = (unsigned long *) PyString_AsString(unpacked); - p = (unsigned char *) PyString_AsString(packed); - if (packfactor == 1 && width*height > 0) { - /* Just expand bytes to longs */ - register int x = width * height; - do { - *parray++ = unpacktab[*p++]; - } while (--x >= 0); - } - else { - register int y; - for (y = 0; y < height-packfactor+1; - y += packfactor, parray += packfactor*width) { - register int x; - for (x = 0; x < width-packfactor+1; x += packfactor) { - register unsigned long pixel = unpacktab[*p++]; - register int i; - for (i = packfactor*width; (i-=width) >= 0;) { - register int j; - for (j = packfactor; --j >= 0; ) - parray[i+x+j] = pixel; - } - } - } - } - return unpacked; -} - -% gversion -static PyObject * -gl_gversion(self, args) - PyObject *self; - PyObject *args; -{ - char buf[20]; - gversion(buf); - return PyString_FromString(buf); -} - - -/* void clear - Manual because of clash with termcap */ -%clear -static PyObject * -gl_clear(self, args) - PyObject *self; - PyObject *args; -{ - __GLclear( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* End of manually written stubs */ - -%% - -long getshade -if !solaris void devport short s long s -void rdr2i long s long s -void rectfs short s short s short s short s -void rects short s short s short s short s -void rmv2i long s long s -void noport -void popviewport -void clearhitcode -void closeobj -void cursoff -void curson -void doublebuffer -void finish -void gconfig -void ginit -void greset -void multimap -void onemap -void popattributes -void popmatrix -void pushattributes -void pushmatrix -void pushviewport -void qreset -void RGBmode -void singlebuffer -void swapbuffers -void gsync -void gflush -void tpon -void tpoff -void clkon -void clkoff -void ringbell -#void callfunc -void gbegin -void textinit -void initnames -void pclos -void popname -if !solaris void spclos -void zclear -void screenspace -void reshapeviewport -void winpush -void winpop -void foreground -void endfullscrn -if !solaris void endpupmode -void fullscrn -if !solaris void pupmode -void winconstraints -void pagecolor short s -void textcolor short s -void color short s -void curveit short s -void font short s -void linewidth short s -void setlinestyle short s -void setmap short s -void swapinterval short s -void writemask short s -if !solaris void textwritemask short s -void qdevice short s -void unqdevice short s -void curvebasis short s -void curveprecision short s -void loadname short s -void passthrough short s -void pushname short s -void setmonitor short s -if !solaris void setshade short s -void setpattern short s -if !solaris void pagewritemask short s -# -void callobj long s -void delobj long s -void editobj long s -void makeobj long s -void maketag long s -void chunksize long s -void compactify long s -void deltag long s -void lsrepeat long s -void objinsert long s -void objreplace long s -void winclose long s -void blanktime long s -void freepup long s -# This is not in the library!? -###void pupcolor long s -# -void backbuffer long s -void frontbuffer long s -if !solaris void lsbackup long s -void resetls long s -void lampon long s -void lampoff long s -void setbell long s -void blankscreen long s -void depthcue long s -void zbuffer long s -void backface long s -# -void cmov2i long s long s -void draw2i long s long s -void move2i long s long s -void pnt2i long s long s -void patchbasis long s long s -void patchprecision long s long s -void pdr2i long s long s -void pmv2i long s long s -void rpdr2i long s long s -void rpmv2i long s long s -void xfpt2i long s long s -void objdelete long s long s -void patchcurves long s long s -void minsize long s long s -void maxsize long s long s -void keepaspect long s long s -void prefsize long s long s -void stepunit long s long s -void fudge long s long s -void winmove long s long s -# -void attachcursor short s short s -void deflinestyle short s short s -void noise short s short s -void picksize short s short s -void qenter short s short s -void setdepth short s short s -void cmov2s short s short s -void draw2s short s short s -void move2s short s short s -void pdr2s short s short s -void pmv2s short s short s -void pnt2s short s short s -void rdr2s short s short s -void rmv2s short s short s -void rpdr2s short s short s -void rpmv2s short s short s -void xfpt2s short s short s -# -void cmov2 float s float s -void draw2 float s float s -void move2 float s float s -void pnt2 float s float s -void pdr2 float s float s -void pmv2 float s float s -void rdr2 float s float s -void rmv2 float s float s -void rpdr2 float s float s -void rpmv2 float s float s -void xfpt2 float s float s -# -void loadmatrix float s[4*4] -# Really [4][4] -void multmatrix float s[4*4] -# Really [4][4] -void crv float s[3*4] -# Really [4][3] -void rcrv float s[4*4] -# Really [4][4] -# -# Methods that have strings. -# -void addtopup long s char *s long s -void charstr char *s -void getport char *s -long strwidth char *s -long winopen char *s -void wintitle char *s -# -# Methods that have 1 long (# of elements) and an array -# -void polf long s float s[3*arg1] -void polf2 long s float s[2*arg1] -void poly long s float s[3*arg1] -void poly2 long s float s[2*arg1] -void crvn long s float s[3*arg1] -void rcrvn long s float s[4*arg1] -# -void polf2i long s long s[2*arg1] -void polfi long s long s[3*arg1] -void poly2i long s long s[2*arg1] -void polyi long s long s[3*arg1] -# -void polf2s long s short s[2*arg1] -void polfs long s short s[3*arg1] -void polys long s short s[3*arg1] -void poly2s long s short s[2*arg1] -# -void defcursor short s u_short s[128] -# Is this useful? -void writepixels short s u_short s[arg1] -# Should be unsigned short... -void defbasis long s float s[4*4] -if !solaris void gewrite short s short s[arg1] -# -void rotate short s char s -# This is not in the library!? -###void setbutton short s char s -void rot float s char s -# -void circfi long s long s long s -void circi long s long s long s -void cmovi long s long s long s -void drawi long s long s long s -void movei long s long s long s -void pnti long s long s long s -void newtag long s long s long s -void pdri long s long s long s -void pmvi long s long s long s -void rdri long s long s long s -void rmvi long s long s long s -void rpdri long s long s long s -void rpmvi long s long s long s -void xfpti long s long s long s -# -void circ float s float s float s -void circf float s float s float s -void cmov float s float s float s -void draw float s float s float s -void move float s float s float s -void pnt float s float s float s -void scale float s float s float s -void translate float s float s float s -void pdr float s float s float s -void pmv float s float s float s -void rdr float s float s float s -void rmv float s float s float s -void rpdr float s float s float s -void rpmv float s float s float s -void xfpt float s float s float s -# -void RGBcolor short s short s short s -void RGBwritemask short s short s short s -void setcursor short s short s short s -void tie short s short s short s -void circfs short s short s short s -void circs short s short s short s -void cmovs short s short s short s -void draws short s short s short s -void moves short s short s short s -void pdrs short s short s short s -void pmvs short s short s short s -void pnts short s short s short s -void rdrs short s short s short s -void rmvs short s short s short s -void rpdrs short s short s short s -void rpmvs short s short s short s -void xfpts short s short s short s -void curorigin short s short s short s -void cyclemap short s short s short s -# -void patch float s[4*4] float s[4*4] float s[4*4] -void splf long s float s[3*arg1] u_short s[arg1] -void splf2 long s float s[2*arg1] u_short s[arg1] -void splfi long s long s[3*arg1] u_short s[arg1] -void splf2i long s long s[2*arg1] u_short s[arg1] -void splfs long s short s[3*arg1] u_short s[arg1] -void splf2s long s short s[2*arg1] u_short s[arg1] -###void defpattern short s short s u_short s[arg2*arg2/16] -# -void rpatch float s[4*4] float s[4*4] float s[4*4] float s[4*4] -# -# routines that send 4 floats -# -void ortho2 float s float s float s float s -void rect float s float s float s float s -void rectf float s float s float s float s -void xfpt4 float s float s float s float s -# -void textport short s short s short s short s -void mapcolor short s short s short s short s -void scrmask short s short s short s short s -void setvaluator short s short s short s short s -void viewport short s short s short s short s -void shaderange short s short s short s short s -void xfpt4s short s short s short s short s -void rectfi long s long s long s long s -void recti long s long s long s long s -void xfpt4i long s long s long s long s -void prefposition long s long s long s long s -# -void arc float s float s float s short s short s -void arcf float s float s float s short s short s -void arcfi long s long s long s short s short s -void arci long s long s long s short s short s -# -void bbox2 short s short s float s float s float s float s -void bbox2i short s short s long s long s long s long s -void bbox2s short s short s short s short s short s short s -void blink short s short s short s short s short s -void ortho float s float s float s float s float s float s -void window float s float s float s float s float s float s -void lookat float s float s float s float s float s float s short s -# -void perspective short s float s float s float s -void polarview float s short s short s short s -# XXX getichararray not supported -#void writeRGB short s char s[arg1] char s[arg1] char s[arg1] -# -void arcfs short s short s short s short s short s -void arcs short s short s short s short s short s -void rectcopy short s short s short s short s short s short s -if !solaris void RGBcursor short s short s short s short s short s short s short s -# -long getbutton short s -long getcmmode -long getlsbackup -long getresetls -long getdcm -long getzbuffer -long ismex -long isobj long s -long isqueued short s -long istag long s -# -long genobj -long gentag -long getbuffer -long getcolor -long getdisplaymode -long getfont -long getheight -long gethitcode -long getlstyle -long getlwidth -long getmap -long getplanes -long getwritemask -long qtest -long getlsrepeat -long getmonitor -long getopenobj -long getpattern -long winget -long winattach -long getothermonitor -long newpup -# -long getvaluator short s -void winset long s -long dopup long s -void getdepth short r short r -void getcpos short r short r -void getsize long r long r -void getorigin long r long r -void getviewport short r short r short r short r -if !solaris void gettp short r short r short r short r -void getgpos float r float r float r float r -void winposition long s long s long s long s -void gRGBcolor short r short r short r -void gRGBmask short r short r short r -void getscrmask short r short r short r short r -###void gRGBcursor short r short r short r short r short r short r short r short r -void getmcolor short s short r short r short r -void mapw long s short s short s float r float r float r float r float r float r -void mapw2 long s short s short s float r float r -###void defrasterfont short s short s short s Fontchar s[arg3] short s short s[4*arg5] -###long qread short r -void getcursor short r u_short r u_short r long r -# -# For these we receive arrays of stuff -# -###void getdev long s short s[arg1] short r[arg1] -#XXX not generated correctly yet -#void getmatrix float r[16] -###long readpixels short s short r[retval] -###long readRGB short s char r[retval] char r[retval] char r[retval] -###long blkqread short s short r[arg1] -# -# New 4D routines -# -void cmode -void concave long s -void curstype long s -void drawmode long s -void gammaramp short s[256] short s[256] short s[256] -long getbackface -long getdescender -long getdrawmode -long getmmode -long getsm -long getvideo long s -void imakebackground -void lmbind short s short s -void lmdef long s long s long s float s[arg3] -void mmode long s -void normal float s[3] -void overlay long s -void RGBrange short s short s short s short s short s short s short s short s -if !solaris void setvideo long s long s -void shademodel long s -void underlay long s -# -# New Personal Iris/GT Routines -# -void bgnclosedline -void bgnline -void bgnpoint -void bgnpolygon -void bgnsurface -void bgntmesh -void bgntrim -void endclosedline -void endline -void endpoint -void endpolygon -void endsurface -void endtmesh -void endtrim -void blendfunction long s long s -void c3f float s[3] -void c3i long s[3] -void c3s short s[3] -void c4f float s[4] -void c4i long s[4] -void c4s short s[4] -void colorf float s -void cpack long s -void czclear long s long s -void dglclose long s -long dglopen char *s long s -long getgdesc long s -void getnurbsproperty long s float r -void glcompat long s long s -void iconsize long s long s -void icontitle char *s -void lRGBrange short s short s short s short s short s short s long s long s -void linesmooth long s -void lmcolor long s -void logicop long s -###long lrectread short s short s short s short s long r[retval] -###void lrectwrite short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)] -### Now manual, with string last arg -###long rectread short s short s short s short s short r[retval] -###void rectwrite short s short s short s short s short s[(arg2-arg1+1)*(arg4-arg3+1)] -void lsetdepth long s long s -void lshaderange short s short s long s long s -void n3f float s[3] -void noborder -void pntsmooth long s -void readsource long s -void rectzoom float s float s -void sbox float s float s float s float s -void sboxi long s long s long s long s -void sboxs short s short s short s short s -void sboxf float s float s float s float s -void sboxfi long s long s long s long s -void sboxfs short s short s short s short s -void setnurbsproperty long s float s -void setpup long s long s long s -void smoothline long s -void subpixel long s -void swaptmesh -long swinopen long s -void v2f float s[2] -void v2i long s[2] -void v2s short s[2] -void v3f float s[3] -void v3i long s[3] -void v3s short s[3] -void v4f float s[4] -void v4i long s[4] -void v4s short s[4] -void videocmd long s -long windepth long s -void wmpack long s -void zdraw long s -void zfunction long s -void zsource long s -void zwritemask long s -# -# uses doubles -# -void v2d double s[2] -void v3d double s[3] -void v4d double s[4] -# -# Why isn't this here? -# -void pixmode long s long s -# -# New in IRIX 4.0 -# -long qgetfd -void dither long s diff --git a/Modules/dlmodule.c b/Modules/dlmodule.c deleted file mode 100644 index c349ad076a3..00000000000 --- a/Modules/dlmodule.c +++ /dev/null @@ -1,284 +0,0 @@ - -/* dl module */ - -#include "Python.h" - -#include <dlfcn.h> - -#ifdef __VMS -#include <unistd.h> -#endif - -#ifndef RTLD_LAZY -#define RTLD_LAZY 1 -#endif - -typedef void *PyUnivPtr; -typedef struct { - PyObject_HEAD - PyUnivPtr *dl_handle; -} dlobject; - -static PyTypeObject Dltype; - -static PyObject *Dlerror; - -static PyObject * -newdlobject(PyUnivPtr *handle) -{ - dlobject *xp; - xp = PyObject_New(dlobject, &Dltype); - if (xp == NULL) - return NULL; - xp->dl_handle = handle; - return (PyObject *)xp; -} - -static void -dl_dealloc(dlobject *xp) -{ - if (xp->dl_handle != NULL) - dlclose(xp->dl_handle); - PyObject_Del(xp); -} - -static PyObject * -dl_close(dlobject *xp) -{ - if (xp->dl_handle != NULL) { - dlclose(xp->dl_handle); - xp->dl_handle = NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -dl_sym(dlobject *xp, PyObject *args) -{ - char *name; - PyUnivPtr *func; - if (PyString_Check(args)) { - name = PyString_AS_STRING(args); - } else { - PyErr_Format(PyExc_TypeError, "expected string, found %.200s", - Py_TYPE(args)->tp_name); - return NULL; - } - func = dlsym(xp->dl_handle, name); - if (func == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return PyInt_FromLong((long)func); -} - -static PyObject * -dl_call(dlobject *xp, PyObject *args) -{ - PyObject *name; - long (*func)(long, long, long, long, long, - long, long, long, long, long); - long alist[10]; - long res; - Py_ssize_t i; - Py_ssize_t n = PyTuple_Size(args); - if (n < 1) { - PyErr_SetString(PyExc_TypeError, "at least a name is needed"); - return NULL; - } - name = PyTuple_GetItem(args, 0); - if (!PyString_Check(name)) { - PyErr_SetString(PyExc_TypeError, - "function name must be a string"); - return NULL; - } - func = (long (*)(long, long, long, long, long, - long, long, long, long, long)) - dlsym(xp->dl_handle, PyString_AsString(name)); - if (func == NULL) { - PyErr_SetString(PyExc_ValueError, dlerror()); - return NULL; - } - if (n-1 > 10) { - PyErr_SetString(PyExc_TypeError, - "too many arguments (max 10)"); - return NULL; - } - for (i = 1; i < n; i++) { - PyObject *v = PyTuple_GetItem(args, i); - if (PyInt_Check(v)) - alist[i-1] = PyInt_AsLong(v); - else if (PyString_Check(v)) - alist[i-1] = (long)PyString_AsString(v); - else if (v == Py_None) - alist[i-1] = (long) ((char *)NULL); - else { - PyErr_SetString(PyExc_TypeError, - "arguments must be int, string or None"); - return NULL; - } - } - for (; i <= 10; i++) - alist[i-1] = 0; - res = (*func)(alist[0], alist[1], alist[2], alist[3], alist[4], - alist[5], alist[6], alist[7], alist[8], alist[9]); - return PyInt_FromLong(res); -} - -static PyMethodDef dlobject_methods[] = { - {"call", (PyCFunction)dl_call, METH_VARARGS}, - {"sym", (PyCFunction)dl_sym, METH_O}, - {"close", (PyCFunction)dl_close, METH_NOARGS}, - {NULL, NULL} /* Sentinel */ -}; - -static PyObject * -dl_getattr(dlobject *xp, char *name) -{ - return Py_FindMethod(dlobject_methods, (PyObject *)xp, name); -} - - -static PyTypeObject Dltype = { - PyVarObject_HEAD_INIT(NULL, 0) - "dl.dl", /*tp_name*/ - sizeof(dlobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)dl_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)dl_getattr,/*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ -}; - -static PyObject * -dl_open(PyObject *self, PyObject *args) -{ - char *name; - int mode; - PyUnivPtr *handle; - if (sizeof(int) != sizeof(long) || - sizeof(long) != sizeof(char *)) { - PyErr_SetString(PyExc_SystemError, - "module dl requires sizeof(int) == sizeof(long) == sizeof(char*)"); - return NULL; - } - - if (PyArg_ParseTuple(args, "z:open", &name)) - mode = RTLD_LAZY; - else { - PyErr_Clear(); - if (!PyArg_ParseTuple(args, "zi:open", &name, &mode)) - return NULL; -#ifndef RTLD_NOW - if (mode != RTLD_LAZY) { - PyErr_SetString(PyExc_ValueError, "mode must be 1"); - return NULL; - } -#endif - } - handle = dlopen(name, mode); - if (handle == NULL) { - char *errmsg = dlerror(); - if (!errmsg) - errmsg = "dlopen() error"; - PyErr_SetString(Dlerror, errmsg); - return NULL; - } -#ifdef __VMS - /* Under OpenVMS dlopen doesn't do any check, just save the name - * for later use, so we have to check if the file is readable, - * the name can be a logical or a file from SYS$SHARE. - */ - if (access(name, R_OK)) { - char fname[strlen(name) + 20]; - strcpy(fname, "SYS$SHARE:"); - strcat(fname, name); - strcat(fname, ".EXE"); - if (access(fname, R_OK)) { - dlclose(handle); - PyErr_SetString(Dlerror, - "File not found or protection violation"); - return NULL; - } - } -#endif - return newdlobject(handle); -} - -static PyMethodDef dl_methods[] = { - {"open", dl_open, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - -/* From socketmodule.c - * Convenience routine to export an integer value. - * - * Errors are silently ignored, for better or for worse... - */ -static void -insint(PyObject *d, char *name, int value) -{ - PyObject *v = PyInt_FromLong((long) value); - if (!v || PyDict_SetItemString(d, name, v)) - PyErr_Clear(); - - Py_XDECREF(v); -} - -PyMODINIT_FUNC -initdl(void) -{ - PyObject *m, *d, *x; - - if (PyErr_WarnPy3k("the dl module has been removed in " - "Python 3.0; use the ctypes module instead", 2) < 0) - return; - - /* Initialize object type */ - Py_TYPE(&Dltype) = &PyType_Type; - - /* Create the module and add the functions */ - m = Py_InitModule("dl", dl_methods); - if (m == NULL) - return; - - /* Add some symbolic constants to the module */ - d = PyModule_GetDict(m); - Dlerror = x = PyErr_NewException("dl.error", NULL, NULL); - PyDict_SetItemString(d, "error", x); - x = PyInt_FromLong((long)RTLD_LAZY); - PyDict_SetItemString(d, "RTLD_LAZY", x); -#define INSINT(X) insint(d,#X,X) -#ifdef RTLD_NOW - INSINT(RTLD_NOW); -#endif -#ifdef RTLD_NOLOAD - INSINT(RTLD_NOLOAD); -#endif -#ifdef RTLD_GLOBAL - INSINT(RTLD_GLOBAL); -#endif -#ifdef RTLD_LOCAL - INSINT(RTLD_LOCAL); -#endif -#ifdef RTLD_PARENT - INSINT(RTLD_PARENT); -#endif -#ifdef RTLD_GROUP - INSINT(RTLD_GROUP); -#endif -#ifdef RTLD_WORLD - INSINT(RTLD_WORLD); -#endif -#ifdef RTLD_NODELETE - INSINT(RTLD_NODELETE); -#endif -} diff --git a/Modules/errnomodule.c b/Modules/errnomodule.c index 87ebab013a0..86720af49d5 100644 --- a/Modules/errnomodule.c +++ b/Modules/errnomodule.c @@ -5,6 +5,7 @@ /* Windows socket errors (WSA*) */ #ifdef MS_WINDOWS +#define WIN32_LEAN_AND_MEAN #include <windows.h> #endif @@ -19,10 +20,10 @@ static PyMethodDef errno_methods[] = { /* Helper function doing the dictionary inserting */ static void -_inscode(PyObject *d, PyObject *de, char *name, int code) +_inscode(PyObject *d, PyObject *de, const char *name, int code) { - PyObject *u = PyString_FromString(name); - PyObject *v = PyInt_FromLong((long) code); + PyObject *u = PyUnicode_FromString(name); + PyObject *v = PyLong_FromLong((long) code); /* Don't bother checking for errors; they'll be caught at the end * of the module initialization function by the caller of @@ -52,24 +53,37 @@ Symbols that are not relevant to the underlying system are not defined.\n\ To map error codes to error messages, use the function os.strerror(),\n\ e.g. os.strerror(2) could return 'No such file or directory'."); +static struct PyModuleDef errnomodule = { + PyModuleDef_HEAD_INIT, + "errno", + errno__doc__, + -1, + errno_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initerrno(void) +PyInit_errno(void) { PyObject *m, *d, *de; - m = Py_InitModule3("errno", errno_methods, errno__doc__); + m = PyModule_Create(&errnomodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); de = PyDict_New(); if (!d || !de || PyDict_SetItemString(d, "errorcode", de) < 0) - return; + return NULL; /* Macro so I don't have to edit each and every line below... */ #define inscode(d, ds, de, name, code, comment) _inscode(d, de, name, code) /* * The names and comments are borrowed from linux/include/errno.h, - * which should be pretty all-inclusive + * which should be pretty all-inclusive. However, the Solaris specific + * names and comments are borrowed from sys/errno.h in Solaris. */ #ifdef ENODEV @@ -783,9 +797,57 @@ initerrno(void) #ifdef WSAN inscode(d, ds, de, "WSAN", WSAN, "Error WSAN"); #endif +#ifdef ENOMEDIUM + inscode(d, ds, de, "ENOMEDIUM", ENOMEDIUM, "No medium found"); +#endif +#ifdef EMEDIUMTYPE + inscode(d, ds, de, "EMEDIUMTYPE", EMEDIUMTYPE, "Wrong medium type"); +#endif +#ifdef ECANCELED + inscode(d, ds, de, "ECANCELED", ECANCELED, "Operation Canceled"); +#endif +#ifdef ENOKEY + inscode(d, ds, de, "ENOKEY", ENOKEY, "Required key not available"); +#endif +#ifdef EKEYEXPIRED + inscode(d, ds, de, "EKEYEXPIRED", EKEYEXPIRED, "Key has expired"); +#endif +#ifdef EKEYREVOKED + inscode(d, ds, de, "EKEYREVOKED", EKEYREVOKED, "Key has been revoked"); +#endif +#ifdef EKEYREJECTED + inscode(d, ds, de, "EKEYREJECTED", EKEYREJECTED, "Key was rejected by service"); +#endif +#ifdef EOWNERDEAD + inscode(d, ds, de, "EOWNERDEAD", EOWNERDEAD, "Owner died"); +#endif +#ifdef ENOTRECOVERABLE + inscode(d, ds, de, "ENOTRECOVERABLE", ENOTRECOVERABLE, "State not recoverable"); +#endif +#ifdef ERFKILL + inscode(d, ds, de, "ERFKILL", ERFKILL, "Operation not possible due to RF-kill"); +#endif + + /* Solaris-specific errnos */ +#ifdef ECANCELED + inscode(d, ds, de, "ECANCELED", ECANCELED, "Operation canceled"); +#endif #ifdef ENOTSUP inscode(d, ds, de, "ENOTSUP", ENOTSUP, "Operation not supported"); #endif +#ifdef EOWNERDEAD + inscode(d, ds, de, "EOWNERDEAD", EOWNERDEAD, "Process died with the lock"); +#endif +#ifdef ENOTRECOVERABLE + inscode(d, ds, de, "ENOTRECOVERABLE", ENOTRECOVERABLE, "Lock is not recoverable"); +#endif +#ifdef ELOCKUNMAPPED + inscode(d, ds, de, "ELOCKUNMAPPED", ELOCKUNMAPPED, "Locked lock was unmapped"); +#endif +#ifdef ENOTACTIVE + inscode(d, ds, de, "ENOTACTIVE", ENOTACTIVE, "Facility is not active"); +#endif Py_DECREF(de); + return m; } diff --git a/Modules/expat/expat_external.h b/Modules/expat/expat_external.h index f05401419f3..3f1c3637a50 100644 --- a/Modules/expat/expat_external.h +++ b/Modules/expat/expat_external.h @@ -11,7 +11,7 @@ co-exist. */ #include "pyexpatns.h" -#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) +#if defined(_MSC_EXTENSIONS) && !defined(__CYGWIN__) #define XML_USE_MSC_EXTENSIONS 1 #endif diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index 997867a136e..bfc59855dd9 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -55,7 +55,7 @@ fcntl_fcntl(PyObject *self, PyObject *args) PyErr_SetFromErrno(PyExc_IOError); return NULL; } - return PyString_FromStringAndSize(buf, len); + return PyBytes_FromStringAndSize(buf, len); } PyErr_Clear(); @@ -73,7 +73,7 @@ fcntl_fcntl(PyObject *self, PyObject *args) PyErr_SetFromErrno(PyExc_IOError); return NULL; } - return PyInt_FromLong((long)ret); + return PyLong_FromLong((long)ret); } PyDoc_STRVAR(fcntl_doc, @@ -113,15 +113,18 @@ fcntl_ioctl(PyObject *self, PyObject *args) unsigned int code; int arg; int ret; + Py_buffer pstr; char *str; Py_ssize_t len; int mutate_arg = 1; char buf[IOCTL_BUFSZ+1]; /* argument plus NUL byte */ - if (PyArg_ParseTuple(args, "O&Iw#|i:ioctl", + if (PyArg_ParseTuple(args, "O&Iw*|i:ioctl", conv_descriptor, &fd, &code, - &str, &len, &mutate_arg)) { + &pstr, &mutate_arg)) { char *arg; + str = pstr.buf; + len = pstr.len; if (mutate_arg) { if (len <= IOCTL_BUFSZ) { @@ -135,6 +138,7 @@ fcntl_ioctl(PyObject *self, PyObject *args) } else { if (len > IOCTL_BUFSZ) { + PyBuffer_Release(&pstr); PyErr_SetString(PyExc_ValueError, "ioctl string arg too long"); return NULL; @@ -156,22 +160,26 @@ fcntl_ioctl(PyObject *self, PyObject *args) if (mutate_arg && (len <= IOCTL_BUFSZ)) { memcpy(str, buf, len); } + PyBuffer_Release(&pstr); /* No further access to str below this point */ if (ret < 0) { PyErr_SetFromErrno(PyExc_IOError); return NULL; } if (mutate_arg) { - return PyInt_FromLong(ret); + return PyLong_FromLong(ret); } else { - return PyString_FromStringAndSize(buf, len); + return PyBytes_FromStringAndSize(buf, len); } } PyErr_Clear(); - if (PyArg_ParseTuple(args, "O&Is#:ioctl", - conv_descriptor, &fd, &code, &str, &len)) { + if (PyArg_ParseTuple(args, "O&Is*:ioctl", + conv_descriptor, &fd, &code, &pstr)) { + str = pstr.buf; + len = pstr.len; if (len > IOCTL_BUFSZ) { + PyBuffer_Release(&pstr); PyErr_SetString(PyExc_ValueError, "ioctl string arg too long"); return NULL; @@ -182,10 +190,12 @@ fcntl_ioctl(PyObject *self, PyObject *args) ret = ioctl(fd, code, buf); Py_END_ALLOW_THREADS if (ret < 0) { + PyBuffer_Release(&pstr); PyErr_SetFromErrno(PyExc_IOError); return NULL; } - return PyString_FromStringAndSize(buf, len); + PyBuffer_Release(&pstr); + return PyBytes_FromStringAndSize(buf, len); } PyErr_Clear(); @@ -207,7 +217,7 @@ fcntl_ioctl(PyObject *self, PyObject *args) PyErr_SetFromErrno(PyExc_IOError); return NULL; } - return PyInt_FromLong((long)ret); + return PyLong_FromLong((long)ret); #undef IOCTL_BUFSZ } @@ -342,22 +352,22 @@ fcntl_lockf(PyObject *self, PyObject *args) l.l_start = l.l_len = 0; if (startobj != NULL) { #if !defined(HAVE_LARGEFILE_SUPPORT) - l.l_start = PyInt_AsLong(startobj); + l.l_start = PyLong_AsLong(startobj); #else l.l_start = PyLong_Check(startobj) ? PyLong_AsLongLong(startobj) : - PyInt_AsLong(startobj); + PyLong_AsLong(startobj); #endif if (PyErr_Occurred()) return NULL; } if (lenobj != NULL) { #if !defined(HAVE_LARGEFILE_SUPPORT) - l.l_len = PyInt_AsLong(lenobj); + l.l_len = PyLong_AsLong(lenobj); #else l.l_len = PyLong_Check(lenobj) ? PyLong_AsLongLong(lenobj) : - PyInt_AsLong(lenobj); + PyLong_AsLong(lenobj); #endif if (PyErr_Occurred()) return NULL; @@ -423,7 +433,7 @@ a file or socket object."); static int ins(PyObject* d, char* symbol, long value) { - PyObject* v = PyInt_FromLong(value); + PyObject* v = PyLong_FromLong(value); if (!v || PyDict_SetItemString(d, symbol, v) < 0) return -1; @@ -604,17 +614,31 @@ all_ins(PyObject* d) return 0; } + +static struct PyModuleDef fcntlmodule = { + PyModuleDef_HEAD_INIT, + "fcntl", + module_doc, + -1, + fcntl_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initfcntl(void) +PyInit_fcntl(void) { PyObject *m, *d; /* Create the module and add the functions and documentation */ - m = Py_InitModule3("fcntl", fcntl_methods, module_doc); + m = PyModule_Create(&fcntlmodule); if (m == NULL) - return; + return NULL; /* Add some symbolic constants to the module */ d = PyModule_GetDict(m); all_ins(d); + return m; } diff --git a/Modules/flmodule.c b/Modules/flmodule.c deleted file mode 100644 index b5a78cfec60..00000000000 --- a/Modules/flmodule.c +++ /dev/null @@ -1,2144 +0,0 @@ -/* FL module -- interface to Mark Overmars' FORMS Library. */ - -/* This code works with FORMS version 2.2 (if you defined - OBSOLETE_FORMS_CALLS), and 2.3. - FORMS can be ftp'ed from ftp.cs.ruu.nl (131.211.80.17), directory - /pub/SGI/FORMS. */ - -/* A half-hearted attempt has been made to allow programs using this - * module to exploit parallelism (through the threads module). No provisions - * have been made for multiple threads to use this module at the same time, - * though. So, a program with a forms thread and a non-forms thread will work - * fine but a program with two threads using forms will probably crash (unless - * the program takes precaution to ensure that only one thread can be in - * this module at any time). This will have to be fixed some time. - * (A fix will probably also have to synchronize with the gl module). - */ - -#include "Python.h" -#include "forms.h" -#include "structmember.h" - -/* Generic Forms Objects */ - -typedef struct { - PyObject_HEAD - FL_OBJECT *ob_generic; - PyMethodDef *ob_methods; - PyObject *ob_callback; - PyObject *ob_callback_arg; -} genericobject; - -static PyTypeObject GenericObjecttype; - -#define is_genericobject(g) ((g)->ob_type == &GenericObjecttype) - -/* List of all objects (XXX this should be a hash table on address...) */ - -static PyObject *allgenerics = NULL; -static int nfreeslots = 0; - -/* Add an object to the list of known objects */ - -static void -knowgeneric(genericobject *g) -{ - int i, n; - /* Create the list if it doesn't already exist */ - if (allgenerics == NULL) { - allgenerics = PyList_New(0); - if (allgenerics == NULL) { - PyErr_Clear(); - return; /* Too bad, live without allgenerics... */ - } - } - if (nfreeslots > 0) { - /* Search the list for reusable slots (NULL items) */ - /* XXX This can be made faster! */ - n = PyList_Size(allgenerics); - for (i = 0; i < n; i++) { - if (PyList_GetItem(allgenerics, i) == NULL) { - Py_INCREF(g); - PyList_SetItem(allgenerics, i, (PyObject *)g); - nfreeslots--; - return; - } - } - /* Strange... no free slots found... */ - nfreeslots = 0; - } - /* No free entries, append new item to the end */ - PyList_Append(allgenerics, (PyObject *)g); -} - -/* Find an object in the list of known objects */ - -static genericobject * -findgeneric(FL_OBJECT *generic) -{ - int i, n; - genericobject *g; - - if (allgenerics == NULL) - return NULL; /* No objects known yet */ - n = PyList_Size(allgenerics); - for (i = 0; i < n; i++) { - g = (genericobject *)PyList_GetItem(allgenerics, i); - if (g != NULL && g->ob_generic == generic) - return g; - } - return NULL; /* Unknown object */ -} - -/* Remove an object from the list of known objects */ - -static void -forgetgeneric(genericobject *g) -{ - int i, n; - - Py_XDECREF(g->ob_callback); - g->ob_callback = NULL; - Py_XDECREF(g->ob_callback_arg); - g->ob_callback_arg = NULL; - if (allgenerics == NULL) - return; /* No objects known yet */ - n = PyList_Size(allgenerics); - for (i = 0; i < n; i++) { - if (g == (genericobject *)PyList_GetItem(allgenerics, i)) { - PyList_SetItem(allgenerics, i, (PyObject *)NULL); - nfreeslots++; - break; - } - } -} - -/* Called when a form is about to be freed -- - remove all the objects that we know about from it. */ - -static void -releaseobjects(FL_FORM *form) -{ - int i, n; - genericobject *g; - - if (allgenerics == NULL) - return; /* No objects known yet */ - n = PyList_Size(allgenerics); - for (i = 0; i < n; i++) { - g = (genericobject *)PyList_GetItem(allgenerics, i); - if (g != NULL && g->ob_generic->form == form) { - fl_delete_object(g->ob_generic); - /* The object is now unreachable for - do_forms and check_forms, so - delete it from the list of known objects */ - Py_XDECREF(g->ob_callback); - g->ob_callback = NULL; - Py_XDECREF(g->ob_callback_arg); - g->ob_callback_arg = NULL; - PyList_SetItem(allgenerics, i, (PyObject *)NULL); - nfreeslots++; - } - } -} - - -/* Methods of generic objects */ - -static PyObject * -generic_set_call_back(genericobject *g, PyObject *args) -{ - if (PyTuple_GET_SIZE(args) == 0) { - Py_XDECREF(g->ob_callback); - Py_XDECREF(g->ob_callback_arg); - g->ob_callback = NULL; - g->ob_callback_arg = NULL; - } - else { - PyObject *a, *b; - if (!PyArg_UnpackTuple(args, "set_call_back", 2, 2, &a, &b)) - return NULL; - Py_XDECREF(g->ob_callback); - Py_XDECREF(g->ob_callback_arg); - g->ob_callback = a; - Py_INCREF(g->ob_callback); - g->ob_callback_arg = b; - Py_INCREF(g->ob_callback_arg); - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -generic_call(genericobject *g, void (*func)(FL_OBJECT *)) -{ - (*func)(g->ob_generic); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -generic_delete_object(genericobject *g) -{ - PyObject *res; - res = generic_call(g, fl_delete_object); - if (res != NULL) - forgetgeneric(g); - return res; -} - -static PyObject * -generic_show_object(genericobject *g) -{ - return generic_call(g, fl_show_object); -} - -static PyObject * -generic_hide_object(genericobject *g) -{ - return generic_call(g, fl_hide_object); -} - -static PyObject * -generic_redraw_object(genericobject *g) -{ - return generic_call(g, fl_redraw_object); -} - -#ifdef OBSOLETE_FORMS_CALLS - - /* (un)freeze_object() are obsolete in FORMS 2.2 and unsupported - in 2.3. Since there's no foolproof way to tell which version we're - using, we omit them unconditionally. */ - -static PyObject * -generic_freeze_object(genericobject *g) -{ - return generic_call(g, fl_freeze_object); -} - -static PyObject * -generic_unfreeze_object(genericobject *g) -{ - return generic_call(g, fl_unfreeze_object); -} - -#endif /* OBSOLETE_FORMS_CALLS */ - -static PyObject * -generic_activate_object(genericobject *g) -{ - return generic_call(g, fl_activate_object); -} - -static PyObject * -generic_deactivate_object(genericobject *g) -{ - return generic_call(g, fl_deactivate_object); -} - -static PyObject * -generic_set_object_shortcut(genericobject *g, PyObject *args) -{ - char *str; - if (!PyArg_ParseTuple(args, "s:set_object_shortcut", &str)) - return NULL; - fl_set_object_shortcut(g->ob_generic, str); - Py_INCREF(Py_None); - return Py_None; -} - -static PyMethodDef generic_methods[] = { - {"set_call_back", (PyCFunction)generic_set_call_back, METH_VARARGS}, - {"delete_object", (PyCFunction)generic_delete_object, METH_NOARGS}, - {"show_object", (PyCFunction)generic_show_object, METH_NOARGS}, - {"hide_object", (PyCFunction)generic_hide_object, METH_NOARGS}, - {"redraw_object", (PyCFunction)generic_redraw_object, METH_NOARGS}, -#ifdef OBSOLETE_FORMS_CALLS - {"freeze_object", (PyCFunction)generic_freeze_object, METH_NOARGS}, - {"unfreeze_object", (PyCFunction)generic_unfreeze_object, METH_NOARGS}, -#endif - {"activate_object", (PyCFunction)generic_activate_object, METH_NOARGS}, - {"deactivate_object", (PyCFunction)generic_deactivate_object, METH_NOARGS}, - {"set_object_shortcut", (PyCFunction)generic_set_object_shortcut, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - -static void -generic_dealloc(genericobject *g) -{ - fl_free_object(g->ob_generic); - Py_XDECREF(g->ob_callback); - Py_XDECREF(g->ob_callback_arg); - PyObject_Del(g); -} - -#define OFF(x) offsetof(FL_OBJECT, x) - -static struct memberlist generic_memberlist[] = { - {"objclass", T_INT, OFF(objclass), RO}, - {"type", T_INT, OFF(type), RO}, - {"boxtype", T_INT, OFF(boxtype)}, - {"x", T_FLOAT, OFF(x)}, - {"y", T_FLOAT, OFF(y)}, - {"w", T_FLOAT, OFF(w)}, - {"h", T_FLOAT, OFF(h)}, - {"col1", T_INT, OFF(col1)}, - {"col2", T_INT, OFF(col2)}, - {"align", T_INT, OFF(align)}, - {"lcol", T_INT, OFF(lcol)}, - {"lsize", T_FLOAT, OFF(lsize)}, - /* "label" is treated specially! */ - {"lstyle", T_INT, OFF(lstyle)}, - {"pushed", T_INT, OFF(pushed), RO}, - {"focus", T_INT, OFF(focus), RO}, - {"belowmouse", T_INT, OFF(belowmouse),RO}, -/* {"frozen", T_INT, OFF(frozen), RO}, */ - {"active", T_INT, OFF(active)}, - {"input", T_INT, OFF(input)}, - {"visible", T_INT, OFF(visible), RO}, - {"radio", T_INT, OFF(radio)}, - {"automatic", T_INT, OFF(automatic)}, - {NULL} /* Sentinel */ -}; - -#undef OFF - -static PyObject * -generic_getattr(genericobject *g, char *name) -{ - PyObject *meth; - - /* XXX Ought to special-case name "__methods__" */ - if (g-> ob_methods) { - meth = Py_FindMethod(g->ob_methods, (PyObject *)g, name); - if (meth != NULL) return meth; - PyErr_Clear(); - } - - meth = Py_FindMethod(generic_methods, (PyObject *)g, name); - if (meth != NULL) - return meth; - PyErr_Clear(); - - /* "label" is an exception, getmember only works for char pointers, - not for char arrays */ - if (strcmp(name, "label") == 0) - return PyString_FromString(g->ob_generic->label); - - return PyMember_Get((char *)g->ob_generic, generic_memberlist, name); -} - -static int -generic_setattr(genericobject *g, char *name, PyObject *v) -{ - int ret; - - if (v == NULL) { - PyErr_SetString(PyExc_TypeError, - "can't delete forms object attributes"); - return -1; - } - - /* "label" is an exception: setmember doesn't set strings; - and FORMS wants you to call a function to set the label */ - if (strcmp(name, "label") == 0) { - if (!PyString_Check(v)) { - PyErr_SetString(PyExc_TypeError, - "label attr must be string"); - return -1; - } - fl_set_object_label(g->ob_generic, PyString_AsString(v)); - return 0; - } - - ret = PyMember_Set((char *)g->ob_generic, generic_memberlist, name, v); - - /* Rather than calling all the various set_object_* functions, - we call fl_redraw_object here. This is sometimes redundant - but I doubt that's a big problem */ - if (ret == 0) - fl_redraw_object(g->ob_generic); - - return ret; -} - -static PyObject * -generic_repr(genericobject *g) -{ - char buf[100]; - PyOS_snprintf(buf, sizeof(buf), "<FORMS_object at %p, objclass=%d>", - g, g->ob_generic->objclass); - return PyString_FromString(buf); -} - -static PyTypeObject GenericObjecttype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "fl.FORMS_object", /*tp_name*/ - sizeof(genericobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)generic_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)generic_getattr, /*tp_getattr*/ - (setattrfunc)generic_setattr, /*tp_setattr*/ - 0, /*tp_compare*/ - (reprfunc)generic_repr, /*tp_repr*/ -}; - -static PyObject * -newgenericobject(FL_OBJECT *generic, PyMethodDef *methods) -{ - genericobject *g; - g = PyObject_New(genericobject, &GenericObjecttype); - if (g == NULL) - return NULL; - g-> ob_generic = generic; - g->ob_methods = methods; - g->ob_callback = NULL; - g->ob_callback_arg = NULL; - knowgeneric(g); - return (PyObject *)g; -} - -/**********************************************************************/ -/* Some common calling sequences */ - -/* void func (object, float) */ -static PyObject * -call_forms_INf (void (*func)(FL_OBJECT *, float), FL_OBJECT *obj, PyObject *args) -{ - float parameter; - - if (!PyArg_Parse(args, "f", ¶meter)) return NULL; - - (*func) (obj, parameter); - - Py_INCREF(Py_None); - return Py_None; -} - -/* void func (object, float) */ -static PyObject * -call_forms_INfINf (void (*func)(FL_OBJECT *, float, float), FL_OBJECT *obj, PyObject *args) -{ - float par1, par2; - - if (!PyArg_Parse(args, "(ff)", &par1, &par2)) return NULL; - - (*func) (obj, par1, par2); - - Py_INCREF(Py_None); - return Py_None; -} - -/* void func (object, int) */ -static PyObject * -call_forms_INi (void (*func)(FL_OBJECT *, int), FL_OBJECT *obj, PyObject *args) -{ - int parameter; - - if (!PyArg_Parse(args, "i", ¶meter)) return NULL; - - (*func) (obj, parameter); - - Py_INCREF(Py_None); - return Py_None; -} - -/* void func (object, char) */ -static PyObject * -call_forms_INc (void (*func)(FL_OBJECT *, int), FL_OBJECT *obj, PyObject *args) -{ - char *a; - - if (!PyArg_Parse(args, "s", &a)) return NULL; - - (*func) (obj, a[0]); - - Py_INCREF(Py_None); - return Py_None; -} - -/* void func (object, string) */ -static PyObject * -call_forms_INstr (void (*func)(FL_OBJECT *, char *), FL_OBJECT *obj, PyObject *args) -{ - char *a; - - if (!PyArg_Parse(args, "s", &a)) return NULL; - - (*func) (obj, a); - - Py_INCREF(Py_None); - return Py_None; -} - - -/* void func (object, int, string) */ -static PyObject * -call_forms_INiINstr (void (*func)(FL_OBJECT *, int, char *), FL_OBJECT *obj, PyObject *args) -{ - char *b; - int a; - - if (!PyArg_Parse(args, "(is)", &a, &b)) return NULL; - - (*func) (obj, a, b); - - Py_INCREF(Py_None); - return Py_None; -} - -#ifdef UNUSED -/* void func (object, int, int) */ -static PyObject * -call_forms_INiINi (void (*func)(FL_OBJECT *, int, int), FL_OBJECT *obj, PyObject *args) -{ - int par1, par2; - - if (!PyArg_Parse(args, "(ii)", &par1, &par2)) return NULL; - - (*func) (obj, par1, par2); - - Py_INCREF(Py_None); - return Py_None; -} -#endif - -/* int func (object) */ -static PyObject * -call_forms_Ri (int (*func)(FL_OBJECT *), FL_OBJECT *obj) -{ - int retval; - - retval = (*func) (obj); - - return PyInt_FromLong ((long) retval); -} - -/* char * func (object) */ -static PyObject * -call_forms_Rstr (char * (*func)(FL_OBJECT *), FL_OBJECT *obj) -{ - char *str; - - str = (*func) (obj); - - if (str == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return PyString_FromString (str); -} - -/* int func (object) */ -static PyObject * -call_forms_Rf (float (*func)(FL_OBJECT *), FL_OBJECT *obj) -{ - float retval; - - retval = (*func) (obj); - - return PyFloat_FromDouble (retval); -} - -static PyObject * -call_forms_OUTfOUTf (void (*func)(FL_OBJECT *, float *, float *), FL_OBJECT *obj) -{ - float f1, f2; - - (*func) (obj, &f1, &f2); - - return Py_BuildValue("(ff)", f1, f2); -} - -#ifdef UNUSED -static PyObject * -call_forms_OUTf (void (*func)(FL_OBJECT *, float *), FL_OBJECT *obj) -{ - float f; - - (*func) (obj, &f); - - return PyFloat_FromDouble (f); -} -#endif - -/**********************************************************************/ -/* Class : browser */ - -static PyObject * -set_browser_topline(genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_set_browser_topline, g-> ob_generic, args); -} - -static PyObject * -clear_browser(genericobject *g) -{ - return generic_call (g, fl_clear_browser); -} - -static PyObject * -add_browser_line (genericobject *g, PyObject *args) -{ - return call_forms_INstr (fl_add_browser_line, g-> ob_generic, args); -} - -static PyObject * -addto_browser (genericobject *g, PyObject *args) -{ - return call_forms_INstr (fl_addto_browser, g-> ob_generic, args); -} - -static PyObject * -insert_browser_line (genericobject *g, PyObject *args) -{ - return call_forms_INiINstr (fl_insert_browser_line, - g-> ob_generic, args); -} - -static PyObject * -delete_browser_line (genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_delete_browser_line, g-> ob_generic, args); -} - -static PyObject * -replace_browser_line (genericobject *g, PyObject *args) -{ - return call_forms_INiINstr (fl_replace_browser_line, - g-> ob_generic, args); -} - -static PyObject * -get_browser_line(genericobject *g, PyObject *args) -{ - int i; - char *str; - - if (!PyArg_Parse(args, "i", &i)) - return NULL; - - str = fl_get_browser_line (g->ob_generic, i); - - if (str == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return PyString_FromString (str); -} - -static PyObject * -load_browser (genericobject *g, PyObject *args) -{ - /* XXX strictly speaking this is wrong since fl_load_browser - XXX returns int, not void */ - return call_forms_INstr (fl_load_browser, g-> ob_generic, args); -} - -static PyObject * -get_browser_maxline(genericobject *g) -{ - return call_forms_Ri (fl_get_browser_maxline, g-> ob_generic); -} - -static PyObject * -select_browser_line (genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_select_browser_line, g-> ob_generic, args); -} - -static PyObject * -deselect_browser_line (genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_deselect_browser_line, g-> ob_generic, args); -} - -static PyObject * -deselect_browser (genericobject *g) -{ - return generic_call (g, fl_deselect_browser); -} - -static PyObject * -isselected_browser_line (genericobject *g, PyObject *args) -{ - int i, j; - - if (!PyArg_Parse(args, "i", &i)) - return NULL; - - j = fl_isselected_browser_line (g->ob_generic, i); - - return PyInt_FromLong (j); -} - -static PyObject * -get_browser (genericobject *g) -{ - return call_forms_Ri (fl_get_browser, g-> ob_generic); -} - -static PyObject * -set_browser_fontsize (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_browser_fontsize, g-> ob_generic, args); -} - -static PyObject * -set_browser_fontstyle (genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_set_browser_fontstyle, g-> ob_generic, args); -} - -static PyObject * -set_browser_specialkey (genericobject *g, PyObject *args) -{ - return call_forms_INc(fl_set_browser_specialkey, g-> ob_generic, args); -} - -static PyMethodDef browser_methods[] = { - {"set_browser_topline", (PyCFunction)set_browser_topline, - METH_OLDARGS}, - {"clear_browser", (PyCFunction)clear_browser, - METH_NOARGS}, - {"add_browser_line", (PyCFunction)add_browser_line, - METH_OLDARGS}, - {"addto_browser", (PyCFunction)addto_browser, - METH_OLDARGS}, - {"insert_browser_line", (PyCFunction)insert_browser_line, - METH_OLDARGS}, - {"delete_browser_line", (PyCFunction)delete_browser_line, - METH_OLDARGS}, - {"replace_browser_line", (PyCFunction)replace_browser_line, - METH_OLDARGS}, - {"get_browser_line", (PyCFunction)get_browser_line, - METH_OLDARGS}, - {"load_browser", (PyCFunction)load_browser, - METH_OLDARGS}, - {"get_browser_maxline", (PyCFunction)get_browser_maxline, - METH_NOARGS,} - {"select_browser_line", (PyCFunction)select_browser_line, - METH_OLDARGS}, - {"deselect_browser_line", (PyCFunction)deselect_browser_line, - METH_OLDARGS}, - {"deselect_browser", (PyCFunction)deselect_browser, - METH_NOARGS,} - {"isselected_browser_line", (PyCFunction)isselected_browser_line, - METH_OLDARGS}, - {"get_browser", (PyCFunction)get_browser, - METH_NOARGS,} - {"set_browser_fontsize", (PyCFunction)set_browser_fontsize, - METH_OLDARGS}, - {"set_browser_fontstyle", (PyCFunction)set_browser_fontstyle, - METH_OLDARGS}, - {"set_browser_specialkey", (PyCFunction)set_browser_specialkey, - METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -/* Class: button */ - -static PyObject * -set_button(genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_set_button, g-> ob_generic, args); -} - -static PyObject * -get_button(genericobject *g) -{ - return call_forms_Ri (fl_get_button, g-> ob_generic); -} - -static PyObject * -get_button_numb(genericobject *g) -{ - return call_forms_Ri (fl_get_button_numb, g-> ob_generic); -} - -static PyObject * -set_button_shortcut(genericobject *g, PyObject *args) -{ - return call_forms_INstr (fl_set_button_shortcut, g-> ob_generic, args); -} - -static PyMethodDef button_methods[] = { - {"set_button", (PyCFunction)set_button, METH_OLDARGS}, - {"get_button", (PyCFunction)get_button, METH_NOARGS}, - {"get_button_numb", (PyCFunction)get_button_numb, METH_NOARGS}, - {"set_button_shortcut", (PyCFunction)set_button_shortcut, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -/* Class: choice */ - -static PyObject * -set_choice(genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_set_choice, g-> ob_generic, args); -} - -static PyObject * -get_choice(genericobject *g) -{ - return call_forms_Ri (fl_get_choice, g-> ob_generic); -} - -static PyObject * -clear_choice (genericobject *g) -{ - return generic_call (g, fl_clear_choice); -} - -static PyObject * -addto_choice (genericobject *g, PyObject *args) -{ - return call_forms_INstr (fl_addto_choice, g-> ob_generic, args); -} - -static PyObject * -replace_choice (genericobject *g, PyObject *args) -{ - return call_forms_INiINstr (fl_replace_choice, g-> ob_generic, args); -} - -static PyObject * -delete_choice (genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_delete_choice, g-> ob_generic, args); -} - -static PyObject * -get_choice_text (genericobject *g) -{ - return call_forms_Rstr (fl_get_choice_text, g-> ob_generic); -} - -static PyObject * -set_choice_fontsize (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_choice_fontsize, g-> ob_generic, args); -} - -static PyObject * -set_choice_fontstyle (genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_set_choice_fontstyle, g-> ob_generic, args); -} - -static PyMethodDef choice_methods[] = { - {"set_choice", (PyCFunction)set_choice, METH_OLDARGS}, - {"get_choice", (PyCFunction)get_choice, METH_NOARGS}, - {"clear_choice", (PyCFunction)clear_choice, METH_NOARGS}, - {"addto_choice", (PyCFunction)addto_choice, METH_OLDARGS}, - {"replace_choice", (PyCFunction)replace_choice, METH_OLDARGS}, - {"delete_choice", (PyCFunction)delete_choice, METH_OLDARGS}, - {"get_choice_text", (PyCFunction)get_choice_text, METH_NOARGS}, - {"set_choice_fontsize", (PyCFunction)set_choice_fontsize, METH_OLDARGS}, - {"set_choice_fontstyle",(PyCFunction)set_choice_fontstyle, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -/* Class : Clock */ - -static PyObject * -get_clock(genericobject *g) -{ - int i0, i1, i2; - - fl_get_clock (g->ob_generic, &i0, &i1, &i2); - - return Py_BuildValue("(iii)", i0, i1, i2); -} - -static PyMethodDef clock_methods[] = { - {"get_clock", (PyCFunction)get_clock, METH_NOARGS}, - {NULL, NULL} /* sentinel */ -}; - -/* CLass : Counters */ - -static PyObject * -get_counter_value(genericobject *g) -{ - return call_forms_Rf (fl_get_counter_value, g-> ob_generic); -} - -static PyObject * -set_counter_value (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_counter_value, g-> ob_generic, args); -} - -static PyObject * -set_counter_precision (genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_set_counter_precision, g-> ob_generic, args); -} - -static PyObject * -set_counter_bounds (genericobject *g, PyObject *args) -{ - return call_forms_INfINf (fl_set_counter_bounds, g-> ob_generic, args); -} - -static PyObject * -set_counter_step (genericobject *g, PyObject *args) -{ - return call_forms_INfINf (fl_set_counter_step, g-> ob_generic, args); -} - -static PyObject * -set_counter_return (genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_set_counter_return, g-> ob_generic, args); -} - -static PyMethodDef counter_methods[] = { - {"set_counter_value", (PyCFunction)set_counter_value, - METH_OLDARGS}, - {"get_counter_value", (PyCFunction)get_counter_value, - METH_NOARGS}, - {"set_counter_bounds", (PyCFunction)set_counter_bounds, - METH_OLDARGS}, - {"set_counter_step", (PyCFunction)set_counter_step, - METH_OLDARGS}, - {"set_counter_precision", (PyCFunction)set_counter_precision, - METH_OLDARGS}, - {"set_counter_return", (PyCFunction)set_counter_return, - METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - - -/* Class: Dials */ - -static PyObject * -get_dial_value(genericobject *g) -{ - return call_forms_Rf (fl_get_dial_value, g-> ob_generic); -} - -static PyObject * -set_dial_value (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_dial_value, g-> ob_generic, args); -} - -static PyObject * -set_dial_bounds (genericobject *g, PyObject *args) -{ - return call_forms_INfINf (fl_set_dial_bounds, g-> ob_generic, args); -} - -static PyObject * -get_dial_bounds (genericobject *g) -{ - return call_forms_OUTfOUTf (fl_get_dial_bounds, g-> ob_generic); -} - -static PyObject * -set_dial_step (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_dial_step, g-> ob_generic, args); -} - -static PyMethodDef dial_methods[] = { - {"set_dial_value", (PyCFunction)set_dial_value, METH_OLDARGS}, - {"get_dial_value", (PyCFunction)get_dial_value, METH_NOARGS}, - {"set_dial_bounds", (PyCFunction)set_dial_bounds, METH_OLDARGS}, - {"get_dial_bounds", (PyCFunction)get_dial_bounds, METH_NOARGS}, - {"set_dial_step", (PyCFunction)set_dial_step, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -/* Class : Input */ - -static PyObject * -set_input (genericobject *g, PyObject *args) -{ - return call_forms_INstr (fl_set_input, g-> ob_generic, args); -} - -static PyObject * -get_input (genericobject *g) -{ - return call_forms_Rstr (fl_get_input, g-> ob_generic); -} - -static PyObject * -set_input_color (genericobject *g, PyObject *args) -{ - return call_forms_INfINf (fl_set_input_color, g-> ob_generic, args); -} - -static PyObject * -set_input_return (genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_set_input_return, g-> ob_generic, args); -} - -static PyMethodDef input_methods[] = { - {"set_input", (PyCFunction)set_input, METH_OLDARGS}, - {"get_input", (PyCFunction)get_input, METH_NOARGS}, - {"set_input_color", (PyCFunction)set_input_color, METH_OLDARGS}, - {"set_input_return", (PyCFunction)set_input_return, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - - -/* Class : Menu */ - -static PyObject * -set_menu (genericobject *g, PyObject *args) -{ - return call_forms_INstr (fl_set_menu, g-> ob_generic, args); -} - -static PyObject * -get_menu (genericobject *g) -{ - /* XXX strictly speaking this is wrong since fl_get_menu - XXX returns long, not int */ - return call_forms_Ri (fl_get_menu, g-> ob_generic); -} - -static PyObject * -get_menu_text (genericobject *g) -{ - return call_forms_Rstr (fl_get_menu_text, g-> ob_generic); -} - -static PyObject * -addto_menu (genericobject *g, PyObject *args) -{ - return call_forms_INstr (fl_addto_menu, g-> ob_generic, args); -} - -static PyMethodDef menu_methods[] = { - {"set_menu", (PyCFunction)set_menu, METH_OLDARGS}, - {"get_menu", (PyCFunction)get_menu, METH_NOARGS}, - {"get_menu_text", (PyCFunction)get_menu_text, METH_NOARGS}, - {"addto_menu", (PyCFunction)addto_menu, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - - -/* Class: Sliders */ - -static PyObject * -get_slider_value(genericobject *g) -{ - return call_forms_Rf (fl_get_slider_value, g-> ob_generic); -} - -static PyObject * -set_slider_value (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_slider_value, g-> ob_generic, args); -} - -static PyObject * -set_slider_bounds (genericobject *g, PyObject *args) -{ - return call_forms_INfINf (fl_set_slider_bounds, g-> ob_generic, args); -} - -static PyObject * -get_slider_bounds (genericobject *g) -{ - return call_forms_OUTfOUTf(fl_get_slider_bounds, g-> ob_generic); -} - -static PyObject * -set_slider_return (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_slider_return, g-> ob_generic, args); -} - -static PyObject * -set_slider_size (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_slider_size, g-> ob_generic, args); -} - -static PyObject * -set_slider_precision (genericobject *g, PyObject *args) -{ - return call_forms_INi (fl_set_slider_precision, g-> ob_generic, args); -} - -static PyObject * -set_slider_step (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_slider_step, g-> ob_generic, args); -} - - -static PyMethodDef slider_methods[] = { - {"set_slider_value", (PyCFunction)set_slider_value, METH_OLDARGS}, - {"get_slider_value", (PyCFunction)get_slider_value, METH_NOARGS}, - {"set_slider_bounds", (PyCFunction)set_slider_bounds, METH_OLDARGS}, - {"get_slider_bounds", (PyCFunction)get_slider_bounds, METH_NOARGS}, - {"set_slider_return", (PyCFunction)set_slider_return, METH_OLDARGS}, - {"set_slider_size", (PyCFunction)set_slider_size, METH_OLDARGS}, - {"set_slider_precision",(PyCFunction)set_slider_precision, METH_OLDARGS}, - {"set_slider_step", (PyCFunction)set_slider_step, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -static PyObject * -set_positioner_xvalue (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_positioner_xvalue, g-> ob_generic, args); -} - -static PyObject * -set_positioner_xbounds (genericobject *g, PyObject *args) -{ - return call_forms_INfINf (fl_set_positioner_xbounds, - g-> ob_generic, args); -} - -static PyObject * -set_positioner_yvalue (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_positioner_yvalue, g-> ob_generic, args); -} - -static PyObject * -set_positioner_ybounds (genericobject *g, PyObject *args) -{ - return call_forms_INfINf (fl_set_positioner_ybounds, - g-> ob_generic, args); -} - -static PyObject * -get_positioner_xvalue (genericobject *g) -{ - return call_forms_Rf (fl_get_positioner_xvalue, g-> ob_generic); -} - -static PyObject * -get_positioner_xbounds (genericobject *g) -{ - return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic); -} - -static PyObject * -get_positioner_yvalue (genericobject *g) -{ - return call_forms_Rf (fl_get_positioner_yvalue, g-> ob_generic); -} - -static PyObject * -get_positioner_ybounds (genericobject *g) -{ - return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic); -} - -static PyMethodDef positioner_methods[] = { - {"set_positioner_xvalue", (PyCFunction)set_positioner_xvalue, - METH_OLDARGS}, - {"set_positioner_yvalue", (PyCFunction)set_positioner_yvalue, - METH_OLDARGS}, - {"set_positioner_xbounds", (PyCFunction)set_positioner_xbounds, - METH_OLDARGS}, - {"set_positioner_ybounds", (PyCFunction)set_positioner_ybounds, - METH_OLDARGS}, - {"get_positioner_xvalue", (PyCFunction)get_positioner_xvalue, - METH_NOARGS}, - {"get_positioner_yvalue", (PyCFunction)get_positioner_yvalue, - METH_NOARGS}, - {"get_positioner_xbounds", (PyCFunction)get_positioner_xbounds, - METH_NOARGS}, - {"get_positioner_ybounds", (PyCFunction)get_positioner_ybounds, - METH_NOARGS}, - {NULL, NULL} /* sentinel */ -}; - -/* Class timer */ - -static PyObject * -set_timer (genericobject *g, PyObject *args) -{ - return call_forms_INf (fl_set_timer, g-> ob_generic, args); -} - -static PyObject * -get_timer (genericobject *g) -{ - return call_forms_Rf (fl_get_timer, g-> ob_generic); -} - -static PyMethodDef timer_methods[] = { - {"set_timer", (PyCFunction)set_timer, METH_OLDARGS}, - {"get_timer", (PyCFunction)get_timer, METH_NOARGS}, - {NULL, NULL} /* sentinel */ -}; - -/* Form objects */ - -typedef struct { - PyObject_HEAD - FL_FORM *ob_form; -} formobject; - -static PyTypeObject Formtype; - -#define is_formobject(v) ((v)->ob_type == &Formtype) - -static PyObject * -form_show_form(formobject *f, PyObject *args) -{ - int place, border; - char *name; - if (!PyArg_Parse(args, "(iis)", &place, &border, &name)) - return NULL; - fl_show_form(f->ob_form, place, border, name); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -form_call(void (*func)(FL_FORM *), FL_FORM *f) -{ - (*func)(f); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -form_call_INiINi(void (*func)(FL_FORM *, int, int), FL_FORM *f, PyObject *args) -{ - int a, b; - - if (!PyArg_Parse(args, "(ii)", &a, &b)) return NULL; - - (*func)(f, a, b); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -form_call_INfINf(void (*func)(FL_FORM *, float, float), FL_FORM *f, PyObject *args) -{ - float a, b; - - if (!PyArg_Parse(args, "(ff)", &a, &b)) return NULL; - - (*func)(f, a, b); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -form_hide_form(formobject *f) -{ - return form_call(fl_hide_form, f-> ob_form); -} - -static PyObject * -form_redraw_form(formobject *f) -{ - return form_call(fl_redraw_form, f-> ob_form); -} - -static PyObject * -form_set_form_position(formobject *f, PyObject *args) -{ - return form_call_INiINi(fl_set_form_position, f-> ob_form, args); -} - -static PyObject * -form_set_form_size(formobject *f, PyObject *args) -{ - return form_call_INiINi(fl_set_form_size, f-> ob_form, args); -} - -static PyObject * -form_scale_form(formobject *f, PyObject *args) -{ - return form_call_INfINf(fl_scale_form, f-> ob_form, args); -} - -static PyObject * -generic_add_object(formobject *f, PyObject *args, FL_OBJECT *(*func)(int, float, float, float, float, char*), PyMethodDef *internal_methods) -{ - int type; - float x, y, w, h; - char *name; - FL_OBJECT *obj; - - if (!PyArg_Parse(args,"(iffffs)", &type,&x,&y,&w,&h,&name)) - return NULL; - - fl_addto_form (f-> ob_form); - - obj = (*func) (type, x, y, w, h, name); - - fl_end_form(); - - if (obj == NULL) { - PyErr_NoMemory(); - return NULL; - } - - return newgenericobject (obj, internal_methods); -} - -static PyObject * -form_add_button(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_button, button_methods); -} - -static PyObject * -form_add_lightbutton(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_lightbutton, button_methods); -} - -static PyObject * -form_add_roundbutton(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_roundbutton, button_methods); -} - -static PyObject * -form_add_menu (formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_menu, menu_methods); -} - -static PyObject * -form_add_slider(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_slider, slider_methods); -} - -static PyObject * -form_add_valslider(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_valslider, slider_methods); -} - -static PyObject * -form_add_dial(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_dial, dial_methods); -} - -static PyObject * -form_add_counter(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_counter, counter_methods); -} - -static PyObject * -form_add_clock(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_clock, clock_methods); -} - -static PyObject * -form_add_box(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_box, - (PyMethodDef *)NULL); -} - -static PyObject * -form_add_choice(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_choice, choice_methods); -} - -static PyObject * -form_add_browser(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_browser, browser_methods); -} - -static PyObject * -form_add_positioner(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_positioner, - positioner_methods); -} - -static PyObject * -form_add_input(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_input, input_methods); -} - -static PyObject * -form_add_text(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_text, - (PyMethodDef *)NULL); -} - -static PyObject * -form_add_timer(formobject *f, PyObject *args) -{ - return generic_add_object(f, args, fl_add_timer, timer_methods); -} - -static PyObject * -form_freeze_form(formobject *f) -{ - return form_call(fl_freeze_form, f-> ob_form); -} - -static PyObject * -form_unfreeze_form(formobject *f) -{ - return form_call(fl_unfreeze_form, f-> ob_form); -} - -static PyObject * -form_activate_form(formobject *f) -{ - return form_call(fl_activate_form, f-> ob_form); -} - -static PyObject * -form_deactivate_form(formobject *f) -{ - return form_call(fl_deactivate_form, f-> ob_form); -} - -static PyObject * -form_bgn_group(formobject *f, PyObject *args) -{ - FL_OBJECT *obj; - - fl_addto_form(f-> ob_form); - obj = fl_bgn_group(); - fl_end_form(); - - if (obj == NULL) { - PyErr_NoMemory(); - return NULL; - } - - return newgenericobject (obj, (PyMethodDef *) NULL); -} - -static PyObject * -form_end_group(formobject *f, PyObject *args) -{ - fl_addto_form(f-> ob_form); - fl_end_group(); - fl_end_form(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_find_first_or_last(FL_OBJECT *(*func)(FL_FORM *, int, float, float), formobject *f, PyObject *args) -{ - int type; - float mx, my; - FL_OBJECT *generic; - genericobject *g; - - if (!PyArg_Parse(args, "(iff)", &type, &mx, &my)) return NULL; - - generic = (*func) (f-> ob_form, type, mx, my); - - if (generic == NULL) - { - Py_INCREF(Py_None); - return Py_None; - } - - g = findgeneric(generic); - if (g == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "forms_find_{first|last} returns unknown object"); - return NULL; - } - Py_INCREF(g); - return (PyObject *) g; -} - -static PyObject * -form_find_first(formobject *f, PyObject *args) -{ - return forms_find_first_or_last(fl_find_first, f, args); -} - -static PyObject * -form_find_last(formobject *f, PyObject *args) -{ - return forms_find_first_or_last(fl_find_last, f, args); -} - -static PyObject * -form_set_object_focus(formobject *f, PyObject *args) -{ - genericobject *g; - if (args == NULL || !is_genericobject(args)) { - PyErr_BadArgument(); - return NULL; - } - g = (genericobject *)args; - fl_set_object_focus(f->ob_form, g->ob_generic); - Py_INCREF(Py_None); - return Py_None; -} - -static PyMethodDef form_methods[] = { -/* adm */ - {"show_form", (PyCFunction)form_show_form, METH_OLDARGS}, - {"hide_form", (PyCFunction)form_hide_form, METH_NOARGS}, - {"redraw_form", (PyCFunction)form_redraw_form, METH_NOARGS}, - {"set_form_position", (PyCFunction)form_set_form_position, METH_OLDARGS}, - {"set_form_size", (PyCFunction)form_set_form_size, METH_OLDARGS}, - {"scale_form", (PyCFunction)form_scale_form, METH_OLDARGS}, - {"freeze_form", (PyCFunction)form_freeze_form, METH_NOARGS}, - {"unfreeze_form", (PyCFunction)form_unfreeze_form, METH_NOARGS}, - {"activate_form", (PyCFunction)form_activate_form, METH_NOARGS}, - {"deactivate_form", (PyCFunction)form_deactivate_form, METH_NOARGS}, - {"bgn_group", (PyCFunction)form_bgn_group, METH_OLDARGS}, - {"end_group", (PyCFunction)form_end_group, METH_OLDARGS}, - {"find_first", (PyCFunction)form_find_first, METH_OLDARGS}, - {"find_last", (PyCFunction)form_find_last, METH_OLDARGS}, - {"set_object_focus", (PyCFunction)form_set_object_focus, METH_OLDARGS}, - -/* basic objects */ - {"add_button", (PyCFunction)form_add_button, METH_OLDARGS}, -/* {"add_bitmap", (method)form_add_bitmap, METH_OLDARGS}, */ - {"add_lightbutton", (PyCFunction)form_add_lightbutton, METH_OLDARGS}, - {"add_roundbutton", (PyCFunction)form_add_roundbutton, METH_OLDARGS}, - {"add_menu", (PyCFunction)form_add_menu, METH_OLDARGS}, - {"add_slider", (PyCFunction)form_add_slider, METH_OLDARGS}, - {"add_positioner", (PyCFunction)form_add_positioner, METH_OLDARGS}, - {"add_valslider", (PyCFunction)form_add_valslider, METH_OLDARGS}, - {"add_dial", (PyCFunction)form_add_dial, METH_OLDARGS}, - {"add_counter", (PyCFunction)form_add_counter, METH_OLDARGS}, - {"add_box", (PyCFunction)form_add_box, METH_OLDARGS}, - {"add_clock", (PyCFunction)form_add_clock, METH_OLDARGS}, - {"add_choice", (PyCFunction)form_add_choice, METH_OLDARGS}, - {"add_browser", (PyCFunction)form_add_browser, METH_OLDARGS}, - {"add_input", (PyCFunction)form_add_input, METH_OLDARGS}, - {"add_timer", (PyCFunction)form_add_timer, METH_OLDARGS}, - {"add_text", (PyCFunction)form_add_text, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -static void -form_dealloc(formobject *f) -{ - releaseobjects(f->ob_form); - if (f->ob_form->visible) - fl_hide_form(f->ob_form); - fl_free_form(f->ob_form); - PyObject_Del(f); -} - -#define OFF(x) offsetof(FL_FORM, x) - -static struct memberlist form_memberlist[] = { - {"window", T_LONG, OFF(window), RO}, - {"w", T_FLOAT, OFF(w)}, - {"h", T_FLOAT, OFF(h)}, - {"x", T_FLOAT, OFF(x), RO}, - {"y", T_FLOAT, OFF(y), RO}, - {"deactivated", T_INT, OFF(deactivated)}, - {"visible", T_INT, OFF(visible), RO}, - {"frozen", T_INT, OFF(frozen), RO}, - {"doublebuf", T_INT, OFF(doublebuf)}, - {NULL} /* Sentinel */ -}; - -#undef OFF - -static PyObject * -form_getattr(formobject *f, char *name) -{ - PyObject *meth; - - meth = Py_FindMethod(form_methods, (PyObject *)f, name); - if (meth != NULL) - return meth; - PyErr_Clear(); - return PyMember_Get((char *)f->ob_form, form_memberlist, name); -} - -static int -form_setattr(formobject *f, char *name, PyObject *v) -{ - if (v == NULL) { - PyErr_SetString(PyExc_TypeError, - "can't delete form attributes"); - return -1; - } - - return PyMember_Set((char *)f->ob_form, form_memberlist, name, v); -} - -static PyObject * -form_repr(formobject *f) -{ - char buf[100]; - PyOS_snprintf(buf, sizeof(buf), "<FORMS_form at %p, window=%ld>", - f, f->ob_form->window); - return PyString_FromString(buf); -} - -static PyTypeObject Formtype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "fl.FORMS_form", /*tp_name*/ - sizeof(formobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)form_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)form_getattr, /*tp_getattr*/ - (setattrfunc)form_setattr, /*tp_setattr*/ - 0, /*tp_compare*/ - (reprfunc)form_repr, /*tp_repr*/ -}; - -static PyObject * -newformobject(FL_FORM *form) -{ - formobject *f; - f = PyObject_New(formobject, &Formtype); - if (f == NULL) - return NULL; - f->ob_form = form; - return (PyObject *)f; -} - - -/* The "fl" module */ - -static PyObject * -forms_make_form(PyObject *dummy, PyObject *args) -{ - int type; - float w, h; - FL_FORM *form; - if (!PyArg_Parse(args, "(iff)", &type, &w, &h)) - return NULL; - form = fl_bgn_form(type, w, h); - if (form == NULL) { - /* XXX Actually, cannot happen! */ - PyErr_NoMemory(); - return NULL; - } - fl_end_form(); - return newformobject(form); -} - -static PyObject * -forms_activate_all_forms(PyObject *f, PyObject *args) -{ - fl_activate_all_forms(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_deactivate_all_forms(PyObject *f, PyObject *args) -{ - fl_deactivate_all_forms(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *my_event_callback = NULL; - -static PyObject * -forms_set_event_call_back(PyObject *dummy, PyObject *args) -{ - if (args == Py_None) - args = NULL; - my_event_callback = args; - Py_XINCREF(args); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_do_or_check_forms(PyObject *dummy, FL_OBJECT *(*func)(void)) -{ - FL_OBJECT *generic; - genericobject *g; - PyObject *arg, *res; - - for (;;) { - Py_BEGIN_ALLOW_THREADS - generic = (*func)(); - Py_END_ALLOW_THREADS - if (generic == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - if (generic == FL_EVENT) { - int dev; - short val; - if (my_event_callback == NULL) - return PyInt_FromLong(-1L); - dev = fl_qread(&val); - arg = Py_BuildValue("(ih)", dev, val); - if (arg == NULL) - return NULL; - res = PyEval_CallObject(my_event_callback, arg); - Py_XDECREF(res); - Py_DECREF(arg); - if (res == NULL) - return NULL; /* Callback raised exception */ - continue; - } - g = findgeneric(generic); - if (g == NULL) { - /* Object not known to us (some dialogs cause this) */ - continue; /* Ignore it */ - } - if (g->ob_callback == NULL) { - Py_INCREF(g); - return ((PyObject *) g); - } - arg = PyTuple_Pack(2, (PyObject *)g, g->ob_callback_arg); - if (arg == NULL) - return NULL; - res = PyEval_CallObject(g->ob_callback, arg); - Py_XDECREF(res); - Py_DECREF(arg); - if (res == NULL) - return NULL; /* Callback raised exception */ - } -} - -static PyObject * -forms_do_forms(PyObject *dummy) -{ - return forms_do_or_check_forms(dummy, fl_do_forms); -} - -static PyObject * -forms_check_forms(PyObject *dummy) -{ - return forms_do_or_check_forms(dummy, fl_check_forms); -} - -static PyObject * -forms_do_only_forms(PyObject *dummy) -{ - return forms_do_or_check_forms(dummy, fl_do_only_forms); -} - -static PyObject * -forms_check_only_forms(PyObject *dummy) -{ - return forms_do_or_check_forms(dummy, fl_check_only_forms); -} - -#ifdef UNUSED -static PyObject * -fl_call(void (*func)(void)) -{ - (*func)(); - Py_INCREF(Py_None); - return Py_None; -} -#endif - -static PyObject * -forms_set_graphics_mode(PyObject *dummy, PyObject *args) -{ - int rgbmode, doublebuf; - - if (!PyArg_Parse(args, "(ii)", &rgbmode, &doublebuf)) - return NULL; - fl_set_graphics_mode(rgbmode,doublebuf); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_get_rgbmode(PyObject *dummy, PyObject *args) -{ - extern int fl_rgbmode; - - if (args != NULL) { - PyErr_BadArgument(); - return NULL; - } - return PyInt_FromLong((long)fl_rgbmode); -} - -static PyObject * -forms_show_errors(PyObject *dummy, PyObject *args) -{ - int show; - if (!PyArg_Parse(args, "i", &show)) - return NULL; - fl_show_errors(show); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_set_font_name(PyObject *dummy, PyObject *args) -{ - int numb; - char *name; - if (!PyArg_Parse(args, "(is)", &numb, &name)) - return NULL; - fl_set_font_name(numb, name); - Py_INCREF(Py_None); - return Py_None; -} - - -static PyObject * -forms_qdevice(PyObject *self, PyObject *args) -{ - short arg1; - if (!PyArg_Parse(args, "h", &arg1)) - return NULL; - fl_qdevice(arg1); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_unqdevice(PyObject *self, PyObject *args) -{ - short arg1; - if (!PyArg_Parse(args, "h", &arg1)) - return NULL; - fl_unqdevice(arg1); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_isqueued(PyObject *self, PyObject *args) -{ - long retval; - short arg1; - if (!PyArg_Parse(args, "h", &arg1)) - return NULL; - retval = fl_isqueued(arg1); - - return PyInt_FromLong(retval); -} - -static PyObject * -forms_qtest(PyObject *self, PyObject *args) -{ - long retval; - retval = fl_qtest(); - return PyInt_FromLong(retval); -} - - -static PyObject * -forms_qread(PyObject *self, PyObject *args) -{ - int dev; - short val; - Py_BEGIN_ALLOW_THREADS - dev = fl_qread(&val); - Py_END_ALLOW_THREADS - return Py_BuildValue("(ih)", dev, val); -} - -static PyObject * -forms_qreset(PyObject *self) -{ - fl_qreset(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_qenter(PyObject *self, PyObject *args) -{ - short arg1, arg2; - if (!PyArg_Parse(args, "(hh)", &arg1, &arg2)) - return NULL; - fl_qenter(arg1, arg2); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_color(PyObject *self, PyObject *args) -{ - int arg; - - if (!PyArg_Parse(args, "i", &arg)) return NULL; - - fl_color((short) arg); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_mapcolor(PyObject *self, PyObject *args) -{ - int arg0, arg1, arg2, arg3; - - if (!PyArg_Parse(args, "(iiii)", &arg0, &arg1, &arg2, &arg3)) - return NULL; - - fl_mapcolor(arg0, (short) arg1, (short) arg2, (short) arg3); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_getmcolor(PyObject *self, PyObject *args) -{ - int arg; - short r, g, b; - - if (!PyArg_Parse(args, "i", &arg)) return NULL; - - fl_getmcolor(arg, &r, &g, &b); - - return Py_BuildValue("(hhh)", r, g, b); -} - -static PyObject * -forms_get_mouse(PyObject *self) -{ - float x, y; - - fl_get_mouse(&x, &y); - - return Py_BuildValue("(ff)", x, y); -} - -static PyObject * -forms_tie(PyObject *self, PyObject *args) -{ - short arg1, arg2, arg3; - if (!PyArg_Parse(args, "(hhh)", &arg1, &arg2, &arg3)) - return NULL; - fl_tie(arg1, arg2, arg3); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_show_message(PyObject *f, PyObject *args) -{ - char *a, *b, *c; - - if (!PyArg_Parse(args, "(sss)", &a, &b, &c)) return NULL; - - Py_BEGIN_ALLOW_THREADS - fl_show_message(a, b, c); - Py_END_ALLOW_THREADS - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -forms_show_choice(PyObject *f, PyObject *args) -{ - char *m1, *m2, *m3, *b1, *b2, *b3; - int nb; - char *format; - long rv; - - if (args == NULL || !PyTuple_Check(args)) { - PyErr_BadArgument(); - return NULL; - } - nb = PyTuple_Size(args) - 3; - if (nb <= 0) { - PyErr_SetString(PyExc_TypeError, - "need at least one button label"); - return NULL; - } - if (PyInt_Check(PyTuple_GetItem(args, 3))) { - PyErr_SetString(PyExc_TypeError, - "'number-of-buttons' argument not needed"); - return NULL; - } - switch (nb) { - case 1: format = "(ssss)"; break; - case 2: format = "(sssss)"; break; - case 3: format = "(ssssss)"; break; - default: - PyErr_SetString(PyExc_TypeError, "too many button labels"); - return NULL; - } - - if (!PyArg_Parse(args, format, &m1, &m2, &m3, &b1, &b2, &b3)) - return NULL; - - Py_BEGIN_ALLOW_THREADS - rv = fl_show_choice(m1, m2, m3, nb, b1, b2, b3); - Py_END_ALLOW_THREADS - return PyInt_FromLong(rv); -} - -static PyObject * -forms_show_question(PyObject *f, PyObject *args) -{ - int ret; - char *a, *b, *c; - - if (!PyArg_Parse(args, "(sss)", &a, &b, &c)) return NULL; - - Py_BEGIN_ALLOW_THREADS - ret = fl_show_question(a, b, c); - Py_END_ALLOW_THREADS - - return PyInt_FromLong((long) ret); -} - -static PyObject * -forms_show_input(PyObject *f, PyObject *args) -{ - char *str; - char *a, *b; - - if (!PyArg_Parse(args, "(ss)", &a, &b)) return NULL; - - Py_BEGIN_ALLOW_THREADS - str = fl_show_input(a, b); - Py_END_ALLOW_THREADS - - if (str == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return PyString_FromString(str); -} - -static PyObject * -forms_file_selector(PyObject *f, PyObject *args) -{ - char *str; - char *a, *b, *c, *d; - - if (!PyArg_Parse(args, "(ssss)", &a, &b, &c, &d)) return NULL; - - Py_BEGIN_ALLOW_THREADS - str = fl_show_file_selector(a, b, c, d); - Py_END_ALLOW_THREADS - - if (str == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return PyString_FromString(str); -} - - -static PyObject * -forms_file_selector_func(PyObject *args, char *(*func)(void)) -{ - char *str; - - str = (*func) (); - - if (str == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return PyString_FromString(str); -} - -static PyObject * -forms_get_directory(PyObject *f, PyObject *args) -{ - return forms_file_selector_func(args, fl_get_directory); -} - -static PyObject * -forms_get_pattern(PyObject *f, PyObject *args) -{ - return forms_file_selector_func(args, fl_get_pattern); -} - -static PyObject * -forms_get_filename(PyObject *f, PyObject *args) -{ - return forms_file_selector_func(args, fl_get_filename); -} - -static PyMethodDef forms_methods[] = { -/* adm */ - {"make_form", forms_make_form, METH_OLDARGS}, - {"activate_all_forms", forms_activate_all_forms, METH_OLDARGS}, - {"deactivate_all_forms",forms_deactivate_all_forms, METH_OLDARGS}, -/* gl support wrappers */ - {"qdevice", forms_qdevice, METH_OLDARGS}, - {"unqdevice", forms_unqdevice, METH_OLDARGS}, - {"isqueued", forms_isqueued, METH_OLDARGS}, - {"qtest", forms_qtest, METH_OLDARGS}, - {"qread", forms_qread, METH_OLDARGS}, -/* {"blkqread", forms_blkqread, METH_OLDARGS}, */ - {"qreset", forms_qreset, METH_NOARGS}, - {"qenter", forms_qenter, METH_OLDARGS}, - {"get_mouse", forms_get_mouse, METH_NOARGS}, - {"tie", forms_tie, METH_OLDARGS}, -/* {"new_events", forms_new_events, METH_OLDARGS}, */ - {"color", forms_color, METH_OLDARGS}, - {"mapcolor", forms_mapcolor, METH_OLDARGS}, - {"getmcolor", forms_getmcolor, METH_OLDARGS}, -/* interaction */ - {"do_forms", forms_do_forms, METH_NOARGS}, - {"do_only_forms", forms_do_only_forms, METH_NOARGS}, - {"check_forms", forms_check_forms, METH_NOARGS}, - {"check_only_forms", forms_check_only_forms, METH_NOARGS}, - {"set_event_call_back", forms_set_event_call_back, METH_OLDARGS}, -/* goodies */ - {"show_message", forms_show_message, METH_OLDARGS}, - {"show_question", forms_show_question, METH_OLDARGS}, - {"show_choice", forms_show_choice, METH_OLDARGS}, - {"show_input", forms_show_input, METH_OLDARGS}, - {"show_file_selector", forms_file_selector, METH_OLDARGS}, - {"file_selector", forms_file_selector, METH_OLDARGS}, /* BW compat */ - {"get_directory", forms_get_directory, METH_OLDARGS}, - {"get_pattern", forms_get_pattern, METH_OLDARGS}, - {"get_filename", forms_get_filename, METH_OLDARGS}, - {"set_graphics_mode", forms_set_graphics_mode, METH_OLDARGS}, - {"get_rgbmode", forms_get_rgbmode, METH_OLDARGS}, - {"show_errors", forms_show_errors, METH_OLDARGS}, - {"set_font_name", forms_set_font_name, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -PyMODINIT_FUNC -initfl(void) -{ - - if (PyErr_WarnPy3k("the fl module has been removed in " - "Python 3.0", 2) < 0) - return; - - Py_InitModule("fl", forms_methods); - if (m == NULL) - return; - foreground(); - fl_init(); -} - - - diff --git a/Modules/fmmodule.c b/Modules/fmmodule.c deleted file mode 100644 index 3a741070c0b..00000000000 --- a/Modules/fmmodule.c +++ /dev/null @@ -1,269 +0,0 @@ - -/* Font Manager module */ - -#include "Python.h" - -#include <gl.h> -#include <device.h> -#include <fmclient.h> - - -/* Font Handle object implementation */ - -typedef struct { - PyObject_HEAD - fmfonthandle fh_fh; -} fhobject; - -static PyTypeObject Fhtype; - -#define is_fhobject(v) ((v)->ob_type == &Fhtype) - -static PyObject * -newfhobject(fmfonthandle fh) -{ - fhobject *fhp; - if (fh == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "error creating new font handle"); - return NULL; - } - fhp = PyObject_New(fhobject, &Fhtype); - if (fhp == NULL) - return NULL; - fhp->fh_fh = fh; - return (PyObject *)fhp; -} - -/* Font Handle methods */ - -static PyObject * -fh_scalefont(fhobject *self, PyObject *args) -{ - double size; - if (!PyArg_ParseTuple(args, "d", &size)) - return NULL; - return newfhobject(fmscalefont(self->fh_fh, size)); -} - -/* XXX fmmakefont */ - -static PyObject * -fh_setfont(fhobject *self) -{ - fmsetfont(self->fh_fh); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -fh_getfontname(fhobject *self) -{ - char fontname[256]; - int len; - len = fmgetfontname(self->fh_fh, sizeof fontname, fontname); - if (len < 0) { - PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontname"); - return NULL; - } - return PyString_FromStringAndSize(fontname, len); -} - -static PyObject * -fh_getcomment(fhobject *self) -{ - char comment[256]; - int len; - len = fmgetcomment(self->fh_fh, sizeof comment, comment); - if (len < 0) { - PyErr_SetString(PyExc_RuntimeError, "error in fmgetcomment"); - return NULL; - } - return PyString_FromStringAndSize(comment, len); -} - -static PyObject * -fh_getfontinfo(fhobject *self) -{ - fmfontinfo info; - if (fmgetfontinfo(self->fh_fh, &info) < 0) { - PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontinfo"); - return NULL; - } - return Py_BuildValue("(llllllll)", - info.printermatched, - info.fixed_width, - info.xorig, - info.yorig, - info.xsize, - info.ysize, - info.height, - info.nglyphs); -} - -#if 0 -static PyObject * -fh_getwholemetrics(fhobject *self, PyObject *args) -{ -} -#endif - -static PyObject * -fh_getstrwidth(fhobject *self, PyObject *args) -{ - char *str; - if (!PyArg_ParseTuple(args, "s", &str)) - return NULL; - return PyInt_FromLong(fmgetstrwidth(self->fh_fh, str)); -} - -static PyMethodDef fh_methods[] = { - {"scalefont", (PyCFunction)fh_scalefont, METH_VARARGS}, - {"setfont", (PyCFunction)fh_setfont, METH_NOARGS}, - {"getfontname", (PyCFunction)fh_getfontname, METH_NOARGS}, - {"getcomment", (PyCFunction)fh_getcomment, METH_NOARGS}, - {"getfontinfo", (PyCFunction)fh_getfontinfo, METH_NOARGS}, -#if 0 - {"getwholemetrics", (PyCFunction)fh_getwholemetrics, METH_VARARGS}, -#endif - {"getstrwidth", (PyCFunction)fh_getstrwidth, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - -static PyObject * -fh_getattr(fhobject *fhp, char *name) -{ - return Py_FindMethod(fh_methods, (PyObject *)fhp, name); -} - -static void -fh_dealloc(fhobject *fhp) -{ - fmfreefont(fhp->fh_fh); - PyObject_Del(fhp); -} - -static PyTypeObject Fhtype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "fm.font handle", /*tp_name*/ - sizeof(fhobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)fh_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)fh_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ -}; - - -/* Font Manager functions */ - -static PyObject * -fm_init(PyObject *self) -{ - fminit(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -fm_findfont(PyObject *self, PyObject *args) -{ - char *str; - if (!PyArg_ParseTuple(args, "s", &str)) - return NULL; - return newfhobject(fmfindfont(str)); -} - -static PyObject * -fm_prstr(PyObject *self, PyObject *args) -{ - char *str; - if (!PyArg_ParseTuple(args, "s", &str)) - return NULL; - fmprstr(str); - Py_INCREF(Py_None); - return Py_None; -} - -/* XXX This uses a global variable as temporary! Not re-entrant! */ - -static PyObject *fontlist; - -static void -clientproc(char *fontname) -{ - int err; - PyObject *v; - if (fontlist == NULL) - return; - v = PyString_FromString(fontname); - if (v == NULL) - err = -1; - else { - err = PyList_Append(fontlist, v); - Py_DECREF(v); - } - if (err != 0) { - Py_DECREF(fontlist); - fontlist = NULL; - } -} - -static PyObject * -fm_enumerate(PyObject *self) -{ - PyObject *res; - fontlist = PyList_New(0); - if (fontlist == NULL) - return NULL; - fmenumerate(clientproc); - res = fontlist; - fontlist = NULL; - return res; -} - -static PyObject * -fm_setpath(PyObject *self, PyObject *args) -{ - char *str; - if (!PyArg_ParseTuple(args, "s", &str)) - return NULL; - fmsetpath(str); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -fm_fontpath(PyObject *self) -{ - return PyString_FromString(fmfontpath()); -} - -static PyMethodDef fm_methods[] = { - {"init", fm_init, METH_NOARGS}, - {"findfont", fm_findfont, METH_VARARGS}, - {"enumerate", fm_enumerate, METH_NOARGS}, - {"prstr", fm_prstr, METH_VARARGS}, - {"setpath", fm_setpath, METH_VARARGS}, - {"fontpath", fm_fontpath, METH_NOARGS}, - {NULL, NULL} /* sentinel */ -}; - - -void -initfm(void) -{ - - if (PyErr_WarnPy3k("the fm module has been removed in " - "Python 3.0", 2) < 0) - return; - - Py_InitModule("fm", fm_methods); - if (m == NULL) - return; - fminit(); -} diff --git a/Modules/fpectlmodule.c b/Modules/fpectlmodule.c index faa279b6b2e..1bb51cf7e34 100644 --- a/Modules/fpectlmodule.c +++ b/Modules/fpectlmodule.c @@ -90,7 +90,8 @@ static Sigfunc sigfpe_handler; static void fpe_reset(Sigfunc *); static PyObject *fpe_error; -PyMODINIT_FUNC initfpectl(void); + +PyMODINIT_FUNC PyInit_fpectl(void); static PyObject *turnon_sigfpe (PyObject *self,PyObject *args); static PyObject *turnoff_sigfpe (PyObject *self,PyObject *args); @@ -286,16 +287,29 @@ static void sigfpe_handler(int signo) } } -PyMODINIT_FUNC initfpectl(void) +static struct PyModuleDef fpectlmodule = { + PyModuleDef_HEAD_INIT, + "fpectl", + NULL, + -1, + fpectl_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC PyInit_fpectl(void) { PyObject *m, *d; - m = Py_InitModule("fpectl", fpectl_methods); + m = PyModule_Create(&fpectlmodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); fpe_error = PyErr_NewException("fpectl.error", NULL, NULL); if (fpe_error != NULL) PyDict_SetItemString(d, "error", fpe_error); + return m; } #ifdef __cplusplus diff --git a/Modules/fpetestmodule.c b/Modules/fpetestmodule.c index 22e95dbaef1..5b6c220d9bf 100644 --- a/Modules/fpetestmodule.c +++ b/Modules/fpetestmodule.c @@ -1,6 +1,6 @@ /* - --------------------------------------------------------------------- - / Copyright (c) 1996. \ + --------------------------------------------------------------------- + / Copyright (c) 1996. \ | The Regents of the University of California. | | All rights reserved. | | | @@ -32,19 +32,20 @@ | opinions of authors expressed herein do not necessarily state or | | reflect those of the United States Government or the University | | of California, and shall not be used for advertising or product | - \ endorsement purposes. / - --------------------------------------------------------------------- + \ endorsement purposes. / + --------------------------------------------------------------------- */ /* - Floating point exception test module. + Floating point exception test module. */ #include "Python.h" static PyObject *fpe_error; -PyMODINIT_FUNC initfpetest(void); + +PyMODINIT_FUNC PyInit_fpetest(void); static PyObject *test(PyObject *self,PyObject *args); static double db0(double); static double overflow(double); @@ -54,7 +55,7 @@ static double nest3(double); static void printerr(double); static PyMethodDef fpetest_methods[] = { - {"test", (PyCFunction) test, METH_VARARGS}, + {"test", (PyCFunction) test, METH_VARARGS}, {0,0} }; @@ -172,15 +173,28 @@ static double overflow(double b) return a; } -PyMODINIT_FUNC initfpetest(void) +static struct PyModuleDef fpetestmodule = { + PyModuleDef_HEAD_INIT, + "fpetest", + NULL, + -1, + fpetest_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC PyInit_fpetest(void) { PyObject *m, *d; - m = Py_InitModule("fpetest", fpetest_methods); + m = PyModule_Create(&fpetestmodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); fpe_error = PyErr_NewException("fpetest.error", NULL, NULL); if (fpe_error != NULL) - PyDict_SetItemString(d, "error", fpe_error); + PyDict_SetItemString(d, "error", fpe_error); + return m; } diff --git a/Modules/future_builtins.c b/Modules/future_builtins.c deleted file mode 100644 index b2a3ed88558..00000000000 --- a/Modules/future_builtins.c +++ /dev/null @@ -1,105 +0,0 @@ - -/* future_builtins module */ - -/* This module provides functions that will be builtins in Python 3.0, - but that conflict with builtins that already exist in Python - 2.x. */ - - -#include "Python.h" - -PyDoc_STRVAR(module_doc, -"This module provides functions that will be builtins in Python 3.0,\n\ -but that conflict with builtins that already exist in Python 2.x.\n\ -\n\ -Functions:\n\ -\n\ -ascii(arg) -- Returns the canonical string representation of an object.\n\ -filter(pred, iterable) -- Returns an iterator yielding those items of \n\ - iterable for which pred(item) is true.\n\ -hex(arg) -- Returns the hexadecimal representation of an integer.\n\ -map(func, *iterables) -- Returns an iterator that computes the function \n\ - using arguments from each of the iterables.\n\ -oct(arg) -- Returns the octal representation of an integer.\n\ -zip(iter1 [,iter2 [...]]) -- Returns a zip object whose .next() method \n\ - returns a tuple where the i-th element comes from the i-th iterable \n\ - argument.\n\ -\n\ -The typical usage of this module is to replace existing builtins in a\n\ -module's namespace:\n \n\ -from future_builtins import ascii, filter, map, hex, oct, zip\n"); - -static PyObject * -builtin_hex(PyObject *self, PyObject *v) -{ - return PyNumber_ToBase(v, 16); -} - -PyDoc_STRVAR(hex_doc, -"hex(number) -> string\n\ -\n\ -Return the hexadecimal representation of an integer or long integer."); - - -static PyObject * -builtin_oct(PyObject *self, PyObject *v) -{ - return PyNumber_ToBase(v, 8); -} - -PyDoc_STRVAR(oct_doc, -"oct(number) -> string\n\ -\n\ -Return the octal representation of an integer or long integer."); - - -static PyObject * -builtin_ascii(PyObject *self, PyObject *v) -{ - return PyObject_Repr(v); -} - -PyDoc_STRVAR(ascii_doc, -"ascii(object) -> string\n\ -\n\ -Return the same as repr(). In Python 3.x, the repr() result will\n\ -contain printable characters unescaped, while the ascii() result\n\ -will have such characters backslash-escaped."); - -/* List of functions exported by this module */ - -static PyMethodDef module_functions[] = { - {"hex", builtin_hex, METH_O, hex_doc}, - {"oct", builtin_oct, METH_O, oct_doc}, - {"ascii", builtin_ascii, METH_O, ascii_doc}, - {NULL, NULL} /* Sentinel */ -}; - - -/* Initialize this module. */ - -PyMODINIT_FUNC -initfuture_builtins(void) -{ - PyObject *m, *itertools, *iter_func; - char *it_funcs[] = {"imap", "ifilter", "izip", NULL}; - char **cur_func; - - m = Py_InitModule3("future_builtins", module_functions, module_doc); - if (m == NULL) - return; - - itertools = PyImport_ImportModuleNoBlock("itertools"); - if (itertools == NULL) - return; - - /* If anything in the following loop fails, we fall through. */ - for (cur_func = it_funcs; *cur_func; ++cur_func){ - iter_func = PyObject_GetAttrString(itertools, *cur_func); - if (iter_func == NULL || - PyModule_AddObject(m, *cur_func+1, iter_func) < 0) - break; - } - Py_DECREF(itertools); - /* any other initialization needed */ -} diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 81344ca828c..8c524f8309d 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -9,9 +9,14 @@ Eric Tiedemann, and various others. http://www.arctrix.com/nas/python/gc/ - http://www.python.org/pipermail/python-dev/2000-March/003869.html - http://www.python.org/pipermail/python-dev/2000-March/004010.html - http://www.python.org/pipermail/python-dev/2000-March/004022.html + + The following mailing list threads provide a historical perspective on + the design of this module. Note that a fair amount of refinement has + occurred since those discussions. + + http://mail.python.org/pipermail/python-dev/2000-March/002385.html + http://mail.python.org/pipermail/python-dev/2000-March/002434.html + http://mail.python.org/pipermail/python-dev/2000-March/002497.html For a highlevel view of the collection process, read the collect function. @@ -156,13 +161,9 @@ static Py_ssize_t long_lived_pending = 0; #define DEBUG_STATS (1<<0) /* print collection statistics */ #define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */ #define DEBUG_UNCOLLECTABLE (1<<2) /* print uncollectable objects */ -#define DEBUG_INSTANCES (1<<3) /* print instances */ -#define DEBUG_OBJECTS (1<<4) /* print other objects */ #define DEBUG_SAVEALL (1<<5) /* save all garbage in gc.garbage */ #define DEBUG_LEAK DEBUG_COLLECTABLE | \ DEBUG_UNCOLLECTABLE | \ - DEBUG_INSTANCES | \ - DEBUG_OBJECTS | \ DEBUG_SAVEALL static int debug; static PyObject *tmod = NULL; @@ -493,28 +494,6 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) } } -/* Return true if object has a finalization method. - * CAUTION: An instance of an old-style class has to be checked for a - *__del__ method, and earlier versions of this used to call PyObject_HasAttr, - * which in turn could call the class's __getattr__ hook (if any). That - * could invoke arbitrary Python code, mutating the object graph in arbitrary - * ways, and that was the source of some excruciatingly subtle bugs. - */ -static int -has_finalizer(PyObject *op) -{ - if (PyInstance_Check(op)) { - assert(delstr != NULL); - return _PyInstance_Lookup(op, delstr) != NULL; - } - else if (PyType_HasFeature(op->ob_type, Py_TPFLAGS_HEAPTYPE)) - return op->ob_type->tp_del != NULL; - else if (PyGen_CheckExact(op)) - return PyGen_NeedsFinalizing((PyGenObject *)op); - else - return 0; -} - /* Try to untrack all currently tracked dictionaries */ static void untrack_dicts(PyGC_Head *head) @@ -529,6 +508,16 @@ untrack_dicts(PyGC_Head *head) } } +/* Return true if object has a finalization method. */ +static int +has_finalizer(PyObject *op) +{ + if (PyGen_CheckExact(op)) + return PyGen_NeedsFinalizing((PyGenObject *)op); + else + return op->ob_type->tp_del != NULL; +} + /* Move the objects in unreachable with __del__ methods into `finalizers`. * Objects moved into `finalizers` have gc_refs set to GC_REACHABLE; the * objects remaining in unreachable are left at GC_TENTATIVELY_UNREACHABLE. @@ -740,29 +729,10 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) } static void -debug_instance(char *msg, PyInstanceObject *inst) -{ - char *cname; - /* simple version of instance_repr */ - PyObject *classname = inst->in_class->cl_name; - if (classname != NULL && PyString_Check(classname)) - cname = PyString_AsString(classname); - else - cname = "?"; - PySys_WriteStderr("gc: %.100s <%.100s instance at %p>\n", - msg, cname, inst); -} - -static void debug_cycle(char *msg, PyObject *op) { - if ((debug & DEBUG_INSTANCES) && PyInstance_Check(op)) { - debug_instance(msg, (PyInstanceObject *)op); - } - else if (debug & DEBUG_OBJECTS) { - PySys_WriteStderr("gc: %.100s <%.100s %p>\n", - msg, Py_TYPE(op)->tp_name, op); - } + PySys_WriteStderr("gc: %.100s <%.100s %p>\n", + msg, Py_TYPE(op)->tp_name, op); } /* Handle uncollectable garbage (cycles with finalizers, and stuff reachable @@ -841,10 +811,7 @@ clear_freelists(void) (void)PyFrame_ClearFreeList(); (void)PyCFunction_ClearFreeList(); (void)PyTuple_ClearFreeList(); -#ifdef Py_USING_UNICODE (void)PyUnicode_ClearFreeList(); -#endif - (void)PyInt_ClearFreeList(); (void)PyFloat_ClearFreeList(); } @@ -882,7 +849,7 @@ collect(int generation) double t1 = 0.0; if (delstr == NULL) { - delstr = PyString_InternFromString("__del__"); + delstr = PyUnicode_InternFromString("__del__"); if (delstr == NULL) Py_FatalError("gc couldn't allocate \"__del__\""); } @@ -1022,7 +989,7 @@ collect(int generation) if (PyErr_Occurred()) { if (gc_str == NULL) - gc_str = PyString_FromString("garbage collection"); + gc_str = PyUnicode_FromString("garbage collection"); PyErr_WriteUnraisable(gc_str); Py_FatalError("unexpected exception during garbage collection"); } @@ -1122,7 +1089,7 @@ gc_collect(PyObject *self, PyObject *args, PyObject *kws) collecting = 0; } - return PyInt_FromSsize_t(n); + return PyLong_FromSsize_t(n); } PyDoc_STRVAR(gc_set_debug__doc__, @@ -1136,8 +1103,6 @@ PyDoc_STRVAR(gc_set_debug__doc__, " DEBUG_STATS - Print statistics during collection.\n" " DEBUG_COLLECTABLE - Print collectable objects found.\n" " DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects found.\n" -" DEBUG_INSTANCES - Print instance objects.\n" -" DEBUG_OBJECTS - Print objects other than instances.\n" " DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n" " DEBUG_LEAK - Debug leaking programs (everything but STATS).\n"); @@ -1382,27 +1347,36 @@ static PyMethodDef GcMethods[] = { {NULL, NULL} /* Sentinel */ }; +static struct PyModuleDef gcmodule = { + PyModuleDef_HEAD_INIT, + "gc", /* m_name */ + gc__doc__, /* m_doc */ + -1, /* m_size */ + GcMethods, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; + PyMODINIT_FUNC -initgc(void) +PyInit_gc(void) { PyObject *m; - m = Py_InitModule4("gc", - GcMethods, - gc__doc__, - NULL, - PYTHON_API_VERSION); + m = PyModule_Create(&gcmodule); + if (m == NULL) - return; + return NULL; if (garbage == NULL) { garbage = PyList_New(0); if (garbage == NULL) - return; + return NULL; } Py_INCREF(garbage); if (PyModule_AddObject(m, "garbage", garbage) < 0) - return; + return NULL; /* Importing can't be done in collect() because collect() * can be called via PyGC_Collect() in Py_Finalize(). @@ -1416,15 +1390,14 @@ initgc(void) PyErr_Clear(); } -#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return +#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return NULL ADD_INT(DEBUG_STATS); ADD_INT(DEBUG_COLLECTABLE); ADD_INT(DEBUG_UNCOLLECTABLE); - ADD_INT(DEBUG_INSTANCES); - ADD_INT(DEBUG_OBJECTS); ADD_INT(DEBUG_SAVEALL); ADD_INT(DEBUG_LEAK); #undef ADD_INT + return m; } /* API to invoke gc.collect() from C */ @@ -1444,6 +1417,38 @@ PyGC_Collect(void) return n; } +void +_PyGC_Fini(void) +{ + if (!(debug & DEBUG_SAVEALL) + && garbage != NULL && PyList_GET_SIZE(garbage) > 0) { + char *message; + if (debug & DEBUG_UNCOLLECTABLE) + message = "gc: %zd uncollectable objects at " \ + "shutdown"; + 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_WriteUnraisable(NULL); + if (debug & DEBUG_UNCOLLECTABLE) { + PyObject *repr = NULL, *bytes = NULL; + repr = PyObject_Repr(garbage); + if (!repr || !(bytes = PyUnicode_EncodeFSDefault(repr))) + PyErr_WriteUnraisable(garbage); + else { + PySys_WriteStderr( + " %s\n", + PyBytes_AS_STRING(bytes) + ); + } + Py_XDECREF(repr); + Py_XDECREF(bytes); + } + } +} + /* for debugging */ void _PyGC_Dump(PyGC_Head *g) @@ -1560,11 +1565,3 @@ PyObject_GC_Del(void *op) } PyObject_FREE(g); } - -/* for binary compatibility with 2.2 */ -#undef _PyObject_GC_Del -void -_PyObject_GC_Del(PyObject *op) -{ - PyObject_GC_Del(op); -} diff --git a/Modules/getaddrinfo.c b/Modules/getaddrinfo.c index 9d054d04621..e2a2edf82d3 100644 --- a/Modules/getaddrinfo.c +++ b/Modules/getaddrinfo.c @@ -129,12 +129,12 @@ static struct gai_afd { #define IN_LOOPBACKNET 127 #endif -static int get_name Py_PROTO((const char *, struct gai_afd *, +static int get_name(const char *, struct gai_afd *, struct addrinfo **, char *, struct addrinfo *, - int)); -static int get_addr Py_PROTO((const char *, int, struct addrinfo **, - struct addrinfo *, int)); -static int str_isnumber Py_PROTO((const char *)); + int); +static int get_addr(const char *, int, struct addrinfo **, + struct addrinfo *, int); +static int str_isnumber(const char *); static char *ai_errlist[] = { "success.", diff --git a/Modules/getnameinfo.c b/Modules/getnameinfo.c index f7985c9acde..f014c11ae15 100644 --- a/Modules/getnameinfo.c +++ b/Modules/getnameinfo.c @@ -82,8 +82,8 @@ struct gni_sockinet { #define ENI_SALEN 6 /* forward declaration to make gcc happy */ -int getnameinfo Py_PROTO((const struct sockaddr *, size_t, char *, size_t, - char *, size_t, int)); +int getnameinfo(const struct sockaddr *, size_t, char *, size_t, + char *, size_t, int); int getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) diff --git a/Modules/getpath.c b/Modules/getpath.c index 9faafa3555d..b7f9573f696 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -48,7 +48,7 @@ * argv0_path. For prefix, the landmark's path is derived from the VPATH * preprocessor variable (taking into account that its value is almost, but * not quite, what we need). For exec_prefix, the landmark is - * Modules/Setup. If the landmark is found, we're done. + * pybuilddir.txt. If the landmark is found, we're done. * * For the remaining steps, the prefix landmark will always be * lib/python$VERSION/os.py and the exec_prefix will always be @@ -89,6 +89,11 @@ * directory). This seems to make more sense given that currently the only * known use of sys.prefix and sys.exec_prefix is for the ILU installation * process to find the installed Python tree. + * + * An embedding application can use Py_SetPath() to override all of + * these authomatic path computations. + * + * NOTE: Windows MSVC builds use PC/getpathp.c instead! */ #ifdef __cplusplus @@ -122,30 +127,30 @@ #endif #ifndef LANDMARK -#define LANDMARK "os.py" +#define LANDMARK L"os.py" #endif -static char prefix[MAXPATHLEN+1]; -static char exec_prefix[MAXPATHLEN+1]; -static char progpath[MAXPATHLEN+1]; -static char *module_search_path = NULL; -static char lib_python[] = "lib/python" VERSION; +static wchar_t prefix[MAXPATHLEN+1]; +static wchar_t exec_prefix[MAXPATHLEN+1]; +static wchar_t progpath[MAXPATHLEN+1]; +static wchar_t *module_search_path = NULL; +static int module_search_path_malloced = 0; +static wchar_t *lib_python = L"lib/python" VERSION; static void -reduce(char *dir) +reduce(wchar_t *dir) { - size_t i = strlen(dir); + size_t i = wcslen(dir); while (i > 0 && dir[i] != SEP) --i; dir[i] = '\0'; } - static int -isfile(char *filename) /* Is file, not directory */ +isfile(wchar_t *filename) /* Is file, not directory */ { struct stat buf; - if (stat(filename, &buf) != 0) + if (_Py_wstat(filename, &buf) != 0) return 0; if (!S_ISREG(buf.st_mode)) return 0; @@ -154,14 +159,14 @@ isfile(char *filename) /* Is file, not directory */ static int -ismodule(char *filename) /* Is module -- check for .pyc/.pyo too */ +ismodule(wchar_t *filename) /* Is module -- check for .pyc/.pyo too */ { if (isfile(filename)) return 1; /* Check for the compiled version of prefix. */ - if (strlen(filename) < MAXPATHLEN) { - strcat(filename, Py_OptimizeFlag ? "o" : "c"); + if (wcslen(filename) < MAXPATHLEN) { + wcscat(filename, Py_OptimizeFlag ? L"o" : L"c"); if (isfile(filename)) return 1; } @@ -170,10 +175,10 @@ ismodule(char *filename) /* Is module -- check for .pyc/.pyo too */ static int -isxfile(char *filename) /* Is executable file */ +isxfile(wchar_t *filename) /* Is executable file */ { struct stat buf; - if (stat(filename, &buf) != 0) + if (_Py_wstat(filename, &buf) != 0) return 0; if (!S_ISREG(buf.st_mode)) return 0; @@ -184,10 +189,10 @@ isxfile(char *filename) /* Is executable file */ static int -isdir(char *filename) /* Is directory */ +isdir(wchar_t *filename) /* Is directory */ { struct stat buf; - if (stat(filename, &buf) != 0) + if (_Py_wstat(filename, &buf) != 0) return 0; if (!S_ISDIR(buf.st_mode)) return 0; @@ -205,36 +210,36 @@ isdir(char *filename) /* Is directory */ stuff as fits will be appended. */ static void -joinpath(char *buffer, char *stuff) +joinpath(wchar_t *buffer, wchar_t *stuff) { size_t n, k; if (stuff[0] == SEP) n = 0; else { - n = strlen(buffer); + n = wcslen(buffer); if (n > 0 && buffer[n-1] != SEP && n < MAXPATHLEN) buffer[n++] = SEP; } if (n > MAXPATHLEN) Py_FatalError("buffer overflow in getpath.c's joinpath()"); - k = strlen(stuff); + k = wcslen(stuff); if (n + k > MAXPATHLEN) k = MAXPATHLEN - n; - strncpy(buffer+n, stuff, k); + wcsncpy(buffer+n, stuff, k); buffer[n+k] = '\0'; } /* copy_absolute requires that path be allocated at least MAXPATHLEN + 1 bytes and that p be no more than MAXPATHLEN bytes. */ static void -copy_absolute(char *path, char *p) +copy_absolute(wchar_t *path, wchar_t *p, size_t pathlen) { if (p[0] == SEP) - strcpy(path, p); + wcscpy(path, p); else { - if (!getcwd(path, MAXPATHLEN)) { + if (!_Py_wgetcwd(path, pathlen)) { /* unable to get the current directory */ - strcpy(path, p); + wcscpy(path, p); return; } if (p[0] == '.' && p[1] == SEP) @@ -245,65 +250,68 @@ copy_absolute(char *path, char *p) /* absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes. */ static void -absolutize(char *path) +absolutize(wchar_t *path) { - char buffer[MAXPATHLEN + 1]; + wchar_t buffer[MAXPATHLEN+1]; if (path[0] == SEP) return; - copy_absolute(buffer, path); - strcpy(path, buffer); + copy_absolute(buffer, path, MAXPATHLEN+1); + wcscpy(path, buffer); } /* search_for_prefix requires that argv0_path be no more than MAXPATHLEN bytes long. */ static int -search_for_prefix(char *argv0_path, char *home) +search_for_prefix(wchar_t *argv0_path, wchar_t *home, wchar_t *_prefix) { size_t n; - char *vpath; + wchar_t *vpath; /* If PYTHONHOME is set, we believe it unconditionally */ if (home) { - char *delim; - strncpy(prefix, home, MAXPATHLEN); - delim = strchr(prefix, DELIM); + wchar_t *delim; + wcsncpy(prefix, home, MAXPATHLEN); + delim = wcschr(prefix, DELIM); if (delim) - *delim = '\0'; + *delim = L'\0'; joinpath(prefix, lib_python); joinpath(prefix, LANDMARK); return 1; } /* Check to see if argv[0] is in the build directory */ - strcpy(prefix, argv0_path); - joinpath(prefix, "Modules/Setup"); + wcscpy(prefix, argv0_path); + joinpath(prefix, L"Modules/Setup"); if (isfile(prefix)) { /* Check VPATH to see if argv0_path is in the build directory. */ - vpath = VPATH; - strcpy(prefix, argv0_path); - joinpath(prefix, vpath); - joinpath(prefix, "Lib"); - joinpath(prefix, LANDMARK); - if (ismodule(prefix)) - return -1; + vpath = _Py_char2wchar(VPATH, NULL); + if (vpath != NULL) { + wcscpy(prefix, argv0_path); + joinpath(prefix, vpath); + PyMem_Free(vpath); + joinpath(prefix, L"Lib"); + joinpath(prefix, LANDMARK); + if (ismodule(prefix)) + return -1; + } } /* Search from argv0_path, until root is found */ - copy_absolute(prefix, argv0_path); + copy_absolute(prefix, argv0_path, MAXPATHLEN+1); do { - n = strlen(prefix); + n = wcslen(prefix); joinpath(prefix, lib_python); joinpath(prefix, LANDMARK); if (ismodule(prefix)) return 1; - prefix[n] = '\0'; + prefix[n] = L'\0'; reduce(prefix); } while (prefix[0]); /* Look at configure's PREFIX */ - strncpy(prefix, PREFIX, MAXPATHLEN); + wcsncpy(prefix, _prefix, MAXPATHLEN); joinpath(prefix, lib_python); joinpath(prefix, LANDMARK); if (ismodule(prefix)) @@ -318,47 +326,71 @@ search_for_prefix(char *argv0_path, char *home) MAXPATHLEN bytes long. */ static int -search_for_exec_prefix(char *argv0_path, char *home) +search_for_exec_prefix(wchar_t *argv0_path, wchar_t *home, wchar_t *_exec_prefix) { size_t n; /* If PYTHONHOME is set, we believe it unconditionally */ if (home) { - char *delim; - delim = strchr(home, DELIM); + wchar_t *delim; + delim = wcschr(home, DELIM); if (delim) - strncpy(exec_prefix, delim+1, MAXPATHLEN); + wcsncpy(exec_prefix, delim+1, MAXPATHLEN); else - strncpy(exec_prefix, home, MAXPATHLEN); + wcsncpy(exec_prefix, home, MAXPATHLEN); joinpath(exec_prefix, lib_python); - joinpath(exec_prefix, "lib-dynload"); + joinpath(exec_prefix, L"lib-dynload"); return 1; } - /* Check to see if argv[0] is in the build directory */ - strcpy(exec_prefix, argv0_path); - joinpath(exec_prefix, "Modules/Setup"); + /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" + is written by setup.py and contains the relative path to the location + of shared library modules. */ + wcscpy(exec_prefix, argv0_path); + joinpath(exec_prefix, L"pybuilddir.txt"); if (isfile(exec_prefix)) { - reduce(exec_prefix); - return -1; + FILE *f = _Py_wfopen(exec_prefix, L"rb"); + if (f == NULL) + errno = 0; + else { + char buf[MAXPATHLEN+1]; + PyObject *decoded; + wchar_t rel_builddir_path[MAXPATHLEN+1]; + n = fread(buf, 1, MAXPATHLEN, f); + buf[n] = '\0'; + fclose(f); + decoded = PyUnicode_DecodeUTF8(buf, n, "surrogateescape"); + if (decoded != NULL) { + Py_ssize_t k; + k = PyUnicode_AsWideChar(decoded, + rel_builddir_path, MAXPATHLEN); + Py_DECREF(decoded); + if (k >= 0) { + rel_builddir_path[k] = L'\0'; + wcscpy(exec_prefix, argv0_path); + joinpath(exec_prefix, rel_builddir_path); + return -1; + } + } + } } /* Search from argv0_path, until root is found */ - copy_absolute(exec_prefix, argv0_path); + copy_absolute(exec_prefix, argv0_path, MAXPATHLEN+1); do { - n = strlen(exec_prefix); + n = wcslen(exec_prefix); joinpath(exec_prefix, lib_python); - joinpath(exec_prefix, "lib-dynload"); + joinpath(exec_prefix, L"lib-dynload"); if (isdir(exec_prefix)) return 1; - exec_prefix[n] = '\0'; + exec_prefix[n] = L'\0'; reduce(exec_prefix); } while (exec_prefix[0]); /* Look at configure's EXEC_PREFIX */ - strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN); + wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN); joinpath(exec_prefix, lib_python); - joinpath(exec_prefix, "lib-dynload"); + joinpath(exec_prefix, L"lib-dynload"); if (isdir(exec_prefix)) return 1; @@ -366,26 +398,27 @@ search_for_exec_prefix(char *argv0_path, char *home) return 0; } - static void calculate_path(void) { - extern char *Py_GetProgramName(void); - - static char delimiter[2] = {DELIM, '\0'}; - static char separator[2] = {SEP, '\0'}; - char *pythonpath = PYTHONPATH; - char *rtpypath = Py_GETENV("PYTHONPATH"); - char *home = Py_GetPythonHome(); - char *path = getenv("PATH"); - char *prog = Py_GetProgramName(); - char argv0_path[MAXPATHLEN+1]; - char zip_path[MAXPATHLEN+1]; + extern wchar_t *Py_GetProgramName(void); + + static wchar_t delimiter[2] = {DELIM, '\0'}; + static wchar_t separator[2] = {SEP, '\0'}; + char *_rtpypath = Py_GETENV("PYTHONPATH"); /* XXX use wide version on Windows */ + wchar_t rtpypath[MAXPATHLEN+1]; + wchar_t *home = Py_GetPythonHome(); + char *_path = getenv("PATH"); + wchar_t *path_buffer = NULL; + wchar_t *path = NULL; + wchar_t *prog = Py_GetProgramName(); + wchar_t argv0_path[MAXPATHLEN+1]; + wchar_t zip_path[MAXPATHLEN+1]; int pfound, efound; /* 1 if found; -1 if found build directory */ - char *buf; + wchar_t *buf; size_t bufsz; size_t prefixsz; - char *defpath = pythonpath; + wchar_t *defpath; #ifdef WITH_NEXT_FRAMEWORK NSModule pythonModule; #endif @@ -395,15 +428,32 @@ calculate_path(void) #else unsigned long nsexeclength = MAXPATHLEN; #endif + char execpath[MAXPATHLEN+1]; #endif + wchar_t *_pythonpath, *_prefix, *_exec_prefix; - /* If there is no slash in the argv0 path, then we have to - * assume python is on the user's $PATH, since there's no - * other way to find a directory to start the search from. If - * $PATH isn't exported, you lose. - */ - if (strchr(prog, SEP)) - strncpy(progpath, prog, MAXPATHLEN); + _pythonpath = _Py_char2wchar(PYTHONPATH, NULL); + _prefix = _Py_char2wchar(PREFIX, NULL); + _exec_prefix = _Py_char2wchar(EXEC_PREFIX, NULL); + + if (!_pythonpath || !_prefix || !_exec_prefix) { + Py_FatalError( + "Unable to decode path variables in getpath.c: " + "memory error"); + } + + if (_path) { + path_buffer = _Py_char2wchar(_path, NULL); + path = path_buffer; + } + + /* If there is no slash in the argv0 path, then we have to + * assume python is on the user's $PATH, since there's no + * other way to find a directory to start the search from. If + * $PATH isn't exported, you lose. + */ + if (wcschr(prog, SEP)) + wcsncpy(progpath, prog, MAXPATHLEN); #ifdef __APPLE__ /* On Mac OS X, if a script uses an interpreter of the form * "#!/opt/python2.3/bin/python", the kernel only passes "python" @@ -415,50 +465,57 @@ calculate_path(void) * will fail if a relative path was used. but in that case, * absolutize() should help us out below */ - else if(0 == _NSGetExecutablePath(progpath, &nsexeclength) && progpath[0] == SEP) - ; + else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) && execpath[0] == SEP) { + size_t r = mbstowcs(progpath, execpath, MAXPATHLEN+1); + if (r == (size_t)-1 || r > MAXPATHLEN) { + /* Could not convert execpath, or it's too long. */ + progpath[0] = '\0'; + } + } #endif /* __APPLE__ */ - else if (path) { - while (1) { - char *delim = strchr(path, DELIM); - - if (delim) { - size_t len = delim - path; - if (len > MAXPATHLEN) - len = MAXPATHLEN; - strncpy(progpath, path, len); - *(progpath + len) = '\0'; - } - else - strncpy(progpath, path, MAXPATHLEN); - - joinpath(progpath, prog); - if (isxfile(progpath)) - break; - - if (!delim) { - progpath[0] = '\0'; - break; - } - path = delim + 1; - } + else if (path) { + while (1) { + wchar_t *delim = wcschr(path, DELIM); + + if (delim) { + size_t len = delim - path; + if (len > MAXPATHLEN) + len = MAXPATHLEN; + wcsncpy(progpath, path, len); + *(progpath + len) = '\0'; + } + else + wcsncpy(progpath, path, MAXPATHLEN); + + joinpath(progpath, prog); + if (isxfile(progpath)) + break; + + if (!delim) { + progpath[0] = L'\0'; + break; + } + path = delim + 1; } - else - progpath[0] = '\0'; - if (progpath[0] != SEP && progpath[0] != '\0') - absolutize(progpath); - strncpy(argv0_path, progpath, MAXPATHLEN); - argv0_path[MAXPATHLEN] = '\0'; + } + else + progpath[0] = '\0'; + if (path_buffer != NULL) + PyMem_Free(path_buffer); + if (progpath[0] != SEP && progpath[0] != '\0') + absolutize(progpath); + wcsncpy(argv0_path, progpath, MAXPATHLEN); + argv0_path[MAXPATHLEN] = '\0'; #ifdef WITH_NEXT_FRAMEWORK - /* On Mac OS X we have a special case if we're running from a framework. - ** This is because the python home should be set relative to the library, - ** which is in the framework, not relative to the executable, which may - ** be outside of the framework. Except when we're in the build directory... - */ + /* On Mac OS X we have a special case if we're running from a framework. + ** This is because the python home should be set relative to the library, + ** which is in the framework, not relative to the executable, which may + ** be outside of the framework. Except when we're in the build directory... + */ pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize")); /* Use dylib functions to find out where the framework was loaded from */ - buf = (char *)NSLibraryNameForModule(pythonModule); + buf = (wchar_t *)NSLibraryNameForModule(pythonModule); if (buf != NULL) { /* We're in a framework. */ /* See if we might be in the build directory. The framework in the @@ -468,39 +525,37 @@ calculate_path(void) ** be running the interpreter in the build directory, so we use the ** build-directory-specific logic to find Lib and such. */ - strncpy(argv0_path, buf, MAXPATHLEN); + wcsncpy(argv0_path, buf, MAXPATHLEN); reduce(argv0_path); joinpath(argv0_path, lib_python); joinpath(argv0_path, LANDMARK); if (!ismodule(argv0_path)) { - /* We are in the build directory so use the name of the - executable - we know that the absolute path is passed */ - strncpy(argv0_path, progpath, MAXPATHLEN); + /* We are in the build directory so use the name of the + executable - we know that the absolute path is passed */ + wcsncpy(argv0_path, progpath, MAXPATHLEN); } else { - /* Use the location of the library as the progpath */ - strncpy(argv0_path, buf, MAXPATHLEN); + /* Use the location of the library as the progpath */ + wcsncpy(argv0_path, buf, MAXPATHLEN); } } #endif #if HAVE_READLINK { - char tmpbuffer[MAXPATHLEN+1]; - int linklen = readlink(progpath, tmpbuffer, MAXPATHLEN); + wchar_t tmpbuffer[MAXPATHLEN+1]; + int linklen = _Py_wreadlink(progpath, tmpbuffer, MAXPATHLEN); while (linklen != -1) { - /* It's not null terminated! */ - tmpbuffer[linklen] = '\0'; if (tmpbuffer[0] == SEP) /* tmpbuffer should never be longer than MAXPATHLEN, but extra check does not hurt */ - strncpy(argv0_path, tmpbuffer, MAXPATHLEN); + wcsncpy(argv0_path, tmpbuffer, MAXPATHLEN); else { /* Interpret relative to progpath */ reduce(argv0_path); joinpath(argv0_path, tmpbuffer); } - linklen = readlink(argv0_path, tmpbuffer, MAXPATHLEN); + linklen = _Py_wreadlink(argv0_path, tmpbuffer, MAXPATHLEN); } } #endif /* HAVE_READLINK */ @@ -510,35 +565,35 @@ calculate_path(void) MAXPATHLEN bytes long. */ - if (!(pfound = search_for_prefix(argv0_path, home))) { + if (!(pfound = search_for_prefix(argv0_path, home, _prefix))) { if (!Py_FrozenFlag) fprintf(stderr, "Could not find platform independent libraries <prefix>\n"); - strncpy(prefix, PREFIX, MAXPATHLEN); + wcsncpy(prefix, _prefix, MAXPATHLEN); joinpath(prefix, lib_python); } else reduce(prefix); - strncpy(zip_path, prefix, MAXPATHLEN); - zip_path[MAXPATHLEN] = '\0'; + wcsncpy(zip_path, prefix, MAXPATHLEN); + zip_path[MAXPATHLEN] = L'\0'; if (pfound > 0) { /* Use the reduced prefix returned by Py_GetPrefix() */ reduce(zip_path); reduce(zip_path); } else - strncpy(zip_path, PREFIX, MAXPATHLEN); - joinpath(zip_path, "lib/python00.zip"); - bufsz = strlen(zip_path); /* Replace "00" with version */ + wcsncpy(zip_path, _prefix, MAXPATHLEN); + joinpath(zip_path, L"lib/python00.zip"); + bufsz = wcslen(zip_path); /* Replace "00" with version */ zip_path[bufsz - 6] = VERSION[0]; zip_path[bufsz - 5] = VERSION[2]; - if (!(efound = search_for_exec_prefix(argv0_path, home))) { + if (!(efound = search_for_exec_prefix(argv0_path, home, _exec_prefix))) { if (!Py_FrozenFlag) fprintf(stderr, "Could not find platform dependent libraries <exec_prefix>\n"); - strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN); - joinpath(exec_prefix, "lib/lib-dynload"); + wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN); + joinpath(exec_prefix, L"lib/lib-dynload"); } /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */ @@ -550,13 +605,19 @@ calculate_path(void) */ bufsz = 0; - if (rtpypath) - bufsz += strlen(rtpypath) + 1; - - prefixsz = strlen(prefix) + 1; + if (_rtpypath) { + size_t s = mbstowcs(rtpypath, _rtpypath, sizeof(rtpypath)/sizeof(wchar_t)); + if (s == (size_t)-1 || s >=sizeof(rtpypath)) + /* XXX deal with errors more gracefully */ + _rtpypath = NULL; + if (_rtpypath) + bufsz += wcslen(rtpypath) + 1; + } + defpath = _pythonpath; + prefixsz = wcslen(prefix) + 1; while (1) { - char *delim = strchr(defpath, DELIM); + wchar_t *delim = wcschr(defpath, DELIM); if (defpath[0] != SEP) /* Paths are relative to prefix */ @@ -565,68 +626,68 @@ calculate_path(void) if (delim) bufsz += delim - defpath + 1; else { - bufsz += strlen(defpath) + 1; + bufsz += wcslen(defpath) + 1; break; } defpath = delim + 1; } - bufsz += strlen(zip_path) + 1; - bufsz += strlen(exec_prefix) + 1; + bufsz += wcslen(zip_path) + 1; + bufsz += wcslen(exec_prefix) + 1; - /* This is the only malloc call in this file */ - buf = (char *)PyMem_Malloc(bufsz); + buf = (wchar_t *)PyMem_Malloc(bufsz*sizeof(wchar_t)); if (buf == NULL) { /* We can't exit, so print a warning and limp along */ fprintf(stderr, "Not enough memory for dynamic PYTHONPATH.\n"); fprintf(stderr, "Using default static PYTHONPATH.\n"); - module_search_path = PYTHONPATH; + module_search_path = L"" PYTHONPATH; } else { /* Run-time value of $PYTHONPATH goes first */ - if (rtpypath) { - strcpy(buf, rtpypath); - strcat(buf, delimiter); + if (_rtpypath) { + wcscpy(buf, rtpypath); + wcscat(buf, delimiter); } else buf[0] = '\0'; /* Next is the default zip path */ - strcat(buf, zip_path); - strcat(buf, delimiter); + wcscat(buf, zip_path); + wcscat(buf, delimiter); /* Next goes merge of compile-time $PYTHONPATH with * dynamically located prefix. */ - defpath = pythonpath; + defpath = _pythonpath; while (1) { - char *delim = strchr(defpath, DELIM); + wchar_t *delim = wcschr(defpath, DELIM); if (defpath[0] != SEP) { - strcat(buf, prefix); - strcat(buf, separator); + wcscat(buf, prefix); + wcscat(buf, separator); } if (delim) { size_t len = delim - defpath + 1; - size_t end = strlen(buf) + len; - strncat(buf, defpath, len); + size_t end = wcslen(buf) + len; + wcsncat(buf, defpath, len); *(buf + end) = '\0'; } else { - strcat(buf, defpath); + wcscat(buf, defpath); break; } defpath = delim + 1; } - strcat(buf, delimiter); + wcscat(buf, delimiter); /* Finally, on goes the directory for dynamic-load modules */ - strcat(buf, exec_prefix); + wcscat(buf, exec_prefix); /* And publish the results */ module_search_path = buf; + module_search_path_malloced = 1; } /* Reduce prefix and exec_prefix to their essence, @@ -640,26 +701,50 @@ calculate_path(void) /* The prefix is the root directory, but reduce() chopped * off the "/". */ if (!prefix[0]) - strcpy(prefix, separator); + wcscpy(prefix, separator); } else - strncpy(prefix, PREFIX, MAXPATHLEN); + wcsncpy(prefix, _prefix, MAXPATHLEN); if (efound > 0) { reduce(exec_prefix); reduce(exec_prefix); reduce(exec_prefix); if (!exec_prefix[0]) - strcpy(exec_prefix, separator); + wcscpy(exec_prefix, separator); } else - strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN); + wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN); + + PyMem_Free(_pythonpath); + PyMem_Free(_prefix); + PyMem_Free(_exec_prefix); } /* External interface */ +void +Py_SetPath(const wchar_t *path) +{ + if (module_search_path != NULL) { + if (module_search_path_malloced) + PyMem_Free(module_search_path); + module_search_path = NULL; + module_search_path_malloced = 0; + } + if (path != NULL) { + extern wchar_t *Py_GetProgramName(void); + 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_malloced = 1; + if (module_search_path != NULL) + wcscpy(module_search_path, path); + } +} -char * +wchar_t * Py_GetPath(void) { if (!module_search_path) @@ -667,7 +752,7 @@ Py_GetPath(void) return module_search_path; } -char * +wchar_t * Py_GetPrefix(void) { if (!module_search_path) @@ -675,7 +760,7 @@ Py_GetPrefix(void) return prefix; } -char * +wchar_t * Py_GetExecPrefix(void) { if (!module_search_path) @@ -683,7 +768,7 @@ Py_GetExecPrefix(void) return exec_prefix; } -char * +wchar_t * Py_GetProgramFullPath(void) { if (!module_search_path) diff --git a/Modules/glmodule.c b/Modules/glmodule.c deleted file mode 100644 index b9c64fb33e9..00000000000 --- a/Modules/glmodule.c +++ /dev/null @@ -1,7633 +0,0 @@ - -/* -Input used to generate the Python module "glmodule.c". -The stub generator is a Python script called "cgen.py". - -Each definition must be contained on one line: - -<returntype> <name> <type> <arg> <type> <arg> - -<returntype> can be: void, short, long (XXX maybe others?) - -<type> can be: char, string, short, float, long, or double - string indicates a null terminated string; - if <type> is char and <arg> begins with a *, the * is stripped - and <type> is changed into string - -<arg> has the form <mode> or <mode>[<subscript>] - where <mode> can be - s: arg is sent - r: arg is received (arg is a pointer) - and <subscript> can be (N and I are numbers): - N - argI - retval - N*argI - N*I - N*retval - In the case where the subscript consists of two parts - separated by *, the first part is the width of the matrix, and - the second part is the length of the matrix. This order is - opposite from the order used in C to declare a two-dimensional - matrix. -*/ - -/* - * An attempt has been made to make this module switch threads on qread - * calls. It is far from safe, though. - */ - -#include <gl.h> -#include <device.h> - -#ifdef __sgi -extern int devport(); -extern int textwritemask(); -extern int pagewritemask(); -extern int gewrite(); -extern int gettp(); -#endif - -#include "Python.h" -#include "cgensupport.h" - -/* -Some stubs are too complicated for the stub generator. -We can include manually written versions of them here. -A line starting with '%' gives the name of the function so the stub -generator can include it in the table of functions. -*/ - - -static PyObject * -gl_qread(PyObject *self, PyObject *args) -{ - long retval; - short arg1 ; - Py_BEGIN_ALLOW_THREADS - retval = qread( & arg1 ); - Py_END_ALLOW_THREADS - { PyObject *v = PyTuple_New( 2 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewlongobject(retval)); - PyTuple_SetItem(v, 1, mknewshortobject(arg1)); - return v; - } -} - - -/* -varray -- an array of v.. calls. -The argument is an array (maybe list or tuple) of points. -Each point must be a tuple or list of coordinates (x, y, z). -The points may be 2- or 3-dimensional but must all have the -same dimension. Float and int values may be mixed however. -The points are always converted to 3D double precision points -by assuming z=0.0 if necessary (as indicated in the man page), -and for each point v3d() is called. -*/ - - -static PyObject * -gl_varray(PyObject *self, PyObject *args) -{ - PyObject *v, *w=NULL; - int i, n, width; - double vec[3]; - PyObject * (*getitem)(PyObject *, int); - - if (!PyArg_GetObject(args, 1, 0, &v)) - return NULL; - - if (PyList_Check(v)) { - n = PyList_Size(v); - getitem = PyList_GetItem; - } - else if (PyTuple_Check(v)) { - n = PyTuple_Size(v); - getitem = PyTuple_GetItem; - } - else { - PyErr_BadArgument(); - return NULL; - } - - if (n == 0) { - Py_INCREF(Py_None); - return Py_None; - } - if (n > 0) - w = (*getitem)(v, 0); - - width = 0; - if (w == NULL) { - } - else if (PyList_Check(w)) { - width = PyList_Size(w); - } - else if (PyTuple_Check(w)) { - width = PyTuple_Size(w); - } - - switch (width) { - case 2: - vec[2] = 0.0; - /* Fall through */ - case 3: - break; - default: - PyErr_BadArgument(); - return NULL; - } - - for (i = 0; i < n; i++) { - w = (*getitem)(v, i); - if (!PyArg_GetDoubleArray(w, 1, 0, width, vec)) - return NULL; - v3d(vec); - } - - Py_INCREF(Py_None); - return Py_None; -} - -/* -vnarray, nvarray -- an array of n3f and v3f calls. -The argument is an array (list or tuple) of pairs of points and normals. -Each pair is a tuple (NOT a list) of a point and a normal for that point. -Each point or normal must be a tuple (NOT a list) of coordinates (x, y, z). -Three coordinates must be given. Float and int values may be mixed. -For each pair, n3f() is called for the normal, and then v3f() is called -for the vector. - -vnarray and nvarray differ only in the order of the vector and normal in -the pair: vnarray expects (v, n) while nvarray expects (n, v). -*/ - -static PyObject *gen_nvarray(); /* Forward */ - - -static PyObject * -gl_nvarray(PyObject *self, PyObject *args) -{ - return gen_nvarray(args, 0); -} - - -static PyObject * -gl_vnarray(PyObject *self, PyObject *args) -{ - return gen_nvarray(args, 1); -} - -/* Generic, internal version of {nv,nv}array: inorm indicates the - argument order, 0: normal first, 1: vector first. */ - -static PyObject * -gen_nvarray(PyObject *args, int inorm) -{ - PyObject *v, *w, *wnorm, *wvec; - int i, n; - float norm[3], vec[3]; - PyObject * (*getitem)(PyObject *, int); - - if (!PyArg_GetObject(args, 1, 0, &v)) - return NULL; - - if (PyList_Check(v)) { - n = PyList_Size(v); - getitem = PyList_GetItem; - } - else if (PyTuple_Check(v)) { - n = PyTuple_Size(v); - getitem = PyTuple_GetItem; - } - else { - PyErr_BadArgument(); - return NULL; - } - - for (i = 0; i < n; i++) { - w = (*getitem)(v, i); - if (!PyTuple_Check(w) || PyTuple_Size(w) != 2) { - PyErr_BadArgument(); - return NULL; - } - wnorm = PyTuple_GetItem(w, inorm); - wvec = PyTuple_GetItem(w, 1 - inorm); - if (!PyArg_GetFloatArray(wnorm, 1, 0, 3, norm) || - !PyArg_GetFloatArray(wvec, 1, 0, 3, vec)) - return NULL; - n3f(norm); - v3f(vec); - } - - Py_INCREF(Py_None); - return Py_None; -} - -/* nurbssurface(s_knots[], t_knots[], ctl[][], s_order, t_order, type). - The dimensions of ctl[] are computed as follows: - [len(s_knots) - s_order], [len(t_knots) - t_order] -*/ - - -static PyObject * -gl_nurbssurface(PyObject *self, PyObject *args) -{ - long arg1 ; - double * arg2 ; - long arg3 ; - double * arg4 ; - double *arg5 ; - long arg6 ; - long arg7 ; - long arg8 ; - long ncoords; - long s_byte_stride, t_byte_stride; - long s_nctl, t_nctl; - long s, t; - PyObject *v, *w, *pt; - double *pnext; - if (!PyArg_GetLongArraySize(args, 6, 0, &arg1)) - return NULL; - if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) { - return PyErr_NoMemory(); - } - if (!PyArg_GetDoubleArray(args, 6, 0, arg1 , arg2)) - return NULL; - if (!PyArg_GetLongArraySize(args, 6, 1, &arg3)) - return NULL; - if ((arg4 = PyMem_NEW(double, arg3 )) == NULL) { - return PyErr_NoMemory(); - } - if (!PyArg_GetDoubleArray(args, 6, 1, arg3 , arg4)) - return NULL; - if (!PyArg_GetLong(args, 6, 3, &arg6)) - return NULL; - if (!PyArg_GetLong(args, 6, 4, &arg7)) - return NULL; - if (!PyArg_GetLong(args, 6, 5, &arg8)) - return NULL; - if (arg8 == N_XYZ) - ncoords = 3; - else if (arg8 == N_XYZW) - ncoords = 4; - else { - PyErr_BadArgument(); - return NULL; - } - s_nctl = arg1 - arg6; - t_nctl = arg3 - arg7; - if (!PyArg_GetObject(args, 6, 2, &v)) - return NULL; - if (!PyList_Check(v) || PyList_Size(v) != s_nctl) { - PyErr_BadArgument(); - return NULL; - } - if ((arg5 = PyMem_NEW(double, s_nctl*t_nctl*ncoords )) == NULL) { - return PyErr_NoMemory(); - } - pnext = arg5; - for (s = 0; s < s_nctl; s++) { - w = PyList_GetItem(v, s); - if (w == NULL || !PyList_Check(w) || - PyList_Size(w) != t_nctl) { - PyErr_BadArgument(); - return NULL; - } - for (t = 0; t < t_nctl; t++) { - pt = PyList_GetItem(w, t); - if (!PyArg_GetDoubleArray(pt, 1, 0, ncoords, pnext)) - return NULL; - pnext += ncoords; - } - } - s_byte_stride = sizeof(double) * ncoords; - t_byte_stride = s_byte_stride * s_nctl; - nurbssurface( arg1 , arg2 , arg3 , arg4 , - s_byte_stride , t_byte_stride , arg5 , arg6 , arg7 , arg8 ); - PyMem_DEL(arg2); - PyMem_DEL(arg4); - PyMem_DEL(arg5); - Py_INCREF(Py_None); - return Py_None; -} - -/* nurbscurve(knots, ctlpoints, order, type). - The length of ctlpoints is len(knots)-order. */ - - -static PyObject * -gl_nurbscurve(PyObject *self, PyObject *args) -{ - long arg1 ; - double * arg2 ; - long arg3 ; - double * arg4 ; - long arg5 ; - long arg6 ; - int ncoords, npoints; - int i; - PyObject *v; - double *pnext; - if (!PyArg_GetLongArraySize(args, 4, 0, &arg1)) - return NULL; - if ((arg2 = PyMem_NEW(double, arg1 )) == NULL) { - return PyErr_NoMemory(); - } - if (!PyArg_GetDoubleArray(args, 4, 0, arg1 , arg2)) - return NULL; - if (!PyArg_GetLong(args, 4, 2, &arg5)) - return NULL; - if (!PyArg_GetLong(args, 4, 3, &arg6)) - return NULL; - if (arg6 == N_ST) - ncoords = 2; - else if (arg6 == N_STW) - ncoords = 3; - else { - PyErr_BadArgument(); - return NULL; - } - npoints = arg1 - arg5; - if (!PyArg_GetObject(args, 4, 1, &v)) - return NULL; - if (!PyList_Check(v) || PyList_Size(v) != npoints) { - PyErr_BadArgument(); - return NULL; - } - if ((arg4 = PyMem_NEW(double, npoints*ncoords )) == NULL) { - return PyErr_NoMemory(); - } - pnext = arg4; - for (i = 0; i < npoints; i++) { - if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext)) - return NULL; - pnext += ncoords; - } - arg3 = (sizeof(double)) * ncoords; - nurbscurve( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 ); - PyMem_DEL(arg2); - PyMem_DEL(arg4); - Py_INCREF(Py_None); - return Py_None; -} - -/* pwlcurve(points, type). - Points is a list of points. Type must be N_ST. */ - - -static PyObject * -gl_pwlcurve(PyObject *self, PyObject *args) -{ - PyObject *v; - long type; - double *data, *pnext; - long npoints, ncoords; - int i; - if (!PyArg_GetObject(args, 2, 0, &v)) - return NULL; - if (!PyArg_GetLong(args, 2, 1, &type)) - return NULL; - if (!PyList_Check(v)) { - PyErr_BadArgument(); - return NULL; - } - npoints = PyList_Size(v); - if (type == N_ST) - ncoords = 2; - else { - PyErr_BadArgument(); - return NULL; - } - if ((data = PyMem_NEW(double, npoints*ncoords)) == NULL) { - return PyErr_NoMemory(); - } - pnext = data; - for (i = 0; i < npoints; i++) { - if (!PyArg_GetDoubleArray(PyList_GetItem(v, i), 1, 0, ncoords, pnext)) - return NULL; - pnext += ncoords; - } - pwlcurve(npoints, data, sizeof(double)*ncoords, type); - PyMem_DEL(data); - Py_INCREF(Py_None); - return Py_None; -} - - -/* Picking and Selecting */ - -static short *pickbuffer = NULL; -static long pickbuffersize; - -static PyObject * -pick_select(PyObject *args, void (*func)()) -{ - if (!PyArg_GetLong(args, 1, 0, &pickbuffersize)) - return NULL; - if (pickbuffer != NULL) { - PyErr_SetString(PyExc_RuntimeError, - "pick/gselect: already picking/selecting"); - return NULL; - } - if ((pickbuffer = PyMem_NEW(short, pickbuffersize)) == NULL) { - return PyErr_NoMemory(); - } - (*func)(pickbuffer, pickbuffersize); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -endpick_select(long (*func)()) -{ - PyObject *v, *w; - int i, nhits, n; - if (pickbuffer == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "endpick/endselect: not in pick/select mode"); - return NULL; - } - nhits = (*func)(pickbuffer); - if (nhits < 0) { - nhits = -nhits; /* How to report buffer overflow otherwise? */ - } - /* Scan the buffer to see how many integers */ - n = 0; - for (; nhits > 0; nhits--) { - n += 1 + pickbuffer[n]; - } - v = PyList_New(n); - if (v == NULL) - return NULL; - /* XXX Could do it nicer and interpret the data structure here, - returning a list of lists. But this can be done in Python... */ - for (i = 0; i < n; i++) { - w = PyInt_FromLong((long)pickbuffer[i]); - if (w == NULL) { - Py_DECREF(v); - return NULL; - } - PyList_SetItem(v, i, w); - } - PyMem_DEL(pickbuffer); - pickbuffer = NULL; - return v; -} - -extern void pick(), gselect(); -extern long endpick(), endselect(); - -static PyObject *gl_pick(PyObject *self, PyObject *args) -{ - return pick_select(args, pick); -} - -static PyObject *gl_endpick(PyObject *self) -{ - return endpick_select(endpick); -} - -static PyObject *gl_gselect(PyObject *self, PyObject *args) -{ - return pick_select(args, gselect); -} - -static PyObject *gl_endselect(PyObject *self) -{ - return endpick_select(endselect); -} - - -/* XXX The generator botches this one. Here's a quick hack to fix it. */ - -/* XXX The generator botches this one. Here's a quick hack to fix it. */ - - -static PyObject * -gl_getmatrix(PyObject *self, PyObject *args) -{ - Matrix arg1; - PyObject *v, *w; - int i, j; - getmatrix( arg1 ); - v = PyList_New(16); - if (v == NULL) { - return PyErr_NoMemory(); - } - for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) { - w = mknewfloatobject(arg1[i][j]); - if (w == NULL) { - Py_DECREF(v); - return NULL; - } - PyList_SetItem(v, i*4+j, w); - } - return v; -} - -/* Here's an alternate version that returns a 4x4 matrix instead of - a vector. Unfortunately it is incompatible with loadmatrix and - multmatrix... */ - - -static PyObject * -gl_altgetmatrix(PyObject *self, PyObject *args) -{ - Matrix arg1; - PyObject *v, *w; - int i, j; - getmatrix( arg1 ); - v = PyList_New(4); - if (v == NULL) { - return NULL; - } - for (i = 0; i < 4; i++) { - w = PyList_New(4); - if (w == NULL) { - Py_DECREF(v); - return NULL; - } - PyList_SetItem(v, i, w); - } - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - w = mknewfloatobject(arg1[i][j]); - if (w == NULL) { - Py_DECREF(v); - return NULL; - } - PyList_SetItem(PyList_GetItem(v, i), j, w); - } - } - return v; -} - - -static PyObject * -gl_lrectwrite(PyObject *self, PyObject *args) -{ - short x1 ; - short y1 ; - short x2 ; - short y2 ; - string parray ; - PyObject *s; -#if 0 - int pixcount; -#endif - if (!PyArg_GetShort(args, 5, 0, &x1)) - return NULL; - if (!PyArg_GetShort(args, 5, 1, &y1)) - return NULL; - if (!PyArg_GetShort(args, 5, 2, &x2)) - return NULL; - if (!PyArg_GetShort(args, 5, 3, &y2)) - return NULL; - if (!PyArg_GetString(args, 5, 4, &parray)) - return NULL; - if (!PyArg_GetObject(args, 5, 4, &s)) - return NULL; -#if 0 -/* Don't check this, it breaks experiments with pixmode(PM_SIZE, ...) */ - pixcount = (long)(x2+1-x1) * (long)(y2+1-y1); - if (!PyString_Check(s) || PyString_Size(s) != pixcount*sizeof(long)) { - PyErr_SetString(PyExc_RuntimeError, - "string arg to lrectwrite has wrong size"); - return NULL; - } -#endif - lrectwrite( x1 , y1 , x2 , y2 , (unsigned long *) parray ); - Py_INCREF(Py_None); - return Py_None; -} - - -static PyObject * -gl_lrectread(PyObject *self, PyObject *args) -{ - short x1 ; - short y1 ; - short x2 ; - short y2 ; - PyObject *parray; - int pixcount; - if (!PyArg_GetShort(args, 4, 0, &x1)) - return NULL; - if (!PyArg_GetShort(args, 4, 1, &y1)) - return NULL; - if (!PyArg_GetShort(args, 4, 2, &x2)) - return NULL; - if (!PyArg_GetShort(args, 4, 3, &y2)) - return NULL; - pixcount = (long)(x2+1-x1) * (long)(y2+1-y1); - parray = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long)); - if (parray == NULL) - return NULL; /* No memory */ - lrectread(x1, y1, x2, y2, (unsigned long *) PyString_AsString(parray)); - return parray; -} - - -static PyObject * -gl_readdisplay(PyObject *self, PyObject *args) -{ - short x1, y1, x2, y2; - unsigned long *parray, hints; - long size, size_ret; - PyObject *rv; - - if ( !PyArg_Parse(args, "hhhhl", &x1, &y1, &x2, &y2, &hints) ) - return 0; - size = (long)(x2+1-x1) * (long)(y2+1-y1); - rv = PyString_FromStringAndSize((char *)NULL, size*sizeof(long)); - if ( rv == NULL ) - return NULL; - parray = (unsigned long *)PyString_AsString(rv); - size_ret = readdisplay(x1, y1, x2, y2, parray, hints); - if ( size_ret != size ) { - printf("gl_readdisplay: got %ld pixels, expected %ld\n", - size_ret, size); - PyErr_SetString(PyExc_RuntimeError, "readdisplay returned unexpected length"); - return NULL; - } - return rv; -} - -/* Desperately needed, here are tools to compress and decompress - the data manipulated by lrectread/lrectwrite. - - gl.packrect(width, height, packfactor, bigdata) --> smalldata - makes 'bigdata' 4*(packfactor**2) times smaller by: - - turning it into B/W (a factor 4) - - replacing squares of size pacfactor by one - representative - - gl.unpackrect(width, height, packfactor, smalldata) --> bigdata - is the inverse; the numeric arguments must be *the same*. - - Both work best if width and height are multiples of packfactor - (in fact unpackrect will leave garbage bytes). -*/ - - -static PyObject * -gl_packrect(PyObject *self, PyObject *args) -{ - long width, height, packfactor; - char *s; - PyObject *unpacked, *packed; - int pixcount, packedcount, x, y, r, g, b; - unsigned long pixel; - unsigned char *p; - unsigned long *parray; - if (!PyArg_GetLong(args, 4, 0, &width)) - return NULL; - if (!PyArg_GetLong(args, 4, 1, &height)) - return NULL; - if (!PyArg_GetLong(args, 4, 2, &packfactor)) - return NULL; - if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */ - return NULL; - if (!PyArg_GetObject(args, 4, 3, &unpacked)) - return NULL; - if (width <= 0 || height <= 0 || packfactor <= 0) { - PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0"); - return NULL; - } - pixcount = width*height; - packedcount = ((width+packfactor-1)/packfactor) * - ((height+packfactor-1)/packfactor); - if (PyString_Size(unpacked) != pixcount*sizeof(long)) { - PyErr_SetString(PyExc_RuntimeError, - "string arg to packrect has wrong size"); - return NULL; - } - packed = PyString_FromStringAndSize((char *)NULL, packedcount); - if (packed == NULL) - return NULL; - parray = (unsigned long *) PyString_AsString(unpacked); - p = (unsigned char *) PyString_AsString(packed); - for (y = 0; y < height; y += packfactor, parray += packfactor*width) { - for (x = 0; x < width; x += packfactor) { - pixel = parray[x]; - r = pixel & 0xff; - g = (pixel >> 8) & 0xff; - b = (pixel >> 16) & 0xff; - *p++ = (30*r+59*g+11*b) / 100; - } - } - return packed; -} - - -static unsigned long unpacktab[256]; -static int unpacktab_inited = 0; - -static PyObject * -gl_unpackrect(PyObject *self, PyObject *args) -{ - long width, height, packfactor; - char *s; - PyObject *unpacked, *packed; - int pixcount, packedcount; - register unsigned char *p; - register unsigned long *parray; - if (!unpacktab_inited) { - register int white; - for (white = 256; --white >= 0; ) - unpacktab[white] = white * 0x010101L; - unpacktab_inited++; - } - if (!PyArg_GetLong(args, 4, 0, &width)) - return NULL; - if (!PyArg_GetLong(args, 4, 1, &height)) - return NULL; - if (!PyArg_GetLong(args, 4, 2, &packfactor)) - return NULL; - if (!PyArg_GetString(args, 4, 3, &s)) /* For type checking only */ - return NULL; - if (!PyArg_GetObject(args, 4, 3, &packed)) - return NULL; - if (width <= 0 || height <= 0 || packfactor <= 0) { - PyErr_SetString(PyExc_RuntimeError, "packrect args must be > 0"); - return NULL; - } - pixcount = width*height; - packedcount = ((width+packfactor-1)/packfactor) * - ((height+packfactor-1)/packfactor); - if (PyString_Size(packed) != packedcount) { - PyErr_SetString(PyExc_RuntimeError, - "string arg to unpackrect has wrong size"); - return NULL; - } - unpacked = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long)); - if (unpacked == NULL) - return NULL; - parray = (unsigned long *) PyString_AsString(unpacked); - p = (unsigned char *) PyString_AsString(packed); - if (packfactor == 1 && width*height > 0) { - /* Just expand bytes to longs */ - register int x = width * height; - do { - *parray++ = unpacktab[*p++]; - } while (--x >= 0); - } - else { - register int y; - for (y = 0; y < height-packfactor+1; - y += packfactor, parray += packfactor*width) { - register int x; - for (x = 0; x < width-packfactor+1; x += packfactor) { - register unsigned long pixel = unpacktab[*p++]; - register int i; - for (i = packfactor*width; (i-=width) >= 0;) { - register int j; - for (j = packfactor; --j >= 0; ) - parray[i+x+j] = pixel; - } - } - } - } - return unpacked; -} - -static PyObject * -gl_gversion(PyObject *self, PyObject *args) -{ - char buf[20]; - gversion(buf); - return PyString_FromString(buf); -} - - -/* void clear - Manual because of clash with termcap */ -static PyObject * -gl_clear(PyObject *self, PyObject *args) -{ - __GLclear( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* End of manually written stubs */ - - -/* long getshade */ - -static PyObject * -gl_getshade(PyObject *self, PyObject *args) -{ - long retval; - retval = getshade( ); - return mknewlongobject(retval); -} - -/* void devport short s long s */ - -static PyObject * -gl_devport(PyObject *self, PyObject *args) -{ - short arg1 ; - long arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - devport( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rdr2i long s long s */ - -static PyObject * -gl_rdr2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - rdr2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rectfs short s short s short s short s */ - -static PyObject * -gl_rectfs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - rectfs( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rects short s short s short s short s */ - -static PyObject * -gl_rects(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - rects( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rmv2i long s long s */ - -static PyObject * -gl_rmv2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - rmv2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void noport */ - -static PyObject * -gl_noport(PyObject *self, PyObject *args) -{ - noport( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void popviewport */ - -static PyObject * -gl_popviewport(PyObject *self, PyObject *args) -{ - popviewport( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void clearhitcode */ - -static PyObject * -gl_clearhitcode(PyObject *self, PyObject *args) -{ - clearhitcode( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void closeobj */ - -static PyObject * -gl_closeobj(PyObject *self, PyObject *args) -{ - closeobj( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void cursoff */ - -static PyObject * -gl_cursoff(PyObject *self, PyObject *args) -{ - cursoff( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void curson */ - -static PyObject * -gl_curson(PyObject *self, PyObject *args) -{ - curson( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void doublebuffer */ - -static PyObject * -gl_doublebuffer(PyObject *self, PyObject *args) -{ - doublebuffer( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void finish */ - -static PyObject * -gl_finish(PyObject *self, PyObject *args) -{ - finish( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void gconfig */ - -static PyObject * -gl_gconfig(PyObject *self, PyObject *args) -{ - gconfig( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void ginit */ - -static PyObject * -gl_ginit(PyObject *self, PyObject *args) -{ - ginit( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void greset */ - -static PyObject * -gl_greset(PyObject *self, PyObject *args) -{ - greset( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void multimap */ - -static PyObject * -gl_multimap(PyObject *self, PyObject *args) -{ - multimap( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void onemap */ - -static PyObject * -gl_onemap(PyObject *self, PyObject *args) -{ - onemap( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void popattributes */ - -static PyObject * -gl_popattributes(PyObject *self, PyObject *args) -{ - popattributes( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void popmatrix */ - -static PyObject * -gl_popmatrix(PyObject *self, PyObject *args) -{ - popmatrix( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pushattributes */ - -static PyObject * -gl_pushattributes(PyObject *self, PyObject *args) -{ - pushattributes( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pushmatrix */ - -static PyObject * -gl_pushmatrix(PyObject *self, PyObject *args) -{ - pushmatrix( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pushviewport */ - -static PyObject * -gl_pushviewport(PyObject *self, PyObject *args) -{ - pushviewport( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void qreset */ - -static PyObject * -gl_qreset(PyObject *self, PyObject *args) -{ - qreset( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void RGBmode */ - -static PyObject * -gl_RGBmode(PyObject *self, PyObject *args) -{ - RGBmode( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void singlebuffer */ - -static PyObject * -gl_singlebuffer(PyObject *self, PyObject *args) -{ - singlebuffer( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void swapbuffers */ - -static PyObject * -gl_swapbuffers(PyObject *self, PyObject *args) -{ - swapbuffers( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void gsync */ - -static PyObject * -gl_gsync(PyObject *self, PyObject *args) -{ - gsync( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void gflush */ - -static PyObject * -gl_gflush(PyObject *self, PyObject *args) -{ - gflush( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void tpon */ - -static PyObject * -gl_tpon(PyObject *self, PyObject *args) -{ - tpon( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void tpoff */ - -static PyObject * -gl_tpoff(PyObject *self, PyObject *args) -{ - tpoff( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void clkon */ - -static PyObject * -gl_clkon(PyObject *self, PyObject *args) -{ - clkon( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void clkoff */ - -static PyObject * -gl_clkoff(PyObject *self, PyObject *args) -{ - clkoff( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void ringbell */ - -static PyObject * -gl_ringbell(PyObject *self, PyObject *args) -{ - ringbell( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void gbegin */ - -static PyObject * -gl_gbegin(PyObject *self, PyObject *args) -{ - gbegin( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void textinit */ - -static PyObject * -gl_textinit(PyObject *self, PyObject *args) -{ - textinit( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void initnames */ - -static PyObject * -gl_initnames(PyObject *self, PyObject *args) -{ - initnames( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pclos */ - -static PyObject * -gl_pclos(PyObject *self, PyObject *args) -{ - pclos( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void popname */ - -static PyObject * -gl_popname(PyObject *self, PyObject *args) -{ - popname( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void spclos */ - -static PyObject * -gl_spclos(PyObject *self, PyObject *args) -{ - spclos( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void zclear */ - -static PyObject * -gl_zclear(PyObject *self, PyObject *args) -{ - zclear( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void screenspace */ - -static PyObject * -gl_screenspace(PyObject *self, PyObject *args) -{ - screenspace( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void reshapeviewport */ - -static PyObject * -gl_reshapeviewport(PyObject *self, PyObject *args) -{ - reshapeviewport( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void winpush */ - -static PyObject * -gl_winpush(PyObject *self, PyObject *args) -{ - winpush( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void winpop */ - -static PyObject * -gl_winpop(PyObject *self, PyObject *args) -{ - winpop( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void foreground */ - -static PyObject * -gl_foreground(PyObject *self, PyObject *args) -{ - foreground( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void endfullscrn */ - -static PyObject * -gl_endfullscrn(PyObject *self, PyObject *args) -{ - endfullscrn( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void endpupmode */ - -static PyObject * -gl_endpupmode(PyObject *self, PyObject *args) -{ - endpupmode( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void fullscrn */ - -static PyObject * -gl_fullscrn(PyObject *self, PyObject *args) -{ - fullscrn( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pupmode */ - -static PyObject * -gl_pupmode(PyObject *self, PyObject *args) -{ - pupmode( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void winconstraints */ - -static PyObject * -gl_winconstraints(PyObject *self, PyObject *args) -{ - winconstraints( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pagecolor short s */ - -static PyObject * -gl_pagecolor(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - pagecolor( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void textcolor short s */ - -static PyObject * -gl_textcolor(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - textcolor( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void color short s */ - -static PyObject * -gl_color(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - color( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void curveit short s */ - -static PyObject * -gl_curveit(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - curveit( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void font short s */ - -static PyObject * -gl_font(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - font( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void linewidth short s */ - -static PyObject * -gl_linewidth(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - linewidth( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setlinestyle short s */ - -static PyObject * -gl_setlinestyle(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - setlinestyle( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setmap short s */ - -static PyObject * -gl_setmap(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - setmap( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void swapinterval short s */ - -static PyObject * -gl_swapinterval(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - swapinterval( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void writemask short s */ - -static PyObject * -gl_writemask(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - writemask( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void textwritemask short s */ - -static PyObject * -gl_textwritemask(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - textwritemask( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void qdevice short s */ - -static PyObject * -gl_qdevice(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - qdevice( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void unqdevice short s */ - -static PyObject * -gl_unqdevice(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - unqdevice( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void curvebasis short s */ - -static PyObject * -gl_curvebasis(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - curvebasis( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void curveprecision short s */ - -static PyObject * -gl_curveprecision(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - curveprecision( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void loadname short s */ - -static PyObject * -gl_loadname(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - loadname( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void passthrough short s */ - -static PyObject * -gl_passthrough(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - passthrough( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pushname short s */ - -static PyObject * -gl_pushname(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - pushname( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setmonitor short s */ - -static PyObject * -gl_setmonitor(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - setmonitor( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setshade short s */ - -static PyObject * -gl_setshade(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - setshade( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setpattern short s */ - -static PyObject * -gl_setpattern(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - setpattern( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pagewritemask short s */ - -static PyObject * -gl_pagewritemask(PyObject *self, PyObject *args) -{ - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - pagewritemask( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void callobj long s */ - -static PyObject * -gl_callobj(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - callobj( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void delobj long s */ - -static PyObject * -gl_delobj(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - delobj( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void editobj long s */ - -static PyObject * -gl_editobj(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - editobj( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void makeobj long s */ - -static PyObject * -gl_makeobj(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - makeobj( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void maketag long s */ - -static PyObject * -gl_maketag(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - maketag( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void chunksize long s */ - -static PyObject * -gl_chunksize(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - chunksize( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void compactify long s */ - -static PyObject * -gl_compactify(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - compactify( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void deltag long s */ - -static PyObject * -gl_deltag(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - deltag( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lsrepeat long s */ - -static PyObject * -gl_lsrepeat(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - lsrepeat( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void objinsert long s */ - -static PyObject * -gl_objinsert(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - objinsert( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void objreplace long s */ - -static PyObject * -gl_objreplace(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - objreplace( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void winclose long s */ - -static PyObject * -gl_winclose(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - winclose( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void blanktime long s */ - -static PyObject * -gl_blanktime(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - blanktime( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void freepup long s */ - -static PyObject * -gl_freepup(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - freepup( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void backbuffer long s */ - -static PyObject * -gl_backbuffer(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - backbuffer( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void frontbuffer long s */ - -static PyObject * -gl_frontbuffer(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - frontbuffer( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lsbackup long s */ - -static PyObject * -gl_lsbackup(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - lsbackup( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void resetls long s */ - -static PyObject * -gl_resetls(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - resetls( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lampon long s */ - -static PyObject * -gl_lampon(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - lampon( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lampoff long s */ - -static PyObject * -gl_lampoff(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - lampoff( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setbell long s */ - -static PyObject * -gl_setbell(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - setbell( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void blankscreen long s */ - -static PyObject * -gl_blankscreen(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - blankscreen( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void depthcue long s */ - -static PyObject * -gl_depthcue(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - depthcue( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void zbuffer long s */ - -static PyObject * -gl_zbuffer(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - zbuffer( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void backface long s */ - -static PyObject * -gl_backface(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - backface( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void cmov2i long s long s */ - -static PyObject * -gl_cmov2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - cmov2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void draw2i long s long s */ - -static PyObject * -gl_draw2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - draw2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void move2i long s long s */ - -static PyObject * -gl_move2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - move2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pnt2i long s long s */ - -static PyObject * -gl_pnt2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - pnt2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void patchbasis long s long s */ - -static PyObject * -gl_patchbasis(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - patchbasis( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void patchprecision long s long s */ - -static PyObject * -gl_patchprecision(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - patchprecision( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pdr2i long s long s */ - -static PyObject * -gl_pdr2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - pdr2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pmv2i long s long s */ - -static PyObject * -gl_pmv2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - pmv2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpdr2i long s long s */ - -static PyObject * -gl_rpdr2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - rpdr2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpmv2i long s long s */ - -static PyObject * -gl_rpmv2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - rpmv2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void xfpt2i long s long s */ - -static PyObject * -gl_xfpt2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - xfpt2i( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void objdelete long s long s */ - -static PyObject * -gl_objdelete(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - objdelete( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void patchcurves long s long s */ - -static PyObject * -gl_patchcurves(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - patchcurves( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void minsize long s long s */ - -static PyObject * -gl_minsize(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - minsize( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void maxsize long s long s */ - -static PyObject * -gl_maxsize(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - maxsize( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void keepaspect long s long s */ - -static PyObject * -gl_keepaspect(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - keepaspect( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void prefsize long s long s */ - -static PyObject * -gl_prefsize(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - prefsize( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void stepunit long s long s */ - -static PyObject * -gl_stepunit(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - stepunit( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void fudge long s long s */ - -static PyObject * -gl_fudge(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - fudge( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void winmove long s long s */ - -static PyObject * -gl_winmove(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - winmove( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void attachcursor short s short s */ - -static PyObject * -gl_attachcursor(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - attachcursor( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void deflinestyle short s short s */ - -static PyObject * -gl_deflinestyle(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - deflinestyle( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void noise short s short s */ - -static PyObject * -gl_noise(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - noise( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void picksize short s short s */ - -static PyObject * -gl_picksize(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - picksize( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void qenter short s short s */ - -static PyObject * -gl_qenter(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - qenter( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setdepth short s short s */ - -static PyObject * -gl_setdepth(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - setdepth( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void cmov2s short s short s */ - -static PyObject * -gl_cmov2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - cmov2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void draw2s short s short s */ - -static PyObject * -gl_draw2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - draw2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void move2s short s short s */ - -static PyObject * -gl_move2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - move2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pdr2s short s short s */ - -static PyObject * -gl_pdr2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - pdr2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pmv2s short s short s */ - -static PyObject * -gl_pmv2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - pmv2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pnt2s short s short s */ - -static PyObject * -gl_pnt2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - pnt2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rdr2s short s short s */ - -static PyObject * -gl_rdr2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - rdr2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rmv2s short s short s */ - -static PyObject * -gl_rmv2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - rmv2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpdr2s short s short s */ - -static PyObject * -gl_rpdr2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - rpdr2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpmv2s short s short s */ - -static PyObject * -gl_rpmv2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - rpmv2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void xfpt2s short s short s */ - -static PyObject * -gl_xfpt2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - xfpt2s( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void cmov2 float s float s */ - -static PyObject * -gl_cmov2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - cmov2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void draw2 float s float s */ - -static PyObject * -gl_draw2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - draw2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void move2 float s float s */ - -static PyObject * -gl_move2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - move2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pnt2 float s float s */ - -static PyObject * -gl_pnt2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - pnt2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pdr2 float s float s */ - -static PyObject * -gl_pdr2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - pdr2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pmv2 float s float s */ - -static PyObject * -gl_pmv2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - pmv2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rdr2 float s float s */ - -static PyObject * -gl_rdr2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - rdr2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rmv2 float s float s */ - -static PyObject * -gl_rmv2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - rmv2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpdr2 float s float s */ - -static PyObject * -gl_rpdr2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - rpdr2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpmv2 float s float s */ - -static PyObject * -gl_rpmv2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - rpmv2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void xfpt2 float s float s */ - -static PyObject * -gl_xfpt2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - xfpt2( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void loadmatrix float s[4*4] */ - -static PyObject * -gl_loadmatrix(PyObject *self, PyObject *args) -{ - float arg1 [ 4 ] [ 4 ] ; - if (!getifloatarray(args, 1, 0, 4 * 4 , (float *) arg1)) - return NULL; - loadmatrix( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void multmatrix float s[4*4] */ - -static PyObject * -gl_multmatrix(PyObject *self, PyObject *args) -{ - float arg1 [ 4 ] [ 4 ] ; - if (!getifloatarray(args, 1, 0, 4 * 4 , (float *) arg1)) - return NULL; - multmatrix( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void crv float s[3*4] */ - -static PyObject * -gl_crv(PyObject *self, PyObject *args) -{ - float arg1 [ 4 ] [ 3 ] ; - if (!getifloatarray(args, 1, 0, 3 * 4 , (float *) arg1)) - return NULL; - crv( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rcrv float s[4*4] */ - -static PyObject * -gl_rcrv(PyObject *self, PyObject *args) -{ - float arg1 [ 4 ] [ 4 ] ; - if (!getifloatarray(args, 1, 0, 4 * 4 , (float *) arg1)) - return NULL; - rcrv( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void addtopup long s char *s long s */ - -static PyObject * -gl_addtopup(PyObject *self, PyObject *args) -{ - long arg1 ; - string arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getistringarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - addtopup( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void charstr char *s */ - -static PyObject * -gl_charstr(PyObject *self, PyObject *args) -{ - string arg1 ; - if (!getistringarg(args, 1, 0, &arg1)) - return NULL; - charstr( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void getport char *s */ - -static PyObject * -gl_getport(PyObject *self, PyObject *args) -{ - string arg1 ; - if (!getistringarg(args, 1, 0, &arg1)) - return NULL; - getport( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* long strwidth char *s */ - -static PyObject * -gl_strwidth(PyObject *self, PyObject *args) -{ - long retval; - string arg1 ; - if (!getistringarg(args, 1, 0, &arg1)) - return NULL; - retval = strwidth( arg1 ); - return mknewlongobject(retval); -} - -/* long winopen char *s */ - -static PyObject * -gl_winopen(PyObject *self, PyObject *args) -{ - long retval; - string arg1 ; - if (!getistringarg(args, 1, 0, &arg1)) - return NULL; - retval = winopen( arg1 ); - return mknewlongobject(retval); -} - -/* void wintitle char *s */ - -static PyObject * -gl_wintitle(PyObject *self, PyObject *args) -{ - string arg1 ; - if (!getistringarg(args, 1, 0, &arg1)) - return NULL; - wintitle( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void polf long s float s[3*arg1] */ - -static PyObject * -gl_polf(PyObject *self, PyObject *args) -{ - long arg1 ; - float (* arg2) [ 3 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 3; - if ((arg2 = (float(*)[3]) PyMem_NEW(float , 3 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getifloatarray(args, 1, 0, 3 * arg1 , (float *) arg2)) - return NULL; - polf( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void polf2 long s float s[2*arg1] */ - -static PyObject * -gl_polf2(PyObject *self, PyObject *args) -{ - long arg1 ; - float (* arg2) [ 2 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 2; - if ((arg2 = (float(*)[2]) PyMem_NEW(float , 2 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getifloatarray(args, 1, 0, 2 * arg1 , (float *) arg2)) - return NULL; - polf2( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void poly long s float s[3*arg1] */ - -static PyObject * -gl_poly(PyObject *self, PyObject *args) -{ - long arg1 ; - float (* arg2) [ 3 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 3; - if ((arg2 = (float(*)[3]) PyMem_NEW(float , 3 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getifloatarray(args, 1, 0, 3 * arg1 , (float *) arg2)) - return NULL; - poly( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void poly2 long s float s[2*arg1] */ - -static PyObject * -gl_poly2(PyObject *self, PyObject *args) -{ - long arg1 ; - float (* arg2) [ 2 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 2; - if ((arg2 = (float(*)[2]) PyMem_NEW(float , 2 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getifloatarray(args, 1, 0, 2 * arg1 , (float *) arg2)) - return NULL; - poly2( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void crvn long s float s[3*arg1] */ - -static PyObject * -gl_crvn(PyObject *self, PyObject *args) -{ - long arg1 ; - float (* arg2) [ 3 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 3; - if ((arg2 = (float(*)[3]) PyMem_NEW(float , 3 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getifloatarray(args, 1, 0, 3 * arg1 , (float *) arg2)) - return NULL; - crvn( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rcrvn long s float s[4*arg1] */ - -static PyObject * -gl_rcrvn(PyObject *self, PyObject *args) -{ - long arg1 ; - float (* arg2) [ 4 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 4; - if ((arg2 = (float(*)[4]) PyMem_NEW(float , 4 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getifloatarray(args, 1, 0, 4 * arg1 , (float *) arg2)) - return NULL; - rcrvn( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void polf2i long s long s[2*arg1] */ - -static PyObject * -gl_polf2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long (* arg2) [ 2 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 2; - if ((arg2 = (long(*)[2]) PyMem_NEW(long , 2 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getilongarray(args, 1, 0, 2 * arg1 , (long *) arg2)) - return NULL; - polf2i( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void polfi long s long s[3*arg1] */ - -static PyObject * -gl_polfi(PyObject *self, PyObject *args) -{ - long arg1 ; - long (* arg2) [ 3 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 3; - if ((arg2 = (long(*)[3]) PyMem_NEW(long , 3 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getilongarray(args, 1, 0, 3 * arg1 , (long *) arg2)) - return NULL; - polfi( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void poly2i long s long s[2*arg1] */ - -static PyObject * -gl_poly2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long (* arg2) [ 2 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 2; - if ((arg2 = (long(*)[2]) PyMem_NEW(long , 2 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getilongarray(args, 1, 0, 2 * arg1 , (long *) arg2)) - return NULL; - poly2i( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void polyi long s long s[3*arg1] */ - -static PyObject * -gl_polyi(PyObject *self, PyObject *args) -{ - long arg1 ; - long (* arg2) [ 3 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 3; - if ((arg2 = (long(*)[3]) PyMem_NEW(long , 3 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getilongarray(args, 1, 0, 3 * arg1 , (long *) arg2)) - return NULL; - polyi( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void polf2s long s short s[2*arg1] */ - -static PyObject * -gl_polf2s(PyObject *self, PyObject *args) -{ - long arg1 ; - short (* arg2) [ 2 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 2; - if ((arg2 = (short(*)[2]) PyMem_NEW(short , 2 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 1, 0, 2 * arg1 , (short *) arg2)) - return NULL; - polf2s( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void polfs long s short s[3*arg1] */ - -static PyObject * -gl_polfs(PyObject *self, PyObject *args) -{ - long arg1 ; - short (* arg2) [ 3 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 3; - if ((arg2 = (short(*)[3]) PyMem_NEW(short , 3 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 1, 0, 3 * arg1 , (short *) arg2)) - return NULL; - polfs( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void polys long s short s[3*arg1] */ - -static PyObject * -gl_polys(PyObject *self, PyObject *args) -{ - long arg1 ; - short (* arg2) [ 3 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 3; - if ((arg2 = (short(*)[3]) PyMem_NEW(short , 3 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 1, 0, 3 * arg1 , (short *) arg2)) - return NULL; - polys( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void poly2s long s short s[2*arg1] */ - -static PyObject * -gl_poly2s(PyObject *self, PyObject *args) -{ - long arg1 ; - short (* arg2) [ 2 ] ; - if (!getilongarraysize(args, 1, 0, &arg1)) - return NULL; - arg1 = arg1 / 2; - if ((arg2 = (short(*)[2]) PyMem_NEW(short , 2 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 1, 0, 2 * arg1 , (short *) arg2)) - return NULL; - poly2s( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void defcursor short s u_short s[128] */ - -static PyObject * -gl_defcursor(PyObject *self, PyObject *args) -{ - short arg1 ; - unsigned short arg2 [ 128 ] ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarray(args, 2, 1, 128 , (short *) arg2)) - return NULL; - defcursor( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void writepixels short s u_short s[arg1] */ - -static PyObject * -gl_writepixels(PyObject *self, PyObject *args) -{ - short arg1 ; - unsigned short * arg2 ; - if (!getishortarraysize(args, 1, 0, &arg1)) - return NULL; - if ((arg2 = PyMem_NEW(unsigned short , arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 1, 0, arg1 , (short *) arg2)) - return NULL; - writepixels( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void defbasis long s float s[4*4] */ - -static PyObject * -gl_defbasis(PyObject *self, PyObject *args) -{ - long arg1 ; - float arg2 [ 4 ] [ 4 ] ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarray(args, 2, 1, 4 * 4 , (float *) arg2)) - return NULL; - defbasis( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void gewrite short s short s[arg1] */ - -static PyObject * -gl_gewrite(PyObject *self, PyObject *args) -{ - short arg1 ; - short * arg2 ; - if (!getishortarraysize(args, 1, 0, &arg1)) - return NULL; - if ((arg2 = PyMem_NEW(short , arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 1, 0, arg1 , arg2)) - return NULL; - gewrite( arg1 , arg2 ); - PyMem_DEL(arg2); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rotate short s char s */ - -static PyObject * -gl_rotate(PyObject *self, PyObject *args) -{ - short arg1 ; - char arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getichararg(args, 2, 1, &arg2)) - return NULL; - rotate( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rot float s char s */ - -static PyObject * -gl_rot(PyObject *self, PyObject *args) -{ - float arg1 ; - char arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getichararg(args, 2, 1, &arg2)) - return NULL; - rot( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void circfi long s long s long s */ - -static PyObject * -gl_circfi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - circfi( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void circi long s long s long s */ - -static PyObject * -gl_circi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - circi( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void cmovi long s long s long s */ - -static PyObject * -gl_cmovi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - cmovi( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void drawi long s long s long s */ - -static PyObject * -gl_drawi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - drawi( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void movei long s long s long s */ - -static PyObject * -gl_movei(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - movei( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pnti long s long s long s */ - -static PyObject * -gl_pnti(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - pnti( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void newtag long s long s long s */ - -static PyObject * -gl_newtag(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - newtag( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pdri long s long s long s */ - -static PyObject * -gl_pdri(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - pdri( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pmvi long s long s long s */ - -static PyObject * -gl_pmvi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - pmvi( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rdri long s long s long s */ - -static PyObject * -gl_rdri(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - rdri( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rmvi long s long s long s */ - -static PyObject * -gl_rmvi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - rmvi( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpdri long s long s long s */ - -static PyObject * -gl_rpdri(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - rpdri( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpmvi long s long s long s */ - -static PyObject * -gl_rpmvi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - rpmvi( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void xfpti long s long s long s */ - -static PyObject * -gl_xfpti(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - xfpti( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void circ float s float s float s */ - -static PyObject * -gl_circ(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - circ( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void circf float s float s float s */ - -static PyObject * -gl_circf(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - circf( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void cmov float s float s float s */ - -static PyObject * -gl_cmov(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - cmov( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void draw float s float s float s */ - -static PyObject * -gl_draw(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - draw( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void move float s float s float s */ - -static PyObject * -gl_move(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - move( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pnt float s float s float s */ - -static PyObject * -gl_pnt(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - pnt( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void scale float s float s float s */ - -static PyObject * -gl_scale(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - scale( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void translate float s float s float s */ - -static PyObject * -gl_translate(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - translate( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pdr float s float s float s */ - -static PyObject * -gl_pdr(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - pdr( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pmv float s float s float s */ - -static PyObject * -gl_pmv(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - pmv( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rdr float s float s float s */ - -static PyObject * -gl_rdr(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - rdr( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rmv float s float s float s */ - -static PyObject * -gl_rmv(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - rmv( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpdr float s float s float s */ - -static PyObject * -gl_rpdr(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - rpdr( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpmv float s float s float s */ - -static PyObject * -gl_rpmv(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - rpmv( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void xfpt float s float s float s */ - -static PyObject * -gl_xfpt(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - if (!getifloatarg(args, 3, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 3, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 3, 2, &arg3)) - return NULL; - xfpt( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void RGBcolor short s short s short s */ - -static PyObject * -gl_RGBcolor(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - RGBcolor( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void RGBwritemask short s short s short s */ - -static PyObject * -gl_RGBwritemask(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - RGBwritemask( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setcursor short s short s short s */ - -static PyObject * -gl_setcursor(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - setcursor( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void tie short s short s short s */ - -static PyObject * -gl_tie(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - tie( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void circfs short s short s short s */ - -static PyObject * -gl_circfs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - circfs( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void circs short s short s short s */ - -static PyObject * -gl_circs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - circs( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void cmovs short s short s short s */ - -static PyObject * -gl_cmovs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - cmovs( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void draws short s short s short s */ - -static PyObject * -gl_draws(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - draws( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void moves short s short s short s */ - -static PyObject * -gl_moves(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - moves( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pdrs short s short s short s */ - -static PyObject * -gl_pdrs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - pdrs( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pmvs short s short s short s */ - -static PyObject * -gl_pmvs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - pmvs( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pnts short s short s short s */ - -static PyObject * -gl_pnts(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - pnts( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rdrs short s short s short s */ - -static PyObject * -gl_rdrs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - rdrs( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rmvs short s short s short s */ - -static PyObject * -gl_rmvs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - rmvs( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpdrs short s short s short s */ - -static PyObject * -gl_rpdrs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - rpdrs( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpmvs short s short s short s */ - -static PyObject * -gl_rpmvs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - rpmvs( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void xfpts short s short s short s */ - -static PyObject * -gl_xfpts(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - xfpts( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void curorigin short s short s short s */ - -static PyObject * -gl_curorigin(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - curorigin( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void cyclemap short s short s short s */ - -static PyObject * -gl_cyclemap(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - if (!getishortarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - cyclemap( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void patch float s[4*4] float s[4*4] float s[4*4] */ - -static PyObject * -gl_patch(PyObject *self, PyObject *args) -{ - float arg1 [ 4 ] [ 4 ] ; - float arg2 [ 4 ] [ 4 ] ; - float arg3 [ 4 ] [ 4 ] ; - if (!getifloatarray(args, 3, 0, 4 * 4 , (float *) arg1)) - return NULL; - if (!getifloatarray(args, 3, 1, 4 * 4 , (float *) arg2)) - return NULL; - if (!getifloatarray(args, 3, 2, 4 * 4 , (float *) arg3)) - return NULL; - patch( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void splf long s float s[3*arg1] u_short s[arg1] */ - -static PyObject * -gl_splf(PyObject *self, PyObject *args) -{ - long arg1 ; - float (* arg2) [ 3 ] ; - unsigned short * arg3 ; - if (!getilongarraysize(args, 2, 0, &arg1)) - return NULL; - arg1 = arg1 / 3; - if ((arg2 = (float(*)[3]) PyMem_NEW(float , 3 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getifloatarray(args, 2, 0, 3 * arg1 , (float *) arg2)) - return NULL; - if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 2, 1, arg1 , (short *) arg3)) - return NULL; - splf( arg1 , arg2 , arg3 ); - PyMem_DEL(arg2); - PyMem_DEL(arg3); - Py_INCREF(Py_None); - return Py_None; -} - -/* void splf2 long s float s[2*arg1] u_short s[arg1] */ - -static PyObject * -gl_splf2(PyObject *self, PyObject *args) -{ - long arg1 ; - float (* arg2) [ 2 ] ; - unsigned short * arg3 ; - if (!getilongarraysize(args, 2, 0, &arg1)) - return NULL; - arg1 = arg1 / 2; - if ((arg2 = (float(*)[2]) PyMem_NEW(float , 2 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getifloatarray(args, 2, 0, 2 * arg1 , (float *) arg2)) - return NULL; - if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 2, 1, arg1 , (short *) arg3)) - return NULL; - splf2( arg1 , arg2 , arg3 ); - PyMem_DEL(arg2); - PyMem_DEL(arg3); - Py_INCREF(Py_None); - return Py_None; -} - -/* void splfi long s long s[3*arg1] u_short s[arg1] */ - -static PyObject * -gl_splfi(PyObject *self, PyObject *args) -{ - long arg1 ; - long (* arg2) [ 3 ] ; - unsigned short * arg3 ; - if (!getilongarraysize(args, 2, 0, &arg1)) - return NULL; - arg1 = arg1 / 3; - if ((arg2 = (long(*)[3]) PyMem_NEW(long , 3 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getilongarray(args, 2, 0, 3 * arg1 , (long *) arg2)) - return NULL; - if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 2, 1, arg1 , (short *) arg3)) - return NULL; - splfi( arg1 , arg2 , arg3 ); - PyMem_DEL(arg2); - PyMem_DEL(arg3); - Py_INCREF(Py_None); - return Py_None; -} - -/* void splf2i long s long s[2*arg1] u_short s[arg1] */ - -static PyObject * -gl_splf2i(PyObject *self, PyObject *args) -{ - long arg1 ; - long (* arg2) [ 2 ] ; - unsigned short * arg3 ; - if (!getilongarraysize(args, 2, 0, &arg1)) - return NULL; - arg1 = arg1 / 2; - if ((arg2 = (long(*)[2]) PyMem_NEW(long , 2 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getilongarray(args, 2, 0, 2 * arg1 , (long *) arg2)) - return NULL; - if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 2, 1, arg1 , (short *) arg3)) - return NULL; - splf2i( arg1 , arg2 , arg3 ); - PyMem_DEL(arg2); - PyMem_DEL(arg3); - Py_INCREF(Py_None); - return Py_None; -} - -/* void splfs long s short s[3*arg1] u_short s[arg1] */ - -static PyObject * -gl_splfs(PyObject *self, PyObject *args) -{ - long arg1 ; - short (* arg2) [ 3 ] ; - unsigned short * arg3 ; - if (!getilongarraysize(args, 2, 0, &arg1)) - return NULL; - arg1 = arg1 / 3; - if ((arg2 = (short(*)[3]) PyMem_NEW(short , 3 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 2, 0, 3 * arg1 , (short *) arg2)) - return NULL; - if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 2, 1, arg1 , (short *) arg3)) - return NULL; - splfs( arg1 , arg2 , arg3 ); - PyMem_DEL(arg2); - PyMem_DEL(arg3); - Py_INCREF(Py_None); - return Py_None; -} - -/* void splf2s long s short s[2*arg1] u_short s[arg1] */ - -static PyObject * -gl_splf2s(PyObject *self, PyObject *args) -{ - long arg1 ; - short (* arg2) [ 2 ] ; - unsigned short * arg3 ; - if (!getilongarraysize(args, 2, 0, &arg1)) - return NULL; - arg1 = arg1 / 2; - if ((arg2 = (short(*)[2]) PyMem_NEW(short , 2 * arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 2, 0, 2 * arg1 , (short *) arg2)) - return NULL; - if ((arg3 = PyMem_NEW(unsigned short , arg1 )) == NULL) - return PyErr_NoMemory(); - if (!getishortarray(args, 2, 1, arg1 , (short *) arg3)) - return NULL; - splf2s( arg1 , arg2 , arg3 ); - PyMem_DEL(arg2); - PyMem_DEL(arg3); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rpatch float s[4*4] float s[4*4] float s[4*4] float s[4*4] */ - -static PyObject * -gl_rpatch(PyObject *self, PyObject *args) -{ - float arg1 [ 4 ] [ 4 ] ; - float arg2 [ 4 ] [ 4 ] ; - float arg3 [ 4 ] [ 4 ] ; - float arg4 [ 4 ] [ 4 ] ; - if (!getifloatarray(args, 4, 0, 4 * 4 , (float *) arg1)) - return NULL; - if (!getifloatarray(args, 4, 1, 4 * 4 , (float *) arg2)) - return NULL; - if (!getifloatarray(args, 4, 2, 4 * 4 , (float *) arg3)) - return NULL; - if (!getifloatarray(args, 4, 3, 4 * 4 , (float *) arg4)) - return NULL; - rpatch( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void ortho2 float s float s float s float s */ - -static PyObject * -gl_ortho2(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - if (!getifloatarg(args, 4, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 4, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 4, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 4, 3, &arg4)) - return NULL; - ortho2( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rect float s float s float s float s */ - -static PyObject * -gl_rect(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - if (!getifloatarg(args, 4, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 4, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 4, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 4, 3, &arg4)) - return NULL; - rect( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rectf float s float s float s float s */ - -static PyObject * -gl_rectf(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - if (!getifloatarg(args, 4, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 4, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 4, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 4, 3, &arg4)) - return NULL; - rectf( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void xfpt4 float s float s float s float s */ - -static PyObject * -gl_xfpt4(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - if (!getifloatarg(args, 4, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 4, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 4, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 4, 3, &arg4)) - return NULL; - xfpt4( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void textport short s short s short s short s */ - -static PyObject * -gl_textport(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - textport( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void mapcolor short s short s short s short s */ - -static PyObject * -gl_mapcolor(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - mapcolor( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void scrmask short s short s short s short s */ - -static PyObject * -gl_scrmask(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - scrmask( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setvaluator short s short s short s short s */ - -static PyObject * -gl_setvaluator(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - setvaluator( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void viewport short s short s short s short s */ - -static PyObject * -gl_viewport(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - viewport( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void shaderange short s short s short s short s */ - -static PyObject * -gl_shaderange(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - shaderange( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void xfpt4s short s short s short s short s */ - -static PyObject * -gl_xfpt4s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - xfpt4s( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rectfi long s long s long s long s */ - -static PyObject * -gl_rectfi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - long arg4 ; - if (!getilongarg(args, 4, 0, &arg1)) - return NULL; - if (!getilongarg(args, 4, 1, &arg2)) - return NULL; - if (!getilongarg(args, 4, 2, &arg3)) - return NULL; - if (!getilongarg(args, 4, 3, &arg4)) - return NULL; - rectfi( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void recti long s long s long s long s */ - -static PyObject * -gl_recti(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - long arg4 ; - if (!getilongarg(args, 4, 0, &arg1)) - return NULL; - if (!getilongarg(args, 4, 1, &arg2)) - return NULL; - if (!getilongarg(args, 4, 2, &arg3)) - return NULL; - if (!getilongarg(args, 4, 3, &arg4)) - return NULL; - recti( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void xfpt4i long s long s long s long s */ - -static PyObject * -gl_xfpt4i(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - long arg4 ; - if (!getilongarg(args, 4, 0, &arg1)) - return NULL; - if (!getilongarg(args, 4, 1, &arg2)) - return NULL; - if (!getilongarg(args, 4, 2, &arg3)) - return NULL; - if (!getilongarg(args, 4, 3, &arg4)) - return NULL; - xfpt4i( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void prefposition long s long s long s long s */ - -static PyObject * -gl_prefposition(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - long arg4 ; - if (!getilongarg(args, 4, 0, &arg1)) - return NULL; - if (!getilongarg(args, 4, 1, &arg2)) - return NULL; - if (!getilongarg(args, 4, 2, &arg3)) - return NULL; - if (!getilongarg(args, 4, 3, &arg4)) - return NULL; - prefposition( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void arc float s float s float s short s short s */ - -static PyObject * -gl_arc(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - short arg4 ; - short arg5 ; - if (!getifloatarg(args, 5, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 5, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 5, 2, &arg3)) - return NULL; - if (!getishortarg(args, 5, 3, &arg4)) - return NULL; - if (!getishortarg(args, 5, 4, &arg5)) - return NULL; - arc( arg1 , arg2 , arg3 , arg4 , arg5 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void arcf float s float s float s short s short s */ - -static PyObject * -gl_arcf(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - short arg4 ; - short arg5 ; - if (!getifloatarg(args, 5, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 5, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 5, 2, &arg3)) - return NULL; - if (!getishortarg(args, 5, 3, &arg4)) - return NULL; - if (!getishortarg(args, 5, 4, &arg5)) - return NULL; - arcf( arg1 , arg2 , arg3 , arg4 , arg5 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void arcfi long s long s long s short s short s */ - -static PyObject * -gl_arcfi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - short arg4 ; - short arg5 ; - if (!getilongarg(args, 5, 0, &arg1)) - return NULL; - if (!getilongarg(args, 5, 1, &arg2)) - return NULL; - if (!getilongarg(args, 5, 2, &arg3)) - return NULL; - if (!getishortarg(args, 5, 3, &arg4)) - return NULL; - if (!getishortarg(args, 5, 4, &arg5)) - return NULL; - arcfi( arg1 , arg2 , arg3 , arg4 , arg5 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void arci long s long s long s short s short s */ - -static PyObject * -gl_arci(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - short arg4 ; - short arg5 ; - if (!getilongarg(args, 5, 0, &arg1)) - return NULL; - if (!getilongarg(args, 5, 1, &arg2)) - return NULL; - if (!getilongarg(args, 5, 2, &arg3)) - return NULL; - if (!getishortarg(args, 5, 3, &arg4)) - return NULL; - if (!getishortarg(args, 5, 4, &arg5)) - return NULL; - arci( arg1 , arg2 , arg3 , arg4 , arg5 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void bbox2 short s short s float s float s float s float s */ - -static PyObject * -gl_bbox2(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - float arg3 ; - float arg4 ; - float arg5 ; - float arg6 ; - if (!getishortarg(args, 6, 0, &arg1)) - return NULL; - if (!getishortarg(args, 6, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 6, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 6, 3, &arg4)) - return NULL; - if (!getifloatarg(args, 6, 4, &arg5)) - return NULL; - if (!getifloatarg(args, 6, 5, &arg6)) - return NULL; - bbox2( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void bbox2i short s short s long s long s long s long s */ - -static PyObject * -gl_bbox2i(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - long arg3 ; - long arg4 ; - long arg5 ; - long arg6 ; - if (!getishortarg(args, 6, 0, &arg1)) - return NULL; - if (!getishortarg(args, 6, 1, &arg2)) - return NULL; - if (!getilongarg(args, 6, 2, &arg3)) - return NULL; - if (!getilongarg(args, 6, 3, &arg4)) - return NULL; - if (!getilongarg(args, 6, 4, &arg5)) - return NULL; - if (!getilongarg(args, 6, 5, &arg6)) - return NULL; - bbox2i( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void bbox2s short s short s short s short s short s short s */ - -static PyObject * -gl_bbox2s(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - short arg5 ; - short arg6 ; - if (!getishortarg(args, 6, 0, &arg1)) - return NULL; - if (!getishortarg(args, 6, 1, &arg2)) - return NULL; - if (!getishortarg(args, 6, 2, &arg3)) - return NULL; - if (!getishortarg(args, 6, 3, &arg4)) - return NULL; - if (!getishortarg(args, 6, 4, &arg5)) - return NULL; - if (!getishortarg(args, 6, 5, &arg6)) - return NULL; - bbox2s( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void blink short s short s short s short s short s */ - -static PyObject * -gl_blink(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - short arg5 ; - if (!getishortarg(args, 5, 0, &arg1)) - return NULL; - if (!getishortarg(args, 5, 1, &arg2)) - return NULL; - if (!getishortarg(args, 5, 2, &arg3)) - return NULL; - if (!getishortarg(args, 5, 3, &arg4)) - return NULL; - if (!getishortarg(args, 5, 4, &arg5)) - return NULL; - blink( arg1 , arg2 , arg3 , arg4 , arg5 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void ortho float s float s float s float s float s float s */ - -static PyObject * -gl_ortho(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - float arg5 ; - float arg6 ; - if (!getifloatarg(args, 6, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 6, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 6, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 6, 3, &arg4)) - return NULL; - if (!getifloatarg(args, 6, 4, &arg5)) - return NULL; - if (!getifloatarg(args, 6, 5, &arg6)) - return NULL; - ortho( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void window float s float s float s float s float s float s */ - -static PyObject * -gl_window(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - float arg5 ; - float arg6 ; - if (!getifloatarg(args, 6, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 6, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 6, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 6, 3, &arg4)) - return NULL; - if (!getifloatarg(args, 6, 4, &arg5)) - return NULL; - if (!getifloatarg(args, 6, 5, &arg6)) - return NULL; - window( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lookat float s float s float s float s float s float s short s */ - -static PyObject * -gl_lookat(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - float arg5 ; - float arg6 ; - short arg7 ; - if (!getifloatarg(args, 7, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 7, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 7, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 7, 3, &arg4)) - return NULL; - if (!getifloatarg(args, 7, 4, &arg5)) - return NULL; - if (!getifloatarg(args, 7, 5, &arg6)) - return NULL; - if (!getishortarg(args, 7, 6, &arg7)) - return NULL; - lookat( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 , arg7 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void perspective short s float s float s float s */ - -static PyObject * -gl_perspective(PyObject *self, PyObject *args) -{ - short arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 4, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 4, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 4, 3, &arg4)) - return NULL; - perspective( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void polarview float s short s short s short s */ - -static PyObject * -gl_polarview(PyObject *self, PyObject *args) -{ - float arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getifloatarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - polarview( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void arcfs short s short s short s short s short s */ - -static PyObject * -gl_arcfs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - short arg5 ; - if (!getishortarg(args, 5, 0, &arg1)) - return NULL; - if (!getishortarg(args, 5, 1, &arg2)) - return NULL; - if (!getishortarg(args, 5, 2, &arg3)) - return NULL; - if (!getishortarg(args, 5, 3, &arg4)) - return NULL; - if (!getishortarg(args, 5, 4, &arg5)) - return NULL; - arcfs( arg1 , arg2 , arg3 , arg4 , arg5 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void arcs short s short s short s short s short s */ - -static PyObject * -gl_arcs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - short arg5 ; - if (!getishortarg(args, 5, 0, &arg1)) - return NULL; - if (!getishortarg(args, 5, 1, &arg2)) - return NULL; - if (!getishortarg(args, 5, 2, &arg3)) - return NULL; - if (!getishortarg(args, 5, 3, &arg4)) - return NULL; - if (!getishortarg(args, 5, 4, &arg5)) - return NULL; - arcs( arg1 , arg2 , arg3 , arg4 , arg5 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rectcopy short s short s short s short s short s short s */ - -static PyObject * -gl_rectcopy(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - short arg5 ; - short arg6 ; - if (!getishortarg(args, 6, 0, &arg1)) - return NULL; - if (!getishortarg(args, 6, 1, &arg2)) - return NULL; - if (!getishortarg(args, 6, 2, &arg3)) - return NULL; - if (!getishortarg(args, 6, 3, &arg4)) - return NULL; - if (!getishortarg(args, 6, 4, &arg5)) - return NULL; - if (!getishortarg(args, 6, 5, &arg6)) - return NULL; - rectcopy( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void RGBcursor short s short s short s short s short s short s short s */ - -static PyObject * -gl_RGBcursor(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - short arg5 ; - short arg6 ; - short arg7 ; - if (!getishortarg(args, 7, 0, &arg1)) - return NULL; - if (!getishortarg(args, 7, 1, &arg2)) - return NULL; - if (!getishortarg(args, 7, 2, &arg3)) - return NULL; - if (!getishortarg(args, 7, 3, &arg4)) - return NULL; - if (!getishortarg(args, 7, 4, &arg5)) - return NULL; - if (!getishortarg(args, 7, 5, &arg6)) - return NULL; - if (!getishortarg(args, 7, 6, &arg7)) - return NULL; - RGBcursor( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 , arg7 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* long getbutton short s */ - -static PyObject * -gl_getbutton(PyObject *self, PyObject *args) -{ - long retval; - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - retval = getbutton( arg1 ); - return mknewlongobject(retval); -} - -/* long getcmmode */ - -static PyObject * -gl_getcmmode(PyObject *self, PyObject *args) -{ - long retval; - retval = getcmmode( ); - return mknewlongobject(retval); -} - -/* long getlsbackup */ - -static PyObject * -gl_getlsbackup(PyObject *self, PyObject *args) -{ - long retval; - retval = getlsbackup( ); - return mknewlongobject(retval); -} - -/* long getresetls */ - -static PyObject * -gl_getresetls(PyObject *self, PyObject *args) -{ - long retval; - retval = getresetls( ); - return mknewlongobject(retval); -} - -/* long getdcm */ - -static PyObject * -gl_getdcm(PyObject *self, PyObject *args) -{ - long retval; - retval = getdcm( ); - return mknewlongobject(retval); -} - -/* long getzbuffer */ - -static PyObject * -gl_getzbuffer(PyObject *self, PyObject *args) -{ - long retval; - retval = getzbuffer( ); - return mknewlongobject(retval); -} - -/* long ismex */ - -static PyObject * -gl_ismex(PyObject *self, PyObject *args) -{ - long retval; - retval = ismex( ); - return mknewlongobject(retval); -} - -/* long isobj long s */ - -static PyObject * -gl_isobj(PyObject *self, PyObject *args) -{ - long retval; - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - retval = isobj( arg1 ); - return mknewlongobject(retval); -} - -/* long isqueued short s */ - -static PyObject * -gl_isqueued(PyObject *self, PyObject *args) -{ - long retval; - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - retval = isqueued( arg1 ); - return mknewlongobject(retval); -} - -/* long istag long s */ - -static PyObject * -gl_istag(PyObject *self, PyObject *args) -{ - long retval; - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - retval = istag( arg1 ); - return mknewlongobject(retval); -} - -/* long genobj */ - -static PyObject * -gl_genobj(PyObject *self, PyObject *args) -{ - long retval; - retval = genobj( ); - return mknewlongobject(retval); -} - -/* long gentag */ - -static PyObject * -gl_gentag(PyObject *self, PyObject *args) -{ - long retval; - retval = gentag( ); - return mknewlongobject(retval); -} - -/* long getbuffer */ - -static PyObject * -gl_getbuffer(PyObject *self, PyObject *args) -{ - long retval; - retval = getbuffer( ); - return mknewlongobject(retval); -} - -/* long getcolor */ - -static PyObject * -gl_getcolor(PyObject *self, PyObject *args) -{ - long retval; - retval = getcolor( ); - return mknewlongobject(retval); -} - -/* long getdisplaymode */ - -static PyObject * -gl_getdisplaymode(PyObject *self, PyObject *args) -{ - long retval; - retval = getdisplaymode( ); - return mknewlongobject(retval); -} - -/* long getfont */ - -static PyObject * -gl_getfont(PyObject *self, PyObject *args) -{ - long retval; - retval = getfont( ); - return mknewlongobject(retval); -} - -/* long getheight */ - -static PyObject * -gl_getheight(PyObject *self, PyObject *args) -{ - long retval; - retval = getheight( ); - return mknewlongobject(retval); -} - -/* long gethitcode */ - -static PyObject * -gl_gethitcode(PyObject *self, PyObject *args) -{ - long retval; - retval = gethitcode( ); - return mknewlongobject(retval); -} - -/* long getlstyle */ - -static PyObject * -gl_getlstyle(PyObject *self, PyObject *args) -{ - long retval; - retval = getlstyle( ); - return mknewlongobject(retval); -} - -/* long getlwidth */ - -static PyObject * -gl_getlwidth(PyObject *self, PyObject *args) -{ - long retval; - retval = getlwidth( ); - return mknewlongobject(retval); -} - -/* long getmap */ - -static PyObject * -gl_getmap(PyObject *self, PyObject *args) -{ - long retval; - retval = getmap( ); - return mknewlongobject(retval); -} - -/* long getplanes */ - -static PyObject * -gl_getplanes(PyObject *self, PyObject *args) -{ - long retval; - retval = getplanes( ); - return mknewlongobject(retval); -} - -/* long getwritemask */ - -static PyObject * -gl_getwritemask(PyObject *self, PyObject *args) -{ - long retval; - retval = getwritemask( ); - return mknewlongobject(retval); -} - -/* long qtest */ - -static PyObject * -gl_qtest(PyObject *self, PyObject *args) -{ - long retval; - retval = qtest( ); - return mknewlongobject(retval); -} - -/* long getlsrepeat */ - -static PyObject * -gl_getlsrepeat(PyObject *self, PyObject *args) -{ - long retval; - retval = getlsrepeat( ); - return mknewlongobject(retval); -} - -/* long getmonitor */ - -static PyObject * -gl_getmonitor(PyObject *self, PyObject *args) -{ - long retval; - retval = getmonitor( ); - return mknewlongobject(retval); -} - -/* long getopenobj */ - -static PyObject * -gl_getopenobj(PyObject *self, PyObject *args) -{ - long retval; - retval = getopenobj( ); - return mknewlongobject(retval); -} - -/* long getpattern */ - -static PyObject * -gl_getpattern(PyObject *self, PyObject *args) -{ - long retval; - retval = getpattern( ); - return mknewlongobject(retval); -} - -/* long winget */ - -static PyObject * -gl_winget(PyObject *self, PyObject *args) -{ - long retval; - retval = winget( ); - return mknewlongobject(retval); -} - -/* long winattach */ - -static PyObject * -gl_winattach(PyObject *self, PyObject *args) -{ - long retval; - retval = winattach( ); - return mknewlongobject(retval); -} - -/* long getothermonitor */ - -static PyObject * -gl_getothermonitor(PyObject *self, PyObject *args) -{ - long retval; - retval = getothermonitor( ); - return mknewlongobject(retval); -} - -/* long newpup */ - -static PyObject * -gl_newpup(PyObject *self, PyObject *args) -{ - long retval; - retval = newpup( ); - return mknewlongobject(retval); -} - -/* long getvaluator short s */ - -static PyObject * -gl_getvaluator(PyObject *self, PyObject *args) -{ - long retval; - short arg1 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - retval = getvaluator( arg1 ); - return mknewlongobject(retval); -} - -/* void winset long s */ - -static PyObject * -gl_winset(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - winset( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* long dopup long s */ - -static PyObject * -gl_dopup(PyObject *self, PyObject *args) -{ - long retval; - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - retval = dopup( arg1 ); - return mknewlongobject(retval); -} - -/* void getdepth short r short r */ - -static PyObject * -gl_getdepth(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - getdepth( & arg1 , & arg2 ); - { PyObject *v = PyTuple_New( 2 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewshortobject(arg1)); - PyTuple_SetItem(v, 1, mknewshortobject(arg2)); - return v; - } -} - -/* void getcpos short r short r */ - -static PyObject * -gl_getcpos(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - getcpos( & arg1 , & arg2 ); - { PyObject *v = PyTuple_New( 2 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewshortobject(arg1)); - PyTuple_SetItem(v, 1, mknewshortobject(arg2)); - return v; - } -} - -/* void getsize long r long r */ - -static PyObject * -gl_getsize(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - getsize( & arg1 , & arg2 ); - { PyObject *v = PyTuple_New( 2 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewlongobject(arg1)); - PyTuple_SetItem(v, 1, mknewlongobject(arg2)); - return v; - } -} - -/* void getorigin long r long r */ - -static PyObject * -gl_getorigin(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - getorigin( & arg1 , & arg2 ); - { PyObject *v = PyTuple_New( 2 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewlongobject(arg1)); - PyTuple_SetItem(v, 1, mknewlongobject(arg2)); - return v; - } -} - -/* void getviewport short r short r short r short r */ - -static PyObject * -gl_getviewport(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - getviewport( & arg1 , & arg2 , & arg3 , & arg4 ); - { PyObject *v = PyTuple_New( 4 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewshortobject(arg1)); - PyTuple_SetItem(v, 1, mknewshortobject(arg2)); - PyTuple_SetItem(v, 2, mknewshortobject(arg3)); - PyTuple_SetItem(v, 3, mknewshortobject(arg4)); - return v; - } -} - -/* void gettp short r short r short r short r */ - -static PyObject * -gl_gettp(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - gettp( & arg1 , & arg2 , & arg3 , & arg4 ); - { PyObject *v = PyTuple_New( 4 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewshortobject(arg1)); - PyTuple_SetItem(v, 1, mknewshortobject(arg2)); - PyTuple_SetItem(v, 2, mknewshortobject(arg3)); - PyTuple_SetItem(v, 3, mknewshortobject(arg4)); - return v; - } -} - -/* void getgpos float r float r float r float r */ - -static PyObject * -gl_getgpos(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - getgpos( & arg1 , & arg2 , & arg3 , & arg4 ); - { PyObject *v = PyTuple_New( 4 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewfloatobject(arg1)); - PyTuple_SetItem(v, 1, mknewfloatobject(arg2)); - PyTuple_SetItem(v, 2, mknewfloatobject(arg3)); - PyTuple_SetItem(v, 3, mknewfloatobject(arg4)); - return v; - } -} - -/* void winposition long s long s long s long s */ - -static PyObject * -gl_winposition(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - long arg4 ; - if (!getilongarg(args, 4, 0, &arg1)) - return NULL; - if (!getilongarg(args, 4, 1, &arg2)) - return NULL; - if (!getilongarg(args, 4, 2, &arg3)) - return NULL; - if (!getilongarg(args, 4, 3, &arg4)) - return NULL; - winposition( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void gRGBcolor short r short r short r */ - -static PyObject * -gl_gRGBcolor(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - gRGBcolor( & arg1 , & arg2 , & arg3 ); - { PyObject *v = PyTuple_New( 3 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewshortobject(arg1)); - PyTuple_SetItem(v, 1, mknewshortobject(arg2)); - PyTuple_SetItem(v, 2, mknewshortobject(arg3)); - return v; - } -} - -/* void gRGBmask short r short r short r */ - -static PyObject * -gl_gRGBmask(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - gRGBmask( & arg1 , & arg2 , & arg3 ); - { PyObject *v = PyTuple_New( 3 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewshortobject(arg1)); - PyTuple_SetItem(v, 1, mknewshortobject(arg2)); - PyTuple_SetItem(v, 2, mknewshortobject(arg3)); - return v; - } -} - -/* void getscrmask short r short r short r short r */ - -static PyObject * -gl_getscrmask(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - getscrmask( & arg1 , & arg2 , & arg3 , & arg4 ); - { PyObject *v = PyTuple_New( 4 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewshortobject(arg1)); - PyTuple_SetItem(v, 1, mknewshortobject(arg2)); - PyTuple_SetItem(v, 2, mknewshortobject(arg3)); - PyTuple_SetItem(v, 3, mknewshortobject(arg4)); - return v; - } -} - -/* void getmcolor short s short r short r short r */ - -static PyObject * -gl_getmcolor(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 1, 0, &arg1)) - return NULL; - getmcolor( arg1 , & arg2 , & arg3 , & arg4 ); - { PyObject *v = PyTuple_New( 3 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewshortobject(arg2)); - PyTuple_SetItem(v, 1, mknewshortobject(arg3)); - PyTuple_SetItem(v, 2, mknewshortobject(arg4)); - return v; - } -} - -/* void mapw long s short s short s float r float r float r float r float r float r */ - -static PyObject * -gl_mapw(PyObject *self, PyObject *args) -{ - long arg1 ; - short arg2 ; - short arg3 ; - float arg4 ; - float arg5 ; - float arg6 ; - float arg7 ; - float arg8 ; - float arg9 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - mapw( arg1 , arg2 , arg3 , & arg4 , & arg5 , & arg6 , & arg7 , & arg8 , & arg9 ); - { PyObject *v = PyTuple_New( 6 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewfloatobject(arg4)); - PyTuple_SetItem(v, 1, mknewfloatobject(arg5)); - PyTuple_SetItem(v, 2, mknewfloatobject(arg6)); - PyTuple_SetItem(v, 3, mknewfloatobject(arg7)); - PyTuple_SetItem(v, 4, mknewfloatobject(arg8)); - PyTuple_SetItem(v, 5, mknewfloatobject(arg9)); - return v; - } -} - -/* void mapw2 long s short s short s float r float r */ - -static PyObject * -gl_mapw2(PyObject *self, PyObject *args) -{ - long arg1 ; - short arg2 ; - short arg3 ; - float arg4 ; - float arg5 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getishortarg(args, 3, 1, &arg2)) - return NULL; - if (!getishortarg(args, 3, 2, &arg3)) - return NULL; - mapw2( arg1 , arg2 , arg3 , & arg4 , & arg5 ); - { PyObject *v = PyTuple_New( 2 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewfloatobject(arg4)); - PyTuple_SetItem(v, 1, mknewfloatobject(arg5)); - return v; - } -} - -/* void getcursor short r u_short r u_short r long r */ - -static PyObject * -gl_getcursor(PyObject *self, PyObject *args) -{ - short arg1 ; - unsigned short arg2 ; - unsigned short arg3 ; - long arg4 ; - getcursor( & arg1 , & arg2 , & arg3 , & arg4 ); - { PyObject *v = PyTuple_New( 4 ); - if (v == NULL) return NULL; - PyTuple_SetItem(v, 0, mknewshortobject(arg1)); - PyTuple_SetItem(v, 1, mknewshortobject((short) arg2)); - PyTuple_SetItem(v, 2, mknewshortobject((short) arg3)); - PyTuple_SetItem(v, 3, mknewlongobject(arg4)); - return v; - } -} - -/* void cmode */ - -static PyObject * -gl_cmode(PyObject *self, PyObject *args) -{ - cmode( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void concave long s */ - -static PyObject * -gl_concave(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - concave( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void curstype long s */ - -static PyObject * -gl_curstype(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - curstype( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void drawmode long s */ - -static PyObject * -gl_drawmode(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - drawmode( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void gammaramp short s[256] short s[256] short s[256] */ - -static PyObject * -gl_gammaramp(PyObject *self, PyObject *args) -{ - short arg1 [ 256 ] ; - short arg2 [ 256 ] ; - short arg3 [ 256 ] ; - if (!getishortarray(args, 3, 0, 256 , arg1)) - return NULL; - if (!getishortarray(args, 3, 1, 256 , arg2)) - return NULL; - if (!getishortarray(args, 3, 2, 256 , arg3)) - return NULL; - gammaramp( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* long getbackface */ - -static PyObject * -gl_getbackface(PyObject *self, PyObject *args) -{ - long retval; - retval = getbackface( ); - return mknewlongobject(retval); -} - -/* long getdescender */ - -static PyObject * -gl_getdescender(PyObject *self, PyObject *args) -{ - long retval; - retval = getdescender( ); - return mknewlongobject(retval); -} - -/* long getdrawmode */ - -static PyObject * -gl_getdrawmode(PyObject *self, PyObject *args) -{ - long retval; - retval = getdrawmode( ); - return mknewlongobject(retval); -} - -/* long getmmode */ - -static PyObject * -gl_getmmode(PyObject *self, PyObject *args) -{ - long retval; - retval = getmmode( ); - return mknewlongobject(retval); -} - -/* long getsm */ - -static PyObject * -gl_getsm(PyObject *self, PyObject *args) -{ - long retval; - retval = getsm( ); - return mknewlongobject(retval); -} - -/* long getvideo long s */ - -static PyObject * -gl_getvideo(PyObject *self, PyObject *args) -{ - long retval; - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - retval = getvideo( arg1 ); - return mknewlongobject(retval); -} - -/* void imakebackground */ - -static PyObject * -gl_imakebackground(PyObject *self, PyObject *args) -{ - imakebackground( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lmbind short s short s */ - -static PyObject * -gl_lmbind(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - if (!getishortarg(args, 2, 0, &arg1)) - return NULL; - if (!getishortarg(args, 2, 1, &arg2)) - return NULL; - lmbind( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lmdef long s long s long s float s[arg3] */ - -static PyObject * -gl_lmdef(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - float * arg4 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarraysize(args, 3, 2, &arg3)) - return NULL; - if ((arg4 = PyMem_NEW(float , arg3 )) == NULL) - return PyErr_NoMemory(); - if (!getifloatarray(args, 3, 2, arg3 , arg4)) - return NULL; - lmdef( arg1 , arg2 , arg3 , arg4 ); - PyMem_DEL(arg4); - Py_INCREF(Py_None); - return Py_None; -} - -/* void mmode long s */ - -static PyObject * -gl_mmode(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - mmode( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void normal float s[3] */ - -static PyObject * -gl_normal(PyObject *self, PyObject *args) -{ - float arg1 [ 3 ] ; - if (!getifloatarray(args, 1, 0, 3 , arg1)) - return NULL; - normal( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void overlay long s */ - -static PyObject * -gl_overlay(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - overlay( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void RGBrange short s short s short s short s short s short s short s short s */ - -static PyObject * -gl_RGBrange(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - short arg5 ; - short arg6 ; - short arg7 ; - short arg8 ; - if (!getishortarg(args, 8, 0, &arg1)) - return NULL; - if (!getishortarg(args, 8, 1, &arg2)) - return NULL; - if (!getishortarg(args, 8, 2, &arg3)) - return NULL; - if (!getishortarg(args, 8, 3, &arg4)) - return NULL; - if (!getishortarg(args, 8, 4, &arg5)) - return NULL; - if (!getishortarg(args, 8, 5, &arg6)) - return NULL; - if (!getishortarg(args, 8, 6, &arg7)) - return NULL; - if (!getishortarg(args, 8, 7, &arg8)) - return NULL; - RGBrange( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 , arg7 , arg8 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setvideo long s long s */ - -static PyObject * -gl_setvideo(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - setvideo( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void shademodel long s */ - -static PyObject * -gl_shademodel(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - shademodel( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void underlay long s */ - -static PyObject * -gl_underlay(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - underlay( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void bgnclosedline */ - -static PyObject * -gl_bgnclosedline(PyObject *self, PyObject *args) -{ - bgnclosedline( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void bgnline */ - -static PyObject * -gl_bgnline(PyObject *self, PyObject *args) -{ - bgnline( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void bgnpoint */ - -static PyObject * -gl_bgnpoint(PyObject *self, PyObject *args) -{ - bgnpoint( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void bgnpolygon */ - -static PyObject * -gl_bgnpolygon(PyObject *self, PyObject *args) -{ - bgnpolygon( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void bgnsurface */ - -static PyObject * -gl_bgnsurface(PyObject *self, PyObject *args) -{ - bgnsurface( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void bgntmesh */ - -static PyObject * -gl_bgntmesh(PyObject *self, PyObject *args) -{ - bgntmesh( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void bgntrim */ - -static PyObject * -gl_bgntrim(PyObject *self, PyObject *args) -{ - bgntrim( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void endclosedline */ - -static PyObject * -gl_endclosedline(PyObject *self, PyObject *args) -{ - endclosedline( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void endline */ - -static PyObject * -gl_endline(PyObject *self, PyObject *args) -{ - endline( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void endpoint */ - -static PyObject * -gl_endpoint(PyObject *self, PyObject *args) -{ - endpoint( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void endpolygon */ - -static PyObject * -gl_endpolygon(PyObject *self, PyObject *args) -{ - endpolygon( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void endsurface */ - -static PyObject * -gl_endsurface(PyObject *self, PyObject *args) -{ - endsurface( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void endtmesh */ - -static PyObject * -gl_endtmesh(PyObject *self, PyObject *args) -{ - endtmesh( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void endtrim */ - -static PyObject * -gl_endtrim(PyObject *self, PyObject *args) -{ - endtrim( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void blendfunction long s long s */ - -static PyObject * -gl_blendfunction(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - blendfunction( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void c3f float s[3] */ - -static PyObject * -gl_c3f(PyObject *self, PyObject *args) -{ - float arg1 [ 3 ] ; - if (!getifloatarray(args, 1, 0, 3 , arg1)) - return NULL; - c3f( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void c3i long s[3] */ - -static PyObject * -gl_c3i(PyObject *self, PyObject *args) -{ - long arg1 [ 3 ] ; - if (!getilongarray(args, 1, 0, 3 , arg1)) - return NULL; - c3i( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void c3s short s[3] */ - -static PyObject * -gl_c3s(PyObject *self, PyObject *args) -{ - short arg1 [ 3 ] ; - if (!getishortarray(args, 1, 0, 3 , arg1)) - return NULL; - c3s( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void c4f float s[4] */ - -static PyObject * -gl_c4f(PyObject *self, PyObject *args) -{ - float arg1 [ 4 ] ; - if (!getifloatarray(args, 1, 0, 4 , arg1)) - return NULL; - c4f( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void c4i long s[4] */ - -static PyObject * -gl_c4i(PyObject *self, PyObject *args) -{ - long arg1 [ 4 ] ; - if (!getilongarray(args, 1, 0, 4 , arg1)) - return NULL; - c4i( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void c4s short s[4] */ - -static PyObject * -gl_c4s(PyObject *self, PyObject *args) -{ - short arg1 [ 4 ] ; - if (!getishortarray(args, 1, 0, 4 , arg1)) - return NULL; - c4s( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void colorf float s */ - -static PyObject * -gl_colorf(PyObject *self, PyObject *args) -{ - float arg1 ; - if (!getifloatarg(args, 1, 0, &arg1)) - return NULL; - colorf( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void cpack long s */ - -static PyObject * -gl_cpack(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - cpack( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void czclear long s long s */ - -static PyObject * -gl_czclear(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - czclear( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void dglclose long s */ - -static PyObject * -gl_dglclose(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - dglclose( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* long dglopen char *s long s */ - -static PyObject * -gl_dglopen(PyObject *self, PyObject *args) -{ - long retval; - string arg1 ; - long arg2 ; - if (!getistringarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - retval = dglopen( arg1 , arg2 ); - return mknewlongobject(retval); -} - -/* long getgdesc long s */ - -static PyObject * -gl_getgdesc(PyObject *self, PyObject *args) -{ - long retval; - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - retval = getgdesc( arg1 ); - return mknewlongobject(retval); -} - -/* void getnurbsproperty long s float r */ - -static PyObject * -gl_getnurbsproperty(PyObject *self, PyObject *args) -{ - long arg1 ; - float arg2 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - getnurbsproperty( arg1 , & arg2 ); - return mknewfloatobject(arg2); -} - -/* void glcompat long s long s */ - -static PyObject * -gl_glcompat(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - glcompat( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void iconsize long s long s */ - -static PyObject * -gl_iconsize(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - iconsize( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void icontitle char *s */ - -static PyObject * -gl_icontitle(PyObject *self, PyObject *args) -{ - string arg1 ; - if (!getistringarg(args, 1, 0, &arg1)) - return NULL; - icontitle( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lRGBrange short s short s short s short s short s short s long s long s */ - -static PyObject * -gl_lRGBrange(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - short arg5 ; - short arg6 ; - long arg7 ; - long arg8 ; - if (!getishortarg(args, 8, 0, &arg1)) - return NULL; - if (!getishortarg(args, 8, 1, &arg2)) - return NULL; - if (!getishortarg(args, 8, 2, &arg3)) - return NULL; - if (!getishortarg(args, 8, 3, &arg4)) - return NULL; - if (!getishortarg(args, 8, 4, &arg5)) - return NULL; - if (!getishortarg(args, 8, 5, &arg6)) - return NULL; - if (!getilongarg(args, 8, 6, &arg7)) - return NULL; - if (!getilongarg(args, 8, 7, &arg8)) - return NULL; - lRGBrange( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 , arg7 , arg8 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void linesmooth long s */ - -static PyObject * -gl_linesmooth(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - linesmooth( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lmcolor long s */ - -static PyObject * -gl_lmcolor(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - lmcolor( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void logicop long s */ - -static PyObject * -gl_logicop(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - logicop( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lsetdepth long s long s */ - -static PyObject * -gl_lsetdepth(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - lsetdepth( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void lshaderange short s short s long s long s */ - -static PyObject * -gl_lshaderange(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - long arg3 ; - long arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getilongarg(args, 4, 2, &arg3)) - return NULL; - if (!getilongarg(args, 4, 3, &arg4)) - return NULL; - lshaderange( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void n3f float s[3] */ - -static PyObject * -gl_n3f(PyObject *self, PyObject *args) -{ - float arg1 [ 3 ] ; - if (!getifloatarray(args, 1, 0, 3 , arg1)) - return NULL; - n3f( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void noborder */ - -static PyObject * -gl_noborder(PyObject *self, PyObject *args) -{ - noborder( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pntsmooth long s */ - -static PyObject * -gl_pntsmooth(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - pntsmooth( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void readsource long s */ - -static PyObject * -gl_readsource(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - readsource( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void rectzoom float s float s */ - -static PyObject * -gl_rectzoom(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - if (!getifloatarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - rectzoom( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void sbox float s float s float s float s */ - -static PyObject * -gl_sbox(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - if (!getifloatarg(args, 4, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 4, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 4, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 4, 3, &arg4)) - return NULL; - sbox( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void sboxi long s long s long s long s */ - -static PyObject * -gl_sboxi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - long arg4 ; - if (!getilongarg(args, 4, 0, &arg1)) - return NULL; - if (!getilongarg(args, 4, 1, &arg2)) - return NULL; - if (!getilongarg(args, 4, 2, &arg3)) - return NULL; - if (!getilongarg(args, 4, 3, &arg4)) - return NULL; - sboxi( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void sboxs short s short s short s short s */ - -static PyObject * -gl_sboxs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - sboxs( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void sboxf float s float s float s float s */ - -static PyObject * -gl_sboxf(PyObject *self, PyObject *args) -{ - float arg1 ; - float arg2 ; - float arg3 ; - float arg4 ; - if (!getifloatarg(args, 4, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 4, 1, &arg2)) - return NULL; - if (!getifloatarg(args, 4, 2, &arg3)) - return NULL; - if (!getifloatarg(args, 4, 3, &arg4)) - return NULL; - sboxf( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void sboxfi long s long s long s long s */ - -static PyObject * -gl_sboxfi(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - long arg4 ; - if (!getilongarg(args, 4, 0, &arg1)) - return NULL; - if (!getilongarg(args, 4, 1, &arg2)) - return NULL; - if (!getilongarg(args, 4, 2, &arg3)) - return NULL; - if (!getilongarg(args, 4, 3, &arg4)) - return NULL; - sboxfi( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void sboxfs short s short s short s short s */ - -static PyObject * -gl_sboxfs(PyObject *self, PyObject *args) -{ - short arg1 ; - short arg2 ; - short arg3 ; - short arg4 ; - if (!getishortarg(args, 4, 0, &arg1)) - return NULL; - if (!getishortarg(args, 4, 1, &arg2)) - return NULL; - if (!getishortarg(args, 4, 2, &arg3)) - return NULL; - if (!getishortarg(args, 4, 3, &arg4)) - return NULL; - sboxfs( arg1 , arg2 , arg3 , arg4 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setnurbsproperty long s float s */ - -static PyObject * -gl_setnurbsproperty(PyObject *self, PyObject *args) -{ - long arg1 ; - float arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getifloatarg(args, 2, 1, &arg2)) - return NULL; - setnurbsproperty( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void setpup long s long s long s */ - -static PyObject * -gl_setpup(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - long arg3 ; - if (!getilongarg(args, 3, 0, &arg1)) - return NULL; - if (!getilongarg(args, 3, 1, &arg2)) - return NULL; - if (!getilongarg(args, 3, 2, &arg3)) - return NULL; - setpup( arg1 , arg2 , arg3 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void smoothline long s */ - -static PyObject * -gl_smoothline(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - smoothline( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void subpixel long s */ - -static PyObject * -gl_subpixel(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - subpixel( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void swaptmesh */ - -static PyObject * -gl_swaptmesh(PyObject *self, PyObject *args) -{ - swaptmesh( ); - Py_INCREF(Py_None); - return Py_None; -} - -/* long swinopen long s */ - -static PyObject * -gl_swinopen(PyObject *self, PyObject *args) -{ - long retval; - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - retval = swinopen( arg1 ); - return mknewlongobject(retval); -} - -/* void v2f float s[2] */ - -static PyObject * -gl_v2f(PyObject *self, PyObject *args) -{ - float arg1 [ 2 ] ; - if (!getifloatarray(args, 1, 0, 2 , arg1)) - return NULL; - v2f( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v2i long s[2] */ - -static PyObject * -gl_v2i(PyObject *self, PyObject *args) -{ - long arg1 [ 2 ] ; - if (!getilongarray(args, 1, 0, 2 , arg1)) - return NULL; - v2i( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v2s short s[2] */ - -static PyObject * -gl_v2s(PyObject *self, PyObject *args) -{ - short arg1 [ 2 ] ; - if (!getishortarray(args, 1, 0, 2 , arg1)) - return NULL; - v2s( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v3f float s[3] */ - -static PyObject * -gl_v3f(PyObject *self, PyObject *args) -{ - float arg1 [ 3 ] ; - if (!getifloatarray(args, 1, 0, 3 , arg1)) - return NULL; - v3f( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v3i long s[3] */ - -static PyObject * -gl_v3i(PyObject *self, PyObject *args) -{ - long arg1 [ 3 ] ; - if (!getilongarray(args, 1, 0, 3 , arg1)) - return NULL; - v3i( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v3s short s[3] */ - -static PyObject * -gl_v3s(PyObject *self, PyObject *args) -{ - short arg1 [ 3 ] ; - if (!getishortarray(args, 1, 0, 3 , arg1)) - return NULL; - v3s( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v4f float s[4] */ - -static PyObject * -gl_v4f(PyObject *self, PyObject *args) -{ - float arg1 [ 4 ] ; - if (!getifloatarray(args, 1, 0, 4 , arg1)) - return NULL; - v4f( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v4i long s[4] */ - -static PyObject * -gl_v4i(PyObject *self, PyObject *args) -{ - long arg1 [ 4 ] ; - if (!getilongarray(args, 1, 0, 4 , arg1)) - return NULL; - v4i( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v4s short s[4] */ - -static PyObject * -gl_v4s(PyObject *self, PyObject *args) -{ - short arg1 [ 4 ] ; - if (!getishortarray(args, 1, 0, 4 , arg1)) - return NULL; - v4s( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void videocmd long s */ - -static PyObject * -gl_videocmd(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - videocmd( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* long windepth long s */ - -static PyObject * -gl_windepth(PyObject *self, PyObject *args) -{ - long retval; - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - retval = windepth( arg1 ); - return mknewlongobject(retval); -} - -/* void wmpack long s */ - -static PyObject * -gl_wmpack(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - wmpack( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void zdraw long s */ - -static PyObject * -gl_zdraw(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - zdraw( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void zfunction long s */ - -static PyObject * -gl_zfunction(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - zfunction( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void zsource long s */ - -static PyObject * -gl_zsource(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - zsource( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void zwritemask long s */ - -static PyObject * -gl_zwritemask(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - zwritemask( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v2d double s[2] */ - -static PyObject * -gl_v2d(PyObject *self, PyObject *args) -{ - double arg1 [ 2 ] ; - if (!getidoublearray(args, 1, 0, 2 , arg1)) - return NULL; - v2d( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v3d double s[3] */ - -static PyObject * -gl_v3d(PyObject *self, PyObject *args) -{ - double arg1 [ 3 ] ; - if (!getidoublearray(args, 1, 0, 3 , arg1)) - return NULL; - v3d( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void v4d double s[4] */ - -static PyObject * -gl_v4d(PyObject *self, PyObject *args) -{ - double arg1 [ 4 ] ; - if (!getidoublearray(args, 1, 0, 4 , arg1)) - return NULL; - v4d( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* void pixmode long s long s */ - -static PyObject * -gl_pixmode(PyObject *self, PyObject *args) -{ - long arg1 ; - long arg2 ; - if (!getilongarg(args, 2, 0, &arg1)) - return NULL; - if (!getilongarg(args, 2, 1, &arg2)) - return NULL; - pixmode( arg1 , arg2 ); - Py_INCREF(Py_None); - return Py_None; -} - -/* long qgetfd */ - -static PyObject * -gl_qgetfd(PyObject *self, PyObject *args) -{ - long retval; - retval = qgetfd( ); - return mknewlongobject(retval); -} - -/* void dither long s */ - -static PyObject * -gl_dither(PyObject *self, PyObject *args) -{ - long arg1 ; - if (!getilongarg(args, 1, 0, &arg1)) - return NULL; - dither( arg1 ); - Py_INCREF(Py_None); - return Py_None; -} - -static struct PyMethodDef gl_methods[] = { - {"qread", gl_qread, METH_OLDARGS}, - {"varray", gl_varray, METH_OLDARGS}, - {"nvarray", gl_nvarray, METH_OLDARGS}, - {"vnarray", gl_vnarray, METH_OLDARGS}, - {"nurbssurface", gl_nurbssurface, METH_OLDARGS}, - {"nurbscurve", gl_nurbscurve, METH_OLDARGS}, - {"pwlcurve", gl_pwlcurve, METH_OLDARGS}, - {"pick", gl_pick, METH_OLDARGS}, - {"endpick", gl_endpick, METH_NOARGS}, - {"gselect", gl_gselect, METH_OLDARGS}, - {"endselect", gl_endselect, METH_NOARGS}, - {"getmatrix", gl_getmatrix, METH_OLDARGS}, - {"altgetmatrix", gl_altgetmatrix, METH_OLDARGS}, - {"lrectwrite", gl_lrectwrite, METH_OLDARGS}, - {"lrectread", gl_lrectread, METH_OLDARGS}, - {"readdisplay", gl_readdisplay, METH_OLDARGS}, - {"packrect", gl_packrect, METH_OLDARGS}, - {"unpackrect", gl_unpackrect, METH_OLDARGS}, - {"gversion", gl_gversion, METH_OLDARGS}, - {"clear", gl_clear, METH_OLDARGS}, - {"getshade", gl_getshade, METH_OLDARGS}, - {"devport", gl_devport, METH_OLDARGS}, - {"rdr2i", gl_rdr2i, METH_OLDARGS}, - {"rectfs", gl_rectfs, METH_OLDARGS}, - {"rects", gl_rects, METH_OLDARGS}, - {"rmv2i", gl_rmv2i, METH_OLDARGS}, - {"noport", gl_noport, METH_OLDARGS}, - {"popviewport", gl_popviewport, METH_OLDARGS}, - {"clearhitcode", gl_clearhitcode, METH_OLDARGS}, - {"closeobj", gl_closeobj, METH_OLDARGS}, - {"cursoff", gl_cursoff, METH_OLDARGS}, - {"curson", gl_curson, METH_OLDARGS}, - {"doublebuffer", gl_doublebuffer, METH_OLDARGS}, - {"finish", gl_finish, METH_OLDARGS}, - {"gconfig", gl_gconfig, METH_OLDARGS}, - {"ginit", gl_ginit, METH_OLDARGS}, - {"greset", gl_greset, METH_OLDARGS}, - {"multimap", gl_multimap, METH_OLDARGS}, - {"onemap", gl_onemap, METH_OLDARGS}, - {"popattributes", gl_popattributes, METH_OLDARGS}, - {"popmatrix", gl_popmatrix, METH_OLDARGS}, - {"pushattributes", gl_pushattributes,METH_OLDARGS}, - {"pushmatrix", gl_pushmatrix, METH_OLDARGS}, - {"pushviewport", gl_pushviewport, METH_OLDARGS}, - {"qreset", gl_qreset, METH_OLDARGS}, - {"RGBmode", gl_RGBmode, METH_OLDARGS}, - {"singlebuffer", gl_singlebuffer, METH_OLDARGS}, - {"swapbuffers", gl_swapbuffers, METH_OLDARGS}, - {"gsync", gl_gsync, METH_OLDARGS}, - {"gflush", gl_gflush, METH_OLDARGS}, - {"tpon", gl_tpon, METH_OLDARGS}, - {"tpoff", gl_tpoff, METH_OLDARGS}, - {"clkon", gl_clkon, METH_OLDARGS}, - {"clkoff", gl_clkoff, METH_OLDARGS}, - {"ringbell", gl_ringbell, METH_OLDARGS}, - {"gbegin", gl_gbegin, METH_OLDARGS}, - {"textinit", gl_textinit, METH_OLDARGS}, - {"initnames", gl_initnames, METH_OLDARGS}, - {"pclos", gl_pclos, METH_OLDARGS}, - {"popname", gl_popname, METH_OLDARGS}, - {"spclos", gl_spclos, METH_OLDARGS}, - {"zclear", gl_zclear, METH_OLDARGS}, - {"screenspace", gl_screenspace, METH_OLDARGS}, - {"reshapeviewport", gl_reshapeviewport, METH_OLDARGS}, - {"winpush", gl_winpush, METH_OLDARGS}, - {"winpop", gl_winpop, METH_OLDARGS}, - {"foreground", gl_foreground, METH_OLDARGS}, - {"endfullscrn", gl_endfullscrn, METH_OLDARGS}, - {"endpupmode", gl_endpupmode, METH_OLDARGS}, - {"fullscrn", gl_fullscrn, METH_OLDARGS}, - {"pupmode", gl_pupmode, METH_OLDARGS}, - {"winconstraints", gl_winconstraints, METH_OLDARGS}, - {"pagecolor", gl_pagecolor, METH_OLDARGS}, - {"textcolor", gl_textcolor, METH_OLDARGS}, - {"color", gl_color, METH_OLDARGS}, - {"curveit", gl_curveit, METH_OLDARGS}, - {"font", gl_font, METH_OLDARGS}, - {"linewidth", gl_linewidth, METH_OLDARGS}, - {"setlinestyle", gl_setlinestyle, METH_OLDARGS}, - {"setmap", gl_setmap, METH_OLDARGS}, - {"swapinterval", gl_swapinterval, METH_OLDARGS}, - {"writemask", gl_writemask, METH_OLDARGS}, - {"textwritemask", gl_textwritemask, METH_OLDARGS}, - {"qdevice", gl_qdevice, METH_OLDARGS}, - {"unqdevice", gl_unqdevice, METH_OLDARGS}, - {"curvebasis", gl_curvebasis, METH_OLDARGS}, - {"curveprecision", gl_curveprecision,METH_OLDARGS}, - {"loadname", gl_loadname, METH_OLDARGS}, - {"passthrough", gl_passthrough, METH_OLDARGS}, - {"pushname", gl_pushname, METH_OLDARGS}, - {"setmonitor", gl_setmonitor, METH_OLDARGS}, - {"setshade", gl_setshade, METH_OLDARGS}, - {"setpattern", gl_setpattern, METH_OLDARGS}, - {"pagewritemask", gl_pagewritemask, METH_OLDARGS}, - {"callobj", gl_callobj, METH_OLDARGS}, - {"delobj", gl_delobj, METH_OLDARGS}, - {"editobj", gl_editobj, METH_OLDARGS}, - {"makeobj", gl_makeobj, METH_OLDARGS}, - {"maketag", gl_maketag, METH_OLDARGS}, - {"chunksize", gl_chunksize, METH_OLDARGS}, - {"compactify", gl_compactify, METH_OLDARGS}, - {"deltag", gl_deltag, METH_OLDARGS}, - {"lsrepeat", gl_lsrepeat, METH_OLDARGS}, - {"objinsert", gl_objinsert, METH_OLDARGS}, - {"objreplace", gl_objreplace, METH_OLDARGS}, - {"winclose", gl_winclose, METH_OLDARGS}, - {"blanktime", gl_blanktime, METH_OLDARGS}, - {"freepup", gl_freepup, METH_OLDARGS}, - {"backbuffer", gl_backbuffer, METH_OLDARGS}, - {"frontbuffer", gl_frontbuffer, METH_OLDARGS}, - {"lsbackup", gl_lsbackup, METH_OLDARGS}, - {"resetls", gl_resetls, METH_OLDARGS}, - {"lampon", gl_lampon, METH_OLDARGS}, - {"lampoff", gl_lampoff, METH_OLDARGS}, - {"setbell", gl_setbell, METH_OLDARGS}, - {"blankscreen", gl_blankscreen, METH_OLDARGS}, - {"depthcue", gl_depthcue, METH_OLDARGS}, - {"zbuffer", gl_zbuffer, METH_OLDARGS}, - {"backface", gl_backface, METH_OLDARGS}, - {"cmov2i", gl_cmov2i, METH_OLDARGS}, - {"draw2i", gl_draw2i, METH_OLDARGS}, - {"move2i", gl_move2i, METH_OLDARGS}, - {"pnt2i", gl_pnt2i, METH_OLDARGS}, - {"patchbasis", gl_patchbasis, METH_OLDARGS}, - {"patchprecision", gl_patchprecision, METH_OLDARGS}, - {"pdr2i", gl_pdr2i, METH_OLDARGS}, - {"pmv2i", gl_pmv2i, METH_OLDARGS}, - {"rpdr2i", gl_rpdr2i, METH_OLDARGS}, - {"rpmv2i", gl_rpmv2i, METH_OLDARGS}, - {"xfpt2i", gl_xfpt2i, METH_OLDARGS}, - {"objdelete", gl_objdelete, METH_OLDARGS}, - {"patchcurves", gl_patchcurves, METH_OLDARGS}, - {"minsize", gl_minsize, METH_OLDARGS}, - {"maxsize", gl_maxsize, METH_OLDARGS}, - {"keepaspect", gl_keepaspect, METH_OLDARGS}, - {"prefsize", gl_prefsize, METH_OLDARGS}, - {"stepunit", gl_stepunit, METH_OLDARGS}, - {"fudge", gl_fudge, METH_OLDARGS}, - {"winmove", gl_winmove, METH_OLDARGS}, - {"attachcursor", gl_attachcursor, METH_OLDARGS}, - {"deflinestyle", gl_deflinestyle, METH_OLDARGS}, - {"noise", gl_noise, METH_OLDARGS}, - {"picksize", gl_picksize, METH_OLDARGS}, - {"qenter", gl_qenter, METH_OLDARGS}, - {"setdepth", gl_setdepth, METH_OLDARGS}, - {"cmov2s", gl_cmov2s, METH_OLDARGS}, - {"draw2s", gl_draw2s, METH_OLDARGS}, - {"move2s", gl_move2s, METH_OLDARGS}, - {"pdr2s", gl_pdr2s, METH_OLDARGS}, - {"pmv2s", gl_pmv2s, METH_OLDARGS}, - {"pnt2s", gl_pnt2s, METH_OLDARGS}, - {"rdr2s", gl_rdr2s, METH_OLDARGS}, - {"rmv2s", gl_rmv2s, METH_OLDARGS}, - {"rpdr2s", gl_rpdr2s, METH_OLDARGS}, - {"rpmv2s", gl_rpmv2s, METH_OLDARGS}, - {"xfpt2s", gl_xfpt2s, METH_OLDARGS}, - {"cmov2", gl_cmov2, METH_OLDARGS}, - {"draw2", gl_draw2, METH_OLDARGS}, - {"move2", gl_move2, METH_OLDARGS}, - {"pnt2", gl_pnt2, METH_OLDARGS}, - {"pdr2", gl_pdr2, METH_OLDARGS}, - {"pmv2", gl_pmv2, METH_OLDARGS}, - {"rdr2", gl_rdr2, METH_OLDARGS}, - {"rmv2", gl_rmv2, METH_OLDARGS}, - {"rpdr2", gl_rpdr2, METH_OLDARGS}, - {"rpmv2", gl_rpmv2, METH_OLDARGS}, - {"xfpt2", gl_xfpt2, METH_OLDARGS}, - {"loadmatrix", gl_loadmatrix, METH_OLDARGS}, - {"multmatrix", gl_multmatrix, METH_OLDARGS}, - {"crv", gl_crv, METH_OLDARGS}, - {"rcrv", gl_rcrv, METH_OLDARGS}, - {"addtopup", gl_addtopup, METH_OLDARGS}, - {"charstr", gl_charstr, METH_OLDARGS}, - {"getport", gl_getport, METH_OLDARGS}, - {"strwidth", gl_strwidth, METH_OLDARGS}, - {"winopen", gl_winopen, METH_OLDARGS}, - {"wintitle", gl_wintitle, METH_OLDARGS}, - {"polf", gl_polf, METH_OLDARGS}, - {"polf2", gl_polf2, METH_OLDARGS}, - {"poly", gl_poly, METH_OLDARGS}, - {"poly2", gl_poly2, METH_OLDARGS}, - {"crvn", gl_crvn, METH_OLDARGS}, - {"rcrvn", gl_rcrvn, METH_OLDARGS}, - {"polf2i", gl_polf2i, METH_OLDARGS}, - {"polfi", gl_polfi, METH_OLDARGS}, - {"poly2i", gl_poly2i, METH_OLDARGS}, - {"polyi", gl_polyi, METH_OLDARGS}, - {"polf2s", gl_polf2s, METH_OLDARGS}, - {"polfs", gl_polfs, METH_OLDARGS}, - {"polys", gl_polys, METH_OLDARGS}, - {"poly2s", gl_poly2s, METH_OLDARGS}, - {"defcursor", gl_defcursor, METH_OLDARGS}, - {"writepixels", gl_writepixels, METH_OLDARGS}, - {"defbasis", gl_defbasis, METH_OLDARGS}, - {"gewrite", gl_gewrite, METH_OLDARGS}, - {"rotate", gl_rotate, METH_OLDARGS}, - {"rot", gl_rot, METH_OLDARGS}, - {"circfi", gl_circfi, METH_OLDARGS}, - {"circi", gl_circi, METH_OLDARGS}, - {"cmovi", gl_cmovi, METH_OLDARGS}, - {"drawi", gl_drawi, METH_OLDARGS}, - {"movei", gl_movei, METH_OLDARGS}, - {"pnti", gl_pnti, METH_OLDARGS}, - {"newtag", gl_newtag, METH_OLDARGS}, - {"pdri", gl_pdri, METH_OLDARGS}, - {"pmvi", gl_pmvi, METH_OLDARGS}, - {"rdri", gl_rdri, METH_OLDARGS}, - {"rmvi", gl_rmvi, METH_OLDARGS}, - {"rpdri", gl_rpdri, METH_OLDARGS}, - {"rpmvi", gl_rpmvi, METH_OLDARGS}, - {"xfpti", gl_xfpti, METH_OLDARGS}, - {"circ", gl_circ, METH_OLDARGS}, - {"circf", gl_circf, METH_OLDARGS}, - {"cmov", gl_cmov, METH_OLDARGS}, - {"draw", gl_draw, METH_OLDARGS}, - {"move", gl_move, METH_OLDARGS}, - {"pnt", gl_pnt, METH_OLDARGS}, - {"scale", gl_scale, METH_OLDARGS}, - {"translate", gl_translate, METH_OLDARGS}, - {"pdr", gl_pdr, METH_OLDARGS}, - {"pmv", gl_pmv, METH_OLDARGS}, - {"rdr", gl_rdr, METH_OLDARGS}, - {"rmv", gl_rmv, METH_OLDARGS}, - {"rpdr", gl_rpdr, METH_OLDARGS}, - {"rpmv", gl_rpmv, METH_OLDARGS}, - {"xfpt", gl_xfpt, METH_OLDARGS}, - {"RGBcolor", gl_RGBcolor, METH_OLDARGS}, - {"RGBwritemask", gl_RGBwritemask, METH_OLDARGS}, - {"setcursor", gl_setcursor, METH_OLDARGS}, - {"tie", gl_tie, METH_OLDARGS}, - {"circfs", gl_circfs, METH_OLDARGS}, - {"circs", gl_circs, METH_OLDARGS}, - {"cmovs", gl_cmovs, METH_OLDARGS}, - {"draws", gl_draws, METH_OLDARGS}, - {"moves", gl_moves, METH_OLDARGS}, - {"pdrs", gl_pdrs, METH_OLDARGS}, - {"pmvs", gl_pmvs, METH_OLDARGS}, - {"pnts", gl_pnts, METH_OLDARGS}, - {"rdrs", gl_rdrs, METH_OLDARGS}, - {"rmvs", gl_rmvs, METH_OLDARGS}, - {"rpdrs", gl_rpdrs, METH_OLDARGS}, - {"rpmvs", gl_rpmvs, METH_OLDARGS}, - {"xfpts", gl_xfpts, METH_OLDARGS}, - {"curorigin", gl_curorigin, METH_OLDARGS}, - {"cyclemap", gl_cyclemap, METH_OLDARGS}, - {"patch", gl_patch, METH_OLDARGS}, - {"splf", gl_splf, METH_OLDARGS}, - {"splf2", gl_splf2, METH_OLDARGS}, - {"splfi", gl_splfi, METH_OLDARGS}, - {"splf2i", gl_splf2i, METH_OLDARGS}, - {"splfs", gl_splfs, METH_OLDARGS}, - {"splf2s", gl_splf2s, METH_OLDARGS}, - {"rpatch", gl_rpatch, METH_OLDARGS}, - {"ortho2", gl_ortho2, METH_OLDARGS}, - {"rect", gl_rect, METH_OLDARGS}, - {"rectf", gl_rectf, METH_OLDARGS}, - {"xfpt4", gl_xfpt4, METH_OLDARGS}, - {"textport", gl_textport, METH_OLDARGS}, - {"mapcolor", gl_mapcolor, METH_OLDARGS}, - {"scrmask", gl_scrmask, METH_OLDARGS}, - {"setvaluator", gl_setvaluator, METH_OLDARGS}, - {"viewport", gl_viewport, METH_OLDARGS}, - {"shaderange", gl_shaderange, METH_OLDARGS}, - {"xfpt4s", gl_xfpt4s, METH_OLDARGS}, - {"rectfi", gl_rectfi, METH_OLDARGS}, - {"recti", gl_recti, METH_OLDARGS}, - {"xfpt4i", gl_xfpt4i, METH_OLDARGS}, - {"prefposition", gl_prefposition, METH_OLDARGS}, - {"arc", gl_arc, METH_OLDARGS}, - {"arcf", gl_arcf, METH_OLDARGS}, - {"arcfi", gl_arcfi, METH_OLDARGS}, - {"arci", gl_arci, METH_OLDARGS}, - {"bbox2", gl_bbox2, METH_OLDARGS}, - {"bbox2i", gl_bbox2i, METH_OLDARGS}, - {"bbox2s", gl_bbox2s, METH_OLDARGS}, - {"blink", gl_blink, METH_OLDARGS}, - {"ortho", gl_ortho, METH_OLDARGS}, - {"window", gl_window, METH_OLDARGS}, - {"lookat", gl_lookat, METH_OLDARGS}, - {"perspective", gl_perspective, METH_OLDARGS}, - {"polarview", gl_polarview, METH_OLDARGS}, - {"arcfs", gl_arcfs, METH_OLDARGS}, - {"arcs", gl_arcs, METH_OLDARGS}, - {"rectcopy", gl_rectcopy, METH_OLDARGS}, - {"RGBcursor", gl_RGBcursor, METH_OLDARGS}, - {"getbutton", gl_getbutton, METH_OLDARGS}, - {"getcmmode", gl_getcmmode, METH_OLDARGS}, - {"getlsbackup", gl_getlsbackup, METH_OLDARGS}, - {"getresetls", gl_getresetls, METH_OLDARGS}, - {"getdcm", gl_getdcm, METH_OLDARGS}, - {"getzbuffer", gl_getzbuffer, METH_OLDARGS}, - {"ismex", gl_ismex, METH_OLDARGS}, - {"isobj", gl_isobj, METH_OLDARGS}, - {"isqueued", gl_isqueued, METH_OLDARGS}, - {"istag", gl_istag, METH_OLDARGS}, - {"genobj", gl_genobj, METH_OLDARGS}, - {"gentag", gl_gentag, METH_OLDARGS}, - {"getbuffer", gl_getbuffer, METH_OLDARGS}, - {"getcolor", gl_getcolor, METH_OLDARGS}, - {"getdisplaymode", gl_getdisplaymode, METH_OLDARGS}, - {"getfont", gl_getfont, METH_OLDARGS}, - {"getheight", gl_getheight, METH_OLDARGS}, - {"gethitcode", gl_gethitcode, METH_OLDARGS}, - {"getlstyle", gl_getlstyle, METH_OLDARGS}, - {"getlwidth", gl_getlwidth, METH_OLDARGS}, - {"getmap", gl_getmap, METH_OLDARGS}, - {"getplanes", gl_getplanes, METH_OLDARGS}, - {"getwritemask", gl_getwritemask, METH_OLDARGS}, - {"qtest", gl_qtest, METH_OLDARGS}, - {"getlsrepeat", gl_getlsrepeat, METH_OLDARGS}, - {"getmonitor", gl_getmonitor, METH_OLDARGS}, - {"getopenobj", gl_getopenobj, METH_OLDARGS}, - {"getpattern", gl_getpattern, METH_OLDARGS}, - {"winget", gl_winget, METH_OLDARGS}, - {"winattach", gl_winattach, METH_OLDARGS}, - {"getothermonitor", gl_getothermonitor, METH_OLDARGS}, - {"newpup", gl_newpup, METH_OLDARGS}, - {"getvaluator", gl_getvaluator, METH_OLDARGS}, - {"winset", gl_winset, METH_OLDARGS}, - {"dopup", gl_dopup, METH_OLDARGS}, - {"getdepth", gl_getdepth, METH_OLDARGS}, - {"getcpos", gl_getcpos, METH_OLDARGS}, - {"getsize", gl_getsize, METH_OLDARGS}, - {"getorigin", gl_getorigin, METH_OLDARGS}, - {"getviewport", gl_getviewport, METH_OLDARGS}, - {"gettp", gl_gettp, METH_OLDARGS}, - {"getgpos", gl_getgpos, METH_OLDARGS}, - {"winposition", gl_winposition, METH_OLDARGS}, - {"gRGBcolor", gl_gRGBcolor, METH_OLDARGS}, - {"gRGBmask", gl_gRGBmask, METH_OLDARGS}, - {"getscrmask", gl_getscrmask, METH_OLDARGS}, - {"getmcolor", gl_getmcolor, METH_OLDARGS}, - {"mapw", gl_mapw, METH_OLDARGS}, - {"mapw2", gl_mapw2, METH_OLDARGS}, - {"getcursor", gl_getcursor, METH_OLDARGS}, - {"cmode", gl_cmode, METH_OLDARGS}, - {"concave", gl_concave, METH_OLDARGS}, - {"curstype", gl_curstype, METH_OLDARGS}, - {"drawmode", gl_drawmode, METH_OLDARGS}, - {"gammaramp", gl_gammaramp, METH_OLDARGS}, - {"getbackface", gl_getbackface, METH_OLDARGS}, - {"getdescender", gl_getdescender, METH_OLDARGS}, - {"getdrawmode", gl_getdrawmode, METH_OLDARGS}, - {"getmmode", gl_getmmode, METH_OLDARGS}, - {"getsm", gl_getsm, METH_OLDARGS}, - {"getvideo", gl_getvideo, METH_OLDARGS}, - {"imakebackground", gl_imakebackground, METH_OLDARGS}, - {"lmbind", gl_lmbind, METH_OLDARGS}, - {"lmdef", gl_lmdef, METH_OLDARGS}, - {"mmode", gl_mmode, METH_OLDARGS}, - {"normal", gl_normal, METH_OLDARGS}, - {"overlay", gl_overlay, METH_OLDARGS}, - {"RGBrange", gl_RGBrange, METH_OLDARGS}, - {"setvideo", gl_setvideo, METH_OLDARGS}, - {"shademodel", gl_shademodel, METH_OLDARGS}, - {"underlay", gl_underlay, METH_OLDARGS}, - {"bgnclosedline", gl_bgnclosedline, METH_OLDARGS}, - {"bgnline", gl_bgnline, METH_OLDARGS}, - {"bgnpoint", gl_bgnpoint, METH_OLDARGS}, - {"bgnpolygon", gl_bgnpolygon, METH_OLDARGS}, - {"bgnsurface", gl_bgnsurface, METH_OLDARGS}, - {"bgntmesh", gl_bgntmesh, METH_OLDARGS}, - {"bgntrim", gl_bgntrim, METH_OLDARGS}, - {"endclosedline", gl_endclosedline, METH_OLDARGS}, - {"endline", gl_endline, METH_OLDARGS}, - {"endpoint", gl_endpoint, METH_OLDARGS}, - {"endpolygon", gl_endpolygon, METH_OLDARGS}, - {"endsurface", gl_endsurface, METH_OLDARGS}, - {"endtmesh", gl_endtmesh, METH_OLDARGS}, - {"endtrim", gl_endtrim, METH_OLDARGS}, - {"blendfunction", gl_blendfunction, METH_OLDARGS}, - {"c3f", gl_c3f, METH_OLDARGS}, - {"c3i", gl_c3i, METH_OLDARGS}, - {"c3s", gl_c3s, METH_OLDARGS}, - {"c4f", gl_c4f, METH_OLDARGS}, - {"c4i", gl_c4i, METH_OLDARGS}, - {"c4s", gl_c4s, METH_OLDARGS}, - {"colorf", gl_colorf, METH_OLDARGS}, - {"cpack", gl_cpack, METH_OLDARGS}, - {"czclear", gl_czclear, METH_OLDARGS}, - {"dglclose", gl_dglclose, METH_OLDARGS}, - {"dglopen", gl_dglopen, METH_OLDARGS}, - {"getgdesc", gl_getgdesc, METH_OLDARGS}, - {"getnurbsproperty", gl_getnurbsproperty, METH_OLDARGS}, - {"glcompat", gl_glcompat, METH_OLDARGS}, - {"iconsize", gl_iconsize, METH_OLDARGS}, - {"icontitle", gl_icontitle, METH_OLDARGS}, - {"lRGBrange", gl_lRGBrange, METH_OLDARGS}, - {"linesmooth", gl_linesmooth, METH_OLDARGS}, - {"lmcolor", gl_lmcolor, METH_OLDARGS}, - {"logicop", gl_logicop, METH_OLDARGS}, - {"lsetdepth", gl_lsetdepth, METH_OLDARGS}, - {"lshaderange", gl_lshaderange, METH_OLDARGS}, - {"n3f", gl_n3f, METH_OLDARGS}, - {"noborder", gl_noborder, METH_OLDARGS}, - {"pntsmooth", gl_pntsmooth, METH_OLDARGS}, - {"readsource", gl_readsource, METH_OLDARGS}, - {"rectzoom", gl_rectzoom, METH_OLDARGS}, - {"sbox", gl_sbox, METH_OLDARGS}, - {"sboxi", gl_sboxi, METH_OLDARGS}, - {"sboxs", gl_sboxs, METH_OLDARGS}, - {"sboxf", gl_sboxf, METH_OLDARGS}, - {"sboxfi", gl_sboxfi, METH_OLDARGS}, - {"sboxfs", gl_sboxfs, METH_OLDARGS}, - {"setnurbsproperty", gl_setnurbsproperty, METH_OLDARGS}, - {"setpup", gl_setpup, METH_OLDARGS}, - {"smoothline", gl_smoothline, METH_OLDARGS}, - {"subpixel", gl_subpixel, METH_OLDARGS}, - {"swaptmesh", gl_swaptmesh, METH_OLDARGS}, - {"swinopen", gl_swinopen, METH_OLDARGS}, - {"v2f", gl_v2f, METH_OLDARGS}, - {"v2i", gl_v2i, METH_OLDARGS}, - {"v2s", gl_v2s, METH_OLDARGS}, - {"v3f", gl_v3f, METH_OLDARGS}, - {"v3i", gl_v3i, METH_OLDARGS}, - {"v3s", gl_v3s, METH_OLDARGS}, - {"v4f", gl_v4f, METH_OLDARGS}, - {"v4i", gl_v4i, METH_OLDARGS}, - {"v4s", gl_v4s, METH_OLDARGS}, - {"videocmd", gl_videocmd, METH_OLDARGS}, - {"windepth", gl_windepth, METH_OLDARGS}, - {"wmpack", gl_wmpack, METH_OLDARGS}, - {"zdraw", gl_zdraw, METH_OLDARGS}, - {"zfunction", gl_zfunction, METH_OLDARGS}, - {"zsource", gl_zsource, METH_OLDARGS}, - {"zwritemask", gl_zwritemask, METH_OLDARGS}, - {"v2d", gl_v2d, METH_OLDARGS}, - {"v3d", gl_v3d, METH_OLDARGS}, - {"v4d", gl_v4d, METH_OLDARGS}, - {"pixmode", gl_pixmode, METH_OLDARGS}, - {"qgetfd", gl_qgetfd, METH_OLDARGS}, - {"dither", gl_dither, METH_OLDARGS}, - {NULL, NULL} /* Sentinel */ -}; - -void -initgl(void) -{ - - if (PyErr_WarnPy3k("the gl module has been removed in " - "Python 3.0", 2) < 0) - return; - - (void) Py_InitModule("gl", gl_methods); -} diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c index 07de8807c73..7dfda280c77 100644 --- a/Modules/grpmodule.c +++ b/Modules/grpmodule.c @@ -2,7 +2,6 @@ /* UNIX group file access module */ #include "Python.h" -#include "structseq.h" #include <sys/types.h> #include <grp.h> @@ -10,8 +9,8 @@ static PyStructSequence_Field struct_group_type_fields[] = { {"gr_name", "group name"}, {"gr_passwd", "password"}, - {"gr_gid", "group id"}, - {"gr_mem", "group memebers"}, + {"gr_gid", "group id"}, + {"gr_mem", "group memebers"}, {0} }; @@ -47,7 +46,7 @@ mkgrent(struct group *p) return NULL; } for (member = p->gr_mem; *member != NULL; member++) { - PyObject *x = PyString_FromString(*member); + PyObject *x = PyUnicode_DecodeFSDefault(*member); if (x == NULL || PyList_Append(w, x) != 0) { Py_XDECREF(x); Py_DECREF(w); @@ -58,19 +57,19 @@ mkgrent(struct group *p) } #define SET(i,val) PyStructSequence_SET_ITEM(v, i, val) - SET(setIndex++, PyString_FromString(p->gr_name)); + SET(setIndex++, PyUnicode_DecodeFSDefault(p->gr_name)); #ifdef __VMS SET(setIndex++, Py_None); Py_INCREF(Py_None); #else if (p->gr_passwd) - SET(setIndex++, PyString_FromString(p->gr_passwd)); + SET(setIndex++, PyUnicode_DecodeFSDefault(p->gr_passwd)); else { - SET(setIndex++, Py_None); - Py_INCREF(Py_None); + SET(setIndex++, Py_None); + Py_INCREF(Py_None); } #endif - SET(setIndex++, PyInt_FromLong((long) p->gr_gid)); + SET(setIndex++, PyLong_FromLong((long) p->gr_gid)); SET(setIndex++, w); #undef SET @@ -89,39 +88,41 @@ grp_getgrgid(PyObject *self, PyObject *pyo_id) unsigned int gid; struct group *p; - py_int_id = PyNumber_Int(pyo_id); + py_int_id = PyNumber_Long(pyo_id); if (!py_int_id) - return NULL; - gid = PyInt_AS_LONG(py_int_id); + return NULL; + gid = PyLong_AS_LONG(py_int_id); Py_DECREF(py_int_id); if ((p = getgrgid(gid)) == NULL) { - PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid); + PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid); return NULL; } return mkgrent(p); } static PyObject * -grp_getgrnam(PyObject *self, PyObject *pyo_name) +grp_getgrnam(PyObject *self, PyObject *args) { - PyObject *py_str_name; char *name; struct group *p; + PyObject *arg, *bytes, *retval = NULL; - py_str_name = PyObject_Str(pyo_name); - if (!py_str_name) - return NULL; - name = PyString_AS_STRING(py_str_name); - - if ((p = getgrnam(name)) == NULL) { - PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %s", name); - Py_DECREF(py_str_name); + if (!PyArg_ParseTuple(args, "U:getgrnam", &arg)) return NULL; - } + if ((bytes = PyUnicode_EncodeFSDefault(arg)) == NULL) + return NULL; + if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1) + goto out; - Py_DECREF(py_str_name); - return mkgrent(p); + if ((p = getgrnam(name)) == NULL) { + PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %s", name); + goto out; + } + retval = mkgrent(p); +out: + Py_DECREF(bytes); + return retval; } static PyObject * @@ -148,20 +149,20 @@ grp_getgrall(PyObject *self, PyObject *ignore) } static PyMethodDef grp_methods[] = { - {"getgrgid", grp_getgrgid, METH_O, + {"getgrgid", grp_getgrgid, METH_O, "getgrgid(id) -> tuple\n\ Return the group database entry for the given numeric group ID. If\n\ id is not valid, raise KeyError."}, - {"getgrnam", grp_getgrnam, METH_O, + {"getgrnam", grp_getgrnam, METH_VARARGS, "getgrnam(name) -> tuple\n\ Return the group database entry for the given group name. If\n\ name is not valid, raise KeyError."}, - {"getgrall", grp_getgrall, METH_NOARGS, + {"getgrall", grp_getgrall, METH_NOARGS, "getgrall() -> list of tuples\n\ Return a list of all available group entries, in arbitrary order.\n\ An entry whose name starts with '+' or '-' represents an instruction\n\ to use YP/NIS and may not be accessible via getgrnam or getgrgid."}, - {NULL, NULL} /* sentinel */ + {NULL, NULL} /* sentinel */ }; PyDoc_STRVAR(grp__doc__, @@ -181,16 +182,30 @@ according to the password database. Check both databases to get\n\ complete membership information.)"); + +static struct PyModuleDef grpmodule = { + PyModuleDef_HEAD_INIT, + "grp", + grp__doc__, + -1, + grp_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initgrp(void) +PyInit_grp(void) { PyObject *m, *d; - m = Py_InitModule3("grp", grp_methods, grp__doc__); + m = PyModule_Create(&grpmodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); if (!initialized) - PyStructSequence_InitType(&StructGrpType, &struct_group_type_desc); + PyStructSequence_InitType(&StructGrpType, &struct_group_type_desc); PyDict_SetItemString(d, "struct_group", (PyObject *) &StructGrpType); initialized = 1; + return m; } diff --git a/Modules/hashlib.h b/Modules/hashlib.h new file mode 100644 index 00000000000..db39cea7aae --- /dev/null +++ b/Modules/hashlib.h @@ -0,0 +1,28 @@ +/* Common code for use by all hashlib related modules. */ + +/* + * Given a PyObject* obj, fill in the Py_buffer* viewp with the result + * of PyObject_GetBuffer. Sets and exception and issues a return NULL + * on any errors. + */ +#define GET_BUFFER_VIEW_OR_ERROUT(obj, viewp) do { \ + if (PyUnicode_Check((obj))) { \ + PyErr_SetString(PyExc_TypeError, \ + "Unicode-objects must be encoded before hashing");\ + return NULL; \ + } \ + if (!PyObject_CheckBuffer((obj))) { \ + PyErr_SetString(PyExc_TypeError, \ + "object supporting the buffer API required"); \ + return NULL; \ + } \ + if (PyObject_GetBuffer((obj), (viewp), PyBUF_SIMPLE) == -1) { \ + return NULL; \ + } \ + if ((viewp)->ndim > 1) { \ + PyErr_SetString(PyExc_BufferError, \ + "Buffer must be single dimension"); \ + PyBuffer_Release((viewp)); \ + return NULL; \ + } \ + } while(0); diff --git a/Modules/imageop.c b/Modules/imageop.c deleted file mode 100644 index 8bd11b24c8a..00000000000 --- a/Modules/imageop.c +++ /dev/null @@ -1,794 +0,0 @@ - -/* imageopmodule - Various operations on pictures */ - -#ifdef sun -#define signed -#endif - -#include "Python.h" - -#if SIZEOF_INT == 4 -typedef int Py_Int32; -typedef unsigned int Py_UInt32; -#else -#if SIZEOF_LONG == 4 -typedef long Py_Int32; -typedef unsigned long Py_UInt32; -#else -#error "No 4-byte integral type" -#endif -#endif - -#define CHARP(cp, xmax, x, y) ((char *)(cp+y*xmax+x)) -#define SHORTP(cp, xmax, x, y) ((short *)(cp+2*(y*xmax+x))) -#define LONGP(cp, xmax, x, y) ((Py_Int32 *)(cp+4*(y*xmax+x))) - -static PyObject *ImageopError; -static PyObject *ImageopDict; - -/** - * Check a coordonnate, make sure that (0 < value). - * Return 0 on error. - */ -static int -check_coordonnate(int value, const char* name) -{ - if ( 0 < value) - return 1; - PyErr_Format(PyExc_ValueError, "%s value is negative or nul", name); - return 0; -} - -/** - * Check integer overflow to make sure that product == x*y*size. - * Return 0 on error. - */ -static int -check_multiply_size(int product, int x, const char* xname, int y, const char* yname, int size) -{ - if ( !check_coordonnate(x, xname) ) - return 0; - if ( !check_coordonnate(y, yname) ) - return 0; - if ( size == (product / y) / x ) - return 1; - PyErr_SetString(ImageopError, "String has incorrect length"); - return 0; -} - -/** - * Check integer overflow to make sure that product == x*y. - * Return 0 on error. - */ -static int -check_multiply(int product, int x, int y) -{ - return check_multiply_size(product, x, "x", y, "y", 1); -} - -/* If this function returns true (the default if anything goes wrong), we're - behaving in a backward-compatible way with respect to how multi-byte pixels - are stored in the strings. The code in this module was originally written - for an SGI which is a big-endian system, and so the old code assumed that - 4-byte integers hold the R, G, and B values in a particular order. - However, on little-endian systems the order is reversed, and so not - actually compatible with what gl.lrectwrite and imgfile expect. - (gl.lrectwrite and imgfile are also SGI-specific, however, it is - conceivable that the data handled here comes from or goes to an SGI or that - it is otherwise used in the expectation that the byte order in the strings - is as specified.) - - The function returns the value of the module variable - "backward_compatible", or 1 if the variable does not exist or is not an - int. - */ - -static int -imageop_backward_compatible(void) -{ - static PyObject *bcos; - PyObject *bco; - long rc; - - if (ImageopDict == NULL) /* "cannot happen" */ - return 1; - if (bcos == NULL) { - /* cache string object for future use */ - bcos = PyString_FromString("backward_compatible"); - if (bcos == NULL) - return 1; - } - bco = PyDict_GetItem(ImageopDict, bcos); - if (bco == NULL) - return 1; - if (!PyInt_Check(bco)) - return 1; - rc = PyInt_AsLong(bco); - if (PyErr_Occurred()) { - /* not an integer, or too large, or something */ - PyErr_Clear(); - rc = 1; - } - return rc != 0; /* convert to values 0, 1 */ -} - -static PyObject * -imageop_crop(PyObject *self, PyObject *args) -{ - char *cp, *ncp; - short *nsp; - Py_Int32 *nlp; - int len, size, x, y, newx1, newx2, newy1, newy2, nlen; - int ix, iy, xstep, ystep; - PyObject *rv; - - if ( !PyArg_ParseTuple(args, "s#iiiiiii", &cp, &len, &size, &x, &y, - &newx1, &newy1, &newx2, &newy2) ) - return 0; - - if ( size != 1 && size != 2 && size != 4 ) { - PyErr_SetString(ImageopError, "Size should be 1, 2 or 4"); - return 0; - } - if ( !check_multiply_size(len, x, "x", y, "y", size) ) - return 0; - - xstep = (newx1 < newx2)? 1 : -1; - ystep = (newy1 < newy2)? 1 : -1; - - nlen = (abs(newx2-newx1)+1)*(abs(newy2-newy1)+1)*size; - if ( !check_multiply_size(nlen, abs(newx2-newx1)+1, "abs(newx2-newx1)+1", abs(newy2-newy1)+1, "abs(newy2-newy1)+1", size) ) - return 0; - rv = PyString_FromStringAndSize(NULL, nlen); - if ( rv == 0 ) - return 0; - ncp = (char *)PyString_AsString(rv); - nsp = (short *)ncp; - nlp = (Py_Int32 *)ncp; - newy2 += ystep; - newx2 += xstep; - for( iy = newy1; iy != newy2; iy+=ystep ) { - for ( ix = newx1; ix != newx2; ix+=xstep ) { - if ( iy < 0 || iy >= y || ix < 0 || ix >= x ) { - if ( size == 1 ) - *ncp++ = 0; - else - *nlp++ = 0; - } else { - if ( size == 1 ) - *ncp++ = *CHARP(cp, x, ix, iy); - else if ( size == 2 ) - *nsp++ = *SHORTP(cp, x, ix, iy); - else - *nlp++ = *LONGP(cp, x, ix, iy); - } - } - } - return rv; -} - -static PyObject * -imageop_scale(PyObject *self, PyObject *args) -{ - char *cp, *ncp; - short *nsp; - Py_Int32 *nlp; - int len, size, x, y, newx, newy, nlen; - int ix, iy; - int oix, oiy; - PyObject *rv; - - if ( !PyArg_ParseTuple(args, "s#iiiii", - &cp, &len, &size, &x, &y, &newx, &newy) ) - return 0; - - if ( size != 1 && size != 2 && size != 4 ) { - PyErr_SetString(ImageopError, "Size should be 1, 2 or 4"); - return 0; - } - if ( !check_multiply_size(len, x, "x", y, "y", size) ) - return 0; - nlen = newx*newy*size; - if ( !check_multiply_size(nlen, newx, "newx", newy, "newy", size) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, nlen); - if ( rv == 0 ) - return 0; - ncp = (char *)PyString_AsString(rv); - nsp = (short *)ncp; - nlp = (Py_Int32 *)ncp; - for( iy = 0; iy < newy; iy++ ) { - for ( ix = 0; ix < newx; ix++ ) { - oix = ix * x / newx; - oiy = iy * y / newy; - if ( size == 1 ) - *ncp++ = *CHARP(cp, x, oix, oiy); - else if ( size == 2 ) - *nsp++ = *SHORTP(cp, x, oix, oiy); - else - *nlp++ = *LONGP(cp, x, oix, oiy); - } - } - return rv; -} - -/* Note: this routine can use a bit of optimizing */ - -static PyObject * -imageop_tovideo(PyObject *self, PyObject *args) -{ - int maxx, maxy, x, y, len; - int i; - unsigned char *cp, *ncp; - int width; - PyObject *rv; - - - if ( !PyArg_ParseTuple(args, "s#iii", &cp, &len, &width, &maxx, &maxy) ) - return 0; - - if ( width != 1 && width != 4 ) { - PyErr_SetString(ImageopError, "Size should be 1 or 4"); - return 0; - } - if ( !check_multiply_size(len, maxx, "max", maxy, "maxy", width) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, len); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - if ( width == 1 ) { - memcpy(ncp, cp, maxx); /* Copy first line */ - ncp += maxx; - for (y=1; y<maxy; y++) { /* Interpolate other lines */ - for(x=0; x<maxx; x++) { - i = y*maxx + x; - *ncp++ = ((int)cp[i] + (int)cp[i-maxx]) >> 1; - } - } - } else { - memcpy(ncp, cp, maxx*4); /* Copy first line */ - ncp += maxx*4; - for (y=1; y<maxy; y++) { /* Interpolate other lines */ - for(x=0; x<maxx; x++) { - i = (y*maxx + x)*4 + 1; - *ncp++ = 0; /* Skip alfa comp */ - *ncp++ = ((int)cp[i] + (int)cp[i-4*maxx]) >> 1; - i++; - *ncp++ = ((int)cp[i] + (int)cp[i-4*maxx]) >> 1; - i++; - *ncp++ = ((int)cp[i] + (int)cp[i-4*maxx]) >> 1; - } - } - } - return rv; -} - -static PyObject * -imageop_grey2mono(PyObject *self, PyObject *args) -{ - int tres, x, y, len; - unsigned char *cp, *ncp; - unsigned char ovalue; - PyObject *rv; - int i, bit; - - - if ( !PyArg_ParseTuple(args, "s#iii", &cp, &len, &x, &y, &tres) ) - return 0; - - if ( !check_multiply(len, x, y) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, (len+7)/8); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - bit = 0x80; - ovalue = 0; - for ( i=0; i < len; i++ ) { - if ( (int)cp[i] > tres ) - ovalue |= bit; - bit >>= 1; - if ( bit == 0 ) { - *ncp++ = ovalue; - bit = 0x80; - ovalue = 0; - } - } - if ( bit != 0x80 ) - *ncp++ = ovalue; - return rv; -} - -static PyObject * -imageop_grey2grey4(PyObject *self, PyObject *args) -{ - int x, y, len; - unsigned char *cp, *ncp; - unsigned char ovalue; - PyObject *rv; - int i; - int pos; - - - if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) ) - return 0; - - if ( !check_multiply(len, x, y) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, (len+1)/2); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - pos = 0; - ovalue = 0; - for ( i=0; i < len; i++ ) { - ovalue |= ((int)cp[i] & 0xf0) >> pos; - pos += 4; - if ( pos == 8 ) { - *ncp++ = ovalue; - ovalue = 0; - pos = 0; - } - } - if ( pos != 0 ) - *ncp++ = ovalue; - return rv; -} - -static PyObject * -imageop_grey2grey2(PyObject *self, PyObject *args) -{ - int x, y, len; - unsigned char *cp, *ncp; - unsigned char ovalue; - PyObject *rv; - int i; - int pos; - - - if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) ) - return 0; - - if ( !check_multiply(len, x, y) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, (len+3)/4); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - pos = 0; - ovalue = 0; - for ( i=0; i < len; i++ ) { - ovalue |= ((int)cp[i] & 0xc0) >> pos; - pos += 2; - if ( pos == 8 ) { - *ncp++ = ovalue; - ovalue = 0; - pos = 0; - } - } - if ( pos != 0 ) - *ncp++ = ovalue; - return rv; -} - -static PyObject * -imageop_dither2mono(PyObject *self, PyObject *args) -{ - int sum, x, y, len; - unsigned char *cp, *ncp; - unsigned char ovalue; - PyObject *rv; - int i, bit; - - - if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) ) - return 0; - - if ( !check_multiply(len, x, y) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, (len+7)/8); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - bit = 0x80; - ovalue = 0; - sum = 0; - for ( i=0; i < len; i++ ) { - sum += cp[i]; - if ( sum >= 256 ) { - sum -= 256; - ovalue |= bit; - } - bit >>= 1; - if ( bit == 0 ) { - *ncp++ = ovalue; - bit = 0x80; - ovalue = 0; - } - } - if ( bit != 0x80 ) - *ncp++ = ovalue; - return rv; -} - -static PyObject * -imageop_dither2grey2(PyObject *self, PyObject *args) -{ - int x, y, len; - unsigned char *cp, *ncp; - unsigned char ovalue; - PyObject *rv; - int i; - int pos; - int sum = 0, nvalue; - - - if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) ) - return 0; - - if ( !check_multiply(len, x, y) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, (len+3)/4); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - pos = 1; - ovalue = 0; - for ( i=0; i < len; i++ ) { - sum += cp[i]; - nvalue = sum & 0x180; - sum -= nvalue; - ovalue |= nvalue >> pos; - pos += 2; - if ( pos == 9 ) { - *ncp++ = ovalue; - ovalue = 0; - pos = 1; - } - } - if ( pos != 0 ) - *ncp++ = ovalue; - return rv; -} - -static PyObject * -imageop_mono2grey(PyObject *self, PyObject *args) -{ - int v0, v1, x, y, len, nlen; - unsigned char *cp, *ncp; - PyObject *rv; - int i, bit; - - if ( !PyArg_ParseTuple(args, "s#iiii", &cp, &len, &x, &y, &v0, &v1) ) - return 0; - - nlen = x*y; - if ( !check_multiply(nlen, x, y) ) - return 0; - if ( (nlen+7)/8 != len ) { - PyErr_SetString(ImageopError, "String has incorrect length"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, nlen); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - bit = 0x80; - for ( i=0; i < nlen; i++ ) { - if ( *cp & bit ) - *ncp++ = v1; - else - *ncp++ = v0; - bit >>= 1; - if ( bit == 0 ) { - bit = 0x80; - cp++; - } - } - return rv; -} - -static PyObject * -imageop_grey22grey(PyObject *self, PyObject *args) -{ - int x, y, len, nlen; - unsigned char *cp, *ncp; - PyObject *rv; - int i, pos, value = 0, nvalue; - - if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) ) - return 0; - - nlen = x*y; - if ( !check_multiply(nlen, x, y) ) { - return 0; - } - if ( (nlen+3)/4 != len ) { - PyErr_SetString(ImageopError, "String has incorrect length"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, nlen); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - pos = 0; - for ( i=0; i < nlen; i++ ) { - if ( pos == 0 ) { - value = *cp++; - pos = 8; - } - pos -= 2; - nvalue = (value >> pos) & 0x03; - *ncp++ = nvalue | (nvalue << 2) | - (nvalue << 4) | (nvalue << 6); - } - return rv; -} - -static PyObject * -imageop_grey42grey(PyObject *self, PyObject *args) -{ - int x, y, len, nlen; - unsigned char *cp, *ncp; - PyObject *rv; - int i, pos, value = 0, nvalue; - - if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) ) - return 0; - - nlen = x*y; - if ( !check_multiply(nlen, x, y) ) - return 0; - if ( (nlen+1)/2 != len ) { - PyErr_SetString(ImageopError, "String has incorrect length"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, nlen); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - pos = 0; - for ( i=0; i < nlen; i++ ) { - if ( pos == 0 ) { - value = *cp++; - pos = 8; - } - pos -= 4; - nvalue = (value >> pos) & 0x0f; - *ncp++ = nvalue | (nvalue << 4); - } - return rv; -} - -static PyObject * -imageop_rgb2rgb8(PyObject *self, PyObject *args) -{ - int x, y, len, nlen; - unsigned char *cp; - unsigned char *ncp; - PyObject *rv; - int i, r, g, b; - int backward_compatible = imageop_backward_compatible(); - - if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) ) - return 0; - - if ( !check_multiply_size(len, x, "x", y, "y", 4) ) - return 0; - nlen = x*y; - if ( !check_multiply(nlen, x, y) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, nlen); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - for ( i=0; i < nlen; i++ ) { - /* Bits in source: aaaaaaaa BBbbbbbb GGGggggg RRRrrrrr */ - if (backward_compatible) { - Py_UInt32 value = * (Py_UInt32 *) cp; - cp += 4; - r = (int) ((value & 0xff) / 255. * 7. + .5); - g = (int) (((value >> 8) & 0xff) / 255. * 7. + .5); - b = (int) (((value >> 16) & 0xff) / 255. * 3. + .5); - } else { - cp++; /* skip alpha channel */ - b = (int) (*cp++ / 255. * 3. + .5); - g = (int) (*cp++ / 255. * 7. + .5); - r = (int) (*cp++ / 255. * 7. + .5); - } - *ncp++ = (unsigned char)((r<<5) | (b<<3) | g); - } - return rv; -} - -static PyObject * -imageop_rgb82rgb(PyObject *self, PyObject *args) -{ - int x, y, len, nlen; - unsigned char *cp; - unsigned char *ncp; - PyObject *rv; - int i, r, g, b; - unsigned char value; - int backward_compatible = imageop_backward_compatible(); - - if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) ) - return 0; - - if ( !check_multiply(len, x, y) ) - return 0; - nlen = x*y*4; - if ( !check_multiply_size(nlen, x, "x", y, "y", 4) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, nlen); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - for ( i=0; i < len; i++ ) { - /* Bits in source: RRRBBGGG - ** Red and Green are multiplied by 36.5, Blue by 85 - */ - value = *cp++; - r = (value >> 5) & 7; - g = (value ) & 7; - b = (value >> 3) & 3; - r = (r<<5) | (r<<3) | (r>>1); - g = (g<<5) | (g<<3) | (g>>1); - b = (b<<6) | (b<<4) | (b<<2) | b; - if (backward_compatible) { - Py_UInt32 nvalue = r | (g<<8) | (b<<16); - * (Py_UInt32 *) ncp = nvalue; - ncp += 4; - } else { - *ncp++ = 0; - *ncp++ = b; - *ncp++ = g; - *ncp++ = r; - } - } - return rv; -} - -static PyObject * -imageop_rgb2grey(PyObject *self, PyObject *args) -{ - int x, y, len, nlen; - unsigned char *cp; - unsigned char *ncp; - PyObject *rv; - int i, r, g, b; - int nvalue; - int backward_compatible = imageop_backward_compatible(); - - if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) ) - return 0; - - if ( !check_multiply_size(len, x, "x", y, "y", 4) ) - return 0; - nlen = x*y; - if ( !check_multiply(nlen, x, y) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, nlen); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - for ( i=0; i < nlen; i++ ) { - if (backward_compatible) { - Py_UInt32 value = * (Py_UInt32 *) cp; - cp += 4; - r = (int) ((value & 0xff) / 255. * 7. + .5); - g = (int) (((value >> 8) & 0xff) / 255. * 7. + .5); - b = (int) (((value >> 16) & 0xff) / 255. * 3. + .5); - } else { - cp++; /* skip alpha channel */ - b = *cp++; - g = *cp++; - r = *cp++; - } - nvalue = (int)(0.30*r + 0.59*g + 0.11*b); - if ( nvalue > 255 ) nvalue = 255; - *ncp++ = (unsigned char)nvalue; - } - return rv; -} - -static PyObject * -imageop_grey2rgb(PyObject *self, PyObject *args) -{ - int x, y, len, nlen; - unsigned char *cp; - unsigned char *ncp; - PyObject *rv; - int i; - unsigned char value; - int backward_compatible = imageop_backward_compatible(); - - if ( !PyArg_ParseTuple(args, "s#ii", &cp, &len, &x, &y) ) - return 0; - - if ( !check_multiply(len, x, y) ) - return 0; - nlen = x*y*4; - if ( !check_multiply_size(nlen, x, "x", y, "y", 4) ) - return 0; - - rv = PyString_FromStringAndSize(NULL, nlen); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - for ( i=0; i < len; i++ ) { - value = *cp++; - if (backward_compatible) { - * (Py_UInt32 *) ncp = (Py_UInt32) value | ((Py_UInt32) value << 8 ) | ((Py_UInt32) value << 16); - ncp += 4; - } else { - *ncp++ = 0; - *ncp++ = value; - *ncp++ = value; - *ncp++ = value; - } - } - return rv; -} - -static PyMethodDef imageop_methods[] = { - { "crop", imageop_crop, METH_VARARGS }, - { "scale", imageop_scale, METH_VARARGS }, - { "grey2mono", imageop_grey2mono, METH_VARARGS }, - { "grey2grey2", imageop_grey2grey2, METH_VARARGS }, - { "grey2grey4", imageop_grey2grey4, METH_VARARGS }, - { "dither2mono", imageop_dither2mono, METH_VARARGS }, - { "dither2grey2", imageop_dither2grey2, METH_VARARGS }, - { "mono2grey", imageop_mono2grey, METH_VARARGS }, - { "grey22grey", imageop_grey22grey, METH_VARARGS }, - { "grey42grey", imageop_grey42grey, METH_VARARGS }, - { "tovideo", imageop_tovideo, METH_VARARGS }, - { "rgb2rgb8", imageop_rgb2rgb8, METH_VARARGS }, - { "rgb82rgb", imageop_rgb82rgb, METH_VARARGS }, - { "rgb2grey", imageop_rgb2grey, METH_VARARGS }, - { "grey2rgb", imageop_grey2rgb, METH_VARARGS }, - { 0, 0 } -}; - - -PyMODINIT_FUNC -initimageop(void) -{ - PyObject *m; - - if (PyErr_WarnPy3k("the imageop module has been removed in " - "Python 3.0", 2) < 0) - return; - - m = Py_InitModule("imageop", imageop_methods); - if (m == NULL) - return; - ImageopDict = PyModule_GetDict(m); - ImageopError = PyErr_NewException("imageop.error", NULL, NULL); - if (ImageopError != NULL) - PyDict_SetItemString(ImageopDict, "error", ImageopError); -} diff --git a/Modules/imgfile.c b/Modules/imgfile.c deleted file mode 100644 index 70d307b8ec2..00000000000 --- a/Modules/imgfile.c +++ /dev/null @@ -1,509 +0,0 @@ - -/* IMGFILE module - Interface to sgi libimage */ - -/* XXX This module should be done better at some point. It should return -** an object of image file class, and have routines to manipulate these -** image files in a neater way (so you can get rgb images off a greyscale -** file, for instance, or do a straight display without having to get the -** image bits into python, etc). -** -** Warning: this module is very non-reentrant (esp. the readscaled stuff) -*/ - -#include "Python.h" - -#include <gl/image.h> - -#include "/usr/people/4Dgifts/iristools/include/izoom.h" - -/* Bunch of missing extern decls; keep gcc -Wall happy... */ -extern void i_seterror(); -extern void iclose(); -extern void filterzoom(); -extern void putrow(); -extern void getrow(); - -static PyObject * ImgfileError; /* Exception we raise for various trouble */ - -static int top_to_bottom; /* True if we want top-to-bottom images */ - -/* The image library does not always call the error hander :-(, - therefore we have a global variable indicating that it was called. - It is cleared by imgfile_open(). */ - -static int error_called; - - -/* The error handler */ - -static void -imgfile_error(char *str) -{ - PyErr_SetString(ImgfileError, str); - error_called = 1; - return; /* To imglib, which will return a failure indicator */ -} - - -/* Open an image file and return a pointer to it. - Make sure we raise an exception if we fail. */ - -static IMAGE * -imgfile_open(char *fname) -{ - IMAGE *image; - i_seterror(imgfile_error); - error_called = 0; - errno = 0; - if ( (image = iopen(fname, "r")) == NULL ) { - /* Error may already be set by imgfile_error */ - if ( !error_called ) { - if (errno) - PyErr_SetFromErrno(ImgfileError); - else - PyErr_SetString(ImgfileError, - "Can't open image file"); - } - return NULL; - } - return image; -} - -static PyObject * -imgfile_ttob(PyObject *self, PyObject *args) -{ - int newval; - PyObject *rv; - - if (!PyArg_ParseTuple(args, "i:ttob", &newval)) - return NULL; - rv = PyInt_FromLong(top_to_bottom); - top_to_bottom = newval; - return rv; -} - -static PyObject * -imgfile_read(PyObject *self, PyObject *args) -{ - char *fname; - PyObject *rv; - int xsize, ysize, zsize; - char *cdatap; - long *idatap; - static short rs[8192], gs[8192], bs[8192]; - int x, y; - IMAGE *image; - int yfirst, ylast, ystep; - - if ( !PyArg_ParseTuple(args, "s:read", &fname) ) - return NULL; - - if ( (image = imgfile_open(fname)) == NULL ) - return NULL; - - if ( image->colormap != CM_NORMAL ) { - iclose(image); - PyErr_SetString(ImgfileError, - "Can only handle CM_NORMAL images"); - return NULL; - } - if ( BPP(image->type) != 1 ) { - iclose(image); - PyErr_SetString(ImgfileError, - "Can't handle imgfiles with bpp!=1"); - return NULL; - } - xsize = image->xsize; - ysize = image->ysize; - zsize = image->zsize; - if ( zsize != 1 && zsize != 3) { - iclose(image); - PyErr_SetString(ImgfileError, - "Can only handle 1 or 3 byte pixels"); - return NULL; - } - if ( xsize > 8192 ) { - iclose(image); - PyErr_SetString(ImgfileError, - "Can't handle image with > 8192 columns"); - return NULL; - } - - if ( zsize == 3 ) zsize = 4; - rv = PyString_FromStringAndSize((char *)NULL, xsize*ysize*zsize); - if ( rv == NULL ) { - iclose(image); - return NULL; - } - cdatap = PyString_AsString(rv); - idatap = (long *)cdatap; - - if (top_to_bottom) { - yfirst = ysize-1; - ylast = -1; - ystep = -1; - } else { - yfirst = 0; - ylast = ysize; - ystep = 1; - } - for ( y=yfirst; y != ylast && !error_called; y += ystep ) { - if ( zsize == 1 ) { - getrow(image, rs, y, 0); - for(x=0; x<xsize; x++ ) - *cdatap++ = rs[x]; - } else { - getrow(image, rs, y, 0); - getrow(image, gs, y, 1); - getrow(image, bs, y, 2); - for(x=0; x<xsize; x++ ) - *idatap++ = (rs[x] & 0xff) | - ((gs[x] & 0xff)<<8) | - ((bs[x] & 0xff)<<16); - } - } - iclose(image); - if ( error_called ) { - Py_DECREF(rv); - return NULL; - } - return rv; -} - -static IMAGE *glob_image; -static long *glob_datap; -static int glob_width, glob_z, glob_ysize; - -static void -xs_get(short *buf, int y) -{ - if (top_to_bottom) - getrow(glob_image, buf, (glob_ysize-1-y), glob_z); - else - getrow(glob_image, buf, y, glob_z); -} - -static void -xs_put_c(short *buf, int y) -{ - char *datap = (char *)glob_datap + y*glob_width; - int width = glob_width; - - while ( width-- ) - *datap++ = (*buf++) & 0xff; -} - -static void -xs_put_0(short *buf, int y) -{ - long *datap = glob_datap + y*glob_width; - int width = glob_width; - - while ( width-- ) - *datap++ = (*buf++) & 0xff; -} -static void -xs_put_12(short *buf, int y) -{ - long *datap = glob_datap + y*glob_width; - int width = glob_width; - - while ( width-- ) - *datap++ |= ((*buf++) & 0xff) << (glob_z*8); -} - -static void -xscale(IMAGE *image, int xsize, int ysize, int zsize, - long *datap, int xnew, int ynew, int fmode, double blur) -{ - glob_image = image; - glob_datap = datap; - glob_width = xnew; - glob_ysize = ysize; - if ( zsize == 1 ) { - glob_z = 0; - filterzoom(xs_get, xs_put_c, xsize, ysize, - xnew, ynew, fmode, blur); - } else { - glob_z = 0; - filterzoom(xs_get, xs_put_0, xsize, ysize, - xnew, ynew, fmode, blur); - glob_z = 1; - filterzoom(xs_get, xs_put_12, xsize, ysize, - xnew, ynew, fmode, blur); - glob_z = 2; - filterzoom(xs_get, xs_put_12, xsize, ysize, - xnew, ynew, fmode, blur); - } -} - - -static PyObject * -imgfile_readscaled(PyObject *self, PyObject *args) -{ - char *fname; - PyObject *rv; - int xsize, ysize, zsize; - char *cdatap; - long *idatap; - static short rs[8192], gs[8192], bs[8192]; - int x, y; - int xwtd, ywtd, xorig, yorig; - float xfac, yfac; - IMAGE *image; - char *filter; - double blur = 1.0; - int extended; - int fmode = 0; - int yfirst, ylast, ystep; - - /* - ** Parse args. Funny, since arg 4 and 5 are optional - ** (filter name and blur factor). Also, 4 or 5 arguments indicates - ** extended scale algorithm in stead of simple-minded pixel drop/dup. - */ - extended = PyTuple_Size(args) >= 4; - if ( !PyArg_ParseTuple(args, "sii|sd", - &fname, &xwtd, &ywtd, &filter, &blur) ) - return NULL; - - /* - ** Check parameters, open file and check type, rows, etc. - */ - if ( extended ) { - if ( strcmp(filter, "impulse") == 0 ) - fmode = IMPULSE; - else if ( strcmp( filter, "box") == 0 ) - fmode = BOX; - else if ( strcmp( filter, "triangle") == 0 ) - fmode = TRIANGLE; - else if ( strcmp( filter, "quadratic") == 0 ) - fmode = QUADRATIC; - else if ( strcmp( filter, "gaussian") == 0 ) - fmode = GAUSSIAN; - else { - PyErr_SetString(ImgfileError, "Unknown filter type"); - return NULL; - } - } - - if ( (image = imgfile_open(fname)) == NULL ) - return NULL; - - if ( image->colormap != CM_NORMAL ) { - iclose(image); - PyErr_SetString(ImgfileError, - "Can only handle CM_NORMAL images"); - return NULL; - } - if ( BPP(image->type) != 1 ) { - iclose(image); - PyErr_SetString(ImgfileError, - "Can't handle imgfiles with bpp!=1"); - return NULL; - } - xsize = image->xsize; - ysize = image->ysize; - zsize = image->zsize; - if ( zsize != 1 && zsize != 3) { - iclose(image); - PyErr_SetString(ImgfileError, - "Can only handle 1 or 3 byte pixels"); - return NULL; - } - if ( xsize > 8192 ) { - iclose(image); - PyErr_SetString(ImgfileError, - "Can't handle image with > 8192 columns"); - return NULL; - } - - if ( zsize == 3 ) zsize = 4; - rv = PyString_FromStringAndSize(NULL, xwtd*ywtd*zsize); - if ( rv == NULL ) { - iclose(image); - return NULL; - } - PyFPE_START_PROTECT("readscaled", return 0) - xfac = (float)xsize/(float)xwtd; - yfac = (float)ysize/(float)ywtd; - PyFPE_END_PROTECT(yfac) - cdatap = PyString_AsString(rv); - idatap = (long *)cdatap; - - if ( extended ) { - xscale(image, xsize, ysize, zsize, - idatap, xwtd, ywtd, fmode, blur); - } else { - if (top_to_bottom) { - yfirst = ywtd-1; - ylast = -1; - ystep = -1; - } else { - yfirst = 0; - ylast = ywtd; - ystep = 1; - } - for ( y=yfirst; y != ylast && !error_called; y += ystep ) { - yorig = (int)(y*yfac); - if ( zsize == 1 ) { - getrow(image, rs, yorig, 0); - for(x=0; x<xwtd; x++ ) { - *cdatap++ = rs[(int)(x*xfac)]; - } - } else { - getrow(image, rs, yorig, 0); - getrow(image, gs, yorig, 1); - getrow(image, bs, yorig, 2); - for(x=0; x<xwtd; x++ ) { - xorig = (int)(x*xfac); - *idatap++ = (rs[xorig] & 0xff) | - ((gs[xorig] & 0xff)<<8) | - ((bs[xorig] & 0xff)<<16); - } - } - } - } - iclose(image); - if ( error_called ) { - Py_DECREF(rv); - return NULL; - } - return rv; -} - -static PyObject * -imgfile_getsizes(PyObject *self, PyObject *args) -{ - char *fname; - PyObject *rv; - IMAGE *image; - - if ( !PyArg_ParseTuple(args, "s:getsizes", &fname) ) - return NULL; - - if ( (image = imgfile_open(fname)) == NULL ) - return NULL; - rv = Py_BuildValue("(iii)", image->xsize, image->ysize, image->zsize); - iclose(image); - return rv; -} - -static PyObject * -imgfile_write(PyObject *self, PyObject *args) -{ - IMAGE *image; - char *fname; - int xsize, ysize, zsize, len; - char *cdatap; - long *idatap; - short rs[8192], gs[8192], bs[8192]; - short r, g, b; - long rgb; - int x, y; - int yfirst, ylast, ystep; - - - if ( !PyArg_ParseTuple(args, "ss#iii:write", - &fname, &cdatap, &len, &xsize, &ysize, &zsize) ) - return NULL; - - if ( zsize != 1 && zsize != 3 ) { - PyErr_SetString(ImgfileError, - "Can only handle 1 or 3 byte pixels"); - return NULL; - } - if ( len != xsize * ysize * (zsize == 1 ? 1 : 4) ) { - PyErr_SetString(ImgfileError, "Data does not match sizes"); - return NULL; - } - if ( xsize > 8192 ) { - PyErr_SetString(ImgfileError, - "Can't handle image with > 8192 columns"); - return NULL; - } - - error_called = 0; - errno = 0; - image =iopen(fname, "w", RLE(1), 3, xsize, ysize, zsize); - if ( image == 0 ) { - if ( ! error_called ) { - if (errno) - PyErr_SetFromErrno(ImgfileError); - else - PyErr_SetString(ImgfileError, - "Can't create image file"); - } - return NULL; - } - - idatap = (long *)cdatap; - - if (top_to_bottom) { - yfirst = ysize-1; - ylast = -1; - ystep = -1; - } else { - yfirst = 0; - ylast = ysize; - ystep = 1; - } - for ( y=yfirst; y != ylast && !error_called; y += ystep ) { - if ( zsize == 1 ) { - for( x=0; x<xsize; x++ ) - rs[x] = *cdatap++; - putrow(image, rs, y, 0); - } else { - for( x=0; x<xsize; x++ ) { - rgb = *idatap++; - r = rgb & 0xff; - g = (rgb >> 8 ) & 0xff; - b = (rgb >> 16 ) & 0xff; - rs[x] = r; - gs[x] = g; - bs[x] = b; - } - putrow(image, rs, y, 0); - putrow(image, gs, y, 1); - putrow(image, bs, y, 2); - } - } - iclose(image); - if ( error_called ) - return NULL; - Py_INCREF(Py_None); - return Py_None; - -} - - -static PyMethodDef imgfile_methods[] = { - { "getsizes", imgfile_getsizes, METH_VARARGS }, - { "read", imgfile_read, METH_VARARGS }, - { "readscaled", imgfile_readscaled, METH_VARARGS}, - { "write", imgfile_write, METH_VARARGS }, - { "ttob", imgfile_ttob, METH_VARARGS }, - { NULL, NULL } /* Sentinel */ -}; - - -void -initimgfile(void) -{ - PyObject *m, *d; - - if (PyErr_WarnPy3k("the imgfile module has been removed in " - "Python 3.0", 2) < 0) - return; - - m = Py_InitModule("imgfile", imgfile_methods); - if (m == NULL) - return; - d = PyModule_GetDict(m); - ImgfileError = PyErr_NewException("imgfile.error", NULL, NULL); - if (ImgfileError != NULL) - PyDict_SetItemString(d, "error", ImgfileError); -} - - - diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index f6d0e2335d9..77e76fe5880 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -148,7 +148,7 @@ static PyTypeObject groupby_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -279,7 +279,7 @@ static PyTypeObject _grouper_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -432,7 +432,7 @@ static PyTypeObject teedataobject_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -588,7 +588,7 @@ static PyTypeObject tee_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -785,7 +785,7 @@ static PyTypeObject cycle_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -929,7 +929,7 @@ static PyTypeObject dropwhile_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1069,7 +1069,7 @@ static PyTypeObject takewhile_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1135,40 +1135,40 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds) numargs = PyTuple_Size(args); if (numargs == 2) { if (a1 != Py_None) { - stop = PyInt_AsSsize_t(a1); + stop = PyLong_AsSsize_t(a1); if (stop == -1) { if (PyErr_Occurred()) PyErr_Clear(); PyErr_SetString(PyExc_ValueError, - "Stop argument for islice() must be None or an integer: 0 <= x <= maxint."); + "Stop argument for islice() must be None or an integer: 0 <= x <= sys.maxsize."); return NULL; } } } else { if (a1 != Py_None) - start = PyInt_AsSsize_t(a1); + start = PyLong_AsSsize_t(a1); if (start == -1 && PyErr_Occurred()) PyErr_Clear(); if (a2 != Py_None) { - stop = PyInt_AsSsize_t(a2); + stop = PyLong_AsSsize_t(a2); if (stop == -1) { if (PyErr_Occurred()) PyErr_Clear(); PyErr_SetString(PyExc_ValueError, - "Stop argument for islice() must be None or an integer: 0 <= x <= maxint."); + "Stop argument for islice() must be None or an integer: 0 <= x <= sys.maxsize."); return NULL; } } } if (start<0 || stop<-1) { PyErr_SetString(PyExc_ValueError, - "Indices for islice() must be None or an integer: 0 <= x <= maxint."); + "Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize."); return NULL; } if (a3 != NULL) { if (a3 != Py_None) - step = PyInt_AsSsize_t(a3); + step = PyLong_AsSsize_t(a3); if (step == -1 && PyErr_Occurred()) PyErr_Clear(); } @@ -1265,7 +1265,7 @@ static PyTypeObject islice_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1396,7 +1396,7 @@ static PyTypeObject starmap_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1431,185 +1431,6 @@ static PyTypeObject starmap_type = { }; -/* imap object ************************************************************/ - -typedef struct { - PyObject_HEAD - PyObject *iters; - PyObject *func; -} imapobject; - -static PyTypeObject imap_type; - -static PyObject * -imap_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *it, *iters, *func; - imapobject *lz; - Py_ssize_t numargs, i; - - if (type == &imap_type && !_PyArg_NoKeywords("imap()", kwds)) - return NULL; - - numargs = PyTuple_Size(args); - if (numargs < 2) { - PyErr_SetString(PyExc_TypeError, - "imap() must have at least two arguments."); - return NULL; - } - - iters = PyTuple_New(numargs-1); - if (iters == NULL) - return NULL; - - for (i=1 ; i<numargs ; i++) { - /* Get iterator. */ - it = PyObject_GetIter(PyTuple_GET_ITEM(args, i)); - if (it == NULL) { - Py_DECREF(iters); - return NULL; - } - PyTuple_SET_ITEM(iters, i-1, it); - } - - /* create imapobject structure */ - lz = (imapobject *)type->tp_alloc(type, 0); - if (lz == NULL) { - Py_DECREF(iters); - return NULL; - } - lz->iters = iters; - func = PyTuple_GET_ITEM(args, 0); - Py_INCREF(func); - lz->func = func; - - return (PyObject *)lz; -} - -static void -imap_dealloc(imapobject *lz) -{ - PyObject_GC_UnTrack(lz); - Py_XDECREF(lz->iters); - Py_XDECREF(lz->func); - Py_TYPE(lz)->tp_free(lz); -} - -static int -imap_traverse(imapobject *lz, visitproc visit, void *arg) -{ - Py_VISIT(lz->iters); - Py_VISIT(lz->func); - return 0; -} - -/* -imap() is an iterator version of __builtins__.map() except that it does -not have the None fill-in feature. That was intentionally left out for -the following reasons: - - 1) Itertools are designed to be easily combined and chained together. - Having all tools stop with the shortest input is a unifying principle - that makes it easier to combine finite iterators (supplying data) with - infinite iterators like count() and repeat() (for supplying sequential - or constant arguments to a function). - - 2) In typical use cases for combining itertools, having one finite data - supplier run out before another is likely to be an error condition which - should not pass silently by automatically supplying None. - - 3) The use cases for automatic None fill-in are rare -- not many functions - do something useful when a parameter suddenly switches type and becomes - None. - - 4) If a need does arise, it can be met by __builtins__.map() or by - writing: chain(iterable, repeat(None)). - - 5) Similar toolsets in Haskell and SML do not have automatic None fill-in. -*/ - -static PyObject * -imap_next(imapobject *lz) -{ - PyObject *val; - PyObject *argtuple; - PyObject *result; - Py_ssize_t numargs, i; - - numargs = PyTuple_Size(lz->iters); - argtuple = PyTuple_New(numargs); - if (argtuple == NULL) - return NULL; - - for (i=0 ; i<numargs ; i++) { - val = PyIter_Next(PyTuple_GET_ITEM(lz->iters, i)); - if (val == NULL) { - Py_DECREF(argtuple); - return NULL; - } - PyTuple_SET_ITEM(argtuple, i, val); - } - if (lz->func == Py_None) - return argtuple; - result = PyObject_Call(lz->func, argtuple, NULL); - Py_DECREF(argtuple); - return result; -} - -PyDoc_STRVAR(imap_doc, -"imap(func, *iterables) --> imap object\n\ -\n\ -Make an iterator that computes the function using arguments from\n\ -each of the iterables. Like map() except that it returns\n\ -an iterator instead of a list and that it stops when the shortest\n\ -iterable is exhausted instead of filling in None for shorter\n\ -iterables."); - -static PyTypeObject imap_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "itertools.imap", /* tp_name */ - sizeof(imapobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)imap_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 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 | - Py_TPFLAGS_BASETYPE, /* tp_flags */ - imap_doc, /* tp_doc */ - (traverseproc)imap_traverse, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)imap_next, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* 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 */ - imap_new, /* tp_new */ - PyObject_GC_Del, /* tp_free */ -}; - - /* chain object ************************************************************/ typedef struct { @@ -1717,7 +1538,7 @@ chain_next(chainobject *lz) PyDoc_STRVAR(chain_doc, "chain(*iterables) --> chain object\n\ \n\ -Return a chain object whose .next() method returns elements from the\n\ +Return a chain object whose .__next__() method returns elements from the\n\ first iterable until it is exhausted, then elements from the next\n\ iterable, until all of the iterables are exhausted."); @@ -1743,7 +1564,7 @@ static PyTypeObject chain_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1994,7 +1815,7 @@ static PyTypeObject product_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2217,7 +2038,7 @@ static PyTypeObject combinations_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2463,7 +2284,7 @@ static PyTypeObject cwr_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2560,7 +2381,11 @@ permutations_new(PyTypeObject *type, PyObject *args, PyObject *kwds) r = n; if (robj != Py_None) { - r = PyInt_AsSsize_t(robj); + if (!PyLong_Check(robj)) { + PyErr_SetString(PyExc_TypeError, "Expected int as r"); + goto error; + } + r = PyLong_AsSsize_t(robj); if (r == -1 && PyErr_Occurred()) goto error; } @@ -2730,7 +2555,7 @@ static PyTypeObject permutations_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2764,6 +2589,138 @@ static PyTypeObject permutations_type = { PyObject_GC_Del, /* tp_free */ }; +/* accumulate object ************************************************************/ + +typedef struct { + PyObject_HEAD + PyObject *total; + PyObject *it; +} accumulateobject; + +static PyTypeObject accumulate_type; + +static PyObject * +accumulate_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + static char *kwargs[] = {"iterable", NULL}; + PyObject *iterable; + PyObject *it; + accumulateobject *lz; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:accumulate", kwargs, &iterable)) + return NULL; + + /* Get iterator. */ + it = PyObject_GetIter(iterable); + if (it == NULL) + return NULL; + + /* create accumulateobject structure */ + lz = (accumulateobject *)type->tp_alloc(type, 0); + if (lz == NULL) { + Py_DECREF(it); + return NULL; + } + + lz->total = NULL; + lz->it = it; + return (PyObject *)lz; +} + +static void +accumulate_dealloc(accumulateobject *lz) +{ + PyObject_GC_UnTrack(lz); + Py_XDECREF(lz->total); + Py_XDECREF(lz->it); + Py_TYPE(lz)->tp_free(lz); +} + +static int +accumulate_traverse(accumulateobject *lz, visitproc visit, void *arg) +{ + Py_VISIT(lz->it); + Py_VISIT(lz->total); + return 0; +} + +static PyObject * +accumulate_next(accumulateobject *lz) +{ + PyObject *val, *oldtotal, *newtotal; + + val = PyIter_Next(lz->it); + if (val == NULL) + return NULL; + + if (lz->total == NULL) { + Py_INCREF(val); + lz->total = val; + return lz->total; + } + + newtotal = PyNumber_Add(lz->total, val); + Py_DECREF(val); + if (newtotal == NULL) + return NULL; + + oldtotal = lz->total; + lz->total = newtotal; + Py_DECREF(oldtotal); + + Py_INCREF(newtotal); + return newtotal; +} + +PyDoc_STRVAR(accumulate_doc, +"accumulate(iterable) --> accumulate object\n\ +\n\ +Return series of accumulated sums."); + +static PyTypeObject accumulate_type = { + PyVarObject_HEAD_INIT(NULL, 0) + "itertools.accumulate", /* tp_name */ + sizeof(accumulateobject), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* methods */ + (destructor)accumulate_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 | + Py_TPFLAGS_BASETYPE, /* tp_flags */ + accumulate_doc, /* tp_doc */ + (traverseproc)accumulate_traverse, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + PyObject_SelfIter, /* tp_iter */ + (iternextfunc)accumulate_next, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* 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 */ + accumulate_new, /* tp_new */ + PyObject_GC_Del, /* tp_free */ +}; + /* compress object ************************************************************/ @@ -2771,7 +2728,7 @@ static PyTypeObject permutations_type = { def compress(data, selectors): "compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F" - return (d for d, s in izip(data, selectors) if s) + return (d for d, s in zip(data, selectors) if s) */ typedef struct { @@ -2884,7 +2841,7 @@ static PyTypeObject compress_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -2919,27 +2876,28 @@ static PyTypeObject compress_type = { }; -/* ifilter object ************************************************************/ +/* filterfalse object ************************************************************/ typedef struct { PyObject_HEAD PyObject *func; PyObject *it; -} ifilterobject; +} filterfalseobject; -static PyTypeObject ifilter_type; +static PyTypeObject filterfalse_type; static PyObject * -ifilter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +filterfalse_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *func, *seq; PyObject *it; - ifilterobject *lz; + filterfalseobject *lz; - if (type == &ifilter_type && !_PyArg_NoKeywords("ifilter()", kwds)) + if (type == &filterfalse_type && + !_PyArg_NoKeywords("filterfalse()", kwds)) return NULL; - if (!PyArg_UnpackTuple(args, "ifilter", 2, 2, &func, &seq)) + if (!PyArg_UnpackTuple(args, "filterfalse", 2, 2, &func, &seq)) return NULL; /* Get iterator. */ @@ -2947,8 +2905,8 @@ ifilter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (it == NULL) return NULL; - /* create ifilterobject structure */ - lz = (ifilterobject *)type->tp_alloc(type, 0); + /* create filterfalseobject structure */ + lz = (filterfalseobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_DECREF(it); return NULL; @@ -2961,7 +2919,7 @@ ifilter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } static void -ifilter_dealloc(ifilterobject *lz) +filterfalse_dealloc(filterfalseobject *lz) { PyObject_GC_UnTrack(lz); Py_XDECREF(lz->func); @@ -2970,7 +2928,7 @@ ifilter_dealloc(ifilterobject *lz) } static int -ifilter_traverse(ifilterobject *lz, visitproc visit, void *arg) +filterfalse_traverse(filterfalseobject *lz, visitproc visit, void *arg) { Py_VISIT(lz->it); Py_VISIT(lz->func); @@ -2978,152 +2936,7 @@ ifilter_traverse(ifilterobject *lz, visitproc visit, void *arg) } static PyObject * -ifilter_next(ifilterobject *lz) -{ - PyObject *item; - PyObject *it = lz->it; - long ok; - PyObject *(*iternext)(PyObject *); - - iternext = *Py_TYPE(it)->tp_iternext; - for (;;) { - item = iternext(it); - if (item == NULL) - return NULL; - - if (lz->func == Py_None || lz->func == (PyObject *)&PyBool_Type) { - ok = PyObject_IsTrue(item); - } else { - PyObject *good; - good = PyObject_CallFunctionObjArgs(lz->func, - item, NULL); - if (good == NULL) { - Py_DECREF(item); - return NULL; - } - ok = PyObject_IsTrue(good); - Py_DECREF(good); - } - if (ok > 0) - return item; - Py_DECREF(item); - if (ok < 0) - return NULL; - } -} - -PyDoc_STRVAR(ifilter_doc, -"ifilter(function or None, sequence) --> ifilter object\n\ -\n\ -Return those items of sequence for which function(item) is true.\n\ -If function is None, return the items that are true."); - -static PyTypeObject ifilter_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "itertools.ifilter", /* tp_name */ - sizeof(ifilterobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)ifilter_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 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 | - Py_TPFLAGS_BASETYPE, /* tp_flags */ - ifilter_doc, /* tp_doc */ - (traverseproc)ifilter_traverse, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)ifilter_next, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* 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 */ - ifilter_new, /* tp_new */ - PyObject_GC_Del, /* tp_free */ -}; - - -/* ifilterfalse object ************************************************************/ - -typedef struct { - PyObject_HEAD - PyObject *func; - PyObject *it; -} ifilterfalseobject; - -static PyTypeObject ifilterfalse_type; - -static PyObject * -ifilterfalse_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *func, *seq; - PyObject *it; - ifilterfalseobject *lz; - - if (type == &ifilterfalse_type && - !_PyArg_NoKeywords("ifilterfalse()", kwds)) - return NULL; - - if (!PyArg_UnpackTuple(args, "ifilterfalse", 2, 2, &func, &seq)) - return NULL; - - /* Get iterator. */ - it = PyObject_GetIter(seq); - if (it == NULL) - return NULL; - - /* create ifilterfalseobject structure */ - lz = (ifilterfalseobject *)type->tp_alloc(type, 0); - if (lz == NULL) { - Py_DECREF(it); - return NULL; - } - Py_INCREF(func); - lz->func = func; - lz->it = it; - - return (PyObject *)lz; -} - -static void -ifilterfalse_dealloc(ifilterfalseobject *lz) -{ - PyObject_GC_UnTrack(lz); - Py_XDECREF(lz->func); - Py_XDECREF(lz->it); - Py_TYPE(lz)->tp_free(lz); -} - -static int -ifilterfalse_traverse(ifilterfalseobject *lz, visitproc visit, void *arg) -{ - Py_VISIT(lz->it); - Py_VISIT(lz->func); - return 0; -} - -static PyObject * -ifilterfalse_next(ifilterfalseobject *lz) +filterfalse_next(filterfalseobject *lz) { PyObject *item; PyObject *it = lz->it; @@ -3157,23 +2970,23 @@ ifilterfalse_next(ifilterfalseobject *lz) } } -PyDoc_STRVAR(ifilterfalse_doc, -"ifilterfalse(function or None, sequence) --> ifilterfalse object\n\ +PyDoc_STRVAR(filterfalse_doc, +"filterfalse(function or None, sequence) --> filterfalse object\n\ \n\ Return those items of sequence for which function(item) is false.\n\ If function is None, return the items that are false."); -static PyTypeObject ifilterfalse_type = { +static PyTypeObject filterfalse_type = { PyVarObject_HEAD_INIT(NULL, 0) - "itertools.ifilterfalse", /* tp_name */ - sizeof(ifilterfalseobject), /* tp_basicsize */ + "itertools.filterfalse", /* tp_name */ + sizeof(filterfalseobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ - (destructor)ifilterfalse_dealloc, /* tp_dealloc */ + (destructor)filterfalse_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3186,13 +2999,13 @@ static PyTypeObject ifilterfalse_type = { 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, /* tp_flags */ - ifilterfalse_doc, /* tp_doc */ - (traverseproc)ifilterfalse_traverse, /* tp_traverse */ + filterfalse_doc, /* tp_doc */ + (traverseproc)filterfalse_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ - (iternextfunc)ifilterfalse_next, /* tp_iternext */ + (iternextfunc)filterfalse_next, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ @@ -3203,7 +3016,7 @@ static PyTypeObject ifilterfalse_type = { 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ - ifilterfalse_new, /* tp_new */ + filterfalse_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ }; @@ -3244,6 +3057,7 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_ssize_t cnt = 0; PyObject *long_cnt = NULL; PyObject *long_step = NULL; + long step; static char *kwlist[] = {"start", "step", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:count", @@ -3257,20 +3071,20 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } if (long_cnt != NULL) { - cnt = PyInt_AsSsize_t(long_cnt); - if ((cnt == -1 && PyErr_Occurred()) || !PyInt_Check(long_cnt)) { + cnt = PyLong_AsSsize_t(long_cnt); + if ((cnt == -1 && PyErr_Occurred()) || !PyLong_Check(long_cnt)) { PyErr_Clear(); slow_mode = 1; } Py_INCREF(long_cnt); } else { cnt = 0; - long_cnt = PyInt_FromLong(0); + long_cnt = PyLong_FromLong(0); } /* If not specified, step defaults to 1 */ if (long_step == NULL) { - long_step = PyInt_FromLong(1); + long_step = PyLong_FromLong(1); if (long_step == NULL) { Py_DECREF(long_cnt); return NULL; @@ -3281,9 +3095,11 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds) assert(long_cnt != NULL && long_step != NULL); /* Fast mode only works when the step is 1 */ - if (!PyInt_Check(long_step) || - PyInt_AS_LONG(long_step) != 1) { - slow_mode = 1; + step = PyLong_AsLong(long_step); + if (step != 1) { + slow_mode = 1; + if (step == -1 && PyErr_Occurred()) + PyErr_Clear(); } if (slow_mode) @@ -3294,7 +3110,7 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds) assert((cnt != PY_SSIZE_T_MAX && long_cnt == NULL && !slow_mode) || (cnt == PY_SSIZE_T_MAX && long_cnt != NULL && slow_mode)); assert(slow_mode || - (PyInt_Check(long_step) && PyInt_AS_LONG(long_step) == 1)); + (PyLong_Check(long_step) && PyLong_AS_LONG(long_step) == 1)); /* create countobject structure */ lz = (countobject *)type->tp_alloc(type, 0); @@ -3335,7 +3151,7 @@ count_nextlong(countobject *lz) long_cnt = lz->long_cnt; if (long_cnt == NULL) { /* Switch to slow_mode */ - long_cnt = PyInt_FromSsize_t(PY_SSIZE_T_MAX); + long_cnt = PyLong_FromSsize_t(PY_SSIZE_T_MAX); if (long_cnt == NULL) return NULL; } @@ -3353,36 +3169,27 @@ count_next(countobject *lz) { if (lz->cnt == PY_SSIZE_T_MAX) return count_nextlong(lz); - return PyInt_FromSsize_t(lz->cnt++); + return PyLong_FromSsize_t(lz->cnt++); } static PyObject * count_repr(countobject *lz) { - PyObject *cnt_repr, *step_repr = NULL; - PyObject *result = NULL; - if (lz->cnt != PY_SSIZE_T_MAX) - return PyString_FromFormat("count(%zd)", lz->cnt); + return PyUnicode_FromFormat("count(%zd)", lz->cnt); - cnt_repr = PyObject_Repr(lz->long_cnt); - if (cnt_repr == NULL) - return NULL; - - if (PyInt_Check(lz->long_step) && PyInt_AS_LONG(lz->long_step) == 1) { - /* Don't display step when it is an integer equal to 1 */ - result = PyString_FromFormat("count(%s)", - PyString_AS_STRING(cnt_repr)); - } else { - step_repr = PyObject_Repr(lz->long_step); - if (step_repr != NULL) - result = PyString_FromFormat("count(%s, %s)", - PyString_AS_STRING(cnt_repr), - PyString_AS_STRING(step_repr)); + if (PyLong_Check(lz->long_step)) { + long step = PyLong_AsLong(lz->long_step); + if (step == -1 && PyErr_Occurred()) { + PyErr_Clear(); + } + if (step == 1) { + /* Don't display step when it is an integer equal to 1 */ + return PyUnicode_FromFormat("count(%R)", lz->long_cnt); + } } - Py_DECREF(cnt_repr); - Py_XDECREF(step_repr); - return result; + return PyUnicode_FromFormat("count(%R, %R)", + lz->long_cnt, lz->long_step); } static PyObject * @@ -3404,7 +3211,7 @@ static PyMethodDef count_methods[] = { PyDoc_STRVAR(count_doc, "count(start=0, step=1) --> count object\n\ \n\ -Return a count object whose .next() method returns consecutive values.\n\ +Return a count object whose .__next__() method returns consecutive values.\n\ Equivalent to:\n\n\ def count(firstval=0, step=1):\n\ x = firstval\n\ @@ -3422,7 +3229,7 @@ static PyTypeObject count_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)count_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3457,191 +3264,6 @@ static PyTypeObject count_type = { }; -/* izip object ************************************************************/ - -#include "Python.h" - -typedef struct { - PyObject_HEAD - Py_ssize_t tuplesize; - PyObject *ittuple; /* tuple of iterators */ - PyObject *result; -} izipobject; - -static PyTypeObject izip_type; - -static PyObject * -izip_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - izipobject *lz; - Py_ssize_t i; - PyObject *ittuple; /* tuple of iterators */ - PyObject *result; - Py_ssize_t tuplesize = PySequence_Length(args); - - if (type == &izip_type && !_PyArg_NoKeywords("izip()", kwds)) - return NULL; - - /* args must be a tuple */ - assert(PyTuple_Check(args)); - - /* obtain iterators */ - ittuple = PyTuple_New(tuplesize); - if (ittuple == NULL) - return NULL; - for (i=0; i < tuplesize; ++i) { - PyObject *item = PyTuple_GET_ITEM(args, i); - PyObject *it = PyObject_GetIter(item); - if (it == NULL) { - if (PyErr_ExceptionMatches(PyExc_TypeError)) - PyErr_Format(PyExc_TypeError, - "izip argument #%zd must support iteration", - i+1); - Py_DECREF(ittuple); - return NULL; - } - PyTuple_SET_ITEM(ittuple, i, it); - } - - /* create a result holder */ - result = PyTuple_New(tuplesize); - if (result == NULL) { - Py_DECREF(ittuple); - return NULL; - } - for (i=0 ; i < tuplesize ; i++) { - Py_INCREF(Py_None); - PyTuple_SET_ITEM(result, i, Py_None); - } - - /* create izipobject structure */ - lz = (izipobject *)type->tp_alloc(type, 0); - if (lz == NULL) { - Py_DECREF(ittuple); - Py_DECREF(result); - return NULL; - } - lz->ittuple = ittuple; - lz->tuplesize = tuplesize; - lz->result = result; - - return (PyObject *)lz; -} - -static void -izip_dealloc(izipobject *lz) -{ - PyObject_GC_UnTrack(lz); - Py_XDECREF(lz->ittuple); - Py_XDECREF(lz->result); - Py_TYPE(lz)->tp_free(lz); -} - -static int -izip_traverse(izipobject *lz, visitproc visit, void *arg) -{ - Py_VISIT(lz->ittuple); - Py_VISIT(lz->result); - return 0; -} - -static PyObject * -izip_next(izipobject *lz) -{ - Py_ssize_t i; - Py_ssize_t tuplesize = lz->tuplesize; - PyObject *result = lz->result; - PyObject *it; - PyObject *item; - PyObject *olditem; - - if (tuplesize == 0) - return NULL; - if (Py_REFCNT(result) == 1) { - Py_INCREF(result); - for (i=0 ; i < tuplesize ; i++) { - it = PyTuple_GET_ITEM(lz->ittuple, i); - item = (*Py_TYPE(it)->tp_iternext)(it); - if (item == NULL) { - Py_DECREF(result); - return NULL; - } - olditem = PyTuple_GET_ITEM(result, i); - PyTuple_SET_ITEM(result, i, item); - Py_DECREF(olditem); - } - } else { - result = PyTuple_New(tuplesize); - if (result == NULL) - return NULL; - for (i=0 ; i < tuplesize ; i++) { - it = PyTuple_GET_ITEM(lz->ittuple, i); - item = (*Py_TYPE(it)->tp_iternext)(it); - if (item == NULL) { - Py_DECREF(result); - return NULL; - } - PyTuple_SET_ITEM(result, i, item); - } - } - return result; -} - -PyDoc_STRVAR(izip_doc, -"izip(iter1 [,iter2 [...]]) --> izip object\n\ -\n\ -Return a izip object whose .next() method returns a tuple where\n\ -the i-th element comes from the i-th iterable argument. The .next()\n\ -method continues until the shortest iterable in the argument sequence\n\ -is exhausted and then it raises StopIteration. Works like the zip()\n\ -function but consumes less memory by returning an iterator instead of\n\ -a list."); - -static PyTypeObject izip_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "itertools.izip", /* tp_name */ - sizeof(izipobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)izip_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 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 | - Py_TPFLAGS_BASETYPE, /* tp_flags */ - izip_doc, /* tp_doc */ - (traverseproc)izip_traverse, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)izip_next, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* 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 */ - izip_new, /* tp_new */ - PyObject_GC_Del, /* tp_free */ -}; - - /* repeat object ************************************************************/ typedef struct { @@ -3705,20 +3327,10 @@ repeat_next(repeatobject *ro) static PyObject * repeat_repr(repeatobject *ro) { - PyObject *result, *objrepr; - - objrepr = PyObject_Repr(ro->element); - if (objrepr == NULL) - return NULL; - if (ro->cnt == -1) - result = PyString_FromFormat("repeat(%s)", - PyString_AS_STRING(objrepr)); + return PyUnicode_FromFormat("repeat(%R)", ro->element); else - result = PyString_FromFormat("repeat(%s, %zd)", - PyString_AS_STRING(objrepr), ro->cnt); - Py_DECREF(objrepr); - return result; + return PyUnicode_FromFormat("repeat(%R, %zd)", ro->element, ro->cnt); } static PyObject * @@ -3728,7 +3340,7 @@ repeat_len(repeatobject *ro) PyErr_SetString(PyExc_TypeError, "len() of unsized object"); return NULL; } - return PyInt_FromSize_t(ro->cnt); + return PyLong_FromSize_t(ro->cnt); } PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it))."); @@ -3753,7 +3365,7 @@ static PyTypeObject repeat_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)repeat_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3787,7 +3399,7 @@ static PyTypeObject repeat_type = { PyObject_GC_Del, /* tp_free */ }; -/* iziplongest object ************************************************************/ +/* ziplongest object ************************************************************/ #include "Python.h" @@ -3798,14 +3410,14 @@ typedef struct { PyObject *ittuple; /* tuple of iterators */ PyObject *result; PyObject *fillvalue; -} iziplongestobject; +} ziplongestobject; -static PyTypeObject iziplongest_type; +static PyTypeObject ziplongest_type; static PyObject * -izip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +zip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - iziplongestobject *lz; + ziplongestobject *lz; Py_ssize_t i; PyObject *ittuple; /* tuple of iterators */ PyObject *result; @@ -3816,7 +3428,7 @@ izip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds) fillvalue = PyDict_GetItemString(kwds, "fillvalue"); if (fillvalue == NULL || PyDict_Size(kwds) > 1) { PyErr_SetString(PyExc_TypeError, - "izip_longest() got an unexpected keyword argument"); + "zip_longest() got an unexpected keyword argument"); return NULL; } } @@ -3834,7 +3446,7 @@ izip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (it == NULL) { if (PyErr_ExceptionMatches(PyExc_TypeError)) PyErr_Format(PyExc_TypeError, - "izip_longest argument #%zd must support iteration", + "zip_longest argument #%zd must support iteration", i+1); Py_DECREF(ittuple); return NULL; @@ -3853,8 +3465,8 @@ izip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyTuple_SET_ITEM(result, i, Py_None); } - /* create iziplongestobject structure */ - lz = (iziplongestobject *)type->tp_alloc(type, 0); + /* create ziplongestobject structure */ + lz = (ziplongestobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_DECREF(ittuple); Py_DECREF(result); @@ -3870,7 +3482,7 @@ izip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } static void -izip_longest_dealloc(iziplongestobject *lz) +zip_longest_dealloc(ziplongestobject *lz) { PyObject_GC_UnTrack(lz); Py_XDECREF(lz->ittuple); @@ -3880,7 +3492,7 @@ izip_longest_dealloc(iziplongestobject *lz) } static int -izip_longest_traverse(iziplongestobject *lz, visitproc visit, void *arg) +zip_longest_traverse(ziplongestobject *lz, visitproc visit, void *arg) { Py_VISIT(lz->ittuple); Py_VISIT(lz->result); @@ -3889,7 +3501,7 @@ izip_longest_traverse(iziplongestobject *lz, visitproc visit, void *arg) } static PyObject * -izip_longest_next(iziplongestobject *lz) +zip_longest_next(ziplongestobject *lz) { Py_ssize_t i; Py_ssize_t tuplesize = lz->tuplesize; @@ -3960,28 +3572,28 @@ izip_longest_next(iziplongestobject *lz) return result; } -PyDoc_STRVAR(izip_longest_doc, -"izip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> izip_longest object\n\ +PyDoc_STRVAR(zip_longest_doc, +"zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\n\ \n\ -Return an izip_longest object whose .next() method returns a tuple where\n\ -the i-th element comes from the i-th iterable argument. The .next()\n\ +Return an zip_longest object whose .__next__() method returns a tuple where\n\ +the i-th element comes from the i-th iterable argument. The .__next__()\n\ method continues until the longest iterable in the argument sequence\n\ is exhausted and then it raises StopIteration. When the shorter iterables\n\ are exhausted, the fillvalue is substituted in their place. The fillvalue\n\ defaults to None or can be specified by a keyword argument.\n\ "); -static PyTypeObject iziplongest_type = { +static PyTypeObject ziplongest_type = { PyVarObject_HEAD_INIT(NULL, 0) - "itertools.izip_longest", /* tp_name */ - sizeof(iziplongestobject), /* tp_basicsize */ + "itertools.zip_longest", /* tp_name */ + sizeof(ziplongestobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ - (destructor)izip_longest_dealloc, /* tp_dealloc */ + (destructor)zip_longest_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3994,13 +3606,13 @@ static PyTypeObject iziplongest_type = { 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, /* tp_flags */ - izip_longest_doc, /* tp_doc */ - (traverseproc)izip_longest_traverse, /* tp_traverse */ + zip_longest_doc, /* tp_doc */ + (traverseproc)zip_longest_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ - (iternextfunc)izip_longest_next, /* tp_iternext */ + (iternextfunc)zip_longest_next, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ @@ -4011,7 +3623,7 @@ static PyTypeObject iziplongest_type = { 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ - izip_longest_new, /* tp_new */ + zip_longest_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ }; @@ -4026,20 +3638,18 @@ cycle(p) --> p0, p1, ... plast, p0, p1, ...\n\ repeat(elem [,n]) --> elem, elem, elem, ... endlessly or up to n times\n\ \n\ Iterators terminating on the shortest input sequence:\n\ +accumulate(p, start=0) --> p0, p0+p1, p0+p1+p2\n\ chain(p, q, ...) --> p0, p1, ... plast, q0, q1, ... \n\ compress(data, selectors) --> (d[0] if s[0]), (d[1] if s[1]), ...\n\ dropwhile(pred, seq) --> seq[n], seq[n+1], starting when pred fails\n\ groupby(iterable[, keyfunc]) --> sub-iterators grouped by value of keyfunc(v)\n\ -ifilter(pred, seq) --> elements of seq where pred(elem) is True\n\ -ifilterfalse(pred, seq) --> elements of seq where pred(elem) is False\n\ +filterfalse(pred, seq) --> elements of seq where pred(elem) is False\n\ islice(seq, [start,] stop [, step]) --> elements from\n\ seq[start:stop:step]\n\ -imap(fun, p, q, ...) --> fun(p0, q0), fun(p1, q1), ...\n\ starmap(fun, seq) --> fun(*seq[0]), fun(*seq[1]), ...\n\ tee(it, n=2) --> (it1, it2 , ... itn) splits one iterator into n\n\ takewhile(pred, seq) --> seq[0], seq[1], until pred fails\n\ -izip(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... \n\ -izip_longest(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... \n\ +zip_longest(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... \n\ \n\ Combinatoric generators:\n\ product(p, q, ... [repeat=1]) --> cartesian product\n\ @@ -4054,13 +3664,27 @@ static PyMethodDef module_methods[] = { {NULL, NULL} /* sentinel */ }; + +static struct PyModuleDef itertoolsmodule = { + PyModuleDef_HEAD_INIT, + "itertools", + module_doc, + -1, + module_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -inititertools(void) +PyInit_itertools(void) { int i; PyObject *m; char *name; PyTypeObject *typelist[] = { + &accumulate_type, &combinations_type, &cwr_type, &cycle_type, @@ -4068,14 +3692,11 @@ inititertools(void) &takewhile_type, &islice_type, &starmap_type, - &imap_type, &chain_type, &compress_type, - &ifilter_type, - &ifilterfalse_type, + &filterfalse_type, &count_type, - &izip_type, - &iziplongest_type, + &ziplongest_type, &permutations_type, &product_type, &repeat_type, @@ -4084,13 +3705,13 @@ inititertools(void) }; Py_TYPE(&teedataobject_type) = &PyType_Type; - m = Py_InitModule3("itertools", module_methods, module_doc); + m = PyModule_Create(&itertoolsmodule); if (m == NULL) - return; + return NULL; for (i=0 ; typelist[i] != NULL ; i++) { if (PyType_Ready(typelist[i]) < 0) - return; + return NULL; name = strchr(typelist[i]->tp_name, '.'); assert (name != NULL); Py_INCREF(typelist[i]); @@ -4098,9 +3719,10 @@ inititertools(void) } if (PyType_Ready(&teedataobject_type) < 0) - return; + return NULL; if (PyType_Ready(&tee_type) < 0) - return; + return NULL; if (PyType_Ready(&_grouper_type) < 0) - return; + return NULL; + return m; } diff --git a/Modules/ld_so_aix.in b/Modules/ld_so_aix.in index 39251d2cf52..86a9f7e15e6 100644 --- a/Modules/ld_so_aix.in +++ b/Modules/ld_so_aix.in @@ -131,7 +131,7 @@ do shift done -if test "$objfile" = "libpython@VERSION@.so"; then +if test "$objfile" = "libpython@VERSION@@ABIFLAGS@.so"; then ldsocoremode="true" fi @@ -158,7 +158,7 @@ fi # Default entry symbol for Python modules = init[modulename] # Can be overriden by providing a -e argument. if test -z "$entry"; then - entry=init`echo $filename | sed "s/module.*//"` + entry=PyInit_`echo $filename | sed "s/module.*//"` fi #echo "ld_so_aix: Debug info section" diff --git a/Modules/linuxaudiodev.c b/Modules/linuxaudiodev.c deleted file mode 100644 index 7fe20ae1954..00000000000 --- a/Modules/linuxaudiodev.c +++ /dev/null @@ -1,505 +0,0 @@ -/* Hey Emacs, this is -*-C-*- - ****************************************************************************** - * linuxaudiodev.c -- Linux audio device for python. - * - * Author : Peter Bosch - * Created On : Thu Mar 2 21:10:33 2000 - * Status : Unknown, Use with caution! - * - * Unless other notices are present in any part of this file - * explicitly claiming copyrights for other people and/or - * organizations, the contents of this file is fully copyright - * (C) 2000 Peter Bosch, all rights reserved. - ****************************************************************************** - */ - -#include "Python.h" -#include "structmember.h" - -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#else -#define O_RDONLY 00 -#define O_WRONLY 01 -#endif - - -#include <sys/ioctl.h> -#if defined(linux) -#include <linux/soundcard.h> - -#ifndef HAVE_STDINT_H -typedef unsigned long uint32_t; -#endif - -#elif defined(__FreeBSD__) -#include <machine/soundcard.h> - -#ifndef SNDCTL_DSP_CHANNELS -#define SNDCTL_DSP_CHANNELS SOUND_PCM_WRITE_CHANNELS -#endif - -#endif - -typedef struct { - PyObject_HEAD - int x_fd; /* The open file */ - int x_mode; /* file mode */ - int x_icount; /* Input count */ - int x_ocount; /* Output count */ - uint32_t x_afmts; /* Audio formats supported by hardware*/ -} lad_t; - -/* XXX several format defined in soundcard.h are not supported, - including _NE (native endian) options and S32 options -*/ - -static struct { - int a_bps; - uint32_t a_fmt; - char *a_name; -} audio_types[] = { - { 8, AFMT_MU_LAW, "logarithmic mu-law 8-bit audio" }, - { 8, AFMT_A_LAW, "logarithmic A-law 8-bit audio" }, - { 8, AFMT_U8, "linear unsigned 8-bit audio" }, - { 8, AFMT_S8, "linear signed 8-bit audio" }, - { 16, AFMT_U16_BE, "linear unsigned 16-bit big-endian audio" }, - { 16, AFMT_U16_LE, "linear unsigned 16-bit little-endian audio" }, - { 16, AFMT_S16_BE, "linear signed 16-bit big-endian audio" }, - { 16, AFMT_S16_LE, "linear signed 16-bit little-endian audio" }, - { 16, AFMT_S16_NE, "linear signed 16-bit native-endian audio" }, -}; - -static int n_audio_types = sizeof(audio_types) / sizeof(audio_types[0]); - -static PyTypeObject Ladtype; - -static PyObject *LinuxAudioError; - -static lad_t * -newladobject(PyObject *arg) -{ - lad_t *xp; - int fd, afmts, imode; - char *basedev = NULL; - char *mode = NULL; - - /* Two ways to call linuxaudiodev.open(): - open(device, mode) (for consistency with builtin open()) - open(mode) (for backwards compatibility) - because the *first* argument is optional, parsing args is - a wee bit tricky. */ - if (!PyArg_ParseTuple(arg, "s|s:open", &basedev, &mode)) - return NULL; - if (mode == NULL) { /* only one arg supplied */ - mode = basedev; - basedev = NULL; - } - - if (strcmp(mode, "r") == 0) - imode = O_RDONLY; - else if (strcmp(mode, "w") == 0) - imode = O_WRONLY; - else { - PyErr_SetString(LinuxAudioError, "mode should be 'r' or 'w'"); - return NULL; - } - - /* Open the correct device. The base device name comes from the - * AUDIODEV environment variable first, then /dev/dsp. The - * control device tacks "ctl" onto the base device name. - * - * Note that the only difference between /dev/audio and /dev/dsp - * is that the former uses logarithmic mu-law encoding and the - * latter uses 8-bit unsigned encoding. - */ - - if (basedev == NULL) { /* called with one arg */ - basedev = getenv("AUDIODEV"); - if (basedev == NULL) /* $AUDIODEV not set */ - basedev = "/dev/dsp"; - } - - if ((fd = open(basedev, imode)) == -1) { - PyErr_SetFromErrnoWithFilename(LinuxAudioError, basedev); - return NULL; - } - if (imode == O_WRONLY && ioctl(fd, SNDCTL_DSP_NONBLOCK, NULL) == -1) { - PyErr_SetFromErrnoWithFilename(LinuxAudioError, basedev); - return NULL; - } - if (ioctl(fd, SNDCTL_DSP_GETFMTS, &afmts) == -1) { - PyErr_SetFromErrnoWithFilename(LinuxAudioError, basedev); - return NULL; - } - /* Create and initialize the object */ - if ((xp = PyObject_New(lad_t, &Ladtype)) == NULL) { - close(fd); - return NULL; - } - xp->x_fd = fd; - xp->x_mode = imode; - xp->x_icount = xp->x_ocount = 0; - xp->x_afmts = afmts; - return xp; -} - -static void -lad_dealloc(lad_t *xp) -{ - /* if already closed, don't reclose it */ - if (xp->x_fd != -1) - close(xp->x_fd); - PyObject_Del(xp); -} - -static PyObject * -lad_read(lad_t *self, PyObject *args) -{ - int size, count; - char *cp; - PyObject *rv; - - if (!PyArg_ParseTuple(args, "i:read", &size)) - return NULL; - rv = PyString_FromStringAndSize(NULL, size); - if (rv == NULL) - return NULL; - cp = PyString_AS_STRING(rv); - if ((count = read(self->x_fd, cp, size)) < 0) { - PyErr_SetFromErrno(LinuxAudioError); - Py_DECREF(rv); - return NULL; - } - self->x_icount += count; - _PyString_Resize(&rv, count); - return rv; -} - -static PyObject * -lad_write(lad_t *self, PyObject *args) -{ - char *cp; - int rv, size; - fd_set write_set_fds; - struct timeval tv; - int select_retval; - - if (!PyArg_ParseTuple(args, "s#:write", &cp, &size)) - return NULL; - - /* use select to wait for audio device to be available */ - FD_ZERO(&write_set_fds); - FD_SET(self->x_fd, &write_set_fds); - tv.tv_sec = 4; /* timeout values */ - tv.tv_usec = 0; - - while (size > 0) { - select_retval = select(self->x_fd+1, NULL, &write_set_fds, NULL, &tv); - tv.tv_sec = 1; tv.tv_usec = 0; /* willing to wait this long next time*/ - if (select_retval) { - if ((rv = write(self->x_fd, cp, size)) == -1) { - if (errno != EAGAIN) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } else { - errno = 0; /* EAGAIN: buffer is full, try again */ - } - } else { - self->x_ocount += rv; - size -= rv; - cp += rv; - } - } else { - /* printf("Not able to write to linux audio device within %ld seconds\n", tv.tv_sec); */ - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -lad_close(lad_t *self, PyObject *unused) -{ - if (self->x_fd >= 0) { - close(self->x_fd); - self->x_fd = -1; - } - Py_RETURN_NONE; -} - -static PyObject * -lad_fileno(lad_t *self, PyObject *unused) -{ - return PyInt_FromLong(self->x_fd); -} - -static PyObject * -lad_setparameters(lad_t *self, PyObject *args) -{ - int rate, ssize, nchannels, n, fmt, emulate=0; - - if (!PyArg_ParseTuple(args, "iiii|i:setparameters", - &rate, &ssize, &nchannels, &fmt, &emulate)) - return NULL; - - if (rate < 0) { - PyErr_Format(PyExc_ValueError, "expected rate >= 0, not %d", - rate); - return NULL; - } - if (ssize < 0) { - PyErr_Format(PyExc_ValueError, "expected sample size >= 0, not %d", - ssize); - return NULL; - } - if (nchannels != 1 && nchannels != 2) { - PyErr_Format(PyExc_ValueError, "nchannels must be 1 or 2, not %d", - nchannels); - return NULL; - } - - for (n = 0; n < n_audio_types; n++) - if (fmt == audio_types[n].a_fmt) - break; - if (n == n_audio_types) { - PyErr_Format(PyExc_ValueError, "unknown audio encoding: %d", fmt); - return NULL; - } - if (audio_types[n].a_bps != ssize) { - PyErr_Format(PyExc_ValueError, - "for %s, expected sample size %d, not %d", - audio_types[n].a_name, audio_types[n].a_bps, ssize); - return NULL; - } - - if (emulate == 0) { - if ((self->x_afmts & audio_types[n].a_fmt) == 0) { - PyErr_Format(PyExc_ValueError, - "%s format not supported by device", - audio_types[n].a_name); - return NULL; - } - } - if (ioctl(self->x_fd, SNDCTL_DSP_SETFMT, - &audio_types[n].a_fmt) == -1) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - if (ioctl(self->x_fd, SNDCTL_DSP_CHANNELS, &nchannels) == -1) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - if (ioctl(self->x_fd, SNDCTL_DSP_SPEED, &rate) == -1) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static int -_ssize(lad_t *self, int *nchannels, int *ssize) -{ - int fmt; - - fmt = 0; - if (ioctl(self->x_fd, SNDCTL_DSP_SETFMT, &fmt) < 0) - return -errno; - - switch (fmt) { - case AFMT_MU_LAW: - case AFMT_A_LAW: - case AFMT_U8: - case AFMT_S8: - *ssize = sizeof(char); - break; - case AFMT_S16_LE: - case AFMT_S16_BE: - case AFMT_U16_LE: - case AFMT_U16_BE: - *ssize = sizeof(short); - break; - case AFMT_MPEG: - case AFMT_IMA_ADPCM: - default: - return -EOPNOTSUPP; - } - if (ioctl(self->x_fd, SNDCTL_DSP_CHANNELS, nchannels) < 0) - return -errno; - return 0; -} - - -/* bufsize returns the size of the hardware audio buffer in number - of samples */ -static PyObject * -lad_bufsize(lad_t *self, PyObject *unused) -{ - audio_buf_info ai; - int nchannels=0, ssize=0; - - if (_ssize(self, &nchannels, &ssize) < 0 || !ssize || !nchannels) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - if (ioctl(self->x_fd, SNDCTL_DSP_GETOSPACE, &ai) < 0) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - return PyInt_FromLong((ai.fragstotal * ai.fragsize) / (nchannels * ssize)); -} - -/* obufcount returns the number of samples that are available in the - hardware for playing */ -static PyObject * -lad_obufcount(lad_t *self, PyObject *unused) -{ - audio_buf_info ai; - int nchannels=0, ssize=0; - - if (_ssize(self, &nchannels, &ssize) < 0 || !ssize || !nchannels) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - if (ioctl(self->x_fd, SNDCTL_DSP_GETOSPACE, &ai) < 0) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - return PyInt_FromLong((ai.fragstotal * ai.fragsize - ai.bytes) / - (ssize * nchannels)); -} - -/* obufcount returns the number of samples that can be played without - blocking */ -static PyObject * -lad_obuffree(lad_t *self, PyObject *unused) -{ - audio_buf_info ai; - int nchannels=0, ssize=0; - - if (_ssize(self, &nchannels, &ssize) < 0 || !ssize || !nchannels) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - if (ioctl(self->x_fd, SNDCTL_DSP_GETOSPACE, &ai) < 0) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - return PyInt_FromLong(ai.bytes / (ssize * nchannels)); -} - -/* Flush the device */ -static PyObject * -lad_flush(lad_t *self, PyObject *unused) -{ - if (ioctl(self->x_fd, SNDCTL_DSP_SYNC, NULL) == -1) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - Py_RETURN_NONE; -} - -static PyObject * -lad_getptr(lad_t *self, PyObject *unused) -{ - count_info info; - int req; - - if (self->x_mode == O_RDONLY) - req = SNDCTL_DSP_GETIPTR; - else - req = SNDCTL_DSP_GETOPTR; - if (ioctl(self->x_fd, req, &info) == -1) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - return Py_BuildValue("iii", info.bytes, info.blocks, info.ptr); -} - -static PyMethodDef lad_methods[] = { - { "read", (PyCFunction)lad_read, METH_VARARGS }, - { "write", (PyCFunction)lad_write, METH_VARARGS }, - { "setparameters", (PyCFunction)lad_setparameters, METH_VARARGS }, - { "bufsize", (PyCFunction)lad_bufsize, METH_VARARGS }, - { "obufcount", (PyCFunction)lad_obufcount, METH_NOARGS }, - { "obuffree", (PyCFunction)lad_obuffree, METH_NOARGS }, - { "flush", (PyCFunction)lad_flush, METH_NOARGS }, - { "close", (PyCFunction)lad_close, METH_NOARGS }, - { "fileno", (PyCFunction)lad_fileno, METH_NOARGS }, - { "getptr", (PyCFunction)lad_getptr, METH_NOARGS }, - { NULL, NULL} /* sentinel */ -}; - -static PyObject * -lad_getattr(lad_t *xp, char *name) -{ - return Py_FindMethod(lad_methods, (PyObject *)xp, name); -} - -static PyTypeObject Ladtype = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "linuxaudiodev.linux_audio_device", /*tp_name*/ - sizeof(lad_t), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)lad_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)lad_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ -}; - -static PyObject * -ladopen(PyObject *self, PyObject *args) -{ - return (PyObject *)newladobject(args); -} - -static PyMethodDef linuxaudiodev_methods[] = { - { "open", ladopen, METH_VARARGS }, - { 0, 0 }, -}; - -void -initlinuxaudiodev(void) -{ - PyObject *m; - - if (PyErr_WarnPy3k("the linuxaudiodev module has been removed in " - "Python 3.0; use the ossaudiodev module instead", 2) < 0) - return; - - m = Py_InitModule("linuxaudiodev", linuxaudiodev_methods); - if (m == NULL) - return; - - LinuxAudioError = PyErr_NewException("linuxaudiodev.error", NULL, NULL); - if (LinuxAudioError) - PyModule_AddObject(m, "error", LinuxAudioError); - - if (PyModule_AddIntConstant(m, "AFMT_MU_LAW", (long)AFMT_MU_LAW) == -1) - return; - if (PyModule_AddIntConstant(m, "AFMT_A_LAW", (long)AFMT_A_LAW) == -1) - return; - if (PyModule_AddIntConstant(m, "AFMT_U8", (long)AFMT_U8) == -1) - return; - if (PyModule_AddIntConstant(m, "AFMT_S8", (long)AFMT_S8) == -1) - return; - if (PyModule_AddIntConstant(m, "AFMT_U16_BE", (long)AFMT_U16_BE) == -1) - return; - if (PyModule_AddIntConstant(m, "AFMT_U16_LE", (long)AFMT_U16_LE) == -1) - return; - if (PyModule_AddIntConstant(m, "AFMT_S16_BE", (long)AFMT_S16_BE) == -1) - return; - if (PyModule_AddIntConstant(m, "AFMT_S16_LE", (long)AFMT_S16_LE) == -1) - return; - if (PyModule_AddIntConstant(m, "AFMT_S16_NE", (long)AFMT_S16_NE) == -1) - return; - - return; -} diff --git a/Modules/main.c b/Modules/main.c index ef9b24508ca..17aebae3ecb 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -2,17 +2,23 @@ #include "Python.h" #include "osdefs.h" -#include "code.h" /* For CO_FUTURE_DIVISION */ -#include "import.h" + +#include <locale.h> #ifdef __VMS #include <unixlib.h> #endif #if defined(MS_WINDOWS) || defined(__CYGWIN__) +#include <windows.h> #ifdef HAVE_FCNTL_H #include <fcntl.h> +#define PATH_MAX MAXPATHLEN +#endif #endif + +#ifdef _MSC_VER +#include <crtdbg.h> #endif #if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS) @@ -36,48 +42,41 @@ extern "C" { #endif /* For Py_GetArgcArgv(); set by main() */ -static char **orig_argv; +static wchar_t **orig_argv; static int orig_argc; /* command line options */ -#define BASE_OPTS "3bBc:dEhiJm:OQ:RsStuUvVW:xX?" +#define BASE_OPTS L"bBc:dEhiJm:OqRsStuvVW:xX:?" -#ifndef RISCOS #define PROGRAM_OPTS BASE_OPTS -#else /*RISCOS*/ -/* extra option saying that we are running under a special task window - frontend; especially my_readline will behave different */ -#define PROGRAM_OPTS BASE_OPTS "w" -/* corresponding flag */ -extern int Py_RISCOSWimpFlag; -#endif /*RISCOS*/ /* Short usage message (with %s for argv0) */ static char *usage_line = -"usage: %s [option] ... [-c cmd | -m mod | file | -] [arg] ...\n"; +"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n"; /* Long usage message, split into parts < 512 bytes */ static char *usage_1 = "\ Options and arguments (and corresponding environment variables):\n\ +-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\ + and comparing bytes/bytearray with str. (-bb: issue errors)\n\ -B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\ -c cmd : program passed in as string (terminates option list)\n\ -d : debug output from parser; also PYTHONDEBUG=x\n\ -E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ -h : print this help message and exit (also --help)\n\ --i : inspect interactively after running script; forces a prompt even\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\ -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\ +-q : don't print version and copyright messages on interactive startup\n\ -R : use a pseudo-random salt to make hash() values of various types be\n\ unpredictable between separate invocations of the interpreter, as\n\ - a defense against denial-of-service attacks\n\ --Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew\n\ + a defence against denial-of-service attacks\n\ -s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\ -S : don't imply 'import site' on initialization\n\ --t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\ "; static char *usage_3 = "\ -u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\ @@ -88,9 +87,9 @@ static char *usage_3 = "\ -W arg : warning control; arg is action:message:category:module:lineno\n\ also PYTHONWARNINGS=arg\n\ -x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ +-X opt : set implementation-specific option\n\ "; static char *usage_4 = "\ --3 : warn about Python 3.x incompatibilities that 2to3 cannot trivially fix\n\ file : program read from script file\n\ - : program read from stdin (default; interactive mode if a tty)\n\ arg ...: arguments passed to program in sys.argv[1:]\n\n\ @@ -99,11 +98,11 @@ PYTHONSTARTUP: file executed on interactive startup (no default)\n\ PYTHONPATH : '%c'-separated list of directories prefixed to the\n\ default module search path. The result is sys.path.\n\ "; -static char *usage_5 = "\ -PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\ - The default module search path uses %s.\n\ -PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\ -PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ +static char *usage_5 = +"PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n" +" The default module search path uses %s.\n" +"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n" +"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ "; static char *usage_6 = "\ PYTHONHASHSEED: if this variable is set to 'random', the effect is the same\n\ @@ -112,9 +111,8 @@ PYTHONHASHSEED: if this variable is set to 'random', the effect is the same\n\ in the range [0,4294967295] to get hash values with a predictable seed.\n\ "; - static int -usage(int exitcode, char* program) +usage(int exitcode, wchar_t* program) { FILE *f = exitcode ? stderr : stdout; @@ -153,23 +151,24 @@ static void RunStartupFile(PyCompilerFlags *cf) (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); PyErr_Clear(); fclose(fp); - } else { - int save_errno; - save_errno = errno; - PySys_WriteStderr("Could not open PYTHONSTARTUP\n"); - errno = save_errno; - PyErr_SetFromErrnoWithFilename(PyExc_IOError, - startup); - PyErr_Print(); - PyErr_Clear(); + } else { + int save_errno; + + save_errno = errno; + PySys_WriteStderr("Could not open PYTHONSTARTUP\n"); + errno = save_errno; + PyErr_SetFromErrnoWithFilename(PyExc_IOError, + startup); + PyErr_Print(); + PyErr_Clear(); } } } -static int RunModule(char *module, int set_argv0) +static int RunModule(wchar_t *modname, int set_argv0) { - PyObject *runpy, *runmodule, *runargs, *result; + PyObject *module, *runpy, *runmodule, *runargs, *result; runpy = PyImport_ImportModule("runpy"); if (runpy == NULL) { fprintf(stderr, "Could not import runpy module\n"); @@ -181,12 +180,20 @@ static int RunModule(char *module, int set_argv0) Py_DECREF(runpy); return -1; } - runargs = Py_BuildValue("(si)", module, set_argv0); + module = PyUnicode_FromWideChar(modname, wcslen(modname)); + if (module == NULL) { + fprintf(stderr, "Could not convert module name to unicode\n"); + Py_DECREF(runpy); + Py_DECREF(runmodule); + return -1; + } + runargs = Py_BuildValue("(Oi)", module, set_argv0); if (runargs == NULL) { fprintf(stderr, "Could not create arguments for runpy._run_module_as_main\n"); Py_DECREF(runpy); Py_DECREF(runmodule); + Py_DECREF(module); return -1; } result = PyObject_Call(runmodule, runargs, NULL); @@ -195,6 +202,7 @@ static int RunModule(char *module, int set_argv0) } Py_DECREF(runpy); Py_DECREF(runmodule); + Py_DECREF(module); Py_DECREF(runargs); if (result == NULL) { return -1; @@ -203,49 +211,120 @@ static int RunModule(char *module, int set_argv0) return 0; } -static int RunMainFromImporter(char *filename) +static int +RunMainFromImporter(wchar_t *filename) { - PyObject *argv0 = NULL, *importer = NULL; + PyObject *argv0 = NULL, *importer, *sys_path; + int sts; - if ((argv0 = PyString_FromString(filename)) && - (importer = PyImport_GetImporter(argv0)) && - (importer->ob_type != &PyNullImporter_Type)) - { - /* argv0 is usable as an import source, so - put it in sys.path[0] and import __main__ */ - PyObject *sys_path = NULL; - if ((sys_path = PySys_GetObject("path")) && - !PyList_SetItem(sys_path, 0, argv0)) - { - Py_INCREF(argv0); - Py_DECREF(importer); - sys_path = NULL; - return RunModule("__main__", 0) != 0; - } + argv0 = PyUnicode_FromWideChar(filename, wcslen(filename)); + if (argv0 == NULL) + goto error; + + importer = PyImport_GetImporter(argv0); + if (importer == NULL) + goto error; + + if (importer->ob_type == &PyNullImporter_Type) { + Py_DECREF(argv0); + Py_DECREF(importer); + return -1; } + Py_DECREF(importer); + + /* 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) + goto error; + if (PyList_SetItem(sys_path, 0, argv0)) { + argv0 = NULL; + goto error; + } + Py_INCREF(argv0); + + sts = RunModule(L"__main__", 0); + return sts != 0; + +error: Py_XDECREF(argv0); - Py_XDECREF(importer); - if (PyErr_Occurred()) { + PyErr_Print(); + return 1; +} + +static int +run_command(wchar_t *command, PyCompilerFlags *cf) +{ + PyObject *unicode, *bytes; + int ret; + + unicode = PyUnicode_FromWideChar(command, -1); + if (unicode == NULL) + goto error; + bytes = PyUnicode_AsUTF8String(unicode); + Py_DECREF(unicode); + if (bytes == NULL) + goto error; + ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf); + Py_DECREF(bytes); + return ret != 0; + +error: + PySys_WriteStderr("Unable to decode the command from the command line:\n"); + PyErr_Print(); + return 1; +} + +static int +run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf) +{ + PyObject *unicode, *bytes = NULL; + char *filename_str; + int run; + + /* call pending calls like signal handlers (SIGINT) */ + if (Py_MakePendingCalls() == -1) { PyErr_Print(); return 1; } - return -1; + + if (filename) { + unicode = PyUnicode_FromWideChar(filename, wcslen(filename)); + if (unicode != NULL) { + bytes = PyUnicode_EncodeFSDefault(unicode); + Py_DECREF(unicode); + } + if (bytes != NULL) + filename_str = PyBytes_AsString(bytes); + else { + PyErr_Clear(); + filename_str = "<encoding error>"; + } + } + else + filename_str = "<stdin>"; + + run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf); + Py_XDECREF(bytes); + return run != 0; } /* Main program */ int -Py_Main(int argc, char **argv) +Py_Main(int argc, wchar_t **argv) { int c; int sts; - char *command = NULL; - char *filename = NULL; - char *module = NULL; + wchar_t *command = NULL; + wchar_t *filename = NULL; + wchar_t *module = NULL; FILE *fp = stdin; char *p; - int unbuffered = 0; +#ifdef MS_WINDOWS + wchar_t *wp; +#endif int skipfirstline = 0; int stdin_is_interactive = 0; int help = 0; @@ -258,10 +337,6 @@ Py_Main(int argc, char **argv) orig_argc = argc; /* For Py_GetArgcArgv() */ orig_argv = argv; -#ifdef RISCOS - Py_RISCOSWimpFlag = 0; -#endif - /* Hash randomization needed early for all string operations (including -W and -X options). */ _PyOS_opterr = 0; /* prevent printing the error in 1st pass */ @@ -293,15 +368,19 @@ Py_Main(int argc, char **argv) while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { if (c == 'c') { + size_t len; /* -c is the last option; following arguments that look like options are left for the command to interpret. */ - command = (char *)malloc(strlen(_PyOS_optarg) + 2); + + len = wcslen(_PyOS_optarg) + 1 + 1; + command = (wchar_t *)malloc(sizeof(wchar_t) * len); if (command == NULL) Py_FatalError( "not enough memory to copy -c argument"); - strcpy(command, _PyOS_optarg); - strcat(command, "\n"); + wcscpy(command, _PyOS_optarg); + command[len - 2] = '\n'; + command[len - 1] = 0; break; } @@ -309,11 +388,7 @@ Py_Main(int argc, char **argv) /* -m is the last option; following arguments that look like options are left for the module to interpret. */ - module = (char *)malloc(strlen(_PyOS_optarg) + 2); - if (module == NULL) - Py_FatalError( - "not enough memory to copy -m argument"); - strcpy(module, _PyOS_optarg); + module = _PyOS_optarg; break; } @@ -326,39 +401,6 @@ Py_Main(int argc, char **argv) Py_DebugFlag++; break; - case '3': - Py_Py3kWarningFlag++; - if (!Py_DivisionWarningFlag) - Py_DivisionWarningFlag = 1; - break; - - case 'Q': - if (strcmp(_PyOS_optarg, "old") == 0) { - Py_DivisionWarningFlag = 0; - break; - } - if (strcmp(_PyOS_optarg, "warn") == 0) { - Py_DivisionWarningFlag = 1; - break; - } - if (strcmp(_PyOS_optarg, "warnall") == 0) { - Py_DivisionWarningFlag = 2; - break; - } - if (strcmp(_PyOS_optarg, "new") == 0) { - /* This only affects __main__ */ - cf.cf_flags |= CO_FUTURE_DIVISION; - /* And this tells the eval loop to treat - BINARY_DIVIDE as BINARY_TRUE_DIVIDE */ - _Py_QnewFlag = 1; - break; - } - fprintf(stderr, - "-Q option should be `-Qold', " - "`-Qwarn', `-Qwarnall', or `-Qnew' only\n"); - return usage(2, argv[0]); - /* NOTREACHED */ - case 'i': Py_InspectFlag++; Py_InteractiveFlag++; @@ -387,11 +429,11 @@ Py_Main(int argc, char **argv) break; case 't': - Py_TabcheckFlag++; + /* ignored for backwards compatibility */ break; case 'u': - unbuffered++; + Py_UnbufferedStdioFlag = 1; saw_unbuffered_flag = 1; break; @@ -399,25 +441,15 @@ Py_Main(int argc, char **argv) Py_VerboseFlag++; break; -#ifdef RISCOS - case 'w': - Py_RISCOSWimpFlag = 1; - break; -#endif - case 'x': skipfirstline = 1; break; - /* case 'X': reserved for implementation-specific arguments */ - - case 'U': - Py_UnicodeFlag++; - break; case 'h': case '?': help++; break; + case 'V': version++; break; @@ -426,6 +458,14 @@ Py_Main(int argc, char **argv) PySys_AddWarnOption(_PyOS_optarg); break; + case 'X': + PySys_AddXOption(_PyOS_optarg); + break; + + case 'q': + Py_QuietFlag++; + break; + case 'R': /* Already handled above */ break; @@ -447,38 +487,74 @@ Py_Main(int argc, char **argv) return 0; } - if (Py_Py3kWarningFlag && !Py_TabcheckFlag) - /* -3 implies -t (but not -tt) */ - Py_TabcheckFlag = 1; - if (!Py_InspectFlag && (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') Py_InspectFlag = 1; if (!saw_unbuffered_flag && (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') - unbuffered = 1; + Py_UnbufferedStdioFlag = 1; if (!Py_NoUserSiteDirectory && (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0') Py_NoUserSiteDirectory = 1; +#ifdef MS_WINDOWS + if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) && + *wp != L'\0') { + wchar_t *buf, *warning; + + buf = (wchar_t *)malloc((wcslen(wp) + 1) * sizeof(wchar_t)); + if (buf == NULL) + Py_FatalError( + "not enough memory to copy PYTHONWARNINGS"); + wcscpy(buf, wp); + for (warning = wcstok(buf, L","); + warning != NULL; + warning = wcstok(NULL, L",")) { + PySys_AddWarnOption(warning); + } + free(buf); + } +#else if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') { - char *buf, *warning; + char *buf, *oldloc; + PyObject *unicode; + /* settle for strtok here as there's no one standard + C89 wcstok */ buf = (char *)malloc(strlen(p) + 1); if (buf == NULL) Py_FatalError( "not enough memory to copy PYTHONWARNINGS"); strcpy(buf, p); - for (warning = strtok(buf, ","); - warning != NULL; - warning = strtok(NULL, ",")) - PySys_AddWarnOption(warning); + oldloc = strdup(setlocale(LC_ALL, NULL)); + setlocale(LC_ALL, ""); + for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) { +#ifdef __APPLE__ + /* Use utf-8 on Mac OS X */ + unicode = PyUnicode_FromString(p); +#else + wchar_t *wchar; + size_t len; + wchar = _Py_char2wchar(p, &len); + if (wchar == NULL) + continue; + unicode = PyUnicode_FromWideChar(wchar, len); + PyMem_Free(wchar); +#endif + if (unicode == NULL) + continue; + PySys_AddWarnOptionUnicode(unicode); + Py_DECREF(unicode); + } + setlocale(LC_ALL, oldloc); + free(oldloc); free(buf); } +#endif if (command == NULL && module == NULL && _PyOS_optind < argc && - strcmp(argv[_PyOS_optind], "-") != 0) + wcscmp(argv[_PyOS_optind], L"-") != 0) { #ifdef __VMS filename = decc$translate_vms(argv[_PyOS_optind]); @@ -492,11 +568,14 @@ Py_Main(int argc, char **argv) stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0); - if (unbuffered) { #if defined(MS_WINDOWS) || defined(__CYGWIN__) - _setmode(fileno(stdin), O_BINARY); - _setmode(fileno(stdout), O_BINARY); + /* don't translate newlines (\r\n <=> \n) */ + _setmode(fileno(stdin), O_BINARY); + _setmode(fileno(stdout), O_BINARY); + _setmode(fileno(stderr), O_BINARY); #endif + + if (Py_UnbufferedStdioFlag) { #ifdef HAVE_SETVBUF setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ); setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); @@ -536,17 +615,31 @@ Py_Main(int argc, char **argv) so the actual executable path is passed in an environment variable. See Lib/plat-mac/bundlebuiler.py for details about the bootstrap script. */ - if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') - Py_SetProgramName(p); - else + if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') { + wchar_t* buffer; + size_t len = strlen(p) + 1; + size_t r; + + buffer = malloc(len * sizeof(wchar_t)); + if (buffer == NULL) { + Py_FatalError( + "not enough memory to copy PYTHONEXECUTABLE"); + } + + r = mbstowcs(buffer, p, len); + Py_SetProgramName(buffer); + /* buffer is now handed off - do not free */ + } else { Py_SetProgramName(argv[0]); + } #else Py_SetProgramName(argv[0]); #endif Py_Initialize(); - if (Py_VerboseFlag || - (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) { + if (!Py_QuietFlag && (Py_VerboseFlag || + (command == NULL && filename == NULL && + module == NULL && stdin_is_interactive))) { fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform()); if (!Py_NoSiteFlag) @@ -556,16 +649,13 @@ Py_Main(int argc, char **argv) if (command != NULL) { /* Backup _PyOS_optind and force sys.argv[0] = '-c' */ _PyOS_optind--; - argv[_PyOS_optind] = "-c"; + argv[_PyOS_optind] = L"-c"; } if (module != NULL) { - /* Backup _PyOS_optind and force sys.argv[0] = '-c' - so that PySys_SetArgv correctly sets sys.path[0] to '' - rather than looking for a file called "-m". See - tracker issue #8202 for details. */ + /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/ _PyOS_optind--; - argv[_PyOS_optind] = "-c"; + argv[_PyOS_optind] = L"-m"; } PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); @@ -581,11 +671,10 @@ Py_Main(int argc, char **argv) } if (command) { - sts = PyRun_SimpleStringFlags(command, &cf) != 0; + sts = run_command(command, &cf); free(command); } else if (module) { sts = (RunModule(module, 1) != 0); - free(module); } else { @@ -602,10 +691,20 @@ Py_Main(int argc, char **argv) } if (sts==-1 && filename!=NULL) { - if ((fp = fopen(filename, "r")) == NULL) { - fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n", - argv[0], filename, errno, strerror(errno)); - + fp = _Py_wfopen(filename, L"r"); + if (fp == NULL) { + char *cfilename_buffer; + const char *cfilename; + int err = errno; + cfilename_buffer = _Py_wchar2char(filename, NULL); + if (cfilename_buffer != NULL) + cfilename = cfilename_buffer; + else + cfilename = "<unprintable file name>"; + fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n", + argv[0], cfilename, err, strerror(err)); + if (cfilename_buffer) + PyMem_Free(cfilename_buffer); return 2; } else if (skipfirstline) { @@ -624,26 +723,15 @@ Py_Main(int argc, char **argv) struct stat sb; if (fstat(fileno(fp), &sb) == 0 && S_ISDIR(sb.st_mode)) { - fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename); + fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", argv[0], filename); fclose(fp); return 1; } } } - if (sts==-1) { - /* call pending calls like signal handlers (SIGINT) */ - if (Py_MakePendingCalls() == -1) { - PyErr_Print(); - sts = 1; - } else { - sts = PyRun_AnyFileExFlags( - fp, - filename == NULL ? "<stdin>" : filename, - filename != NULL, &cf) != 0; - } - } - + if (sts == -1) + sts = run_file(fp, filename, &cf); } /* Check this environment variable at the end, to give programs the @@ -663,22 +751,18 @@ Py_Main(int argc, char **argv) } Py_Finalize(); -#ifdef RISCOS - if (Py_RISCOSWimpFlag) - fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */ -#endif #ifdef __INSURE__ /* Insure++ is a memory analysis tool that aids in discovering * memory leaks and other memory problems. On Python exit, the - * interned string dictionary is flagged as being in use at exit + * interned string dictionaries are flagged as being in use at exit * (which it is). Under normal circumstances, this is fine because * the memory will be automatically reclaimed by the system. Under * memory debugging, it's a huge source of useless noise, so we * trade off slower shutdown for less distraction in the memory * reports. -baw */ - _Py_ReleaseInternedStrings(); + _Py_ReleaseInternedUnicodeStrings(); #endif /* __INSURE__ */ return sts; @@ -692,7 +776,7 @@ Py_Main(int argc, char **argv) This is rare, but it is needed by the secureware extension. */ void -Py_GetArgcArgv(int *argc, char ***argv) +Py_GetArgcArgv(int *argc, wchar_t ***argv) { *argc = orig_argc; *argv = orig_argv; @@ -701,4 +785,3 @@ Py_GetArgcArgv(int *argc, char ***argv) #ifdef __cplusplus } #endif - diff --git a/Modules/makesetup b/Modules/makesetup index 8862c36e7b2..40dfa9db488 100755 --- a/Modules/makesetup +++ b/Modules/makesetup @@ -24,8 +24,8 @@ # Copying config.c.in to config.c: # - insert an identifying comment at the start # - for each <module> mentioned in Setup before *noconfig*: -# + insert 'extern void init<module>(void);' before MARKER 1 -# + insert '{"<module>", initmodule},' before MARKER 2 +# + insert 'extern PyObject* PyInit_<module>(void);' before MARKER 1 +# + insert '{"<module>", PyInit_<module>},' before MARKER 2 # # Copying Makefile.pre to Makefile: # - insert an identifying comment at the start @@ -219,7 +219,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | case $doconfig in no) cc="$cc \$(CCSHARED) \$(CFLAGS) \$(CPPFLAGS)";; *) - cc="$cc \$(PY_CFLAGS)";; + cc="$cc \$(PY_CORE_CFLAGS)";; esac rule="$obj: $src; $cc $cpps -c $src -o $obj" echo "$rule" >>$rulesf @@ -260,8 +260,8 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | INITBITS= for mod in $MODS do - EXTDECLS="${EXTDECLS}extern void init$mod(void);$NL" - INITBITS="${INITBITS} {\"$mod\", init$mod},$NL" + EXTDECLS="${EXTDECLS}extern PyObject* PyInit_$mod(void);$NL" + INITBITS="${INITBITS} {\"$mod\", PyInit_$mod},$NL" done diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index cd74b0dc677..142eca468a2 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -69,6 +69,7 @@ extern double copysign(double, double); static const double pi = 3.141592653589793238462643383279502884197; static const double sqrtpi = 1.772453850905516027298167483341145182798; +static const double logpi = 1.144729885849400174143427351353058711647; static double sinpi(double x) @@ -356,20 +357,15 @@ m_lgamma(double x) if (absx < 1e-20) return -log(absx); - /* Lanczos' formula */ - if (x > 0.0) { - /* we could save a fraction of a ulp in accuracy by having a - second set of numerator coefficients for lanczos_sum that - absorbed the exp(-lanczos_g) term, and throwing out the - lanczos_g subtraction below; it's probably not worth it. */ - r = log(lanczos_sum(x)) - lanczos_g + - (x-0.5)*(log(x+lanczos_g-0.5)-1); - } - else { - r = log(pi) - log(fabs(sinpi(absx))) - log(absx) - - (log(lanczos_sum(absx)) - lanczos_g + - (absx-0.5)*(log(absx+lanczos_g-0.5)-1)); - } + /* Lanczos' formula. We could save a fraction of a ulp in accuracy by + having a second set of numerator coefficients for lanczos_sum that + absorbed the exp(-lanczos_g) term, and throwing out the lanczos_g + subtraction below; it's probably not worth it. */ + r = log(lanczos_sum(absx)) - lanczos_g; + r += (absx - 0.5) * (log(absx + lanczos_g - 0.5) - 1); + if (x < 0.0) + /* Use reflection formula to get value for negative x. */ + r = logpi - log(fabs(sinpi(absx))) - log(absx) - r; if (Py_IS_INFINITY(r)) errno = ERANGE; return r; @@ -680,7 +676,9 @@ is_error(double x) */ static PyObject * -math_1(PyObject *arg, double (*func) (double), int can_overflow) +math_1_to_whatever(PyObject *arg, double (*func) (double), + PyObject *(*from_double_func) (double), + int can_overflow) { double x, r; x = PyFloat_AsDouble(arg); @@ -690,22 +688,25 @@ math_1(PyObject *arg, double (*func) (double), int can_overflow) PyFPE_START_PROTECT("in math_1", return 0); r = (*func)(x); PyFPE_END_PROTECT(r); - if (Py_IS_NAN(r)) { - if (!Py_IS_NAN(x)) - errno = EDOM; - else - errno = 0; + if (Py_IS_NAN(r) && !Py_IS_NAN(x)) { + PyErr_SetString(PyExc_ValueError, + "math domain error"); /* invalid arg */ + return NULL; } - else if (Py_IS_INFINITY(r)) { - if (Py_IS_FINITE(x)) - errno = can_overflow ? ERANGE : EDOM; + if (Py_IS_INFINITY(r) && Py_IS_FINITE(x)) { + if (can_overflow) + PyErr_SetString(PyExc_OverflowError, + "math range error"); /* overflow */ else - errno = 0; + PyErr_SetString(PyExc_ValueError, + "math domain error"); /* singularity */ + return NULL; } - if (errno && is_error(r)) + if (Py_IS_FINITE(r) && errno && is_error(r)) + /* this branch unnecessary on most platforms */ return NULL; - else - return PyFloat_FromDouble(r); + + return (*from_double_func)(r); } /* variant of math_1, to be used when the function being wrapped is known to @@ -756,6 +757,18 @@ math_1a(PyObject *arg, double (*func) (double)) */ static PyObject * +math_1(PyObject *arg, double (*func) (double), int can_overflow) +{ + return math_1_to_whatever(arg, func, PyFloat_FromDouble, can_overflow); +} + +static PyObject * +math_1_to_int(PyObject *arg, double (*func) (double), int can_overflow) +{ + return math_1_to_whatever(arg, func, PyLong_FromDouble, can_overflow); +} + +static PyObject * math_2(PyObject *args, double (*func) (double, double), char *funcname) { PyObject *ox, *oy; @@ -821,9 +834,26 @@ FUNC2(atan2, m_atan2, "Unlike atan(y/x), the signs of both x and y are considered.") FUNC1(atanh, m_atanh, 0, "atanh(x)\n\nReturn the hyperbolic arc tangent (measured in radians) of x.") -FUNC1(ceil, ceil, 0, - "ceil(x)\n\nReturn the ceiling of x as a float.\n" - "This is the smallest integral value >= x.") + +static PyObject * math_ceil(PyObject *self, PyObject *number) { + static PyObject *ceil_str = NULL; + PyObject *method, *result; + + method = _PyObject_LookupSpecial(number, "__ceil__", &ceil_str); + if (method == NULL) { + if (PyErr_Occurred()) + return NULL; + return math_1_to_int(number, ceil, 0); + } + result = PyObject_CallFunctionObjArgs(method, NULL); + Py_DECREF(method); + return result; +} + +PyDoc_STRVAR(math_ceil_doc, + "ceil(x)\n\nReturn the ceiling of x as an int.\n" + "This is the smallest integral value >= x."); + FUNC2(copysign, copysign, "copysign(x, y)\n\nReturn x with the sign of y.") FUNC1(cos, cos, 0, @@ -842,14 +872,31 @@ FUNC1(expm1, m_expm1, 1, "evaluation of exp(x)-1 for small x.") FUNC1(fabs, fabs, 0, "fabs(x)\n\nReturn the absolute value of the float x.") -FUNC1(floor, floor, 0, - "floor(x)\n\nReturn the floor of x as a float.\n" - "This is the largest integral value <= x.") + +static PyObject * math_floor(PyObject *self, PyObject *number) { + static PyObject *floor_str = NULL; + PyObject *method, *result; + + method = _PyObject_LookupSpecial(number, "__floor__", &floor_str); + if (method == NULL) { + if (PyErr_Occurred()) + return NULL; + return math_1_to_int(number, floor, 0); + } + result = PyObject_CallFunctionObjArgs(method, NULL); + Py_DECREF(method); + return result; +} + +PyDoc_STRVAR(math_floor_doc, + "floor(x)\n\nReturn the floor of x as an int.\n" + "This is the largest integral value <= x."); + FUNC1A(gamma, m_tgamma, "gamma(x)\n\nGamma function at x.") FUNC1A(lgamma, m_lgamma, "lgamma(x)\n\nNatural logarithm of absolute value of Gamma function at x.") -FUNC1(log1p, m_log1p, 1, +FUNC1(log1p, m_log1p, 0, "log1p(x)\n\nReturn the natural logarithm of 1+x (base e).\n" "The result is computed in a way which is accurate for x near zero.") FUNC1(sin, sin, 0, @@ -1084,18 +1131,238 @@ PyDoc_STRVAR(math_fsum_doc, Return an accurate floating point sum of values in the iterable.\n\ Assumes IEEE-754 floating point arithmetic."); +/* Return the smallest integer k such that n < 2**k, or 0 if n == 0. + * Equivalent to floor(lg(x))+1. Also equivalent to: bitwidth_of_type - + * count_leading_zero_bits(x) + */ + +/* XXX: This routine does more or less the same thing as + * bits_in_digit() in Objects/longobject.c. Someday it would be nice to + * consolidate them. On BSD, there's a library function called fls() + * that we could use, and GCC provides __builtin_clz(). + */ + +static unsigned long +bit_length(unsigned long n) +{ + unsigned long len = 0; + while (n != 0) { + ++len; + n >>= 1; + } + return len; +} + +static unsigned long +count_set_bits(unsigned long n) +{ + unsigned long count = 0; + while (n != 0) { + ++count; + n &= n - 1; /* clear least significant bit */ + } + return count; +} + +/* Divide-and-conquer factorial algorithm + * + * Based on the formula and psuedo-code provided at: + * http://www.luschny.de/math/factorial/binarysplitfact.html + * + * Faster algorithms exist, but they're more complicated and depend on + * a fast prime factorization algorithm. + * + * Notes on the algorithm + * ---------------------- + * + * factorial(n) is written in the form 2**k * m, with m odd. k and m are + * computed separately, and then combined using a left shift. + * + * The function factorial_odd_part computes the odd part m (i.e., the greatest + * odd divisor) of factorial(n), using the formula: + * + * factorial_odd_part(n) = + * + * product_{i >= 0} product_{0 < j <= n / 2**i, j odd} j + * + * Example: factorial_odd_part(20) = + * + * (1) * + * (1) * + * (1 * 3 * 5) * + * (1 * 3 * 5 * 7 * 9) + * (1 * 3 * 5 * 7 * 9 * 11 * 13 * 15 * 17 * 19) + * + * Here i goes from large to small: the first term corresponds to i=4 (any + * larger i gives an empty product), and the last term corresponds to i=0. + * Each term can be computed from the last by multiplying by the extra odd + * numbers required: e.g., to get from the penultimate term to the last one, + * we multiply by (11 * 13 * 15 * 17 * 19). + * + * To see a hint of why this formula works, here are the same numbers as above + * but with the even parts (i.e., the appropriate powers of 2) included. For + * each subterm in the product for i, we multiply that subterm by 2**i: + * + * factorial(20) = + * + * (16) * + * (8) * + * (4 * 12 * 20) * + * (2 * 6 * 10 * 14 * 18) * + * (1 * 3 * 5 * 7 * 9 * 11 * 13 * 15 * 17 * 19) + * + * The factorial_partial_product function computes the product of all odd j in + * range(start, stop) for given start and stop. It's used to compute the + * partial products like (11 * 13 * 15 * 17 * 19) in the example above. It + * operates recursively, repeatedly splitting the range into two roughly equal + * pieces until the subranges are small enough to be computed using only C + * integer arithmetic. + * + * The two-valuation k (i.e., the exponent of the largest power of 2 dividing + * the factorial) is computed independently in the main math_factorial + * function. By standard results, its value is: + * + * two_valuation = n//2 + n//4 + n//8 + .... + * + * It can be shown (e.g., by complete induction on n) that two_valuation is + * equal to n - count_set_bits(n), where count_set_bits(n) gives the number of + * '1'-bits in the binary expansion of n. + */ + +/* factorial_partial_product: Compute product(range(start, stop, 2)) using + * divide and conquer. Assumes start and stop are odd and stop > start. + * max_bits must be >= bit_length(stop - 2). */ + +static PyObject * +factorial_partial_product(unsigned long start, unsigned long stop, + unsigned long max_bits) +{ + unsigned long midpoint, num_operands; + PyObject *left = NULL, *right = NULL, *result = NULL; + + /* If the return value will fit an unsigned long, then we can + * multiply in a tight, fast loop where each multiply is O(1). + * Compute an upper bound on the number of bits required to store + * the answer. + * + * Storing some integer z requires floor(lg(z))+1 bits, which is + * conveniently the value returned by bit_length(z). The + * product x*y will require at most + * bit_length(x) + bit_length(y) bits to store, based + * on the idea that lg product = lg x + lg y. + * + * We know that stop - 2 is the largest number to be multiplied. From + * there, we have: bit_length(answer) <= num_operands * + * bit_length(stop - 2) + */ + + num_operands = (stop - start) / 2; + /* The "num_operands <= 8 * SIZEOF_LONG" check guards against the + * unlikely case of an overflow in num_operands * max_bits. */ + if (num_operands <= 8 * SIZEOF_LONG && + num_operands * max_bits <= 8 * SIZEOF_LONG) { + unsigned long j, total; + for (total = start, j = start + 2; j < stop; j += 2) + total *= j; + return PyLong_FromUnsignedLong(total); + } + + /* find midpoint of range(start, stop), rounded up to next odd number. */ + midpoint = (start + num_operands) | 1; + left = factorial_partial_product(start, midpoint, + bit_length(midpoint - 2)); + if (left == NULL) + goto error; + right = factorial_partial_product(midpoint, stop, max_bits); + if (right == NULL) + goto error; + result = PyNumber_Multiply(left, right); + + error: + Py_XDECREF(left); + Py_XDECREF(right); + return result; +} + +/* factorial_odd_part: compute the odd part of factorial(n). */ + +static PyObject * +factorial_odd_part(unsigned long n) +{ + long i; + unsigned long v, lower, upper; + PyObject *partial, *tmp, *inner, *outer; + + inner = PyLong_FromLong(1); + if (inner == NULL) + return NULL; + outer = inner; + Py_INCREF(outer); + + upper = 3; + for (i = bit_length(n) - 2; i >= 0; i--) { + v = n >> i; + if (v <= 2) + continue; + lower = upper; + /* (v + 1) | 1 = least odd integer strictly larger than n / 2**i */ + upper = (v + 1) | 1; + /* Here inner is the product of all odd integers j in the range (0, + n/2**(i+1)]. The factorial_partial_product call below gives the + product of all odd integers j in the range (n/2**(i+1), n/2**i]. */ + partial = factorial_partial_product(lower, upper, bit_length(upper-2)); + /* inner *= partial */ + if (partial == NULL) + goto error; + tmp = PyNumber_Multiply(inner, partial); + Py_DECREF(partial); + if (tmp == NULL) + goto error; + Py_DECREF(inner); + inner = tmp; + /* Now inner is the product of all odd integers j in the range (0, + n/2**i], giving the inner product in the formula above. */ + + /* outer *= inner; */ + tmp = PyNumber_Multiply(outer, inner); + if (tmp == NULL) + goto error; + Py_DECREF(outer); + outer = tmp; + } + Py_DECREF(inner); + return outer; + + error: + Py_DECREF(outer); + Py_DECREF(inner); + return NULL; +} + +/* Lookup table for small factorial values */ + +static const unsigned long SmallFactorials[] = { + 1, 1, 2, 6, 24, 120, 720, 5040, 40320, + 362880, 3628800, 39916800, 479001600, +#if SIZEOF_LONG >= 8 + 6227020800, 87178291200, 1307674368000, + 20922789888000, 355687428096000, 6402373705728000, + 121645100408832000, 2432902008176640000 +#endif +}; + static PyObject * math_factorial(PyObject *self, PyObject *arg) { - long i, x; - PyObject *result, *iobj, *newresult; + long x; + PyObject *result, *odd_part, *two_valuation; if (PyFloat_Check(arg)) { PyObject *lx; double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg); if (!(Py_IS_FINITE(dx) && dx == floor(dx))) { PyErr_SetString(PyExc_ValueError, - "factorial() only accepts integral values"); + "factorial() only accepts integral values"); return NULL; } lx = PyLong_FromDouble(dx); @@ -1105,35 +1372,34 @@ math_factorial(PyObject *self, PyObject *arg) Py_DECREF(lx); } else - x = PyInt_AsLong(arg); + x = PyLong_AsLong(arg); if (x == -1 && PyErr_Occurred()) return NULL; if (x < 0) { PyErr_SetString(PyExc_ValueError, - "factorial() not defined for negative values"); + "factorial() not defined for negative values"); return NULL; } - result = (PyObject *)PyInt_FromLong(1); - if (result == NULL) + /* use lookup table if x is small */ + if (x < (long)(sizeof(SmallFactorials)/sizeof(SmallFactorials[0]))) + return PyLong_FromUnsignedLong(SmallFactorials[x]); + + /* else express in the form odd_part * 2**two_valuation, and compute as + odd_part << two_valuation. */ + odd_part = factorial_odd_part(x); + if (odd_part == NULL) + return NULL; + two_valuation = PyLong_FromLong(x - count_set_bits(x)); + if (two_valuation == NULL) { + Py_DECREF(odd_part); return NULL; - for (i=1 ; i<=x ; i++) { - iobj = (PyObject *)PyInt_FromLong(i); - if (iobj == NULL) - goto error; - newresult = PyNumber_Multiply(result, iobj); - Py_DECREF(iobj); - if (newresult == NULL) - goto error; - Py_DECREF(result); - result = newresult; } + result = PyNumber_Lshift(odd_part, two_valuation); + Py_DECREF(two_valuation); + Py_DECREF(odd_part); return result; - -error: - Py_DECREF(result); - return NULL; } PyDoc_STRVAR(math_factorial_doc, @@ -1144,7 +1410,25 @@ PyDoc_STRVAR(math_factorial_doc, static PyObject * math_trunc(PyObject *self, PyObject *number) { - return PyObject_CallMethod(number, "__trunc__", NULL); + static PyObject *trunc_str = NULL; + PyObject *trunc, *result; + + if (Py_TYPE(number)->tp_dict == NULL) { + if (PyType_Ready(Py_TYPE(number)) < 0) + return NULL; + } + + trunc = _PyObject_LookupSpecial(number, "__trunc__", &trunc_str); + if (trunc == NULL) { + if (!PyErr_Occurred()) + PyErr_Format(PyExc_TypeError, + "type %.100s doesn't define __trunc__ method", + Py_TYPE(number)->tp_name); + return NULL; + } + result = PyObject_CallFunctionObjArgs(trunc, NULL); + Py_DECREF(trunc); + return result; } PyDoc_STRVAR(math_trunc_doc, @@ -1189,7 +1473,7 @@ math_ldexp(PyObject *self, PyObject *args) if (! PyArg_ParseTuple(args, "dO:ldexp", &x, &oexp)) return NULL; - if (PyLong_Check(oexp) || PyInt_Check(oexp)) { + if (PyLong_Check(oexp)) { /* on overflow, replace exponent with either LONG_MAX or LONG_MIN, depending on the sign. */ exp = PyLong_AsLongAndOverflow(oexp, &overflow); @@ -1277,23 +1561,33 @@ loghelper(PyObject* arg, double (*func)(double), char *funcname) { /* If it is long, do it ourselves. */ if (PyLong_Check(arg)) { - double x; + double x, result; Py_ssize_t e; - x = _PyLong_Frexp((PyLongObject *)arg, &e); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - if (x <= 0.0) { + + /* Negative or zero inputs give a ValueError. */ + if (Py_SIZE(arg) <= 0) { PyErr_SetString(PyExc_ValueError, "math domain error"); return NULL; } - /* Special case for log(1), to make sure we get an - exact result there. */ - if (e == 1 && x == 0.5) - return PyFloat_FromDouble(0.0); - /* Value is ~= x * 2**e, so the log ~= log(x) + log(2) * e. */ - x = func(x) + func(2.0) * e; - return PyFloat_FromDouble(x); + + x = PyLong_AsDouble(arg); + if (x == -1.0 && PyErr_Occurred()) { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + /* Here the conversion to double overflowed, but it's possible + to compute the log anyway. Clear the exception and continue. */ + PyErr_Clear(); + x = _PyLong_Frexp((PyLongObject *)arg, &e); + if (x == -1.0 && PyErr_Occurred()) + return NULL; + /* Value is ~= x * 2**e, so the log ~= log(x) + log(2) * e. */ + result = func(x) + func(2.0) * e; + } + else + /* Successfully converted x to a double. */ + result = func(x); + return PyFloat_FromDouble(result); } /* Else let libm handle it by itself. */ @@ -1321,7 +1615,7 @@ math_log(PyObject *self, PyObject *args) return NULL; } - ans = PyNumber_Divide(num, den); + ans = PyNumber_TrueDivide(num, den); Py_DECREF(num); Py_DECREF(den); return ans; @@ -1533,6 +1827,19 @@ PyDoc_STRVAR(math_radians_doc, Convert angle x from degrees to radians."); static PyObject * +math_isfinite(PyObject *self, PyObject *arg) +{ + double x = PyFloat_AsDouble(arg); + if (x == -1.0 && PyErr_Occurred()) + return NULL; + return PyBool_FromLong((long)Py_IS_FINITE(x)); +} + +PyDoc_STRVAR(math_isfinite_doc, +"isfinite(x) -> bool\n\n\ +Return True if x is neither an infinity nor a NaN, and False otherwise."); + +static PyObject * math_isnan(PyObject *self, PyObject *arg) { double x = PyFloat_AsDouble(arg); @@ -1543,7 +1850,7 @@ math_isnan(PyObject *self, PyObject *arg) PyDoc_STRVAR(math_isnan_doc, "isnan(x) -> bool\n\n\ -Check if float x is not a number (NaN)."); +Return True if x is a NaN (not a number), and False otherwise."); static PyObject * math_isinf(PyObject *self, PyObject *arg) @@ -1556,7 +1863,7 @@ math_isinf(PyObject *self, PyObject *arg) PyDoc_STRVAR(math_isinf_doc, "isinf(x) -> bool\n\n\ -Check if float x is infinite (positive or negative)."); +Return True if x is a positive or negative infinity, and False otherwise."); static PyMethodDef math_methods[] = { {"acos", math_acos, METH_O, math_acos_doc}, @@ -1583,6 +1890,7 @@ static PyMethodDef math_methods[] = { {"fsum", math_fsum, METH_O, math_fsum_doc}, {"gamma", math_gamma, METH_O, math_gamma_doc}, {"hypot", math_hypot, METH_VARARGS, math_hypot_doc}, + {"isfinite", math_isfinite, METH_O, math_isfinite_doc}, {"isinf", math_isinf, METH_O, math_isinf_doc}, {"isnan", math_isnan, METH_O, math_isnan_doc}, {"ldexp", math_ldexp, METH_VARARGS, math_ldexp_doc}, @@ -1607,12 +1915,25 @@ PyDoc_STRVAR(module_doc, "This module is always available. It provides access to the\n" "mathematical functions defined by the C standard."); + +static struct PyModuleDef mathmodule = { + PyModuleDef_HEAD_INIT, + "math", + module_doc, + -1, + math_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initmath(void) +PyInit_math(void) { PyObject *m; - m = Py_InitModule3("math", math_methods, module_doc); + m = PyModule_Create(&mathmodule); if (m == NULL) goto finally; @@ -1620,5 +1941,5 @@ initmath(void) PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E)); finally: - return; + return m; } diff --git a/Modules/md5.c b/Modules/md5.c deleted file mode 100644 index 8fdc60072a2..00000000000 --- a/Modules/md5.c +++ /dev/null @@ -1,394 +0,0 @@ -/* - Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. - - 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. - - L. Peter Deutsch - ghost@aladdin.com - - */ -/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */ -/* - Independent implementation of MD5 (RFC 1321). - - This code implements the MD5 Algorithm defined in RFC 1321, whose - text is available at - http://www.ietf.org/rfc/rfc1321.txt - The code is derived from the text of the RFC, including the test suite - (section A.5) but excluding the rest of Appendix A. It does not include - any code or documentation that is identified in the RFC as being - copyrighted. - - The original and principal author of md5.c is L. Peter Deutsch - <ghost@aladdin.com>. Other authors are noted in the change history - that follows (in reverse chronological order): - - 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order - either statically or dynamically; added missing #include <string.h> - in library. - 2002-03-11 lpd Corrected argument list for main(), and added int return - type, in test program and T value program. - 2002-02-21 lpd Added missing #include <stdio.h> in test program. - 2000-07-03 lpd Patched to eliminate warnings about "constant is - unsigned in ANSI C, signed in traditional"; made test program - self-checking. - 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. - 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). - 1999-05-03 lpd Original version. - */ - -#include "md5.h" -#include <string.h> -#include <limits.h> - -#undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ -#ifdef ARCH_IS_BIG_ENDIAN -# define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) -#else -# define BYTE_ORDER 0 -#endif - -#define T_MASK ((md5_word_t)~0) -#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) -#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) -#define T3 0x242070db -#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) -#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) -#define T6 0x4787c62a -#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) -#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) -#define T9 0x698098d8 -#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) -#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) -#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) -#define T13 0x6b901122 -#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) -#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) -#define T16 0x49b40821 -#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) -#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) -#define T19 0x265e5a51 -#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) -#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) -#define T22 0x02441453 -#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) -#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) -#define T25 0x21e1cde6 -#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) -#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) -#define T28 0x455a14ed -#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) -#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) -#define T31 0x676f02d9 -#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) -#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) -#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) -#define T35 0x6d9d6122 -#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) -#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) -#define T38 0x4bdecfa9 -#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) -#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) -#define T41 0x289b7ec6 -#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) -#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) -#define T44 0x04881d05 -#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) -#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) -#define T47 0x1fa27cf8 -#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) -#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) -#define T50 0x432aff97 -#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) -#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) -#define T53 0x655b59c3 -#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) -#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) -#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) -#define T57 0x6fa87e4f -#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) -#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) -#define T60 0x4e0811a1 -#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) -#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) -#define T63 0x2ad7d2bb -#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) - - -static void -md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) -{ - md5_word_t - a = pms->abcd[0], b = pms->abcd[1], - c = pms->abcd[2], d = pms->abcd[3]; - md5_word_t t; -#if BYTE_ORDER > 0 - /* Define storage only for big-endian CPUs. */ - md5_word_t X[16]; -#else - /* Define storage for little-endian or both types of CPUs. */ - md5_word_t xbuf[16]; - const md5_word_t *X; -#endif - - { -#if BYTE_ORDER == 0 - /* - * Determine dynamically whether this is a big-endian or - * little-endian machine, since we can use a more efficient - * algorithm on the latter. - */ - static const int w = 1; - - if (*((const md5_byte_t *)&w)) /* dynamic little-endian */ -#endif -#if BYTE_ORDER <= 0 /* little-endian */ - { - /* - * On little-endian machines, we can process properly aligned - * data without copying it. - */ - if (!((data - (const md5_byte_t *)0) & 3)) { - /* data are properly aligned */ - X = (const md5_word_t *)data; - } else { - /* not aligned */ - memcpy(xbuf, data, 64); - X = xbuf; - } - } -#endif -#if BYTE_ORDER == 0 - else /* dynamic big-endian */ -#endif -#if BYTE_ORDER >= 0 /* big-endian */ - { - /* - * On big-endian machines, we must arrange the bytes in the - * right order. - */ - const md5_byte_t *xp = data; - int i; - -# if BYTE_ORDER == 0 - X = xbuf; /* (dynamic only) */ -# else -# define xbuf X /* (static only) */ -# endif - for (i = 0; i < 16; ++i, xp += 4) - xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); - } -#endif - } - -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) - - /* Round 1. */ - /* Let [abcd k s i] denote the operation - a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ -#define F(x, y, z) (((x) & (y)) | (~(x) & (z))) -#define SET(a, b, c, d, k, s, Ti)\ - t = a + F(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b - /* Do the following 16 operations. */ - SET(a, b, c, d, 0, 7, T1); - SET(d, a, b, c, 1, 12, T2); - SET(c, d, a, b, 2, 17, T3); - SET(b, c, d, a, 3, 22, T4); - SET(a, b, c, d, 4, 7, T5); - SET(d, a, b, c, 5, 12, T6); - SET(c, d, a, b, 6, 17, T7); - SET(b, c, d, a, 7, 22, T8); - SET(a, b, c, d, 8, 7, T9); - SET(d, a, b, c, 9, 12, T10); - SET(c, d, a, b, 10, 17, T11); - SET(b, c, d, a, 11, 22, T12); - SET(a, b, c, d, 12, 7, T13); - SET(d, a, b, c, 13, 12, T14); - SET(c, d, a, b, 14, 17, T15); - SET(b, c, d, a, 15, 22, T16); -#undef SET - - /* Round 2. */ - /* Let [abcd k s i] denote the operation - a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ -#define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) -#define SET(a, b, c, d, k, s, Ti)\ - t = a + G(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b - /* Do the following 16 operations. */ - SET(a, b, c, d, 1, 5, T17); - SET(d, a, b, c, 6, 9, T18); - SET(c, d, a, b, 11, 14, T19); - SET(b, c, d, a, 0, 20, T20); - SET(a, b, c, d, 5, 5, T21); - SET(d, a, b, c, 10, 9, T22); - SET(c, d, a, b, 15, 14, T23); - SET(b, c, d, a, 4, 20, T24); - SET(a, b, c, d, 9, 5, T25); - SET(d, a, b, c, 14, 9, T26); - SET(c, d, a, b, 3, 14, T27); - SET(b, c, d, a, 8, 20, T28); - SET(a, b, c, d, 13, 5, T29); - SET(d, a, b, c, 2, 9, T30); - SET(c, d, a, b, 7, 14, T31); - SET(b, c, d, a, 12, 20, T32); -#undef SET - - /* Round 3. */ - /* Let [abcd k s t] denote the operation - a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ -#define H(x, y, z) ((x) ^ (y) ^ (z)) -#define SET(a, b, c, d, k, s, Ti)\ - t = a + H(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b - /* Do the following 16 operations. */ - SET(a, b, c, d, 5, 4, T33); - SET(d, a, b, c, 8, 11, T34); - SET(c, d, a, b, 11, 16, T35); - SET(b, c, d, a, 14, 23, T36); - SET(a, b, c, d, 1, 4, T37); - SET(d, a, b, c, 4, 11, T38); - SET(c, d, a, b, 7, 16, T39); - SET(b, c, d, a, 10, 23, T40); - SET(a, b, c, d, 13, 4, T41); - SET(d, a, b, c, 0, 11, T42); - SET(c, d, a, b, 3, 16, T43); - SET(b, c, d, a, 6, 23, T44); - SET(a, b, c, d, 9, 4, T45); - SET(d, a, b, c, 12, 11, T46); - SET(c, d, a, b, 15, 16, T47); - SET(b, c, d, a, 2, 23, T48); -#undef SET - - /* Round 4. */ - /* Let [abcd k s t] denote the operation - a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ -#define I(x, y, z) ((y) ^ ((x) | ~(z))) -#define SET(a, b, c, d, k, s, Ti)\ - t = a + I(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b - /* Do the following 16 operations. */ - SET(a, b, c, d, 0, 6, T49); - SET(d, a, b, c, 7, 10, T50); - SET(c, d, a, b, 14, 15, T51); - SET(b, c, d, a, 5, 21, T52); - SET(a, b, c, d, 12, 6, T53); - SET(d, a, b, c, 3, 10, T54); - SET(c, d, a, b, 10, 15, T55); - SET(b, c, d, a, 1, 21, T56); - SET(a, b, c, d, 8, 6, T57); - SET(d, a, b, c, 15, 10, T58); - SET(c, d, a, b, 6, 15, T59); - SET(b, c, d, a, 13, 21, T60); - SET(a, b, c, d, 4, 6, T61); - SET(d, a, b, c, 11, 10, T62); - SET(c, d, a, b, 2, 15, T63); - SET(b, c, d, a, 9, 21, T64); -#undef SET - - /* Then perform the following additions. (That is increment each - of the four registers by the value it had before this block - was started.) */ - pms->abcd[0] += a; - pms->abcd[1] += b; - pms->abcd[2] += c; - pms->abcd[3] += d; -} - -void -md5_init(md5_state_t *pms) -{ - pms->count[0] = pms->count[1] = 0; - pms->abcd[0] = 0x67452301; - pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; - pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; - pms->abcd[3] = 0x10325476; -} - -void -md5_append(md5_state_t *pms, const md5_byte_t *data, unsigned int nbytes) -{ - const md5_byte_t *p = data; - unsigned int left = nbytes; - unsigned int offset = (pms->count[0] >> 3) & 63; - md5_word_t nbits = (md5_word_t)(nbytes << 3); - - if (nbytes <= 0) - return; - - /* this special case is handled recursively */ - if (nbytes > INT_MAX - offset) { - unsigned int overlap; - - /* handle the append in two steps to prevent overflow */ - overlap = 64 - offset; - - md5_append(pms, data, overlap); - md5_append(pms, data + overlap, nbytes - overlap); - return; - } - - /* Update the message length. */ - pms->count[1] += nbytes >> 29; - pms->count[0] += nbits; - if (pms->count[0] < nbits) - pms->count[1]++; - - /* Process an initial partial block. */ - if (offset) { - unsigned int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); - - memcpy(pms->buf + offset, p, copy); - if (offset + copy < 64) - return; - p += copy; - left -= copy; - md5_process(pms, pms->buf); - } - - /* Process full blocks. */ - for (; left >= 64; p += 64, left -= 64) - md5_process(pms, p); - - /* Process a final partial block. */ - if (left) - memcpy(pms->buf, p, left); -} - -void -md5_finish(md5_state_t *pms, md5_byte_t digest[16]) -{ - static const md5_byte_t pad[64] = { - 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - md5_byte_t data[8]; - int i; - - /* Save the length before padding. */ - for (i = 0; i < 8; ++i) - data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); - /* Pad to 56 bytes mod 64. */ - md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); - /* Append the length. */ - md5_append(pms, data, 8); - for (i = 0; i < 16; ++i) - digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); -} diff --git a/Modules/md5.h b/Modules/md5.h deleted file mode 100644 index 0ab0e684d8d..00000000000 --- a/Modules/md5.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. - - 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. - - L. Peter Deutsch - ghost@aladdin.com - - */ -/* $Id$ */ -/* - Independent implementation of MD5 (RFC 1321). - - This code implements the MD5 Algorithm defined in RFC 1321, whose - text is available at - http://www.ietf.org/rfc/rfc1321.txt - The code is derived from the text of the RFC, including the test suite - (section A.5) but excluding the rest of Appendix A. It does not include - any code or documentation that is identified in the RFC as being - copyrighted. - - The original and principal author of md5.h is L. Peter Deutsch - <ghost@aladdin.com>. Other authors are noted in the change history - that follows (in reverse chronological order): - - 2002-04-13 lpd Removed support for non-ANSI compilers; removed - references to Ghostscript; clarified derivation from RFC 1321; - now handles byte order either statically or dynamically. - 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. - 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); - added conditionalization for C++ compilation from Martin - Purschke <purschke@bnl.gov>. - 1999-05-03 lpd Original version. - */ - -#ifndef md5_INCLUDED -# define md5_INCLUDED - -/* - * This package supports both compile-time and run-time determination of CPU - * byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be - * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is - * defined as non-zero, the code will be compiled to run only on big-endian - * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to - * run on either big- or little-endian CPUs, but will run slightly less - * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined. - */ - -typedef unsigned char md5_byte_t; /* 8-bit byte */ -typedef unsigned int md5_word_t; /* 32-bit word */ - -/* Define the state of the MD5 Algorithm. */ -typedef struct md5_state_s { - md5_word_t count[2]; /* message length in bits, lsw first */ - md5_word_t abcd[4]; /* digest buffer */ - md5_byte_t buf[64]; /* accumulate block */ -} md5_state_t; - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Initialize the algorithm. */ -void md5_init(md5_state_t *pms); - -/* Append a string to the message. */ -void md5_append(md5_state_t *pms, const md5_byte_t *data, unsigned int nbytes); - -/* Finish the message and return the digest. */ -void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); - -#ifdef __cplusplus -} /* end extern "C" */ -#endif - -#endif /* md5_INCLUDED */ diff --git a/Modules/md5module.c b/Modules/md5module.c index 103da1497da..208930dfaac 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -1,339 +1,584 @@ - /* MD5 module */ -/* This module provides an interface to the RSA Data Security, - Inc. MD5 Message-Digest Algorithm, described in RFC 1321. - It requires the files md5c.c and md5.h (which are slightly changed - from the versions in the RFC to avoid the "global.h" file.) */ +/* This module provides an interface to the MD5 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) + Copyright (C) 2005-2007 Gregory P. Smith (greg@krypto.org) + Licensed to PSF under a Contributor Agreement. + +*/ /* MD5 objects */ #include "Python.h" -#include "structmember.h" -#include "md5.h" +#include "hashlib.h" + + +/* Some useful types */ + +#if SIZEOF_INT == 4 +typedef unsigned int MD5_INT32; /* 32-bit integer */ +typedef PY_LONG_LONG MD5_INT64; /* 64-bit integer */ +#else +/* not defined. compilation will die. */ +#endif + +/* The MD5 block size and message digest sizes, in bytes */ + +#define MD5_BLOCKSIZE 64 +#define MD5_DIGESTSIZE 16 + +/* The structure for storing MD5 info */ + +struct md5_state { + MD5_INT64 length; + MD5_INT32 state[4], curlen; + unsigned char buf[MD5_BLOCKSIZE]; +}; typedef struct { PyObject_HEAD - md5_state_t md5; /* the context holder */ -} md5object; -static PyTypeObject MD5type; + struct md5_state hash_state; +} MD5object; -#define is_md5object(v) ((v)->ob_type == &MD5type) -static md5object * -newmd5object(void) -{ - md5object *md5p; +/* ------------------------------------------------------------------------ + * + * This code for the MD5 algorithm was noted as public domain. The + * original headers are pasted below. + * + * Several changes have been made to make it more compatible with the + * Python environment and desired interface. + * + */ - md5p = PyObject_New(md5object, &MD5type); - if (md5p == NULL) - return NULL; +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ - md5_init(&md5p->md5); /* actual initialisation */ - return md5p; -} +/* rotate the hard way (platform optimizations could be done) */ +#define ROLc(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) +/* Endian Neutral macros that work on all platforms */ -/* MD5 methods */ +#define STORE32L(x, y) \ + { (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); } -static void -md5_dealloc(md5object *md5p) +#define LOAD32L(x, y) \ + { x = ((unsigned long)((y)[3] & 255)<<24) | \ + ((unsigned long)((y)[2] & 255)<<16) | \ + ((unsigned long)((y)[1] & 255)<<8) | \ + ((unsigned long)((y)[0] & 255)); } + +#define STORE64L(x, y) \ + { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \ + (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \ + (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 */ + +#define F(x,y,z) (z ^ (x & (y ^ z))) +#define G(x,y,z) (y ^ (z & (y ^ x))) +#define H(x,y,z) (x^y^z) +#define I(x,y,z) (y^(x|(~z))) + +#define FF(a,b,c,d,M,s,t) \ + a = (a + F(b,c,d) + M + t); a = ROLc(a, s) + b; + +#define GG(a,b,c,d,M,s,t) \ + a = (a + G(b,c,d) + M + t); a = ROLc(a, s) + b; + +#define HH(a,b,c,d,M,s,t) \ + a = (a + H(b,c,d) + M + t); a = ROLc(a, s) + b; + +#define II(a,b,c,d,M,s,t) \ + a = (a + I(b,c,d) + M + t); a = ROLc(a, s) + b; + + +static void md5_compress(struct md5_state *md5, unsigned char *buf) { - PyObject_Del(md5p); + MD5_INT32 i, W[16], a, b, c, d; + + assert(md5 != NULL); + assert(buf != NULL); + + /* copy the state into 512-bits into W[0..15] */ + for (i = 0; i < 16; i++) { + LOAD32L(W[i], buf + (4*i)); + } + + /* copy state */ + a = md5->state[0]; + b = md5->state[1]; + c = md5->state[2]; + d = md5->state[3]; + + FF(a,b,c,d,W[0],7,0xd76aa478UL) + FF(d,a,b,c,W[1],12,0xe8c7b756UL) + FF(c,d,a,b,W[2],17,0x242070dbUL) + FF(b,c,d,a,W[3],22,0xc1bdceeeUL) + FF(a,b,c,d,W[4],7,0xf57c0fafUL) + FF(d,a,b,c,W[5],12,0x4787c62aUL) + FF(c,d,a,b,W[6],17,0xa8304613UL) + FF(b,c,d,a,W[7],22,0xfd469501UL) + FF(a,b,c,d,W[8],7,0x698098d8UL) + FF(d,a,b,c,W[9],12,0x8b44f7afUL) + FF(c,d,a,b,W[10],17,0xffff5bb1UL) + FF(b,c,d,a,W[11],22,0x895cd7beUL) + FF(a,b,c,d,W[12],7,0x6b901122UL) + FF(d,a,b,c,W[13],12,0xfd987193UL) + FF(c,d,a,b,W[14],17,0xa679438eUL) + FF(b,c,d,a,W[15],22,0x49b40821UL) + GG(a,b,c,d,W[1],5,0xf61e2562UL) + GG(d,a,b,c,W[6],9,0xc040b340UL) + GG(c,d,a,b,W[11],14,0x265e5a51UL) + GG(b,c,d,a,W[0],20,0xe9b6c7aaUL) + GG(a,b,c,d,W[5],5,0xd62f105dUL) + GG(d,a,b,c,W[10],9,0x02441453UL) + GG(c,d,a,b,W[15],14,0xd8a1e681UL) + GG(b,c,d,a,W[4],20,0xe7d3fbc8UL) + GG(a,b,c,d,W[9],5,0x21e1cde6UL) + GG(d,a,b,c,W[14],9,0xc33707d6UL) + GG(c,d,a,b,W[3],14,0xf4d50d87UL) + GG(b,c,d,a,W[8],20,0x455a14edUL) + GG(a,b,c,d,W[13],5,0xa9e3e905UL) + GG(d,a,b,c,W[2],9,0xfcefa3f8UL) + GG(c,d,a,b,W[7],14,0x676f02d9UL) + GG(b,c,d,a,W[12],20,0x8d2a4c8aUL) + HH(a,b,c,d,W[5],4,0xfffa3942UL) + HH(d,a,b,c,W[8],11,0x8771f681UL) + HH(c,d,a,b,W[11],16,0x6d9d6122UL) + HH(b,c,d,a,W[14],23,0xfde5380cUL) + HH(a,b,c,d,W[1],4,0xa4beea44UL) + HH(d,a,b,c,W[4],11,0x4bdecfa9UL) + HH(c,d,a,b,W[7],16,0xf6bb4b60UL) + HH(b,c,d,a,W[10],23,0xbebfbc70UL) + HH(a,b,c,d,W[13],4,0x289b7ec6UL) + HH(d,a,b,c,W[0],11,0xeaa127faUL) + HH(c,d,a,b,W[3],16,0xd4ef3085UL) + HH(b,c,d,a,W[6],23,0x04881d05UL) + HH(a,b,c,d,W[9],4,0xd9d4d039UL) + HH(d,a,b,c,W[12],11,0xe6db99e5UL) + HH(c,d,a,b,W[15],16,0x1fa27cf8UL) + HH(b,c,d,a,W[2],23,0xc4ac5665UL) + II(a,b,c,d,W[0],6,0xf4292244UL) + II(d,a,b,c,W[7],10,0x432aff97UL) + II(c,d,a,b,W[14],15,0xab9423a7UL) + II(b,c,d,a,W[5],21,0xfc93a039UL) + II(a,b,c,d,W[12],6,0x655b59c3UL) + II(d,a,b,c,W[3],10,0x8f0ccc92UL) + II(c,d,a,b,W[10],15,0xffeff47dUL) + II(b,c,d,a,W[1],21,0x85845dd1UL) + II(a,b,c,d,W[8],6,0x6fa87e4fUL) + II(d,a,b,c,W[15],10,0xfe2ce6e0UL) + II(c,d,a,b,W[6],15,0xa3014314UL) + II(b,c,d,a,W[13],21,0x4e0811a1UL) + II(a,b,c,d,W[4],6,0xf7537e82UL) + II(d,a,b,c,W[11],10,0xbd3af235UL) + II(c,d,a,b,W[2],15,0x2ad7d2bbUL) + II(b,c,d,a,W[9],21,0xeb86d391UL) + + md5->state[0] = md5->state[0] + a; + md5->state[1] = md5->state[1] + b; + md5->state[2] = md5->state[2] + c; + md5->state[3] = md5->state[3] + d; } -/* MD5 methods-as-attributes */ +/** + Initialize the hash state + @param sha1 The hash state you wish to initialize +*/ +void md5_init(struct md5_state *md5) +{ + assert(md5 != NULL); + md5->state[0] = 0x67452301UL; + md5->state[1] = 0xefcdab89UL; + md5->state[2] = 0x98badcfeUL; + md5->state[3] = 0x10325476UL; + md5->curlen = 0; + md5->length = 0; +} -static PyObject * -md5_update(md5object *self, PyObject *args) +/** + Process a block of memory though the hash + @param sha1 The hash state + @param in The data to hash + @param inlen The length of the data (octets) +*/ +void md5_process(struct md5_state *md5, + const unsigned char *in, Py_ssize_t inlen) { - Py_buffer view; Py_ssize_t n; - unsigned char *buf; - if (!PyArg_ParseTuple(args, "s*:update", &view)) - return NULL; + assert(md5 != NULL); + assert(in != NULL); + assert(md5->curlen <= sizeof(md5->buf)); + + while (inlen > 0) { + if (md5->curlen == 0 && inlen >= MD5_BLOCKSIZE) { + md5_compress(md5, (unsigned char *)in); + md5->length += MD5_BLOCKSIZE * 8; + in += MD5_BLOCKSIZE; + inlen -= MD5_BLOCKSIZE; + } else { + n = MIN(inlen, (MD5_BLOCKSIZE - md5->curlen)); + memcpy(md5->buf + md5->curlen, in, (size_t)n); + md5->curlen += n; + in += n; + inlen -= n; + if (md5->curlen == MD5_BLOCKSIZE) { + md5_compress(md5, md5->buf); + md5->length += 8*MD5_BLOCKSIZE; + md5->curlen = 0; + } + } + } +} + +/** + Terminate the hash to get the digest + @param sha1 The hash state + @param out [out] The destination of the hash (16 bytes) +*/ +void md5_done(struct md5_state *md5, unsigned char *out) +{ + int i; + + assert(md5 != NULL); + assert(out != NULL); + assert(md5->curlen < sizeof(md5->buf)); + + /* increase the length of the message */ + md5->length += md5->curlen * 8; + + /* append the '1' bit */ + md5->buf[md5->curlen++] = (unsigned char)0x80; + + /* if the length is currently above 56 bytes we append zeros + * then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (md5->curlen > 56) { + while (md5->curlen < 64) { + md5->buf[md5->curlen++] = (unsigned char)0; + } + md5_compress(md5, md5->buf); + md5->curlen = 0; + } - n = view.len; - buf = (unsigned char *) view.buf; - while (n > 0) { - Py_ssize_t nbytes; - if (n > INT_MAX) - nbytes = INT_MAX; - else - nbytes = n; - md5_append(&self->md5, buf, - Py_SAFE_DOWNCAST(nbytes, Py_ssize_t, unsigned int)); - buf += nbytes; - n -= nbytes; + /* pad upto 56 bytes of zeroes */ + while (md5->curlen < 56) { + md5->buf[md5->curlen++] = (unsigned char)0; } - PyBuffer_Release(&view); - Py_RETURN_NONE; + /* store length */ + STORE64L(md5->length, md5->buf+56); + md5_compress(md5, md5->buf); + + /* copy output */ + for (i = 0; i < 4; i++) { + STORE32L(md5->state[i], out+(4*i)); + } } -PyDoc_STRVAR(update_doc, -"update (arg)\n\ -\n\ -Update the md5 object with the string arg. Repeated calls are\n\ -equivalent to a single call with the concatenation of all the\n\ -arguments."); +/* .Source: /cvs/libtom/libtomcrypt/src/hashes/md5.c,v $ */ +/* .Revision: 1.10 $ */ +/* .Date: 2007/05/12 14:25:28 $ */ +/* + * End of copied MD5 code. + * + * ------------------------------------------------------------------------ + */ -static PyObject * -md5_digest(md5object *self) +static PyTypeObject MD5type; + + +static MD5object * +newMD5object(void) { - md5_state_t mdContext; - unsigned char aDigest[16]; + return (MD5object *)PyObject_New(MD5object, &MD5type); +} - /* make a temporary copy, and perform the final */ - mdContext = self->md5; - md5_finish(&mdContext, aDigest); - return PyString_FromStringAndSize((char *)aDigest, 16); +/* Internal methods for a hash object */ + +static void +MD5_dealloc(PyObject *ptr) +{ + PyObject_Del(ptr); +} + + +/* External methods for a hash object */ + +PyDoc_STRVAR(MD5_copy__doc__, "Return a copy of the hash object."); + +static PyObject * +MD5_copy(MD5object *self, PyObject *unused) +{ + MD5object *newobj; + + if (Py_TYPE(self) == &MD5type) { + if ( (newobj = newMD5object())==NULL) + return NULL; + } else { + if ( (newobj = newMD5object())==NULL) + return NULL; + } + + newobj->hash_state = self->hash_state; + return (PyObject *)newobj; } -PyDoc_STRVAR(digest_doc, -"digest() -> string\n\ -\n\ -Return the digest of the strings passed to the update() method so\n\ -far. This is a 16-byte string which may contain non-ASCII characters,\n\ -including null bytes."); +PyDoc_STRVAR(MD5_digest__doc__, +"Return the digest value as a string of binary data."); +static PyObject * +MD5_digest(MD5object *self, PyObject *unused) +{ + unsigned char digest[MD5_DIGESTSIZE]; + struct md5_state temp; + + temp = self->hash_state; + md5_done(&temp, digest); + return PyBytes_FromStringAndSize((const char *)digest, MD5_DIGESTSIZE); +} + +PyDoc_STRVAR(MD5_hexdigest__doc__, +"Return the digest value as a string of hexadecimal digits."); static PyObject * -md5_hexdigest(md5object *self) +MD5_hexdigest(MD5object *self, PyObject *unused) { - md5_state_t mdContext; - unsigned char digest[16]; - unsigned char hexdigest[32]; + unsigned char digest[MD5_DIGESTSIZE]; + struct md5_state temp; + PyObject *retval; + Py_UNICODE *hex_digest; int i, j; - /* make a temporary copy, and perform the final */ - mdContext = self->md5; - md5_finish(&mdContext, digest); + /* Get the raw (binary) digest value */ + temp = self->hash_state; + md5_done(&temp, digest); + + /* Create a new string */ + retval = PyUnicode_FromStringAndSize(NULL, MD5_DIGESTSIZE * 2); + if (!retval) + return NULL; + hex_digest = PyUnicode_AS_UNICODE(retval); + if (!hex_digest) { + Py_DECREF(retval); + return NULL; + } /* Make hex version of the digest */ - for(i=j=0; i<16; i++) { + for(i=j=0; i<MD5_DIGESTSIZE; i++) { char c; c = (digest[i] >> 4) & 0xf; c = (c>9) ? c+'a'-10 : c + '0'; - hexdigest[j++] = c; + hex_digest[j++] = c; c = (digest[i] & 0xf); c = (c>9) ? c+'a'-10 : c + '0'; - hexdigest[j++] = c; + hex_digest[j++] = c; } - return PyString_FromStringAndSize((char*)hexdigest, 32); + return retval; } - -PyDoc_STRVAR(hexdigest_doc, -"hexdigest() -> string\n\ -\n\ -Like digest(), but returns the digest as a string of hexadecimal digits."); - +PyDoc_STRVAR(MD5_update__doc__, +"Update this hash object's state with the provided string."); static PyObject * -md5_copy(md5object *self) +MD5_update(MD5object *self, PyObject *args) { - md5object *md5p; + PyObject *obj; + Py_buffer buf; - if ((md5p = newmd5object()) == NULL) + if (!PyArg_ParseTuple(args, "O:update", &obj)) return NULL; - md5p->md5 = self->md5; - - return (PyObject *)md5p; -} + GET_BUFFER_VIEW_OR_ERROUT(obj, &buf); -PyDoc_STRVAR(copy_doc, -"copy() -> md5 object\n\ -\n\ -Return a copy (``clone'') of the md5 object."); + md5_process(&self->hash_state, buf.buf, buf.len); + PyBuffer_Release(&buf); + Py_INCREF(Py_None); + return Py_None; +} -static PyMethodDef md5_methods[] = { - {"update", (PyCFunction)md5_update, METH_VARARGS, update_doc}, - {"digest", (PyCFunction)md5_digest, METH_NOARGS, digest_doc}, - {"hexdigest", (PyCFunction)md5_hexdigest, METH_NOARGS, hexdigest_doc}, - {"copy", (PyCFunction)md5_copy, METH_NOARGS, copy_doc}, - {NULL, NULL} /* sentinel */ +static PyMethodDef MD5_methods[] = { + {"copy", (PyCFunction)MD5_copy, METH_NOARGS, MD5_copy__doc__}, + {"digest", (PyCFunction)MD5_digest, METH_NOARGS, MD5_digest__doc__}, + {"hexdigest", (PyCFunction)MD5_hexdigest, METH_NOARGS, MD5_hexdigest__doc__}, + {"update", (PyCFunction)MD5_update, METH_VARARGS, MD5_update__doc__}, + {NULL, NULL} /* sentinel */ }; static PyObject * -md5_get_block_size(PyObject *self, void *closure) +MD5_get_block_size(PyObject *self, void *closure) { - return PyInt_FromLong(64); + return PyLong_FromLong(MD5_BLOCKSIZE); } static PyObject * -md5_get_digest_size(PyObject *self, void *closure) +MD5_get_name(PyObject *self, void *closure) { - return PyInt_FromLong(16); + return PyUnicode_FromStringAndSize("MD5", 3); } static PyObject * -md5_get_name(PyObject *self, void *closure) +md5_get_digest_size(PyObject *self, void *closure) { - return PyString_FromStringAndSize("MD5", 3); + return PyLong_FromLong(MD5_DIGESTSIZE); } -static PyGetSetDef md5_getseters[] = { - {"digest_size", - (getter)md5_get_digest_size, NULL, - NULL, - NULL}, + +static PyGetSetDef MD5_getseters[] = { {"block_size", - (getter)md5_get_block_size, NULL, + (getter)MD5_get_block_size, NULL, NULL, NULL}, {"name", - (getter)md5_get_name, NULL, + (getter)MD5_get_name, NULL, NULL, NULL}, - /* the old md5 and sha modules support 'digest_size' as in PEP 247. - * the old sha module also supported 'digestsize'. ugh. */ - {"digestsize", + {"digest_size", (getter)md5_get_digest_size, NULL, NULL, NULL}, {NULL} /* Sentinel */ }; - -PyDoc_STRVAR(module_doc, -"This module implements the interface to RSA's MD5 message digest\n\ -algorithm (see also Internet RFC 1321). Its use is quite\n\ -straightforward: use the new() to create an md5 object. You can now\n\ -feed this object with arbitrary strings using the update() method, and\n\ -at any point you can ask it for the digest (a strong kind of 128-bit\n\ -checksum, a.k.a. ``fingerprint'') of the concatenation of the strings\n\ -fed to it so far using the digest() method.\n\ -\n\ -Functions:\n\ -\n\ -new([arg]) -- return a new md5 object, initialized with arg if provided\n\ -md5([arg]) -- DEPRECATED, same as new, but for compatibility\n\ -\n\ -Special Objects:\n\ -\n\ -MD5Type -- type object for md5 objects"); - -PyDoc_STRVAR(md5type_doc, -"An md5 represents the object used to calculate the MD5 checksum of a\n\ -string of information.\n\ -\n\ -Methods:\n\ -\n\ -update() -- updates the current digest with an additional string\n\ -digest() -- return the current digest value\n\ -hexdigest() -- return the current digest as a string of hexadecimal digits\n\ -copy() -- return a copy of the current md5 object"); - static PyTypeObject MD5type = { PyVarObject_HEAD_INIT(NULL, 0) - "_md5.md5", /*tp_name*/ - sizeof(md5object), /*tp_size*/ - 0, /*tp_itemsize*/ + "_md5.md5", /*tp_name*/ + sizeof(MD5object), /*tp_size*/ + 0, /*tp_itemsize*/ /* methods */ - (destructor)md5_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 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*/ - md5type_doc, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - md5_methods, /*tp_methods*/ - 0, /*tp_members*/ - md5_getseters, /*tp_getset*/ + MD5_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*/ + MD5_methods, /* tp_methods */ + NULL, /* tp_members */ + MD5_getseters, /* tp_getset */ }; -/* MD5 functions */ +/* The single module-level function: new() */ + +PyDoc_STRVAR(MD5_new__doc__, +"Return a new MD5 hash object; optionally initialized with a string."); static PyObject * -MD5_new(PyObject *self, PyObject *args) +MD5_new(PyObject *self, PyObject *args, PyObject *kwdict) { - md5object *md5p; - Py_buffer view = { 0 }; - Py_ssize_t n; - unsigned char *buf; + static char *kwlist[] = {"string", NULL}; + MD5object *new; + PyObject *data_obj = NULL; + Py_buffer buf; - if (!PyArg_ParseTuple(args, "|s*:new", &view)) + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, + &data_obj)) { return NULL; + } - if ((md5p = newmd5object()) == NULL) { - PyBuffer_Release(&view); + if (data_obj) + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + + if ((new = newMD5object()) == NULL) { + if (data_obj) + PyBuffer_Release(&buf); return NULL; } - n = view.len; - buf = (unsigned char *) view.buf; - while (n > 0) { - Py_ssize_t nbytes; - if (n > INT_MAX) - nbytes = INT_MAX; - else - nbytes = n; - md5_append(&md5p->md5, buf, - Py_SAFE_DOWNCAST(nbytes, Py_ssize_t, unsigned int)); - buf += nbytes; - n -= nbytes; + md5_init(&new->hash_state); + + if (PyErr_Occurred()) { + Py_DECREF(new); + if (data_obj) + PyBuffer_Release(&buf); + return NULL; + } + if (data_obj) { + md5_process(&new->hash_state, buf.buf, buf.len); + PyBuffer_Release(&buf); } - PyBuffer_Release(&view); - return (PyObject *)md5p; + return (PyObject *)new; } -PyDoc_STRVAR(new_doc, -"new([arg]) -> md5 object\n\ -\n\ -Return a new md5 object. If arg is present, the method call update(arg)\n\ -is made."); - /* List of functions exported by this module */ -static PyMethodDef md5_functions[] = { - {"new", (PyCFunction)MD5_new, METH_VARARGS, new_doc}, - {NULL, NULL} /* Sentinel */ +static struct PyMethodDef MD5_functions[] = { + {"md5", (PyCFunction)MD5_new, METH_VARARGS|METH_KEYWORDS, MD5_new__doc__}, + {NULL, NULL} /* Sentinel */ }; /* Initialize this module. */ +#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } + + +static struct PyModuleDef _md5module = { + PyModuleDef_HEAD_INIT, + "_md5", + NULL, + -1, + MD5_functions, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_md5(void) +PyInit__md5(void) { - PyObject *m, *d; - Py_TYPE(&MD5type) = &PyType_Type; if (PyType_Ready(&MD5type) < 0) - return; - m = Py_InitModule3("_md5", md5_functions, module_doc); - if (m == NULL) - return; - d = PyModule_GetDict(m); - PyDict_SetItemString(d, "MD5Type", (PyObject *)&MD5type); - PyModule_AddIntConstant(m, "digest_size", 16); - /* No need to check the error here, the caller will do that */ + return NULL; + return PyModule_Create(&_md5module); } diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 03685ce6c10..33c143eba8c 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -98,6 +98,7 @@ typedef struct { #else off_t offset; #endif + int exports; #ifdef MS_WINDOWS HANDLE map_handle; @@ -131,8 +132,6 @@ mmap_object_dealloc(mmap_object *m_obj) if (m_obj->fd >= 0) (void) close(m_obj->fd); if (m_obj->data!=NULL) { - if (m_obj->access != ACCESS_READ && m_obj->access != ACCESS_COPY) - msync(m_obj->data, m_obj->size, MS_SYNC); munmap(m_obj->data, m_obj->size); } #endif /* UNIX */ @@ -143,6 +142,11 @@ mmap_object_dealloc(mmap_object *m_obj) static PyObject * mmap_close_method(mmap_object *self, PyObject *unused) { + if (self->exports > 0) { + PyErr_SetString(PyExc_BufferError, "cannot close "\ + "exported pointers exist"); + return NULL; + } #ifdef MS_WINDOWS /* For each resource we maintain, we need to check the value is valid, and if so, free the resource @@ -207,7 +211,7 @@ mmap_read_byte_method(mmap_object *self, if (self->pos < self->size) { char value = self->data[self->pos]; self->pos += 1; - return Py_BuildValue("c", value); + return Py_BuildValue("B", (unsigned char)value); } else { PyErr_SetString(PyExc_ValueError, "read byte out of range"); return NULL; @@ -231,7 +235,7 @@ mmap_read_line_method(mmap_object *self, else ++eol; /* we're interested in the position after the newline. */ - result = PyString_FromStringAndSize(start, (eol - start)); + result = PyBytes_FromStringAndSize(start, (eol - start)); self->pos += (eol - start); return result; } @@ -261,7 +265,7 @@ mmap_read_method(mmap_object *self, if (num_bytes < 0 || num_bytes > n) { num_bytes = n; } - result = Py_BuildValue("s#", self->data+self->pos, num_bytes); + result = PyBytes_FromStringAndSize(self->data+self->pos, num_bytes); self->pos += num_bytes; return result; } @@ -277,7 +281,7 @@ mmap_gfind(mmap_object *self, Py_ssize_t len; CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, reverse ? "s#|nn:rfind" : "s#|nn:find", + if (!PyArg_ParseTuple(args, reverse ? "y#|nn:rfind" : "y#|nn:find", &needle, &len, &start, &end)) { return NULL; } else { @@ -307,10 +311,10 @@ mmap_gfind(mmap_object *self, for (i = 0; i < len && needle[i] == p[i]; ++i) /* nothing */; if (i == len) { - return PyInt_FromSsize_t(p - self->data); + return PyLong_FromSsize_t(p - self->data); } } - return PyInt_FromLong(-1); + return PyLong_FromLong(-1); } } @@ -329,7 +333,7 @@ mmap_rfind_method(mmap_object *self, } static int -is_writeable(mmap_object *self) +is_writable(mmap_object *self) { if (self->access != ACCESS_READ) return 1; @@ -340,6 +344,11 @@ is_writeable(mmap_object *self) static int is_resizeable(mmap_object *self) { + if (self->exports > 0) { + PyErr_SetString(PyExc_BufferError, + "mmap can't resize with extant buffers exported."); + return 0; + } if ((self->access == ACCESS_WRITE) || (self->access == ACCESS_DEFAULT)) return 1; PyErr_Format(PyExc_TypeError, @@ -356,10 +365,10 @@ mmap_write_method(mmap_object *self, char *data; CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "s#:write", &data, &length)) + if (!PyArg_ParseTuple(args, "y#:write", &data, &length)) return(NULL); - if (!is_writeable(self)) + if (!is_writable(self)) return NULL; if ((self->pos + length) > self->size) { @@ -379,10 +388,10 @@ mmap_write_byte_method(mmap_object *self, char value; CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "c:write_byte", &value)) + if (!PyArg_ParseTuple(args, "b:write_byte", &value)) return(NULL); - if (!is_writeable(self)) + if (!is_writable(self)) return NULL; if (self->pos < self->size) { @@ -416,11 +425,11 @@ mmap_size_method(mmap_object *self, return PyErr_SetFromWindowsErr(error); } if (!high && low < LONG_MAX) - return PyInt_FromLong((long)low); + return PyLong_FromLong((long)low); size = (((PY_LONG_LONG)high)<<32) + low; return PyLong_FromLongLong(size); } else { - return PyInt_FromSsize_t(self->size); + return PyLong_FromSsize_t(self->size); } #endif /* MS_WINDOWS */ @@ -434,7 +443,7 @@ mmap_size_method(mmap_object *self, #ifdef HAVE_LARGEFILE_SUPPORT return PyLong_FromLongLong(buf.st_size); #else - return PyInt_FromLong(buf.st_size); + return PyLong_FromLong(buf.st_size); #endif } #endif /* UNIX */ @@ -549,7 +558,7 @@ static PyObject * mmap_tell_method(mmap_object *self, PyObject *unused) { CHECK_VALID(NULL); - return PyInt_FromSize_t(self->pos); + return PyLong_FromSize_t(self->pos); } static PyObject * @@ -569,7 +578,7 @@ mmap_flush_method(mmap_object *self, PyObject *args) return PyLong_FromLong(0); #ifdef MS_WINDOWS - return PyInt_FromLong((long) FlushViewOfFile(self->data+offset, size)); + return PyLong_FromLong((long) FlushViewOfFile(self->data+offset, size)); #elif defined(UNIX) /* XXX semantics of return value? */ /* XXX flags for msync? */ @@ -577,7 +586,7 @@ mmap_flush_method(mmap_object *self, PyObject *args) PyErr_SetFromErrno(mmap_module_error); return NULL; } - return PyInt_FromLong(0); + return PyLong_FromLong(0); #else PyErr_SetString(PyExc_ValueError, "flush not supported on this system"); return NULL; @@ -632,7 +641,7 @@ mmap_move_method(mmap_object *self, PyObject *args) unsigned long dest, src, cnt; CHECK_VALID(NULL); if (!PyArg_ParseTuple(args, "kkk:move", &dest, &src, &cnt) || - !is_writeable(self)) { + !is_writable(self)) { return NULL; } else { /* bounds check the values */ @@ -649,6 +658,31 @@ mmap_move_method(mmap_object *self, PyObject *args) } } +static PyObject * +mmap_closed_get(mmap_object *self) +{ +#ifdef MS_WINDOWS + return PyBool_FromLong(self->map_handle == NULL ? 1 : 0); +#elif defined(UNIX) + return PyBool_FromLong(self->data == NULL ? 1 : 0); +#endif +} + +static PyObject * +mmap__enter__method(mmap_object *self, PyObject *args) +{ + CHECK_VALID(NULL); + + Py_INCREF(self); + return (PyObject *)self; +} + +static PyObject * +mmap__exit__method(PyObject *self, PyObject *args) +{ + return PyObject_CallMethod(self, "close", NULL); +} + static struct PyMethodDef mmap_object_methods[] = { {"close", (PyCFunction) mmap_close_method, METH_NOARGS}, {"find", (PyCFunction) mmap_find_method, METH_VARARGS}, @@ -664,58 +698,34 @@ static struct PyMethodDef mmap_object_methods[] = { {"tell", (PyCFunction) mmap_tell_method, METH_NOARGS}, {"write", (PyCFunction) mmap_write_method, METH_VARARGS}, {"write_byte", (PyCFunction) mmap_write_byte_method, METH_VARARGS}, + {"__enter__", (PyCFunction) mmap__enter__method, METH_NOARGS}, + {"__exit__", (PyCFunction) mmap__exit__method, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; -/* Functions for treating an mmap'ed file as a buffer */ +static PyGetSetDef mmap_object_getset[] = { + {"closed", (getter) mmap_closed_get, NULL, NULL}, + {NULL} +}; -static Py_ssize_t -mmap_buffer_getreadbuf(mmap_object *self, Py_ssize_t index, const void **ptr) -{ - CHECK_VALID(-1); - if (index != 0) { - PyErr_SetString(PyExc_SystemError, - "Accessing non-existent mmap segment"); - return -1; - } - *ptr = self->data; - return self->size; -} -static Py_ssize_t -mmap_buffer_getwritebuf(mmap_object *self, Py_ssize_t index, const void **ptr) +/* Functions for treating an mmap'ed file as a buffer */ + +static int +mmap_buffer_getbuf(mmap_object *self, Py_buffer *view, int flags) { CHECK_VALID(-1); - if (index != 0) { - PyErr_SetString(PyExc_SystemError, - "Accessing non-existent mmap segment"); - return -1; - } - if (!is_writeable(self)) + if (PyBuffer_FillInfo(view, (PyObject*)self, self->data, self->size, + (self->access == ACCESS_READ), flags) < 0) return -1; - *ptr = self->data; - return self->size; + self->exports++; + return 0; } -static Py_ssize_t -mmap_buffer_getsegcount(mmap_object *self, Py_ssize_t *lenp) +static void +mmap_buffer_releasebuf(mmap_object *self, Py_buffer *view) { - CHECK_VALID(-1); - if (lenp) - *lenp = self->size; - return 1; -} - -static Py_ssize_t -mmap_buffer_getcharbuffer(mmap_object *self, Py_ssize_t index, const void **ptr) -{ - if (index != 0) { - PyErr_SetString(PyExc_SystemError, - "accessing non-existent buffer segment"); - return -1; - } - *ptr = (const char *)self->data; - return self->size; + self->exports--; } static Py_ssize_t @@ -733,25 +743,7 @@ mmap_item(mmap_object *self, Py_ssize_t i) PyErr_SetString(PyExc_IndexError, "mmap index out of range"); return NULL; } - return PyString_FromStringAndSize(self->data + i, 1); -} - -static PyObject * -mmap_slice(mmap_object *self, Py_ssize_t ilow, Py_ssize_t ihigh) -{ - CHECK_VALID(NULL); - if (ilow < 0) - ilow = 0; - else if ((size_t)ilow > self->size) - ilow = self->size; - if (ihigh < 0) - ihigh = 0; - if (ihigh < ilow) - ihigh = ilow; - else if ((size_t)ihigh > self->size) - ihigh = self->size; - - return PyString_FromStringAndSize(self->data + ilow, ihigh-ilow); + return PyBytes_FromStringAndSize(self->data + i, 1); } static PyObject * @@ -769,20 +761,20 @@ mmap_subscript(mmap_object *self, PyObject *item) "mmap index out of range"); return NULL; } - return PyString_FromStringAndSize(self->data + i, 1); + return PyLong_FromLong(Py_CHARMASK(self->data[i])); } else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelen; - if (PySlice_GetIndicesEx((PySliceObject *)item, self->size, + if (PySlice_GetIndicesEx(item, self->size, &start, &stop, &step, &slicelen) < 0) { return NULL; } if (slicelen <= 0) - return PyString_FromStringAndSize("", 0); + return PyBytes_FromStringAndSize("", 0); else if (step == 1) - return PyString_FromStringAndSize(self->data + start, + return PyBytes_FromStringAndSize(self->data + start, slicelen); else { char *result_buf = (char *)PyMem_Malloc(slicelen); @@ -795,7 +787,7 @@ mmap_subscript(mmap_object *self, PyObject *item) cur += step, i++) { result_buf[i] = self->data[cur]; } - result = PyString_FromStringAndSize(result_buf, + result = PyBytes_FromStringAndSize(result_buf, slicelen); PyMem_Free(result_buf); return result; @@ -827,45 +819,6 @@ mmap_repeat(mmap_object *self, Py_ssize_t n) } static int -mmap_ass_slice(mmap_object *self, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) -{ - const char *buf; - - CHECK_VALID(-1); - if (ilow < 0) - ilow = 0; - else if ((size_t)ilow > self->size) - ilow = self->size; - if (ihigh < 0) - ihigh = 0; - if (ihigh < ilow) - ihigh = ilow; - else if ((size_t)ihigh > self->size) - ihigh = self->size; - - if (v == NULL) { - PyErr_SetString(PyExc_TypeError, - "mmap object doesn't support slice deletion"); - return -1; - } - if (! (PyString_Check(v)) ) { - PyErr_SetString(PyExc_IndexError, - "mmap slice assignment must be a string"); - return -1; - } - if (PyString_Size(v) != (ihigh - ilow)) { - PyErr_SetString(PyExc_IndexError, - "mmap slice assignment is wrong size"); - return -1; - } - if (!is_writeable(self)) - return -1; - buf = PyString_AsString(v); - memcpy(self->data + ilow, buf, ihigh-ilow); - return 0; -} - -static int mmap_ass_item(mmap_object *self, Py_ssize_t i, PyObject *v) { const char *buf; @@ -880,14 +833,14 @@ mmap_ass_item(mmap_object *self, Py_ssize_t i, PyObject *v) "mmap object doesn't support item deletion"); return -1; } - if (! (PyString_Check(v) && PyString_Size(v)==1) ) { + if (! (PyBytes_Check(v) && PyBytes_Size(v)==1) ) { PyErr_SetString(PyExc_IndexError, - "mmap assignment must be single-character string"); + "mmap assignment must be length-1 bytes()"); return -1; } - if (!is_writeable(self)) + if (!is_writable(self)) return -1; - buf = PyString_AsString(v); + buf = PyBytes_AsString(v); self->data[i] = buf[0]; return 0; } @@ -897,9 +850,12 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) { CHECK_VALID(-1); + if (!is_writable(self)) + return -1; + if (PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); - const char *buf; + Py_ssize_t v; if (i == -1 && PyErr_Occurred()) return -1; @@ -907,29 +863,36 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) i += self->size; if (i < 0 || (size_t)i >= self->size) { PyErr_SetString(PyExc_IndexError, - "mmap index out of range"); + "mmap index out of range"); return -1; } if (value == NULL) { PyErr_SetString(PyExc_TypeError, - "mmap object doesn't support item deletion"); + "mmap doesn't support item deletion"); return -1; } - if (!PyString_Check(value) || PyString_Size(value) != 1) { - PyErr_SetString(PyExc_IndexError, - "mmap assignment must be single-character string"); + if (!PyIndex_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "mmap item value must be an int"); return -1; } - if (!is_writeable(self)) + v = PyNumber_AsSsize_t(value, PyExc_TypeError); + if (v == -1 && PyErr_Occurred()) return -1; - buf = PyString_AsString(value); - self->data[i] = buf[0]; + if (v < 0 || v > 255) { + PyErr_SetString(PyExc_ValueError, + "mmap item value must be " + "in range(0, 256)"); + return -1; + } + self->data[i] = (char) v; return 0; } else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelen; + Py_buffer vbuf; - if (PySlice_GetIndicesEx((PySliceObject *)item, + if (PySlice_GetIndicesEx(item, self->size, &start, &stop, &step, &slicelen) < 0) { return -1; @@ -939,41 +902,32 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) "mmap object doesn't support slice deletion"); return -1; } - if (!PyString_Check(value)) { - PyErr_SetString(PyExc_IndexError, - "mmap slice assignment must be a string"); + if (PyObject_GetBuffer(value, &vbuf, PyBUF_SIMPLE) < 0) return -1; - } - if (PyString_Size(value) != slicelen) { + if (vbuf.len != slicelen) { PyErr_SetString(PyExc_IndexError, "mmap slice assignment is wrong size"); + PyBuffer_Release(&vbuf); return -1; } - if (!is_writeable(self)) - return -1; - if (slicelen == 0) - return 0; + if (slicelen == 0) { + } else if (step == 1) { - const char *buf = PyString_AsString(value); - - if (buf == NULL) - return -1; - memcpy(self->data + start, buf, slicelen); - return 0; + memcpy(self->data + start, vbuf.buf, slicelen); } else { Py_ssize_t cur, i; - const char *buf = PyString_AsString(value); - if (buf == NULL) - return -1; - for (cur = start, i = 0; i < slicelen; - cur += step, i++) { - self->data[cur] = buf[i]; + for (cur = start, i = 0; + i < slicelen; + cur += step, i++) + { + self->data[cur] = ((char *)vbuf.buf)[i]; } - return 0; } + PyBuffer_Release(&vbuf); + return 0; } else { PyErr_SetString(PyExc_TypeError, @@ -987,9 +941,9 @@ static PySequenceMethods mmap_as_sequence = { (binaryfunc)mmap_concat, /*sq_concat*/ (ssizeargfunc)mmap_repeat, /*sq_repeat*/ (ssizeargfunc)mmap_item, /*sq_item*/ - (ssizessizeargfunc)mmap_slice, /*sq_slice*/ + 0, /*sq_slice*/ (ssizeobjargproc)mmap_ass_item, /*sq_ass_item*/ - (ssizessizeobjargproc)mmap_ass_slice, /*sq_ass_slice*/ + 0, /*sq_ass_slice*/ }; static PyMappingMethods mmap_as_mapping = { @@ -999,10 +953,8 @@ static PyMappingMethods mmap_as_mapping = { }; static PyBufferProcs mmap_as_buffer = { - (readbufferproc)mmap_buffer_getreadbuf, - (writebufferproc)mmap_buffer_getwritebuf, - (segcountproc)mmap_buffer_getsegcount, - (charbufferproc)mmap_buffer_getcharbuffer, + (getbufferproc)mmap_buffer_getbuf, + (releasebufferproc)mmap_buffer_releasebuf, }; static PyObject * @@ -1042,7 +994,7 @@ static PyTypeObject mmap_object_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ &mmap_as_sequence, /*tp_as_sequence*/ @@ -1053,7 +1005,7 @@ static PyTypeObject mmap_object_type = { PyObject_GenericGetAttr, /*tp_getattro*/ 0, /*tp_setattro*/ &mmap_as_buffer, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GETCHARBUFFER, /*tp_flags*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ mmap_doc, /*tp_doc*/ 0, /* tp_traverse */ 0, /* tp_clear */ @@ -1063,7 +1015,7 @@ static PyTypeObject mmap_object_type = { 0, /* tp_iternext */ mmap_object_methods, /* tp_methods */ 0, /* tp_members */ - 0, /* tp_getset */ + mmap_object_getset, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ @@ -1218,6 +1170,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->exports = 0; m_obj->offset = offset; if (fd == -1) { m_obj->fd = -1; @@ -1331,8 +1284,9 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) XXX: fileno == 0 is a valid fd, but was accepted prior to 2.5. XXX: Should this code be added? if (fileno == 0) - PyErr_Warn(PyExc_DeprecationWarning, - "don't use 0 for anonymous memory"); + PyErr_WarnEx(PyExc_DeprecationWarning, + "don't use 0 for anonymous memory", + 1); */ if (fileno != -1 && fileno != 0) { /* Ensure that fileno is within the CRT's valid range */ @@ -1418,6 +1372,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) /* set the initial position */ m_obj->pos = (size_t) 0; + m_obj->exports = 0; /* set the tag name */ if (tagname != NULL && *tagname != '\0') { m_obj->tagname = PyMem_Malloc(strlen(tagname)+1); @@ -1468,30 +1423,43 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) static void setint(PyObject *d, const char *name, long value) { - PyObject *o = PyInt_FromLong(value); + PyObject *o = PyLong_FromLong(value); if (o && PyDict_SetItemString(d, name, o) == 0) { Py_DECREF(o); } } + +static struct PyModuleDef mmapmodule = { + PyModuleDef_HEAD_INIT, + "mmap", + NULL, + -1, + NULL, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initmmap(void) +PyInit_mmap(void) { PyObject *dict, *module; if (PyType_Ready(&mmap_object_type) < 0) - return; + return NULL; - module = Py_InitModule("mmap", NULL); + module = PyModule_Create(&mmapmodule); if (module == NULL) - return; + return NULL; dict = PyModule_GetDict(module); if (!dict) - return; + return NULL; mmap_module_error = PyErr_NewException("mmap.error", PyExc_EnvironmentError , NULL); if (mmap_module_error == NULL) - return; + return NULL; PyDict_SetItemString(dict, "error", mmap_module_error); PyDict_SetItemString(dict, "mmap", (PyObject*) &mmap_object_type); #ifdef PROT_EXEC @@ -1528,4 +1496,5 @@ initmmap(void) setint(dict, "ACCESS_READ", ACCESS_READ); setint(dict, "ACCESS_WRITE", ACCESS_WRITE); setint(dict, "ACCESS_COPY", ACCESS_COPY); + return module; } diff --git a/Modules/nismodule.c b/Modules/nismodule.c index 6acab63ddfd..a81ca8ca4df 100644 --- a/Modules/nismodule.c +++ b/Modules/nismodule.c @@ -117,8 +117,8 @@ nis_foreach (int instatus, char *inkey, int inkeylen, char *inval, if (invallen > 0 && inval[invallen-1] == '\0') invallen--; } - key = PyString_FromStringAndSize(inkey, inkeylen); - val = PyString_FromStringAndSize(inval, invallen); + key = PyUnicode_DecodeFSDefaultAndSize(inkey, inkeylen); + val = PyUnicode_DecodeFSDefaultAndSize(inval, invallen); if (key == NULL || val == NULL) { /* XXX error -- don't know how to handle */ PyErr_Clear(); @@ -150,7 +150,7 @@ nis_get_default_domain (PyObject *self) if ((err = yp_get_default_domain(&domain)) != 0) return nis_error(err); - res = PyString_FromStringAndSize (domain, strlen(domain)); + res = PyUnicode_FromStringAndSize (domain, strlen(domain)); return res; } @@ -159,30 +159,40 @@ nis_match (PyObject *self, PyObject *args, PyObject *kwdict) { char *match; char *domain = NULL; - int keylen, len; + Py_ssize_t keylen; + int len; char *key, *map; int err; - PyObject *res; + PyObject *ukey, *bkey, *res; int fix; static char *kwlist[] = {"key", "map", "domain", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwdict, - "t#s|s:match", kwlist, - &key, &keylen, &map, &domain)) + "Us|s:match", kwlist, + &ukey, &map, &domain)) return NULL; - if (!domain && ((err = yp_get_default_domain(&domain)) != 0)) + if ((bkey = PyUnicode_EncodeFSDefault(ukey)) == NULL) + return NULL; + if (PyBytes_AsStringAndSize(bkey, &key, &keylen) == -1) { + Py_DECREF(bkey); + return NULL; + } + if (!domain && ((err = yp_get_default_domain(&domain)) != 0)) { + Py_DECREF(bkey); return nis_error(err); + } map = nis_mapname (map, &fix); if (fix) keylen++; Py_BEGIN_ALLOW_THREADS err = yp_match (domain, map, key, keylen, &match, &len); Py_END_ALLOW_THREADS + Py_DECREF(bkey); if (fix) len--; if (err != 0) return nis_error(err); - res = PyString_FromStringAndSize (match, len); + res = PyUnicode_DecodeFSDefaultAndSize(match, len); free (match); return res; } @@ -402,7 +412,7 @@ nis_maps (PyObject *self, PyObject *args, PyObject *kwdict) if ((list = PyList_New(0)) == NULL) return NULL; for (maps = maps; maps; maps = maps->next) { - PyObject *str = PyString_FromString(maps->map); + PyObject *str = PyUnicode_FromString(maps->map); if (!str || PyList_Append(list, str) < 0) { Py_DECREF(list); @@ -434,15 +444,28 @@ static PyMethodDef nis_methods[] = { PyDoc_STRVAR(nis__doc__, "This module contains functions for accessing NIS maps.\n"); -void -initnis (void) +static struct PyModuleDef nismodule = { + PyModuleDef_HEAD_INIT, + "nis", + nis__doc__, + -1, + nis_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyObject* +PyInit_nis (void) { PyObject *m, *d; - m = Py_InitModule3("nis", nis_methods, nis__doc__); + m = PyModule_Create(&nismodule); if (m == NULL) - return; + return NULL; d = PyModule_GetDict(m); NisError = PyErr_NewException("nis.error", NULL, NULL); if (NisError != NULL) PyDict_SetItemString(d, "error", NisError); + return m; } diff --git a/Modules/operator.c b/Modules/operator.c index 274d8aad39f..866ec3a761e 100644 --- a/Modules/operator.c +++ b/Modules/operator.c @@ -46,13 +46,13 @@ used for special methods; variants without leading and trailing\n\ PyObject *a1, *a2; long r; \ if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \ if(-1 == (r=AOP(a1,a2))) return NULL; \ - return PyInt_FromLong(r); } + return PyLong_FromLong(r); } #define spamn2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ PyObject *a1, *a2; Py_ssize_t r; \ if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \ if(-1 == (r=AOP(a1,a2))) return NULL; \ - return PyInt_FromSsize_t(r); } + return PyLong_FromSsize_t(r); } #define spami2b(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ PyObject *a1, *a2; long r; \ @@ -65,32 +65,10 @@ used for special methods; variants without leading and trailing\n\ if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \ return PyObject_RichCompare(a1,a2,A); } -/* Deprecated operators that need warnings. */ -static int -op_isCallable(PyObject *x) -{ - if (PyErr_WarnPy3k("operator.isCallable() is not supported in 3.x. " - "Use hasattr(obj, '__call__').", 1) < 0) - return -1; - return PyCallable_Check(x); -} - -static int -op_sequenceIncludes(PyObject *seq, PyObject* ob) -{ - if (PyErr_WarnPy3k("operator.sequenceIncludes() is not supported " - "in 3.x. Use operator.contains().", 1) < 0) - return -1; - return PySequence_Contains(seq, ob); -} - -spami(isCallable , op_isCallable) -spami(isNumberType , PyNumber_Check) spami(truth , PyObject_IsTrue) spam2(op_add , PyNumber_Add) spam2(op_sub , PyNumber_Subtract) spam2(op_mul , PyNumber_Multiply) -spam2(op_div , PyNumber_Divide) spam2(op_floordiv , PyNumber_FloorDivide) spam2(op_truediv , PyNumber_TrueDivide) spam2(op_mod , PyNumber_Remainder) @@ -108,7 +86,6 @@ spam2(op_or_ , PyNumber_Or) spam2(op_iadd , PyNumber_InPlaceAdd) spam2(op_isub , PyNumber_InPlaceSubtract) spam2(op_imul , PyNumber_InPlaceMultiply) -spam2(op_idiv , PyNumber_InPlaceDivide) spam2(op_ifloordiv , PyNumber_InPlaceFloorDivide) spam2(op_itruediv , PyNumber_InPlaceTrueDivide) spam2(op_imod , PyNumber_InPlaceRemainder) @@ -117,16 +94,11 @@ spam2(op_irshift , PyNumber_InPlaceRshift) spam2(op_iand , PyNumber_InPlaceAnd) spam2(op_ixor , PyNumber_InPlaceXor) spam2(op_ior , PyNumber_InPlaceOr) -spami(isSequenceType , PySequence_Check) spam2(op_concat , PySequence_Concat) -spamoi(op_repeat , PySequence_Repeat) spam2(op_iconcat , PySequence_InPlaceConcat) -spamoi(op_irepeat , PySequence_InPlaceRepeat) spami2b(op_contains , PySequence_Contains) -spami2b(sequenceIncludes, op_sequenceIncludes) spamn2(indexOf , PySequence_Index) spamn2(countOf , PySequence_Count) -spami(isMappingType , PyMapping_Check) spam2(op_getitem , PyObject_GetItem) spam2n(op_delitem , PyObject_DelItem) spam3n(op_setitem , PyObject_SetItem) @@ -183,47 +155,6 @@ is_not(PyObject *s, PyObject *a) return result; } -static PyObject* -op_getslice(PyObject *s, PyObject *a) -{ - PyObject *a1; - Py_ssize_t a2, a3; - - if (!PyArg_ParseTuple(a, "Onn:getslice", &a1, &a2, &a3)) - return NULL; - return PySequence_GetSlice(a1, a2, a3); -} - -static PyObject* -op_setslice(PyObject *s, PyObject *a) -{ - PyObject *a1, *a4; - Py_ssize_t a2, a3; - - if (!PyArg_ParseTuple(a, "OnnO:setslice", &a1, &a2, &a3, &a4)) - return NULL; - - if (-1 == PySequence_SetSlice(a1, a2, a3, a4)) - return NULL; - - Py_RETURN_NONE; -} - -static PyObject* -op_delslice(PyObject *s, PyObject *a) -{ - PyObject *a1; - Py_ssize_t a2, a3; - - if (!PyArg_ParseTuple(a, "Onn:delslice", &a1, &a2, &a3)) - return NULL; - - if (-1 == PySequence_DelSlice(a1, a2, a3)) - return NULL; - - Py_RETURN_NONE; -} - #undef spam1 #undef spam2 #undef spam1o @@ -237,24 +168,14 @@ op_delslice(PyObject *s, PyObject *a) static struct PyMethodDef operator_methods[] = { -spam1o(isCallable, - "isCallable(a) -- Same as callable(a).") -spam1o(isNumberType, - "isNumberType(a) -- Return True if a has a numeric type, False otherwise.") -spam1o(isSequenceType, - "isSequenceType(a) -- Return True if a has a sequence type, False otherwise.") spam1o(truth, "truth(a) -- Return True if a is true, False otherwise.") spam2(contains,__contains__, "contains(a, b) -- Same as b in a (note reversed operands).") -spam1(sequenceIncludes, - "sequenceIncludes(a, b) -- Same as b in a (note reversed operands; deprecated).") spam1(indexOf, "indexOf(a, b) -- Return the first index of b in a.") spam1(countOf, "countOf(a, b) -- Return the number of times b occurs in a.") -spam1o(isMappingType, - "isMappingType(a) -- Return True if a has a mapping type, False otherwise.") spam1(is_, "is_(a, b) -- Same as a is b.") spam1(is_not, "is_not(a, b) -- Same as a is not b.") @@ -262,9 +183,8 @@ 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(div,__div__, "div(a, b) -- Same as a / b when __future__.division is not in effect.") spam2(floordiv,__floordiv__, "floordiv(a, b) -- Same as a // b.") -spam2(truediv,__truediv__, "truediv(a, b) -- Same as a / b when __future__.division is in effect.") +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.") @@ -280,9 +200,8 @@ 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(idiv,__idiv__, "a = idiv(a, b) -- Same as a /= b when __future__.division is not in effect.") spam2(ifloordiv,__ifloordiv__, "a = ifloordiv(a, b) -- Same as a //= b.") -spam2(itruediv,__itruediv__, "a = itruediv(a, b) -- Same as a /= b when __future__.division is in effect.") +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.") @@ -291,12 +210,8 @@ 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__, "concat(a, b) -- Same as a + b, for a and b sequences.") -spam2(repeat,__repeat__, - "repeat(a, b) -- Return a * b, where a is a sequence, and b is an integer.") spam2(iconcat,__iconcat__, "a = iconcat(a, b) -- Same as a += b, for a and b sequences.") -spam2(irepeat,__irepeat__, - "a = irepeat(a, b) -- Same as a *= b, where a is a sequence, and b is an integer.") spam2(getitem,__getitem__, "getitem(a, b) -- Same as a[b].") spam2(setitem,__setitem__, @@ -305,12 +220,6 @@ spam2(delitem,__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(getslice,__getslice__, - "getslice(a, b, c) -- Same as a[b:c].") -spam2(setslice,__setslice__, -"setslice(a, b, c, d) -- Same as a[b:c] = d.") -spam2(delslice,__delslice__, -"delslice(a, b, c) -- Same as del a[b:c].") 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.") @@ -425,7 +334,7 @@ static PyTypeObject itemgetter_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -474,7 +383,7 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { attrgetterobject *ag; PyObject *attr; - Py_ssize_t nattrs; + Py_ssize_t nattrs, idx, char_idx; if (!_PyArg_NoKeywords("attrgetter()", kwds)) return NULL; @@ -483,15 +392,92 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (nattrs <= 1) { if (!PyArg_UnpackTuple(args, "attrgetter", 1, 1, &attr)) return NULL; - } else - attr = args; + } + + attr = PyTuple_New(nattrs); + if (attr == NULL) + return NULL; + + /* prepare attr while checking args */ + for (idx = 0; idx < nattrs; ++idx) { + PyObject *item = PyTuple_GET_ITEM(args, idx); + Py_ssize_t item_len; + Py_UNICODE *item_buffer; + int dot_count; + + if (!PyUnicode_Check(item)) { + PyErr_SetString(PyExc_TypeError, + "attribute name must be a string"); + Py_DECREF(attr); + return NULL; + } + item_len = PyUnicode_GET_SIZE(item); + item_buffer = PyUnicode_AS_UNICODE(item); + + /* check whethere the string is dotted */ + dot_count = 0; + for (char_idx = 0; char_idx < item_len; ++char_idx) { + if (item_buffer[char_idx] == (Py_UNICODE)'.') + ++dot_count; + } + + if (dot_count == 0) { + Py_INCREF(item); + PyUnicode_InternInPlace(&item); + PyTuple_SET_ITEM(attr, idx, item); + } else { /* make it a tuple of non-dotted attrnames */ + PyObject *attr_chain = PyTuple_New(dot_count + 1); + PyObject *attr_chain_item; + Py_ssize_t unibuff_from = 0; + Py_ssize_t unibuff_till = 0; + Py_ssize_t attr_chain_idx = 0; + + if (attr_chain == NULL) { + Py_DECREF(attr); + return NULL; + } + + for (; dot_count > 0; --dot_count) { + while (item_buffer[unibuff_till] != (Py_UNICODE)'.') { + ++unibuff_till; + } + attr_chain_item = PyUnicode_FromUnicode( + item_buffer + unibuff_from, + unibuff_till - unibuff_from); + if (attr_chain_item == NULL) { + Py_DECREF(attr_chain); + Py_DECREF(attr); + return NULL; + } + PyUnicode_InternInPlace(&attr_chain_item); + PyTuple_SET_ITEM(attr_chain, attr_chain_idx, attr_chain_item); + ++attr_chain_idx; + unibuff_till = unibuff_from = unibuff_till + 1; + } + + /* now add the last dotless name */ + attr_chain_item = PyUnicode_FromUnicode( + item_buffer + unibuff_from, + item_len - unibuff_from); + if (attr_chain_item == NULL) { + Py_DECREF(attr_chain); + Py_DECREF(attr); + return NULL; + } + PyUnicode_InternInPlace(&attr_chain_item); + PyTuple_SET_ITEM(attr_chain, attr_chain_idx, attr_chain_item); + + PyTuple_SET_ITEM(attr, idx, attr_chain); + } + } /* create attrgetterobject structure */ ag = PyObject_GC_New(attrgetterobject, &attrgetter_type); - if (ag == NULL) + if (ag == NULL) { + Py_DECREF(attr); return NULL; + } - Py_INCREF(attr); ag->attr = attr; ag->nattrs = nattrs; @@ -517,41 +503,31 @@ attrgetter_traverse(attrgetterobject *ag, visitproc visit, void *arg) static PyObject * dotted_getattr(PyObject *obj, PyObject *attr) { - char *s, *p; - -#ifdef Py_USING_UNICODE - if (PyUnicode_Check(attr)) { - attr = _PyUnicode_AsDefaultEncodedString(attr, NULL); - if (attr == NULL) - return NULL; - } -#endif - - if (!PyString_Check(attr)) { - PyErr_SetString(PyExc_TypeError, - "attribute name must be a string"); - return NULL; - } - - s = PyString_AS_STRING(attr); - Py_INCREF(obj); - for (;;) { - PyObject *newobj, *str; - p = strchr(s, '.'); - str = p ? PyString_FromStringAndSize(s, (p-s)) : - PyString_FromString(s); - if (str == NULL) { + PyObject *newobj; + + /* attr is either a tuple or instance of str. + Ensured by the setup code of attrgetter_new */ + if (PyTuple_CheckExact(attr)) { /* chained getattr */ + Py_ssize_t name_idx = 0, name_count; + PyObject *attr_name; + + name_count = PyTuple_GET_SIZE(attr); + Py_INCREF(obj); + for (name_idx = 0; name_idx < name_count; ++name_idx) { + attr_name = PyTuple_GET_ITEM(attr, name_idx); + newobj = PyObject_GetAttr(obj, attr_name); Py_DECREF(obj); - return NULL; + if (newobj == NULL) { + return NULL; + } + /* here */ + obj = newobj; } - newobj = PyObject_GetAttr(obj, str); - Py_DECREF(str); - Py_DECREF(obj); + } else { /* single getattr */ + newobj = PyObject_GetAttr(obj, attr); if (newobj == NULL) return NULL; obj = newobj; - if (p == NULL) break; - s = p+1; } return obj; @@ -565,8 +541,8 @@ attrgetter_call(attrgetterobject *ag, PyObject *args, PyObject *kw) if (!PyArg_UnpackTuple(args, "attrgetter", 1, 1, &obj)) return NULL; - if (ag->nattrs == 1) - return dotted_getattr(obj, ag->attr); + if (ag->nattrs == 1) /* ag->attr is always a tuple */ + return dotted_getattr(obj, PyTuple_GET_ITEM(ag->attr, 0)); assert(PyTuple_Check(ag->attr)); assert(PyTuple_GET_SIZE(ag->attr) == nattrs); @@ -607,7 +583,7 @@ static PyTypeObject attrgetter_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -738,7 +714,7 @@ static PyTypeObject methodcaller_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -772,31 +748,44 @@ static PyTypeObject methodcaller_type = { }; -/* Initialization function for the module (*must* be called initoperator) */ +/* Initialization function for the module (*must* be called PyInit_operator) */ + + +static struct PyModuleDef operatormodule = { + PyModuleDef_HEAD_INIT, + "operator", + operator_doc, + -1, + operator_methods, + NULL, + NULL, + NULL, + NULL +}; PyMODINIT_FUNC -initoperator(void) +PyInit_operator(void) { PyObject *m; /* Create the module and add the functions */ - m = Py_InitModule4("operator", operator_methods, operator_doc, - (PyObject*)NULL, PYTHON_API_VERSION); + m = PyModule_Create(&operatormodule); if (m == NULL) - return; + return NULL; if (PyType_Ready(&itemgetter_type) < 0) - return; + return NULL; Py_INCREF(&itemgetter_type); PyModule_AddObject(m, "itemgetter", (PyObject *)&itemgetter_type); if (PyType_Ready(&attrgetter_type) < 0) - return; + return NULL; Py_INCREF(&attrgetter_type); PyModule_AddObject(m, "attrgetter", (PyObject *)&attrgetter_type); if (PyType_Ready(&methodcaller_type) < 0) - return; + return NULL; Py_INCREF(&methodcaller_type); PyModule_AddObject(m, "methodcaller", (PyObject *)&methodcaller_type); + return m; } diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c index 647a21e811b..b38ce5294c0 100644 --- a/Modules/ossaudiodev.c +++ b/Modules/ossaudiodev.c @@ -236,7 +236,7 @@ _do_ioctl_1(int fd, PyObject *args, char *fname, int cmd) if (ioctl(fd, cmd, &arg) == -1) return PyErr_SetFromErrno(PyExc_IOError); - return PyInt_FromLong(arg); + return PyLong_FromLong(arg); } @@ -261,7 +261,7 @@ _do_ioctl_1_internal(int fd, PyObject *args, char *fname, int cmd) if (ioctl(fd, cmd, &arg) == -1) return PyErr_SetFromErrno(PyExc_IOError); - return PyInt_FromLong(arg); + return PyLong_FromLong(arg); } @@ -321,7 +321,7 @@ oss_getfmts(oss_audio_t *self, PyObject *unused) int mask; if (ioctl(self->fd, SNDCTL_DSP_GETFMTS, &mask) == -1) return PyErr_SetFromErrno(PyExc_IOError); - return PyInt_FromLong(mask); + return PyLong_FromLong(mask); } static PyObject * @@ -367,10 +367,10 @@ oss_read(oss_audio_t *self, PyObject *args) if (!PyArg_ParseTuple(args, "i:read", &size)) return NULL; - rv = PyString_FromStringAndSize(NULL, size); + rv = PyBytes_FromStringAndSize(NULL, size); if (rv == NULL) return NULL; - cp = PyString_AS_STRING(rv); + cp = PyBytes_AS_STRING(rv); Py_BEGIN_ALLOW_THREADS count = read(self->fd, cp, size); @@ -382,7 +382,7 @@ oss_read(oss_audio_t *self, PyObject *args) return NULL; } self->icount += count; - _PyString_Resize(&rv, count); + _PyBytes_Resize(&rv, count); return rv; } @@ -392,7 +392,7 @@ oss_write(oss_audio_t *self, PyObject *args) char *cp; int rv, size; - if (!PyArg_ParseTuple(args, "s#:write", &cp, &size)) { + if (!PyArg_ParseTuple(args, "y#:write", &cp, &size)) { return NULL; } @@ -405,7 +405,7 @@ oss_write(oss_audio_t *self, PyObject *args) } else { self->ocount += rv; } - return PyInt_FromLong(rv); + return PyLong_FromLong(rv); } static PyObject * @@ -423,7 +423,7 @@ oss_writeall(oss_audio_t *self, PyObject *args) mode, the behaviour of write() and writeall() from Python is indistinguishable. */ - if (!PyArg_ParseTuple(args, "s#:write", &cp, &size)) + if (!PyArg_ParseTuple(args, "y#:write", &cp, &size)) return NULL; if (!_PyIsSelectable_fd(self->fd)) { @@ -476,9 +476,26 @@ oss_close(oss_audio_t *self, PyObject *unused) } static PyObject * +oss_self(PyObject *self, PyObject *unused) +{ + Py_INCREF(self); + return self; +} + +static PyObject * +oss_exit(PyObject *self, PyObject *unused) +{ + PyObject *ret = PyObject_CallMethod(self, "close", NULL); + if (!ret) + return NULL; + Py_DECREF(ret); + Py_RETURN_NONE; +} + +static PyObject * oss_fileno(oss_audio_t *self, PyObject *unused) { - return PyInt_FromLong(self->fd); + return PyLong_FromLong(self->fd); } @@ -535,9 +552,9 @@ oss_setparameters(oss_audio_t *self, PyObject *args) rv = PyTuple_New(3); if (rv == NULL) return NULL; - PyTuple_SET_ITEM(rv, 0, PyInt_FromLong(fmt)); - PyTuple_SET_ITEM(rv, 1, PyInt_FromLong(channels)); - PyTuple_SET_ITEM(rv, 2, PyInt_FromLong(rate)); + PyTuple_SET_ITEM(rv, 0, PyLong_FromLong(fmt)); + PyTuple_SET_ITEM(rv, 1, PyLong_FromLong(channels)); + PyTuple_SET_ITEM(rv, 2, PyLong_FromLong(rate)); return rv; } @@ -590,7 +607,7 @@ oss_bufsize(oss_audio_t *self, PyObject *unused) PyErr_SetFromErrno(PyExc_IOError); return NULL; } - return PyInt_FromLong((ai.fragstotal * ai.fragsize) / (nchannels * ssize)); + return PyLong_FromLong((ai.fragstotal * ai.fragsize) / (nchannels * ssize)); } /* obufcount returns the number of samples that are available in the @@ -609,7 +626,7 @@ oss_obufcount(oss_audio_t *self, PyObject *unused) PyErr_SetFromErrno(PyExc_IOError); return NULL; } - return PyInt_FromLong((ai.fragstotal * ai.fragsize - ai.bytes) / + return PyLong_FromLong((ai.fragstotal * ai.fragsize - ai.bytes) / (ssize * nchannels)); } @@ -629,7 +646,7 @@ oss_obuffree(oss_audio_t *self, PyObject *unused) PyErr_SetFromErrno(PyExc_IOError); return NULL; } - return PyInt_FromLong(ai.bytes / (ssize * nchannels)); + return PyLong_FromLong(ai.bytes / (ssize * nchannels)); } static PyObject * @@ -668,7 +685,7 @@ oss_mixer_close(oss_mixer_t *self, PyObject *unused) static PyObject * oss_mixer_fileno(oss_mixer_t *self, PyObject *unused) { - return PyInt_FromLong(self->fd); + return PyLong_FromLong(self->fd); } /* Simple mixer interface methods */ @@ -788,6 +805,10 @@ static PyMethodDef oss_methods[] = { /* Aliases for backwards compatibility */ { "flush", (PyCFunction)oss_sync, METH_VARARGS }, + /* Support for the context manager protocol */ + { "__enter__", oss_self, METH_NOARGS }, + { "__exit__", oss_exit, METH_VARARGS }, + { NULL, NULL} /* sentinel */ }; @@ -796,6 +817,10 @@ static PyMethodDef oss_mixer_methods[] = { { "close", (PyCFunction)oss_mixer_close, METH_NOARGS }, { "fileno", (PyCFunction)oss_mixer_fileno, METH_NOARGS }, + /* Support for the context manager protocol */ + { "__enter__", oss_self, METH_NOARGS }, + { "__exit__", oss_exit, METH_VARARGS }, + /* Simple ioctl wrappers */ { "controls", (PyCFunction)oss_mixer_controls, METH_VARARGS }, { "stereocontrols", (PyCFunction)oss_mixer_stereocontrols, METH_VARARGS}, @@ -809,43 +834,42 @@ static PyMethodDef oss_mixer_methods[] = { }; static PyObject * -oss_getattr(oss_audio_t *self, char *name) +oss_getattro(oss_audio_t *self, PyObject *nameobj) { + char *name = ""; PyObject * rval = NULL; + + if (PyUnicode_Check(nameobj)) + name = _PyUnicode_AsString(nameobj); + if (strcmp(name, "closed") == 0) { rval = (self->fd == -1) ? Py_True : Py_False; Py_INCREF(rval); } else if (strcmp(name, "name") == 0) { - rval = PyString_FromString(self->devicename); + rval = PyUnicode_FromString(self->devicename); } else if (strcmp(name, "mode") == 0) { /* No need for a "default" in this switch: from newossobject(), self->mode can only be one of these three values. */ switch(self->mode) { case O_RDONLY: - rval = PyString_FromString("r"); + rval = PyUnicode_FromString("r"); break; case O_RDWR: - rval = PyString_FromString("rw"); + rval = PyUnicode_FromString("rw"); break; case O_WRONLY: - rval = PyString_FromString("w"); + rval = PyUnicode_FromString("w"); break; } } else { - rval = Py_FindMethod(oss_methods, (PyObject *)self, name); + rval = PyObject_GenericGetAttr((PyObject *)self, nameobj); } return rval; } -static PyObject * -oss_mixer_getattr(oss_mixer_t *self, char *name) -{ - return Py_FindMethod(oss_mixer_methods, (PyObject *)self, name); -} - static PyTypeObject OSSAudioType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "ossaudiodev.oss_audio_device", /*tp_name*/ @@ -854,10 +878,28 @@ static PyTypeObject OSSAudioType = { /* methods */ (destructor)oss_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)oss_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 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*/ + (getattrofunc)oss_getattro, /*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*/ + oss_methods, /*tp_methods*/ }; static PyTypeObject OSSMixerType = { @@ -868,10 +910,28 @@ static PyTypeObject OSSMixerType = { /* methods */ (destructor)oss_mixer_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)oss_mixer_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 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*/ + oss_mixer_methods, /*tp_methods*/ }; @@ -895,7 +955,7 @@ static PyMethodDef ossaudiodev_methods[] = { #define _EXPORT_INT(mod, name) \ - if (PyModule_AddIntConstant(mod, #name, (long) (name)) == -1) return; + if (PyModule_AddIntConstant(mod, #name, (long) (name)) == -1) return NULL; static char *control_labels[] = SOUND_DEVICE_LABELS; @@ -919,12 +979,12 @@ build_namelists (PyObject *module) if (labels == NULL || names == NULL) goto error2; for (i = 0; i < num_controls; i++) { - s = PyString_FromString(control_labels[i]); + s = PyUnicode_FromString(control_labels[i]); if (s == NULL) goto error2; PyList_SET_ITEM(labels, i, s); - s = PyString_FromString(control_names[i]); + s = PyUnicode_FromString(control_names[i]); if (s == NULL) goto error2; PyList_SET_ITEM(names, i, s); @@ -945,17 +1005,35 @@ error1: } -void -initossaudiodev(void) +static struct PyModuleDef ossaudiodevmodule = { + PyModuleDef_HEAD_INIT, + "ossaudiodev", + NULL, + -1, + ossaudiodev_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit_ossaudiodev(void) { PyObject *m; - m = Py_InitModule("ossaudiodev", ossaudiodev_methods); + if (PyType_Ready(&OSSAudioType) < 0) + return NULL; + + if (PyType_Ready(&OSSMixerType) < 0) + return NULL; + + m = PyModule_Create(&ossaudiodevmodule); if (m == NULL) - return; + return NULL; OSSAudioError = PyErr_NewException("ossaudiodev.OSSAudioError", - NULL, NULL); + NULL, NULL); if (OSSAudioError) { /* Each call to PyModule_AddObject decrefs it; compensate: */ Py_INCREF(OSSAudioError); @@ -967,7 +1045,7 @@ initossaudiodev(void) /* Build 'control_labels' and 'control_names' lists and add them to the module. */ if (build_namelists(m) == -1) /* XXX what to do here? */ - return; + return NULL; /* Expose the audio format numbers -- essential! */ _EXPORT_INT(m, AFMT_QUERY); @@ -1139,4 +1217,5 @@ initossaudiodev(void) _EXPORT_INT(m, SNDCTL_TMR_STOP); _EXPORT_INT(m, SNDCTL_TMR_TEMPO); _EXPORT_INT(m, SNDCTL_TMR_TIMEBASE); + return m; } diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index eb2d6006899..9497aaee435 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -34,10 +34,8 @@ #include "grammar.h" #include "parsetok.h" /* ISTERMINAL() / ISNONTERMINAL() */ -#include "compile.h" #undef Yield #include "ast.h" -#include "pyarena.h" extern grammar _PyParser_Grammar; /* From graminit.c */ @@ -97,7 +95,7 @@ node2tuple(node *n, /* node to convert */ v = mkseq(1 + NCH(n) + (TYPE(n) == encoding_decl)); if (v == NULL) return (v); - w = PyInt_FromLong(TYPE(n)); + w = PyLong_FromLong(TYPE(n)); if (w == NULL) { Py_DECREF(v); return ((PyObject*) NULL); @@ -113,18 +111,18 @@ node2tuple(node *n, /* node to convert */ } if (TYPE(n) == encoding_decl) - (void) addelem(v, i+1, PyString_FromString(STR(n))); + (void) addelem(v, i+1, PyUnicode_FromString(STR(n))); return (v); } else if (ISTERMINAL(TYPE(n))) { PyObject *result = mkseq(2 + lineno + col_offset); if (result != NULL) { - (void) addelem(result, 0, PyInt_FromLong(TYPE(n))); - (void) addelem(result, 1, PyString_FromString(STR(n))); + (void) addelem(result, 0, PyLong_FromLong(TYPE(n))); + (void) addelem(result, 1, PyUnicode_FromString(STR(n))); if (lineno == 1) - (void) addelem(result, 2, PyInt_FromLong(n->n_lineno)); + (void) addelem(result, 2, PyLong_FromLong(n->n_lineno)); if (col_offset == 1) - (void) addelem(result, 3, PyInt_FromLong(n->n_col_offset)); + (void) addelem(result, 3, PyLong_FromLong(n->n_col_offset)); } return (result); } @@ -170,8 +168,7 @@ typedef struct { static void parser_free(PyST_Object *st); static PyObject* parser_sizeof(PyST_Object *, void *); -static int parser_compare(PyST_Object *left, PyST_Object *right); -static PyObject *parser_getattr(PyObject *self, char *name); +static PyObject* parser_richcompare(PyObject *left, PyObject *right, int op); static PyObject* parser_compilest(PyST_Object *, PyObject *, PyObject *); static PyObject* parser_isexpr(PyST_Object *, PyObject *, PyObject *); static PyObject* parser_issuite(PyST_Object *, PyObject *, PyObject *); @@ -180,8 +177,7 @@ static PyObject* parser_st2tuple(PyST_Object *, PyObject *, PyObject *); #define PUBLIC_METHOD_TYPE (METH_VARARGS|METH_KEYWORDS) -static PyMethodDef -parser_methods[] = { +static PyMethodDef parser_methods[] = { {"compile", (PyCFunction)parser_compilest, PUBLIC_METHOD_TYPE, PyDoc_STR("Compile this ST object into a code object.")}, {"isexpr", (PyCFunction)parser_isexpr, PUBLIC_METHOD_TYPE, @@ -205,9 +201,9 @@ PyTypeObject PyST_Type = { 0, /* tp_itemsize */ (destructor)parser_free, /* tp_dealloc */ 0, /* tp_print */ - parser_getattr, /* tp_getattr */ + 0, /* tp_getattr */ 0, /* tp_setattr */ - (cmpfunc)parser_compare, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -227,7 +223,7 @@ PyTypeObject PyST_Type = { "Intermediate representation of a Python parse tree.", 0, /* tp_traverse */ 0, /* tp_clear */ - 0, /* tp_richcompare */ + parser_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ @@ -235,6 +231,9 @@ PyTypeObject PyST_Type = { }; /* PyST_Type */ +/* PyST_Type isn't subclassable, so just check ob_type */ +#define PyST_Object_Check(v) ((v)->ob_type == &PyST_Type) + static int parser_compare_nodes(node *left, node *right) { @@ -264,26 +263,69 @@ parser_compare_nodes(node *left, node *right) return (0); } - -/* int parser_compare(PyST_Object* left, PyST_Object* right) +/* parser_richcompare(PyObject* left, PyObject* right, int op) * * Comparison function used by the Python operators ==, !=, <, >, <=, >= * This really just wraps a call to parser_compare_nodes() with some easy * checks and protection code. * */ -static int -parser_compare(PyST_Object *left, PyST_Object *right) + +#define TEST_COND(cond) ((cond) ? Py_True : Py_False) + +static PyObject * +parser_richcompare(PyObject *left, PyObject *right, int op) { - if (left == right) - return (0); + int result; + PyObject *v; - if ((left == 0) || (right == 0)) - return (-1); + /* neither argument should be NULL, unless something's gone wrong */ + if (left == NULL || right == NULL) { + PyErr_BadInternalCall(); + return NULL; + } - return (parser_compare_nodes(left->st_node, right->st_node)); -} + /* both arguments should be instances of PyST_Object */ + if (!PyST_Object_Check(left) || !PyST_Object_Check(right)) { + v = Py_NotImplemented; + goto finished; + } + if (left == right) + /* if arguments are identical, they're equal */ + result = 0; + else + result = parser_compare_nodes(((PyST_Object *)left)->st_node, + ((PyST_Object *)right)->st_node); + + /* Convert 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; + case Py_GE: + v = TEST_COND(result >= 0); + break; + case Py_LT: + v = TEST_COND(result < 0); + break; + case Py_GT: + v = TEST_COND(result > 0); + break; + default: + PyErr_BadArgument(); + return NULL; + } + finished: + Py_INCREF(v); + return v; +} /* parser_newstobject(node* st) * @@ -321,6 +363,15 @@ parser_free(PyST_Object *st) PyObject_Del(st); } +static PyObject * +parser_sizeof(PyST_Object *st, void *unused) +{ + Py_ssize_t res; + + res = sizeof(PyST_Object) + _PyNode_SizeOf(st->st_node); + return PyLong_FromSsize_t(res); +} + /* parser_st2tuple(PyObject* self, PyObject* args, PyObject* kw) * @@ -336,9 +387,9 @@ parser_st2tuple(PyST_Object *self, PyObject *args, PyObject *kw) PyObject *res = 0; int ok; - static char *keywords[] = {"ast", "line_info", "col_info", NULL}; + static char *keywords[] = {"st", "line_info", "col_info", NULL}; - if (self == NULL) { + if (self == NULL || PyModule_Check(self)) { ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|OO:st2tuple", keywords, &PyST_Type, &self, &line_option, &col_option); @@ -369,14 +420,6 @@ parser_st2tuple(PyST_Object *self, PyObject *args, PyObject *kw) return (res); } -static PyObject* -parser_ast2tuple(PyST_Object *self, PyObject *args, PyObject *kw) -{ - if (PyErr_WarnPy3k("ast2tuple is removed in 3.x; use st2tuple", 1) < 0) - return NULL; - return parser_st2tuple(self, args, kw); -} - /* parser_st2list(PyObject* self, PyObject* args, PyObject* kw) * @@ -392,9 +435,9 @@ parser_st2list(PyST_Object *self, PyObject *args, PyObject *kw) PyObject *res = 0; int ok; - static char *keywords[] = {"ast", "line_info", "col_info", NULL}; + static char *keywords[] = {"st", "line_info", "col_info", NULL}; - if (self == NULL) + if (self == NULL || PyModule_Check(self)) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|OO:st2list", keywords, &PyST_Type, &self, &line_option, &col_option); @@ -424,14 +467,6 @@ parser_st2list(PyST_Object *self, PyObject *args, PyObject *kw) return (res); } -static PyObject* -parser_ast2list(PyST_Object *self, PyObject *args, PyObject *kw) -{ - if (PyErr_WarnPy3k("ast2list is removed in 3.x; use st2list", 1) < 0) - return NULL; - return parser_st2list(self, args, kw); -} - /* parser_compilest(PyObject* self, PyObject* args) * @@ -448,9 +483,9 @@ parser_compilest(PyST_Object *self, PyObject *args, PyObject *kw) char* str = "<syntax-tree>"; int ok; - static char *keywords[] = {"ast", "filename", NULL}; + static char *keywords[] = {"st", "filename", NULL}; - if (self == NULL) + if (self == NULL || PyModule_Check(self)) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|s:compilest", keywords, &PyST_Type, &self, &str); else @@ -471,14 +506,6 @@ parser_compilest(PyST_Object *self, PyObject *args, PyObject *kw) return (res); } -static PyObject* -parser_compileast(PyST_Object *self, PyObject *args, PyObject *kw) -{ - if (PyErr_WarnPy3k("compileast is removed in 3.x; use compilest", 1) < 0) - return NULL; - return parser_compilest(self, args, kw); -} - /* PyObject* parser_isexpr(PyObject* self, PyObject* args) * PyObject* parser_issuite(PyObject* self, PyObject* args) @@ -493,9 +520,9 @@ parser_isexpr(PyST_Object *self, PyObject *args, PyObject *kw) PyObject* res = 0; int ok; - static char *keywords[] = {"ast", NULL}; + static char *keywords[] = {"st", NULL}; - if (self == NULL) + if (self == NULL || PyModule_Check(self)) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!:isexpr", keywords, &PyST_Type, &self); else @@ -516,9 +543,9 @@ parser_issuite(PyST_Object *self, PyObject *args, PyObject *kw) PyObject* res = 0; int ok; - static char *keywords[] = {"ast", NULL}; + static char *keywords[] = {"st", NULL}; - if (self == NULL) + if (self == NULL || PyModule_Check(self)) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!:issuite", keywords, &PyST_Type, &self); else @@ -533,13 +560,6 @@ parser_issuite(PyST_Object *self, PyObject *args, PyObject *kw) } -static PyObject* -parser_getattr(PyObject *self, char *name) -{ - return (Py_FindMethod(parser_methods, self, name)); -} - - /* err_string(char* message) * * Sets the error string for an exception of type ParserError. @@ -707,23 +727,6 @@ parser_tuple2st(PyST_Object *self, PyObject *args, PyObject *kw) return st; } -static PyObject* -parser_tuple2ast(PyST_Object *self, PyObject *args, PyObject *kw) -{ - if (PyErr_WarnPy3k("tuple2ast is removed in 3.x; use tuple2st", 1) < 0) - return NULL; - return parser_tuple2st(self, args, kw); -} - -static PyObject * -parser_sizeof(PyST_Object *st, void *unused) -{ - Py_ssize_t res; - - res = sizeof(PyST_Object) + _PyNode_SizeOf(st->st_node); - return PyLong_FromSsize_t(res); -} - /* node* build_node_children() * @@ -754,9 +757,9 @@ build_node_children(PyObject *tuple, node *root, int *line_num) if (temp == NULL) ok = 0; else { - ok = PyInt_Check(temp); + ok = PyLong_Check(temp); if (ok) - type = PyInt_AS_LONG(temp); + type = PyLong_AS_LONG(temp); Py_DECREF(temp); } } @@ -771,6 +774,7 @@ build_node_children(PyObject *tuple, node *root, int *line_num) if (ISTERMINAL(type)) { Py_ssize_t len = PyObject_Size(elem); PyObject *temp; + const char *temp_str; if ((len != 2) && (len != 3)) { err_string("terminal nodes must have 2 or 3 entries"); @@ -779,19 +783,20 @@ build_node_children(PyObject *tuple, node *root, int *line_num) temp = PySequence_GetItem(elem, 1); if (temp == NULL) return 0; - if (!PyString_Check(temp)) { + if (!PyUnicode_Check(temp)) { PyErr_Format(parser_error, "second item in terminal node must be a string," " found %s", Py_TYPE(temp)->tp_name); Py_DECREF(temp); + Py_DECREF(elem); return 0; } if (len == 3) { PyObject *o = PySequence_GetItem(elem, 2); if (o != NULL) { - if (PyInt_Check(o)) - *line_num = PyInt_AS_LONG(o); + if (PyLong_Check(o)) + *line_num = PyLong_AS_LONG(o); else { PyErr_Format(parser_error, "third item in terminal node must be an" @@ -799,15 +804,21 @@ build_node_children(PyObject *tuple, node *root, int *line_num) Py_TYPE(temp)->tp_name); Py_DECREF(o); Py_DECREF(temp); + Py_DECREF(elem); return 0; } Py_DECREF(o); } } - len = PyString_GET_SIZE(temp) + 1; - strn = (char *)PyObject_MALLOC(len); + temp_str = _PyUnicode_AsStringAndSize(temp, &len); + if (temp_str == NULL) { + Py_DECREF(temp); + Py_XDECREF(elem); + return 0; + } + strn = (char *)PyObject_MALLOC(len + 1); if (strn != NULL) - (void) memcpy(strn, PyString_AS_STRING(temp), len); + (void) memcpy(strn, temp_str, len + 1); Py_DECREF(temp); } else if (!ISNONTERMINAL(type)) { @@ -823,10 +834,12 @@ build_node_children(PyObject *tuple, node *root, int *line_num) } err = PyNode_AddChild(root, type, strn, *line_num, 0); if (err == E_NOMEM) { + Py_XDECREF(elem); PyObject_FREE(strn); return (node *) PyErr_NoMemory(); } if (err == E_OVERFLOW) { + Py_XDECREF(elem); PyObject_FREE(strn); PyErr_SetString(PyExc_ValueError, "unsupported number of child nodes"); @@ -858,7 +871,7 @@ build_node_tree(PyObject *tuple) long num = -1; if (temp != NULL) - num = PyInt_AsLong(temp); + num = PyLong_AsLong(temp); Py_XDECREF(temp); if (ISTERMINAL(num)) { /* @@ -881,6 +894,8 @@ build_node_tree(PyObject *tuple) encoding = PySequence_GetItem(tuple, 2); /* tuple isn't borrowed anymore here, need to DECREF */ tuple = PySequence_GetSlice(tuple, 0, 2); + if (tuple == NULL) + return NULL; } res = PyNode_New(num); if (res != NULL) { @@ -890,10 +905,17 @@ build_node_tree(PyObject *tuple) } if (res && encoding) { Py_ssize_t len; - len = PyString_GET_SIZE(encoding) + 1; - res->n_str = (char *)PyObject_MALLOC(len); - if (res->n_str != NULL) - (void) memcpy(res->n_str, PyString_AS_STRING(encoding), len); + const char *temp; + temp = _PyUnicode_AsStringAndSize(encoding, &len); + if (temp == NULL) { + Py_DECREF(res); + Py_DECREF(encoding); + Py_DECREF(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); Py_DECREF(encoding); Py_DECREF(tuple); } @@ -935,6 +957,7 @@ static int validate_terminal(node *terminal, int type, char *string); #define validate_doublestar(ch) validate_terminal(ch, DOUBLESTAR, "**") #define validate_dot(ch) validate_terminal(ch, DOT, ".") #define validate_at(ch) validate_terminal(ch, AT, "@") +#define validate_rarrow(ch) validate_terminal(ch, RARROW, "->") #define validate_name(ch, str) validate_terminal(ch, NAME, str) #define VALIDATER(n) static int validate_##n(node *tree) @@ -943,21 +966,22 @@ VALIDATER(node); VALIDATER(small_stmt); VALIDATER(class); VALIDATER(node); VALIDATER(parameters); VALIDATER(suite); VALIDATER(testlist); VALIDATER(varargslist); -VALIDATER(fpdef); VALIDATER(fplist); +VALIDATER(vfpdef); VALIDATER(stmt); VALIDATER(simple_stmt); VALIDATER(expr_stmt); VALIDATER(power); -VALIDATER(print_stmt); VALIDATER(del_stmt); -VALIDATER(return_stmt); VALIDATER(list_iter); -VALIDATER(raise_stmt); VALIDATER(import_stmt); -VALIDATER(import_name); VALIDATER(import_from); -VALIDATER(global_stmt); VALIDATER(list_if); -VALIDATER(assert_stmt); VALIDATER(list_for); -VALIDATER(exec_stmt); VALIDATER(compound_stmt); +VALIDATER(del_stmt); +VALIDATER(return_stmt); VALIDATER(raise_stmt); +VALIDATER(import_stmt); VALIDATER(import_stmt); +VALIDATER(import_name); VALIDATER(yield_stmt); +VALIDATER(global_stmt); VALIDATER(nonlocal_stmt); +VALIDATER(assert_stmt); +VALIDATER(compound_stmt); VALIDATER(test_or_star_expr); VALIDATER(while); VALIDATER(for); VALIDATER(try); VALIDATER(except_clause); VALIDATER(test); VALIDATER(and_test); VALIDATER(not_test); VALIDATER(comparison); -VALIDATER(comp_op); VALIDATER(expr); +VALIDATER(comp_op); +VALIDATER(star_expr); VALIDATER(expr); VALIDATER(xor_expr); VALIDATER(and_expr); VALIDATER(shift_expr); VALIDATER(arith_expr); VALIDATER(term); VALIDATER(factor); @@ -966,12 +990,11 @@ VALIDATER(trailer); VALIDATER(subscript); VALIDATER(subscriptlist); VALIDATER(sliceop); VALIDATER(exprlist); VALIDATER(dictorsetmaker); VALIDATER(arglist); VALIDATER(argument); -VALIDATER(listmaker); VALIDATER(yield_stmt); -VALIDATER(testlist1); VALIDATER(comp_for); +VALIDATER(comp_for); VALIDATER(comp_iter); VALIDATER(comp_if); VALIDATER(testlist_comp); VALIDATER(yield_expr); -VALIDATER(yield_or_testlist); VALIDATER(or_test); -VALIDATER(old_test); VALIDATER(old_lambdef); +VALIDATER(or_test); +VALIDATER(test_nocond); VALIDATER(lambdef_nocond); #undef VALIDATER @@ -1075,7 +1098,7 @@ validate_class(node *tree) if (res) { if (nch == 7) { res = ((validate_lparen(CHILD(tree, 2)) && - validate_testlist(CHILD(tree, 3)) && + validate_arglist(CHILD(tree, 3)) && validate_rparen(CHILD(tree, 4)))); } else if (nch == 6) { @@ -1192,77 +1215,130 @@ validate_testlist(node *tree) validate_test, "testlist")); } - static int -validate_testlist1(node *tree) +validate_testlist_star_expr(node *tl) { - return (validate_repeating_list(tree, testlist1, - validate_test, "testlist1")); + return (validate_repeating_list(tl, testlist_star_expr, validate_test_or_star_expr, + "testlist")); } +/* validate either vfpdef or tfpdef. + * vfpdef: NAME + * tfpdef: NAME [':' test] + */ static int -validate_testlist_safe(node *tree) +validate_vfpdef(node *tree) { - return (validate_repeating_list(tree, testlist_safe, - validate_old_test, "testlist_safe")); + int nch = NCH(tree); + if (TYPE(tree) == vfpdef) { + return nch == 1 && validate_name(CHILD(tree, 0), NULL); + } + else if (TYPE(tree) == tfpdef) { + if (nch == 1) { + return validate_name(CHILD(tree, 0), NULL); + } + else if (nch == 3) { + return validate_name(CHILD(tree, 0), NULL) && + validate_colon(CHILD(tree, 1)) && + validate_test(CHILD(tree, 2)); + } + } + return 0; } - -/* '*' NAME [',' '**' NAME] | '**' NAME +/* '*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef + * ..or tfpdef in place of vfpdef. vfpdef: NAME; tfpdef: NAME [':' test] */ static int validate_varargslist_trailer(node *tree, int start) { int nch = NCH(tree); int res = 0; - int sym; if (nch <= start) { err_string("expected variable argument trailer for varargslist"); return 0; } - sym = TYPE(CHILD(tree, start)); - if (sym == STAR) { + if (TYPE(CHILD(tree, start)) == STAR) { /* - * ('*' NAME [',' '**' NAME] + * '*' [vfpdef] */ - if (nch-start == 2) - res = validate_name(CHILD(tree, start+1), NULL); - else if (nch-start == 5) - res = (validate_name(CHILD(tree, start+1), NULL) - && validate_comma(CHILD(tree, start+2)) - && validate_doublestar(CHILD(tree, start+3)) - && validate_name(CHILD(tree, start+4), NULL)); - } - else if (sym == DOUBLESTAR) { + res = validate_star(CHILD(tree, start++)); + if (res && start < nch && (TYPE(CHILD(tree, start)) == vfpdef || + TYPE(CHILD(tree, start)) == tfpdef)) + res = validate_vfpdef(CHILD(tree, start++)); + /* + * (',' vfpdef ['=' test])* + */ + while (res && start + 1 < nch && ( + TYPE(CHILD(tree, start + 1)) == vfpdef || + TYPE(CHILD(tree, start + 1)) == tfpdef)) { + res = (validate_comma(CHILD(tree, start++)) + && validate_vfpdef(CHILD(tree, start++))); + if (res && start + 1 < nch && TYPE(CHILD(tree, start)) == EQUAL) + res = (validate_equal(CHILD(tree, start++)) + && validate_test(CHILD(tree, start++))); + } /* - * '**' NAME + * [',' '**' vfpdef] */ - if (nch-start == 2) - res = validate_name(CHILD(tree, start+1), NULL); + if (res && start + 2 < nch && TYPE(CHILD(tree, start+1)) == DOUBLESTAR) + res = (validate_comma(CHILD(tree, start++)) + && validate_doublestar(CHILD(tree, start++)) + && validate_vfpdef(CHILD(tree, start++))); + } + else if (TYPE(CHILD(tree, start)) == DOUBLESTAR) { + /* + * '**' vfpdef + */ + if (start + 1 < nch) + res = (validate_doublestar(CHILD(tree, start++)) + && validate_vfpdef(CHILD(tree, start++))); + else { + res = 0; + err_string("expected vfpdef after ** in varargslist trailer"); + } + } + else { + res = 0; + err_string("expected * or ** in varargslist trailer"); + } + + if (res && start != nch) { + res = 0; + err_string("unexpected extra children in varargslist trailer"); } - if (!res) - err_string("illegal variable argument trailer for varargslist"); return res; } -/* validate_varargslist() +/* validate_varargslist() + * + * Validate typedargslist or varargslist. * - * varargslist: - * (fpdef ['=' test] ',')* - * ('*' NAME [',' '**' NAME] - * | '**' NAME) - * | fpdef ['=' test] (',' fpdef ['=' test])* [','] + * typedargslist: ((tfpdef ['=' test] ',')* + * ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | + * '**' tfpdef) + * | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) + * tfpdef: NAME [':' test] + * varargslist: ((vfpdef ['=' test] ',')* + * ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | + * '**' vfpdef) + * | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) + * vfpdef: NAME * */ static int validate_varargslist(node *tree) { int nch = NCH(tree); - int res = validate_ntype(tree, varargslist) && (nch != 0); + int res = (TYPE(tree) == varargslist || + TYPE(tree) == typedargslist) && + (nch != 0); int sym; + node *ch; + int i = 0; if (!res) return 0; @@ -1270,107 +1346,35 @@ validate_varargslist(node *tree) err_string("varargslist missing child nodes"); return 0; } - sym = TYPE(CHILD(tree, 0)); - if (sym == STAR || sym == DOUBLESTAR) - /* whole thing matches: - * '*' NAME [',' '**' NAME] | '**' NAME - */ - res = validate_varargslist_trailer(tree, 0); - else if (sym == fpdef) { - int i = 0; - - sym = TYPE(CHILD(tree, nch-1)); - if (sym == NAME) { - /* - * (fpdef ['=' test] ',')+ - * ('*' NAME [',' '**' NAME] - * | '**' NAME) - */ - /* skip over (fpdef ['=' test] ',')+ */ - while (res && (i+2 <= nch)) { - res = validate_fpdef(CHILD(tree, i)); - ++i; - if (res && TYPE(CHILD(tree, i)) == EQUAL && (i+2 <= nch)) { - res = (validate_equal(CHILD(tree, i)) - && validate_test(CHILD(tree, i+1))); - if (res) - i += 2; - } - if (res && i < nch) { - res = validate_comma(CHILD(tree, i)); - ++i; - if (res && i < nch - && (TYPE(CHILD(tree, i)) == DOUBLESTAR - || TYPE(CHILD(tree, i)) == STAR)) - break; - } - } - /* ... '*' NAME [',' '**' NAME] | '**' NAME - * i --^^^ - */ - if (res) - res = validate_varargslist_trailer(tree, i); - } - else { - /* - * fpdef ['=' test] (',' fpdef ['=' test])* [','] - */ - /* strip trailing comma node */ - if (sym == COMMA) { - res = validate_comma(CHILD(tree, nch-1)); - if (!res) - return 0; - --nch; - } - /* - * fpdef ['=' test] (',' fpdef ['=' test])* - */ - res = validate_fpdef(CHILD(tree, 0)); + while (i < nch) { + ch = CHILD(tree, i); + sym = TYPE(ch); + if (sym == vfpdef || sym == tfpdef) { + /* validate (vfpdef ['=' test] ',')+ */ + res = validate_vfpdef(ch); ++i; if (res && (i+2 <= nch) && TYPE(CHILD(tree, i)) == EQUAL) { res = (validate_equal(CHILD(tree, i)) && validate_test(CHILD(tree, i+1))); - i += 2; + if (res) + i += 2; } - /* - * ... (',' fpdef ['=' test])* - * i ---^^^ - */ - while (res && (nch - i) >= 2) { - res = (validate_comma(CHILD(tree, i)) - && validate_fpdef(CHILD(tree, i+1))); - i += 2; - if (res && (nch - i) >= 2 && TYPE(CHILD(tree, i)) == EQUAL) { - res = (validate_equal(CHILD(tree, i)) - && validate_test(CHILD(tree, i+1))); - i += 2; - } - } - if (res && nch - i != 0) { - res = 0; - err_string("illegal formation for varargslist"); + if (res && i < nch) { + res = validate_comma(CHILD(tree, i)); + ++i; } + } else if (sym == DOUBLESTAR || sym == STAR) { + res = validate_varargslist_trailer(tree, i); + break; + } else { + res = 0; + err_string("illegal formation for varargslist"); } } return res; } -/* list_iter: list_for | list_if - */ -static int -validate_list_iter(node *tree) -{ - int res = (validate_ntype(tree, list_iter) - && validate_numnodes(tree, 1, "list_iter")); - if (res && TYPE(CHILD(tree, 0)) == list_for) - res = validate_list_for(CHILD(tree, 0)); - else - res = validate_list_if(CHILD(tree, 0)); - - return res; -} - /* comp_iter: comp_for | comp_if */ static int @@ -1386,28 +1390,6 @@ validate_comp_iter(node *tree) return res; } -/* list_for: 'for' exprlist 'in' testlist [list_iter] - */ -static int -validate_list_for(node *tree) -{ - int nch = NCH(tree); - int res; - - if (nch == 5) - res = validate_list_iter(CHILD(tree, 4)); - else - res = validate_numnodes(tree, 4, "list_for"); - - if (res) - res = (validate_name(CHILD(tree, 0), "for") - && validate_exprlist(CHILD(tree, 1)) - && validate_name(CHILD(tree, 2), "in") - && validate_testlist_safe(CHILD(tree, 3))); - - return res; -} - /* comp_for: 'for' exprlist 'in' test [comp_iter] */ static int @@ -1430,27 +1412,7 @@ validate_comp_for(node *tree) return res; } -/* list_if: 'if' old_test [list_iter] - */ -static int -validate_list_if(node *tree) -{ - int nch = NCH(tree); - int res; - - if (nch == 3) - res = validate_list_iter(CHILD(tree, 2)); - else - res = validate_numnodes(tree, 2, "list_if"); - - if (res) - res = (validate_name(CHILD(tree, 0), "if") - && validate_old_test(CHILD(tree, 1))); - - return res; -} - -/* comp_if: 'if' old_test [comp_iter] +/* comp_if: 'if' test_nocond [comp_iter] */ static int validate_comp_if(node *tree) @@ -1465,44 +1427,11 @@ validate_comp_if(node *tree) if (res) res = (validate_name(CHILD(tree, 0), "if") - && validate_old_test(CHILD(tree, 1))); + && validate_test_nocond(CHILD(tree, 1))); return res; } -/* validate_fpdef() - * - * fpdef: - * NAME - * | '(' fplist ')' - */ -static int -validate_fpdef(node *tree) -{ - int nch = NCH(tree); - int res = validate_ntype(tree, fpdef); - - if (res) { - if (nch == 1) - res = validate_ntype(CHILD(tree, 0), NAME); - else if (nch == 3) - res = (validate_lparen(CHILD(tree, 0)) - && validate_fplist(CHILD(tree, 1)) - && validate_rparen(CHILD(tree, 2))); - else - res = validate_numnodes(tree, 1, "fpdef"); - } - return (res); -} - - -static int -validate_fplist(node *tree) -{ - return (validate_repeating_list(tree, fplist, - validate_fpdef, "fplist")); -} - /* simple_stmt | compound_stmt * @@ -1563,14 +1492,13 @@ validate_small_stmt(node *tree) int ntype = TYPE(CHILD(tree, 0)); if ( (ntype == expr_stmt) - || (ntype == print_stmt) || (ntype == del_stmt) || (ntype == pass_stmt) || (ntype == flow_stmt) || (ntype == import_stmt) || (ntype == global_stmt) - || (ntype == assert_stmt) - || (ntype == exec_stmt)) + || (ntype == nonlocal_stmt) + || (ntype == assert_stmt)) res = validate_node(CHILD(tree, 0)); else { res = 0; @@ -1620,12 +1548,17 @@ validate_compound_stmt(node *tree) } static int -validate_yield_or_testlist(node *tree) +validate_yield_or_testlist(node *tree, int tse) { - if (TYPE(tree) == yield_expr) - return validate_yield_expr(tree); + if (TYPE(tree) == yield_expr) { + return validate_yield_expr(tree); + } + else { + if (tse) + return validate_testlist_star_expr(tree); else - return validate_testlist(tree); + return validate_testlist(tree); + } } static int @@ -1635,12 +1568,12 @@ validate_expr_stmt(node *tree) int nch = NCH(tree); int res = (validate_ntype(tree, expr_stmt) && is_odd(nch) - && validate_testlist(CHILD(tree, 0))); + && validate_testlist_star_expr(CHILD(tree, 0))); if (res && nch == 3 && TYPE(CHILD(tree, 1)) == augassign) { res = validate_numnodes(CHILD(tree, 1), 1, "augassign") - && validate_yield_or_testlist(CHILD(tree, 2)); + && validate_yield_or_testlist(CHILD(tree, 2), 0); if (res) { char *s = STR(CHILD(CHILD(tree, 1), 0)); @@ -1664,55 +1597,7 @@ validate_expr_stmt(node *tree) else { for (j = 1; res && (j < nch); j += 2) res = validate_equal(CHILD(tree, j)) - && validate_yield_or_testlist(CHILD(tree, j + 1)); - } - return (res); -} - - -/* print_stmt: - * - * 'print' ( [ test (',' test)* [','] ] - * | '>>' test [ (',' test)+ [','] ] ) - */ -static int -validate_print_stmt(node *tree) -{ - int nch = NCH(tree); - int res = (validate_ntype(tree, print_stmt) - && (nch > 0) - && validate_name(CHILD(tree, 0), "print")); - - if (res && nch > 1) { - int sym = TYPE(CHILD(tree, 1)); - int i = 1; - int allow_trailing_comma = 1; - - if (sym == test) - res = validate_test(CHILD(tree, i++)); - else { - if (nch < 3) - res = validate_numnodes(tree, 3, "print_stmt"); - else { - res = (validate_ntype(CHILD(tree, i), RIGHTSHIFT) - && validate_test(CHILD(tree, i+1))); - i += 2; - allow_trailing_comma = 0; - } - } - if (res) { - /* ... (',' test)* [','] */ - while (res && i+2 <= nch) { - res = (validate_comma(CHILD(tree, i)) - && validate_test(CHILD(tree, i+1))); - allow_trailing_comma = 1; - i += 2; - } - if (res && !allow_trailing_comma) - res = validate_numnodes(tree, i, "print_stmt"); - else if (res && i < nch) - res = validate_comma(CHILD(tree, i)); - } + && validate_yield_or_testlist(CHILD(tree, j + 1), 1); } return (res); } @@ -1742,31 +1627,30 @@ validate_return_stmt(node *tree) } +/* + * raise_stmt: + * + * 'raise' [test ['from' test]] + */ static int validate_raise_stmt(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, raise_stmt) - && ((nch == 1) || (nch == 2) || (nch == 4) || (nch == 6))); + && ((nch == 1) || (nch == 2) || (nch == 4))); + + if (!res && !PyErr_Occurred()) + (void) validate_numnodes(tree, 2, "raise"); if (res) { res = validate_name(CHILD(tree, 0), "raise"); if (res && (nch >= 2)) res = validate_test(CHILD(tree, 1)); - if (res && nch > 2) { - res = (validate_comma(CHILD(tree, 2)) + if (res && (nch == 4)) { + res = (validate_name(CHILD(tree, 2), "from") && validate_test(CHILD(tree, 3))); - if (res && (nch > 4)) - res = (validate_comma(CHILD(tree, 4)) - && validate_test(CHILD(tree, 5))); } } - else - (void) validate_numnodes(tree, 2, "raise"); - if (res && (nch == 4)) - res = (validate_comma(CHILD(tree, 2)) - && validate_test(CHILD(tree, 3))); - return (res); } @@ -1902,17 +1786,17 @@ validate_import_name(node *tree) && validate_dotted_as_names(CHILD(tree, 1))); } -/* Helper function to count the number of leading dots in +/* Helper function to count the number of leading dots (or ellipsis tokens) in * 'from ...module import name' */ static int count_from_dots(node *tree) { - int i; - for (i = 1; i < NCH(tree); i++) - if (TYPE(CHILD(tree, i)) != DOT) - break; - return i-1; + int i; + for (i = 1; i < NCH(tree); i++) + if (TYPE(CHILD(tree, i)) != DOT && TYPE(CHILD(tree, i)) != ELLIPSIS) + break; + return i - 1; } /* import_from: ('from' ('.'* dotted_name | '.'+) @@ -1970,8 +1854,10 @@ validate_import_stmt(node *tree) } - - +/* global_stmt: + * + * 'global' NAME (',' NAME)* + */ static int validate_global_stmt(node *tree) { @@ -1993,32 +1879,30 @@ validate_global_stmt(node *tree) return (res); } - -/* exec_stmt: +/* nonlocal_stmt: * - * 'exec' expr ['in' test [',' test]] + * 'nonlocal' NAME (',' NAME)* */ static int -validate_exec_stmt(node *tree) +validate_nonlocal_stmt(node *tree) { + int j; int nch = NCH(tree); - int res = (validate_ntype(tree, exec_stmt) - && ((nch == 2) || (nch == 4) || (nch == 6)) - && validate_name(CHILD(tree, 0), "exec") - && validate_expr(CHILD(tree, 1))); + int res = (validate_ntype(tree, nonlocal_stmt) + && is_even(nch) && (nch >= 2)); if (!res && !PyErr_Occurred()) - err_string("illegal exec statement"); - if (res && (nch > 2)) - res = (validate_name(CHILD(tree, 2), "in") - && validate_test(CHILD(tree, 3))); - if (res && (nch == 6)) - res = (validate_comma(CHILD(tree, 4)) - && validate_test(CHILD(tree, 5))); + err_string("illegal nonlocal statement"); - return (res); -} + if (res) + res = (validate_name(CHILD(tree, 0), "nonlocal") + && validate_ntype(CHILD(tree, 1), NAME)); + for (j = 2; res && (j < nch); j += 2) + res = (validate_comma(CHILD(tree, j)) + && validate_ntype(CHILD(tree, j + 1), NAME)); + return res; +} /* assert_stmt: * @@ -2156,13 +2040,10 @@ validate_except_clause(node *tree) if (res && (nch > 1)) res = validate_test(CHILD(tree, 1)); - if (res && (nch == 4)) { - if (TYPE(CHILD(tree, 2)) == NAME) - res = validate_name(CHILD(tree, 2), "as"); - else - res = validate_comma(CHILD(tree, 2)); - res = res && validate_test(CHILD(tree, 3)); - } + if (res && (nch == 4)) + res = (validate_name(CHILD(tree, 2), "as") + && validate_ntype(CHILD(tree, 3), NAME)); + return (res); } @@ -2188,13 +2069,13 @@ validate_test(node *tree) } static int -validate_old_test(node *tree) +validate_test_nocond(node *tree) { int nch = NCH(tree); - int res = validate_ntype(tree, old_test) && (nch == 1); + int res = validate_ntype(tree, test_nocond) && (nch == 1); - if (res && (TYPE(CHILD(tree, 0)) == old_lambdef)) - res = (validate_old_lambdef(CHILD(tree, 0))); + if (res && (TYPE(CHILD(tree, 0)) == lambdef_nocond)) + res = (validate_lambdef_nocond(CHILD(tree, 0))); else if (res) { res = (validate_or_test(CHILD(tree, 0))); } @@ -2321,6 +2202,18 @@ validate_comp_op(node *tree) static int +validate_star_expr(node *tree) +{ + int res = validate_ntype(tree, star_expr); + if (!res) return res; + if (!validate_numnodes(tree, 2, "star_expr")) + return 0; + return validate_ntype(CHILD(tree, 0), STAR) && \ + validate_expr(CHILD(tree, 1)); +} + + +static int validate_expr(node *tree) { int j; @@ -2499,7 +2392,7 @@ validate_atom(node *tree) if (nch == 2) res = validate_ntype(CHILD(tree, 1), RSQB); else if (nch == 3) - res = (validate_listmaker(CHILD(tree, 1)) + res = (validate_testlist_comp(CHILD(tree, 1)) && validate_ntype(CHILD(tree, 2), RSQB)); else { res = 0; @@ -2513,13 +2406,9 @@ validate_atom(node *tree) if (res && (nch == 3)) res = validate_dictorsetmaker(CHILD(tree, 1)); break; - case BACKQUOTE: - res = ((nch == 3) - && validate_testlist1(CHILD(tree, 1)) - && validate_ntype(CHILD(tree, 2), BACKQUOTE)); - break; case NAME: case NUMBER: + case ELLIPSIS: res = (nch == 1); break; case STRING: @@ -2535,43 +2424,6 @@ validate_atom(node *tree) } -/* listmaker: - * test ( list_for | (',' test)* [','] ) - */ -static int -validate_listmaker(node *tree) -{ - int nch = NCH(tree); - int ok = nch; - - if (nch == 0) - err_string("missing child nodes of listmaker"); - else - ok = validate_test(CHILD(tree, 0)); - - /* - * list_for | (',' test)* [','] - */ - if (nch == 2 && TYPE(CHILD(tree, 1)) == list_for) - ok = validate_list_for(CHILD(tree, 1)); - else { - /* (',' test)* [','] */ - int i = 1; - while (ok && nch - i >= 2) { - ok = (validate_comma(CHILD(tree, i)) - && validate_test(CHILD(tree, i+1))); - i += 2; - } - if (ok && i == nch-1) - ok = validate_comma(CHILD(tree, i)); - else if (i != nch) { - ok = 0; - err_string("illegal trailing nodes for listmaker"); - } - } - return ok; -} - /* testlist_comp: * test ( comp_for | (',' test)* [','] ) */ @@ -2584,7 +2436,7 @@ validate_testlist_comp(node *tree) if (nch == 0) err_string("missing child nodes of testlist_comp"); else { - ok = validate_test(CHILD(tree, 0)); + ok = validate_test_or_star_expr(CHILD(tree, 0)); } /* @@ -2597,7 +2449,7 @@ validate_testlist_comp(node *tree) int i = 1; while (ok && nch - i >= 2) { ok = (validate_comma(CHILD(tree, i)) - && validate_test(CHILD(tree, i+1))); + && validate_test_or_star_expr(CHILD(tree, i+1))); i += 2; } if (ok && i == nch-1) @@ -2686,23 +2538,36 @@ validate_with_stmt(node *tree) return ok; } -/* funcdef: - * - * -5 -4 -3 -2 -1 - * 'def' NAME parameters ':' suite - */ +/* funcdef: 'def' NAME parameters ['->' test] ':' suite */ + static int validate_funcdef(node *tree) { int nch = NCH(tree); - int ok = (validate_ntype(tree, funcdef) - && (nch == 5) - && validate_name(RCHILD(tree, -5), "def") - && validate_ntype(RCHILD(tree, -4), NAME) - && validate_colon(RCHILD(tree, -2)) - && validate_parameters(RCHILD(tree, -3)) - && validate_suite(RCHILD(tree, -1))); - return ok; + int res = validate_ntype(tree, funcdef); + if (res) { + if (nch == 5) { + res = (validate_name(CHILD(tree, 0), "def") + && validate_ntype(CHILD(tree, 1), NAME) + && validate_parameters(CHILD(tree, 2)) + && validate_colon(CHILD(tree, 3)) + && validate_suite(CHILD(tree, 4))); + } + else if (nch == 7) { + res = (validate_name(CHILD(tree, 0), "def") + && validate_ntype(CHILD(tree, 1), NAME) + && validate_parameters(CHILD(tree, 2)) + && validate_rarrow(CHILD(tree, 3)) + && validate_test(CHILD(tree, 4)) + && validate_colon(CHILD(tree, 5)) + && validate_suite(CHILD(tree, 6))); + } + else { + res = 0; + err_string("illegal number of children for funcdef"); + } + } + return res; } @@ -2743,10 +2608,10 @@ validate_lambdef(node *tree) static int -validate_old_lambdef(node *tree) +validate_lambdef_nocond(node *tree) { int nch = NCH(tree); - int res = (validate_ntype(tree, old_lambdef) + int res = (validate_ntype(tree, lambdef_nocond) && ((nch == 3) || (nch == 4)) && validate_name(CHILD(tree, 0), "lambda") && validate_colon(CHILD(tree, nch - 2)) @@ -2755,7 +2620,7 @@ validate_old_lambdef(node *tree) if (res && (nch == 4)) res = validate_varargslist(CHILD(tree, 1)); else if (!res && !PyErr_Occurred()) - (void) validate_numnodes(tree, 3, "old_lambdef"); + (void) validate_numnodes(tree, 3, "lambdef_nocond"); return (res); } @@ -2992,91 +2857,115 @@ validate_sliceop(node *tree) static int +validate_test_or_star_expr(node *n) +{ + if (TYPE(n) == test) + return validate_test(n); + return validate_star_expr(n); +} + +static int +validate_expr_or_star_expr(node *n) +{ + if (TYPE(n) == expr) + return validate_expr(n); + return validate_star_expr(n); +} + + +static int validate_exprlist(node *tree) { return (validate_repeating_list(tree, exprlist, - validate_expr, "exprlist")); + validate_expr_or_star_expr, "exprlist")); } - /* - * dictorsetmaker: + * dictorsetmaker: * - * (test ':' test (comp_for | (',' test ':' test)* [','])) | - * (test (comp_for | (',' test)* [','])) + * (test ':' test (comp_for | (',' test ':' test)* [','])) | + * (test (comp_for | (',' test)* [','])) */ static int validate_dictorsetmaker(node *tree) { int nch = NCH(tree); - int ok = validate_ntype(tree, dictorsetmaker); + int res; int i = 0; - int check_trailing_comma = 0; - assert(nch > 0); + res = validate_ntype(tree, dictorsetmaker); + if (!res) + return 0; - if (ok && (nch == 1 || TYPE(CHILD(tree, 1)) == COMMA)) { - /* We got a set: - * test (',' test)* [','] - */ - ok = validate_test(CHILD(tree, i++)); - while (ok && nch - i >= 2) { - ok = (validate_comma(CHILD(tree, i)) - && validate_test(CHILD(tree, i+1))); - i += 2; - } - check_trailing_comma = 1; - } - else if (ok && TYPE(CHILD(tree, 1)) == comp_for) { - /* We got a set comprehension: - * test comp_for - */ - ok = (validate_test(CHILD(tree, 0)) - && validate_comp_for(CHILD(tree, 1))); + if (nch - i < 1) { + (void) validate_numnodes(tree, 1, "dictorsetmaker"); + return 0; } - else if (ok && NCH(tree) > 3 && TYPE(CHILD(tree, 3)) == comp_for) { - /* We got a dict comprehension: - * test ':' test comp_for - */ - ok = (validate_test(CHILD(tree, 0)) - && validate_colon(CHILD(tree, 1)) - && validate_test(CHILD(tree, 2)) - && validate_comp_for(CHILD(tree, 3))); - } - else if (ok) { - /* We got a dict: - * test ':' test (',' test ':' test)* [','] - */ - if (nch >= 3) { - ok = (validate_test(CHILD(tree, i)) - && validate_colon(CHILD(tree, i+1)) - && validate_test(CHILD(tree, i+2))); - i += 3; + + res = validate_test(CHILD(tree, i++)); + if (!res) + return 0; + + if (nch - i >= 2 && TYPE(CHILD(tree, i)) == COLON) { + /* Dictionary display or dictionary comprehension. */ + res = (validate_colon(CHILD(tree, i++)) + && validate_test(CHILD(tree, i++))); + if (!res) + return 0; + + if (nch - i >= 1 && TYPE(CHILD(tree, i)) == comp_for) { + /* Dictionary comprehension. */ + res = validate_comp_for(CHILD(tree, i++)); + if (!res) + return 0; } else { - ok = 0; - err_string("illegal number of nodes for dictorsetmaker"); - } - - while (ok && nch - i >= 4) { - ok = (validate_comma(CHILD(tree, i)) - && validate_test(CHILD(tree, i+1)) - && validate_colon(CHILD(tree, i+2)) - && validate_test(CHILD(tree, i+3))); - i += 4; + /* Dictionary display. */ + while (nch - i >= 4) { + res = (validate_comma(CHILD(tree, i++)) + && validate_test(CHILD(tree, i++)) + && validate_colon(CHILD(tree, i++)) + && validate_test(CHILD(tree, i++))); + if (!res) + return 0; + } + if (nch - i == 1) { + res = validate_comma(CHILD(tree, i++)); + if (!res) + return 0; + } } - check_trailing_comma = 1; } - if (ok && check_trailing_comma) { - if (i == nch-1) - ok = validate_comma(CHILD(tree, i)); - else if (i != nch) { - ok = 0; - err_string("illegal trailing nodes for dictorsetmaker"); + else { + /* Set display or set comprehension. */ + if (nch - i >= 1 && TYPE(CHILD(tree, i)) == comp_for) { + /* Set comprehension. */ + res = validate_comp_for(CHILD(tree, i++)); + if (!res) + return 0; + } + else { + /* Set display. */ + while (nch - i >= 2) { + res = (validate_comma(CHILD(tree, i++)) + && validate_test(CHILD(tree, i++))); + if (!res) + return 0; + } + if (nch - i == 1) { + res = validate_comma(CHILD(tree, i++)); + if (!res) + return 0; + } } } - return ok; + if (nch - i > 0) { + err_string("Illegal trailing nodes for dictorsetmaker."); + return 0; + } + + return 1; } @@ -3132,8 +3021,8 @@ validate_node(node *tree) break; case small_stmt: /* - * expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt - * | import_stmt | global_stmt | exec_stmt | assert_stmt + * expr_stmt | del_stmt | pass_stmt | flow_stmt | + * import_stmt | global_stmt | nonlocal_stmt | assert_stmt */ res = validate_small_stmt(tree); break; @@ -3167,9 +3056,6 @@ validate_node(node *tree) case expr_stmt: res = validate_expr_stmt(tree); break; - case print_stmt: - res = validate_print_stmt(tree); - break; case del_stmt: res = validate_del_stmt(tree); break; @@ -3203,8 +3089,8 @@ validate_node(node *tree) case global_stmt: res = validate_global_stmt(tree); break; - case exec_stmt: - res = validate_exec_stmt(tree); + case nonlocal_stmt: + res = validate_nonlocal_stmt(tree); break; case assert_stmt: res = validate_assert_stmt(tree); @@ -3233,9 +3119,6 @@ validate_node(node *tree) case yield_expr: res = validate_yield_expr(tree); break; - case testlist1: - res = validate_testlist1(tree); - break; case test: res = validate_test(tree); break; @@ -3388,12 +3271,6 @@ parser__pickler(PyObject *self, PyObject *args) * inheritance. */ static PyMethodDef parser_functions[] = { - {"ast2tuple", (PyCFunction)parser_ast2tuple, PUBLIC_METHOD_TYPE, - PyDoc_STR("Creates a tuple-tree representation of an ST.")}, - {"ast2list", (PyCFunction)parser_ast2list, PUBLIC_METHOD_TYPE, - PyDoc_STR("Creates a list-tree representation of an ST.")}, - {"compileast", (PyCFunction)parser_compileast,PUBLIC_METHOD_TYPE, - PyDoc_STR("Compiles an ST object into a code object.")}, {"compilest", (PyCFunction)parser_compilest, PUBLIC_METHOD_TYPE, PyDoc_STR("Compiles an ST object into a code object.")}, {"expr", (PyCFunction)parser_expr, PUBLIC_METHOD_TYPE, @@ -3404,16 +3281,12 @@ static PyMethodDef parser_functions[] = { PyDoc_STR("Determines if an ST object was created from a suite.")}, {"suite", (PyCFunction)parser_suite, PUBLIC_METHOD_TYPE, PyDoc_STR("Creates an ST object from a suite.")}, - {"sequence2ast", (PyCFunction)parser_tuple2ast, PUBLIC_METHOD_TYPE, - PyDoc_STR("Creates an ST object from a tree representation.")}, {"sequence2st", (PyCFunction)parser_tuple2st, PUBLIC_METHOD_TYPE, PyDoc_STR("Creates an ST object from a tree representation.")}, {"st2tuple", (PyCFunction)parser_st2tuple, PUBLIC_METHOD_TYPE, PyDoc_STR("Creates a tuple-tree representation of an ST.")}, {"st2list", (PyCFunction)parser_st2list, PUBLIC_METHOD_TYPE, PyDoc_STR("Creates a list-tree representation of an ST.")}, - {"tuple2ast", (PyCFunction)parser_tuple2ast, PUBLIC_METHOD_TYPE, - PyDoc_STR("Creates an ST object from a tree representation.")}, {"tuple2st", (PyCFunction)parser_tuple2st, PUBLIC_METHOD_TYPE, PyDoc_STR("Creates an ST object from a tree representation.")}, @@ -3425,37 +3298,48 @@ static PyMethodDef parser_functions[] = { }; -PyMODINIT_FUNC initparser(void); /* supply a prototype */ + +static struct PyModuleDef parsermodule = { + PyModuleDef_HEAD_INIT, + "parser", + NULL, + -1, + parser_functions, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC PyInit_parser(void); /* supply a prototype */ PyMODINIT_FUNC -initparser(void) +PyInit_parser(void) { PyObject *module, *copyreg; - Py_TYPE(&PyST_Type) = &PyType_Type; - module = Py_InitModule("parser", parser_functions); + if (PyType_Ready(&PyST_Type) < 0) + return NULL; + module = PyModule_Create(&parsermodule); if (module == NULL) - return; + return NULL; if (parser_error == 0) parser_error = PyErr_NewException("parser.ParserError", NULL, NULL); if (parser_error == 0) - /* caller will check PyErr_Occurred() */ - return; + return NULL; /* CAUTION: The code next used to skip bumping the refcount on - * parser_error. That's a disaster if initparser() gets called more + * parser_error. That's a disaster if PyInit_parser() gets called more * than once. By incref'ing, we ensure that each module dict that * gets created owns its reference to the shared parser_error object, * and the file static parser_error vrbl owns a reference too. */ Py_INCREF(parser_error); if (PyModule_AddObject(module, "ParserError", parser_error) != 0) - return; + return NULL; Py_INCREF(&PyST_Type); - PyModule_AddObject(module, "ASTType", (PyObject*)&PyST_Type); - Py_INCREF(&PyST_Type); PyModule_AddObject(module, "STType", (PyObject*)&PyST_Type); PyModule_AddStringConstant(module, "__copyright__", @@ -3469,7 +3353,7 @@ initparser(void) * If this fails, the import of this module will fail because an * exception will be raised here; should we clear the exception? */ - copyreg = PyImport_ImportModuleNoBlock("copy_reg"); + copyreg = PyImport_ImportModuleNoBlock("copyreg"); if (copyreg != NULL) { PyObject *func, *pickler; @@ -3490,4 +3374,5 @@ initparser(void) Py_XDECREF(pickler); Py_DECREF(copyreg); } + return module; } diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 21a6739d217..0d2919b84e0 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -26,7 +26,6 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structseq.h" #if defined(__VMS) # include <unixio.h> @@ -42,10 +41,6 @@ standardized by the C Standard and the POSIX standard (a thinly\n\ disguised Unix interface). Refer to the library manual and\n\ corresponding Unix manual entries for more information on calls."); -#ifndef Py_USING_UNICODE -/* This is used in signatures of functions. */ -#define Py_UNICODE void -#endif #if defined(PYOS_OS2) #define INCL_DOS @@ -94,6 +89,10 @@ corresponding Unix manual entries for more information on calls."); #include <sys/loadavg.h> #endif +#ifdef HAVE_LANGINFO_H +#include <langinfo.h> +#endif + /* 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) @@ -114,16 +113,16 @@ corresponding Unix manual entries for more information on calls."); #define HAVE_GETCWD 1 #define HAVE_OPENDIR 1 #define HAVE_PIPE 1 -#define HAVE_POPEN 1 #define HAVE_SYSTEM 1 #define HAVE_WAIT 1 #else #ifdef _MSC_VER /* Microsoft compiler */ #define HAVE_GETCWD 1 +#define HAVE_GETPPID 1 +#define HAVE_GETLOGIN 1 #define HAVE_SPAWNV 1 #define HAVE_EXECV 1 #define HAVE_PIPE 1 -#define HAVE_POPEN 1 #define HAVE_SYSTEM 1 #define HAVE_CWAIT 1 #define HAVE_FSYNC 1 @@ -147,9 +146,6 @@ corresponding Unix manual entries for more information on calls."); #define HAVE_KILL 1 #define HAVE_OPENDIR 1 #define HAVE_PIPE 1 -#ifndef __rtems__ -#define HAVE_POPEN 1 -#endif #define HAVE_SYSTEM 1 #define HAVE_WAIT 1 #define HAVE_TTYNAME 1 @@ -202,7 +198,6 @@ extern int link(const char *, const char *); extern int rename(const char *, const char *); extern int stat(const char *, struct stat *); extern int unlink(const char *); -extern int pclose(FILE *); #ifdef HAVE_SYMLINK extern int symlink(const char *, const char *); #endif /* HAVE_SYMLINK */ @@ -266,12 +261,24 @@ extern int lstat(const char *, struct stat *); #ifdef HAVE_PROCESS_H #include <process.h> #endif +#ifndef VOLUME_NAME_DOS +#define VOLUME_NAME_DOS 0x0 +#endif +#ifndef VOLUME_NAME_NT +#define VOLUME_NAME_NT 0x2 +#endif +#ifndef IO_REPARSE_TAG_SYMLINK +#define IO_REPARSE_TAG_SYMLINK (0xA000000CL) +#endif #include "osdefs.h" #include <malloc.h> #include <windows.h> #include <shellapi.h> /* for ShellExecute() */ -#define popen _popen -#define pclose _pclose +#include <lmcons.h> /* for UNLEN */ +#ifdef SE_CREATE_SYMBOLIC_LINK_NAME /* Available starting with Vista */ +#define HAVE_SYMLINK +static int win32_can_symlink = 0; +#endif #endif /* _MSC_VER */ #if defined(PYCC_VACPP) && defined(PYOS_OS2) @@ -309,31 +316,24 @@ extern int lstat(const char *, struct stat *); #define WAIT_STATUS_INT(s) (s) #endif /* UNION_WAIT */ -/* Issue #1983: pid_t can be longer than a C long on some systems */ -#if !defined(SIZEOF_PID_T) || SIZEOF_PID_T == SIZEOF_INT -#define PARSE_PID "i" -#define PyLong_FromPid PyInt_FromLong -#define PyLong_AsPid PyInt_AsLong -#elif SIZEOF_PID_T == SIZEOF_LONG -#define PARSE_PID "l" -#define PyLong_FromPid PyInt_FromLong -#define PyLong_AsPid PyInt_AsLong -#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG -#define PARSE_PID "L" -#define PyLong_FromPid PyLong_FromLongLong -#define PyLong_AsPid PyInt_AsLongLong -#else -#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)" -#endif /* SIZEOF_PID_T */ - /* Don't use the "_r" form if we don't need it (also, won't have a prototype for it, at least on Solaris -- maybe others as well?). */ #if defined(HAVE_CTERMID_R) && defined(WITH_THREAD) #define USE_CTERMID_R #endif -#if defined(HAVE_TMPNAM_R) && defined(WITH_THREAD) -#define USE_TMPNAM_R +/* choose the appropriate stat and fstat functions and return structs */ +#undef STAT +#undef FSTAT +#undef STRUCT_STAT +#if defined(MS_WIN64) || defined(MS_WINDOWS) +# define STAT win32_stat +# define FSTAT win32_fstat +# define STRUCT_STAT struct win32_stat +#else +# define STAT stat +# define FSTAT fstat +# define STRUCT_STAT struct stat #endif #if defined(MAJOR_IN_MKDEV) @@ -391,7 +391,7 @@ _PyVerify_fd(int fd) const int i1 = fd >> IOINFO_L2E; const int i2 = fd & ((1 << IOINFO_L2E) - 1); - static int sizeof_ioinfo = 0; + static size_t sizeof_ioinfo = 0; /* Determine the actual size of the ioinfo structure, * as used by the CRT loaded in memory @@ -440,6 +440,66 @@ _PyVerify_fd_dup2(int fd1, int fd2) #define _PyVerify_fd_dup2(A, B) (1) #endif +#ifdef MS_WINDOWS +/* The following structure was copied from + http://msdn.microsoft.com/en-us/library/ms791514.aspx as the required + include doesn't seem to be present in the Windows SDK (at least as included + with Visual Studio Express). */ +typedef struct _REPARSE_DATA_BUFFER { + ULONG ReparseTag; + USHORT ReparseDataLength; + USHORT Reserved; + union { + struct { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + ULONG Flags; + WCHAR PathBuffer[1]; + } SymbolicLinkReparseBuffer; + + struct { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + WCHAR PathBuffer[1]; + } MountPointReparseBuffer; + + struct { + UCHAR DataBuffer[1]; + } GenericReparseBuffer; + }; +} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; + +#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER,\ + GenericReparseBuffer) +#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 ) + +static int +win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag) +{ + char target_buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; + REPARSE_DATA_BUFFER *rdb = (REPARSE_DATA_BUFFER *)target_buffer; + DWORD n_bytes_returned; + + if (0 == DeviceIoControl( + reparse_point_handle, + FSCTL_GET_REPARSE_POINT, + NULL, 0, /* in buffer */ + target_buffer, sizeof(target_buffer), + &n_bytes_returned, + NULL)) /* we're not using OVERLAPPED_IO */ + return FALSE; + + if (reparse_tag) + *reparse_tag = rdb->ReparseTag; + + return TRUE; +} +#endif /* MS_WINDOWS */ + /* Return a dictionary corresponding to the POSIX environment table */ #ifdef WITH_NEXT_FRAMEWORK /* On Darwin/MacOSX a shared library or framework has no access to @@ -455,11 +515,16 @@ static PyObject * convertenviron(void) { PyObject *d; +#ifdef MS_WINDOWS + wchar_t **e; +#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) return NULL; @@ -467,6 +532,38 @@ convertenviron(void) if (environ == NULL) environ = *_NSGetEnviron(); #endif +#ifdef MS_WINDOWS + /* _wenviron must be initialized in this way if the program is started + through main() instead of wmain(). */ + _wgetenv(L""); + if (_wenviron == NULL) + return d; + /* This part ignores errors */ + for (e = _wenviron; *e != NULL; e++) { + PyObject *k; + PyObject *v; + wchar_t *p = wcschr(*e, L'='); + if (p == NULL) + continue; + k = PyUnicode_FromWideChar(*e, (Py_ssize_t)(p-*e)); + if (k == NULL) { + PyErr_Clear(); + continue; + } + v = PyUnicode_FromWideChar(p+1, wcslen(p+1)); + if (v == NULL) { + PyErr_Clear(); + Py_DECREF(k); + continue; + } + if (PyDict_GetItem(d, k) == NULL) { + if (PyDict_SetItem(d, k, v) != 0) + PyErr_Clear(); + } + Py_DECREF(k); + Py_DECREF(v); + } +#else if (environ == NULL) return d; /* This part ignores errors */ @@ -476,12 +573,12 @@ convertenviron(void) char *p = strchr(*e, '='); if (p == NULL) continue; - k = PyString_FromStringAndSize(*e, (int)(p-*e)); + k = PyBytes_FromStringAndSize(*e, (int)(p-*e)); if (k == NULL) { PyErr_Clear(); continue; } - v = PyString_FromString(p+1); + v = PyBytes_FromStringAndSize(p+1, strlen(p+1)); if (v == NULL) { PyErr_Clear(); Py_DECREF(k); @@ -494,24 +591,24 @@ convertenviron(void) Py_DECREF(k); 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 = PyString_FromString(buffer); - PyDict_SetItemString(d, "BEGINLIBPATH", v); + 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 = PyString_FromString(buffer); - PyDict_SetItemString(d, "ENDLIBPATH", v); + PyObject *v = PyBytes_FromString(buffer); + PyDict_SetItemString(d, "ENDLIBPATH", v); Py_DECREF(v); } #endif return d; } - /* Set a POSIX-specific error from errno, and return NULL */ static PyObject * @@ -525,29 +622,26 @@ posix_error_with_filename(char* name) return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); } -#ifdef MS_WINDOWS -static PyObject * -posix_error_with_unicode_filename(Py_UNICODE* name) -{ - return PyErr_SetFromErrnoWithUnicodeFilename(PyExc_OSError, name); -} -#endif /* MS_WINDOWS */ - static PyObject * -posix_error_with_allocated_filename(char* name) +posix_error_with_allocated_filename(PyObject* name) { - PyObject *rc = PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); - PyMem_Free(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 * -win32_error(char* function, char* filename) +win32_error(char* function, const char* filename) { /* XXX We should pass the function name along in the future. - (_winreg.c also wants to pass the function name.) + (winreg.c also wants to pass the function name.) This would however require an additional param to the Windows error object, which is non-trivial. */ @@ -689,17 +783,19 @@ posix_fildes(PyObject *fdobj, int (*func)(int)) static PyObject * posix_1str(PyObject *args, char *format, int (*func)(const char*)) { - char *path1 = NULL; + PyObject *opath1 = NULL; + char *path1; int res; if (!PyArg_ParseTuple(args, format, - Py_FileSystemDefaultEncoding, &path1)) + PyUnicode_FSConverter, &opath1)) return NULL; + path1 = PyBytes_AsString(opath1); Py_BEGIN_ALLOW_THREADS res = (*func)(path1); Py_END_ALLOW_THREADS if (res < 0) - return posix_error_with_allocated_filename(path1); - PyMem_Free(path1); + return posix_error_with_allocated_filename(opath1); + Py_DECREF(opath1); Py_INCREF(Py_None); return Py_None; } @@ -709,17 +805,21 @@ posix_2str(PyObject *args, char *format, int (*func)(const char *, const char *)) { - char *path1 = NULL, *path2 = NULL; + PyObject *opath1 = NULL, *opath2 = NULL; + char *path1, *path2; int res; if (!PyArg_ParseTuple(args, format, - Py_FileSystemDefaultEncoding, &path1, - Py_FileSystemDefaultEncoding, &path2)) + PyUnicode_FSConverter, &opath1, + PyUnicode_FSConverter, &opath2)) { return NULL; + } + path1 = PyBytes_AsString(opath1); + path2 = PyBytes_AsString(opath2); Py_BEGIN_ALLOW_THREADS res = (*func)(path1, path2); Py_END_ALLOW_THREADS - PyMem_Free(path1); - PyMem_Free(path2); + Py_DECREF(opath1); + Py_DECREF(opath2); if (res != 0) /* XXX how to report both path1 and path2??? */ return posix_error(); @@ -826,20 +926,6 @@ win32_wchdir(LPCWSTR path) } #endif -/* choose the appropriate stat and fstat functions and return structs */ -#undef STAT -#undef FSTAT -#undef STRUCT_STAT -#if defined(MS_WIN64) || defined(MS_WINDOWS) -# define STAT win32_stat -# define FSTAT win32_fstat -# define STRUCT_STAT struct win32_stat -#else -# define STAT stat -# define FSTAT fstat -# define STRUCT_STAT struct stat -#endif - #ifdef MS_WINDOWS /* The CRT of Windows has a number of flaws wrt. its stat() implementation: - time stamps are restricted to second resolution @@ -910,7 +996,7 @@ attributes_to_mode(DWORD attr) } static int -attribute_data_to_stat(WIN32_FILE_ATTRIBUTE_DATA *info, struct win32_stat *result) +attribute_data_to_stat(BY_HANDLE_FILE_INFORMATION *info, ULONG reparse_tag, struct win32_stat *result) { memset(result, 0, sizeof(*result)); result->st_mode = attributes_to_mode(info->dwFileAttributes); @@ -918,12 +1004,20 @@ attribute_data_to_stat(WIN32_FILE_ATTRIBUTE_DATA *info, struct win32_stat *resul 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); + result->st_nlink = info->nNumberOfLinks; + 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); + /* now set the bits that make this a symlink */ + result->st_mode |= 0120000; + } return 0; } static BOOL -attributes_from_dir(LPCSTR pszFile, LPWIN32_FILE_ATTRIBUTE_DATA pfad) +attributes_from_dir(LPCSTR pszFile, BY_HANDLE_FILE_INFORMATION *info, ULONG *reparse_tag) { HANDLE hFindFile; WIN32_FIND_DATAA FileData; @@ -931,17 +1025,22 @@ attributes_from_dir(LPCSTR pszFile, LPWIN32_FILE_ATTRIBUTE_DATA pfad) if (hFindFile == INVALID_HANDLE_VALUE) return FALSE; FindClose(hFindFile); - pfad->dwFileAttributes = FileData.dwFileAttributes; - pfad->ftCreationTime = FileData.ftCreationTime; - pfad->ftLastAccessTime = FileData.ftLastAccessTime; - pfad->ftLastWriteTime = FileData.ftLastWriteTime; - pfad->nFileSizeHigh = FileData.nFileSizeHigh; - pfad->nFileSizeLow = FileData.nFileSizeLow; + memset(info, 0, sizeof(*info)); + *reparse_tag = 0; + info->dwFileAttributes = FileData.dwFileAttributes; + info->ftCreationTime = FileData.ftCreationTime; + info->ftLastAccessTime = FileData.ftLastAccessTime; + info->ftLastWriteTime = FileData.ftLastWriteTime; + info->nFileSizeHigh = FileData.nFileSizeHigh; + info->nFileSizeLow = FileData.nFileSizeLow; +/* info->nNumberOfLinks = 1; */ + if (FileData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) + *reparse_tag = FileData.dwReserved0; return TRUE; } static BOOL -attributes_from_dir_w(LPCWSTR pszFile, LPWIN32_FILE_ATTRIBUTE_DATA pfad) +attributes_from_dir_w(LPCWSTR pszFile, BY_HANDLE_FILE_INFORMATION *info, ULONG *reparse_tag) { HANDLE hFindFile; WIN32_FIND_DATAW FileData; @@ -949,90 +1048,334 @@ attributes_from_dir_w(LPCWSTR pszFile, LPWIN32_FILE_ATTRIBUTE_DATA pfad) if (hFindFile == INVALID_HANDLE_VALUE) return FALSE; FindClose(hFindFile); - pfad->dwFileAttributes = FileData.dwFileAttributes; - pfad->ftCreationTime = FileData.ftCreationTime; - pfad->ftLastAccessTime = FileData.ftLastAccessTime; - pfad->ftLastWriteTime = FileData.ftLastWriteTime; - pfad->nFileSizeHigh = FileData.nFileSizeHigh; - pfad->nFileSizeLow = FileData.nFileSizeLow; + memset(info, 0, sizeof(*info)); + *reparse_tag = 0; + info->dwFileAttributes = FileData.dwFileAttributes; + info->ftCreationTime = FileData.ftCreationTime; + info->ftLastAccessTime = FileData.ftLastAccessTime; + info->ftLastWriteTime = FileData.ftLastWriteTime; + info->nFileSizeHigh = FileData.nFileSizeHigh; + info->nFileSizeLow = FileData.nFileSizeLow; +/* info->nNumberOfLinks = 1; */ + if (FileData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) + *reparse_tag = FileData.dwReserved0; return TRUE; } +/* Grab GetFinalPathNameByHandle dynamically from kernel32 */ +static int has_GetFinalPathNameByHandle = 0; +static DWORD (CALLBACK *Py_GetFinalPathNameByHandleA)(HANDLE, LPSTR, DWORD, + DWORD); +static DWORD (CALLBACK *Py_GetFinalPathNameByHandleW)(HANDLE, LPWSTR, DWORD, + DWORD); static int -win32_stat(const char* path, struct win32_stat *result) +check_GetFinalPathNameByHandle() +{ + HINSTANCE hKernel32; + /* only recheck */ + if (!has_GetFinalPathNameByHandle) + { + hKernel32 = GetModuleHandle("KERNEL32"); + *(FARPROC*)&Py_GetFinalPathNameByHandleA = GetProcAddress(hKernel32, + "GetFinalPathNameByHandleA"); + *(FARPROC*)&Py_GetFinalPathNameByHandleW = GetProcAddress(hKernel32, + "GetFinalPathNameByHandleW"); + has_GetFinalPathNameByHandle = Py_GetFinalPathNameByHandleA && + Py_GetFinalPathNameByHandleW; + } + return has_GetFinalPathNameByHandle; +} + +static BOOL +get_target_path(HANDLE hdl, wchar_t **target_path) +{ + int buf_size, result_length; + wchar_t *buf; + + /* We have a good handle to the target, use it to determine + the target path name (then we'll call lstat on it). */ + buf_size = Py_GetFinalPathNameByHandleW(hdl, 0, 0, + VOLUME_NAME_DOS); + if(!buf_size) + return FALSE; + + buf = (wchar_t *)malloc((buf_size+1)*sizeof(wchar_t)); + if (!buf) { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + + result_length = Py_GetFinalPathNameByHandleW(hdl, + buf, buf_size, VOLUME_NAME_DOS); + + if(!result_length) { + free(buf); + return FALSE; + } + + if(!CloseHandle(hdl)) { + free(buf); + return FALSE; + } + + buf[result_length] = 0; + + *target_path = buf; + return TRUE; +} + +static int +win32_xstat_impl_w(const wchar_t *path, struct win32_stat *result, + BOOL traverse); +static int +win32_xstat_impl(const char *path, struct win32_stat *result, + BOOL traverse) { - WIN32_FILE_ATTRIBUTE_DATA info; int code; - char *dot; - if (!GetFileAttributesExA(path, GetFileExInfoStandard, &info)) { - if (GetLastError() != ERROR_SHARING_VIOLATION) { - /* Protocol violation: we explicitly clear errno, instead of - setting it to a POSIX error. Callers should use GetLastError. */ - errno = 0; + HANDLE hFile, hFile2; + BY_HANDLE_FILE_INFORMATION info; + ULONG reparse_tag = 0; + wchar_t *target_path; + const char *dot; + + if(!check_GetFinalPathNameByHandle()) { + /* If the OS doesn't have GetFinalPathNameByHandle, don't + traverse reparse point. */ + traverse = FALSE; + } + + hFile = CreateFileA( + path, + FILE_READ_ATTRIBUTES, /* desired access */ + 0, /* share mode */ + NULL, /* security attributes */ + OPEN_EXISTING, + /* FILE_FLAG_BACKUP_SEMANTICS is required to open a directory */ + /* FILE_FLAG_OPEN_REPARSE_POINT does not follow the symlink. + Because of this, calls like GetFinalPathNameByHandle will return + the symlink path agin and not the actual final path. */ + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS| + FILE_FLAG_OPEN_REPARSE_POINT, + NULL); + + if (hFile == INVALID_HANDLE_VALUE) { + /* Either the target doesn't exist, or we don't have access to + get a handle to it. If the former, we need to return an error. + If the latter, we can use attributes_from_dir. */ + if (GetLastError() != ERROR_SHARING_VIOLATION) return -1; - } else { - /* Could not get attributes on open file. Fall back to - reading the directory. */ - if (!attributes_from_dir(path, &info)) { - /* Very strange. This should not fail now */ - errno = 0; + /* Could not get attributes on open file. Fall back to + reading the directory. */ + if (!attributes_from_dir(path, &info, &reparse_tag)) + /* Very strange. This should not fail now */ + return -1; + if (info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { + if (traverse) { + /* Should traverse, but could not open reparse point handle */ + SetLastError(ERROR_SHARING_VIOLATION); return -1; } } + } else { + if (!GetFileInformationByHandle(hFile, &info)) { + CloseHandle(hFile); + return -1; + } + if (info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { + if (!win32_get_reparse_tag(hFile, &reparse_tag)) + return -1; + + /* Close the outer open file handle now that we're about to + reopen it with different flags. */ + if (!CloseHandle(hFile)) + return -1; + + if (traverse) { + /* In order to call GetFinalPathNameByHandle we need to open + the file without the reparse handling flag set. */ + hFile2 = CreateFileA( + path, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, + NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS, + NULL); + if (hFile2 == INVALID_HANDLE_VALUE) + return -1; + + if (!get_target_path(hFile2, &target_path)) + return -1; + + code = win32_xstat_impl_w(target_path, result, FALSE); + free(target_path); + return code; + } + } else + CloseHandle(hFile); } - code = attribute_data_to_stat(&info, result); - if (code != 0) - return code; - /* Set S_IFEXEC if it is an .exe, .bat, ... */ + attribute_data_to_stat(&info, reparse_tag, result); + + /* Set S_IEXEC if it is an .exe, .bat, ... */ dot = strrchr(path, '.'); if (dot) { - if (stricmp(dot, ".bat") == 0 || - stricmp(dot, ".cmd") == 0 || - stricmp(dot, ".exe") == 0 || - stricmp(dot, ".com") == 0) + if (stricmp(dot, ".bat") == 0 || stricmp(dot, ".cmd") == 0 || + stricmp(dot, ".exe") == 0 || stricmp(dot, ".com") == 0) result->st_mode |= 0111; } - return code; + return 0; } static int -win32_wstat(const wchar_t* path, struct win32_stat *result) +win32_xstat_impl_w(const wchar_t *path, struct win32_stat *result, + BOOL traverse) { int code; + HANDLE hFile, hFile2; + BY_HANDLE_FILE_INFORMATION info; + ULONG reparse_tag = 0; + wchar_t *target_path; const wchar_t *dot; - WIN32_FILE_ATTRIBUTE_DATA info; - if (!GetFileAttributesExW(path, GetFileExInfoStandard, &info)) { - if (GetLastError() != ERROR_SHARING_VIOLATION) { - /* Protocol violation: we explicitly clear errno, instead of - setting it to a POSIX error. Callers should use GetLastError. */ - errno = 0; + + if(!check_GetFinalPathNameByHandle()) { + /* If the OS doesn't have GetFinalPathNameByHandle, don't + traverse reparse point. */ + traverse = FALSE; + } + + hFile = CreateFileW( + path, + FILE_READ_ATTRIBUTES, /* desired access */ + 0, /* share mode */ + NULL, /* security attributes */ + OPEN_EXISTING, + /* FILE_FLAG_BACKUP_SEMANTICS is required to open a directory */ + /* FILE_FLAG_OPEN_REPARSE_POINT does not follow the symlink. + Because of this, calls like GetFinalPathNameByHandle will return + the symlink path agin and not the actual final path. */ + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS| + FILE_FLAG_OPEN_REPARSE_POINT, + NULL); + + if (hFile == INVALID_HANDLE_VALUE) { + /* Either the target doesn't exist, or we don't have access to + get a handle to it. If the former, we need to return an error. + If the latter, we can use attributes_from_dir. */ + if (GetLastError() != ERROR_SHARING_VIOLATION) return -1; - } else { - /* Could not get attributes on open file. Fall back to - reading the directory. */ - if (!attributes_from_dir_w(path, &info)) { - /* Very strange. This should not fail now */ - errno = 0; + /* Could not get attributes on open file. Fall back to + reading the directory. */ + if (!attributes_from_dir_w(path, &info, &reparse_tag)) + /* Very strange. This should not fail now */ + return -1; + if (info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { + if (traverse) { + /* Should traverse, but could not open reparse point handle */ + SetLastError(ERROR_SHARING_VIOLATION); return -1; } } + } else { + if (!GetFileInformationByHandle(hFile, &info)) { + CloseHandle(hFile); + return -1; + } + if (info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { + if (!win32_get_reparse_tag(hFile, &reparse_tag)) + return -1; + + /* Close the outer open file handle now that we're about to + reopen it with different flags. */ + if (!CloseHandle(hFile)) + return -1; + + if (traverse) { + /* In order to call GetFinalPathNameByHandle we need to open + the file without the reparse handling flag set. */ + hFile2 = CreateFileW( + path, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, + NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS, + NULL); + if (hFile2 == INVALID_HANDLE_VALUE) + return -1; + + if (!get_target_path(hFile2, &target_path)) + return -1; + + code = win32_xstat_impl_w(target_path, result, FALSE); + free(target_path); + return code; + } + } else + CloseHandle(hFile); } - code = attribute_data_to_stat(&info, result); - if (code < 0) - return code; - /* Set IFEXEC if it is an .exe, .bat, ... */ + attribute_data_to_stat(&info, reparse_tag, result); + + /* Set S_IEXEC if it is an .exe, .bat, ... */ dot = wcsrchr(path, '.'); if (dot) { - if (_wcsicmp(dot, L".bat") == 0 || - _wcsicmp(dot, L".cmd") == 0 || - _wcsicmp(dot, L".exe") == 0 || - _wcsicmp(dot, L".com") == 0) + if (_wcsicmp(dot, L".bat") == 0 || _wcsicmp(dot, L".cmd") == 0 || + _wcsicmp(dot, L".exe") == 0 || _wcsicmp(dot, L".com") == 0) result->st_mode |= 0111; } + return 0; +} + +static int +win32_xstat(const char *path, struct win32_stat *result, BOOL traverse) +{ + /* Protocol violation: we explicitly clear errno, instead of + setting it to a POSIX error. Callers should use GetLastError. */ + int code = win32_xstat_impl(path, result, traverse); + errno = 0; return code; } static int +win32_xstat_w(const wchar_t *path, struct win32_stat *result, BOOL traverse) +{ + /* Protocol violation: we explicitly clear errno, instead of + setting it to a POSIX error. Callers should use GetLastError. */ + int code = win32_xstat_impl_w(path, result, traverse); + errno = 0; + return code; +} +/* About the following functions: win32_lstat_w, win32_stat, win32_stat_w + + In Posix, stat automatically traverses symlinks and returns the stat + structure for the target. In Windows, the equivalent GetFileAttributes by + default does not traverse symlinks and instead returns attributes for + the symlink. + + Therefore, win32_lstat will get the attributes traditionally, and + win32_stat will first explicitly resolve the symlink target and then will + call win32_lstat on that result. + + The _w represent Unicode equivalents of the aforementioned ANSI functions. */ + +static int +win32_lstat(const char* path, struct win32_stat *result) +{ + return win32_xstat(path, result, FALSE); +} + +static int +win32_lstat_w(const wchar_t* path, struct win32_stat *result) +{ + return win32_xstat_w(path, result, FALSE); +} + +static int +win32_stat(const char* path, struct win32_stat *result) +{ + return win32_xstat(path, result, TRUE); +} + +static int +win32_stat_w(const wchar_t* path, struct win32_stat *result) +{ + return win32_xstat_w(path, result, TRUE); +} + +static int win32_fstat(int file_number, struct win32_stat *result) { BY_HANDLE_FILE_INFORMATION info; @@ -1057,7 +1400,7 @@ win32_fstat(int file_number, struct win32_stat *result) if (type == FILE_TYPE_UNKNOWN) { DWORD error = GetLastError(); if (error != 0) { - return -1; + return -1; } /* else: valid but unknown file */ } @@ -1074,14 +1417,8 @@ win32_fstat(int file_number, struct win32_stat *result) return -1; } - /* similar to stat() */ - result->st_mode = attributes_to_mode(info.dwFileAttributes); - result->st_size = (((__int64)info.nFileSizeHigh)<<32) + info.nFileSizeLow; - 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); + attribute_data_to_stat(&info, 0, result); /* specific to fstat() */ - result->st_nlink = info.nNumberOfLinks; result->st_ino = (((__int64)info.nFileIndexHigh)<<32) + info.nFileIndexLow; return 0; } @@ -1267,7 +1604,7 @@ fill_time(PyObject *v, int index, time_t sec, unsigned long nsec) #if SIZEOF_TIME_T > SIZEOF_LONG ival = PyLong_FromLongLong((PY_LONG_LONG)sec); #else - ival = PyInt_FromLong((long)sec); + ival = PyLong_FromLong((long)sec); #endif if (!ival) return; @@ -1291,27 +1628,27 @@ _pystat_fromstructstat(STRUCT_STAT *st) if (v == NULL) return NULL; - PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long)st->st_mode)); + PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long)st->st_mode)); #ifdef HAVE_LARGEFILE_SUPPORT PyStructSequence_SET_ITEM(v, 1, PyLong_FromLongLong((PY_LONG_LONG)st->st_ino)); #else - PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long)st->st_ino)); + PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long)st->st_ino)); #endif #if defined(HAVE_LONG_LONG) && !defined(MS_WINDOWS) PyStructSequence_SET_ITEM(v, 2, PyLong_FromLongLong((PY_LONG_LONG)st->st_dev)); #else - PyStructSequence_SET_ITEM(v, 2, PyInt_FromLong((long)st->st_dev)); + PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev)); #endif - PyStructSequence_SET_ITEM(v, 3, PyInt_FromLong((long)st->st_nlink)); - PyStructSequence_SET_ITEM(v, 4, PyInt_FromLong((long)st->st_uid)); - PyStructSequence_SET_ITEM(v, 5, PyInt_FromLong((long)st->st_gid)); + PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink)); + PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long)st->st_uid)); + PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long)st->st_gid)); #ifdef HAVE_LARGEFILE_SUPPORT PyStructSequence_SET_ITEM(v, 6, PyLong_FromLongLong((PY_LONG_LONG)st->st_size)); #else - PyStructSequence_SET_ITEM(v, 6, PyInt_FromLong(st->st_size)); + PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong(st->st_size)); #endif #if defined(HAVE_STAT_TV_NSEC) @@ -1335,19 +1672,19 @@ _pystat_fromstructstat(STRUCT_STAT *st) #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX, - PyInt_FromLong((long)st->st_blksize)); + PyLong_FromLong((long)st->st_blksize)); #endif #ifdef HAVE_STRUCT_STAT_ST_BLOCKS PyStructSequence_SET_ITEM(v, ST_BLOCKS_IDX, - PyInt_FromLong((long)st->st_blocks)); + PyLong_FromLong((long)st->st_blocks)); #endif #ifdef HAVE_STRUCT_STAT_ST_RDEV PyStructSequence_SET_ITEM(v, ST_RDEV_IDX, - PyInt_FromLong((long)st->st_rdev)); + PyLong_FromLong((long)st->st_rdev)); #endif #ifdef HAVE_STRUCT_STAT_ST_GEN PyStructSequence_SET_ITEM(v, ST_GEN_IDX, - PyInt_FromLong((long)st->st_gen)); + PyLong_FromLong((long)st->st_gen)); #endif #ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME { @@ -1362,7 +1699,7 @@ _pystat_fromstructstat(STRUCT_STAT *st) if (_stat_float_times) { val = PyFloat_FromDouble(bsec + 1e-9*bnsec); } else { - val = PyInt_FromLong((long)bsec); + val = PyLong_FromLong((long)bsec); } PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX, val); @@ -1370,7 +1707,7 @@ _pystat_fromstructstat(STRUCT_STAT *st) #endif #ifdef HAVE_STRUCT_STAT_ST_FLAGS PyStructSequence_SET_ITEM(v, ST_FLAGS_IDX, - PyInt_FromLong((long)st->st_flags)); + PyLong_FromLong((long)st->st_flags)); #endif if (PyErr_Occurred()) { @@ -1381,66 +1718,6 @@ _pystat_fromstructstat(STRUCT_STAT *st) return v; } -#ifdef MS_WINDOWS - -/* IsUNCRoot -- test whether the supplied path is of the form \\SERVER\SHARE\, - where / can be used in place of \ and the trailing slash is optional. - Both SERVER and SHARE must have at least one character. -*/ - -#define ISSLASHA(c) ((c) == '\\' || (c) == '/') -#define ISSLASHW(c) ((c) == L'\\' || (c) == L'/') -#ifndef ARRAYSIZE -#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0])) -#endif - -static BOOL -IsUNCRootA(char *path, int pathlen) -{ - #define ISSLASH ISSLASHA - - int i, share; - - if (pathlen < 5 || !ISSLASH(path[0]) || !ISSLASH(path[1])) - /* minimum UNCRoot is \\x\y */ - return FALSE; - for (i = 2; i < pathlen ; i++) - if (ISSLASH(path[i])) break; - if (i == 2 || i == pathlen) - /* do not allow \\\SHARE or \\SERVER */ - return FALSE; - share = i+1; - for (i = share; i < pathlen; i++) - if (ISSLASH(path[i])) break; - return (i != share && (i == pathlen || i == pathlen-1)); - - #undef ISSLASH -} - -static BOOL -IsUNCRootW(Py_UNICODE *path, int pathlen) -{ - #define ISSLASH ISSLASHW - - int i, share; - - if (pathlen < 5 || !ISSLASH(path[0]) || !ISSLASH(path[1])) - /* minimum UNCRoot is \\x\y */ - return FALSE; - for (i = 2; i < pathlen ; i++) - if (ISSLASH(path[i])) break; - if (i == 2 || i == pathlen) - /* do not allow \\\SHARE or \\SERVER */ - return FALSE; - share = i+1; - for (i = share; i < pathlen; i++) - if (ISSLASH(path[i])) break; - return (i != share && (i == pathlen || i == pathlen-1)); - - #undef ISSLASH -} -#endif /* MS_WINDOWS */ - static PyObject * posix_do_stat(PyObject *self, PyObject *args, char *format, @@ -1453,8 +1730,8 @@ posix_do_stat(PyObject *self, PyObject *args, int (*wstatfunc)(const Py_UNICODE *, STRUCT_STAT *)) { STRUCT_STAT st; - char *path = NULL; /* pass this to stat; do not free() it */ - char *pathfree = NULL; /* this memory must be free'd */ + PyObject *opath; + char *path; int res; PyObject *result; @@ -1479,25 +1756,24 @@ posix_do_stat(PyObject *self, PyObject *args, #endif if (!PyArg_ParseTuple(args, format, - Py_FileSystemDefaultEncoding, &path)) + PyUnicode_FSConverter, &opath)) return NULL; - pathfree = path; - + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS res = (*statfunc)(path, &st); Py_END_ALLOW_THREADS if (res != 0) { #ifdef MS_WINDOWS - result = win32_error("stat", pathfree); + result = win32_error("stat", path); #else - result = posix_error_with_filename(pathfree); + result = posix_error_with_filename(path); #endif } else result = _pystat_fromstructstat(&st); - PyMem_Free(pathfree); + Py_DECREF(opath); return result; } @@ -1514,6 +1790,7 @@ existence, or the inclusive-OR of R_OK, W_OK, and X_OK."); static PyObject * posix_access(PyObject *self, PyObject *args) { + PyObject *opath; char *path; int mode; @@ -1531,13 +1808,14 @@ posix_access(PyObject *self, PyObject *args) /* Drop the argument parsing error as narrow strings are also valid. */ PyErr_Clear(); - if (!PyArg_ParseTuple(args, "eti:access", - Py_FileSystemDefaultEncoding, &path, &mode)) + if (!PyArg_ParseTuple(args, "O&i:access", + PyUnicode_FSConverter, &opath, &mode)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS attr = GetFileAttributesA(path); Py_END_ALLOW_THREADS - PyMem_Free(path); + Py_DECREF(opath); finish: if (attr == 0xFFFFFFFF) /* File does not exist, or cannot read attributes */ @@ -1548,17 +1826,18 @@ finish: return PyBool_FromLong(!(mode & 2) || !(attr & FILE_ATTRIBUTE_READONLY) || (attr & FILE_ATTRIBUTE_DIRECTORY)); -#else /* MS_WINDOWS */ +#else int res; - if (!PyArg_ParseTuple(args, "eti:access", - Py_FileSystemDefaultEncoding, &path, &mode)) + if (!PyArg_ParseTuple(args, "O&i:access", + PyUnicode_FSConverter, &opath, &mode)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS res = access(path, mode); Py_END_ALLOW_THREADS - PyMem_Free(path); + Py_DECREF(opath); return PyBool_FromLong(res == 0); -#endif /* MS_WINDOWS */ +#endif } #ifndef F_OK @@ -1601,7 +1880,7 @@ posix_ttyname(PyObject *self, PyObject *args) #endif if (ret == NULL) return posix_error(); - return PyString_FromString(ret); + return PyUnicode_DecodeFSDefault(ret); } #endif @@ -1623,7 +1902,7 @@ posix_ctermid(PyObject *self, PyObject *noargs) #endif if (ret == NULL) return posix_error(); - return PyString_FromString(buffer); + return PyUnicode_DecodeFSDefault(buffer); } #endif @@ -1635,13 +1914,13 @@ static PyObject * posix_chdir(PyObject *self, PyObject *args) { #ifdef MS_WINDOWS - return win32_1str(args, "chdir", "s:chdir", win32_chdir, "U:chdir", win32_wchdir); + return win32_1str(args, "chdir", "y:chdir", win32_chdir, "U:chdir", win32_wchdir); #elif defined(PYOS_OS2) && defined(PYCC_GCC) - return posix_1str(args, "et:chdir", _chdir2); + return posix_1str(args, "O&:chdir", _chdir2); #elif defined(__VMS) - return posix_1str(args, "et:chdir", (int (*)(const char *))chdir); + return posix_1str(args, "O&:chdir", (int (*)(const char *))chdir); #else - return posix_1str(args, "et:chdir", chdir); + return posix_1str(args, "O&:chdir", chdir); #endif } @@ -1666,6 +1945,7 @@ Change the access permissions of a file."); static PyObject * posix_chmod(PyObject *self, PyObject *args) { + PyObject *opath = NULL; char *path = NULL; int i; int res; @@ -1695,9 +1975,10 @@ posix_chmod(PyObject *self, PyObject *args) are also valid. */ PyErr_Clear(); - if (!PyArg_ParseTuple(args, "eti:chmod", Py_FileSystemDefaultEncoding, - &path, &i)) + if (!PyArg_ParseTuple(args, "O&i:chmod", PyUnicode_FSConverter, + &opath, &i)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS attr = GetFileAttributesA(path); if (attr != 0xFFFFFFFF) { @@ -1712,22 +1993,23 @@ posix_chmod(PyObject *self, PyObject *args) Py_END_ALLOW_THREADS if (!res) { win32_error("chmod", path); - PyMem_Free(path); + Py_DECREF(opath); return NULL; } - PyMem_Free(path); + Py_DECREF(opath); Py_INCREF(Py_None); return Py_None; #else /* MS_WINDOWS */ - if (!PyArg_ParseTuple(args, "eti:chmod", Py_FileSystemDefaultEncoding, - &path, &i)) + if (!PyArg_ParseTuple(args, "O&i:chmod", PyUnicode_FSConverter, + &opath, &i)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS res = chmod(path, i); Py_END_ALLOW_THREADS if (res < 0) - return posix_error_with_allocated_filename(path); - PyMem_Free(path); + return posix_error_with_allocated_filename(opath); + Py_DECREF(opath); Py_INCREF(Py_None); return Py_None; #endif @@ -1763,18 +2045,20 @@ affects the link itself rather than the target."); static PyObject * posix_lchmod(PyObject *self, PyObject *args) { - char *path = NULL; + PyObject *opath; + char *path; int i; int res; - if (!PyArg_ParseTuple(args, "eti:lchmod", Py_FileSystemDefaultEncoding, - &path, &i)) + if (!PyArg_ParseTuple(args, "O&i:lchmod", PyUnicode_FSConverter, + &opath, &i)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS res = lchmod(path, i); Py_END_ALLOW_THREADS if (res < 0) - return posix_error_with_allocated_filename(path); - PyMem_Free(path); + return posix_error_with_allocated_filename(opath); + Py_DECREF(opath); Py_RETURN_NONE; } #endif /* HAVE_LCHMOD */ @@ -1788,18 +2072,20 @@ Set file flags."); static PyObject * posix_chflags(PyObject *self, PyObject *args) { + PyObject *opath; char *path; unsigned long flags; int res; - if (!PyArg_ParseTuple(args, "etk:chflags", - Py_FileSystemDefaultEncoding, &path, &flags)) + if (!PyArg_ParseTuple(args, "O&k:chflags", + PyUnicode_FSConverter, &opath, &flags)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS res = chflags(path, flags); Py_END_ALLOW_THREADS if (res < 0) - return posix_error_with_allocated_filename(path); - PyMem_Free(path); + return posix_error_with_allocated_filename(opath); + Py_DECREF(opath); Py_INCREF(Py_None); return Py_None; } @@ -1814,18 +2100,20 @@ This function will not follow symbolic links."); static PyObject * posix_lchflags(PyObject *self, PyObject *args) { + PyObject *opath; char *path; unsigned long flags; int res; - if (!PyArg_ParseTuple(args, "etk:lchflags", - Py_FileSystemDefaultEncoding, &path, &flags)) + if (!PyArg_ParseTuple(args, "O&k:lchflags", + PyUnicode_FSConverter, &opath, &flags)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS res = lchflags(path, flags); Py_END_ALLOW_THREADS if (res < 0) - return posix_error_with_allocated_filename(path); - PyMem_Free(path); + return posix_error_with_allocated_filename(opath); + Py_DECREF(opath); Py_INCREF(Py_None); return Py_None; } @@ -1839,7 +2127,7 @@ Change root directory to path."); static PyObject * posix_chroot(PyObject *self, PyObject *args) { - return posix_1str(args, "et:chroot", chroot); + return posix_1str(args, "O&:chroot", chroot); } #endif @@ -1882,19 +2170,21 @@ Change the owner and group id of path to the numeric uid and gid."); static PyObject * posix_chown(PyObject *self, PyObject *args) { - char *path = NULL; + PyObject *opath; + char *path; long uid, gid; int res; - if (!PyArg_ParseTuple(args, "etll:chown", - Py_FileSystemDefaultEncoding, &path, + if (!PyArg_ParseTuple(args, "O&ll:chown", + PyUnicode_FSConverter, &opath, &uid, &gid)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS res = chown(path, (uid_t) uid, (gid_t) gid); Py_END_ALLOW_THREADS if (res < 0) - return posix_error_with_allocated_filename(path); - PyMem_Free(path); + return posix_error_with_allocated_filename(opath); + Py_DECREF(opath); Py_INCREF(Py_None); return Py_None; } @@ -1912,7 +2202,7 @@ posix_fchown(PyObject *self, PyObject *args) int fd; long uid, gid; int res; - if (!PyArg_ParseTuple(args, "ill:chown", &fd, &uid, &gid)) + if (!PyArg_ParseTuple(args, "ill:fchown", &fd, &uid, &gid)) return NULL; Py_BEGIN_ALLOW_THREADS res = fchown(fd, (uid_t) uid, (gid_t) gid); @@ -1932,19 +2222,21 @@ This function will not follow symbolic links."); static PyObject * posix_lchown(PyObject *self, PyObject *args) { - char *path = NULL; + PyObject *opath; + char *path; long uid, gid; int res; - if (!PyArg_ParseTuple(args, "etll:lchown", - Py_FileSystemDefaultEncoding, &path, + if (!PyArg_ParseTuple(args, "O&ll:lchown", + PyUnicode_FSConverter, &opath, &uid, &gid)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS res = lchown(path, (uid_t) uid, (gid_t) gid); Py_END_ALLOW_THREADS if (res < 0) - return posix_error_with_allocated_filename(path); - PyMem_Free(path); + return posix_error_with_allocated_filename(opath); + Py_DECREF(opath); Py_INCREF(Py_None); return Py_None; } @@ -1952,121 +2244,77 @@ posix_lchown(PyObject *self, PyObject *args) #ifdef HAVE_GETCWD -PyDoc_STRVAR(posix_getcwd__doc__, -"getcwd() -> path\n\n\ -Return a string representing the current working directory."); - -#if (defined(__sun) && defined(__SVR4)) || \ - defined(__OpenBSD__) || \ - defined(__NetBSD__) -/* Issue 9185: getcwd() returns NULL/ERANGE indefinitely. */ static PyObject * -posix_getcwd(PyObject *self, PyObject *noargs) +posix_getcwd(int use_bytes) { - char buf[PATH_MAX+2]; + char buf[1026]; char *res; - Py_BEGIN_ALLOW_THREADS - res = getcwd(buf, sizeof buf); - Py_END_ALLOW_THREADS - - if (res == NULL) - return posix_error(); - - return PyString_FromString(buf); -} -#else -static PyObject * -posix_getcwd(PyObject *self, PyObject *noargs) -{ - int bufsize_incr = 1024; - int bufsize = 0; - char *tmpbuf = NULL; - char *res = NULL; - PyObject *dynamic_return; +#ifdef MS_WINDOWS + if (!use_bytes) { + wchar_t wbuf[1026]; + wchar_t *wbuf2 = wbuf; + PyObject *resobj; + DWORD len; + Py_BEGIN_ALLOW_THREADS + len = GetCurrentDirectoryW(sizeof wbuf/ sizeof wbuf[0], wbuf); + /* If the buffer is large enough, len does not include the + 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)); + if (wbuf2) + len = GetCurrentDirectoryW(len, wbuf2); + } + Py_END_ALLOW_THREADS + if (!wbuf2) { + PyErr_NoMemory(); + return NULL; + } + if (!len) { + if (wbuf2 != wbuf) free(wbuf2); + return win32_error("getcwdu", NULL); + } + resobj = PyUnicode_FromWideChar(wbuf2, len); + if (wbuf2 != wbuf) free(wbuf2); + return resobj; + } +#endif Py_BEGIN_ALLOW_THREADS - do { - bufsize = bufsize + bufsize_incr; - tmpbuf = malloc(bufsize); - if (tmpbuf == NULL) { - break; - } #if defined(PYOS_OS2) && defined(PYCC_GCC) - res = _getcwd2(tmpbuf, bufsize); + res = _getcwd2(buf, sizeof buf); #else - res = getcwd(tmpbuf, bufsize); + res = getcwd(buf, sizeof buf); #endif - - if (res == NULL) { - free(tmpbuf); - } - } while ((res == NULL) && (errno == ERANGE)); Py_END_ALLOW_THREADS - if (res == NULL) return posix_error(); - - dynamic_return = PyString_FromString(tmpbuf); - free(tmpbuf); - - return dynamic_return; + if (use_bytes) + return PyBytes_FromStringAndSize(buf, strlen(buf)); + return PyUnicode_DecodeFSDefault(buf); } -#endif /* getcwd() NULL/ERANGE workaround. */ -#ifdef Py_USING_UNICODE -PyDoc_STRVAR(posix_getcwdu__doc__, -"getcwdu() -> path\n\n\ +PyDoc_STRVAR(posix_getcwd__doc__, +"getcwd() -> path\n\n\ Return a unicode string representing the current working directory."); static PyObject * -posix_getcwdu(PyObject *self, PyObject *noargs) +posix_getcwd_unicode(PyObject *self) { - char buf[1026]; - char *res; + return posix_getcwd(0); +} -#ifdef MS_WINDOWS - DWORD len; - wchar_t wbuf[1026]; - wchar_t *wbuf2 = wbuf; - PyObject *resobj; - Py_BEGIN_ALLOW_THREADS - len = GetCurrentDirectoryW(sizeof wbuf/ sizeof wbuf[0], wbuf); - /* If the buffer is large enough, len does not include the - 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)); - if (wbuf2) - len = GetCurrentDirectoryW(len, wbuf2); - } - Py_END_ALLOW_THREADS - if (!wbuf2) { - PyErr_NoMemory(); - return NULL; - } - if (!len) { - if (wbuf2 != wbuf) free(wbuf2); - return win32_error("getcwdu", NULL); - } - resobj = PyUnicode_FromWideChar(wbuf2, len); - if (wbuf2 != wbuf) free(wbuf2); - return resobj; -#endif /* MS_WINDOWS */ +PyDoc_STRVAR(posix_getcwdb__doc__, +"getcwdb() -> path\n\n\ +Return a bytes string representing the current working directory."); - 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(); - return PyUnicode_Decode(buf, strlen(buf), Py_FileSystemDefaultEncoding,"strict"); +static PyObject * +posix_getcwd_bytes(PyObject *self) +{ + return posix_getcwd(1); } -#endif /* Py_USING_UNICODE */ -#endif /* HAVE_GETCWD */ +#endif #ifdef HAVE_LINK @@ -2077,16 +2325,64 @@ Create a hard link to a file."); static PyObject * posix_link(PyObject *self, PyObject *args) { - return posix_2str(args, "etet:link", link); + return posix_2str(args, "O&O&:link", link); } #endif /* HAVE_LINK */ +#ifdef MS_WINDOWS +PyDoc_STRVAR(win32_link__doc__, +"link(src, dst)\n\n\ +Create a hard link to a file."); + +static PyObject * +win32_link(PyObject *self, PyObject *args) +{ + PyObject *osrc, *odst; + char *src, *dst; + BOOL rslt; + + PyUnicodeObject *usrc, *udst; + if (PyArg_ParseTuple(args, "UU:link", &usrc, &udst)) { + Py_BEGIN_ALLOW_THREADS + rslt = CreateHardLinkW(PyUnicode_AS_UNICODE(udst), + PyUnicode_AS_UNICODE(usrc), NULL); + Py_END_ALLOW_THREADS + + if (rslt == 0) + return win32_error("link", NULL); + + Py_RETURN_NONE; + } + + /* Narrow strings also valid. */ + PyErr_Clear(); + + if (!PyArg_ParseTuple(args, "O&O&:link", PyUnicode_FSConverter, &osrc, + PyUnicode_FSConverter, &odst)) + return NULL; + + src = PyBytes_AsString(osrc); + dst = PyBytes_AsString(odst); + + Py_BEGIN_ALLOW_THREADS + rslt = CreateHardLinkA(dst, src, NULL); + Py_END_ALLOW_THREADS + + Py_DECREF(osrc); + Py_DECREF(odst); + if (rslt == 0) + return win32_error("link", NULL); + + Py_RETURN_NONE; +} +#endif /* MS_WINDOWS */ + PyDoc_STRVAR(posix_listdir__doc__, -"listdir(path) -> list_of_strings\n\n\ +"listdir([path]) -> list_of_strings\n\n\ Return a list containing the names of the entries in the directory.\n\ \n\ - path: path of directory to list\n\ + path: path of directory to list (default: '.')\n\ \n\ The list is in arbitrary order. It does not include the special\n\ entries '.' and '..' even if they are present in the directory."); @@ -2102,22 +2398,30 @@ posix_listdir(PyObject *self, PyObject *args) HANDLE hFindFile; BOOL result; WIN32_FIND_DATA FileData; + PyObject *opath; char namebuf[MAX_PATH+5]; /* Overallocate for \\*.*\0 */ char *bufptr = namebuf; Py_ssize_t len = sizeof(namebuf)-5; /* only claim to have space for MAX_PATH */ - PyObject *po; - if (PyArg_ParseTuple(args, "U:listdir", &po)) { + PyObject *po = NULL; + if (PyArg_ParseTuple(args, "|U:listdir", &po)) { WIN32_FIND_DATAW wFileData; - Py_UNICODE *wnamebuf; + Py_UNICODE *wnamebuf, *po_wchars; + + if (po == NULL) { /* Default arg: "." */ + po_wchars = L"."; + len = 1; + } else { + po_wchars = PyUnicode_AS_UNICODE(po); + len = PyUnicode_GET_SIZE(po); + } /* Overallocate for \\*.*\0 */ - len = PyUnicode_GET_SIZE(po); wnamebuf = malloc((len + 5) * sizeof(wchar_t)); if (!wnamebuf) { PyErr_NoMemory(); return NULL; } - wcscpy(wnamebuf, PyUnicode_AS_UNICODE(po)); + wcscpy(wnamebuf, po_wchars); if (len > 0) { Py_UNICODE wch = wnamebuf[len-1]; if (wch != L'/' && wch != L'\\' && wch != L':') @@ -2187,9 +2491,17 @@ posix_listdir(PyObject *self, PyObject *args) are also valid. */ PyErr_Clear(); - if (!PyArg_ParseTuple(args, "et#:listdir", - Py_FileSystemDefaultEncoding, &bufptr, &len)) + if (!PyArg_ParseTuple(args, "O&:listdir", + PyUnicode_FSConverter, &opath)) return NULL; + if (PyBytes_GET_SIZE(opath)+1 > MAX_PATH) { + PyErr_SetString(PyExc_ValueError, "path too long"); + Py_DECREF(opath); + return NULL; + } + strcpy(namebuf, PyBytes_AsString(opath)); + len = PyObject_Size(opath); + Py_DECREF(opath); if (len > 0) { char ch = namebuf[len-1]; if (ch != SEP && ch != ALTSEP && ch != ':') @@ -2214,7 +2526,7 @@ posix_listdir(PyObject *self, PyObject *args) /* Skip over . and .. */ if (strcmp(FileData.cFileName, ".") != 0 && strcmp(FileData.cFileName, "..") != 0) { - v = PyString_FromString(FileData.cFileName); + v = PyBytes_FromString(FileData.cFileName); if (v == NULL) { Py_DECREF(d); d = NULL; @@ -2253,6 +2565,7 @@ posix_listdir(PyObject *self, PyObject *args) #ifndef MAX_PATH #define MAX_PATH CCHMAXPATH #endif + PyObject *oname; char *name, *pt; Py_ssize_t len; PyObject *d, *v; @@ -2262,9 +2575,13 @@ posix_listdir(PyObject *self, PyObject *args) FILEFINDBUF3 ep; APIRET rc; - if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len)) + if (!PyArg_ParseTuple(args, "O&:listdir", + PyUnicode_FSConverter, &oname)) return NULL; + name = PyBytes_AsString(oname); + len = PyBytes_GET_SIZE(oname); if (len >= MAX_PATH) { + Py_DECREF(oname); PyErr_SetString(PyExc_ValueError, "path too long"); return NULL; } @@ -2276,8 +2593,10 @@ posix_listdir(PyObject *self, PyObject *args) namebuf[len++] = SEP; strcpy(namebuf + len, "*.*"); - if ((d = PyList_New(0)) == NULL) + if ((d = PyList_New(0)) == NULL) { + Py_DECREF(oname); return NULL; + } rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */ &hdir, /* Handle to Use While Search Directory */ @@ -2288,7 +2607,7 @@ posix_listdir(PyObject *self, PyObject *args) if (rc != NO_ERROR) { errno = ENOENT; - return posix_error_with_filename(name); + return posix_error_with_allocated_filename(oname); } if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */ @@ -2302,7 +2621,7 @@ posix_listdir(PyObject *self, PyObject *args) /* Leave Case of Name Alone -- In Native Form */ /* (Removed Forced Lowercasing Code) */ - v = PyString_FromString(namebuf); + v = PyBytes_FromString(namebuf); if (v == NULL) { Py_DECREF(d); d = NULL; @@ -2318,33 +2637,40 @@ posix_listdir(PyObject *self, PyObject *args) } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0); } + Py_DECREF(oname); return d; #else - - char *name = NULL; + PyObject *oname; + char *name; PyObject *d, *v; DIR *dirp; struct dirent *ep; int arg_is_unicode = 1; errno = 0; - if (!PyArg_ParseTuple(args, "U:listdir", &v)) { + /* v is never read, so it does not need to be initialized yet. */ + if (!PyArg_ParseTuple(args, "|U:listdir", &v)) { arg_is_unicode = 0; PyErr_Clear(); } - if (!PyArg_ParseTuple(args, "et:listdir", Py_FileSystemDefaultEncoding, &name)) + oname = NULL; + if (!PyArg_ParseTuple(args, "|O&:listdir", PyUnicode_FSConverter, &oname)) return NULL; + if (oname == NULL) { /* Default arg: "." */ + oname = PyBytes_FromString("."); + } + name = PyBytes_AsString(oname); Py_BEGIN_ALLOW_THREADS dirp = opendir(name); Py_END_ALLOW_THREADS if (dirp == NULL) { - return posix_error_with_allocated_filename(name); + return posix_error_with_allocated_filename(oname); } if ((d = PyList_New(0)) == NULL) { Py_BEGIN_ALLOW_THREADS closedir(dirp); Py_END_ALLOW_THREADS - PyMem_Free(name); + Py_DECREF(oname); return NULL; } for (;;) { @@ -2360,41 +2686,24 @@ posix_listdir(PyObject *self, PyObject *args) closedir(dirp); Py_END_ALLOW_THREADS Py_DECREF(d); - return posix_error_with_allocated_filename(name); + return posix_error_with_allocated_filename(oname); } } if (ep->d_name[0] == '.' && (NAMLEN(ep) == 1 || (ep->d_name[1] == '.' && NAMLEN(ep) == 2))) continue; - v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep)); + if (arg_is_unicode) + v = PyUnicode_DecodeFSDefaultAndSize(ep->d_name, NAMLEN(ep)); + else + v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep)); if (v == NULL) { - Py_DECREF(d); - d = NULL; + Py_CLEAR(d); break; } -#ifdef Py_USING_UNICODE - if (arg_is_unicode) { - PyObject *w; - - w = PyUnicode_FromEncodedObject(v, - Py_FileSystemDefaultEncoding, - "strict"); - if (w != NULL) { - Py_DECREF(v); - v = w; - } - else { - /* fall back to the original byte string, as - discussed in patch #683592 */ - PyErr_Clear(); - } - } -#endif if (PyList_Append(d, v) != 0) { Py_DECREF(v); - Py_DECREF(d); - d = NULL; + Py_CLEAR(d); break; } Py_DECREF(v); @@ -2402,7 +2711,7 @@ posix_listdir(PyObject *self, PyObject *args) Py_BEGIN_ALLOW_THREADS closedir(dirp); Py_END_ALLOW_THREADS - PyMem_Free(name); + Py_DECREF(oname); return d; @@ -2414,13 +2723,11 @@ posix_listdir(PyObject *self, PyObject *args) static PyObject * posix__getfullpathname(PyObject *self, PyObject *args) { - /* assume encoded strings won't more than double no of chars */ - char inbuf[MAX_PATH*2]; - char *inbufp = inbuf; - Py_ssize_t insize = sizeof(inbuf); + PyObject *opath; + char *path; char outbuf[MAX_PATH*2]; char *temp; - +#ifdef MS_WINDOWS PyUnicodeObject *po; if (PyArg_ParseTuple(args, "U|:_getfullpathname", &po)) { Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po); @@ -2449,19 +2756,154 @@ posix__getfullpathname(PyObject *self, PyObject *args) are also valid. */ PyErr_Clear(); - if (!PyArg_ParseTuple (args, "et#:_getfullpathname", - Py_FileSystemDefaultEncoding, &inbufp, - &insize)) +#endif + if (!PyArg_ParseTuple (args, "O&:_getfullpathname", + PyUnicode_FSConverter, &opath)) return NULL; - if (!GetFullPathName(inbuf, sizeof(outbuf)/sizeof(outbuf[0]), - outbuf, &temp)) - return win32_error("GetFullPathName", inbuf); + path = PyBytes_AsString(opath); + if (!GetFullPathName(path, sizeof(outbuf)/sizeof(outbuf[0]), + outbuf, &temp)) { + win32_error("GetFullPathName", path); + Py_DECREF(opath); + return NULL; + } + Py_DECREF(opath); if (PyUnicode_Check(PyTuple_GetItem(args, 0))) { return PyUnicode_Decode(outbuf, strlen(outbuf), Py_FileSystemDefaultEncoding, NULL); } - return PyString_FromString(outbuf); + return PyBytes_FromString(outbuf); } /* end of posix__getfullpathname */ + + + +/* A helper function for samepath on windows */ +static PyObject * +posix__getfinalpathname(PyObject *self, PyObject *args) +{ + HANDLE hFile; + int buf_size; + wchar_t *target_path; + int result_length; + PyObject *result; + wchar_t *path; + + if (!PyArg_ParseTuple(args, "u|:_getfinalpathname", &path)) { + return NULL; + } + + if(!check_GetFinalPathNameByHandle()) { + /* If the OS doesn't have GetFinalPathNameByHandle, return a + NotImplementedError. */ + return PyErr_Format(PyExc_NotImplementedError, + "GetFinalPathNameByHandle not available on this platform"); + } + + hFile = CreateFileW( + path, + 0, /* desired access */ + 0, /* share mode */ + NULL, /* security attributes */ + OPEN_EXISTING, + /* FILE_FLAG_BACKUP_SEMANTICS is required to open a directory */ + FILE_FLAG_BACKUP_SEMANTICS, + NULL); + + if(hFile == INVALID_HANDLE_VALUE) { + return win32_error_unicode("GetFinalPathNamyByHandle", path); + return PyErr_Format(PyExc_RuntimeError, + "Could not get a handle to file."); + } + + /* We have a good handle to the target, use it to determine the + target path name. */ + buf_size = Py_GetFinalPathNameByHandleW(hFile, 0, 0, VOLUME_NAME_NT); + + if(!buf_size) + return win32_error_unicode("GetFinalPathNameByHandle", path); + + target_path = (wchar_t *)malloc((buf_size+1)*sizeof(wchar_t)); + if(!target_path) + return PyErr_NoMemory(); + + result_length = Py_GetFinalPathNameByHandleW(hFile, target_path, + buf_size, VOLUME_NAME_DOS); + if(!result_length) + return win32_error_unicode("GetFinalPathNamyByHandle", path); + + if(!CloseHandle(hFile)) + return win32_error_unicode("GetFinalPathNameByHandle", path); + + target_path[result_length] = 0; + result = PyUnicode_FromUnicode(target_path, result_length); + 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."); + +static PyObject * +posix__isdir(PyObject *self, PyObject *args) +{ + PyObject *opath; + char *path; + PyUnicodeObject *po; + DWORD attributes; + + if (PyArg_ParseTuple(args, "U|:_isdir", &po)) { + Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po); + + attributes = GetFileAttributesW(wpath); + if (attributes == INVALID_FILE_ATTRIBUTES) + Py_RETURN_FALSE; + goto check; + } + /* Drop the argument parsing error as narrow strings + are also valid. */ + PyErr_Clear(); + + if (!PyArg_ParseTuple(args, "O&:_isdir", + PyUnicode_FSConverter, &opath)) + return NULL; + + path = PyBytes_AsString(opath); + attributes = GetFileAttributesA(path); + if (attributes == INVALID_FILE_ATTRIBUTES) + Py_RETURN_FALSE; + +check: + if (attributes & FILE_ATTRIBUTE_DIRECTORY) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} #endif /* MS_WINDOWS */ PyDoc_STRVAR(posix_mkdir__doc__, @@ -2472,7 +2914,8 @@ static PyObject * posix_mkdir(PyObject *self, PyObject *args) { int res; - char *path = NULL; + PyObject *opath; + char *path; int mode = 0777; #ifdef MS_WINDOWS @@ -2491,9 +2934,10 @@ posix_mkdir(PyObject *self, PyObject *args) /* Drop the argument parsing error as narrow strings are also valid. */ PyErr_Clear(); - if (!PyArg_ParseTuple(args, "et|i:mkdir", - Py_FileSystemDefaultEncoding, &path, &mode)) + if (!PyArg_ParseTuple(args, "O&|i:mkdir", + PyUnicode_FSConverter, &opath, &mode)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS /* PyUnicode_AS_UNICODE OK without thread lock as it is a simple dereference. */ @@ -2501,17 +2945,18 @@ posix_mkdir(PyObject *self, PyObject *args) Py_END_ALLOW_THREADS if (!res) { win32_error("mkdir", path); - PyMem_Free(path); + Py_DECREF(opath); return NULL; } - PyMem_Free(path); + Py_DECREF(opath); Py_INCREF(Py_None); return Py_None; -#else /* MS_WINDOWS */ +#else - if (!PyArg_ParseTuple(args, "et|i:mkdir", - Py_FileSystemDefaultEncoding, &path, &mode)) + if (!PyArg_ParseTuple(args, "O&|i:mkdir", + PyUnicode_FSConverter, &opath, &mode)) return NULL; + path = PyBytes_AsString(opath); Py_BEGIN_ALLOW_THREADS #if ( defined(__WATCOMC__) || defined(PYCC_VACPP) ) && !defined(__QNX__) res = mkdir(path); @@ -2520,11 +2965,11 @@ posix_mkdir(PyObject *self, PyObject *args) #endif Py_END_ALLOW_THREADS if (res < 0) - return posix_error_with_allocated_filename(path); - PyMem_Free(path); + return posix_error_with_allocated_filename(opath); + Py_DECREF(opath); Py_INCREF(Py_None); return Py_None; -#endif /* MS_WINDOWS */ +#endif } @@ -2566,7 +3011,7 @@ posix_nice(PyObject *self, PyObject *args) if (value == -1 && errno != 0) /* either nice() or getpriority() returned an error */ return posix_error(); - return PyInt_FromLong((long) value); + return PyLong_FromLong((long) value); } #endif /* HAVE_NICE */ @@ -2611,7 +3056,7 @@ error: Py_INCREF(Py_None); return Py_None; #else - return posix_2str(args, "etet:rename", rename); + return posix_2str(args, "O&O&:rename", rename); #endif } @@ -2624,9 +3069,9 @@ static PyObject * posix_rmdir(PyObject *self, PyObject *args) { #ifdef MS_WINDOWS - return win32_1str(args, "rmdir", "s:rmdir", RemoveDirectoryA, "U:rmdir", RemoveDirectoryW); + return win32_1str(args, "rmdir", "y:rmdir", RemoveDirectoryA, "U:rmdir", RemoveDirectoryW); #else - return posix_1str(args, "et:rmdir", rmdir); + return posix_1str(args, "O&:rmdir", rmdir); #endif } @@ -2639,9 +3084,9 @@ static PyObject * posix_stat(PyObject *self, PyObject *args) { #ifdef MS_WINDOWS - return posix_do_stat(self, args, "et:stat", STAT, "U:stat", win32_wstat); + return posix_do_stat(self, args, "O&:stat", STAT, "U:stat", win32_stat_w); #else - return posix_do_stat(self, args, "et:stat", STAT, NULL, NULL); + return posix_do_stat(self, args, "O&:stat", STAT, NULL, NULL); #endif } @@ -2654,14 +3099,29 @@ Execute the command (a string) in a subshell."); static PyObject * posix_system(PyObject *self, PyObject *args) { - char *command; long sts; - if (!PyArg_ParseTuple(args, "s:system", &command)) +#ifdef MS_WINDOWS + wchar_t *command; + if (!PyArg_ParseTuple(args, "u:system", &command)) + return NULL; + + Py_BEGIN_ALLOW_THREADS + sts = _wsystem(command); + Py_END_ALLOW_THREADS +#else + PyObject *command_obj; + char *command; + if (!PyArg_ParseTuple(args, "O&:system", + PyUnicode_FSConverter, &command_obj)) return NULL; + + command = PyBytes_AsString(command_obj); Py_BEGIN_ALLOW_THREADS sts = system(command); Py_END_ALLOW_THREADS - return PyInt_FromLong(sts); + Py_DECREF(command_obj); +#endif + return PyLong_FromLong(sts); } #endif @@ -2679,9 +3139,44 @@ posix_umask(PyObject *self, PyObject *args) i = (int)umask(i); if (i < 0) return posix_error(); - return PyInt_FromLong((long)i); + return PyLong_FromLong((long)i); } +#ifdef MS_WINDOWS + +/* override the default DeleteFileW behavior so that directory +symlinks can be removed with this function, the same as with +Unix symlinks */ +BOOL WINAPI Py_DeleteFileW(LPCWSTR lpFileName) +{ + WIN32_FILE_ATTRIBUTE_DATA info; + WIN32_FIND_DATAW find_data; + HANDLE find_data_handle; + int is_directory = 0; + int is_link = 0; + + if (GetFileAttributesExW(lpFileName, GetFileExInfoStandard, &info)) { + is_directory = info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; + + /* Get WIN32_FIND_DATA structure for the path to determine if + it is a symlink */ + if(is_directory && + info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { + find_data_handle = FindFirstFileW(lpFileName, &find_data); + + if(find_data_handle != INVALID_HANDLE_VALUE) { + is_link = find_data.dwReserved0 == IO_REPARSE_TAG_SYMLINK; + FindClose(find_data_handle); + } + } + } + + if (is_directory && is_link) + return RemoveDirectoryW(lpFileName); + + return DeleteFileW(lpFileName); +} +#endif /* MS_WINDOWS */ PyDoc_STRVAR(posix_unlink__doc__, "unlink(path)\n\n\ @@ -2695,9 +3190,10 @@ static PyObject * posix_unlink(PyObject *self, PyObject *args) { #ifdef MS_WINDOWS - return win32_1str(args, "remove", "s:remove", DeleteFileA, "U:remove", DeleteFileW); + return win32_1str(args, "remove", "y:remove", DeleteFileA, + "U:remove", Py_DeleteFileW); #else - return posix_1str(args, "et:remove", unlink); + return posix_1str(args, "O&:remove", unlink); #endif } @@ -2737,9 +3233,9 @@ extract_time(PyObject *t, time_t* sec, long* usec) if (!intobj) return -1; #if SIZEOF_TIME_T > SIZEOF_LONG - intval = PyInt_AsUnsignedLongLongMask(intobj); + intval = PyLong_AsUnsignedLongLongMask(intobj); #else - intval = PyInt_AsLong(intobj); + intval = PyLong_AsLong(intobj); #endif Py_DECREF(intobj); if (intval == -1 && PyErr_Occurred()) @@ -2753,9 +3249,9 @@ extract_time(PyObject *t, time_t* sec, long* usec) return 0; } #if SIZEOF_TIME_T > SIZEOF_LONG - intval = PyInt_AsUnsignedLongLongMask(t); + intval = PyLong_AsUnsignedLongLongMask(t); #else - intval = PyInt_AsLong(t); + intval = PyLong_AsLong(t); #endif if (intval == -1 && PyErr_Occurred()) return -1; @@ -2777,7 +3273,8 @@ posix_utime(PyObject *self, PyObject *args) PyObject *arg; PyUnicodeObject *obwpath; wchar_t *wpath = NULL; - char *apath = NULL; + PyObject *oapath; + char *apath; HANDLE hFile; time_t atimesec, mtimesec; long ausec, musec; @@ -2799,9 +3296,10 @@ posix_utime(PyObject *self, PyObject *args) PyErr_Clear(); if (!wpath) { - if (!PyArg_ParseTuple(args, "etO:utime", - Py_FileSystemDefaultEncoding, &apath, &arg)) + if (!PyArg_ParseTuple(args, "O&O:utime", + PyUnicode_FSConverter, &oapath, &arg)) return NULL; + apath = PyBytes_AsString(oapath); Py_BEGIN_ALLOW_THREADS hFile = CreateFileA(apath, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, @@ -2809,10 +3307,10 @@ posix_utime(PyObject *self, PyObject *args) Py_END_ALLOW_THREADS if (hFile == INVALID_HANDLE_VALUE) { win32_error("utime", apath); - PyMem_Free(apath); + Py_DECREF(oapath); return NULL; } - PyMem_Free(apath); + Py_DECREF(oapath); } if (arg == Py_None) { @@ -2854,7 +3352,8 @@ done: return result; #else /* MS_WINDOWS */ - char *path = NULL; + PyObject *opath; + char *path; time_t atime, mtime; long ausec, musec; int res; @@ -2878,9 +3377,10 @@ done: #endif /* HAVE_UTIMES */ - if (!PyArg_ParseTuple(args, "etO:utime", - Py_FileSystemDefaultEncoding, &path, &arg)) + if (!PyArg_ParseTuple(args, "O&O:utime", + PyUnicode_FSConverter, &opath, &arg)) return NULL; + path = PyBytes_AsString(opath); if (arg == Py_None) { /* optional time values not given */ Py_BEGIN_ALLOW_THREADS @@ -2890,18 +3390,18 @@ done: else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) { PyErr_SetString(PyExc_TypeError, "utime() arg 2 must be a tuple (atime, mtime)"); - PyMem_Free(path); + Py_DECREF(opath); return NULL; } else { if (extract_time(PyTuple_GET_ITEM(arg, 0), &atime, &ausec) == -1) { - PyMem_Free(path); + Py_DECREF(opath); return NULL; } if (extract_time(PyTuple_GET_ITEM(arg, 1), &mtime, &musec) == -1) { - PyMem_Free(path); + Py_DECREF(opath); return NULL; } ATIME = atime; @@ -2919,9 +3419,9 @@ done: #endif /* HAVE_UTIMES */ } if (res < 0) { - return posix_error_with_allocated_filename(path); + return posix_error_with_allocated_filename(opath); } - PyMem_Free(path); + Py_DECREF(opath); Py_INCREF(Py_None); return Py_None; #undef UTIME_ARG @@ -2956,6 +3456,22 @@ free_string_array(char **array, Py_ssize_t count) PyMem_Free(array[i]); PyMem_DEL(array); } + +static +int fsconvert_strdup(PyObject *o, char**out) +{ + PyObject *bytes; + Py_ssize_t size; + if (!PyUnicode_FSConverter(o, &bytes)) + return 0; + size = PyBytes_GET_SIZE(bytes); + *out = PyMem_Malloc(size+1); + if (!*out) + return 0; + memcpy(*out, PyBytes_AsString(bytes), size+1); + Py_DECREF(bytes); + return 1; +} #endif @@ -2970,6 +3486,7 @@ Execute an executable path with arguments, replacing current process.\n\ static PyObject * posix_execv(PyObject *self, PyObject *args) { + PyObject *opath; char *path; PyObject *argv; char **argvlist; @@ -2979,10 +3496,11 @@ posix_execv(PyObject *self, PyObject *args) /* execv has two arguments: (path, argv), where argv is a list or tuple of strings. */ - if (!PyArg_ParseTuple(args, "etO:execv", - Py_FileSystemDefaultEncoding, - &path, &argv)) + if (!PyArg_ParseTuple(args, "O&O:execv", + PyUnicode_FSConverter, + &opath, &argv)) return NULL; + path = PyBytes_AsString(opath); if (PyList_Check(argv)) { argc = PyList_Size(argv); getitem = PyList_GetItem; @@ -2993,28 +3511,27 @@ posix_execv(PyObject *self, PyObject *args) } else { PyErr_SetString(PyExc_TypeError, "execv() arg 2 must be a tuple or list"); - PyMem_Free(path); + Py_DECREF(opath); return NULL; } if (argc < 1) { PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty"); - PyMem_Free(path); + Py_DECREF(opath); return NULL; } argvlist = PyMem_NEW(char *, argc+1); if (argvlist == NULL) { - PyMem_Free(path); + Py_DECREF(opath); return PyErr_NoMemory(); } for (i = 0; i < argc; i++) { - if (!PyArg_Parse((*getitem)(argv, i), "et", - Py_FileSystemDefaultEncoding, - &argvlist[i])) { + if (!fsconvert_strdup((*getitem)(argv, i), + &argvlist[i])) { free_string_array(argvlist, i); PyErr_SetString(PyExc_TypeError, "execv() arg 2 must contain only strings"); - PyMem_Free(path); + Py_DECREF(opath); return NULL; } @@ -3026,10 +3543,90 @@ posix_execv(PyObject *self, PyObject *args) /* If we get here it's definitely an error */ free_string_array(argvlist, argc); - PyMem_Free(path); + Py_DECREF(opath); return posix_error(); } +static char** +parse_envlist(PyObject* env, Py_ssize_t *envc_ptr) +{ + char **envlist; + Py_ssize_t i, pos, envc; + PyObject *keys=NULL, *vals=NULL; + PyObject *key, *val, *key2, *val2; + char *p, *k, *v; + size_t len; + + i = PyMapping_Size(env); + if (i < 0) + return NULL; + envlist = PyMem_NEW(char *, i + 1); + if (envlist == NULL) { + PyErr_NoMemory(); + return NULL; + } + envc = 0; + keys = PyMapping_Keys(env); + vals = PyMapping_Values(env); + if (!keys || !vals) + goto error; + if (!PyList_Check(keys) || !PyList_Check(vals)) { + PyErr_Format(PyExc_TypeError, + "env.keys() or env.values() is not a list"); + goto error; + } + + for (pos = 0; pos < i; pos++) { + key = PyList_GetItem(keys, pos); + val = PyList_GetItem(vals, pos); + if (!key || !val) + goto error; + + if (PyUnicode_FSConverter(key, &key2) == 0) + goto error; + if (PyUnicode_FSConverter(val, &val2) == 0) { + Py_DECREF(key2); + 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; + + p = PyMem_NEW(char, len); + if (p == NULL) { + PyErr_NoMemory(); + Py_DECREF(key2); + Py_DECREF(val2); + goto error; + } + PyOS_snprintf(p, len, "%s=%s", k, v); + envlist[envc++] = p; + Py_DECREF(key2); + Py_DECREF(val2); +#if defined(PYOS_OS2) + } +#endif + } + Py_DECREF(vals); + Py_DECREF(keys); + + envlist[envc] = 0; + *envc_ptr = envc; + return envlist; + +error: + Py_XDECREF(keys); + Py_XDECREF(vals); + while (--envc >= 0) + PyMem_DEL(envlist[envc]); + PyMem_DEL(envlist); + return NULL; +} PyDoc_STRVAR(posix_execve__doc__, "execve(path, args, env)\n\n\ @@ -3042,12 +3639,12 @@ Execute a path with arguments and environment, replacing current process.\n\ static PyObject * posix_execve(PyObject *self, PyObject *args) { + PyObject *opath; char *path; PyObject *argv, *env; char **argvlist; char **envlist; - PyObject *key, *val, *keys=NULL, *vals=NULL; - Py_ssize_t i, pos, argc, envc; + Py_ssize_t i, argc, envc; PyObject *(*getitem)(PyObject *, Py_ssize_t); Py_ssize_t lastarg = 0; @@ -3055,10 +3652,11 @@ posix_execve(PyObject *self, PyObject *args) argv is a list or tuple of strings and env is a dictionary like posix.environ. */ - if (!PyArg_ParseTuple(args, "etOO:execve", - Py_FileSystemDefaultEncoding, - &path, &argv, &env)) + if (!PyArg_ParseTuple(args, "O&OO:execve", + PyUnicode_FSConverter, + &opath, &argv, &env)) return NULL; + path = PyBytes_AsString(opath); if (PyList_Check(argv)) { argc = PyList_Size(argv); getitem = PyList_GetItem; @@ -3084,10 +3682,8 @@ posix_execve(PyObject *self, PyObject *args) goto fail_0; } for (i = 0; i < argc; i++) { - if (!PyArg_Parse((*getitem)(argv, i), - "et;execve() arg 2 must contain only strings", - Py_FileSystemDefaultEncoding, - &argvlist[i])) + if (!fsconvert_strdup((*getitem)(argv, i), + &argvlist[i])) { lastarg = i; goto fail_1; @@ -3096,63 +3692,9 @@ posix_execve(PyObject *self, PyObject *args) lastarg = argc; argvlist[argc] = NULL; - i = PyMapping_Size(env); - if (i < 0) - goto fail_1; - envlist = PyMem_NEW(char *, i + 1); - if (envlist == NULL) { - PyErr_NoMemory(); + envlist = parse_envlist(env, &envc); + if (envlist == NULL) goto fail_1; - } - envc = 0; - keys = PyMapping_Keys(env); - vals = PyMapping_Values(env); - if (!keys || !vals) - goto fail_2; - if (!PyList_Check(keys) || !PyList_Check(vals)) { - PyErr_SetString(PyExc_TypeError, - "execve(): env.keys() or env.values() is not a list"); - goto fail_2; - } - - for (pos = 0; pos < i; pos++) { - char *p, *k, *v; - size_t len; - - key = PyList_GetItem(keys, pos); - val = PyList_GetItem(vals, pos); - if (!key || !val) - goto fail_2; - - if (!PyArg_Parse( - key, - "s;execve() arg 3 contains a non-string key", - &k) || - !PyArg_Parse( - val, - "s;execve() arg 3 contains a non-string value", - &v)) - { - goto fail_2; - } - -#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 - len = PyString_Size(key) + PyString_Size(val) + 2; - p = PyMem_NEW(char, len); - if (p == NULL) { - PyErr_NoMemory(); - goto fail_2; - } - PyOS_snprintf(p, len, "%s=%s", k, v); - envlist[envc++] = p; -#if defined(PYOS_OS2) - } -#endif - } - envlist[envc] = 0; execve(path, argvlist, envlist); @@ -3160,16 +3702,13 @@ posix_execve(PyObject *self, PyObject *args) (void) posix_error(); - fail_2: while (--envc >= 0) PyMem_DEL(envlist[envc]); PyMem_DEL(envlist); fail_1: free_string_array(argvlist, lastarg); - Py_XDECREF(vals); - Py_XDECREF(keys); fail_0: - PyMem_Free(path); + Py_DECREF(opath); return NULL; } #endif /* HAVE_EXECV */ @@ -3187,6 +3726,7 @@ Execute the program 'path' in a new process.\n\ static PyObject * posix_spawnv(PyObject *self, PyObject *args) { + PyObject *opath; char *path; PyObject *argv; char **argvlist; @@ -3198,10 +3738,11 @@ posix_spawnv(PyObject *self, PyObject *args) /* spawnv has three arguments: (mode, path, argv), where argv is a list or tuple of strings. */ - if (!PyArg_ParseTuple(args, "ietO:spawnv", &mode, - Py_FileSystemDefaultEncoding, - &path, &argv)) + if (!PyArg_ParseTuple(args, "iO&O:spawnv", &mode, + PyUnicode_FSConverter, + &opath, &argv)) return NULL; + path = PyBytes_AsString(opath); if (PyList_Check(argv)) { argc = PyList_Size(argv); getitem = PyList_GetItem; @@ -3213,24 +3754,23 @@ posix_spawnv(PyObject *self, PyObject *args) else { PyErr_SetString(PyExc_TypeError, "spawnv() arg 2 must be a tuple or list"); - PyMem_Free(path); + Py_DECREF(opath); return NULL; } argvlist = PyMem_NEW(char *, argc+1); if (argvlist == NULL) { - PyMem_Free(path); + Py_DECREF(opath); return PyErr_NoMemory(); } for (i = 0; i < argc; i++) { - if (!PyArg_Parse((*getitem)(argv, i), "et", - Py_FileSystemDefaultEncoding, - &argvlist[i])) { + if (!fsconvert_strdup((*getitem)(argv, i), + &argvlist[i])) { free_string_array(argvlist, i); PyErr_SetString( PyExc_TypeError, "spawnv() arg 2 must contain only strings"); - PyMem_Free(path); + Py_DECREF(opath); return NULL; } } @@ -3250,7 +3790,7 @@ posix_spawnv(PyObject *self, PyObject *args) #endif free_string_array(argvlist, argc); - PyMem_Free(path); + Py_DECREF(opath); if (spawnval == -1) return posix_error(); @@ -3275,13 +3815,14 @@ Execute the program 'path' in a new process.\n\ static PyObject * posix_spawnve(PyObject *self, PyObject *args) { + PyObject *opath; char *path; PyObject *argv, *env; char **argvlist; char **envlist; - PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL; - int mode, pos, envc; - Py_ssize_t argc, i; + PyObject *res = NULL; + int mode; + Py_ssize_t argc, i, envc; Py_intptr_t spawnval; PyObject *(*getitem)(PyObject *, Py_ssize_t); Py_ssize_t lastarg = 0; @@ -3290,10 +3831,11 @@ posix_spawnve(PyObject *self, PyObject *args) argv is a list or tuple of strings and env is a dictionary like posix.environ. */ - if (!PyArg_ParseTuple(args, "ietOO:spawnve", &mode, - Py_FileSystemDefaultEncoding, - &path, &argv, &env)) + if (!PyArg_ParseTuple(args, "iO&OO:spawnve", &mode, + PyUnicode_FSConverter, + &opath, &argv, &env)) return NULL; + path = PyBytes_AsString(opath); if (PyList_Check(argv)) { argc = PyList_Size(argv); getitem = PyList_GetItem; @@ -3319,10 +3861,8 @@ posix_spawnve(PyObject *self, PyObject *args) goto fail_0; } for (i = 0; i < argc; i++) { - if (!PyArg_Parse((*getitem)(argv, i), - "et;spawnve() arg 2 must contain only strings", - Py_FileSystemDefaultEncoding, - &argvlist[i])) + if (!fsconvert_strdup((*getitem)(argv, i), + &argvlist[i])) { lastarg = i; goto fail_1; @@ -3331,55 +3871,9 @@ posix_spawnve(PyObject *self, PyObject *args) lastarg = argc; argvlist[argc] = NULL; - i = PyMapping_Size(env); - if (i < 0) - goto fail_1; - envlist = PyMem_NEW(char *, i + 1); - if (envlist == NULL) { - PyErr_NoMemory(); + envlist = parse_envlist(env, &envc); + if (envlist == NULL) goto fail_1; - } - envc = 0; - keys = PyMapping_Keys(env); - vals = PyMapping_Values(env); - if (!keys || !vals) - goto fail_2; - if (!PyList_Check(keys) || !PyList_Check(vals)) { - PyErr_SetString(PyExc_TypeError, - "spawnve(): env.keys() or env.values() is not a list"); - goto fail_2; - } - - for (pos = 0; pos < i; pos++) { - char *p, *k, *v; - size_t len; - - key = PyList_GetItem(keys, pos); - val = PyList_GetItem(vals, pos); - if (!key || !val) - goto fail_2; - - if (!PyArg_Parse( - key, - "s;spawnve() arg 3 contains a non-string key", - &k) || - !PyArg_Parse( - val, - "s;spawnve() arg 3 contains a non-string value", - &v)) - { - goto fail_2; - } - len = PyString_Size(key) + PyString_Size(val) + 2; - p = PyMem_NEW(char, len); - if (p == NULL) { - PyErr_NoMemory(); - goto fail_2; - } - PyOS_snprintf(p, len, "%s=%s", k, v); - envlist[envc++] = p; - } - envlist[envc] = 0; #if defined(PYOS_OS2) && defined(PYCC_GCC) Py_BEGIN_ALLOW_THREADS @@ -3403,16 +3897,13 @@ posix_spawnve(PyObject *self, PyObject *args) res = Py_BuildValue("L", (PY_LONG_LONG) spawnval); #endif - fail_2: while (--envc >= 0) PyMem_DEL(envlist[envc]); PyMem_DEL(envlist); fail_1: free_string_array(argvlist, lastarg); - Py_XDECREF(vals); - Py_XDECREF(keys); fail_0: - PyMem_Free(path); + Py_DECREF(opath); return res; } @@ -3430,6 +3921,7 @@ search path to find the file.\n\ static PyObject * posix_spawnvp(PyObject *self, PyObject *args) { + PyObject *opath; char *path; PyObject *argv; char **argvlist; @@ -3440,10 +3932,11 @@ posix_spawnvp(PyObject *self, PyObject *args) /* spawnvp has three arguments: (mode, path, argv), where argv is a list or tuple of strings. */ - if (!PyArg_ParseTuple(args, "ietO:spawnvp", &mode, - Py_FileSystemDefaultEncoding, - &path, &argv)) + 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; @@ -3455,24 +3948,23 @@ posix_spawnvp(PyObject *self, PyObject *args) else { PyErr_SetString(PyExc_TypeError, "spawnvp() arg 2 must be a tuple or list"); - PyMem_Free(path); + Py_DECREF(opath); return NULL; } argvlist = PyMem_NEW(char *, argc+1); if (argvlist == NULL) { - PyMem_Free(path); + Py_DECREF(opath); return PyErr_NoMemory(); } for (i = 0; i < argc; i++) { - if (!PyArg_Parse((*getitem)(argv, i), "et", - Py_FileSystemDefaultEncoding, - &argvlist[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"); - PyMem_Free(path); + Py_DECREF(opath); return NULL; } } @@ -3487,7 +3979,7 @@ posix_spawnvp(PyObject *self, PyObject *args) Py_END_ALLOW_THREADS free_string_array(argvlist, argc); - PyMem_Free(path); + Py_DECREF(opath); if (spawnval == -1) return posix_error(); @@ -3509,12 +4001,14 @@ search path to find the file.\n\ static PyObject * posix_spawnvpe(PyObject *self, PyObject *args) { + PyObject *opath; char *path; PyObject *argv, *env; char **argvlist; char **envlist; - PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL; - int mode, i, pos, argc, envc; + PyObject *res=NULL; + int mode; + Py_ssize_t argc, i, envc; Py_intptr_t spawnval; PyObject *(*getitem)(PyObject *, Py_ssize_t); int lastarg = 0; @@ -3524,9 +4018,10 @@ posix_spawnvpe(PyObject *self, PyObject *args) like posix.environ. */ if (!PyArg_ParseTuple(args, "ietOO:spawnvpe", &mode, - Py_FileSystemDefaultEncoding, - &path, &argv, &env)) + PyUnicode_FSConverter, + &opath, &argv, &env)) return NULL; + path = PyBytes_AsString(opath); if (PyList_Check(argv)) { argc = PyList_Size(argv); getitem = PyList_GetItem; @@ -3552,10 +4047,8 @@ posix_spawnvpe(PyObject *self, PyObject *args) goto fail_0; } for (i = 0; i < argc; i++) { - if (!PyArg_Parse((*getitem)(argv, i), - "et;spawnvpe() arg 2 must contain only strings", - Py_FileSystemDefaultEncoding, - &argvlist[i])) + if (!fsconvert_strdup((*getitem)(argv, i), + &argvlist[i])) { lastarg = i; goto fail_1; @@ -3564,55 +4057,9 @@ posix_spawnvpe(PyObject *self, PyObject *args) lastarg = argc; argvlist[argc] = NULL; - i = PyMapping_Size(env); - if (i < 0) + envlist = parse_envlist(env, &envc); + if (envlist == NULL) goto fail_1; - envlist = PyMem_NEW(char *, i + 1); - if (envlist == NULL) { - PyErr_NoMemory(); - goto fail_1; - } - envc = 0; - keys = PyMapping_Keys(env); - vals = PyMapping_Values(env); - if (!keys || !vals) - goto fail_2; - if (!PyList_Check(keys) || !PyList_Check(vals)) { - PyErr_SetString(PyExc_TypeError, - "spawnvpe(): env.keys() or env.values() is not a list"); - goto fail_2; - } - - for (pos = 0; pos < i; pos++) { - char *p, *k, *v; - size_t len; - - key = PyList_GetItem(keys, pos); - val = PyList_GetItem(vals, pos); - if (!key || !val) - goto fail_2; - - if (!PyArg_Parse( - key, - "s;spawnvpe() arg 3 contains a non-string key", - &k) || - !PyArg_Parse( - val, - "s;spawnvpe() arg 3 contains a non-string value", - &v)) - { - goto fail_2; - } - len = PyString_Size(key) + PyString_Size(val) + 2; - p = PyMem_NEW(char, len); - if (p == NULL) { - PyErr_NoMemory(); - goto fail_2; - } - PyOS_snprintf(p, len, "%s=%s", k, v); - envlist[envc++] = p; - } - envlist[envc] = 0; Py_BEGIN_ALLOW_THREADS #if defined(PYCC_GCC) @@ -3627,16 +4074,13 @@ posix_spawnvpe(PyObject *self, PyObject *args) else res = Py_BuildValue("l", (long) spawnval); - fail_2: while (--envc >= 0) PyMem_DEL(envlist[envc]); PyMem_DEL(envlist); fail_1: free_string_array(argvlist, lastarg); - Py_XDECREF(vals); - Py_XDECREF(keys); fail_0: - PyMem_Free(path); + Py_DECREF(opath); return res; } #endif /* PYOS_OS2 */ @@ -3843,7 +4287,7 @@ Return the current process's effective group id."); static PyObject * posix_getegid(PyObject *self, PyObject *noargs) { - return PyInt_FromLong((long)getegid()); + return PyLong_FromLong((long)getegid()); } #endif @@ -3856,7 +4300,7 @@ Return the current process's effective user id."); static PyObject * posix_geteuid(PyObject *self, PyObject *noargs) { - return PyInt_FromLong((long)geteuid()); + return PyLong_FromLong((long)geteuid()); } #endif @@ -3869,7 +4313,7 @@ Return the current process's group id."); static PyObject * posix_getgid(PyObject *self, PyObject *noargs) { - return PyInt_FromLong((long)getgid()); + return PyLong_FromLong((long)getgid()); } #endif @@ -3944,7 +4388,7 @@ posix_getgroups(PyObject *self, PyObject *noargs) if (result != NULL) { int i; for (i = 0; i < n; ++i) { - PyObject *o = PyInt_FromLong((long)alt_grouplist[i]); + PyObject *o = PyLong_FromLong((long)alt_grouplist[i]); if (o == NULL) { Py_DECREF(result); result = NULL; @@ -3972,13 +4416,19 @@ group id."); static PyObject * posix_initgroups(PyObject *self, PyObject *args) { + PyObject *oname; char *username; + int res; long gid; - if (!PyArg_ParseTuple(args, "sl:initgroups", &username, &gid)) + if (!PyArg_ParseTuple(args, "O&l:initgroups", + PyUnicode_FSConverter, &oname, &gid)) return NULL; + username = PyBytes_AS_STRING(oname); - if (initgroups(username, (gid_t) gid) == -1) + res = initgroups(username, (gid_t) gid); + Py_DECREF(oname); + if (res == -1) return PyErr_SetFromErrno(PyExc_OSError); Py_INCREF(Py_None); @@ -3995,7 +4445,7 @@ static PyObject * posix_getpgid(PyObject *self, PyObject *args) { pid_t pid, pgid; - if (!PyArg_ParseTuple(args, PARSE_PID ":getpgid", &pid)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID ":getpgid", &pid)) return NULL; pgid = getpgid(pid); if (pgid < 0) @@ -4043,16 +4493,65 @@ posix_setpgrp(PyObject *self, PyObject *noargs) #endif /* HAVE_SETPGRP */ #ifdef HAVE_GETPPID + +#ifdef MS_WINDOWS +#include <tlhelp32.h> + +static PyObject* +win32_getppid() +{ + HANDLE snapshot; + pid_t mypid; + PyObject* result = NULL; + BOOL have_record; + PROCESSENTRY32 pe; + + mypid = getpid(); /* This function never fails */ + + snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (snapshot == INVALID_HANDLE_VALUE) + return PyErr_SetFromWindowsErr(GetLastError()); + + pe.dwSize = sizeof(pe); + have_record = Process32First(snapshot, &pe); + while (have_record) { + if (mypid == (pid_t)pe.th32ProcessID) { + /* We could cache the ulong value in a static variable. */ + result = PyLong_FromPid((pid_t)pe.th32ParentProcessID); + break; + } + + have_record = Process32Next(snapshot, &pe); + } + + /* If our loop exits and our pid was not found (result will be NULL) + * then GetLastError will return ERROR_NO_MORE_FILES. This is an + * error anyway, so let's raise it. */ + if (!result) + result = PyErr_SetFromWindowsErr(GetLastError()); + + CloseHandle(snapshot); + + return result; +} +#endif /*MS_WINDOWS*/ + PyDoc_STRVAR(posix_getppid__doc__, "getppid() -> ppid\n\n\ -Return the parent's process id."); +Return the parent's process id. If the parent process has already exited,\n\ +Windows machines will still return its id; others systems will return the id\n\ +of the 'init' process (1)."); static PyObject * posix_getppid(PyObject *self, PyObject *noargs) { +#ifdef MS_WINDOWS + return win32_getppid(); +#else return PyLong_FromPid(getppid()); -} #endif +} +#endif /* HAVE_GETPPID */ #ifdef HAVE_GETLOGIN @@ -4064,6 +4563,17 @@ static PyObject * posix_getlogin(PyObject *self, PyObject *noargs) { PyObject *result = NULL; +#ifdef MS_WINDOWS + wchar_t user_name[UNLEN + 1]; + DWORD num_chars = sizeof(user_name)/sizeof(user_name[0]); + + if (GetUserNameW(user_name, &num_chars)) { + /* num_chars is the number of unicode chars plus null terminator */ + result = PyUnicode_FromWideChar(user_name, num_chars - 1); + } + else + result = PyErr_SetFromWindowsErr(GetLastError()); +#else char *name; int old_errno = errno; @@ -4071,18 +4581,17 @@ posix_getlogin(PyObject *self, PyObject *noargs) name = getlogin(); if (name == NULL) { if (errno) - posix_error(); + posix_error(); else - PyErr_SetString(PyExc_OSError, - "unable to determine login name"); + PyErr_SetString(PyExc_OSError, "unable to determine login name"); } else - result = PyString_FromString(name); + result = PyUnicode_DecodeFSDefault(name); errno = old_errno; - +#endif return result; } -#endif +#endif /* HAVE_GETLOGIN */ #ifdef HAVE_GETUID PyDoc_STRVAR(posix_getuid__doc__, @@ -4092,7 +4601,7 @@ Return the current process's user id."); static PyObject * posix_getuid(PyObject *self, PyObject *noargs) { - return PyInt_FromLong((long)getuid()); + return PyLong_FromLong((long)getuid()); } #endif @@ -4107,7 +4616,7 @@ posix_kill(PyObject *self, PyObject *args) { pid_t pid; int sig; - if (!PyArg_ParseTuple(args, PARSE_PID "i:kill", &pid, &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) { @@ -4145,7 +4654,7 @@ posix_killpg(PyObject *self, PyObject *args) a pid_t. Since getpgrp() returns a pid_t, we assume killpg should take the same type. Moreover, pid_t is always at least as wide as int (else compilation of this module fails), which is safe. */ - if (!PyArg_ParseTuple(args, PARSE_PID "i:killpg", &pgid, &sig)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:killpg", &pgid, &sig)) return NULL; if (killpg(pgid, sig) == -1) return posix_error(); @@ -4174,7 +4683,7 @@ win32_kill(PyObject *self, PyObject *args) if (sig == CTRL_C_EVENT || sig == CTRL_BREAK_EVENT) { if (GenerateConsoleCtrlEvent(sig, pid) == 0) { err = GetLastError(); - return PyErr_SetFromWindowsErr(err); + PyErr_SetFromWindowsErr(err); } else Py_RETURN_NONE; @@ -4199,44 +4708,6 @@ win32_kill(PyObject *self, PyObject *args) CloseHandle(handle); return result; } - -PyDoc_STRVAR(posix__isdir__doc__, -"Return true if the pathname refers to an existing directory."); - -static PyObject * -posix__isdir(PyObject *self, PyObject *args) -{ - PyObject *opath; - char *path; - PyUnicodeObject *po; - DWORD attributes; - - if (PyArg_ParseTuple(args, "U|:_isdir", &po)) { - Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po); - - attributes = GetFileAttributesW(wpath); - if (attributes == INVALID_FILE_ATTRIBUTES) - Py_RETURN_FALSE; - goto check; - } - /* Drop the argument parsing error as narrow strings - are also valid. */ - PyErr_Clear(); - - if (!PyArg_ParseTuple(args, "et:_isdir", - Py_FileSystemDefaultEncoding, &path)) - return NULL; - - attributes = GetFileAttributesA(path); - if (attributes == INVALID_FILE_ATTRIBUTES) - Py_RETURN_FALSE; - -check: - if (attributes & FILE_ATTRIBUTE_DIRECTORY) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} #endif /* MS_WINDOWS */ #ifdef HAVE_PLOCK @@ -4262,1474 +4733,6 @@ posix_plock(PyObject *self, PyObject *args) } #endif - -#ifdef HAVE_POPEN -PyDoc_STRVAR(posix_popen__doc__, -"popen(command [, mode='r' [, bufsize]]) -> pipe\n\n\ -Open a pipe to/from a command returning a file object."); - -#if defined(PYOS_OS2) -#if defined(PYCC_VACPP) -static int -async_system(const char *command) -{ - char errormsg[256], args[1024]; - RESULTCODES rcodes; - APIRET rc; - - char *shell = getenv("COMSPEC"); - if (!shell) - shell = "cmd"; - - /* avoid overflowing the argument buffer */ - if (strlen(shell) + 3 + strlen(command) >= 1024) - return ERROR_NOT_ENOUGH_MEMORY - - args[0] = '\0'; - strcat(args, shell); - strcat(args, "/c "); - strcat(args, command); - - /* execute asynchronously, inheriting the environment */ - rc = DosExecPgm(errormsg, - sizeof(errormsg), - EXEC_ASYNC, - args, - NULL, - &rcodes, - shell); - return rc; -} - -static FILE * -popen(const char *command, const char *mode, int pipesize, int *err) -{ - int oldfd, tgtfd; - HFILE pipeh[2]; - APIRET rc; - - /* mode determines which of stdin or stdout is reconnected to - * the pipe to the child - */ - if (strchr(mode, 'r') != NULL) { - tgt_fd = 1; /* stdout */ - } else if (strchr(mode, 'w')) { - tgt_fd = 0; /* stdin */ - } else { - *err = ERROR_INVALID_ACCESS; - return NULL; - } - - /* setup the pipe */ - if ((rc = DosCreatePipe(&pipeh[0], &pipeh[1], pipesize)) != NO_ERROR) { - *err = rc; - return NULL; - } - - /* prevent other threads accessing stdio */ - DosEnterCritSec(); - - /* reconnect stdio and execute child */ - oldfd = dup(tgtfd); - close(tgtfd); - if (dup2(pipeh[tgtfd], tgtfd) == 0) { - DosClose(pipeh[tgtfd]); - rc = async_system(command); - } - - /* restore stdio */ - dup2(oldfd, tgtfd); - close(oldfd); - - /* allow other threads access to stdio */ - DosExitCritSec(); - - /* if execution of child was successful return file stream */ - if (rc == NO_ERROR) - return fdopen(pipeh[1 - tgtfd], mode); - else { - DosClose(pipeh[1 - tgtfd]); - *err = rc; - return NULL; - } -} - -static PyObject * -posix_popen(PyObject *self, PyObject *args) -{ - char *name; - char *mode = "r"; - int err, bufsize = -1; - FILE *fp; - PyObject *f; - if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize)) - return NULL; - Py_BEGIN_ALLOW_THREADS - fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err); - Py_END_ALLOW_THREADS - if (fp == NULL) - return os2_error(err); - - f = PyFile_FromFile(fp, name, mode, fclose); - if (f != NULL) - PyFile_SetBufSize(f, bufsize); - return f; -} - -#elif defined(PYCC_GCC) - -/* standard posix version of popen() support */ -static PyObject * -posix_popen(PyObject *self, PyObject *args) -{ - char *name; - char *mode = "r"; - int bufsize = -1; - FILE *fp; - PyObject *f; - if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize)) - return NULL; - Py_BEGIN_ALLOW_THREADS - fp = popen(name, mode); - Py_END_ALLOW_THREADS - if (fp == NULL) - return posix_error(); - f = PyFile_FromFile(fp, name, mode, pclose); - if (f != NULL) - PyFile_SetBufSize(f, bufsize); - return f; -} - -/* fork() under OS/2 has lots'o'warts - * EMX supports pipe() and spawn*() so we can synthesize popen[234]() - * most of this code is a ripoff of the win32 code, but using the - * capabilities of EMX's C library routines - */ - -/* These tell _PyPopen() whether to return 1, 2, or 3 file objects. */ -#define POPEN_1 1 -#define POPEN_2 2 -#define POPEN_3 3 -#define POPEN_4 4 - -static PyObject *_PyPopen(char *, int, int, int); -static int _PyPclose(FILE *file); - -/* - * Internal dictionary mapping popen* file pointers to process handles, - * for use when retrieving the process exit code. See _PyPclose() below - * for more information on this dictionary's use. - */ -static PyObject *_PyPopenProcs = NULL; - -/* os2emx version of popen2() - * - * The result of this function is a pipe (file) connected to the - * process's stdin, and a pipe connected to the process's stdout. - */ - -static PyObject * -os2emx_popen2(PyObject *self, PyObject *args) -{ - PyObject *f; - int tm=0; - - char *cmdstring; - char *mode = "t"; - int bufsize = -1; - if (!PyArg_ParseTuple(args, "s|si:popen2", &cmdstring, &mode, &bufsize)) - return NULL; - - if (*mode == 't') - tm = O_TEXT; - else if (*mode != 'b') { - PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'"); - return NULL; - } else - tm = O_BINARY; - - f = _PyPopen(cmdstring, tm, POPEN_2, bufsize); - - return f; -} - -/* - * Variation on os2emx.popen2 - * - * The result of this function is 3 pipes - the process's stdin, - * stdout and stderr - */ - -static PyObject * -os2emx_popen3(PyObject *self, PyObject *args) -{ - PyObject *f; - int tm = 0; - - char *cmdstring; - char *mode = "t"; - int bufsize = -1; - if (!PyArg_ParseTuple(args, "s|si:popen3", &cmdstring, &mode, &bufsize)) - return NULL; - - if (*mode == 't') - tm = O_TEXT; - else if (*mode != 'b') { - PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'"); - return NULL; - } else - tm = O_BINARY; - - f = _PyPopen(cmdstring, tm, POPEN_3, bufsize); - - return f; -} - -/* - * Variation on os2emx.popen2 - * - * The result of this function is 2 pipes - the processes stdin, - * and stdout+stderr combined as a single pipe. - */ - -static PyObject * -os2emx_popen4(PyObject *self, PyObject *args) -{ - PyObject *f; - int tm = 0; - - char *cmdstring; - char *mode = "t"; - int bufsize = -1; - if (!PyArg_ParseTuple(args, "s|si:popen4", &cmdstring, &mode, &bufsize)) - return NULL; - - if (*mode == 't') - tm = O_TEXT; - else if (*mode != 'b') { - PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'"); - return NULL; - } else - tm = O_BINARY; - - f = _PyPopen(cmdstring, tm, POPEN_4, bufsize); - - return f; -} - -/* a couple of structures for convenient handling of multiple - * file handles and pipes - */ -struct file_ref -{ - int handle; - int flags; -}; - -struct pipe_ref -{ - int rd; - int wr; -}; - -/* The following code is derived from the win32 code */ - -static PyObject * -_PyPopen(char *cmdstring, int mode, int n, int bufsize) -{ - struct file_ref stdio[3]; - struct pipe_ref p_fd[3]; - FILE *p_s[3]; - int file_count, i, pipe_err; - pid_t pipe_pid; - char *shell, *sh_name, *opt, *rd_mode, *wr_mode; - PyObject *f, *p_f[3]; - - /* file modes for subsequent fdopen's on pipe handles */ - if (mode == O_TEXT) - { - rd_mode = "rt"; - wr_mode = "wt"; - } - else - { - rd_mode = "rb"; - wr_mode = "wb"; - } - - /* prepare shell references */ - if ((shell = getenv("EMXSHELL")) == NULL) - if ((shell = getenv("COMSPEC")) == NULL) - { - errno = ENOENT; - return posix_error(); - } - - sh_name = _getname(shell); - if (stricmp(sh_name, "cmd.exe") == 0 || stricmp(sh_name, "4os2.exe") == 0) - opt = "/c"; - else - opt = "-c"; - - /* save current stdio fds + their flags, and set not inheritable */ - i = pipe_err = 0; - while (pipe_err >= 0 && i < 3) - { - pipe_err = stdio[i].handle = dup(i); - stdio[i].flags = fcntl(i, F_GETFD, 0); - fcntl(stdio[i].handle, F_SETFD, stdio[i].flags | FD_CLOEXEC); - i++; - } - if (pipe_err < 0) - { - /* didn't get them all saved - clean up and bail out */ - int saved_err = errno; - while (i-- > 0) - { - close(stdio[i].handle); - } - errno = saved_err; - return posix_error(); - } - - /* create pipe ends */ - file_count = 2; - if (n == POPEN_3) - file_count = 3; - i = pipe_err = 0; - while ((pipe_err == 0) && (i < file_count)) - pipe_err = pipe((int *)&p_fd[i++]); - if (pipe_err < 0) - { - /* didn't get them all made - clean up and bail out */ - while (i-- > 0) - { - close(p_fd[i].wr); - close(p_fd[i].rd); - } - errno = EPIPE; - return posix_error(); - } - - /* change the actual standard IO streams over temporarily, - * making the retained pipe ends non-inheritable - */ - pipe_err = 0; - - /* - stdin */ - if (dup2(p_fd[0].rd, 0) == 0) - { - close(p_fd[0].rd); - i = fcntl(p_fd[0].wr, F_GETFD, 0); - fcntl(p_fd[0].wr, F_SETFD, i | FD_CLOEXEC); - if ((p_s[0] = fdopen(p_fd[0].wr, wr_mode)) == NULL) - { - close(p_fd[0].wr); - pipe_err = -1; - } - } - else - { - pipe_err = -1; - } - - /* - stdout */ - if (pipe_err == 0) - { - if (dup2(p_fd[1].wr, 1) == 1) - { - close(p_fd[1].wr); - i = fcntl(p_fd[1].rd, F_GETFD, 0); - fcntl(p_fd[1].rd, F_SETFD, i | FD_CLOEXEC); - if ((p_s[1] = fdopen(p_fd[1].rd, rd_mode)) == NULL) - { - close(p_fd[1].rd); - pipe_err = -1; - } - } - else - { - pipe_err = -1; - } - } - - /* - stderr, as required */ - if (pipe_err == 0) - switch (n) - { - case POPEN_3: - { - if (dup2(p_fd[2].wr, 2) == 2) - { - close(p_fd[2].wr); - i = fcntl(p_fd[2].rd, F_GETFD, 0); - fcntl(p_fd[2].rd, F_SETFD, i | FD_CLOEXEC); - if ((p_s[2] = fdopen(p_fd[2].rd, rd_mode)) == NULL) - { - close(p_fd[2].rd); - pipe_err = -1; - } - } - else - { - pipe_err = -1; - } - break; - } - - case POPEN_4: - { - if (dup2(1, 2) != 2) - { - pipe_err = -1; - } - break; - } - } - - /* spawn the child process */ - if (pipe_err == 0) - { - pipe_pid = spawnlp(P_NOWAIT, shell, shell, opt, cmdstring, (char *)0); - if (pipe_pid == -1) - { - pipe_err = -1; - } - else - { - /* save the PID into the FILE structure - * NOTE: this implementation doesn't actually - * take advantage of this, but do it for - * completeness - AIM Apr01 - */ - for (i = 0; i < file_count; i++) - p_s[i]->_pid = pipe_pid; - } - } - - /* reset standard IO to normal */ - for (i = 0; i < 3; i++) - { - dup2(stdio[i].handle, i); - fcntl(i, F_SETFD, stdio[i].flags); - close(stdio[i].handle); - } - - /* if any remnant problems, clean up and bail out */ - if (pipe_err < 0) - { - for (i = 0; i < 3; i++) - { - close(p_fd[i].rd); - close(p_fd[i].wr); - } - errno = EPIPE; - return posix_error_with_filename(cmdstring); - } - - /* build tuple of file objects to return */ - if ((p_f[0] = PyFile_FromFile(p_s[0], cmdstring, wr_mode, _PyPclose)) != NULL) - PyFile_SetBufSize(p_f[0], bufsize); - if ((p_f[1] = PyFile_FromFile(p_s[1], cmdstring, rd_mode, _PyPclose)) != NULL) - PyFile_SetBufSize(p_f[1], bufsize); - if (n == POPEN_3) - { - if ((p_f[2] = PyFile_FromFile(p_s[2], cmdstring, rd_mode, _PyPclose)) != NULL) - PyFile_SetBufSize(p_f[0], bufsize); - f = PyTuple_Pack(3, p_f[0], p_f[1], p_f[2]); - } - else - f = PyTuple_Pack(2, p_f[0], p_f[1]); - - /* - * Insert the files we've created into the process dictionary - * all referencing the list with the process handle and the - * initial number of files (see description below in _PyPclose). - * Since if _PyPclose later tried to wait on a process when all - * handles weren't closed, it could create a deadlock with the - * child, we spend some energy here to try to ensure that we - * either insert all file handles into the dictionary or none - * at all. It's a little clumsy with the various popen modes - * and variable number of files involved. - */ - if (!_PyPopenProcs) - { - _PyPopenProcs = PyDict_New(); - } - - if (_PyPopenProcs) - { - PyObject *procObj, *pidObj, *intObj, *fileObj[3]; - int ins_rc[3]; - - fileObj[0] = fileObj[1] = fileObj[2] = NULL; - ins_rc[0] = ins_rc[1] = ins_rc[2] = 0; - - procObj = PyList_New(2); - pidObj = PyLong_FromPid(pipe_pid); - intObj = PyInt_FromLong((long) file_count); - - if (procObj && pidObj && intObj) - { - PyList_SetItem(procObj, 0, pidObj); - PyList_SetItem(procObj, 1, intObj); - - fileObj[0] = PyLong_FromVoidPtr(p_s[0]); - if (fileObj[0]) - { - ins_rc[0] = PyDict_SetItem(_PyPopenProcs, - fileObj[0], - procObj); - } - fileObj[1] = PyLong_FromVoidPtr(p_s[1]); - if (fileObj[1]) - { - ins_rc[1] = PyDict_SetItem(_PyPopenProcs, - fileObj[1], - procObj); - } - if (file_count >= 3) - { - fileObj[2] = PyLong_FromVoidPtr(p_s[2]); - if (fileObj[2]) - { - ins_rc[2] = PyDict_SetItem(_PyPopenProcs, - fileObj[2], - procObj); - } - } - - if (ins_rc[0] < 0 || !fileObj[0] || - ins_rc[1] < 0 || (file_count > 1 && !fileObj[1]) || - ins_rc[2] < 0 || (file_count > 2 && !fileObj[2])) - { - /* Something failed - remove any dictionary - * entries that did make it. - */ - if (!ins_rc[0] && fileObj[0]) - { - PyDict_DelItem(_PyPopenProcs, - fileObj[0]); - } - if (!ins_rc[1] && fileObj[1]) - { - PyDict_DelItem(_PyPopenProcs, - fileObj[1]); - } - if (!ins_rc[2] && fileObj[2]) - { - PyDict_DelItem(_PyPopenProcs, - fileObj[2]); - } - } - } - - /* - * Clean up our localized references for the dictionary keys - * and value since PyDict_SetItem will Py_INCREF any copies - * that got placed in the dictionary. - */ - Py_XDECREF(procObj); - Py_XDECREF(fileObj[0]); - Py_XDECREF(fileObj[1]); - Py_XDECREF(fileObj[2]); - } - - /* Child is launched. */ - return f; -} - -/* - * Wrapper for fclose() to use for popen* files, so we can retrieve the - * exit code for the child process and return as a result of the close. - * - * This function uses the _PyPopenProcs dictionary in order to map the - * input file pointer to information about the process that was - * originally created by the popen* call that created the file pointer. - * The dictionary uses the file pointer as a key (with one entry - * inserted for each file returned by the original popen* call) and a - * single list object as the value for all files from a single call. - * The list object contains the Win32 process handle at [0], and a file - * count at [1], which is initialized to the total number of file - * handles using that list. - * - * This function closes whichever handle it is passed, and decrements - * the file count in the dictionary for the process handle pointed to - * by this file. On the last close (when the file count reaches zero), - * this function will wait for the child process and then return its - * exit code as the result of the close() operation. This permits the - * files to be closed in any order - it is always the close() of the - * final handle that will return the exit code. - * - * NOTE: This function is currently called with the GIL released. - * hence we use the GILState API to manage our state. - */ - -static int _PyPclose(FILE *file) -{ - int result; - int exit_code; - pid_t pipe_pid; - PyObject *procObj, *pidObj, *intObj, *fileObj; - int file_count; -#ifdef WITH_THREAD - PyGILState_STATE state; -#endif - - /* Close the file handle first, to ensure it can't block the - * child from exiting if it's the last handle. - */ - result = fclose(file); - -#ifdef WITH_THREAD - state = PyGILState_Ensure(); -#endif - if (_PyPopenProcs) - { - if ((fileObj = PyLong_FromVoidPtr(file)) != NULL && - (procObj = PyDict_GetItem(_PyPopenProcs, - fileObj)) != NULL && - (pidObj = PyList_GetItem(procObj,0)) != NULL && - (intObj = PyList_GetItem(procObj,1)) != NULL) - { - pipe_pid = (pid_t) PyLong_AsPid(pidObj); - file_count = (int) PyInt_AsLong(intObj); - - if (file_count > 1) - { - /* Still other files referencing process */ - file_count--; - PyList_SetItem(procObj,1, - PyInt_FromLong((long) file_count)); - } - else - { - /* Last file for this process */ - if (result != EOF && - waitpid(pipe_pid, &exit_code, 0) == pipe_pid) - { - /* extract exit status */ - if (WIFEXITED(exit_code)) - { - result = WEXITSTATUS(exit_code); - } - else - { - errno = EPIPE; - result = -1; - } - } - else - { - /* Indicate failure - this will cause the file object - * to raise an I/O error and translate the last - * error code from errno. We do have a problem with - * last errors that overlap the normal errno table, - * but that's a consistent problem with the file object. - */ - result = -1; - } - } - - /* Remove this file pointer from dictionary */ - PyDict_DelItem(_PyPopenProcs, fileObj); - - if (PyDict_Size(_PyPopenProcs) == 0) - { - Py_DECREF(_PyPopenProcs); - _PyPopenProcs = NULL; - } - - } /* if object retrieval ok */ - - Py_XDECREF(fileObj); - } /* if _PyPopenProcs */ - -#ifdef WITH_THREAD - PyGILState_Release(state); -#endif - return result; -} - -#endif /* PYCC_??? */ - -#elif defined(MS_WINDOWS) - -/* - * Portable 'popen' replacement for Win32. - * - * Written by Bill Tutt <billtut@microsoft.com>. Minor tweaks - * and 2.0 integration by Fredrik Lundh <fredrik@pythonware.com> - * Return code handling by David Bolen <db3l@fitlinxx.com>. - */ - -#include <malloc.h> -#include <io.h> -#include <fcntl.h> - -/* These tell _PyPopen() wether to return 1, 2, or 3 file objects. */ -#define POPEN_1 1 -#define POPEN_2 2 -#define POPEN_3 3 -#define POPEN_4 4 - -static PyObject *_PyPopen(char *, int, int); -static int _PyPclose(FILE *file); - -/* - * Internal dictionary mapping popen* file pointers to process handles, - * for use when retrieving the process exit code. See _PyPclose() below - * for more information on this dictionary's use. - */ -static PyObject *_PyPopenProcs = NULL; - - -/* popen that works from a GUI. - * - * The result of this function is a pipe (file) connected to the - * processes stdin or stdout, depending on the requested mode. - */ - -static PyObject * -posix_popen(PyObject *self, PyObject *args) -{ - PyObject *f; - int tm = 0; - - char *cmdstring; - char *mode = "r"; - int bufsize = -1; - if (!PyArg_ParseTuple(args, "s|si:popen", &cmdstring, &mode, &bufsize)) - return NULL; - - if (*mode == 'r') - tm = _O_RDONLY; - else if (*mode != 'w') { - PyErr_SetString(PyExc_ValueError, "popen() arg 2 must be 'r' or 'w'"); - return NULL; - } else - tm = _O_WRONLY; - - if (bufsize != -1) { - PyErr_SetString(PyExc_ValueError, "popen() arg 3 must be -1"); - return NULL; - } - - if (*(mode+1) == 't') - f = _PyPopen(cmdstring, tm | _O_TEXT, POPEN_1); - else if (*(mode+1) == 'b') - f = _PyPopen(cmdstring, tm | _O_BINARY, POPEN_1); - else - f = _PyPopen(cmdstring, tm | _O_TEXT, POPEN_1); - - return f; -} - -/* Variation on win32pipe.popen - * - * The result of this function is a pipe (file) connected to the - * process's stdin, and a pipe connected to the process's stdout. - */ - -static PyObject * -win32_popen2(PyObject *self, PyObject *args) -{ - PyObject *f; - int tm=0; - - char *cmdstring; - char *mode = "t"; - int bufsize = -1; - if (!PyArg_ParseTuple(args, "s|si:popen2", &cmdstring, &mode, &bufsize)) - return NULL; - - if (*mode == 't') - tm = _O_TEXT; - else if (*mode != 'b') { - PyErr_SetString(PyExc_ValueError, "popen2() arg 2 must be 't' or 'b'"); - return NULL; - } else - tm = _O_BINARY; - - if (bufsize != -1) { - PyErr_SetString(PyExc_ValueError, "popen2() arg 3 must be -1"); - return NULL; - } - - f = _PyPopen(cmdstring, tm, POPEN_2); - - return f; -} - -/* - * Variation on <om win32pipe.popen> - * - * The result of this function is 3 pipes - the process's stdin, - * stdout and stderr - */ - -static PyObject * -win32_popen3(PyObject *self, PyObject *args) -{ - PyObject *f; - int tm = 0; - - char *cmdstring; - char *mode = "t"; - int bufsize = -1; - if (!PyArg_ParseTuple(args, "s|si:popen3", &cmdstring, &mode, &bufsize)) - return NULL; - - if (*mode == 't') - tm = _O_TEXT; - else if (*mode != 'b') { - PyErr_SetString(PyExc_ValueError, "popen3() arg 2 must be 't' or 'b'"); - return NULL; - } else - tm = _O_BINARY; - - if (bufsize != -1) { - PyErr_SetString(PyExc_ValueError, "popen3() arg 3 must be -1"); - return NULL; - } - - f = _PyPopen(cmdstring, tm, POPEN_3); - - return f; -} - -/* - * Variation on win32pipe.popen - * - * The result of this function is 2 pipes - the processes stdin, - * and stdout+stderr combined as a single pipe. - */ - -static PyObject * -win32_popen4(PyObject *self, PyObject *args) -{ - PyObject *f; - int tm = 0; - - char *cmdstring; - char *mode = "t"; - int bufsize = -1; - if (!PyArg_ParseTuple(args, "s|si:popen4", &cmdstring, &mode, &bufsize)) - return NULL; - - if (*mode == 't') - tm = _O_TEXT; - else if (*mode != 'b') { - PyErr_SetString(PyExc_ValueError, "popen4() arg 2 must be 't' or 'b'"); - return NULL; - } else - tm = _O_BINARY; - - if (bufsize != -1) { - PyErr_SetString(PyExc_ValueError, "popen4() arg 3 must be -1"); - return NULL; - } - - f = _PyPopen(cmdstring, tm, POPEN_4); - - return f; -} - -static BOOL -_PyPopenCreateProcess(char *cmdstring, - HANDLE hStdin, - HANDLE hStdout, - HANDLE hStderr, - HANDLE *hProcess) -{ - PROCESS_INFORMATION piProcInfo; - STARTUPINFO siStartInfo; - DWORD dwProcessFlags = 0; /* no NEW_CONSOLE by default for Ctrl+C handling */ - char *s1,*s2, *s3 = " /c "; - const char *szConsoleSpawn = "w9xpopen.exe"; - int i; - Py_ssize_t x; - - if (i = GetEnvironmentVariable("COMSPEC",NULL,0)) { - char *comshell; - - s1 = (char *)alloca(i); - if (!(x = GetEnvironmentVariable("COMSPEC", s1, i))) - /* x < i, so x fits into an integer */ - return (int)x; - - /* Explicitly check if we are using COMMAND.COM. If we are - * then use the w9xpopen hack. - */ - comshell = s1 + x; - while (comshell >= s1 && *comshell != '\\') - --comshell; - ++comshell; - - if (GetVersion() < 0x80000000 && - _stricmp(comshell, "command.com") != 0) { - /* NT/2000 and not using command.com. */ - x = i + strlen(s3) + strlen(cmdstring) + 1; - s2 = (char *)alloca(x); - ZeroMemory(s2, x); - PyOS_snprintf(s2, x, "%s%s%s", s1, s3, cmdstring); - } - else { - /* - * Oh gag, we're on Win9x or using COMMAND.COM. Use - * the workaround listed in KB: Q150956 - */ - char modulepath[_MAX_PATH]; - struct stat statinfo; - GetModuleFileName(NULL, modulepath, sizeof(modulepath)); - for (x = i = 0; modulepath[i]; i++) - if (modulepath[i] == SEP) - x = i+1; - modulepath[x] = '\0'; - /* Create the full-name to w9xpopen, so we can test it exists */ - strncat(modulepath, - szConsoleSpawn, - (sizeof(modulepath)/sizeof(modulepath[0])) - -strlen(modulepath)); - if (stat(modulepath, &statinfo) != 0) { - size_t mplen = sizeof(modulepath)/sizeof(modulepath[0]); - /* Eeek - file-not-found - possibly an embedding - situation - see if we can locate it in sys.prefix - */ - strncpy(modulepath, - Py_GetExecPrefix(), - mplen); - modulepath[mplen-1] = '\0'; - if (modulepath[strlen(modulepath)-1] != '\\') - strcat(modulepath, "\\"); - strncat(modulepath, - szConsoleSpawn, - mplen-strlen(modulepath)); - /* No where else to look - raise an easily identifiable - error, rather than leaving Windows to report - "file not found" - as the user is probably blissfully - unaware this shim EXE is used, and it will confuse them. - (well, it confused me for a while ;-) - */ - if (stat(modulepath, &statinfo) != 0) { - PyErr_Format(PyExc_RuntimeError, - "Can not locate '%s' which is needed " - "for popen to work with your shell " - "or platform.", - szConsoleSpawn); - return FALSE; - } - } - x = i + strlen(s3) + strlen(cmdstring) + 1 + - strlen(modulepath) + - strlen(szConsoleSpawn) + 1; - - s2 = (char *)alloca(x); - ZeroMemory(s2, x); - /* To maintain correct argument passing semantics, - we pass the command-line as it stands, and allow - quoting to be applied. w9xpopen.exe will then - use its argv vector, and re-quote the necessary - args for the ultimate child process. - */ - PyOS_snprintf( - s2, x, - "\"%s\" %s%s%s", - modulepath, - s1, - s3, - cmdstring); - /* 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, but anyone - who cares can have a go! - */ - dwProcessFlags |= CREATE_NEW_CONSOLE; - } - } - - /* Could be an else here to try cmd.exe / command.com in the path - Now we'll just error out.. */ - else { - PyErr_SetString(PyExc_RuntimeError, - "Cannot locate a COMSPEC environment variable to " - "use as the shell"); - return FALSE; - } - - ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); - siStartInfo.cb = sizeof(STARTUPINFO); - siStartInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; - siStartInfo.hStdInput = hStdin; - siStartInfo.hStdOutput = hStdout; - siStartInfo.hStdError = hStderr; - siStartInfo.wShowWindow = SW_HIDE; - - if (CreateProcess(NULL, - s2, - NULL, - NULL, - TRUE, - dwProcessFlags, - NULL, - NULL, - &siStartInfo, - &piProcInfo) ) { - /* Close the handles now so anyone waiting is woken. */ - CloseHandle(piProcInfo.hThread); - - /* Return process handle */ - *hProcess = piProcInfo.hProcess; - return TRUE; - } - win32_error("CreateProcess", s2); - return FALSE; -} - -/* The following code is based off of KB: Q190351 */ - -static PyObject * -_PyPopen(char *cmdstring, int mode, int n) -{ - HANDLE hChildStdinRd, hChildStdinWr, hChildStdoutRd, hChildStdoutWr, - hChildStderrRd, hChildStderrWr, hChildStdinWrDup, hChildStdoutRdDup, - hChildStderrRdDup, hProcess; /* hChildStdoutWrDup; */ - - SECURITY_ATTRIBUTES saAttr; - BOOL fSuccess; - int fd1, fd2, fd3; - FILE *f1, *f2, *f3; - long file_count; - PyObject *f; - - saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; - - if (!CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) - return win32_error("CreatePipe", NULL); - - /* Create new output read handle and the input write handle. Set - * the inheritance properties to FALSE. Otherwise, the child inherits - * these handles; resulting in non-closeable handles to the pipes - * being created. */ - fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr, - GetCurrentProcess(), &hChildStdinWrDup, 0, - FALSE, - DUPLICATE_SAME_ACCESS); - if (!fSuccess) - return win32_error("DuplicateHandle", NULL); - - /* Close the inheritable version of ChildStdin - that we're using. */ - CloseHandle(hChildStdinWr); - - if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) - return win32_error("CreatePipe", NULL); - - fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd, - GetCurrentProcess(), &hChildStdoutRdDup, 0, - FALSE, DUPLICATE_SAME_ACCESS); - if (!fSuccess) - return win32_error("DuplicateHandle", NULL); - - /* Close the inheritable version of ChildStdout - that we're using. */ - CloseHandle(hChildStdoutRd); - - if (n != POPEN_4) { - if (!CreatePipe(&hChildStderrRd, &hChildStderrWr, &saAttr, 0)) - return win32_error("CreatePipe", NULL); - fSuccess = DuplicateHandle(GetCurrentProcess(), - hChildStderrRd, - GetCurrentProcess(), - &hChildStderrRdDup, 0, - FALSE, DUPLICATE_SAME_ACCESS); - if (!fSuccess) - return win32_error("DuplicateHandle", NULL); - /* Close the inheritable version of ChildStdErr that we're using. */ - CloseHandle(hChildStderrRd); - } - - switch (n) { - case POPEN_1: - switch (mode & (_O_RDONLY | _O_TEXT | _O_BINARY | _O_WRONLY)) { - case _O_WRONLY | _O_TEXT: - /* Case for writing to child Stdin in text mode. */ - fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode); - f1 = _fdopen(fd1, "w"); - f = PyFile_FromFile(f1, cmdstring, "w", _PyPclose); - PyFile_SetBufSize(f, 0); - /* We don't care about these pipes anymore, so close them. */ - CloseHandle(hChildStdoutRdDup); - CloseHandle(hChildStderrRdDup); - break; - - case _O_RDONLY | _O_TEXT: - /* Case for reading from child Stdout in text mode. */ - fd1 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode); - f1 = _fdopen(fd1, "r"); - f = PyFile_FromFile(f1, cmdstring, "r", _PyPclose); - PyFile_SetBufSize(f, 0); - /* We don't care about these pipes anymore, so close them. */ - CloseHandle(hChildStdinWrDup); - CloseHandle(hChildStderrRdDup); - break; - - case _O_RDONLY | _O_BINARY: - /* Case for readinig from child Stdout in binary mode. */ - fd1 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode); - f1 = _fdopen(fd1, "rb"); - f = PyFile_FromFile(f1, cmdstring, "rb", _PyPclose); - PyFile_SetBufSize(f, 0); - /* We don't care about these pipes anymore, so close them. */ - CloseHandle(hChildStdinWrDup); - CloseHandle(hChildStderrRdDup); - break; - - case _O_WRONLY | _O_BINARY: - /* Case for writing to child Stdin in binary mode. */ - fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode); - f1 = _fdopen(fd1, "wb"); - f = PyFile_FromFile(f1, cmdstring, "wb", _PyPclose); - PyFile_SetBufSize(f, 0); - /* We don't care about these pipes anymore, so close them. */ - CloseHandle(hChildStdoutRdDup); - CloseHandle(hChildStderrRdDup); - break; - } - file_count = 1; - break; - - case POPEN_2: - case POPEN_4: - { - char *m1, *m2; - PyObject *p1, *p2; - - if (mode & _O_TEXT) { - m1 = "r"; - m2 = "w"; - } else { - m1 = "rb"; - m2 = "wb"; - } - - fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode); - f1 = _fdopen(fd1, m2); - fd2 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode); - f2 = _fdopen(fd2, m1); - p1 = PyFile_FromFile(f1, cmdstring, m2, _PyPclose); - PyFile_SetBufSize(p1, 0); - p2 = PyFile_FromFile(f2, cmdstring, m1, _PyPclose); - PyFile_SetBufSize(p2, 0); - - if (n != 4) - CloseHandle(hChildStderrRdDup); - - f = PyTuple_Pack(2,p1,p2); - Py_XDECREF(p1); - Py_XDECREF(p2); - file_count = 2; - break; - } - - case POPEN_3: - { - char *m1, *m2; - PyObject *p1, *p2, *p3; - - if (mode & _O_TEXT) { - m1 = "r"; - m2 = "w"; - } else { - m1 = "rb"; - m2 = "wb"; - } - - fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode); - f1 = _fdopen(fd1, m2); - fd2 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode); - f2 = _fdopen(fd2, m1); - fd3 = _open_osfhandle((Py_intptr_t)hChildStderrRdDup, mode); - f3 = _fdopen(fd3, m1); - p1 = PyFile_FromFile(f1, cmdstring, m2, _PyPclose); - p2 = PyFile_FromFile(f2, cmdstring, m1, _PyPclose); - p3 = PyFile_FromFile(f3, cmdstring, m1, _PyPclose); - PyFile_SetBufSize(p1, 0); - PyFile_SetBufSize(p2, 0); - PyFile_SetBufSize(p3, 0); - f = PyTuple_Pack(3,p1,p2,p3); - Py_XDECREF(p1); - Py_XDECREF(p2); - Py_XDECREF(p3); - file_count = 3; - break; - } - } - - if (n == POPEN_4) { - if (!_PyPopenCreateProcess(cmdstring, - hChildStdinRd, - hChildStdoutWr, - hChildStdoutWr, - &hProcess)) - return NULL; - } - else { - if (!_PyPopenCreateProcess(cmdstring, - hChildStdinRd, - hChildStdoutWr, - hChildStderrWr, - &hProcess)) - return NULL; - } - - /* - * Insert the files we've created into the process dictionary - * all referencing the list with the process handle and the - * initial number of files (see description below in _PyPclose). - * Since if _PyPclose later tried to wait on a process when all - * handles weren't closed, it could create a deadlock with the - * child, we spend some energy here to try to ensure that we - * either insert all file handles into the dictionary or none - * at all. It's a little clumsy with the various popen modes - * and variable number of files involved. - */ - if (!_PyPopenProcs) { - _PyPopenProcs = PyDict_New(); - } - - if (_PyPopenProcs) { - PyObject *procObj, *hProcessObj, *intObj, *fileObj[3]; - int ins_rc[3]; - - fileObj[0] = fileObj[1] = fileObj[2] = NULL; - ins_rc[0] = ins_rc[1] = ins_rc[2] = 0; - - procObj = PyList_New(2); - hProcessObj = PyLong_FromVoidPtr(hProcess); - intObj = PyInt_FromLong(file_count); - - if (procObj && hProcessObj && intObj) { - PyList_SetItem(procObj,0,hProcessObj); - PyList_SetItem(procObj,1,intObj); - - fileObj[0] = PyLong_FromVoidPtr(f1); - if (fileObj[0]) { - ins_rc[0] = PyDict_SetItem(_PyPopenProcs, - fileObj[0], - procObj); - } - if (file_count >= 2) { - fileObj[1] = PyLong_FromVoidPtr(f2); - if (fileObj[1]) { - ins_rc[1] = PyDict_SetItem(_PyPopenProcs, - fileObj[1], - procObj); - } - } - if (file_count >= 3) { - fileObj[2] = PyLong_FromVoidPtr(f3); - if (fileObj[2]) { - ins_rc[2] = PyDict_SetItem(_PyPopenProcs, - fileObj[2], - procObj); - } - } - - if (ins_rc[0] < 0 || !fileObj[0] || - ins_rc[1] < 0 || (file_count > 1 && !fileObj[1]) || - ins_rc[2] < 0 || (file_count > 2 && !fileObj[2])) { - /* Something failed - remove any dictionary - * entries that did make it. - */ - if (!ins_rc[0] && fileObj[0]) { - PyDict_DelItem(_PyPopenProcs, - fileObj[0]); - } - if (!ins_rc[1] && fileObj[1]) { - PyDict_DelItem(_PyPopenProcs, - fileObj[1]); - } - if (!ins_rc[2] && fileObj[2]) { - PyDict_DelItem(_PyPopenProcs, - fileObj[2]); - } - } - } - - /* - * Clean up our localized references for the dictionary keys - * and value since PyDict_SetItem will Py_INCREF any copies - * that got placed in the dictionary. - */ - Py_XDECREF(procObj); - Py_XDECREF(fileObj[0]); - Py_XDECREF(fileObj[1]); - Py_XDECREF(fileObj[2]); - } - - /* Child is launched. Close the parents copy of those pipe - * handles that only the child should have open. You need to - * make sure that no handles to the write end of the output pipe - * are maintained in this process or else the pipe will not close - * when the child process exits and the ReadFile will hang. */ - - if (!CloseHandle(hChildStdinRd)) - return win32_error("CloseHandle", NULL); - - if (!CloseHandle(hChildStdoutWr)) - return win32_error("CloseHandle", NULL); - - if ((n != 4) && (!CloseHandle(hChildStderrWr))) - return win32_error("CloseHandle", NULL); - - return f; -} - -/* - * Wrapper for fclose() to use for popen* files, so we can retrieve the - * exit code for the child process and return as a result of the close. - * - * This function uses the _PyPopenProcs dictionary in order to map the - * input file pointer to information about the process that was - * originally created by the popen* call that created the file pointer. - * The dictionary uses the file pointer as a key (with one entry - * inserted for each file returned by the original popen* call) and a - * single list object as the value for all files from a single call. - * The list object contains the Win32 process handle at [0], and a file - * count at [1], which is initialized to the total number of file - * handles using that list. - * - * This function closes whichever handle it is passed, and decrements - * the file count in the dictionary for the process handle pointed to - * by this file. On the last close (when the file count reaches zero), - * this function will wait for the child process and then return its - * exit code as the result of the close() operation. This permits the - * files to be closed in any order - it is always the close() of the - * final handle that will return the exit code. - * - * NOTE: This function is currently called with the GIL released. - * hence we use the GILState API to manage our state. - */ - -static int _PyPclose(FILE *file) -{ - int result; - DWORD exit_code; - HANDLE hProcess; - PyObject *procObj, *hProcessObj, *intObj, *fileObj; - long file_count; -#ifdef WITH_THREAD - PyGILState_STATE state; -#endif - - /* Close the file handle first, to ensure it can't block the - * child from exiting if it's the last handle. - */ - result = fclose(file); -#ifdef WITH_THREAD - state = PyGILState_Ensure(); -#endif - if (_PyPopenProcs) { - if ((fileObj = PyLong_FromVoidPtr(file)) != NULL && - (procObj = PyDict_GetItem(_PyPopenProcs, - fileObj)) != NULL && - (hProcessObj = PyList_GetItem(procObj,0)) != NULL && - (intObj = PyList_GetItem(procObj,1)) != NULL) { - - hProcess = PyLong_AsVoidPtr(hProcessObj); - file_count = PyInt_AsLong(intObj); - - if (file_count > 1) { - /* Still other files referencing process */ - file_count--; - PyList_SetItem(procObj,1, - PyInt_FromLong(file_count)); - } else { - /* Last file for this process */ - if (result != EOF && - WaitForSingleObject(hProcess, INFINITE) != WAIT_FAILED && - GetExitCodeProcess(hProcess, &exit_code)) { - /* Possible truncation here in 16-bit environments, but - * real exit codes are just the lower byte in any event. - */ - result = exit_code; - } else { - /* Indicate failure - this will cause the file object - * to raise an I/O error and translate the last Win32 - * error code from errno. We do have a problem with - * last errors that overlap the normal errno table, - * but that's a consistent problem with the file object. - */ - if (result != EOF) { - /* If the error wasn't from the fclose(), then - * set errno for the file object error handling. - */ - errno = GetLastError(); - } - result = -1; - } - - /* Free up the native handle at this point */ - CloseHandle(hProcess); - } - - /* Remove this file pointer from dictionary */ - PyDict_DelItem(_PyPopenProcs, fileObj); - - if (PyDict_Size(_PyPopenProcs) == 0) { - Py_DECREF(_PyPopenProcs); - _PyPopenProcs = NULL; - } - - } /* if object retrieval ok */ - - Py_XDECREF(fileObj); - } /* if _PyPopenProcs */ - -#ifdef WITH_THREAD - PyGILState_Release(state); -#endif - return result; -} - -#else /* which OS? */ -static PyObject * -posix_popen(PyObject *self, PyObject *args) -{ - char *name; - char *mode = "r"; - int bufsize = -1; - FILE *fp; - PyObject *f; - if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize)) - return NULL; - /* Strip mode of binary or text modifiers */ - if (strcmp(mode, "rb") == 0 || strcmp(mode, "rt") == 0) - mode = "r"; - else if (strcmp(mode, "wb") == 0 || strcmp(mode, "wt") == 0) - mode = "w"; - Py_BEGIN_ALLOW_THREADS - fp = popen(name, mode); - Py_END_ALLOW_THREADS - if (fp == NULL) - return posix_error(); - f = PyFile_FromFile(fp, name, mode, pclose); - if (f != NULL) - PyFile_SetBufSize(f, bufsize); - return f; -} - -#endif /* PYOS_??? */ -#endif /* HAVE_POPEN */ - - #ifdef HAVE_SETUID PyDoc_STRVAR(posix_setuid__doc__, "setuid(uid)\n\n\ @@ -5924,32 +4927,21 @@ posix_setgroups(PyObject *self, PyObject *groups) elem = PySequence_GetItem(groups, i); if (!elem) return NULL; - if (!PyInt_Check(elem)) { - if (!PyLong_Check(elem)) { + if (!PyLong_Check(elem)) { + PyErr_SetString(PyExc_TypeError, + "groups must be integers"); + Py_DECREF(elem); + return NULL; + } else { + unsigned long x = PyLong_AsUnsignedLong(elem); + if (PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, - "groups must be integers"); + "group id too big"); Py_DECREF(elem); return NULL; - } else { - unsigned long x = PyLong_AsUnsignedLong(elem); - if (PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "group id too big"); - Py_DECREF(elem); - return NULL; - } - grouplist[i] = x; - /* read back to see if it fits in gid_t */ - if (grouplist[i] != x) { - PyErr_SetString(PyExc_TypeError, - "group id too big"); - Py_DECREF(elem); - return NULL; - } } - } else { - long x = PyInt_AsLong(elem); grouplist[i] = x; + /* read back the value to see if it fitted in gid_t */ if (grouplist[i] != x) { PyErr_SetString(PyExc_TypeError, "group id too big"); @@ -6001,7 +4993,7 @@ wait_helper(pid_t pid, int status, struct rusage *ru) PyStructSequence_SET_ITEM(result, 1, PyFloat_FromDouble(doubletime(ru->ru_stime))); #define SET_INT(result, index, value)\ - PyStructSequence_SET_ITEM(result, index, PyInt_FromLong(value)) + PyStructSequence_SET_ITEM(result, index, PyLong_FromLong(value)) SET_INT(result, 2, ru->ru_maxrss); SET_INT(result, 3, ru->ru_ixrss); SET_INT(result, 4, ru->ru_idrss); @@ -6066,7 +5058,7 @@ posix_wait4(PyObject *self, PyObject *args) WAIT_TYPE status; WAIT_STATUS_INT(status) = 0; - if (!PyArg_ParseTuple(args, PARSE_PID "i:wait4", &pid, &options)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:wait4", &pid, &options)) return NULL; Py_BEGIN_ALLOW_THREADS @@ -6090,7 +5082,7 @@ posix_waitpid(PyObject *self, PyObject *args) WAIT_TYPE status; WAIT_STATUS_INT(status) = 0; - if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:waitpid", &pid, &options)) return NULL; Py_BEGIN_ALLOW_THREADS pid = waitpid(pid, &status, options); @@ -6114,7 +5106,7 @@ posix_waitpid(PyObject *self, PyObject *args) Py_intptr_t pid; int status, options; - if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:waitpid", &pid, &options)) return NULL; Py_BEGIN_ALLOW_THREADS pid = _cwait(&status, pid, options); @@ -6158,12 +5150,13 @@ static PyObject * posix_lstat(PyObject *self, PyObject *args) { #ifdef HAVE_LSTAT - return posix_do_stat(self, args, "et:lstat", lstat, NULL, NULL); + return posix_do_stat(self, args, "O&:lstat", lstat, NULL, NULL); #else /* !HAVE_LSTAT */ #ifdef MS_WINDOWS - return posix_do_stat(self, args, "et:lstat", STAT, "U:lstat", win32_wstat); + return posix_do_stat(self, args, "O&:lstat", win32_lstat, "U:lstat", + win32_lstat_w); #else - return posix_do_stat(self, args, "et:lstat", STAT, NULL, NULL); + return posix_do_stat(self, args, "O&:lstat", STAT, NULL, NULL); #endif #endif /* !HAVE_LSTAT */ } @@ -6179,19 +5172,18 @@ posix_readlink(PyObject *self, PyObject *args) { PyObject* v; char buf[MAXPATHLEN]; + PyObject *opath; char *path; int n; -#ifdef Py_USING_UNICODE int arg_is_unicode = 0; -#endif - if (!PyArg_ParseTuple(args, "et:readlink", - Py_FileSystemDefaultEncoding, &path)) + if (!PyArg_ParseTuple(args, "O&:readlink", + PyUnicode_FSConverter, &opath)) return NULL; -#ifdef Py_USING_UNICODE + path = PyBytes_AsString(opath); v = PySequence_GetItem(args, 0); if (v == NULL) { - PyMem_Free(path); + Py_DECREF(opath); return NULL; } @@ -6199,40 +5191,23 @@ posix_readlink(PyObject *self, PyObject *args) arg_is_unicode = 1; } Py_DECREF(v); -#endif Py_BEGIN_ALLOW_THREADS n = readlink(path, buf, (int) sizeof buf); Py_END_ALLOW_THREADS if (n < 0) - return posix_error_with_allocated_filename(path); - - PyMem_Free(path); - v = PyString_FromStringAndSize(buf, n); -#ifdef Py_USING_UNICODE - if (arg_is_unicode) { - PyObject *w; - - w = PyUnicode_FromEncodedObject(v, - Py_FileSystemDefaultEncoding, - "strict"); - if (w != NULL) { - Py_DECREF(v); - v = w; - } - else { - /* fall back to the original byte string, as - discussed in patch #683592 */ - PyErr_Clear(); - } - } -#endif - return v; + return posix_error_with_allocated_filename(opath); + + Py_DECREF(opath); + if (arg_is_unicode) + return PyUnicode_DecodeFSDefaultAndSize(buf, n); + else + return PyBytes_FromStringAndSize(buf, n); } #endif /* HAVE_READLINK */ -#ifdef HAVE_SYMLINK +#if defined(HAVE_SYMLINK) && !defined(MS_WINDOWS) PyDoc_STRVAR(posix_symlink__doc__, "symlink(src, dst)\n\n\ Create a symbolic link pointing to src named dst."); @@ -6240,10 +5215,158 @@ Create a symbolic link pointing to src named dst."); static PyObject * posix_symlink(PyObject *self, PyObject *args) { - return posix_2str(args, "etet:symlink", symlink); + return posix_2str(args, "O&O&:symlink", symlink); } #endif /* HAVE_SYMLINK */ +#if !defined(HAVE_READLINK) && defined(MS_WINDOWS) + +PyDoc_STRVAR(win_readlink__doc__, +"readlink(path) -> path\n\n\ +Return a string representing the path to which the symbolic link points."); + +/* Windows readlink implementation */ +static PyObject * +win_readlink(PyObject *self, PyObject *args) +{ + wchar_t *path; + DWORD n_bytes_returned; + DWORD io_result; + PyObject *result; + HANDLE reparse_point_handle; + + char target_buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; + REPARSE_DATA_BUFFER *rdb = (REPARSE_DATA_BUFFER *)target_buffer; + wchar_t *print_name; + + if (!PyArg_ParseTuple(args, + "u:readlink", + &path)) + return NULL; + + /* First get a handle to the reparse point */ + Py_BEGIN_ALLOW_THREADS + reparse_point_handle = CreateFileW( + path, + 0, + 0, + 0, + OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, + 0); + Py_END_ALLOW_THREADS + + if (reparse_point_handle==INVALID_HANDLE_VALUE) + { + return win32_error_unicode("readlink", path); + } + + Py_BEGIN_ALLOW_THREADS + /* New call DeviceIoControl to read the reparse point */ + io_result = DeviceIoControl( + reparse_point_handle, + FSCTL_GET_REPARSE_POINT, + 0, 0, /* in buffer */ + target_buffer, sizeof(target_buffer), + &n_bytes_returned, + 0 /* we're not using OVERLAPPED_IO */ + ); + CloseHandle(reparse_point_handle); + Py_END_ALLOW_THREADS + + if (io_result==0) + { + return win32_error_unicode("readlink", path); + } + + if (rdb->ReparseTag != IO_REPARSE_TAG_SYMLINK) + { + PyErr_SetString(PyExc_ValueError, + "not a symbolic link"); + return NULL; + } + print_name = rdb->SymbolicLinkReparseBuffer.PathBuffer + + rdb->SymbolicLinkReparseBuffer.PrintNameOffset; + + result = PyUnicode_FromWideChar(print_name, + rdb->SymbolicLinkReparseBuffer.PrintNameLength/2); + return result; +} + +#endif /* !defined(HAVE_READLINK) && defined(MS_WINDOWS) */ + +#if defined(HAVE_SYMLINK) && defined(MS_WINDOWS) + +/* Grab CreateSymbolicLinkW dynamically from kernel32 */ +static int has_CreateSymbolicLinkW = 0; +static DWORD (CALLBACK *Py_CreateSymbolicLinkW)(LPWSTR, LPWSTR, DWORD); +static int +check_CreateSymbolicLinkW() +{ + HINSTANCE hKernel32; + /* only recheck */ + if (has_CreateSymbolicLinkW) + return has_CreateSymbolicLinkW; + hKernel32 = GetModuleHandle("KERNEL32"); + *(FARPROC*)&Py_CreateSymbolicLinkW = GetProcAddress(hKernel32, + "CreateSymbolicLinkW"); + if (Py_CreateSymbolicLinkW) + has_CreateSymbolicLinkW = 1; + return has_CreateSymbolicLinkW; +} + +PyDoc_STRVAR(win_symlink__doc__, +"symlink(src, dst, target_is_directory=False)\n\n\ +Create a symbolic link pointing to src named dst.\n\ +target_is_directory is required if the target is to be interpreted as\n\ +a directory.\n\ +This function requires Windows 6.0 or greater, and raises a\n\ +NotImplementedError otherwise."); + +static PyObject * +win_symlink(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = {"src", "dest", "target_is_directory", NULL}; + PyObject *src, *dest; + int target_is_directory = 0; + DWORD res; + + if (!check_CreateSymbolicLinkW()) + { + /* raise NotImplementedError */ + return PyErr_Format(PyExc_NotImplementedError, + "CreateSymbolicLinkW not found"); + } + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|i:symlink", + kwlist, &src, &dest, &target_is_directory)) + return NULL; + + if (win32_can_symlink == 0) + return PyErr_Format(PyExc_OSError, "symbolic link privilege not held"); + + if (!convert_to_unicode(&src)) { return NULL; } + if (!convert_to_unicode(&dest)) { + Py_DECREF(src); + return NULL; + } + + Py_BEGIN_ALLOW_THREADS + res = Py_CreateSymbolicLinkW( + PyUnicode_AsUnicode(dest), + PyUnicode_AsUnicode(src), + target_is_directory); + Py_END_ALLOW_THREADS + Py_DECREF(src); + Py_DECREF(dest); + if (!res) + { + return win32_error_unicode("symlink", PyUnicode_AsUnicode(src)); + } + + Py_INCREF(Py_None); + return Py_None; +} +#endif /* defined(HAVE_SYMLINK) && defined(MS_WINDOWS) */ #ifdef HAVE_TIMES #if defined(PYCC_VACPP) && defined(PYOS_OS2) @@ -6336,12 +5459,12 @@ posix_getsid(PyObject *self, PyObject *args) { pid_t pid; int sid; - if (!PyArg_ParseTuple(args, PARSE_PID ":getsid", &pid)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID ":getsid", &pid)) return NULL; sid = getsid(pid); if (sid < 0) return posix_error(); - return PyInt_FromLong((long)sid); + return PyLong_FromLong((long)sid); } #endif /* HAVE_GETSID */ @@ -6371,7 +5494,7 @@ posix_setpgid(PyObject *self, PyObject *args) { pid_t pid; int pgrp; - if (!PyArg_ParseTuple(args, PARSE_PID "i:setpgid", &pid, &pgrp)) + if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:setpgid", &pid, &pgrp)) return NULL; if (setpgid(pid, pgrp) < 0) return posix_error(); @@ -6411,7 +5534,7 @@ posix_tcsetpgrp(PyObject *self, PyObject *args) { int fd; pid_t pgid; - if (!PyArg_ParseTuple(args, "i" PARSE_PID ":tcsetpgrp", &fd, &pgid)) + if (!PyArg_ParseTuple(args, "i" _Py_PARSE_PID ":tcsetpgrp", &fd, &pgid)) return NULL; if (tcsetpgrp(fd, pgid) < 0) return posix_error(); @@ -6429,14 +5552,15 @@ Open a file (for low level IO)."); static PyObject * posix_open(PyObject *self, PyObject *args) { - char *file = NULL; + PyObject *ofile; + char *file; int flag; int mode = 0777; int fd; #ifdef MS_WINDOWS PyUnicodeObject *po; - if (PyArg_ParseTuple(args, "Ui|i:mkdir", &po, &flag, &mode)) { + if (PyArg_ParseTuple(args, "Ui|i:open", &po, &flag, &mode)) { Py_BEGIN_ALLOW_THREADS /* PyUnicode_AS_UNICODE OK without thread lock as it is a simple dereference. */ @@ -6444,25 +5568,25 @@ posix_open(PyObject *self, PyObject *args) Py_END_ALLOW_THREADS if (fd < 0) return posix_error(); - return PyInt_FromLong((long)fd); + return PyLong_FromLong((long)fd); } /* Drop the argument parsing error as narrow strings are also valid. */ PyErr_Clear(); #endif - if (!PyArg_ParseTuple(args, "eti|i", - Py_FileSystemDefaultEncoding, &file, + if (!PyArg_ParseTuple(args, "O&i|i:open", + PyUnicode_FSConverter, &ofile, &flag, &mode)) return NULL; - + file = PyBytes_AsString(ofile); Py_BEGIN_ALLOW_THREADS fd = open(file, flag, mode); Py_END_ALLOW_THREADS if (fd < 0) - return posix_error_with_allocated_filename(file); - PyMem_Free(file); - return PyInt_FromLong((long)fd); + return posix_error_with_allocated_filename(ofile); + Py_DECREF(ofile); + return PyLong_FromLong((long)fd); } @@ -6524,7 +5648,7 @@ posix_dup(PyObject *self, PyObject *args) Py_END_ALLOW_THREADS if (fd < 0) return posix_error(); - return PyInt_FromLong((long)fd); + return PyLong_FromLong((long)fd); } @@ -6552,7 +5676,8 @@ posix_dup2(PyObject *self, PyObject *args) PyDoc_STRVAR(posix_lseek__doc__, "lseek(fd, pos, how) -> newpos\n\n\ -Set the current position of a file descriptor."); +Set the current position of a file descriptor.\n\ +Return the new cursor position in bytes, starting from the beginning."); static PyObject * posix_lseek(PyObject *self, PyObject *args) @@ -6576,10 +5701,10 @@ posix_lseek(PyObject *self, PyObject *args) #endif /* SEEK_END */ #if !defined(HAVE_LARGEFILE_SUPPORT) - pos = PyInt_AsLong(posobj); + pos = PyLong_AsLong(posobj); #else pos = PyLong_Check(posobj) ? - PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj); + PyLong_AsLongLong(posobj) : PyLong_AsLong(posobj); #endif if (PyErr_Occurred()) return NULL; @@ -6597,7 +5722,7 @@ posix_lseek(PyObject *self, PyObject *args) return posix_error(); #if !defined(HAVE_LARGEFILE_SUPPORT) - return PyInt_FromLong(res); + return PyLong_FromLong(res); #else return PyLong_FromLongLong(res); #endif @@ -6611,7 +5736,8 @@ Read a file descriptor."); static PyObject * posix_read(PyObject *self, PyObject *args) { - int fd, size, n; + int fd, size; + Py_ssize_t n; PyObject *buffer; if (!PyArg_ParseTuple(args, "ii:read", &fd, &size)) return NULL; @@ -6619,7 +5745,7 @@ posix_read(PyObject *self, PyObject *args) errno = EINVAL; return posix_error(); } - buffer = PyString_FromStringAndSize((char *)NULL, size); + buffer = PyBytes_FromStringAndSize((char *)NULL, size); if (buffer == NULL) return NULL; if (!_PyVerify_fd(fd)) { @@ -6627,14 +5753,14 @@ posix_read(PyObject *self, PyObject *args) return posix_error(); } Py_BEGIN_ALLOW_THREADS - n = read(fd, PyString_AsString(buffer), size); + n = read(fd, PyBytes_AS_STRING(buffer), size); Py_END_ALLOW_THREADS if (n < 0) { Py_DECREF(buffer); return posix_error(); } if (n != size) - _PyString_Resize(&buffer, n); + _PyBytes_Resize(&buffer, n); return buffer; } @@ -6650,7 +5776,7 @@ posix_write(PyObject *self, PyObject *args) int fd; Py_ssize_t size, len; - if (!PyArg_ParseTuple(args, "is*:write", &fd, &pbuf)) + if (!PyArg_ParseTuple(args, "iy*:write", &fd, &pbuf)) return NULL; if (!_PyVerify_fd(fd)) { PyBuffer_Release(&pbuf); @@ -6669,7 +5795,7 @@ posix_write(PyObject *self, PyObject *args) PyBuffer_Release(&pbuf); if (size < 0) return posix_error(); - return PyInt_FromSsize_t(size); + return PyLong_FromSsize_t(size); } @@ -6705,66 +5831,6 @@ posix_fstat(PyObject *self, PyObject *args) return _pystat_fromstructstat(&st); } - -PyDoc_STRVAR(posix_fdopen__doc__, -"fdopen(fd [, mode='r' [, bufsize]]) -> file_object\n\n\ -Return an open file object connected to a file descriptor."); - -static PyObject * -posix_fdopen(PyObject *self, PyObject *args) -{ - int fd; - char *orgmode = "r"; - int bufsize = -1; - FILE *fp; - PyObject *f; - char *mode; - if (!PyArg_ParseTuple(args, "i|si", &fd, &orgmode, &bufsize)) - return NULL; - - /* Sanitize mode. See fileobject.c */ - mode = PyMem_MALLOC(strlen(orgmode)+3); - if (!mode) { - PyErr_NoMemory(); - return NULL; - } - strcpy(mode, orgmode); - if (_PyFile_SanitizeMode(mode)) { - PyMem_FREE(mode); - return NULL; - } - if (!_PyVerify_fd(fd)) - return posix_error(); - Py_BEGIN_ALLOW_THREADS -#if !defined(MS_WINDOWS) && defined(HAVE_FCNTL_H) - if (mode[0] == 'a') { - /* try to make sure the O_APPEND flag is set */ - int flags; - flags = fcntl(fd, F_GETFL); - if (flags != -1) - fcntl(fd, F_SETFL, flags | O_APPEND); - fp = fdopen(fd, mode); - if (fp == NULL && flags != -1) - /* restore old mode if fdopen failed */ - fcntl(fd, F_SETFL, flags); - } else { - fp = fdopen(fd, mode); - } -#else - fp = fdopen(fd, mode); -#endif - Py_END_ALLOW_THREADS - PyMem_FREE(mode); - if (fp == NULL) - return posix_error(); - /* The dummy filename used here must be kept in sync with the value - tested against in gzip.GzipFile.__init__() - see issue #13781. */ - f = PyFile_FromFile(fp, "<fdopen>", orgmode, fclose); - if (f != NULL) - PyFile_SetBufSize(f, bufsize); - return f; -} - PyDoc_STRVAR(posix_isatty__doc__, "isatty(fd) -> bool\n\n\ Return True if the file descriptor 'fd' is an open file descriptor\n\ @@ -6836,14 +5902,18 @@ Create a FIFO (a POSIX named pipe)."); static PyObject * posix_mkfifo(PyObject *self, PyObject *args) { + PyObject *opath; char *filename; int mode = 0666; int res; - if (!PyArg_ParseTuple(args, "s|i:mkfifo", &filename, &mode)) + if (!PyArg_ParseTuple(args, "O&|i:mkfifo", PyUnicode_FSConverter, &opath, + &mode)) return NULL; + filename = PyBytes_AS_STRING(opath); Py_BEGIN_ALLOW_THREADS res = mkfifo(filename, mode); Py_END_ALLOW_THREADS + Py_DECREF(opath); if (res < 0) return posix_error(); Py_INCREF(Py_None); @@ -6866,15 +5936,19 @@ os.makedev()), otherwise it is ignored."); static PyObject * posix_mknod(PyObject *self, PyObject *args) { + PyObject *opath; char *filename; int mode = 0600; int device = 0; int res; - if (!PyArg_ParseTuple(args, "s|ii:mknod", &filename, &mode, &device)) + if (!PyArg_ParseTuple(args, "O&|ii:mknod", PyUnicode_FSConverter, &opath, + &mode, &device)) return NULL; + filename = PyBytes_AS_STRING(opath); Py_BEGIN_ALLOW_THREADS res = mknod(filename, mode, device); Py_END_ALLOW_THREADS + Py_DECREF(opath); if (res < 0) return posix_error(); Py_INCREF(Py_None); @@ -6893,7 +5967,7 @@ posix_major(PyObject *self, PyObject *args) int device; if (!PyArg_ParseTuple(args, "i:major", &device)) return NULL; - return PyInt_FromLong((long)major(device)); + return PyLong_FromLong((long)major(device)); } PyDoc_STRVAR(posix_minor__doc__, @@ -6906,7 +5980,7 @@ posix_minor(PyObject *self, PyObject *args) int device; if (!PyArg_ParseTuple(args, "i:minor", &device)) return NULL; - return PyInt_FromLong((long)minor(device)); + return PyLong_FromLong((long)minor(device)); } PyDoc_STRVAR(posix_makedev__doc__, @@ -6919,7 +5993,7 @@ posix_makedev(PyObject *self, PyObject *args) int major, minor; if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor)) return NULL; - return PyInt_FromLong((long)makedev(major, minor)); + return PyLong_FromLong((long)makedev(major, minor)); } #endif /* device macros */ @@ -6941,10 +6015,10 @@ posix_ftruncate(PyObject *self, PyObject *args) return NULL; #if !defined(HAVE_LARGEFILE_SUPPORT) - length = PyInt_AsLong(lenobj); + length = PyLong_AsLong(lenobj); #else length = PyLong_Check(lenobj) ? - PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj); + PyLong_AsLongLong(lenobj) : PyLong_AsLong(lenobj); #endif if (PyErr_Occurred()) return NULL; @@ -6971,59 +6045,99 @@ static PyObject *posix_putenv_garbage; static PyObject * posix_putenv(PyObject *self, PyObject *args) { +#ifdef MS_WINDOWS + wchar_t *s1, *s2; + wchar_t *newenv; +#else + PyObject *os1, *os2; char *s1, *s2; char *newenv; - PyObject *newstr; +#endif + PyObject *newstr = NULL; size_t len; - if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2)) +#ifdef MS_WINDOWS + if (!PyArg_ParseTuple(args, + "uu:putenv", + &s1, &s2)) + return NULL; +#else + if (!PyArg_ParseTuple(args, + "O&O&:putenv", + PyUnicode_FSConverter, &os1, + PyUnicode_FSConverter, &os2)) return NULL; + s1 = PyBytes_AsString(os1); + s2 = PyBytes_AsString(os2); +#endif #if defined(PYOS_OS2) if (stricmp(s1, "BEGINLIBPATH") == 0) { APIRET rc; rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH); - if (rc != NO_ERROR) - return os2_error(rc); + if (rc != NO_ERROR) { + os2_error(rc); + goto error; + } } else if (stricmp(s1, "ENDLIBPATH") == 0) { APIRET rc; rc = DosSetExtLIBPATH(s2, END_LIBPATH); - if (rc != NO_ERROR) - return os2_error(rc); + if (rc != NO_ERROR) { + os2_error(rc); + goto error; + } } else { #endif - /* XXX This can leak memory -- not easy to fix :-( */ - len = strlen(s1) + strlen(s2) + 2; + /* len includes space for a trailing \0; the size arg to + PyBytes_FromStringAndSize does not count that */ #ifdef MS_WINDOWS + len = wcslen(s1) + wcslen(s2) + 2; if (_MAX_ENV < (len - 1)) { PyErr_Format(PyExc_ValueError, - "the environment variable is longer than %u bytes", + "the environment variable is longer than %u characters", _MAX_ENV); - return NULL; + goto error; } + newstr = PyUnicode_FromUnicode(NULL, (int)len - 1); +#else + len = PyBytes_GET_SIZE(os1) + PyBytes_GET_SIZE(os2) + 2; + newstr = PyBytes_FromStringAndSize(NULL, (int)len - 1); #endif - /* len includes space for a trailing \0; the size arg to - PyString_FromStringAndSize does not count that */ - newstr = PyString_FromStringAndSize(NULL, (int)len - 1); - if (newstr == NULL) - return PyErr_NoMemory(); - newenv = PyString_AS_STRING(newstr); + if (newstr == NULL) { + PyErr_NoMemory(); + goto error; + } +#ifdef MS_WINDOWS + newenv = PyUnicode_AsUnicode(newstr); + _snwprintf(newenv, len, L"%s=%s", s1, s2); + if (_wputenv(newenv)) { + posix_error(); + goto error; + } +#else + newenv = PyBytes_AS_STRING(newstr); PyOS_snprintf(newenv, len, "%s=%s", s1, s2); if (putenv(newenv)) { - Py_DECREF(newstr); posix_error(); - return NULL; + goto error; } +#endif + /* Install the first arg and newstr in posix_putenv_garbage; * this will cause previous value to be collected. This has to * happen after the real putenv() call because the old value * was still accessible until then. */ if (PyDict_SetItem(posix_putenv_garbage, - PyTuple_GET_ITEM(args, 0), newstr)) { +#ifdef MS_WINDOWS + PyTuple_GET_ITEM(args, 0), +#else + os1, +#endif + newstr)) { /* really not much we can do; just leak */ PyErr_Clear(); } @@ -7034,8 +6148,20 @@ posix_putenv(PyObject *self, PyObject *args) #if defined(PYOS_OS2) } #endif - Py_INCREF(Py_None); - return Py_None; + +#ifndef MS_WINDOWS + Py_DECREF(os1); + Py_DECREF(os2); +#endif + Py_RETURN_NONE; + +error: +#ifndef MS_WINDOWS + Py_DECREF(os1); + Py_DECREF(os2); +#endif + Py_XDECREF(newstr); + return NULL; } #endif /* putenv */ @@ -7047,20 +6173,25 @@ Delete an environment variable."); static PyObject * posix_unsetenv(PyObject *self, PyObject *args) { + PyObject *os1; char *s1; #ifndef HAVE_BROKEN_UNSETENV int err; #endif - if (!PyArg_ParseTuple(args, "s:unsetenv", &s1)) + if (!PyArg_ParseTuple(args, "O&:unsetenv", + PyUnicode_FSConverter, &os1)) return NULL; + s1 = PyBytes_AsString(os1); #ifdef HAVE_BROKEN_UNSETENV unsetenv(s1); #else err = unsetenv(s1); - if (err) + if (err) { + Py_DECREF(os1); return posix_error(); + } #endif /* Remove the key from posix_putenv_garbage; @@ -7068,14 +6199,13 @@ posix_unsetenv(PyObject *self, PyObject *args) * happen after the real unsetenv() call because the * old value was still accessible until then. */ - if (PyDict_DelItem(posix_putenv_garbage, - PyTuple_GET_ITEM(args, 0))) { + if (PyDict_DelItem(posix_putenv_garbage, os1)) { /* really not much we can do; just leak */ PyErr_Clear(); } - Py_INCREF(Py_None); - return Py_None; + Py_DECREF(os1); + Py_RETURN_NONE; } #endif /* unsetenv */ @@ -7096,7 +6226,7 @@ posix_strerror(PyObject *self, PyObject *args) "strerror() argument out of range"); return NULL; } - return PyString_FromString(message); + return PyUnicode_FromString(message); } @@ -7268,19 +6398,19 @@ _pystatvfs_fromstructstatvfs(struct statvfs st) { return NULL; #if !defined(HAVE_LARGEFILE_SUPPORT) - PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long) st.f_bsize)); - PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long) st.f_frsize)); - PyStructSequence_SET_ITEM(v, 2, PyInt_FromLong((long) st.f_blocks)); - PyStructSequence_SET_ITEM(v, 3, PyInt_FromLong((long) st.f_bfree)); - PyStructSequence_SET_ITEM(v, 4, PyInt_FromLong((long) st.f_bavail)); - PyStructSequence_SET_ITEM(v, 5, PyInt_FromLong((long) st.f_files)); - PyStructSequence_SET_ITEM(v, 6, PyInt_FromLong((long) st.f_ffree)); - PyStructSequence_SET_ITEM(v, 7, PyInt_FromLong((long) st.f_favail)); - PyStructSequence_SET_ITEM(v, 8, PyInt_FromLong((long) st.f_flag)); - PyStructSequence_SET_ITEM(v, 9, PyInt_FromLong((long) st.f_namemax)); + PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize)); + PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize)); + PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long) st.f_blocks)); + PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long) st.f_bfree)); + PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long) st.f_bavail)); + PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long) st.f_files)); + PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong((long) st.f_ffree)); + PyStructSequence_SET_ITEM(v, 7, PyLong_FromLong((long) st.f_favail)); + PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag)); + PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax)); #else - PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long) st.f_bsize)); - PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long) st.f_frsize)); + PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize)); + PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize)); PyStructSequence_SET_ITEM(v, 2, PyLong_FromLongLong((PY_LONG_LONG) st.f_blocks)); PyStructSequence_SET_ITEM(v, 3, @@ -7293,8 +6423,8 @@ _pystatvfs_fromstructstatvfs(struct statvfs st) { PyLong_FromLongLong((PY_LONG_LONG) st.f_ffree)); PyStructSequence_SET_ITEM(v, 7, PyLong_FromLongLong((PY_LONG_LONG) st.f_favail)); - PyStructSequence_SET_ITEM(v, 8, PyInt_FromLong((long) st.f_flag)); - PyStructSequence_SET_ITEM(v, 9, PyInt_FromLong((long) st.f_namemax)); + PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag)); + PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax)); #endif return v; @@ -7348,110 +6478,6 @@ posix_statvfs(PyObject *self, PyObject *args) } #endif /* HAVE_STATVFS */ - -#ifdef HAVE_TEMPNAM -PyDoc_STRVAR(posix_tempnam__doc__, -"tempnam([dir[, prefix]]) -> string\n\n\ -Return a unique name for a temporary file.\n\ -The directory and a prefix may be specified as strings; they may be omitted\n\ -or None if not needed."); - -static PyObject * -posix_tempnam(PyObject *self, PyObject *args) -{ - PyObject *result = NULL; - char *dir = NULL; - char *pfx = NULL; - char *name; - - if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx)) - return NULL; - - if (PyErr_Warn(PyExc_RuntimeWarning, - "tempnam is a potential security risk to your program") < 0) - return NULL; - - if (PyErr_WarnPy3k("tempnam has been removed in 3.x; " - "use the tempfile module", 1) < 0) - return NULL; - -#ifdef MS_WINDOWS - name = _tempnam(dir, pfx); -#else - name = tempnam(dir, pfx); -#endif - if (name == NULL) - return PyErr_NoMemory(); - result = PyString_FromString(name); - free(name); - return result; -} -#endif - - -#ifdef HAVE_TMPFILE -PyDoc_STRVAR(posix_tmpfile__doc__, -"tmpfile() -> file object\n\n\ -Create a temporary file with no directory entries."); - -static PyObject * -posix_tmpfile(PyObject *self, PyObject *noargs) -{ - FILE *fp; - - if (PyErr_WarnPy3k("tmpfile has been removed in 3.x; " - "use the tempfile module", 1) < 0) - return NULL; - - fp = tmpfile(); - if (fp == NULL) - return posix_error(); - return PyFile_FromFile(fp, "<tmpfile>", "w+b", fclose); -} -#endif - - -#ifdef HAVE_TMPNAM -PyDoc_STRVAR(posix_tmpnam__doc__, -"tmpnam() -> string\n\n\ -Return a unique name for a temporary file."); - -static PyObject * -posix_tmpnam(PyObject *self, PyObject *noargs) -{ - char buffer[L_tmpnam]; - char *name; - - if (PyErr_Warn(PyExc_RuntimeWarning, - "tmpnam is a potential security risk to your program") < 0) - return NULL; - - if (PyErr_WarnPy3k("tmpnam has been removed in 3.x; " - "use the tempfile module", 1) < 0) - return NULL; - -#ifdef USE_TMPNAM_R - name = tmpnam_r(buffer); -#else - name = tmpnam(buffer); -#endif - if (name == NULL) { - PyObject *err = Py_BuildValue("is", 0, -#ifdef USE_TMPNAM_R - "unexpected NULL from tmpnam_r" -#else - "unexpected NULL from tmpnam" -#endif - ); - PyErr_SetObject(PyExc_OSError, err); - Py_XDECREF(err); - return NULL; - } - return PyString_FromString(buffer); -} -#endif - - /* This is used for fpathconf(), pathconf(), confstr() and sysconf(). * It maps strings representing configuration variable names to * integer values, allowing those functions to be called with the @@ -7472,17 +6498,25 @@ static int conv_confname(PyObject *arg, int *valuep, struct constdef *table, size_t tablesize) { - if (PyInt_Check(arg)) { - *valuep = PyInt_AS_LONG(arg); + if (PyLong_Check(arg)) { + *valuep = PyLong_AS_LONG(arg); return 1; } - if (PyString_Check(arg)) { + else { /* look up the value in the table using a binary search */ size_t lo = 0; size_t mid; size_t hi = tablesize; int cmp; - char *confname = PyString_AS_STRING(arg); + const char *confname; + if (!PyUnicode_Check(arg)) { + PyErr_SetString(PyExc_TypeError, + "configuration names must be strings or integers"); + return 0; + } + confname = _PyUnicode_AsString(arg); + if (confname == NULL) + return 0; while (lo < hi) { mid = (lo + hi) / 2; cmp = strcmp(confname, table[mid].name); @@ -7496,11 +6530,8 @@ conv_confname(PyObject *arg, int *valuep, struct constdef *table, } } PyErr_SetString(PyExc_ValueError, "unrecognized configuration name"); + return 0; } - else - PyErr_SetString(PyExc_TypeError, - "configuration names must be strings or integers"); - return 0; } @@ -7557,6 +6588,39 @@ static struct constdef posix_constants_pathconf[] = { #ifdef _PC_VDISABLE {"PC_VDISABLE", _PC_VDISABLE}, #endif +#ifdef _PC_ACL_ENABLED + {"PC_ACL_ENABLED", _PC_ACL_ENABLED}, +#endif +#ifdef _PC_MIN_HOLE_SIZE + {"PC_MIN_HOLE_SIZE", _PC_MIN_HOLE_SIZE}, +#endif +#ifdef _PC_ALLOC_SIZE_MIN + {"PC_ALLOC_SIZE_MIN", _PC_ALLOC_SIZE_MIN}, +#endif +#ifdef _PC_REC_INCR_XFER_SIZE + {"PC_REC_INCR_XFER_SIZE", _PC_REC_INCR_XFER_SIZE}, +#endif +#ifdef _PC_REC_MAX_XFER_SIZE + {"PC_REC_MAX_XFER_SIZE", _PC_REC_MAX_XFER_SIZE}, +#endif +#ifdef _PC_REC_MIN_XFER_SIZE + {"PC_REC_MIN_XFER_SIZE", _PC_REC_MIN_XFER_SIZE}, +#endif +#ifdef _PC_REC_XFER_ALIGN + {"PC_REC_XFER_ALIGN", _PC_REC_XFER_ALIGN}, +#endif +#ifdef _PC_SYMLINK_MAX + {"PC_SYMLINK_MAX", _PC_SYMLINK_MAX}, +#endif +#ifdef _PC_XATTR_ENABLED + {"PC_XATTR_ENABLED", _PC_XATTR_ENABLED}, +#endif +#ifdef _PC_XATTR_EXISTS + {"PC_XATTR_EXISTS", _PC_XATTR_EXISTS}, +#endif +#ifdef _PC_TIMESTAMP_RESOLUTION + {"PC_TIMESTAMP_RESOLUTION", _PC_TIMESTAMP_RESOLUTION}, +#endif }; static int @@ -7589,7 +6653,7 @@ posix_fpathconf(PyObject *self, PyObject *args) if (limit == -1 && errno != 0) posix_error(); else - result = PyInt_FromLong(limit); + result = PyLong_FromLong(limit); } return result; } @@ -7623,7 +6687,7 @@ posix_pathconf(PyObject *self, PyObject *args) posix_error_with_filename(path); } else - result = PyInt_FromLong(limit); + result = PyLong_FromLong(limit); } return result; } @@ -7634,6 +6698,12 @@ static struct constdef posix_constants_confstr[] = { #ifdef _CS_ARCHITECTURE {"CS_ARCHITECTURE", _CS_ARCHITECTURE}, #endif +#ifdef _CS_GNU_LIBC_VERSION + {"CS_GNU_LIBC_VERSION", _CS_GNU_LIBC_VERSION}, +#endif +#ifdef _CS_GNU_LIBPTHREAD_VERSION + {"CS_GNU_LIBPTHREAD_VERSION", _CS_GNU_LIBPTHREAD_VERSION}, +#endif #ifdef _CS_HOSTNAME {"CS_HOSTNAME", _CS_HOSTNAME}, #endif @@ -7794,32 +6864,34 @@ posix_confstr(PyObject *self, PyObject *args) { PyObject *result = NULL; int name; - char buffer[256]; - - if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) { + char buffer[255]; int len; + if (!PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) + return NULL; + errno = 0; len = confstr(name, buffer, sizeof(buffer)); if (len == 0) { if (errno) { - posix_error(); + posix_error(); + return NULL; } else { - result = Py_None; - Py_INCREF(Py_None); + Py_RETURN_NONE; } } - else { - if ((unsigned int)len >= sizeof(buffer)) { - result = PyString_FromStringAndSize(NULL, len-1); - if (result != NULL) - confstr(name, PyString_AS_STRING(result), len); - } - else - result = PyString_FromStringAndSize(buffer, len-1); - } + + if ((unsigned int)len >= sizeof(buffer)) { + char *buf = PyMem_Malloc(len); + if (buf == NULL) + return PyErr_NoMemory(); + confstr(name, buf, len); + result = PyUnicode_DecodeFSDefaultAndSize(buf, len-1); + PyMem_Free(buf); } + else + result = PyUnicode_DecodeFSDefaultAndSize(buffer, len-1); return result; } #endif @@ -8347,7 +7419,7 @@ posix_sysconf(PyObject *self, PyObject *args) if (value == -1 && errno != 0) posix_error(); else - result = PyInt_FromLong(value); + result = PyLong_FromLong(value); } return result; } @@ -8388,7 +7460,7 @@ setup_confname_table(struct constdef *table, size_t tablesize, return -1; for (i=0; i < tablesize; ++i) { - PyObject *o = PyInt_FromLong(table[i].value); + PyObject *o = PyLong_FromLong(table[i].value); if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) { Py_XDECREF(o); Py_DECREF(d); @@ -8465,6 +7537,7 @@ the underlying Win32 ShellExecute function doesn't work if it is."); static PyObject * win32_startfile(PyObject *self, PyObject *args) { + PyObject *ofilepath; char *filepath; char *operation = NULL; HINSTANCE rc; @@ -8502,24 +7575,25 @@ win32_startfile(PyObject *self, PyObject *args) return Py_None; normal: - if (!PyArg_ParseTuple(args, "et|s:startfile", - Py_FileSystemDefaultEncoding, &filepath, + if (!PyArg_ParseTuple(args, "O&|s:startfile", + PyUnicode_FSConverter, &ofilepath, &operation)) return NULL; + filepath = PyBytes_AsString(ofilepath); Py_BEGIN_ALLOW_THREADS rc = ShellExecute((HWND)0, operation, filepath, NULL, NULL, SW_SHOWNORMAL); Py_END_ALLOW_THREADS if (rc <= (HINSTANCE)32) { PyObject *errval = win32_error("startfile", filepath); - PyMem_Free(filepath); + Py_DECREF(ofilepath); return errval; } - PyMem_Free(filepath); + Py_DECREF(ofilepath); Py_INCREF(Py_None); return Py_None; } -#endif /* MS_WINDOWS */ +#endif #ifdef HAVE_GETLOADAVG PyDoc_STRVAR(posix_getloadavg__doc__, @@ -8540,6 +7614,43 @@ posix_getloadavg(PyObject *self, PyObject *noargs) } #endif +PyDoc_STRVAR(device_encoding__doc__, +"device_encoding(fd) -> str\n\n\ +Return a string describing the encoding of the device\n\ +if the output is a terminal; else return None."); + +static PyObject * +device_encoding(PyObject *self, PyObject *args) +{ + int fd; + if (!PyArg_ParseTuple(args, "i:device_encoding", &fd)) + return NULL; + if (!_PyVerify_fd(fd) || !isatty(fd)) { + Py_INCREF(Py_None); + return Py_None; + } +#if defined(MS_WINDOWS) || defined(MS_WIN64) + if (fd == 0) { + char buf[100]; + sprintf(buf, "cp%d", GetConsoleCP()); + return PyUnicode_FromString(buf); + } + if (fd == 1 || fd == 2) { + char buf[100]; + sprintf(buf, "cp%d", GetConsoleOutputCP()); + return PyUnicode_FromString(buf); + } +#elif defined(CODESET) + { + char *codeset = nl_langinfo(CODESET); + if (codeset != NULL && codeset[0] != 0) + return PyUnicode_FromString(codeset); + } +#endif + Py_INCREF(Py_None); + return Py_None; +} + PyDoc_STRVAR(posix_urandom__doc__, "urandom(n) -> str\n\n\ Return n random bytes suitable for cryptographic use."); @@ -8681,10 +7792,10 @@ static PyMethodDef posix_methods[] = { {"ctermid", posix_ctermid, METH_NOARGS, posix_ctermid__doc__}, #endif #ifdef HAVE_GETCWD - {"getcwd", posix_getcwd, METH_NOARGS, posix_getcwd__doc__}, -#ifdef Py_USING_UNICODE - {"getcwdu", posix_getcwdu, METH_NOARGS, posix_getcwdu__doc__}, -#endif + {"getcwd", (PyCFunction)posix_getcwd_unicode, + METH_NOARGS, posix_getcwd__doc__}, + {"getcwdb", (PyCFunction)posix_getcwd_bytes, + METH_NOARGS, posix_getcwdb__doc__}, #endif #ifdef HAVE_LINK {"link", posix_link, METH_VARARGS, posix_link__doc__}, @@ -8698,13 +7809,20 @@ static PyMethodDef posix_methods[] = { #ifdef HAVE_READLINK {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__}, #endif /* HAVE_READLINK */ +#if !defined(HAVE_READLINK) && defined(MS_WINDOWS) + {"readlink", win_readlink, METH_VARARGS, win_readlink__doc__}, +#endif /* !defined(HAVE_READLINK) && defined(MS_WINDOWS) */ {"rename", posix_rename, METH_VARARGS, posix_rename__doc__}, {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__}, {"stat", posix_stat, METH_VARARGS, posix_stat__doc__}, {"stat_float_times", stat_float_times, METH_VARARGS, stat_float_times__doc__}, -#ifdef HAVE_SYMLINK +#if defined(HAVE_SYMLINK) && !defined(MS_WINDOWS) {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__}, #endif /* HAVE_SYMLINK */ +#if defined(HAVE_SYMLINK) && defined(MS_WINDOWS) + {"symlink", (PyCFunction)win_symlink, METH_VARARGS | METH_KEYWORDS, + win_symlink__doc__}, +#endif /* defined(HAVE_SYMLINK) && defined(MS_WINDOWS) */ #ifdef HAVE_SYSTEM {"system", posix_system, METH_VARARGS, posix_system__doc__}, #endif @@ -8777,22 +7895,11 @@ static PyMethodDef posix_methods[] = { #ifdef HAVE_PLOCK {"plock", posix_plock, METH_VARARGS, posix_plock__doc__}, #endif /* HAVE_PLOCK */ -#ifdef HAVE_POPEN - {"popen", posix_popen, METH_VARARGS, posix_popen__doc__}, #ifdef MS_WINDOWS - {"popen2", win32_popen2, METH_VARARGS}, - {"popen3", win32_popen3, METH_VARARGS}, - {"popen4", win32_popen4, METH_VARARGS}, {"startfile", win32_startfile, METH_VARARGS, win32_startfile__doc__}, {"kill", win32_kill, METH_VARARGS, win32_kill__doc__}, -#else -#if defined(PYOS_OS2) && defined(PYCC_GCC) - {"popen2", os2emx_popen2, METH_VARARGS}, - {"popen3", os2emx_popen3, METH_VARARGS}, - {"popen4", os2emx_popen4, METH_VARARGS}, -#endif + {"link", win32_link, METH_VARARGS, win32_link__doc__}, #endif -#endif /* HAVE_POPEN */ #ifdef HAVE_SETUID {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__}, #endif /* HAVE_SETUID */ @@ -8853,13 +7960,13 @@ static PyMethodDef posix_methods[] = { {"open", posix_open, METH_VARARGS, posix_open__doc__}, {"close", posix_close, METH_VARARGS, posix_close__doc__}, {"closerange", posix_closerange, METH_VARARGS, posix_closerange__doc__}, + {"device_encoding", device_encoding, METH_VARARGS, device_encoding__doc__}, {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__}, {"read", posix_read, METH_VARARGS, posix_read__doc__}, {"write", posix_write, METH_VARARGS, posix_write__doc__}, {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__}, - {"fdopen", posix_fdopen, METH_VARARGS, posix_fdopen__doc__}, {"isatty", posix_isatty, METH_VARARGS, posix_isatty__doc__}, #ifdef HAVE_PIPE {"pipe", posix_pipe, METH_NOARGS, posix_pipe__doc__}, @@ -8926,15 +8033,6 @@ static PyMethodDef posix_methods[] = { #if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H) {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__}, #endif -#ifdef HAVE_TMPFILE - {"tmpfile", posix_tmpfile, METH_NOARGS, posix_tmpfile__doc__}, -#endif -#ifdef HAVE_TEMPNAM - {"tempnam", posix_tempnam, METH_VARARGS, posix_tempnam__doc__}, -#endif -#ifdef HAVE_TMPNAM - {"tmpnam", posix_tmpnam, METH_NOARGS, posix_tmpnam__doc__}, -#endif #ifdef HAVE_CONFSTR {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__}, #endif @@ -8950,11 +8048,14 @@ static PyMethodDef posix_methods[] = { {"abort", posix_abort, METH_NOARGS, posix_abort__doc__}, #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__}, #endif #ifdef HAVE_GETLOADAVG {"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__}, #endif + {"urandom", posix_urandom, METH_VARARGS, posix_urandom__doc__}, #ifdef HAVE_SETRESUID {"setresuid", posix_setresuid, METH_VARARGS, posix_setresuid__doc__}, #endif @@ -8967,7 +8068,6 @@ static PyMethodDef posix_methods[] = { #ifdef HAVE_GETRESGID {"getresgid", posix_getresgid, METH_NOARGS, posix_getresgid__doc__}, #endif - {"urandom", posix_urandom, METH_VARARGS, posix_urandom__doc__}, {NULL, NULL} /* Sentinel */ }; @@ -9031,6 +8131,35 @@ static int insertvalues(PyObject *module) } #endif +#if defined(HAVE_SYMLINK) && defined(MS_WINDOWS) +static int +enable_symlink() +{ + HANDLE tok; + TOKEN_PRIVILEGES tok_priv; + LUID luid; + int meth_idx = 0; + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &tok)) + return 0; + + if (!LookupPrivilegeValue(NULL, SE_CREATE_SYMBOLIC_LINK_NAME, &luid)) + return 0; + + tok_priv.PrivilegeCount = 1; + tok_priv.Privileges[0].Luid = luid; + tok_priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + if (!AdjustTokenPrivileges(tok, FALSE, &tok_priv, + sizeof(TOKEN_PRIVILEGES), + (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL)) + return 0; + + /* ERROR_NOT_ALL_ASSIGNED returned when the privilege can't be assigned. */ + return GetLastError() == ERROR_NOT_ALL_ASSIGNED ? 0 : 1; +} +#endif /* defined(HAVE_SYMLINK) && defined(MS_WINDOWS) */ + static int all_ins(PyObject *d) { @@ -9215,6 +8344,14 @@ all_ins(PyObject *d) if (ins(d, "EX_NOTFOUND", (long)EX_NOTFOUND)) return -1; #endif /* EX_NOTFOUND */ + /* statvfs */ +#ifdef ST_RDONLY + if (ins(d, "ST_RDONLY", (long)ST_RDONLY)) return -1; +#endif /* ST_RDONLY */ +#ifdef ST_NOSUID + if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1; +#endif /* ST_NOSUID */ + #ifdef HAVE_SPAWNV #if defined(PYOS_OS2) && defined(PYCC_GCC) if (ins(d, "P_WAIT", (long)P_WAIT)) return -1; @@ -9254,41 +8391,56 @@ all_ins(PyObject *d) #if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__)) && !defined(__QNX__) -#define INITFUNC initnt +#define INITFUNC PyInit_nt #define MODNAME "nt" #elif defined(PYOS_OS2) -#define INITFUNC initos2 +#define INITFUNC PyInit_os2 #define MODNAME "os2" #else -#define INITFUNC initposix +#define INITFUNC PyInit_posix #define MODNAME "posix" #endif +static struct PyModuleDef posixmodule = { + PyModuleDef_HEAD_INIT, + MODNAME, + posix__doc__, + -1, + posix_methods, + NULL, + NULL, + NULL, + NULL +}; + + PyMODINIT_FUNC INITFUNC(void) { PyObject *m, *v; - m = Py_InitModule3(MODNAME, - posix_methods, - posix__doc__); +#if defined(HAVE_SYMLINK) && defined(MS_WINDOWS) + win32_can_symlink = enable_symlink(); +#endif + + m = PyModule_Create(&posixmodule); if (m == NULL) - return; + return NULL; /* Initialize environ dictionary */ v = convertenviron(); Py_XINCREF(v); if (v == NULL || PyModule_AddObject(m, "environ", v) != 0) - return; + return NULL; Py_DECREF(v); if (all_ins(m)) - return; + return NULL; if (setup_confname_tables(m)) - return; + return NULL; Py_INCREF(PyExc_OSError); PyModule_AddObject(m, "error", PyExc_OSError); @@ -9340,7 +8492,7 @@ INITFUNC(void) #ifdef HAVE_FSTATVFS if (fstatvfs == NULL) { if (PyObject_DelAttrString(m, "fstatvfs") == -1) { - return; + return NULL; } } #endif /* HAVE_FSTATVFS */ @@ -9348,7 +8500,7 @@ INITFUNC(void) #ifdef HAVE_STATVFS if (statvfs == NULL) { if (PyObject_DelAttrString(m, "statvfs") == -1) { - return; + return NULL; } } #endif /* HAVE_STATVFS */ @@ -9356,18 +8508,17 @@ INITFUNC(void) # ifdef HAVE_LCHOWN if (lchown == NULL) { if (PyObject_DelAttrString(m, "lchown") == -1) { - return; + return NULL; } } #endif /* HAVE_LCHOWN */ #endif /* __APPLE__ */ + return m; } #ifdef __cplusplus } #endif - - diff --git a/Modules/puremodule.c b/Modules/puremodule.c deleted file mode 100644 index b89f17287b8..00000000000 --- a/Modules/puremodule.c +++ /dev/null @@ -1,992 +0,0 @@ -/* This module exports the C API to such Pure Software Inc. (tm) (now - * called Pure Atria Corporation) products as Purify (tm) and Quantify - * (tm). Other packages could be added, but I didn't have those products - * and thus lack the API documentation. - * - * Currently supported: Quantify 2.x, Purify 3.x - * - * You need to decide which products you want to incorporate into the - * module when you compile this file. The way to do this is to edit - * <Python>/Modules/Setup to pass the appropriate flags to the compiler. - * -DWITH_PURIFY compiles in the Purify support, and -DWITH_QUANTIFY - * compiles in the Quantify support. -DWITH_ALL_PURE compiles in both. - * You can also build a Purify'd or Quantify'd interpreter by passing in - * the LINKCC variable to make. E.g. if you want to build a Purify'd - * interpreter and are using gcc, build Python with this command: - * - * make LINKCC='purify gcc' - * - * It would be nice (and probably easy) to provide this file as a shared - * library, however since it doesn't appear that Pure gives us shared - * libraries of the stubs, it doesn't really matter. For now, you have to - * link this file in statically. - * - * Major bogosity. The purify.h header file exports purify_exit(), but - * guess what? It is not defined in the libpurify_stubs.a file! I tried - * to fake one here, hoping the Pure linker would Do The Right Thing when - * instrumented for Purify, but it doesn't seem to, so I don't export - * purify_exit() to the Python layer. In Python you should raise a - * SystemExit exception anyway. - * - * The actual purify.h and quantify.h files which embody the APIs are - * copyrighted by Pure Software, Inc. and are only attainable through them. - * This module assumes you have legally installed licenses of their - * software. Contact them on the Web via <http://www.pureatria.com/> - * - * Author: Barry Warsaw <bwarsaw@python.org> - * <bwarsaw@cnri.reston.va.us> - */ - -#include "Python.h" - -#if defined(WITH_PURIFY) || defined(WITH_ALL_PURE) -# include <purify.h> -# define HAS_PURIFY_EXIT 0 /* See note at top of file */ -# define PURE_PURIFY_VERSION 3 /* not provided by purify.h */ -#endif -#if defined(WITH_QUANTIFY) || defined(WITH_ALL_PURE) -# include <quantify.h> -# define PURE_QUANTIFY_VERSION 2 /* not provided by quantify.h */ -#endif -#if defined(PURIFY_H) || defined(QUANTIFY_H) -# define COMMON_PURE_FUNCTIONS -#endif /* PURIFY_H || QUANTIFY_H */ - -typedef int (*VoidArgFunc)(void); -typedef int (*StringArgFunc)(char*); -typedef int (*PrintfishFunc)(const char*, ...); -typedef int (*StringIntArgFunc)(const char*, int); - - - -static PyObject* -call_voidarg_function(VoidArgFunc func, PyObject *self, PyObject *args) -{ - int status; - - if (!PyArg_ParseTuple(args, "")) - return NULL; - - status = func(); - return Py_BuildValue("i", status); -} - -static PyObject* -call_stringarg_function(StringArgFunc func, PyObject *self, PyObject *args) -{ - int status; - char* stringarg; - - if (!PyArg_ParseTuple(args, "s", &stringarg)) - return NULL; - - status = func(stringarg); - return Py_BuildValue("i", status); -} - -static PyObject* -call_stringorint_function(StringArgFunc func, PyObject *self, PyObject *args) -{ - int status; - int intarg; - char* stringarg; - - /* according to the quantify.h file, the argument to - * quantify_*_recording_system_call can be an integer or a string, - * but the functions are prototyped as taking a single char* - * argument. Yikes! - */ - if (PyArg_ParseTuple(args, "i", &intarg)) - /* func is prototyped as int(*)(char*) - * better shut up the compiler - */ - status = func((char*)intarg); - - else { - PyErr_Clear(); - if (!PyArg_ParseTuple(args, "s", &stringarg)) - return NULL; - else - status = func(stringarg); - } - return Py_BuildValue("i", status); -} - -static PyObject* -call_printfish_function(PrintfishFunc func, PyObject *self, PyObject *args) -{ - /* we support the printf() style vararg functions by requiring the - * formatting be done in Python. At the C level we pass just a string - * to the printf() style function. - */ - int status; - char* argstring; - - if (!PyArg_ParseTuple(args, "s", &argstring)) - return NULL; - - status = func("%s", argstring); - return Py_BuildValue("i", status); -} - -static PyObject* -call_intasaddr_function(StringArgFunc func, PyObject *self, PyObject *args) -{ - long memrep; - int id; - - if (!PyArg_ParseTuple(args, "l", &memrep)) - return NULL; - - id = func((char*)memrep); - return Py_BuildValue("i", id); -} - -static PyObject* -call_stringandint_function(StringIntArgFunc func, PyObject *self, - PyObject *args) -{ - long srcrep; - int size; - int status; - - if (!PyArg_ParseTuple(args, "li", &srcrep, &size)) - return NULL; - - status = func((char*)srcrep, size); - return Py_BuildValue("i", status); -} - - - -/* functions common to all products - * - * N.B. These printf() style functions are a bit of a kludge. Since the - * API doesn't provide vprintf versions of them, we can't call them - * directly. They don't support all the standard printf % modifiers - * anyway. The way to use these is to use Python's % string operator to do - * the formatting. By the time these functions get the thing to print, - * it's already a string, and they just use "%s" as the format string. - */ - -#ifdef COMMON_PURE_FUNCTIONS - -static PyObject* -pure_pure_logfile_printf(PyObject* self, PyObject* args) -{ - return call_printfish_function(pure_logfile_printf, self, args); -} - -static PyObject* -pure_pure_printf(PyObject* self, PyObject* args) -{ - return call_printfish_function(pure_printf, self, args); -} - -static PyObject* -pure_pure_printf_with_banner(PyObject* self, PyObject* args) -{ - return call_printfish_function(pure_printf_with_banner, self, args); -} - - -#endif /* COMMON_PURE_FUNCTIONS */ - - - -/* Purify functions - * - * N.B. There are some interfaces described in the purify.h file that are - * not described in the manual. - * - * Unsigned longs purify_report_{address,number,type,result} are not - * accessible from the Python layer since they seem mostly useful when - * purify_stop_here() is called by the (C) debugger. The same is true of - * the purify_stop_here_internal() function so it isn't exported either. - * And purify_stop_here() should never be called directly. - * - * The header file says purify_{new,all,clear_new}_reports() are obsolete - * so they aren't exported. - * - * None of the custom dynamic loader functions are exported. - * - * purify_unsafe_memcpy() isn't exported. - * - * purify_{start,size}_of_block() aren't exported. - * - * The manual that I have says that the prototype for the second argument - * to purify_map_pool is: - * - * void (*fn)(char*) - * - * but the purify.h file declares it as: - * - * void (*fn)(char*, int, void*) - * - * and does not explain what the other arguments are for. I support the - * latter but I don't know if I do it right or usefully. - * - * The header file says that purify_describe() returns a char* which is the - * pointer passed to it. The manual says it returns an int, but I believe - * that is a typo. - */ -#ifdef PURIFY_H - -static PyObject* -pure_purify_all_inuse(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_all_inuse, self, args); -} -static PyObject* -pure_purify_all_leaks(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_all_leaks, self, args); -} -static PyObject* -pure_purify_new_inuse(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_new_inuse, self, args); -} -static PyObject* -pure_purify_new_leaks(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_new_leaks, self, args); -} -static PyObject* -pure_purify_clear_inuse(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_clear_inuse, self, args); -} -static PyObject* -pure_purify_clear_leaks(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_clear_leaks, self, args); -} -static PyObject* -pure_purify_all_fds_inuse(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_all_fds_inuse, self, args); -} -static PyObject* -pure_purify_new_fds_inuse(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_new_fds_inuse, self, args); -} -static PyObject* -pure_purify_printf_with_call_chain(PyObject *self, PyObject *args) -{ - return call_printfish_function(purify_printf_with_call_chain, - self, args); -} -static PyObject* -pure_purify_set_pool_id(PyObject *self, PyObject *args) -{ - long memrep; - int id; - - if (!PyArg_ParseTuple(args, "li:purify_set_pool_id", &memrep, &id)) - return NULL; - - purify_set_pool_id((char*)memrep, id); - Py_INCREF(Py_None); - return Py_None; -} -static PyObject* -pure_purify_get_pool_id(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_get_pool_id, self, args); -} -static PyObject* -pure_purify_set_user_data(PyObject *self, PyObject *args) -{ - long memrep; - long datarep; - - if (!PyArg_ParseTuple(args, "ll:purify_set_user_data", &memrep, &datarep)) - return NULL; - - purify_set_user_data((char*)memrep, (void*)datarep); - Py_INCREF(Py_None); - return Py_None; -} -static PyObject* -pure_purify_get_user_data(PyObject *self, PyObject *args) -{ - /* can't use call_intasaddr_function() since purify_get_user_data() - * returns a void* - */ - long memrep; - void* data; - - if (!PyArg_ParseTuple(args, "l:purify_get_user_data", &memrep)) - return NULL; - - data = purify_get_user_data((char*)memrep); - return Py_BuildValue("l", (long)data); -} - - -/* this global variable is shared by both mapping functions: - * pure_purify_map_pool() and pure_purify_map_pool_id(). Since they cache - * this variable it should be safe in the face of recursion or cross - * calling. - * - * Further note that the prototype for the callback function is wrong in - * the Purify manual. The manual says the function takes a single char*, - * but the header file says it takes an additional int and void*. I have - * no idea what these are for! - */ -static PyObject* MapCallable = NULL; - -static void -map_pool_callback(char* mem, int user_size, void *user_aux_data) -{ - long memrep = (long)mem; - long user_aux_data_rep = (long)user_aux_data; - PyObject* result; - PyObject* memobj = Py_BuildValue("lil", memrep, user_size, - user_aux_data_rep); - - if (memobj == NULL) - return; - - result = PyEval_CallObject(MapCallable, memobj); - Py_DECREF(result); - Py_DECREF(memobj); -} - -static PyObject* -pure_purify_map_pool(PyObject *self, PyObject *args) -{ - /* cache global variable in case of recursion */ - PyObject* saved_callable = MapCallable; - PyObject* arg_callable; - int id; - - if (!PyArg_ParseTuple(args, "iO:purify_map_pool", &id, &arg_callable)) - return NULL; - - if (!PyCallable_Check(arg_callable)) { - PyErr_SetString(PyExc_TypeError, - "Second argument must be callable"); - return NULL; - } - MapCallable = arg_callable; - purify_map_pool(id, map_pool_callback); - MapCallable = saved_callable; - - Py_INCREF(Py_None); - return Py_None; -} - -static void -PurifyMapPoolIdCallback(int id) -{ - PyObject* result; - PyObject* intobj = Py_BuildValue("i", id); - - if (intobj == NULL) - return; - - result = PyEval_CallObject(MapCallable, intobj); - Py_DECREF(result); - Py_DECREF(intobj); -} - -static PyObject* -pure_purify_map_pool_id(PyObject *self, PyObject *args) -{ - /* cache global variable in case of recursion */ - PyObject* saved_callable = MapCallable; - PyObject* arg_callable; - - if (!PyArg_ParseTuple(args, "O:purify_map_pool_id", &arg_callable)) - return NULL; - - if (!PyCallable_Check(arg_callable)) { - PyErr_SetString(PyExc_TypeError, "Argument must be callable."); - return NULL; - } - - MapCallable = arg_callable; - purify_map_pool_id(PurifyMapPoolIdCallback); - MapCallable = saved_callable; - - Py_INCREF(Py_None); - return Py_None; -} - - - -static PyObject* -pure_purify_new_messages(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_new_messages, self, args); -} -static PyObject* -pure_purify_all_messages(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_all_messages, self, args); -} -static PyObject* -pure_purify_clear_messages(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_clear_messages, self, args); -} -static PyObject* -pure_purify_clear_new_messages(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_clear_new_messages, self, args); -} -static PyObject* -pure_purify_start_batch(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_start_batch, self, args); -} -static PyObject* -pure_purify_start_batch_show_first(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_start_batch_show_first, - self, args); -} -static PyObject* -pure_purify_stop_batch(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_stop_batch, self, args); -} -static PyObject* -pure_purify_name_thread(PyObject *self, PyObject *args) -{ - /* can't strictly use call_stringarg_function since - * purify_name_thread takes a const char*, not a char* - */ - int status; - char* stringarg; - - if (!PyArg_ParseTuple(args, "s:purify_name_thread", &stringarg)) - return NULL; - - status = purify_name_thread(stringarg); - return Py_BuildValue("i", status); -} -static PyObject* -pure_purify_watch(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch, self, args); -} -static PyObject* -pure_purify_watch_1(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_1, self, args); -} -static PyObject* -pure_purify_watch_2(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_2, self, args); -} -static PyObject* -pure_purify_watch_4(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_4, self, args); -} -static PyObject* -pure_purify_watch_8(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_8, self, args); -} -static PyObject* -pure_purify_watch_w_1(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_w_1, self, args); -} -static PyObject* -pure_purify_watch_w_2(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_w_2, self, args); -} -static PyObject* -pure_purify_watch_w_4(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_w_4, self, args); -} -static PyObject* -pure_purify_watch_w_8(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_w_8, self, args); -} -static PyObject* -pure_purify_watch_r_1(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_r_1, self, args); -} -static PyObject* -pure_purify_watch_r_2(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_r_2, self, args); -} -static PyObject* -pure_purify_watch_r_4(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_r_4, self, args); -} -static PyObject* -pure_purify_watch_r_8(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_r_8, self, args); -} -static PyObject* -pure_purify_watch_rw_1(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_rw_1, self, args); -} -static PyObject* -pure_purify_watch_rw_2(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_rw_2, self, args); -} -static PyObject* -pure_purify_watch_rw_4(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_rw_4, self, args); -} -static PyObject* -pure_purify_watch_rw_8(PyObject *self, PyObject *args) -{ - return call_intasaddr_function(purify_watch_rw_8, self, args); -} - -static PyObject* -pure_purify_watch_n(PyObject *self, PyObject *args) -{ - long addrrep; - unsigned int size; - char* type; - int status; - - if (!PyArg_ParseTuple(args, "lis:purify_watch_n", &addrrep, &size, &type)) - return NULL; - - status = purify_watch_n((char*)addrrep, size, type); - return Py_BuildValue("i", status); -} - -static PyObject* -pure_purify_watch_info(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_watch_info, self, args); -} - -static PyObject* -pure_purify_watch_remove(PyObject *self, PyObject *args) -{ - int watchno; - int status; - - if (!PyArg_ParseTuple(args, "i:purify_watch_remove", &watchno)) - return NULL; - - status = purify_watch_remove(watchno); - return Py_BuildValue("i", status); -} - -static PyObject* -pure_purify_watch_remove_all(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_watch_remove_all, self, args); -} -static PyObject* -pure_purify_describe(PyObject *self, PyObject *args) -{ - long addrrep; - char* rtn; - - if (!PyArg_ParseTuple(args, "l:purify_describe", &addrrep)) - return NULL; - - rtn = purify_describe((char*)addrrep); - return Py_BuildValue("l", (long)rtn); -} - -static PyObject* -pure_purify_what_colors(PyObject *self, PyObject *args) -{ - long addrrep; - unsigned int size; - int status; - - if (!PyArg_ParseTuple(args, "li:purify_what_colors", &addrrep, &size)) - return NULL; - - status = purify_what_colors((char*)addrrep, size); - return Py_BuildValue("i", status); -} - -static PyObject* -pure_purify_is_running(PyObject *self, PyObject *args) -{ - return call_voidarg_function(purify_is_running, self, args); -} - -static PyObject* -pure_purify_assert_is_readable(PyObject *self, PyObject *args) -{ - return call_stringandint_function(purify_assert_is_readable, - self, args); -} -static PyObject* -pure_purify_assert_is_writable(PyObject *self, PyObject *args) -{ - return call_stringandint_function(purify_assert_is_writable, - self, args); -} - -#if HAS_PURIFY_EXIT - -/* I wish I could include this, but I can't. See the notes at the top of - * the file. - */ - -static PyObject* -pure_purify_exit(PyObject *self, PyObject *args) -{ - int status; - - if (!PyArg_ParseTuple(args, "i:purify_exit", &status)) - return NULL; - - /* purify_exit doesn't always act like exit(). See the manual */ - purify_exit(status); - Py_INCREF(Py_None); - return Py_None; -} -#endif /* HAS_PURIFY_EXIT */ - -#endif /* PURIFY_H */ - - - -/* Quantify functions - * - * N.B. Some of these functions are only described in the quantify.h file, - * not in the version of the hardcopy manual that I had. If you're not - * sure what some of these do, check the header file, it is documented - * fairly well. - * - * None of the custom dynamic loader functions are exported. - * - */ -#ifdef QUANTIFY_H - -static PyObject* -pure_quantify_is_running(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_is_running, self, args); -} -static PyObject* -pure_quantify_help(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_help, self, args); -} -static PyObject* -pure_quantify_print_recording_state(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_print_recording_state, - self, args); -} -static PyObject* -pure_quantify_start_recording_data(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_start_recording_data, - self, args); -} -static PyObject* -pure_quantify_stop_recording_data(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_stop_recording_data, self, args); -} -static PyObject* -pure_quantify_is_recording_data(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_is_recording_data, self, args); -} -static PyObject* -pure_quantify_start_recording_system_calls(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_start_recording_system_calls, - self, args); -} -static PyObject* -pure_quantify_stop_recording_system_calls(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_stop_recording_system_calls, - self, args); -} -static PyObject* -pure_quantify_is_recording_system_calls(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_is_recording_system_calls, - self, args); -} -static PyObject* -pure_quantify_start_recording_system_call(PyObject *self, PyObject *args) -{ - return call_stringorint_function(quantify_start_recording_system_call, - self, args); -} -static PyObject* -pure_quantify_stop_recording_system_call(PyObject *self, PyObject *args) -{ - return call_stringorint_function(quantify_stop_recording_system_call, - self, args); -} -static PyObject* -pure_quantify_is_recording_system_call(PyObject *self, PyObject *args) -{ - return call_stringorint_function(quantify_is_recording_system_call, - self, args); -} -static PyObject* -pure_quantify_start_recording_dynamic_library_data(PyObject *self, PyObject *args) -{ - return call_voidarg_function( - quantify_start_recording_dynamic_library_data, - self, args); -} -static PyObject* -pure_quantify_stop_recording_dynamic_library_data(PyObject *self, PyObject *args) -{ - return call_voidarg_function( - quantify_stop_recording_dynamic_library_data, - self, args); -} -static PyObject* -pure_quantify_is_recording_dynamic_library_data(PyObject *self, PyObject *args) -{ - return call_voidarg_function( - quantify_is_recording_dynamic_library_data, - self, args); -} -static PyObject* -pure_quantify_start_recording_register_window_traps(PyObject *self, PyObject *args) -{ - return call_voidarg_function( - quantify_start_recording_register_window_traps, - self, args); -} -static PyObject* -pure_quantify_stop_recording_register_window_traps(PyObject *self, PyObject *args) -{ - return call_voidarg_function( - quantify_stop_recording_register_window_traps, - self, args); -} -static PyObject* -pure_quantify_is_recording_register_window_traps(PyObject *self, PyObject *args) -{ - return call_voidarg_function( - quantify_is_recording_register_window_traps, - self, args); -} -static PyObject* -pure_quantify_disable_recording_data(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_disable_recording_data, - self, args); -} -static PyObject* -pure_quantify_clear_data(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_clear_data, self, args); -} -static PyObject* -pure_quantify_save_data(PyObject *self, PyObject *args) -{ - return call_voidarg_function(quantify_save_data, self, args); -} -static PyObject* -pure_quantify_save_data_to_file(PyObject *self, PyObject *args) -{ - return call_stringarg_function(quantify_save_data_to_file, self, args); -} -static PyObject* -pure_quantify_add_annotation(PyObject *self, PyObject *args) -{ - return call_stringarg_function(quantify_add_annotation, self, args); -} - -#endif /* QUANTIFY_H */ - - - -/* external interface - */ -static struct PyMethodDef -pure_methods[] = { -#ifdef COMMON_PURE_FUNCTIONS - {"pure_logfile_printf", pure_pure_logfile_printf, METH_VARARGS}, - {"pure_printf", pure_pure_printf, METH_VARARGS}, - {"pure_printf_with_banner", pure_pure_printf_with_banner, METH_VARARGS}, -#endif /* COMMON_PURE_FUNCTIONS */ -#ifdef PURIFY_H - {"purify_all_inuse", pure_purify_all_inuse, METH_VARARGS}, - {"purify_all_leaks", pure_purify_all_leaks, METH_VARARGS}, - {"purify_new_inuse", pure_purify_new_inuse, METH_VARARGS}, - {"purify_new_leaks", pure_purify_new_leaks, METH_VARARGS}, - {"purify_clear_inuse", pure_purify_clear_inuse, METH_VARARGS}, - {"purify_clear_leaks", pure_purify_clear_leaks, METH_VARARGS}, - {"purify_all_fds_inuse", pure_purify_all_fds_inuse, METH_VARARGS}, - {"purify_new_fds_inuse", pure_purify_new_fds_inuse, METH_VARARGS}, - /* see purify.h */ - {"purify_logfile_printf", pure_pure_logfile_printf, METH_VARARGS}, - {"purify_printf", pure_pure_printf, METH_VARARGS}, - {"purify_printf_with_banner", pure_pure_printf_with_banner, METH_VARARGS}, - /**/ - {"purify_printf_with_call_chain", pure_purify_printf_with_call_chain, METH_VARARGS}, - {"purify_set_pool_id", pure_purify_set_pool_id, METH_VARARGS}, - {"purify_get_pool_id", pure_purify_get_pool_id, METH_VARARGS}, - {"purify_set_user_data", pure_purify_set_user_data, METH_VARARGS}, - {"purify_get_user_data", pure_purify_get_user_data, METH_VARARGS}, - {"purify_map_pool", pure_purify_map_pool, METH_VARARGS}, - {"purify_map_pool_id", pure_purify_map_pool_id, METH_VARARGS}, - {"purify_new_messages", pure_purify_new_messages, METH_VARARGS}, - {"purify_all_messages", pure_purify_all_messages, METH_VARARGS}, - {"purify_clear_messages", pure_purify_clear_messages, METH_VARARGS}, - {"purify_clear_new_messages", pure_purify_clear_new_messages, METH_VARARGS}, - {"purify_start_batch", pure_purify_start_batch, METH_VARARGS}, - {"purify_start_batch_show_first", pure_purify_start_batch_show_first, METH_VARARGS}, - {"purify_stop_batch", pure_purify_stop_batch, METH_VARARGS}, - {"purify_name_thread", pure_purify_name_thread, METH_VARARGS}, - {"purify_watch", pure_purify_watch, METH_VARARGS}, - {"purify_watch_1", pure_purify_watch_1, METH_VARARGS}, - {"purify_watch_2", pure_purify_watch_2, METH_VARARGS}, - {"purify_watch_4", pure_purify_watch_4, METH_VARARGS}, - {"purify_watch_8", pure_purify_watch_8, METH_VARARGS}, - {"purify_watch_w_1", pure_purify_watch_w_1, METH_VARARGS}, - {"purify_watch_w_2", pure_purify_watch_w_2, METH_VARARGS}, - {"purify_watch_w_4", pure_purify_watch_w_4, METH_VARARGS}, - {"purify_watch_w_8", pure_purify_watch_w_8, METH_VARARGS}, - {"purify_watch_r_1", pure_purify_watch_r_1, METH_VARARGS}, - {"purify_watch_r_2", pure_purify_watch_r_2, METH_VARARGS}, - {"purify_watch_r_4", pure_purify_watch_r_4, METH_VARARGS}, - {"purify_watch_r_8", pure_purify_watch_r_8, METH_VARARGS}, - {"purify_watch_rw_1", pure_purify_watch_rw_1, METH_VARARGS}, - {"purify_watch_rw_2", pure_purify_watch_rw_2, METH_VARARGS}, - {"purify_watch_rw_4", pure_purify_watch_rw_4, METH_VARARGS}, - {"purify_watch_rw_8", pure_purify_watch_rw_8, METH_VARARGS}, - {"purify_watch_n", pure_purify_watch_n, METH_VARARGS}, - {"purify_watch_info", pure_purify_watch_info, METH_VARARGS}, - {"purify_watch_remove", pure_purify_watch_remove, METH_VARARGS}, - {"purify_watch_remove_all", pure_purify_watch_remove_all, METH_VARARGS}, - {"purify_describe", pure_purify_describe, METH_VARARGS}, - {"purify_what_colors", pure_purify_what_colors, METH_VARARGS}, - {"purify_is_running", pure_purify_is_running, METH_VARARGS}, - {"purify_assert_is_readable", pure_purify_assert_is_readable, METH_VARARGS}, - {"purify_assert_is_writable", pure_purify_assert_is_writable, METH_VARARGS}, -#if HAS_PURIFY_EXIT - /* I wish I could include this, but I can't. See the notes at the - * top of the file. - */ - {"purify_exit", pure_purify_exit, METH_VARARGS}, -#endif /* HAS_PURIFY_EXIT */ -#endif /* PURIFY_H */ -#ifdef QUANTIFY_H - {"quantify_is_running", pure_quantify_is_running, METH_VARARGS}, - {"quantify_help", pure_quantify_help, METH_VARARGS}, - {"quantify_print_recording_state", pure_quantify_print_recording_state, METH_VARARGS}, - {"quantify_start_recording_data", pure_quantify_start_recording_data, METH_VARARGS}, - {"quantify_stop_recording_data", pure_quantify_stop_recording_data, METH_VARARGS}, - {"quantify_is_recording_data", pure_quantify_is_recording_data, METH_VARARGS}, - {"quantify_start_recording_system_calls", - pure_quantify_start_recording_system_calls, METH_VARARGS}, - {"quantify_stop_recording_system_calls", - pure_quantify_stop_recording_system_calls, METH_VARARGS}, - {"quantify_is_recording_system_calls", - pure_quantify_is_recording_system_calls, METH_VARARGS}, - {"quantify_start_recording_system_call", - pure_quantify_start_recording_system_call, METH_VARARGS}, - {"quantify_stop_recording_system_call", - pure_quantify_stop_recording_system_call, METH_VARARGS}, - {"quantify_is_recording_system_call", - pure_quantify_is_recording_system_call, METH_VARARGS}, - {"quantify_start_recording_dynamic_library_data", - pure_quantify_start_recording_dynamic_library_data, METH_VARARGS}, - {"quantify_stop_recording_dynamic_library_data", - pure_quantify_stop_recording_dynamic_library_data, METH_VARARGS}, - {"quantify_is_recording_dynamic_library_data", - pure_quantify_is_recording_dynamic_library_data, METH_VARARGS}, - {"quantify_start_recording_register_window_traps", - pure_quantify_start_recording_register_window_traps, METH_VARARGS}, - {"quantify_stop_recording_register_window_traps", - pure_quantify_stop_recording_register_window_traps, METH_VARARGS}, - {"quantify_is_recording_register_window_traps", - pure_quantify_is_recording_register_window_traps, METH_VARARGS}, - {"quantify_disable_recording_data", - pure_quantify_disable_recording_data, METH_VARARGS}, - {"quantify_clear_data", pure_quantify_clear_data, METH_VARARGS}, - {"quantify_save_data", pure_quantify_save_data, METH_VARARGS}, - {"quantify_save_data_to_file", pure_quantify_save_data_to_file, METH_VARARGS}, - {"quantify_add_annotation", pure_quantify_add_annotation, METH_VARARGS}, -#endif /* QUANTIFY_H */ - {NULL, NULL} /* sentinel */ -}; - - - -static void -ins(d, name, val) - PyObject *d; - char* name; - long val; -{ - PyObject *v = PyInt_FromLong(val); - if (v) { - (void)PyDict_SetItemString(d, name, v); - Py_DECREF(v); - } -} - - -void -initpure() -{ - PyObject *m, *d; - - if (PyErr_WarnPy3k("the pure module has been removed in " - "Python 3.0", 2) < 0) - return; - - m = Py_InitModule("pure", pure_methods); - if (m == NULL) - return; - d = PyModule_GetDict(m); - - /* this is bogus because we should be able to find this information - * out from the header files. Pure's current versions don't - * include this information! - */ -#ifdef PURE_PURIFY_VERSION - ins(d, "PURIFY_VERSION", PURE_PURIFY_VERSION); -#else - PyDict_SetItemString(d, "PURIFY_VERSION", Py_None); -#endif - - /* these aren't terribly useful because purify_exit() isn't - * exported correctly. See the note at the top of the file. - */ -#ifdef PURIFY_EXIT_ERRORS - ins(d, "PURIFY_EXIT_ERRORS", PURIFY_EXIT_ERRORS); -#endif -#ifdef PURIFY_EXIT_LEAKS - ins(d, "PURIFY_EXIT_LEAKS", PURIFY_EXIT_LEAKS); -#endif -#ifdef PURIFY_EXIT_PLEAKS - ins(d, "PURIFY_EXIT_PLEAKS", PURIFY_EXIT_PLEAKS); -#endif - - -#ifdef PURE_QUANTIFY_VERSION - ins(d, "QUANTIFY_VERSION", PURE_QUANTIFY_VERSION); -#else - PyDict_SetItemString(d, "QUANTIFY_VERSION", Py_None); -#endif -} diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c index 6729c84fedf..1e0903a3887 100644 --- a/Modules/pwdmodule.c +++ b/Modules/pwdmodule.c @@ -2,7 +2,6 @@ /* UNIX password file access module */ #include "Python.h" -#include "structseq.h" #include <sys/types.h> #include <pwd.h> @@ -46,10 +45,12 @@ static int initialized; static PyTypeObject StructPwdType; static void -sets(PyObject *v, int i, char* val) +sets(PyObject *v, int i, const char* val) { - if (val) - PyStructSequence_SET_ITEM(v, i, PyString_FromString(val)); + if (val) { + PyObject *o = PyUnicode_DecodeFSDefault(val); + PyStructSequence_SET_ITEM(v, i, o); + } else { PyStructSequence_SET_ITEM(v, i, Py_None); Py_INCREF(Py_None); @@ -64,7 +65,7 @@ mkpwent(struct passwd *p) if (v == NULL) return NULL; -#define SETI(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val)) +#define SETI(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val)) #define SETS(i,val) sets(v, i, val) SETS(setIndex++, p->pw_name); @@ -126,14 +127,23 @@ pwd_getpwnam(PyObject *self, PyObject *args) { char *name; struct passwd *p; - if (!PyArg_ParseTuple(args, "s:getpwnam", &name)) + PyObject *arg, *bytes, *retval = NULL; + + if (!PyArg_ParseTuple(args, "U:getpwnam", &arg)) + return NULL; + if ((bytes = PyUnicode_EncodeFSDefault(arg)) == NULL) return NULL; + if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1) + goto out; if ((p = getpwnam(name)) == NULL) { PyErr_Format(PyExc_KeyError, "getpwnam(): name not found: %s", name); - return NULL; + goto out; } - return mkpwent(p); + retval = mkpwent(p); +out: + Py_DECREF(bytes); + return retval; } #ifdef HAVE_GETPWENT @@ -180,21 +190,33 @@ static PyMethodDef pwd_methods[] = { {NULL, NULL} /* sentinel */ }; +static struct PyModuleDef pwdmodule = { + PyModuleDef_HEAD_INIT, + "pwd", + pwd__doc__, + -1, + pwd_methods, + NULL, + NULL, + NULL, + NULL +}; + + PyMODINIT_FUNC -initpwd(void) +PyInit_pwd(void) { PyObject *m; - m = Py_InitModule3("pwd", pwd_methods, pwd__doc__); + m = PyModule_Create(&pwdmodule); if (m == NULL) - return; + return NULL; - if (!initialized) + if (!initialized) { PyStructSequence_InitType(&StructPwdType, &struct_pwd_type_desc); + initialized = 1; + } Py_INCREF((PyObject *) &StructPwdType); PyModule_AddObject(m, "struct_passwd", (PyObject *) &StructPwdType); - /* And for b/w compatibility (this was defined by mistake): */ - Py_INCREF((PyObject *) &StructPwdType); - PyModule_AddObject(m, "struct_pwent", (PyObject *) &StructPwdType); - initialized = 1; + return m; } diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index f2691136ca8..4b9687a051e 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -8,26 +8,7 @@ #define XML_COMBINED_VERSION (10000*XML_MAJOR_VERSION+100*XML_MINOR_VERSION+XML_MICRO_VERSION) -#ifndef PyDoc_STRVAR - -/* - * fdrake says: - * Don't change the PyDoc_STR macro definition to (str), because - * '''the parentheses cause compile failures - * ("non-constant static initializer" or something like that) - * on some platforms (Irix?)''' - */ -#define PyDoc_STR(str) str -#define PyDoc_VAR(name) static char name[] -#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str) -#endif - -#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 2) -/* In Python 2.0 and 2.1, disabling Unicode was not possible. */ -#define Py_USING_UNICODE -#else #define FIX_TRACE -#endif enum HandlerTypes { StartElement, @@ -67,8 +48,6 @@ typedef struct { PyObject_HEAD XML_Parser itself; - int returns_unicode; /* True if Unicode strings are returned; - if false, UTF-8 strings are returned */ int ordered_attributes; /* Return attributes as a list. */ int specified_attributes; /* Report only specified attributes. */ int in_callback; /* Is a callback active? */ @@ -104,7 +83,7 @@ static struct HandlerInfo handler_info[64]; static int set_error_attr(PyObject *err, char *name, int value) { - PyObject *v = PyInt_FromLong(value); + PyObject *v = PyLong_FromLong(value); if (v == NULL || PyObject_SetAttrString(err, name, v) == -1) { Py_XDECREF(v); @@ -153,7 +132,7 @@ get_handler_name(struct HandlerInfo *hinfo) { PyObject *name = hinfo->nameobj; if (name == NULL) { - name = PyString_FromString(hinfo->name); + name = PyUnicode_FromString(hinfo->name); hinfo->nameobj = name; } Py_XINCREF(name); @@ -161,7 +140,6 @@ get_handler_name(struct HandlerInfo *hinfo) } -#ifdef Py_USING_UNICODE /* Convert a string of XML_Chars into a Unicode string. Returns None if str is a null pointer. */ @@ -190,36 +168,6 @@ conv_string_len_to_unicode(const XML_Char *str, int len) } return PyUnicode_DecodeUTF8((const char *)str, len, "strict"); } -#endif - -/* Convert a string of XML_Chars into an 8-bit Python string. - Returns None if str is a null pointer. */ - -static PyObject * -conv_string_to_utf8(const XML_Char *str) -{ - /* XXX currently this code assumes that XML_Char is 8-bit, - and hence in UTF-8. */ - /* UTF-8 from Expat, UTF-8 desired */ - if (str == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return PyString_FromString(str); -} - -static PyObject * -conv_string_len_to_utf8(const XML_Char *str, int len) -{ - /* XXX currently this code assumes that XML_Char is 8-bit, - and hence in UTF-8. */ - /* UTF-8 from Expat, UTF-8 desired */ - if (str == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return PyString_FromStringAndSize((const char *)str, len); -} /* Callback routines */ @@ -310,11 +258,7 @@ trace_frame_exc(PyThreadState *tstate, PyFrameObject *f) value = Py_None; Py_INCREF(value); } -#if PY_VERSION_HEX < 0x02040000 - arg = Py_BuildValue("(OOO)", type, value, traceback); -#else arg = PyTuple_Pack(3, type, value, traceback); -#endif if (arg == NULL) { PyErr_Restore(type, value, traceback); return 0; @@ -376,18 +320,10 @@ call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args, return res; } -#ifndef Py_USING_UNICODE -#define STRING_CONV_FUNC conv_string_to_utf8 -#else -/* Python 2.0 and later versions, when built with Unicode support */ -#define STRING_CONV_FUNC (self->returns_unicode \ - ? conv_string_to_unicode : conv_string_to_utf8) -#endif - static PyObject* string_intern(xmlparseobject *self, const char* str) { - PyObject *result = STRING_CONV_FUNC(str); + PyObject *result = conv_string_to_unicode(str); PyObject *value; /* result can be NULL if the unicode conversion failed. */ if (!result) @@ -421,13 +357,7 @@ call_character_handler(xmlparseobject *self, const XML_Char *buffer, int len) args = PyTuple_New(1); if (args == NULL) return -1; -#ifdef Py_USING_UNICODE - temp = (self->returns_unicode - ? conv_string_len_to_unicode(buffer, len) - : conv_string_len_to_utf8(buffer, len)); -#else - temp = conv_string_len_to_utf8(buffer, len); -#endif + temp = (conv_string_len_to_unicode(buffer, len)); if (temp == NULL) { Py_DECREF(args); flag_error(self); @@ -532,7 +462,7 @@ my_StartElementHandler(void *userData, Py_DECREF(container); return; } - v = STRING_CONV_FUNC((XML_Char *) atts[i+1]); + v = conv_string_to_unicode((XML_Char *) atts[i+1]); if (v == NULL) { flag_error(self); Py_DECREF(container); @@ -610,7 +540,7 @@ my_##NAME##Handler PARAMS {\ #define INT_HANDLER(NAME, PARAMS, PARAM_FORMAT)\ RC_HANDLER(int, NAME, PARAMS, int rc=0;, PARAM_FORMAT, \ - rc = PyInt_AsLong(rv);, rc, \ + rc = PyLong_AsLong(rv);, rc, \ (xmlparseobject *)userData) VOID_HANDLER(EndElement, @@ -621,7 +551,7 @@ VOID_HANDLER(ProcessingInstruction, (void *userData, const XML_Char *target, const XML_Char *data), - ("(NO&)", string_intern(self, target), STRING_CONV_FUNC,data)) + ("(NO&)", string_intern(self, target), conv_string_to_unicode ,data)) VOID_HANDLER(UnparsedEntityDecl, (void *userData, @@ -635,24 +565,6 @@ VOID_HANDLER(UnparsedEntityDecl, string_intern(self, systemId), string_intern(self, publicId), string_intern(self, notationName))) -#ifndef Py_USING_UNICODE -VOID_HANDLER(EntityDecl, - (void *userData, - const XML_Char *entityName, - int is_parameter_entity, - const XML_Char *value, - int value_length, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName), - ("NiNNNNN", - string_intern(self, entityName), is_parameter_entity, - conv_string_len_to_utf8(value, value_length), - string_intern(self, base), string_intern(self, systemId), - string_intern(self, publicId), - string_intern(self, notationName))) -#else VOID_HANDLER(EntityDecl, (void *userData, const XML_Char *entityName, @@ -665,13 +577,10 @@ VOID_HANDLER(EntityDecl, const XML_Char *notationName), ("NiNNNNN", string_intern(self, entityName), is_parameter_entity, - (self->returns_unicode - ? conv_string_len_to_unicode(value, value_length) - : conv_string_len_to_utf8(value, value_length)), + (conv_string_len_to_unicode(value, value_length)), string_intern(self, base), string_intern(self, systemId), string_intern(self, publicId), string_intern(self, notationName))) -#endif VOID_HANDLER(XmlDecl, (void *userData, @@ -679,7 +588,7 @@ VOID_HANDLER(XmlDecl, const XML_Char *encoding, int standalone), ("(O&O&i)", - STRING_CONV_FUNC,version, STRING_CONV_FUNC,encoding, + conv_string_to_unicode ,version, conv_string_to_unicode ,encoding, standalone)) static PyObject * @@ -722,14 +631,7 @@ my_ElementDeclHandler(void *userData, if (flush_character_buffer(self) < 0) goto finally; -#ifdef Py_USING_UNICODE - modelobj = conv_content_model(model, - (self->returns_unicode - ? conv_string_to_unicode - : conv_string_to_utf8)); -#else - modelobj = conv_content_model(model, conv_string_to_utf8); -#endif + modelobj = conv_content_model(model, (conv_string_to_unicode)); if (modelobj == NULL) { flag_error(self); goto finally; @@ -771,7 +673,7 @@ VOID_HANDLER(AttlistDecl, int isrequired), ("(NNO&O&i)", string_intern(self, elname), string_intern(self, attname), - STRING_CONV_FUNC,att_type, STRING_CONV_FUNC,dflt, + conv_string_to_unicode ,att_type, conv_string_to_unicode ,dflt, isrequired)) #if XML_COMBINED_VERSION >= 19504 @@ -807,7 +709,7 @@ VOID_HANDLER(EndNamespaceDecl, VOID_HANDLER(Comment, (void *userData, const XML_Char *data), - ("(O&)", STRING_CONV_FUNC,data)) + ("(O&)", conv_string_to_unicode ,data)) VOID_HANDLER(StartCdataSection, (void *userData), @@ -817,27 +719,13 @@ VOID_HANDLER(EndCdataSection, (void *userData), ("()")) -#ifndef Py_USING_UNICODE -VOID_HANDLER(Default, - (void *userData, const XML_Char *s, int len), - ("(N)", conv_string_len_to_utf8(s,len))) - -VOID_HANDLER(DefaultHandlerExpand, - (void *userData, const XML_Char *s, int len), - ("(N)", conv_string_len_to_utf8(s,len))) -#else VOID_HANDLER(Default, (void *userData, const XML_Char *s, int len), - ("(N)", (self->returns_unicode - ? conv_string_len_to_unicode(s,len) - : conv_string_len_to_utf8(s,len)))) + ("(N)", (conv_string_len_to_unicode(s,len)))) VOID_HANDLER(DefaultHandlerExpand, (void *userData, const XML_Char *s, int len), - ("(N)", (self->returns_unicode - ? conv_string_len_to_unicode(s,len) - : conv_string_len_to_utf8(s,len)))) -#endif + ("(N)", (conv_string_len_to_unicode(s,len)))) INT_HANDLER(NotStandalone, (void *userData), @@ -851,9 +739,9 @@ RC_HANDLER(int, ExternalEntityRef, const XML_Char *publicId), int rc=0;, ("(O&NNN)", - STRING_CONV_FUNC,context, string_intern(self, base), + conv_string_to_unicode ,context, string_intern(self, base), string_intern(self, systemId), string_intern(self, publicId)), - rc = PyInt_AsLong(rv);, rc, + rc = PyLong_AsLong(rv);, rc, XML_GetUserData(parser)) /* XXX UnknownEncodingHandler */ @@ -882,7 +770,7 @@ get_parse_result(xmlparseobject *self, int rv) if (flush_character_buffer(self) < 0) { return NULL; } - return PyInt_FromLong(rv); + return PyLong_FromLong(rv); } PyDoc_STRVAR(xmlparse_Parse__doc__, @@ -909,49 +797,40 @@ xmlparse_Parse(xmlparseobject *self, PyObject *args) static int readinst(char *buf, int buf_size, PyObject *meth) { - PyObject *arg = NULL; - PyObject *bytes = NULL; - PyObject *str = NULL; - int len = -1; - - if ((bytes = PyInt_FromLong(buf_size)) == NULL) - goto finally; - - if ((arg = PyTuple_New(1)) == NULL) { - Py_DECREF(bytes); - goto finally; - } - - PyTuple_SET_ITEM(arg, 0, bytes); + PyObject *str; + Py_ssize_t len; + char *ptr; -#if PY_VERSION_HEX < 0x02020000 - str = PyObject_CallObject(meth, arg); -#else - str = PyObject_Call(meth, arg, NULL); -#endif + str = PyObject_CallFunction(meth, "n", buf_size); if (str == NULL) - goto finally; + goto error; - /* XXX what to do if it returns a Unicode string? */ - if (!PyString_Check(str)) { + if (PyBytes_Check(str)) + ptr = PyBytes_AS_STRING(str); + else if (PyByteArray_Check(str)) + ptr = PyByteArray_AS_STRING(str); + else { PyErr_Format(PyExc_TypeError, - "read() did not return a string object (type=%.400s)", + "read() did not return a bytes object (type=%.400s)", Py_TYPE(str)->tp_name); - goto finally; + goto error; } - len = PyString_GET_SIZE(str); + len = Py_SIZE(str); if (len > buf_size) { PyErr_Format(PyExc_ValueError, "read() returned too much data: " - "%i bytes requested, %i returned", + "%i bytes requested, %zd returned", buf_size, len); - goto finally; + goto error; } - memcpy(buf, PyString_AsString(str), len); -finally: - Py_XDECREF(arg); + memcpy(buf, ptr, len); + Py_DECREF(str); + /* len <= buf_size <= INT_MAX */ + return (int)len; + +error: Py_XDECREF(str); - return len; + return -1; } PyDoc_STRVAR(xmlparse_ParseFile__doc__, @@ -964,12 +843,12 @@ xmlparse_ParseFile(xmlparseobject *self, PyObject *f) int rv = 1; PyObject *readmethod = NULL; + readmethod = PyObject_GetAttrString(f, "read"); if (readmethod == NULL) { PyErr_SetString(PyExc_TypeError, "argument must have 'read' attribute"); return NULL; - } for (;;) { int bytes_read; @@ -981,10 +860,9 @@ xmlparse_ParseFile(xmlparseobject *self, PyObject *f) bytes_read = readinst(buf, BUF_SIZE, readmethod); if (bytes_read < 0) { - Py_XDECREF(readmethod); + Py_DECREF(readmethod); return NULL; } - rv = XML_ParseBuffer(self->itself, bytes_read, bytes_read == 0); if (PyErr_Occurred()) { Py_XDECREF(readmethod); @@ -1041,7 +919,7 @@ xmlparse_GetInputContext(xmlparseobject *self, PyObject *unused) = XML_GetInputContext(self->itself, &offset, &size); if (buffer != NULL) - return PyString_FromStringAndSize(buffer + offset, + return PyBytes_FromStringAndSize(buffer + offset, size - offset); else Py_RETURN_NONE; @@ -1068,34 +946,12 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args) return NULL; } -#ifndef Py_TPFLAGS_HAVE_GC - /* Python versions 2.0 and 2.1 */ - new_parser = PyObject_New(xmlparseobject, &Xmlparsetype); -#else - /* Python versions 2.2 and later */ new_parser = PyObject_GC_New(xmlparseobject, &Xmlparsetype); -#endif - if (new_parser == NULL) return NULL; new_parser->buffer_size = self->buffer_size; new_parser->buffer_used = 0; - if (self->buffer != NULL) { - new_parser->buffer = malloc(new_parser->buffer_size); - if (new_parser->buffer == NULL) { -#ifndef Py_TPFLAGS_HAVE_GC - /* Code for versions 2.0 and 2.1 */ - PyObject_Del(new_parser); -#else - /* Code for versions 2.2 and later. */ - PyObject_GC_Del(new_parser); -#endif - return PyErr_NoMemory(); - } - } - else - new_parser->buffer = NULL; - new_parser->returns_unicode = self->returns_unicode; + new_parser->buffer = NULL; new_parser->ordered_attributes = self->ordered_attributes; new_parser->specified_attributes = self->specified_attributes; new_parser->in_callback = 0; @@ -1105,12 +961,15 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args) new_parser->handlers = 0; new_parser->intern = self->intern; Py_XINCREF(new_parser->intern); -#ifdef Py_TPFLAGS_HAVE_GC PyObject_GC_Track(new_parser); -#else - PyObject_GC_Init(new_parser); -#endif + if (self->buffer != NULL) { + new_parser->buffer = malloc(new_parser->buffer_size); + if (new_parser->buffer == NULL) { + Py_DECREF(new_parser); + return PyErr_NoMemory(); + } + } if (!new_parser->itself) { Py_DECREF(new_parser); return PyErr_NoMemory(); @@ -1157,7 +1016,7 @@ xmlparse_SetParamEntityParsing(xmlparseobject *p, PyObject* args) if (!PyArg_ParseTuple(args, "i", &flag)) return NULL; flag = XML_SetParamEntityParsing(p->itself, flag); - return PyInt_FromLong(flag); + return PyLong_FromLong(flag); } @@ -1192,6 +1051,8 @@ xmlparse_UseForeignDTD(xmlparseobject *self, PyObject *args) } #endif +static PyObject *xmlparse_dir(PyObject *self, PyObject* noargs); + static struct PyMethodDef xmlparse_methods[] = { {"Parse", (PyCFunction)xmlparse_Parse, METH_VARARGS, xmlparse_Parse__doc__}, @@ -1211,20 +1072,19 @@ static struct PyMethodDef xmlparse_methods[] = { {"UseForeignDTD", (PyCFunction)xmlparse_UseForeignDTD, METH_VARARGS, xmlparse_UseForeignDTD__doc__}, #endif + {"__dir__", xmlparse_dir, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; /* ---------- */ -#ifdef Py_USING_UNICODE /* pyexpat international encoding support. Make it as simple as possible. */ static char template_buffer[257]; -PyObject *template_string = NULL; static void init_template_buffer(void) @@ -1268,7 +1128,6 @@ PyUnknownEncodingHandler(void *encodingHandlerData, return result; } -#endif static PyObject * newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern) @@ -1276,21 +1135,10 @@ newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern) int i; xmlparseobject *self; -#ifdef Py_TPFLAGS_HAVE_GC - /* Code for versions 2.2 and later */ self = PyObject_GC_New(xmlparseobject, &Xmlparsetype); -#else - self = PyObject_New(xmlparseobject, &Xmlparsetype); -#endif if (self == NULL) return NULL; -#ifdef Py_USING_UNICODE - self->returns_unicode = 1; -#else - self->returns_unicode = 0; -#endif - self->buffer = NULL; self->buffer_size = CHARACTER_DATA_BUFFER_SIZE; self->buffer_used = 0; @@ -1314,11 +1162,7 @@ newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern) #endif self->intern = intern; Py_XINCREF(self->intern); -#ifdef Py_TPFLAGS_HAVE_GC PyObject_GC_Track(self); -#else - PyObject_GC_Init(self); -#endif if (self->itself == NULL) { PyErr_SetString(PyExc_RuntimeError, "XML_ParserCreate failed"); @@ -1326,10 +1170,8 @@ newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern) return NULL; } XML_SetUserData(self->itself, (void *)self); -#ifdef Py_USING_UNICODE XML_SetUnknownEncodingHandler(self->itself, (XML_UnknownEncodingHandler) PyUnknownEncodingHandler, NULL); -#endif for (i = 0; handler_info[i].name != NULL; i++) /* do nothing */; @@ -1349,11 +1191,7 @@ static void xmlparse_dealloc(xmlparseobject *self) { int i; -#ifdef Py_TPFLAGS_HAVE_GC PyObject_GC_UnTrack(self); -#else - PyObject_GC_Fini(self); -#endif if (self->itself != NULL) XML_ParserFree(self->itself); self->itself = NULL; @@ -1373,21 +1211,16 @@ xmlparse_dealloc(xmlparseobject *self) self->buffer = NULL; } Py_XDECREF(self->intern); -#ifndef Py_TPFLAGS_HAVE_GC - /* Code for versions 2.0 and 2.1 */ - PyObject_Del(self); -#else - /* Code for versions 2.2 and later. */ PyObject_GC_Del(self); -#endif } static int -handlername2int(const char *name) +handlername2int(PyObject *name) { int i; for (i = 0; handler_info[i].name != NULL; i++) { - if (strcmp(name, handler_info[i].name) == 0) { + if (PyUnicode_CompareWithASCIIString( + name, handler_info[i].name) == 0) { return i; } } @@ -1403,9 +1236,15 @@ get_pybool(int istrue) } static PyObject * -xmlparse_getattr(xmlparseobject *self, char *name) +xmlparse_getattro(xmlparseobject *self, PyObject *nameobj) { - int handlernum = handlername2int(name); + Py_UNICODE *name; + int handlernum = -1; + + if (!PyUnicode_Check(nameobj)) + goto generic; + + handlernum = handlername2int(nameobj); if (handlernum != -1) { PyObject *result = self->handlers[handlernum]; @@ -1414,48 +1253,48 @@ xmlparse_getattr(xmlparseobject *self, char *name) Py_INCREF(result); return result; } + + name = PyUnicode_AS_UNICODE(nameobj); if (name[0] == 'E') { - if (strcmp(name, "ErrorCode") == 0) - return PyInt_FromLong((long) + if (PyUnicode_CompareWithASCIIString(nameobj, "ErrorCode") == 0) + return PyLong_FromLong((long) XML_GetErrorCode(self->itself)); - if (strcmp(name, "ErrorLineNumber") == 0) - return PyInt_FromLong((long) + if (PyUnicode_CompareWithASCIIString(nameobj, "ErrorLineNumber") == 0) + return PyLong_FromLong((long) XML_GetErrorLineNumber(self->itself)); - if (strcmp(name, "ErrorColumnNumber") == 0) - return PyInt_FromLong((long) + if (PyUnicode_CompareWithASCIIString(nameobj, "ErrorColumnNumber") == 0) + return PyLong_FromLong((long) XML_GetErrorColumnNumber(self->itself)); - if (strcmp(name, "ErrorByteIndex") == 0) - return PyInt_FromLong((long) + if (PyUnicode_CompareWithASCIIString(nameobj, "ErrorByteIndex") == 0) + return PyLong_FromLong((long) XML_GetErrorByteIndex(self->itself)); } if (name[0] == 'C') { - if (strcmp(name, "CurrentLineNumber") == 0) - return PyInt_FromLong((long) + if (PyUnicode_CompareWithASCIIString(nameobj, "CurrentLineNumber") == 0) + return PyLong_FromLong((long) XML_GetCurrentLineNumber(self->itself)); - if (strcmp(name, "CurrentColumnNumber") == 0) - return PyInt_FromLong((long) + if (PyUnicode_CompareWithASCIIString(nameobj, "CurrentColumnNumber") == 0) + return PyLong_FromLong((long) XML_GetCurrentColumnNumber(self->itself)); - if (strcmp(name, "CurrentByteIndex") == 0) - return PyInt_FromLong((long) + if (PyUnicode_CompareWithASCIIString(nameobj, "CurrentByteIndex") == 0) + return PyLong_FromLong((long) XML_GetCurrentByteIndex(self->itself)); } if (name[0] == 'b') { - if (strcmp(name, "buffer_size") == 0) - return PyInt_FromLong((long) self->buffer_size); - if (strcmp(name, "buffer_text") == 0) + if (PyUnicode_CompareWithASCIIString(nameobj, "buffer_size") == 0) + return PyLong_FromLong((long) self->buffer_size); + if (PyUnicode_CompareWithASCIIString(nameobj, "buffer_text") == 0) return get_pybool(self->buffer != NULL); - if (strcmp(name, "buffer_used") == 0) - return PyInt_FromLong((long) self->buffer_used); + if (PyUnicode_CompareWithASCIIString(nameobj, "buffer_used") == 0) + return PyLong_FromLong((long) self->buffer_used); } - if (strcmp(name, "namespace_prefixes") == 0) + if (PyUnicode_CompareWithASCIIString(nameobj, "namespace_prefixes") == 0) return get_pybool(self->ns_prefixes); - if (strcmp(name, "ordered_attributes") == 0) + if (PyUnicode_CompareWithASCIIString(nameobj, "ordered_attributes") == 0) return get_pybool(self->ordered_attributes); - if (strcmp(name, "returns_unicode") == 0) - return get_pybool((long) self->returns_unicode); - if (strcmp(name, "specified_attributes") == 0) + if (PyUnicode_CompareWithASCIIString(nameobj, "specified_attributes") == 0) return get_pybool((long) self->specified_attributes); - if (strcmp(name, "intern") == 0) { + if (PyUnicode_CompareWithASCIIString(nameobj, "intern") == 0) { if (self->intern == NULL) { Py_INCREF(Py_None); return Py_None; @@ -1465,50 +1304,58 @@ xmlparse_getattr(xmlparseobject *self, char *name) return self->intern; } } + generic: + return PyObject_GenericGetAttr((PyObject*)self, nameobj); +} +static PyObject * +xmlparse_dir(PyObject *self, PyObject* noargs) +{ #define APPEND(list, str) \ do { \ - PyObject *o = PyString_FromString(str); \ + PyObject *o = PyUnicode_FromString(str); \ if (o != NULL) \ PyList_Append(list, o); \ Py_XDECREF(o); \ } while (0) - if (strcmp(name, "__members__") == 0) { - int i; - PyObject *rc = PyList_New(0); - if (!rc) - return NULL; - for (i = 0; handler_info[i].name != NULL; i++) { - PyObject *o = get_handler_name(&handler_info[i]); - if (o != NULL) - PyList_Append(rc, o); - Py_XDECREF(o); - } - APPEND(rc, "ErrorCode"); - APPEND(rc, "ErrorLineNumber"); - APPEND(rc, "ErrorColumnNumber"); - APPEND(rc, "ErrorByteIndex"); - APPEND(rc, "CurrentLineNumber"); - APPEND(rc, "CurrentColumnNumber"); - APPEND(rc, "CurrentByteIndex"); - APPEND(rc, "buffer_size"); - APPEND(rc, "buffer_text"); - APPEND(rc, "buffer_used"); - APPEND(rc, "namespace_prefixes"); - APPEND(rc, "ordered_attributes"); - APPEND(rc, "returns_unicode"); - APPEND(rc, "specified_attributes"); - APPEND(rc, "intern"); + int i; + PyObject *rc = PyList_New(0); + if (!rc) + return NULL; + for (i = 0; handler_info[i].name != NULL; i++) { + PyObject *o = get_handler_name(&handler_info[i]); + if (o != NULL) + PyList_Append(rc, o); + Py_XDECREF(o); + } + APPEND(rc, "ErrorCode"); + APPEND(rc, "ErrorLineNumber"); + APPEND(rc, "ErrorColumnNumber"); + APPEND(rc, "ErrorByteIndex"); + APPEND(rc, "CurrentLineNumber"); + APPEND(rc, "CurrentColumnNumber"); + APPEND(rc, "CurrentByteIndex"); + APPEND(rc, "buffer_size"); + APPEND(rc, "buffer_text"); + APPEND(rc, "buffer_used"); + APPEND(rc, "namespace_prefixes"); + APPEND(rc, "ordered_attributes"); + APPEND(rc, "specified_attributes"); + APPEND(rc, "intern"); #undef APPEND - return rc; + + if (PyErr_Occurred()) { + Py_DECREF(rc); + rc = NULL; } - return Py_FindMethod(xmlparse_methods, (PyObject *)self, name); + + return rc; } static int -sethandler(xmlparseobject *self, const char *name, PyObject* v) +sethandler(xmlparseobject *self, PyObject *name, PyObject* v) { int handlernum = handlername2int(name); if (handlernum >= 0) { @@ -1544,14 +1391,15 @@ sethandler(xmlparseobject *self, const char *name, PyObject* v) } static int -xmlparse_setattr(xmlparseobject *self, char *name, PyObject *v) +xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v) { /* Set attribute 'name' to value 'v'. v==NULL means delete */ if (v == NULL) { PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute"); return -1; } - if (strcmp(name, "buffer_text") == 0) { + assert(PyUnicode_Check(name)); + if (PyUnicode_CompareWithASCIIString(name, "buffer_text") == 0) { int b = PyObject_IsTrue(v); if (b < 0) return -1; @@ -1573,7 +1421,7 @@ xmlparse_setattr(xmlparseobject *self, char *name, PyObject *v) } return 0; } - if (strcmp(name, "namespace_prefixes") == 0) { + if (PyUnicode_CompareWithASCIIString(name, "namespace_prefixes") == 0) { int b = PyObject_IsTrue(v); if (b < 0) return -1; @@ -1581,28 +1429,14 @@ xmlparse_setattr(xmlparseobject *self, char *name, PyObject *v) XML_SetReturnNSTriplet(self->itself, self->ns_prefixes); return 0; } - if (strcmp(name, "ordered_attributes") == 0) { + if (PyUnicode_CompareWithASCIIString(name, "ordered_attributes") == 0) { int b = PyObject_IsTrue(v); if (b < 0) return -1; self->ordered_attributes = b; return 0; } - if (strcmp(name, "returns_unicode") == 0) { - int b = PyObject_IsTrue(v); - if (b < 0) - return -1; -#ifndef Py_USING_UNICODE - if (b) { - PyErr_SetString(PyExc_ValueError, - "Unicode support not available"); - return -1; - } -#endif - self->returns_unicode = b; - return 0; - } - if (strcmp(name, "specified_attributes") == 0) { + if (PyUnicode_CompareWithASCIIString(name, "specified_attributes") == 0) { int b = PyObject_IsTrue(v); if (b < 0) return -1; @@ -1610,14 +1444,14 @@ xmlparse_setattr(xmlparseobject *self, char *name, PyObject *v) return 0; } - if (strcmp(name, "buffer_size") == 0) { + if (PyUnicode_CompareWithASCIIString(name, "buffer_size") == 0) { long new_buffer_size; - if (!PyInt_Check(v)) { + if (!PyLong_Check(v)) { PyErr_SetString(PyExc_TypeError, "buffer_size must be an integer"); return -1; } - new_buffer_size=PyInt_AS_LONG(v); + new_buffer_size=PyLong_AS_LONG(v); /* trivial case -- no change */ if (new_buffer_size == self->buffer_size) { return 0; @@ -1653,7 +1487,7 @@ xmlparse_setattr(xmlparseobject *self, char *name, PyObject *v) return 0; } - if (strcmp(name, "CharacterDataHandler") == 0) { + if (PyUnicode_CompareWithASCIIString(name, "CharacterDataHandler") == 0) { /* If we're changing the character data handler, flush all * cached data with the old handler. Not sure there's a * "right" thing to do, though, but this probably won't @@ -1665,11 +1499,10 @@ xmlparse_setattr(xmlparseobject *self, char *name, PyObject *v) if (sethandler(self, name, v)) { return 0; } - PyErr_SetString(PyExc_AttributeError, name); + PyErr_SetObject(PyExc_AttributeError, name); return -1; } -#ifdef WITH_CYCLE_GC static int xmlparse_traverse(xmlparseobject *op, visitproc visit, void *arg) { @@ -1686,21 +1519,20 @@ xmlparse_clear(xmlparseobject *op) Py_CLEAR(op->intern); return 0; } -#endif PyDoc_STRVAR(Xmlparsetype__doc__, "XML parser"); static PyTypeObject Xmlparsetype = { PyVarObject_HEAD_INIT(NULL, 0) "pyexpat.xmlparser", /*tp_name*/ - sizeof(xmlparseobject) + PyGC_HEAD_SIZE,/*tp_basicsize*/ + sizeof(xmlparseobject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)xmlparse_dealloc, /*tp_dealloc*/ (printfunc)0, /*tp_print*/ - (getattrfunc)xmlparse_getattr, /*tp_getattr*/ - (setattrfunc)xmlparse_setattr, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_reserved*/ (reprfunc)0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -1708,21 +1540,18 @@ static PyTypeObject Xmlparsetype = { (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)0, /*tp_str*/ - 0, /* tp_getattro */ - 0, /* tp_setattro */ + (getattrofunc)xmlparse_getattro, /* tp_getattro */ + (setattrofunc)xmlparse_setattro, /* tp_setattro */ 0, /* tp_as_buffer */ -#ifdef Py_TPFLAGS_HAVE_GC Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ -#else - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/ -#endif Xmlparsetype__doc__, /* tp_doc - Documentation string */ -#ifdef WITH_CYCLE_GC (traverseproc)xmlparse_traverse, /* tp_traverse */ - (inquiry)xmlparse_clear /* tp_clear */ -#else - 0, 0 -#endif + (inquiry)xmlparse_clear, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + xmlparse_methods, /* tp_methods */ }; /* End of code for xmlparser objects */ @@ -1812,7 +1641,7 @@ PyDoc_STRVAR(pyexpat_module_documentation, #endif #ifndef MODULE_INITFUNC -#define MODULE_INITFUNC initpyexpat +#define MODULE_INITFUNC PyInit_pyexpat #endif #ifndef PyMODINIT_FUNC @@ -1825,39 +1654,55 @@ PyDoc_STRVAR(pyexpat_module_documentation, PyMODINIT_FUNC MODULE_INITFUNC(void); /* avoid compiler warnings */ +static struct PyModuleDef pyexpatmodule = { + PyModuleDef_HEAD_INIT, + MODULE_NAME, + pyexpat_module_documentation, + -1, + pyexpat_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC MODULE_INITFUNC(void) { PyObject *m, *d; - PyObject *errmod_name = PyString_FromString(MODULE_NAME ".errors"); + PyObject *errmod_name = PyUnicode_FromString(MODULE_NAME ".errors"); PyObject *errors_module; PyObject *modelmod_name; PyObject *model_module; - PyObject *sys_modules; PyObject *version; + PyObject *sys_modules; + PyObject *tmpnum, *tmpstr; + PyObject *codes_dict; + PyObject *rev_codes_dict; + int res; static struct PyExpat_CAPI capi; - PyObject* capi_object; + PyObject *capi_object; if (errmod_name == NULL) - return; - modelmod_name = PyString_FromString(MODULE_NAME ".model"); + return NULL; + modelmod_name = PyUnicode_FromString(MODULE_NAME ".model"); if (modelmod_name == NULL) - return; + return NULL; - Py_TYPE(&Xmlparsetype) = &PyType_Type; + if (PyType_Ready(&Xmlparsetype) < 0) + return NULL; /* Create the module and add the functions */ - m = Py_InitModule3(MODULE_NAME, pyexpat_methods, - pyexpat_module_documentation); + m = PyModule_Create(&pyexpatmodule); if (m == NULL) - return; + return NULL; /* Add some symbolic constants to the module */ if (ErrorObject == NULL) { ErrorObject = PyErr_NewException("xml.parsers.expat.ExpatError", NULL, NULL); if (ErrorObject == NULL) - return; + return NULL; } Py_INCREF(ErrorObject); PyModule_AddObject(m, "error", ErrorObject); @@ -1866,9 +1711,9 @@ MODULE_INITFUNC(void) Py_INCREF(&Xmlparsetype); PyModule_AddObject(m, "XMLParserType", (PyObject *) &Xmlparsetype); - version = PyString_FromString(PY_VERSION); + version = PyUnicode_FromString(PY_VERSION); if (!version) - return; + return NULL; PyModule_AddObject(m, "__version__", version); PyModule_AddStringConstant(m, "EXPAT_VERSION", (char *) XML_ExpatVersion()); @@ -1878,9 +1723,7 @@ MODULE_INITFUNC(void) Py_BuildValue("(iii)", info.major, info.minor, info.micro)); } -#ifdef Py_USING_UNICODE init_template_buffer(); -#endif /* XXX When Expat supports some way of figuring out how it was compiled, this should check and set native_encoding appropriately. @@ -1911,7 +1754,7 @@ MODULE_INITFUNC(void) Py_DECREF(modelmod_name); if (errors_module == NULL || model_module == NULL) /* Don't core dump later! */ - return; + return NULL; #if XML_COMBINED_VERSION > 19505 { @@ -1944,9 +1787,29 @@ MODULE_INITFUNC(void) } #endif + codes_dict = PyDict_New(); + rev_codes_dict = PyDict_New(); + if (codes_dict == NULL || rev_codes_dict == NULL) { + Py_XDECREF(codes_dict); + Py_XDECREF(rev_codes_dict); + return NULL; + } + #define MYCONST(name) \ - PyModule_AddStringConstant(errors_module, #name, \ - (char*)XML_ErrorString(name)) + if (PyModule_AddStringConstant(errors_module, #name, \ + (char *)XML_ErrorString(name)) < 0) \ + return NULL; \ + tmpnum = PyLong_FromLong(name); \ + if (tmpnum == NULL) return NULL; \ + res = PyDict_SetItemString(codes_dict, \ + XML_ErrorString(name), tmpnum); \ + if (res < 0) return NULL; \ + tmpstr = PyUnicode_FromString(XML_ErrorString(name)); \ + if (tmpstr == NULL) return NULL; \ + res = PyDict_SetItem(rev_codes_dict, tmpnum, tmpstr); \ + Py_DECREF(tmpstr); \ + Py_DECREF(tmpnum); \ + if (res < 0) return NULL; \ MYCONST(XML_ERROR_NO_MEMORY); MYCONST(XML_ERROR_SYNTAX); @@ -1988,8 +1851,15 @@ MODULE_INITFUNC(void) MYCONST(XML_ERROR_FINISHED); MYCONST(XML_ERROR_SUSPEND_PE); - PyModule_AddStringConstant(errors_module, "__doc__", - "Constants used to describe error conditions."); + if (PyModule_AddStringConstant(errors_module, "__doc__", + "Constants used to describe " + "error conditions.") < 0) + return NULL; + + if (PyModule_AddObject(errors_module, "codes", codes_dict) < 0) + return NULL; + if (PyModule_AddObject(errors_module, "messages", rev_codes_dict) < 0) + return NULL; #undef MYCONST @@ -2042,6 +1912,7 @@ MODULE_INITFUNC(void) capi_object = PyCapsule_New(&capi, PyExpat_CAPSULE_NAME, NULL); if (capi_object) PyModule_AddObject(m, "expat_CAPI", capi_object); + return m; } static void diff --git a/Modules/python.c b/Modules/python.c index 2739b8b1109..2be69f1f545 100644 --- a/Modules/python.c +++ b/Modules/python.c @@ -1,24 +1,65 @@ /* Minimal main program -- everything is loaded from the library */ #include "Python.h" +#include <locale.h> #ifdef __FreeBSD__ #include <floatingpoint.h> #endif +#ifdef MS_WINDOWS +int +wmain(int argc, wchar_t **argv) +{ + return Py_Main(argc, argv); +} +#else + int main(int argc, char **argv) { - /* 754 requires that FP exceptions run in "no stop" mode by default, - * and until C vendors implement C99's ways to control FP exceptions, - * Python requires non-stop mode. Alas, some platforms enable FP - * exceptions by default. Here we disable them. - */ + wchar_t **argv_copy = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*(argc+1)); + /* We need a second copies, as Python might modify the first one. */ + wchar_t **argv_copy2 = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*(argc+1)); + int i, res; + char *oldloc; + /* 754 requires that FP exceptions run in "no stop" mode by default, + * and until C vendors implement C99's ways to control FP exceptions, + * Python requires non-stop mode. Alas, some platforms enable FP + * exceptions by default. Here we disable them. + */ #ifdef __FreeBSD__ - fp_except_t m; + fp_except_t m; - m = fpgetmask(); - fpsetmask(m & ~FP_X_OFL); + m = fpgetmask(); + fpsetmask(m & ~FP_X_OFL); #endif - return Py_Main(argc, argv); + if (!argv_copy || !argv_copy2) { + fprintf(stderr, "out of memory\n"); + return 1; + } + oldloc = strdup(setlocale(LC_ALL, NULL)); + setlocale(LC_ALL, ""); + for (i = 0; i < argc; i++) { + argv_copy[i] = _Py_char2wchar(argv[i], NULL); + if (!argv_copy[i]) { + fprintf(stderr, "Fatal Python error: " + "unable to decode the command line argument #%i\n", + i + 1); + return 1; + } + argv_copy2[i] = argv_copy[i]; + } + argv_copy2[argc] = argv_copy[argc] = NULL; + + setlocale(LC_ALL, oldloc); + free(oldloc); + res = Py_Main(argc, argv_copy); + for (i = 0; i < argc; i++) { + PyMem_Free(argv_copy2[i]); + } + PyMem_Free(argv_copy); + PyMem_Free(argv_copy2); + return res; } +#endif diff --git a/Modules/readline.c b/Modules/readline.c index b5e258db67e..4d54dade5d3 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -64,10 +64,11 @@ static int using_libedit_emulation = 0; static const char libedit_version_tag[] = "EditLine wrapper"; #endif /* __APPLE__ */ +#ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK static void on_completion_display_matches_hook(char **matches, int num_matches, int max_length); - +#endif /* Exported function to send one line to readline's init file parser */ @@ -98,10 +99,16 @@ Parse and execute single line of a readline init file."); static PyObject * read_init_file(PyObject *self, PyObject *args) { - char *s = NULL; - if (!PyArg_ParseTuple(args, "|z:read_init_file", &s)) + PyObject *filename_obj = Py_None, *filename_bytes; + if (!PyArg_ParseTuple(args, "|O:read_init_file", &filename_obj)) return NULL; - errno = rl_read_init_file(s); + if (filename_obj != Py_None) { + if (!PyUnicode_FSConverter(filename_obj, &filename_bytes)) + return NULL; + errno = rl_read_init_file(PyBytes_AsString(filename_bytes)); + Py_DECREF(filename_bytes); + } else + errno = rl_read_init_file(NULL); if (errno) return PyErr_SetFromErrno(PyExc_IOError); Py_RETURN_NONE; @@ -118,10 +125,16 @@ The default filename is the last filename used."); static PyObject * read_history_file(PyObject *self, PyObject *args) { - char *s = NULL; - if (!PyArg_ParseTuple(args, "|z:read_history_file", &s)) + PyObject *filename_obj = Py_None, *filename_bytes; + if (!PyArg_ParseTuple(args, "|O:read_history_file", &filename_obj)) return NULL; - errno = read_history(s); + if (filename_obj != Py_None) { + if (!PyUnicode_FSConverter(filename_obj, &filename_bytes)) + return NULL; + errno = read_history(PyBytes_AsString(filename_bytes)); + Py_DECREF(filename_bytes); + } else + errno = read_history(NULL); if (errno) return PyErr_SetFromErrno(PyExc_IOError); Py_RETURN_NONE; @@ -139,12 +152,24 @@ The default filename is ~/.history."); static PyObject * write_history_file(PyObject *self, PyObject *args) { - char *s = NULL; - if (!PyArg_ParseTuple(args, "|z:write_history_file", &s)) + PyObject *filename_obj = Py_None, *filename_bytes; + char *filename; + int err; + if (!PyArg_ParseTuple(args, "|O:write_history_file", &filename_obj)) return NULL; - errno = write_history(s); - if (!errno && _history_length >= 0) - history_truncate_file(s, _history_length); + if (filename_obj != Py_None) { + if (!PyUnicode_FSConverter(filename_obj, &filename_bytes)) + return NULL; + filename = PyBytes_AsString(filename_bytes); + } else { + filename_bytes = NULL; + filename = NULL; + } + errno = err = write_history(filename); + if (!err && _history_length >= 0) + history_truncate_file(filename, _history_length); + Py_XDECREF(filename_bytes); + errno = err; if (errno) return PyErr_SetFromErrno(PyExc_IOError); Py_RETURN_NONE; @@ -180,7 +205,7 @@ history truncation."); static PyObject* get_history_length(PyObject *self, PyObject *noarg) { - return PyInt_FromLong(_history_length); + return PyLong_FromLong(_history_length); } PyDoc_STRVAR(get_history_length_doc, @@ -301,7 +326,7 @@ static PyObject *endidx = NULL; static PyObject * get_completion_type(PyObject *self, PyObject *noarg) { - return PyInt_FromLong(rl_completion_type); + return PyLong_FromLong(rl_completion_type); } PyDoc_STRVAR(doc_get_completion_type, @@ -473,7 +498,7 @@ add a line to the history buffer"); static PyObject * get_completer_delims(PyObject *self, PyObject *noarg) { - return PyString_FromString(rl_completer_word_break_characters); + return PyUnicode_FromString(rl_completer_word_break_characters); } PyDoc_STRVAR(doc_get_completer_delims, @@ -563,7 +588,7 @@ get_history_item(PyObject *self, PyObject *args) } #endif /* __APPLE__ */ if ((hist_ent = history_get(idx))) - return PyString_FromString(hist_ent->line); + return PyUnicode_FromString(hist_ent->line); else { Py_RETURN_NONE; } @@ -579,7 +604,7 @@ return the current contents of history item at index."); static PyObject * get_current_history_length(PyObject *self, PyObject *noarg) { - return PyInt_FromLong((long)_py_get_history_length()); + return PyLong_FromLong((long)_py_get_history_length()); } PyDoc_STRVAR(doc_get_current_history_length, @@ -592,7 +617,7 @@ return the current (not the maximum) length of history."); static PyObject * get_line_buffer(PyObject *self, PyObject *noarg) { - return PyString_FromString(rl_line_buffer); + return PyUnicode_FromString(rl_line_buffer); } PyDoc_STRVAR(doc_get_line_buffer, @@ -717,7 +742,7 @@ on_hook(PyObject *func) if (r == Py_None) result = 0; else { - result = PyInt_AsLong(r); + result = PyLong_AsLong(r); if (result == -1 && PyErr_Occurred()) goto error; } @@ -752,6 +777,7 @@ on_pre_input_hook(void) /* C function to call the Python completion_display_matches */ +#ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK static void on_completion_display_matches_hook(char **matches, int num_matches, int max_length) @@ -765,20 +791,19 @@ on_completion_display_matches_hook(char **matches, if (m == NULL) goto error; for (i = 0; i < num_matches; i++) { - s = PyString_FromString(matches[i+1]); + s = PyUnicode_FromString(matches[i+1]); if (s == NULL) goto error; if (PyList_SetItem(m, i, s) == -1) goto error; } - r = PyObject_CallFunction(completion_display_matches_hook, "sOi", matches[0], m, max_length); Py_DECREF(m); m=NULL; if (r == NULL || - (r != Py_None && PyInt_AsLong(r) == -1 && PyErr_Occurred())) { + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } Py_XDECREF(r); r=NULL; @@ -794,6 +819,7 @@ on_completion_display_matches_hook(char **matches, #endif } +#endif /* C function to call the Python completer. */ @@ -814,7 +840,7 @@ on_completion(const char *text, int state) result = NULL; } else { - char *s = PyString_AsString(r); + char *s = _PyUnicode_AsString(r); if (s == NULL) goto error; result = strdup(s); @@ -848,8 +874,8 @@ flex_complete(char *text, int start, int end) #endif Py_XDECREF(begidx); Py_XDECREF(endidx); - begidx = PyInt_FromLong((long) start); - endidx = PyInt_FromLong((long) end); + begidx = PyLong_FromLong((long) start); + endidx = PyLong_FromLong((long) end); return completion_matches(text, *on_completion); } @@ -897,8 +923,8 @@ setup_readline(void) strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); /* All nonalphanums except '.' */ - begidx = PyInt_FromLong(0L); - endidx = PyInt_FromLong(0L); + begidx = PyLong_FromLong(0L); + endidx = PyLong_FromLong(0L); /* Initialize (allows .inputrc to override) * * XXX: A bug in the readline-2.2 library causes a memory leak @@ -946,7 +972,7 @@ readline_until_enter_or_signal(char *prompt, int *signal) completed_input_string = not_done_reading; while (completed_input_string == not_done_reading) { - int has_input = 0; + int has_input = 0, err = 0; while (!has_input) { struct timeval timeout = {0, 100000}; /* 0.1 seconds */ @@ -960,13 +986,14 @@ readline_until_enter_or_signal(char *prompt, int *signal) /* select resets selectset if no input was available */ has_input = select(fileno(rl_instream) + 1, &selectset, NULL, NULL, timeoutp); + err = errno; if(PyOS_InputHook) PyOS_InputHook(); } - if(has_input > 0) { + if (has_input > 0) { rl_callback_read_char(); } - else if (errno == EINTR) { + else if (err == EINTR) { int s; #ifdef WITH_THREAD PyEval_RestoreThread(_PyOS_ReadlineTState); @@ -1081,10 +1108,10 @@ call_readline(FILE *sys_stdin, FILE *sys_stdout, char *prompt) * Libedit's emulation uses 0-based indexes, * the real readline uses 1-based indexes. */ - line = history_get(length - 1)->line; + line = (const char *)history_get(length - 1)->line; } else #endif /* __APPLE__ */ - line = history_get(length)->line; + line = (const char *)history_get(length)->line; else line = ""; if (strcmp(p, line)) @@ -1115,8 +1142,21 @@ PyDoc_STRVAR(doc_module_le, "Importing this module enables command line editing using libedit readline."); #endif /* __APPLE__ */ +static struct PyModuleDef readlinemodule = { + PyModuleDef_HEAD_INIT, + "readline", + doc_module, + -1, + readline_methods, + NULL, + NULL, + NULL, + NULL +}; + + PyMODINIT_FUNC -initreadline(void) +PyInit_readline(void) { PyObject *m; @@ -1126,19 +1166,18 @@ initreadline(void) } if (using_libedit_emulation) - m = Py_InitModule4("readline", readline_methods, doc_module_le, - (PyObject *)NULL, PYTHON_API_VERSION); - else + readlinemodule.m_doc = doc_module_le; #endif /* __APPLE__ */ - m = Py_InitModule4("readline", readline_methods, doc_module, - (PyObject *)NULL, PYTHON_API_VERSION); + m = PyModule_Create(&readlinemodule); + if (m == NULL) - return; + return NULL; PyOS_ReadlineFunctionPointer = call_readline; setup_readline(); + return m; } diff --git a/Modules/resource.c b/Modules/resource.c index 9993b93c9e7..1875e483f9b 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -1,6 +1,5 @@ #include "Python.h" -#include "structseq.h" #include <sys/resource.h> #include <sys/time.h> #include <string.h> @@ -86,20 +85,20 @@ resource_getrusage(PyObject *self, PyObject *args) PyFloat_FromDouble(doubletime(ru.ru_utime))); PyStructSequence_SET_ITEM(result, 1, PyFloat_FromDouble(doubletime(ru.ru_stime))); - PyStructSequence_SET_ITEM(result, 2, PyInt_FromLong(ru.ru_maxrss)); - PyStructSequence_SET_ITEM(result, 3, PyInt_FromLong(ru.ru_ixrss)); - PyStructSequence_SET_ITEM(result, 4, PyInt_FromLong(ru.ru_idrss)); - PyStructSequence_SET_ITEM(result, 5, PyInt_FromLong(ru.ru_isrss)); - PyStructSequence_SET_ITEM(result, 6, PyInt_FromLong(ru.ru_minflt)); - PyStructSequence_SET_ITEM(result, 7, PyInt_FromLong(ru.ru_majflt)); - PyStructSequence_SET_ITEM(result, 8, PyInt_FromLong(ru.ru_nswap)); - PyStructSequence_SET_ITEM(result, 9, PyInt_FromLong(ru.ru_inblock)); - PyStructSequence_SET_ITEM(result, 10, PyInt_FromLong(ru.ru_oublock)); - PyStructSequence_SET_ITEM(result, 11, PyInt_FromLong(ru.ru_msgsnd)); - PyStructSequence_SET_ITEM(result, 12, PyInt_FromLong(ru.ru_msgrcv)); - PyStructSequence_SET_ITEM(result, 13, PyInt_FromLong(ru.ru_nsignals)); - PyStructSequence_SET_ITEM(result, 14, PyInt_FromLong(ru.ru_nvcsw)); - PyStructSequence_SET_ITEM(result, 15, PyInt_FromLong(ru.ru_nivcsw)); + PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(ru.ru_maxrss)); + PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(ru.ru_ixrss)); + PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(ru.ru_idrss)); + PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong(ru.ru_isrss)); + PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(ru.ru_minflt)); + PyStructSequence_SET_ITEM(result, 7, PyLong_FromLong(ru.ru_majflt)); + PyStructSequence_SET_ITEM(result, 8, PyLong_FromLong(ru.ru_nswap)); + PyStructSequence_SET_ITEM(result, 9, PyLong_FromLong(ru.ru_inblock)); + PyStructSequence_SET_ITEM(result, 10, PyLong_FromLong(ru.ru_oublock)); + PyStructSequence_SET_ITEM(result, 11, PyLong_FromLong(ru.ru_msgsnd)); + PyStructSequence_SET_ITEM(result, 12, PyLong_FromLong(ru.ru_msgrcv)); + PyStructSequence_SET_ITEM(result, 13, PyLong_FromLong(ru.ru_nsignals)); + PyStructSequence_SET_ITEM(result, 14, PyLong_FromLong(ru.ru_nvcsw)); + PyStructSequence_SET_ITEM(result, 15, PyLong_FromLong(ru.ru_nivcsw)); if (PyErr_Occurred()) { Py_DECREF(result); @@ -158,20 +157,18 @@ resource_setrlimit(PyObject *self, PyObject *args) } #if !defined(HAVE_LARGEFILE_SUPPORT) - rl.rlim_cur = PyInt_AsLong(curobj); + rl.rlim_cur = PyLong_AsLong(curobj); if (rl.rlim_cur == (rlim_t)-1 && PyErr_Occurred()) return NULL; - rl.rlim_max = PyInt_AsLong(maxobj); + rl.rlim_max = PyLong_AsLong(maxobj); if (rl.rlim_max == (rlim_t)-1 && PyErr_Occurred()) return NULL; #else /* The limits are probably bigger than a long */ - rl.rlim_cur = PyLong_Check(curobj) ? - PyLong_AsLongLong(curobj) : PyInt_AsLong(curobj); + rl.rlim_cur = PyLong_AsLongLong(curobj); if (rl.rlim_cur == (rlim_t)-1 && PyErr_Occurred()) return NULL; - rl.rlim_max = PyLong_Check(maxobj) ? - PyLong_AsLongLong(maxobj) : PyInt_AsLong(maxobj); + rl.rlim_max = PyLong_AsLongLong(maxobj); if (rl.rlim_max == (rlim_t)-1 && PyErr_Occurred()) return NULL; #endif @@ -225,15 +222,28 @@ resource_methods[] = { /* Module initialization */ + +static struct PyModuleDef resourcemodule = { + PyModuleDef_HEAD_INIT, + "resource", + NULL, + -1, + resource_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initresource(void) +PyInit_resource(void) { PyObject *m, *v; /* Create the module and add the functions */ - m = Py_InitModule("resource", resource_methods); + m = PyModule_Create(&resourcemodule); if (m == NULL) - return; + return NULL; /* Add some symbolic constants to the module */ if (ResourceError == NULL) { @@ -314,16 +324,21 @@ initresource(void) PyModule_AddIntConstant(m, "RUSAGE_BOTH", RUSAGE_BOTH); #endif +#ifdef RUSAGE_THREAD + PyModule_AddIntConstant(m, "RUSAGE_THREAD", RUSAGE_THREAD); +#endif + #if defined(HAVE_LONG_LONG) if (sizeof(RLIM_INFINITY) > sizeof(long)) { v = PyLong_FromLongLong((PY_LONG_LONG) RLIM_INFINITY); } else #endif { - v = PyInt_FromLong((long) RLIM_INFINITY); + v = PyLong_FromLong((long) RLIM_INFINITY); } if (v) { PyModule_AddObject(m, "RLIM_INFINITY", v); } initialized = 1; + return m; } diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index b95b2cedc17..0736215972d 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -2,8 +2,6 @@ Under Unix, the file descriptors are small integers. Under Win32, select only exists for sockets, and sockets may have any value except INVALID_SOCKET. - Under BeOS, we suffer the same dichotomy as Win32; sockets can be anything - >= 0. */ #include "Python.h" @@ -47,12 +45,11 @@ extern void bzero(void *, int); #endif #ifdef MS_WINDOWS -# include <winsock2.h> +# define WIN32_LEAN_AND_MEAN +# include <winsock.h> #else # define SOCKET int -# ifdef __BEOS__ -# include <net/socket.h> -# elif defined(__VMS) +# if defined(__VMS) # include <socket.h> # endif #endif @@ -84,9 +81,9 @@ reap_obj(pylist fd2obj[FD_SETSIZE + 1]) static int seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1]) { - int i; int max = -1; int index = 0; + Py_ssize_t i; PyObject* fast_seq = NULL; PyObject* o = NULL; @@ -102,7 +99,7 @@ seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1]) /* any intervening fileno() calls could decr this refcnt */ if (!(o = PySequence_Fast_GET_ITEM(fast_seq, i))) - return -1; + goto finally; Py_INCREF(o); v = PyObject_AsFileDescriptor( o ); @@ -343,8 +340,8 @@ update_ufd_array(pollObject *self) i = pos = 0; while (PyDict_Next(self->dict, &pos, &key, &value)) { - self->ufds[i].fd = PyInt_AsLong(key); - self->ufds[i].events = (short)PyInt_AsLong(value); + self->ufds[i].fd = PyLong_AsLong(key); + self->ufds[i].events = (short)PyLong_AsLong(value); i++; } self->ufd_uptodate = 1; @@ -374,10 +371,10 @@ poll_register(pollObject *self, PyObject *args) /* Add entry to the internal dictionary: the key is the file descriptor, and the value is the event mask. */ - key = PyInt_FromLong(fd); + key = PyLong_FromLong(fd); if (key == NULL) return NULL; - value = PyInt_FromLong(events); + value = PyLong_FromLong(events); if (value == NULL) { Py_DECREF(key); return NULL; @@ -416,15 +413,16 @@ poll_modify(pollObject *self, PyObject *args) if (fd == -1) return NULL; /* Modify registered fd */ - key = PyInt_FromLong(fd); + key = PyLong_FromLong(fd); if (key == NULL) return NULL; if (PyDict_GetItem(self->dict, key) == NULL) { errno = ENOENT; PyErr_SetFromErrno(PyExc_IOError); + Py_DECREF(key); return NULL; } - value = PyInt_FromLong(events); + value = PyLong_FromLong(events); if (value == NULL) { Py_DECREF(key); return NULL; @@ -457,7 +455,7 @@ poll_unregister(pollObject *self, PyObject *o) return NULL; /* Check whether the fd is already in the array */ - key = PyInt_FromLong(fd); + key = PyLong_FromLong(fd); if (key == NULL) return NULL; @@ -500,10 +498,10 @@ poll_poll(pollObject *self, PyObject *args) return NULL; } else { - tout = PyNumber_Int(tout); + tout = PyNumber_Long(tout); if (!tout) return NULL; - timeout = PyInt_AsLong(tout); + timeout = PyLong_AsLong(tout); Py_DECREF(tout); if (timeout == -1 && PyErr_Occurred()) return NULL; @@ -541,7 +539,7 @@ poll_poll(pollObject *self, PyObject *args) value = PyTuple_New(2); if (value == NULL) goto error; - num = PyInt_FromLong(self->ufds[i].fd); + num = PyLong_FromLong(self->ufds[i].fd); if (num == NULL) { Py_DECREF(value); goto error; @@ -552,7 +550,7 @@ poll_poll(pollObject *self, PyObject *args) is a 16-bit short, and IBM assigned POLLNVAL to be 0x8000, so the conversion to int results in a negative number. See SF bug #923315. */ - num = PyInt_FromLong(self->ufds[i].revents & 0xffff); + num = PyLong_FromLong(self->ufds[i].revents & 0xffff); if (num == NULL) { Py_DECREF(value); goto error; @@ -612,12 +610,6 @@ poll_dealloc(pollObject *self) PyObject_Del(self); } -static PyObject * -poll_getattr(pollObject *self, char *name) -{ - return Py_FindMethod(poll_methods, (PyObject *)self, name); -} - static PyTypeObject poll_Type = { /* The ob_type field must be initialized in the module init function * to be portable to Windows without using C++. */ @@ -628,14 +620,28 @@ static PyTypeObject poll_Type = { /* methods */ (destructor)poll_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)poll_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 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*/ + poll_methods, /*tp_methods*/ }; PyDoc_STRVAR(poll_doc, @@ -811,7 +817,7 @@ pyepoll_fileno(pyEpoll_Object *self) { if (self->epfd < 0) return pyepoll_err_closed(); - return PyInt_FromLong(self->epfd); + return PyLong_FromLong(self->epfd); } PyDoc_STRVAR(pyepoll_fileno_doc, @@ -1073,7 +1079,7 @@ static PyTypeObject pyEpoll_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1227,7 +1233,7 @@ kqueue_event_repr(kqueue_event_Object *s) "data=0x%zd udata=%p>", (size_t)(s->e.ident), s->e.filter, s->e.flags, s->e.fflags, (Py_ssize_t)(s->e.data), s->e.udata); - return PyString_FromString(buf); + return PyUnicode_FromString(buf); } static int @@ -1317,7 +1323,7 @@ static PyTypeObject kqueue_event_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)kqueue_event_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1450,7 +1456,7 @@ kqueue_queue_fileno(kqueue_queue_Object *self) { if (self->kqfd < 0) return kqueue_queue_err_closed(); - return PyInt_FromLong(self->kqfd); + return PyLong_FromLong(self->kqfd); } PyDoc_STRVAR(kqueue_queue_fileno_doc, @@ -1671,7 +1677,7 @@ static PyTypeObject kqueue_queue_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -1745,13 +1751,26 @@ PyDoc_STRVAR(module_doc, *** IMPORTANT NOTICE ***\n\ On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors."); + +static struct PyModuleDef selectmodule = { + PyModuleDef_HEAD_INIT, + "select", + module_doc, + -1, + select_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initselect(void) +PyInit_select(void) { PyObject *m; - m = Py_InitModule3("select", select_methods, module_doc); + m = PyModule_Create(&selectmodule); if (m == NULL) - return; + return NULL; SelectError = PyErr_NewException("select.error", NULL, NULL); Py_INCREF(SelectError); @@ -1775,7 +1794,8 @@ initselect(void) #else { #endif - Py_TYPE(&poll_Type) = &PyType_Type; + if (PyType_Ready(&poll_Type) < 0) + return NULL; PyModule_AddIntConstant(m, "POLLIN", POLLIN); PyModule_AddIntConstant(m, "POLLPRI", POLLPRI); PyModule_AddIntConstant(m, "POLLOUT", POLLOUT); @@ -1804,7 +1824,7 @@ initselect(void) #ifdef HAVE_EPOLL Py_TYPE(&pyEpoll_Type) = &PyType_Type; if (PyType_Ready(&pyEpoll_Type) < 0) - return; + return NULL; Py_INCREF(&pyEpoll_Type); PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type); @@ -1831,14 +1851,14 @@ initselect(void) kqueue_event_Type.tp_new = PyType_GenericNew; Py_TYPE(&kqueue_event_Type) = &PyType_Type; if(PyType_Ready(&kqueue_event_Type) < 0) - return; + return NULL; Py_INCREF(&kqueue_event_Type); PyModule_AddObject(m, "kevent", (PyObject *)&kqueue_event_Type); Py_TYPE(&kqueue_queue_Type) = &PyType_Type; if(PyType_Ready(&kqueue_queue_Type) < 0) - return; + return NULL; Py_INCREF(&kqueue_queue_Type); PyModule_AddObject(m, "kqueue", (PyObject *)&kqueue_queue_Type); @@ -1899,4 +1919,5 @@ initselect(void) #endif #endif /* HAVE_KQUEUE */ + return m; } diff --git a/Modules/sgimodule.c b/Modules/sgimodule.c deleted file mode 100644 index 0d132481a03..00000000000 --- a/Modules/sgimodule.c +++ /dev/null @@ -1,55 +0,0 @@ - -/* SGI module -- random SGI-specific things */ - -#include "Python.h" - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -static PyObject * -sgi_nap(PyObject *self, PyObject *args) -{ - long ticks; - if (!PyArg_ParseTuple(args, "l:nap", &ticks)) - return NULL; - Py_BEGIN_ALLOW_THREADS - sginap(ticks); - Py_END_ALLOW_THREADS - Py_INCREF(Py_None); - return Py_None; -} - -extern char *_getpty(int *, int, mode_t, int); - -static PyObject * -sgi__getpty(PyObject *self, PyObject *args) -{ - int oflag; - int mode; - int nofork; - char *name; - int fildes; - if (!PyArg_ParseTuple(args, "iii:_getpty", &oflag, &mode, &nofork)) - return NULL; - errno = 0; - name = _getpty(&fildes, oflag, (mode_t)mode, nofork); - if (name == NULL) { - PyErr_SetFromErrno(PyExc_IOError); - return NULL; - } - return Py_BuildValue("(si)", name, fildes); -} - -static PyMethodDef sgi_methods[] = { - {"nap", sgi_nap, METH_VARARGS}, - {"_getpty", sgi__getpty, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - - -void -initsgi(void) -{ - Py_InitModule("sgi", sgi_methods); -} diff --git a/Modules/sha1module.c b/Modules/sha1module.c new file mode 100644 index 00000000000..b25bd44dd1f --- /dev/null +++ b/Modules/sha1module.c @@ -0,0 +1,560 @@ +/* SHA1 module */ + +/* This module provides an interface to the SHA1 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) + + Copyright (C) 2005-2007 Gregory P. Smith (greg@krypto.org) + Licensed to PSF under a Contributor Agreement. + +*/ + +/* SHA1 objects */ + +#include "Python.h" +#include "hashlib.h" + + +/* Some useful types */ + +#if SIZEOF_INT == 4 +typedef unsigned int SHA1_INT32; /* 32-bit integer */ +typedef PY_LONG_LONG SHA1_INT64; /* 64-bit integer */ +#else +/* not defined. compilation will die. */ +#endif + +/* The SHA1 block size and message digest sizes, in bytes */ + +#define SHA1_BLOCKSIZE 64 +#define SHA1_DIGESTSIZE 20 + +/* The structure for storing SHA1 info */ + +struct sha1_state { + SHA1_INT64 length; + SHA1_INT32 state[5], curlen; + unsigned char buf[SHA1_BLOCKSIZE]; +}; + +typedef struct { + PyObject_HEAD + + struct sha1_state hash_state; +} SHA1object; + + +/* ------------------------------------------------------------------------ + * + * This code for the SHA1 algorithm was noted as public domain. The + * original headers are pasted below. + * + * Several changes have been made to make it more compatible with the + * Python environment and desired interface. + * + */ + +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* rotate the hard way (platform optimizations could be done) */ +#define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) +#define ROLc(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) + +/* Endian Neutral macros that work on all platforms */ + +#define STORE32H(x, y) \ + { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \ + (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); } + +#define LOAD32H(x, y) \ + { x = ((unsigned long)((y)[0] & 255)<<24) | \ + ((unsigned long)((y)[1] & 255)<<16) | \ + ((unsigned long)((y)[2] & 255)<<8) | \ + ((unsigned long)((y)[3] & 255)); } + +#define STORE64H(x, y) \ + { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ + (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ + (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 */ + +#define F0(x,y,z) (z ^ (x & (y ^ z))) +#define F1(x,y,z) (x ^ y ^ z) +#define F2(x,y,z) ((x & y) | (z & (x | y))) +#define F3(x,y,z) (x ^ y ^ z) + +static void sha1_compress(struct sha1_state *sha1, unsigned char *buf) +{ + SHA1_INT32 a,b,c,d,e,W[80],i; + + /* copy the state into 512-bits into W[0..15] */ + for (i = 0; i < 16; i++) { + LOAD32H(W[i], buf + (4*i)); + } + + /* copy state */ + a = sha1->state[0]; + b = sha1->state[1]; + c = sha1->state[2]; + d = sha1->state[3]; + e = sha1->state[4]; + + /* expand it */ + for (i = 16; i < 80; i++) { + W[i] = ROL(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1); + } + + /* compress */ + /* round one */ + #define FF_0(a,b,c,d,e,i) e = (ROLc(a, 5) + F0(b,c,d) + e + W[i] + 0x5a827999UL); b = ROLc(b, 30); + #define FF_1(a,b,c,d,e,i) e = (ROLc(a, 5) + F1(b,c,d) + e + W[i] + 0x6ed9eba1UL); b = ROLc(b, 30); + #define FF_2(a,b,c,d,e,i) e = (ROLc(a, 5) + F2(b,c,d) + e + W[i] + 0x8f1bbcdcUL); b = ROLc(b, 30); + #define FF_3(a,b,c,d,e,i) e = (ROLc(a, 5) + F3(b,c,d) + e + W[i] + 0xca62c1d6UL); b = ROLc(b, 30); + + for (i = 0; i < 20; ) { + FF_0(a,b,c,d,e,i++); + FF_0(e,a,b,c,d,i++); + FF_0(d,e,a,b,c,i++); + FF_0(c,d,e,a,b,i++); + FF_0(b,c,d,e,a,i++); + } + + /* round two */ + for (; i < 40; ) { + FF_1(a,b,c,d,e,i++); + FF_1(e,a,b,c,d,i++); + FF_1(d,e,a,b,c,i++); + FF_1(c,d,e,a,b,i++); + FF_1(b,c,d,e,a,i++); + } + + /* round three */ + for (; i < 60; ) { + FF_2(a,b,c,d,e,i++); + FF_2(e,a,b,c,d,i++); + FF_2(d,e,a,b,c,i++); + FF_2(c,d,e,a,b,i++); + FF_2(b,c,d,e,a,i++); + } + + /* round four */ + for (; i < 80; ) { + FF_3(a,b,c,d,e,i++); + FF_3(e,a,b,c,d,i++); + FF_3(d,e,a,b,c,i++); + FF_3(c,d,e,a,b,i++); + FF_3(b,c,d,e,a,i++); + } + + #undef FF_0 + #undef FF_1 + #undef FF_2 + #undef FF_3 + + /* store */ + sha1->state[0] = sha1->state[0] + a; + sha1->state[1] = sha1->state[1] + b; + sha1->state[2] = sha1->state[2] + c; + sha1->state[3] = sha1->state[3] + d; + sha1->state[4] = sha1->state[4] + e; +} + +/** + Initialize the hash state + @param sha1 The hash state you wish to initialize +*/ +void sha1_init(struct sha1_state *sha1) +{ + assert(sha1 != NULL); + sha1->state[0] = 0x67452301UL; + sha1->state[1] = 0xefcdab89UL; + sha1->state[2] = 0x98badcfeUL; + sha1->state[3] = 0x10325476UL; + sha1->state[4] = 0xc3d2e1f0UL; + sha1->curlen = 0; + sha1->length = 0; +} + +/** + Process a block of memory though the hash + @param sha1 The hash state + @param in The data to hash + @param inlen The length of the data (octets) +*/ +void sha1_process(struct sha1_state *sha1, + const unsigned char *in, Py_ssize_t inlen) +{ + Py_ssize_t n; + + assert(sha1 != NULL); + assert(in != NULL); + assert(sha1->curlen <= sizeof(sha1->buf)); + + while (inlen > 0) { + if (sha1->curlen == 0 && inlen >= SHA1_BLOCKSIZE) { + sha1_compress(sha1, (unsigned char *)in); + sha1->length += SHA1_BLOCKSIZE * 8; + in += SHA1_BLOCKSIZE; + inlen -= SHA1_BLOCKSIZE; + } else { + n = MIN(inlen, (SHA1_BLOCKSIZE - sha1->curlen)); + memcpy(sha1->buf + sha1->curlen, in, (size_t)n); + sha1->curlen += n; + in += n; + inlen -= n; + if (sha1->curlen == SHA1_BLOCKSIZE) { + sha1_compress(sha1, sha1->buf); + sha1->length += 8*SHA1_BLOCKSIZE; + sha1->curlen = 0; + } + } + } +} + +/** + Terminate the hash to get the digest + @param sha1 The hash state + @param out [out] The destination of the hash (20 bytes) +*/ +void sha1_done(struct sha1_state *sha1, unsigned char *out) +{ + int i; + + assert(sha1 != NULL); + assert(out != NULL); + assert(sha1->curlen < sizeof(sha1->buf)); + + /* increase the length of the message */ + sha1->length += sha1->curlen * 8; + + /* append the '1' bit */ + sha1->buf[sha1->curlen++] = (unsigned char)0x80; + + /* if the length is currently above 56 bytes we append zeros + * then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (sha1->curlen > 56) { + while (sha1->curlen < 64) { + sha1->buf[sha1->curlen++] = (unsigned char)0; + } + sha1_compress(sha1, sha1->buf); + sha1->curlen = 0; + } + + /* pad upto 56 bytes of zeroes */ + while (sha1->curlen < 56) { + sha1->buf[sha1->curlen++] = (unsigned char)0; + } + + /* store length */ + STORE64H(sha1->length, sha1->buf+56); + sha1_compress(sha1, sha1->buf); + + /* copy output */ + for (i = 0; i < 5; i++) { + STORE32H(sha1->state[i], out+(4*i)); + } +} + + +/* .Source: /cvs/libtom/libtomcrypt/src/hashes/sha1.c,v $ */ +/* .Revision: 1.10 $ */ +/* .Date: 2007/05/12 14:25:28 $ */ + +/* + * End of copied SHA1 code. + * + * ------------------------------------------------------------------------ + */ + +static PyTypeObject SHA1type; + + +static SHA1object * +newSHA1object(void) +{ + return (SHA1object *)PyObject_New(SHA1object, &SHA1type); +} + + +/* Internal methods for a hash object */ + +static void +SHA1_dealloc(PyObject *ptr) +{ + PyObject_Del(ptr); +} + + +/* External methods for a hash object */ + +PyDoc_STRVAR(SHA1_copy__doc__, "Return a copy of the hash object."); + +static PyObject * +SHA1_copy(SHA1object *self, PyObject *unused) +{ + SHA1object *newobj; + + if (Py_TYPE(self) == &SHA1type) { + if ( (newobj = newSHA1object())==NULL) + return NULL; + } else { + if ( (newobj = newSHA1object())==NULL) + return NULL; + } + + newobj->hash_state = self->hash_state; + return (PyObject *)newobj; +} + +PyDoc_STRVAR(SHA1_digest__doc__, +"Return the digest value as a string of binary data."); + +static PyObject * +SHA1_digest(SHA1object *self, PyObject *unused) +{ + unsigned char digest[SHA1_DIGESTSIZE]; + struct sha1_state temp; + + temp = self->hash_state; + sha1_done(&temp, digest); + return PyBytes_FromStringAndSize((const char *)digest, SHA1_DIGESTSIZE); +} + +PyDoc_STRVAR(SHA1_hexdigest__doc__, +"Return the digest value as a string of hexadecimal digits."); + +static PyObject * +SHA1_hexdigest(SHA1object *self, PyObject *unused) +{ + unsigned char digest[SHA1_DIGESTSIZE]; + struct sha1_state temp; + PyObject *retval; + Py_UNICODE *hex_digest; + int i, j; + + /* Get the raw (binary) digest value */ + temp = self->hash_state; + sha1_done(&temp, digest); + + /* Create a new string */ + retval = PyUnicode_FromStringAndSize(NULL, SHA1_DIGESTSIZE * 2); + if (!retval) + return NULL; + hex_digest = PyUnicode_AS_UNICODE(retval); + if (!hex_digest) { + Py_DECREF(retval); + return NULL; + } + + /* Make hex version of the digest */ + for(i=j=0; i<SHA1_DIGESTSIZE; i++) { + char c; + c = (digest[i] >> 4) & 0xf; + c = (c>9) ? c+'a'-10 : c + '0'; + hex_digest[j++] = c; + c = (digest[i] & 0xf); + c = (c>9) ? c+'a'-10 : c + '0'; + hex_digest[j++] = c; + } + return retval; +} + +PyDoc_STRVAR(SHA1_update__doc__, +"Update this hash object's state with the provided string."); + +static PyObject * +SHA1_update(SHA1object *self, PyObject *args) +{ + PyObject *obj; + Py_buffer buf; + + if (!PyArg_ParseTuple(args, "O:update", &obj)) + return NULL; + + GET_BUFFER_VIEW_OR_ERROUT(obj, &buf); + + sha1_process(&self->hash_state, buf.buf, buf.len); + + PyBuffer_Release(&buf); + Py_INCREF(Py_None); + return Py_None; +} + +static PyMethodDef SHA1_methods[] = { + {"copy", (PyCFunction)SHA1_copy, METH_NOARGS, SHA1_copy__doc__}, + {"digest", (PyCFunction)SHA1_digest, METH_NOARGS, SHA1_digest__doc__}, + {"hexdigest", (PyCFunction)SHA1_hexdigest, METH_NOARGS, SHA1_hexdigest__doc__}, + {"update", (PyCFunction)SHA1_update, METH_VARARGS, SHA1_update__doc__}, + {NULL, NULL} /* sentinel */ +}; + +static PyObject * +SHA1_get_block_size(PyObject *self, void *closure) +{ + return PyLong_FromLong(SHA1_BLOCKSIZE); +} + +static PyObject * +SHA1_get_name(PyObject *self, void *closure) +{ + return PyUnicode_FromStringAndSize("SHA1", 3); +} + +static PyObject * +sha1_get_digest_size(PyObject *self, void *closure) +{ + return PyLong_FromLong(SHA1_DIGESTSIZE); +} + + +static PyGetSetDef SHA1_getseters[] = { + {"block_size", + (getter)SHA1_get_block_size, NULL, + NULL, + NULL}, + {"name", + (getter)SHA1_get_name, NULL, + NULL, + NULL}, + {"digest_size", + (getter)sha1_get_digest_size, NULL, + NULL, + NULL}, + {NULL} /* Sentinel */ +}; + +static PyTypeObject SHA1type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_sha1.sha1", /*tp_name*/ + sizeof(SHA1object), /*tp_size*/ + 0, /*tp_itemsize*/ + /* methods */ + SHA1_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*/ + SHA1_methods, /* tp_methods */ + NULL, /* tp_members */ + SHA1_getseters, /* tp_getset */ +}; + + +/* The single module-level function: new() */ + +PyDoc_STRVAR(SHA1_new__doc__, +"Return a new SHA1 hash object; optionally initialized with a string."); + +static PyObject * +SHA1_new(PyObject *self, PyObject *args, PyObject *kwdict) +{ + static char *kwlist[] = {"string", NULL}; + SHA1object *new; + PyObject *data_obj = NULL; + Py_buffer buf; + + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, + &data_obj)) { + return NULL; + } + + if (data_obj) + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + + if ((new = newSHA1object()) == NULL) { + if (data_obj) + PyBuffer_Release(&buf); + return NULL; + } + + sha1_init(&new->hash_state); + + if (PyErr_Occurred()) { + Py_DECREF(new); + if (data_obj) + PyBuffer_Release(&buf); + return NULL; + } + if (data_obj) { + sha1_process(&new->hash_state, buf.buf, buf.len); + PyBuffer_Release(&buf); + } + + return (PyObject *)new; +} + + +/* List of functions exported by this module */ + +static struct PyMethodDef SHA1_functions[] = { + {"sha1",(PyCFunction)SHA1_new, METH_VARARGS|METH_KEYWORDS,SHA1_new__doc__}, + {NULL, NULL} /* Sentinel */ +}; + + +/* Initialize this module. */ + +#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } + + +static struct PyModuleDef _sha1module = { + PyModuleDef_HEAD_INIT, + "_sha1", + NULL, + -1, + SHA1_functions, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit__sha1(void) +{ + Py_TYPE(&SHA1type) = &PyType_Type; + if (PyType_Ready(&SHA1type) < 0) + return NULL; + return PyModule_Create(&_sha1module); +} diff --git a/Modules/sha256module.c b/Modules/sha256module.c index 2ce8d92ca9a..86172109174 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -9,7 +9,7 @@ Greg Stein (gstein@lyra.org) Trevor Perrin (trevp@trevp.net) - Copyright (C) 2005 Gregory P. Smith (greg@krypto.org) + Copyright (C) 2005-2007 Gregory P. Smith (greg@krypto.org) Licensed to PSF under a Contributor Agreement. */ @@ -18,6 +18,7 @@ #include "Python.h" #include "structmember.h" +#include "hashlib.h" /* Endianness testing and definitions */ @@ -103,7 +104,7 @@ static void SHAcopy(SHAobject *src, SHAobject *dest) * The library is free for all purposes without any express * gurantee it works. * - * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org + * Tom St Denis, tomstdenis@iahu.ca, http://libtom.org */ @@ -264,9 +265,9 @@ sha224_init(SHAobject *sha_info) /* update the SHA digest */ static void -sha_update(SHAobject *sha_info, SHA_BYTE *buffer, int count) +sha_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count) { - int i; + Py_ssize_t i; SHA_INT32 clo; clo = sha_info->count_lo + ((SHA_INT32) count << 3); @@ -432,7 +433,7 @@ SHA256_digest(SHAobject *self, PyObject *unused) SHAcopy(self, &temp); sha_final(digest, &temp); - return PyString_FromStringAndSize((const char *)digest, self->digestsize); + return PyBytes_FromStringAndSize((const char *)digest, self->digestsize); } PyDoc_STRVAR(SHA256_hexdigest__doc__, @@ -444,7 +445,7 @@ SHA256_hexdigest(SHAobject *self, PyObject *unused) unsigned char digest[SHA_DIGESTSIZE]; SHAobject temp; PyObject *retval; - char *hex_digest; + Py_UNICODE *hex_digest; int i, j; /* Get the raw (binary) digest value */ @@ -452,10 +453,10 @@ SHA256_hexdigest(SHAobject *self, PyObject *unused) sha_final(digest, &temp); /* Create a new string */ - retval = PyString_FromStringAndSize(NULL, self->digestsize * 2); + retval = PyUnicode_FromStringAndSize(NULL, self->digestsize * 2); if (!retval) return NULL; - hex_digest = PyString_AsString(retval); + hex_digest = PyUnicode_AS_UNICODE(retval); if (!hex_digest) { Py_DECREF(retval); return NULL; @@ -480,15 +481,19 @@ PyDoc_STRVAR(SHA256_update__doc__, static PyObject * SHA256_update(SHAobject *self, PyObject *args) { + PyObject *obj; Py_buffer buf; - if (!PyArg_ParseTuple(args, "s*:update", &buf)) + if (!PyArg_ParseTuple(args, "O:update", &obj)) return NULL; + GET_BUFFER_VIEW_OR_ERROUT(obj, &buf); + sha_update(self, buf.buf, buf.len); PyBuffer_Release(&buf); - Py_RETURN_NONE; + Py_INCREF(Py_None); + return Py_None; } static PyMethodDef SHA_methods[] = { @@ -502,16 +507,16 @@ static PyMethodDef SHA_methods[] = { static PyObject * SHA256_get_block_size(PyObject *self, void *closure) { - return PyInt_FromLong(SHA_BLOCKSIZE); + return PyLong_FromLong(SHA_BLOCKSIZE); } static PyObject * SHA256_get_name(PyObject *self, void *closure) { if (((SHAobject *)self)->digestsize == 32) - return PyString_FromStringAndSize("SHA256", 6); + return PyUnicode_FromStringAndSize("SHA256", 6); else - return PyString_FromStringAndSize("SHA224", 6); + return PyUnicode_FromStringAndSize("SHA224", 6); } static PyGetSetDef SHA_getseters[] = { @@ -528,9 +533,6 @@ static PyGetSetDef SHA_getseters[] = { static PyMemberDef SHA_members[] = { {"digest_size", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL}, - /* the old md5 and sha modules support 'digest_size' as in PEP 247. - * the old sha module also supported 'digestsize'. ugh. */ - {"digestsize", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL}, {NULL} /* Sentinel */ }; @@ -544,7 +546,7 @@ static PyTypeObject SHA224type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -578,7 +580,7 @@ static PyTypeObject SHA256type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -613,15 +615,20 @@ SHA256_new(PyObject *self, PyObject *args, PyObject *kwdict) { static char *kwlist[] = {"string", NULL}; SHAobject *new; - Py_buffer buf = { 0 }; + PyObject *data_obj = NULL; + Py_buffer buf; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist, - &buf)) { + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, + &data_obj)) { return NULL; } + if (data_obj) + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + if ((new = newSHA256object()) == NULL) { - PyBuffer_Release(&buf); + if (data_obj) + PyBuffer_Release(&buf); return NULL; } @@ -629,13 +636,14 @@ SHA256_new(PyObject *self, PyObject *args, PyObject *kwdict) if (PyErr_Occurred()) { Py_DECREF(new); - PyBuffer_Release(&buf); + if (data_obj) + PyBuffer_Release(&buf); return NULL; } - if (buf.len > 0) { + if (data_obj) { sha_update(new, buf.buf, buf.len); + PyBuffer_Release(&buf); } - PyBuffer_Release(&buf); return (PyObject *)new; } @@ -648,15 +656,20 @@ SHA224_new(PyObject *self, PyObject *args, PyObject *kwdict) { static char *kwlist[] = {"string", NULL}; SHAobject *new; - Py_buffer buf = { 0 }; + PyObject *data_obj = NULL; + Py_buffer buf; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist, - &buf)) { + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, + &data_obj)) { return NULL; } + if (data_obj) + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + if ((new = newSHA224object()) == NULL) { - PyBuffer_Release(&buf); + if (data_obj) + PyBuffer_Release(&buf); return NULL; } @@ -664,13 +677,14 @@ SHA224_new(PyObject *self, PyObject *args, PyObject *kwdict) if (PyErr_Occurred()) { Py_DECREF(new); - PyBuffer_Release(&buf); + if (data_obj) + PyBuffer_Release(&buf); return NULL; } - if (buf.len > 0) { + if (data_obj) { sha_update(new, buf.buf, buf.len); + PyBuffer_Release(&buf); } - PyBuffer_Release(&buf); return (PyObject *)new; } @@ -689,18 +703,27 @@ static struct PyMethodDef SHA_functions[] = { #define insint(n,v) { PyModule_AddIntConstant(m,n,v); } + +static struct PyModuleDef _sha256module = { + PyModuleDef_HEAD_INIT, + "_sha256", + NULL, + -1, + SHA_functions, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_sha256(void) +PyInit__sha256(void) { - PyObject *m; - Py_TYPE(&SHA224type) = &PyType_Type; if (PyType_Ready(&SHA224type) < 0) - return; + return NULL; Py_TYPE(&SHA256type) = &PyType_Type; if (PyType_Ready(&SHA256type) < 0) - return; - m = Py_InitModule("_sha256", SHA_functions); - if (m == NULL) - return; + return NULL; + return PyModule_Create(&_sha256module); } diff --git a/Modules/sha512module.c b/Modules/sha512module.c index d7b3699a266..0faaf5c5cb0 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -9,7 +9,7 @@ Greg Stein (gstein@lyra.org) Trevor Perrin (trevp@trevp.net) - Copyright (C) 2005 Gregory P. Smith (greg@krypto.org) + Copyright (C) 2005-2007 Gregory P. Smith (greg@krypto.org) Licensed to PSF under a Contributor Agreement. */ @@ -18,6 +18,7 @@ #include "Python.h" #include "structmember.h" +#include "hashlib.h" #ifdef PY_LONG_LONG /* If no PY_LONG_LONG, don't compile anything! */ @@ -113,7 +114,7 @@ static void SHAcopy(SHAobject *src, SHAobject *dest) * The library is free for all purposes without any express * gurantee it works. * - * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org + * Tom St Denis, tomstdenis@iahu.ca, http://libtom.org */ @@ -290,9 +291,9 @@ sha384_init(SHAobject *sha_info) /* update the SHA digest */ static void -sha512_update(SHAobject *sha_info, SHA_BYTE *buffer, int count) +sha512_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count) { - int i; + Py_ssize_t i; SHA_INT32 clo; clo = sha_info->count_lo + ((SHA_INT32) count << 3); @@ -498,7 +499,7 @@ SHA512_digest(SHAobject *self, PyObject *unused) SHAcopy(self, &temp); sha512_final(digest, &temp); - return PyString_FromStringAndSize((const char *)digest, self->digestsize); + return PyBytes_FromStringAndSize((const char *)digest, self->digestsize); } PyDoc_STRVAR(SHA512_hexdigest__doc__, @@ -510,7 +511,7 @@ SHA512_hexdigest(SHAobject *self, PyObject *unused) unsigned char digest[SHA_DIGESTSIZE]; SHAobject temp; PyObject *retval; - char *hex_digest; + Py_UNICODE *hex_digest; int i, j; /* Get the raw (binary) digest value */ @@ -518,10 +519,10 @@ SHA512_hexdigest(SHAobject *self, PyObject *unused) sha512_final(digest, &temp); /* Create a new string */ - retval = PyString_FromStringAndSize(NULL, self->digestsize * 2); + retval = PyUnicode_FromStringAndSize(NULL, self->digestsize * 2); if (!retval) return NULL; - hex_digest = PyString_AsString(retval); + hex_digest = PyUnicode_AS_UNICODE(retval); if (!hex_digest) { Py_DECREF(retval); return NULL; @@ -546,15 +547,19 @@ PyDoc_STRVAR(SHA512_update__doc__, static PyObject * SHA512_update(SHAobject *self, PyObject *args) { + PyObject *obj; Py_buffer buf; - if (!PyArg_ParseTuple(args, "s*:update", &buf)) + if (!PyArg_ParseTuple(args, "O:update", &obj)) return NULL; + GET_BUFFER_VIEW_OR_ERROUT(obj, &buf); + sha512_update(self, buf.buf, buf.len); PyBuffer_Release(&buf); - Py_RETURN_NONE; + Py_INCREF(Py_None); + return Py_None; } static PyMethodDef SHA_methods[] = { @@ -568,16 +573,16 @@ static PyMethodDef SHA_methods[] = { static PyObject * SHA512_get_block_size(PyObject *self, void *closure) { - return PyInt_FromLong(SHA_BLOCKSIZE); + return PyLong_FromLong(SHA_BLOCKSIZE); } static PyObject * SHA512_get_name(PyObject *self, void *closure) { if (((SHAobject *)self)->digestsize == 64) - return PyString_FromStringAndSize("SHA512", 6); + return PyUnicode_FromStringAndSize("SHA512", 6); else - return PyString_FromStringAndSize("SHA384", 6); + return PyUnicode_FromStringAndSize("SHA384", 6); } static PyGetSetDef SHA_getseters[] = { @@ -594,9 +599,6 @@ static PyGetSetDef SHA_getseters[] = { static PyMemberDef SHA_members[] = { {"digest_size", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL}, - /* the old md5 and sha modules support 'digest_size' as in PEP 247. - * the old sha module also supported 'digestsize'. ugh. */ - {"digestsize", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL}, {NULL} /* Sentinel */ }; @@ -610,7 +612,7 @@ static PyTypeObject SHA384type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -644,7 +646,7 @@ static PyTypeObject SHA512type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -679,15 +681,20 @@ SHA512_new(PyObject *self, PyObject *args, PyObject *kwdict) { static char *kwlist[] = {"string", NULL}; SHAobject *new; - Py_buffer buf = { 0 }; + PyObject *data_obj = NULL; + Py_buffer buf; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist, - &buf)) { + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, + &data_obj)) { return NULL; } + if (data_obj) + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + if ((new = newSHA512object()) == NULL) { - PyBuffer_Release(&buf); + if (data_obj) + PyBuffer_Release(&buf); return NULL; } @@ -695,13 +702,14 @@ SHA512_new(PyObject *self, PyObject *args, PyObject *kwdict) if (PyErr_Occurred()) { Py_DECREF(new); - PyBuffer_Release(&buf); + if (data_obj) + PyBuffer_Release(&buf); return NULL; } - if (buf.len > 0) { + if (data_obj) { sha512_update(new, buf.buf, buf.len); + PyBuffer_Release(&buf); } - PyBuffer_Release(&buf); return (PyObject *)new; } @@ -714,15 +722,20 @@ SHA384_new(PyObject *self, PyObject *args, PyObject *kwdict) { static char *kwlist[] = {"string", NULL}; SHAobject *new; - Py_buffer buf = { 0 }; + PyObject *data_obj = NULL; + Py_buffer buf; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist, - &buf)) { + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, + &data_obj)) { return NULL; } + if (data_obj) + GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + if ((new = newSHA384object()) == NULL) { - PyBuffer_Release(&buf); + if (data_obj) + PyBuffer_Release(&buf); return NULL; } @@ -730,13 +743,14 @@ SHA384_new(PyObject *self, PyObject *args, PyObject *kwdict) if (PyErr_Occurred()) { Py_DECREF(new); - PyBuffer_Release(&buf); + if (data_obj) + PyBuffer_Release(&buf); return NULL; } - if (buf.len > 0) { + if (data_obj) { sha512_update(new, buf.buf, buf.len); + PyBuffer_Release(&buf); } - PyBuffer_Release(&buf); return (PyObject *)new; } @@ -755,20 +769,29 @@ static struct PyMethodDef SHA_functions[] = { #define insint(n,v) { PyModule_AddIntConstant(m,n,v); } + +static struct PyModuleDef _sha512module = { + PyModuleDef_HEAD_INIT, + "_sha512", + NULL, + -1, + SHA_functions, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_sha512(void) +PyInit__sha512(void) { - PyObject *m; - Py_TYPE(&SHA384type) = &PyType_Type; if (PyType_Ready(&SHA384type) < 0) - return; + return NULL; Py_TYPE(&SHA512type) = &PyType_Type; if (PyType_Ready(&SHA512type) < 0) - return; - m = Py_InitModule("_sha512", SHA_functions); - if (m == NULL) - return; + return NULL; + return PyModule_Create(&_sha512module); } #endif diff --git a/Modules/shamodule.c b/Modules/shamodule.c deleted file mode 100644 index 656208da9f5..00000000000 --- a/Modules/shamodule.c +++ /dev/null @@ -1,623 +0,0 @@ -/* SHA module */ - -/* This module provides an interface to NIST's Secure Hash 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) - - Copyright (C) 2005 Gregory P. Smith (greg@krypto.org) - Licensed to PSF under a Contributor Agreement. - -*/ - -/* SHA objects */ - -#include "Python.h" -#include "structmember.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; - -#if SIZEOF_INT == 4 -typedef unsigned int SHA_INT32; /* 32-bit integer */ -#else -/* not defined. compilation will die. */ -#endif - -/* The SHA block size and message digest sizes, in bytes */ - -#define SHA_BLOCKSIZE 64 -#define SHA_DIGESTSIZE 20 - -/* The structure for storing SHS info */ - -typedef struct { - PyObject_HEAD - SHA_INT32 digest[5]; /* 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 */ -} SHAobject; - -/* 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) -{ - SHA_INT32 value; - - if ( Endianness == PCT_BIG_ENDIAN ) - return; - - byteCount /= sizeof(*buffer); - while (byteCount--) { - value = *buffer; - value = ( ( value & 0xFF00FF00L ) >> 8 ) | \ - ( ( value & 0x00FF00FFL ) << 8 ); - *buffer++ = ( value << 16 ) | ( value >> 16 ); - } -} - -static void SHAcopy(SHAobject *src, SHAobject *dest) -{ - dest->Endianness = src->Endianness; - dest->local = src->local; - dest->count_lo = src->count_lo; - dest->count_hi = src->count_hi; - memcpy(dest->digest, src->digest, sizeof(src->digest)); - memcpy(dest->data, src->data, sizeof(src->data)); -} - - -/* ------------------------------------------------------------------------ - * - * This code for the SHA algorithm was noted as public domain. The original - * headers are pasted below. - * - * Several changes have been made to make it more compatible with the - * Python environment and desired interface. - * - */ - -/* NIST Secure Hash Algorithm */ -/* heavily modified by Uwe Hollerbach <uh@alumni.caltech edu> */ -/* from Peter C. Gutmann's implementation as found in */ -/* Applied Cryptography by Bruce Schneier */ -/* Further modifications to include the "UNRAVEL" stuff, below */ - -/* This code is in the public domain */ - -/* UNRAVEL should be fastest & biggest */ -/* UNROLL_LOOPS should be just as big, but slightly slower */ -/* both undefined should be smallest and slowest */ - -#define UNRAVEL -/* #define UNROLL_LOOPS */ - -/* The SHA f()-functions. The f1 and f3 functions can be optimized to - save one boolean operation each - thanks to Rich Schroeppel, - rcs@cs.arizona.edu for discovering this */ - -/*#define f1(x,y,z) ((x & y) | (~x & z)) // Rounds 0-19 */ -#define f1(x,y,z) (z ^ (x & (y ^ z))) /* Rounds 0-19 */ -#define f2(x,y,z) (x ^ y ^ z) /* Rounds 20-39 */ -/*#define f3(x,y,z) ((x & y) | (x & z) | (y & z)) // Rounds 40-59 */ -#define f3(x,y,z) ((x & y) | (z & (x | y))) /* Rounds 40-59 */ -#define f4(x,y,z) (x ^ y ^ z) /* Rounds 60-79 */ - -/* SHA constants */ - -#define CONST1 0x5a827999L /* Rounds 0-19 */ -#define CONST2 0x6ed9eba1L /* Rounds 20-39 */ -#define CONST3 0x8f1bbcdcL /* Rounds 40-59 */ -#define CONST4 0xca62c1d6L /* Rounds 60-79 */ - -/* 32-bit rotate */ - -#define R32(x,n) ((x << n) | (x >> (32 - n))) - -/* the generic case, for when the overall rotation is not unraveled */ - -#define FG(n) \ - T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; \ - E = D; D = C; C = R32(B,30); B = A; A = T - -/* specific cases, for when the overall rotation is unraveled */ - -#define FA(n) \ - T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; B = R32(B,30) - -#define FB(n) \ - E = R32(T,5) + f##n(A,B,C) + D + *WP++ + CONST##n; A = R32(A,30) - -#define FC(n) \ - D = R32(E,5) + f##n(T,A,B) + C + *WP++ + CONST##n; T = R32(T,30) - -#define FD(n) \ - C = R32(D,5) + f##n(E,T,A) + B + *WP++ + CONST##n; E = R32(E,30) - -#define FE(n) \ - B = R32(C,5) + f##n(D,E,T) + A + *WP++ + CONST##n; D = R32(D,30) - -#define FT(n) \ - A = R32(B,5) + f##n(C,D,E) + T + *WP++ + CONST##n; C = R32(C,30) - -/* do SHA transformation */ - -static void -sha_transform(SHAobject *sha_info) -{ - int i; - SHA_INT32 T, A, B, C, D, E, W[80], *WP; - - memcpy(W, sha_info->data, sizeof(sha_info->data)); - longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness); - - for (i = 16; i < 80; ++i) { - W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16]; - - /* extra rotation fix */ - W[i] = R32(W[i], 1); - } - A = sha_info->digest[0]; - B = sha_info->digest[1]; - C = sha_info->digest[2]; - D = sha_info->digest[3]; - E = sha_info->digest[4]; - WP = W; -#ifdef UNRAVEL - FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); - FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); - FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); - FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); - FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); - FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); - FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); - FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); - sha_info->digest[0] += E; - sha_info->digest[1] += T; - sha_info->digest[2] += A; - sha_info->digest[3] += B; - sha_info->digest[4] += C; -#else /* !UNRAVEL */ -#ifdef UNROLL_LOOPS - FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); - FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); - FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); - FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); - FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); - FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); - FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); - FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); -#else /* !UNROLL_LOOPS */ - for (i = 0; i < 20; ++i) { FG(1); } - for (i = 20; i < 40; ++i) { FG(2); } - for (i = 40; i < 60; ++i) { FG(3); } - for (i = 60; i < 80; ++i) { FG(4); } -#endif /* !UNROLL_LOOPS */ - sha_info->digest[0] += A; - sha_info->digest[1] += B; - sha_info->digest[2] += C; - sha_info->digest[3] += D; - sha_info->digest[4] += E; -#endif /* !UNRAVEL */ -} - -/* initialize the SHA digest */ - -static void -sha_init(SHAobject *sha_info) -{ - TestEndianness(sha_info->Endianness) - - sha_info->digest[0] = 0x67452301L; - sha_info->digest[1] = 0xefcdab89L; - sha_info->digest[2] = 0x98badcfeL; - sha_info->digest[3] = 0x10325476L; - sha_info->digest[4] = 0xc3d2e1f0L; - sha_info->count_lo = 0L; - sha_info->count_hi = 0L; - sha_info->local = 0; -} - -/* update the SHA digest */ - -static void -sha_update(SHAobject *sha_info, SHA_BYTE *buffer, unsigned int count) -{ - unsigned int i; - SHA_INT32 clo; - - clo = sha_info->count_lo + ((SHA_INT32) count << 3); - if (clo < sha_info->count_lo) { - ++sha_info->count_hi; - } - sha_info->count_lo = clo; - sha_info->count_hi += (SHA_INT32) count >> 29; - if (sha_info->local) { - i = SHA_BLOCKSIZE - sha_info->local; - if (i > count) { - i = count; - } - memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i); - count -= i; - buffer += i; - sha_info->local += i; - if (sha_info->local == SHA_BLOCKSIZE) { - sha_transform(sha_info); - } - else { - return; - } - } - while (count >= SHA_BLOCKSIZE) { - memcpy(sha_info->data, buffer, SHA_BLOCKSIZE); - buffer += SHA_BLOCKSIZE; - count -= SHA_BLOCKSIZE; - sha_transform(sha_info); - } - memcpy(sha_info->data, buffer, count); - sha_info->local = count; -} - -/* finish computing the SHA digest */ - -static void -sha_final(unsigned char digest[20], SHAobject *sha_info) -{ - int count; - SHA_INT32 lo_bit_count, hi_bit_count; - - lo_bit_count = sha_info->count_lo; - hi_bit_count = sha_info->count_hi; - count = (int) ((lo_bit_count >> 3) & 0x3f); - ((SHA_BYTE *) sha_info->data)[count++] = 0x80; - if (count > SHA_BLOCKSIZE - 8) { - memset(((SHA_BYTE *) sha_info->data) + count, 0, - SHA_BLOCKSIZE - count); - sha_transform(sha_info); - memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8); - } - else { - memset(((SHA_BYTE *) sha_info->data) + count, 0, - SHA_BLOCKSIZE - 8 - count); - } - - /* GJS: note that we add the hi/lo in big-endian. sha_transform will - swap these values into host-order. */ - sha_info->data[56] = (hi_bit_count >> 24) & 0xff; - sha_info->data[57] = (hi_bit_count >> 16) & 0xff; - sha_info->data[58] = (hi_bit_count >> 8) & 0xff; - sha_info->data[59] = (hi_bit_count >> 0) & 0xff; - sha_info->data[60] = (lo_bit_count >> 24) & 0xff; - sha_info->data[61] = (lo_bit_count >> 16) & 0xff; - sha_info->data[62] = (lo_bit_count >> 8) & 0xff; - sha_info->data[63] = (lo_bit_count >> 0) & 0xff; - sha_transform(sha_info); - digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff); - digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff); - digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff); - digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff); - digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff); - digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff); - digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff); - digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff); - digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff); - digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff); - digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff); - digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff); - digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff); - digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff); - digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff); - digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff); - digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff); - digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff); - digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff); - digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff); -} - -/* - * End of copied SHA code. - * - * ------------------------------------------------------------------------ - */ - -static PyTypeObject SHAtype; - - -static SHAobject * -newSHAobject(void) -{ - return (SHAobject *)PyObject_New(SHAobject, &SHAtype); -} - -/* Internal methods for a hashing object */ - -static void -SHA_dealloc(PyObject *ptr) -{ - PyObject_Del(ptr); -} - - -/* External methods for a hashing object */ - -PyDoc_STRVAR(SHA_copy__doc__, "Return a copy of the hashing object."); - -static PyObject * -SHA_copy(SHAobject *self, PyObject *unused) -{ - SHAobject *newobj; - - if ( (newobj = newSHAobject())==NULL) - return NULL; - - SHAcopy(self, newobj); - return (PyObject *)newobj; -} - -PyDoc_STRVAR(SHA_digest__doc__, -"Return the digest value as a string of binary data."); - -static PyObject * -SHA_digest(SHAobject *self, PyObject *unused) -{ - unsigned char digest[SHA_DIGESTSIZE]; - SHAobject temp; - - SHAcopy(self, &temp); - sha_final(digest, &temp); - return PyString_FromStringAndSize((const char *)digest, sizeof(digest)); -} - -PyDoc_STRVAR(SHA_hexdigest__doc__, -"Return the digest value as a string of hexadecimal digits."); - -static PyObject * -SHA_hexdigest(SHAobject *self, PyObject *unused) -{ - unsigned char digest[SHA_DIGESTSIZE]; - SHAobject temp; - PyObject *retval; - char *hex_digest; - int i, j; - - /* Get the raw (binary) digest value */ - SHAcopy(self, &temp); - sha_final(digest, &temp); - - /* Create a new string */ - retval = PyString_FromStringAndSize(NULL, sizeof(digest) * 2); - if (!retval) - return NULL; - hex_digest = PyString_AsString(retval); - if (!hex_digest) { - Py_DECREF(retval); - return NULL; - } - - /* Make hex version of the digest */ - for(i=j=0; i<sizeof(digest); i++) { - char c; - c = (digest[i] >> 4) & 0xf; - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; - c = (digest[i] & 0xf); - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; - } - return retval; -} - -PyDoc_STRVAR(SHA_update__doc__, -"Update this hashing object's state with the provided string."); - -static PyObject * -SHA_update(SHAobject *self, PyObject *args) -{ - Py_buffer view; - Py_ssize_t n; - unsigned char *buf; - - if (!PyArg_ParseTuple(args, "s*:update", &view)) - return NULL; - - n = view.len; - buf = (unsigned char *) view.buf; - while (n > 0) { - Py_ssize_t nbytes; - if (n > INT_MAX) - nbytes = INT_MAX; - else - nbytes = n; - sha_update(self, buf, - Py_SAFE_DOWNCAST(nbytes, Py_ssize_t, unsigned int)); - buf += nbytes; - n -= nbytes; - } - - PyBuffer_Release(&view); - Py_RETURN_NONE; -} - -static PyMethodDef SHA_methods[] = { - {"copy", (PyCFunction)SHA_copy, METH_NOARGS, SHA_copy__doc__}, - {"digest", (PyCFunction)SHA_digest, METH_NOARGS, SHA_digest__doc__}, - {"hexdigest", (PyCFunction)SHA_hexdigest, METH_NOARGS, SHA_hexdigest__doc__}, - {"update", (PyCFunction)SHA_update, METH_VARARGS, SHA_update__doc__}, - {NULL, NULL} /* sentinel */ -}; - -static PyObject * -SHA_get_block_size(PyObject *self, void *closure) -{ - return PyInt_FromLong(SHA_BLOCKSIZE); -} - -static PyObject * -SHA_get_digest_size(PyObject *self, void *closure) -{ - return PyInt_FromLong(SHA_DIGESTSIZE); -} - -static PyObject * -SHA_get_name(PyObject *self, void *closure) -{ - return PyString_FromStringAndSize("SHA1", 4); -} - -static PyGetSetDef SHA_getseters[] = { - {"digest_size", - (getter)SHA_get_digest_size, NULL, - NULL, - NULL}, - {"block_size", - (getter)SHA_get_block_size, NULL, - NULL, - NULL}, - {"name", - (getter)SHA_get_name, NULL, - NULL, - NULL}, - /* the old md5 and sha modules support 'digest_size' as in PEP 247. - * the old sha module also supported 'digestsize'. ugh. */ - {"digestsize", - (getter)SHA_get_digest_size, NULL, - NULL, - NULL}, - {NULL} /* Sentinel */ -}; - -static PyTypeObject SHAtype = { - PyVarObject_HEAD_INIT(NULL, 0) - "_sha.sha", /*tp_name*/ - sizeof(SHAobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - SHA_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 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*/ - SHA_methods, /* tp_methods */ - 0, /* tp_members */ - SHA_getseters, /* tp_getset */ -}; - - -/* The single module-level function: new() */ - -PyDoc_STRVAR(SHA_new__doc__, -"Return a new SHA hashing object. An optional string argument\n\ -may be provided; if present, this string will be automatically\n\ -hashed."); - -static PyObject * -SHA_new(PyObject *self, PyObject *args, PyObject *kwdict) -{ - static char *kwlist[] = {"string", NULL}; - SHAobject *new; - Py_buffer view = { 0 }; - Py_ssize_t n; - unsigned char *buf; - - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist, - &view)) { - return NULL; - } - - if ((new = newSHAobject()) == NULL) { - PyBuffer_Release(&view); - return NULL; - } - - sha_init(new); - - if (PyErr_Occurred()) { - Py_DECREF(new); - PyBuffer_Release(&view); - return NULL; - } - - n = view.len; - buf = (unsigned char *) view.buf; - while (n > 0) { - Py_ssize_t nbytes; - if (n > INT_MAX) - nbytes = INT_MAX; - else - nbytes = n; - sha_update(new, buf, - Py_SAFE_DOWNCAST(nbytes, Py_ssize_t, unsigned int)); - buf += nbytes; - n -= nbytes; - } - - PyBuffer_Release(&view); - - return (PyObject *)new; -} - - -/* List of functions exported by this module */ - -static struct PyMethodDef SHA_functions[] = { - {"new", (PyCFunction)SHA_new, METH_VARARGS|METH_KEYWORDS, SHA_new__doc__}, - {NULL, NULL} /* Sentinel */ -}; - - -/* Initialize this module. */ - -#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } - -PyMODINIT_FUNC -init_sha(void) -{ - PyObject *m; - - Py_TYPE(&SHAtype) = &PyType_Type; - if (PyType_Ready(&SHAtype) < 0) - return; - m = Py_InitModule("_sha", SHA_functions); - if (m == NULL) - return; - - /* Add some symbolic constants to the module */ - insint("blocksize", 1); /* For future use, in case some hash - functions require an integral number of - blocks */ - insint("digestsize", 20); - insint("digest_size", 20); -} diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index f706a8fd8f3..9cae454194a 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -4,7 +4,6 @@ /* XXX Signals should be recorded per thread, now we have thread state. */ #include "Python.h" -#include "intrcheck.h" #ifdef MS_WINDOWS #include <Windows.h> @@ -81,12 +80,12 @@ static long main_thread; static pid_t main_pid; #endif -static struct { - int tripped; +static volatile struct { + sig_atomic_t tripped; PyObject *func; } Handlers[NSIG]; -static sig_atomic_t wakeup_fd = -1; +static volatile sig_atomic_t wakeup_fd = -1; /* Speed up sigcheck() when none tripped */ static volatile sig_atomic_t is_tripped = 0; @@ -229,7 +228,7 @@ signal_alarm(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "i:alarm", &t)) return NULL; /* alarm() returns the number of seconds remaining */ - return PyInt_FromLong((long)alarm(t)); + return PyLong_FromLong((long)alarm(t)); } PyDoc_STRVAR(alarm_doc, @@ -560,8 +559,20 @@ ITIMER_PROF -- decrements both when the process is executing and\n\ A signal handler function is called with two arguments:\n\ the first is the signal number, the second is the interrupted stack frame."); +static struct PyModuleDef signalmodule = { + PyModuleDef_HEAD_INIT, + "signal", + module_doc, + -1, + signal_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initsignal(void) +PyInit_signal(void) { PyObject *m, *d, *x; int i; @@ -572,9 +583,9 @@ initsignal(void) #endif /* Create the module and add the functions */ - m = Py_InitModule3("signal", signal_methods, module_doc); + m = PyModule_Create(&signalmodule); if (m == NULL) - return; + return NULL; /* Add some symbolic constants to the module */ d = PyModule_GetDict(m); @@ -587,7 +598,7 @@ initsignal(void) if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0) goto finally; - x = PyInt_FromLong((long)NSIG); + x = PyLong_FromLong((long)NSIG); if (!x || PyDict_SetItemString(d, "NSIG", x) < 0) goto finally; Py_DECREF(x); @@ -619,192 +630,192 @@ initsignal(void) } #ifdef SIGHUP - x = PyInt_FromLong(SIGHUP); + x = PyLong_FromLong(SIGHUP); PyDict_SetItemString(d, "SIGHUP", x); Py_XDECREF(x); #endif #ifdef SIGINT - x = PyInt_FromLong(SIGINT); + x = PyLong_FromLong(SIGINT); PyDict_SetItemString(d, "SIGINT", x); Py_XDECREF(x); #endif #ifdef SIGBREAK - x = PyInt_FromLong(SIGBREAK); + x = PyLong_FromLong(SIGBREAK); PyDict_SetItemString(d, "SIGBREAK", x); Py_XDECREF(x); #endif #ifdef SIGQUIT - x = PyInt_FromLong(SIGQUIT); + x = PyLong_FromLong(SIGQUIT); PyDict_SetItemString(d, "SIGQUIT", x); Py_XDECREF(x); #endif #ifdef SIGILL - x = PyInt_FromLong(SIGILL); + x = PyLong_FromLong(SIGILL); PyDict_SetItemString(d, "SIGILL", x); Py_XDECREF(x); #endif #ifdef SIGTRAP - x = PyInt_FromLong(SIGTRAP); + x = PyLong_FromLong(SIGTRAP); PyDict_SetItemString(d, "SIGTRAP", x); Py_XDECREF(x); #endif #ifdef SIGIOT - x = PyInt_FromLong(SIGIOT); + x = PyLong_FromLong(SIGIOT); PyDict_SetItemString(d, "SIGIOT", x); Py_XDECREF(x); #endif #ifdef SIGABRT - x = PyInt_FromLong(SIGABRT); + x = PyLong_FromLong(SIGABRT); PyDict_SetItemString(d, "SIGABRT", x); Py_XDECREF(x); #endif #ifdef SIGEMT - x = PyInt_FromLong(SIGEMT); + x = PyLong_FromLong(SIGEMT); PyDict_SetItemString(d, "SIGEMT", x); Py_XDECREF(x); #endif #ifdef SIGFPE - x = PyInt_FromLong(SIGFPE); + x = PyLong_FromLong(SIGFPE); PyDict_SetItemString(d, "SIGFPE", x); Py_XDECREF(x); #endif #ifdef SIGKILL - x = PyInt_FromLong(SIGKILL); + x = PyLong_FromLong(SIGKILL); PyDict_SetItemString(d, "SIGKILL", x); Py_XDECREF(x); #endif #ifdef SIGBUS - x = PyInt_FromLong(SIGBUS); + x = PyLong_FromLong(SIGBUS); PyDict_SetItemString(d, "SIGBUS", x); Py_XDECREF(x); #endif #ifdef SIGSEGV - x = PyInt_FromLong(SIGSEGV); + x = PyLong_FromLong(SIGSEGV); PyDict_SetItemString(d, "SIGSEGV", x); Py_XDECREF(x); #endif #ifdef SIGSYS - x = PyInt_FromLong(SIGSYS); + x = PyLong_FromLong(SIGSYS); PyDict_SetItemString(d, "SIGSYS", x); Py_XDECREF(x); #endif #ifdef SIGPIPE - x = PyInt_FromLong(SIGPIPE); + x = PyLong_FromLong(SIGPIPE); PyDict_SetItemString(d, "SIGPIPE", x); Py_XDECREF(x); #endif #ifdef SIGALRM - x = PyInt_FromLong(SIGALRM); + x = PyLong_FromLong(SIGALRM); PyDict_SetItemString(d, "SIGALRM", x); Py_XDECREF(x); #endif #ifdef SIGTERM - x = PyInt_FromLong(SIGTERM); + x = PyLong_FromLong(SIGTERM); PyDict_SetItemString(d, "SIGTERM", x); Py_XDECREF(x); #endif #ifdef SIGUSR1 - x = PyInt_FromLong(SIGUSR1); + x = PyLong_FromLong(SIGUSR1); PyDict_SetItemString(d, "SIGUSR1", x); Py_XDECREF(x); #endif #ifdef SIGUSR2 - x = PyInt_FromLong(SIGUSR2); + x = PyLong_FromLong(SIGUSR2); PyDict_SetItemString(d, "SIGUSR2", x); Py_XDECREF(x); #endif #ifdef SIGCLD - x = PyInt_FromLong(SIGCLD); + x = PyLong_FromLong(SIGCLD); PyDict_SetItemString(d, "SIGCLD", x); Py_XDECREF(x); #endif #ifdef SIGCHLD - x = PyInt_FromLong(SIGCHLD); + x = PyLong_FromLong(SIGCHLD); PyDict_SetItemString(d, "SIGCHLD", x); Py_XDECREF(x); #endif #ifdef SIGPWR - x = PyInt_FromLong(SIGPWR); + x = PyLong_FromLong(SIGPWR); PyDict_SetItemString(d, "SIGPWR", x); Py_XDECREF(x); #endif #ifdef SIGIO - x = PyInt_FromLong(SIGIO); + x = PyLong_FromLong(SIGIO); PyDict_SetItemString(d, "SIGIO", x); Py_XDECREF(x); #endif #ifdef SIGURG - x = PyInt_FromLong(SIGURG); + x = PyLong_FromLong(SIGURG); PyDict_SetItemString(d, "SIGURG", x); Py_XDECREF(x); #endif #ifdef SIGWINCH - x = PyInt_FromLong(SIGWINCH); + x = PyLong_FromLong(SIGWINCH); PyDict_SetItemString(d, "SIGWINCH", x); Py_XDECREF(x); #endif #ifdef SIGPOLL - x = PyInt_FromLong(SIGPOLL); + x = PyLong_FromLong(SIGPOLL); PyDict_SetItemString(d, "SIGPOLL", x); Py_XDECREF(x); #endif #ifdef SIGSTOP - x = PyInt_FromLong(SIGSTOP); + x = PyLong_FromLong(SIGSTOP); PyDict_SetItemString(d, "SIGSTOP", x); Py_XDECREF(x); #endif #ifdef SIGTSTP - x = PyInt_FromLong(SIGTSTP); + x = PyLong_FromLong(SIGTSTP); PyDict_SetItemString(d, "SIGTSTP", x); Py_XDECREF(x); #endif #ifdef SIGCONT - x = PyInt_FromLong(SIGCONT); + x = PyLong_FromLong(SIGCONT); PyDict_SetItemString(d, "SIGCONT", x); Py_XDECREF(x); #endif #ifdef SIGTTIN - x = PyInt_FromLong(SIGTTIN); + x = PyLong_FromLong(SIGTTIN); PyDict_SetItemString(d, "SIGTTIN", x); Py_XDECREF(x); #endif #ifdef SIGTTOU - x = PyInt_FromLong(SIGTTOU); + x = PyLong_FromLong(SIGTTOU); PyDict_SetItemString(d, "SIGTTOU", x); Py_XDECREF(x); #endif #ifdef SIGVTALRM - x = PyInt_FromLong(SIGVTALRM); + x = PyLong_FromLong(SIGVTALRM); PyDict_SetItemString(d, "SIGVTALRM", x); Py_XDECREF(x); #endif #ifdef SIGPROF - x = PyInt_FromLong(SIGPROF); + x = PyLong_FromLong(SIGPROF); PyDict_SetItemString(d, "SIGPROF", x); Py_XDECREF(x); #endif #ifdef SIGXCPU - x = PyInt_FromLong(SIGXCPU); + x = PyLong_FromLong(SIGXCPU); PyDict_SetItemString(d, "SIGXCPU", x); Py_XDECREF(x); #endif #ifdef SIGXFSZ - x = PyInt_FromLong(SIGXFSZ); + x = PyLong_FromLong(SIGXFSZ); PyDict_SetItemString(d, "SIGXFSZ", x); Py_XDECREF(x); #endif #ifdef SIGRTMIN - x = PyInt_FromLong(SIGRTMIN); + x = PyLong_FromLong(SIGRTMIN); PyDict_SetItemString(d, "SIGRTMIN", x); Py_XDECREF(x); #endif #ifdef SIGRTMAX - x = PyInt_FromLong(SIGRTMAX); + x = PyLong_FromLong(SIGRTMAX); PyDict_SetItemString(d, "SIGRTMAX", x); Py_XDECREF(x); #endif #ifdef SIGINFO - x = PyInt_FromLong(SIGINFO); + x = PyLong_FromLong(SIGINFO); PyDict_SetItemString(d, "SIGINFO", x); Py_XDECREF(x); #endif @@ -833,23 +844,24 @@ initsignal(void) #endif #ifdef CTRL_C_EVENT - x = PyInt_FromLong(CTRL_C_EVENT); + x = PyLong_FromLong(CTRL_C_EVENT); PyDict_SetItemString(d, "CTRL_C_EVENT", x); Py_DECREF(x); #endif #ifdef CTRL_BREAK_EVENT - x = PyInt_FromLong(CTRL_BREAK_EVENT); + x = PyLong_FromLong(CTRL_BREAK_EVENT); PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x); Py_DECREF(x); #endif - if (!PyErr_Occurred()) - return; + if (PyErr_Occurred()) { + Py_DECREF(m); + m = NULL; + } - /* Check for errors */ finally: - return; + return m; } static void @@ -948,8 +960,11 @@ PyErr_SetInterrupt(void) void PyOS_InitInterrupts(void) { - initsignal(); - _PyImport_FixupExtension("signal", "signal"); + PyObject *m = PyInit_signal(); + if (m) { + _PyImport_FixupBuiltin(m, "signal"); + Py_DECREF(m); + } } void @@ -995,6 +1010,7 @@ PyOS_AfterFork(void) /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API * can be called safely. */ PyThread_ReInitTLS(); + _PyGILState_Reinit(); PyEval_ReInitThreads(); main_thread = PyThread_get_thread_ident(); main_pid = getpid(); diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 506a2d320b6..4f896fd41ea 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -20,15 +20,14 @@ Module interface: a subclass of socket.error - socket.herror: exception raised for gethostby* errors, a subclass of socket.error -- socket.fromfd(fd, family, type[, proto]) --> new socket object (created - from an existing file descriptor) - socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd') - socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...]) - socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com') - socket.getprotobyname(protocolname) --> protocol number - socket.getservbyname(servicename[, protocolname]) --> port number - socket.getservbyport(portnumber[, protocolname]) --> service name -- socket.socket([family[, type [, proto]]]) --> new socket object +- socket.socket([family[, type [, proto, fileno]]]) --> new socket object + (fileno specifies a pre-existing socket file descriptor) - socket.socketpair([family[, type [, proto]]]) --> (socket, socket) - socket.ntohs(16 bit value) --> new int object - socket.ntohl(32 bit value) --> new int object @@ -110,19 +109,18 @@ A socket object represents one endpoint of a network connection.\n\ \n\ Methods of socket objects (keyword arguments not allowed):\n\ \n\ -accept() -- accept a connection, returning new socket and client address\n\ +_accept() -- accept connection, returning new socket fd and client address\n\ bind(addr) -- bind the socket to a local address\n\ close() -- close the socket\n\ connect(addr) -- connect the socket to a remote address\n\ connect_ex(addr) -- connect, return an error code instead of an exception\n\ -dup() -- return a new socket object identical to the current one [*]\n\ +_dup() -- return a new socket fd duplicated from fileno()\n\ fileno() -- return underlying file descriptor\n\ getpeername() -- return remote address [*]\n\ getsockname() -- return local address\n\ getsockopt(level, optname[, buflen]) -- get socket options\n\ gettimeout() -- return timeout or None\n\ listen(n) -- start listening for incoming connections\n\ -makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\ recv(buflen[, flags]) -- receive data\n\ recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\ recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\ @@ -264,24 +262,14 @@ shutdown(how) -- shut down traffic in one or both directions\n\ # include <netdb.h> /* Headers needed for inet_ntoa() and inet_addr() */ -# ifdef __BEOS__ -# include <net/netdb.h> -# elif defined(PYOS_OS2) && defined(PYCC_VACPP) +# if defined(PYOS_OS2) && defined(PYCC_VACPP) # include <netdb.h> typedef size_t socklen_t; # else # include <arpa/inet.h> # endif -# ifndef RISCOS # include <fcntl.h> -# else -# include <sys/ioctl.h> -# include <socklib.h> -# define NO_DUP -int h_errno; /* not used */ -# define INET_ADDRSTRLEN 16 -# endif #else @@ -358,11 +346,23 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); #include "getnameinfo.c" #endif -#if defined(MS_WINDOWS) || defined(__BEOS__) -/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */ -/* seem to be a few differences in the API */ +#ifdef MS_WINDOWS +/* On Windows a socket is really a handle not an fd */ +static SOCKET +dup_socket(SOCKET handle) +{ + WSAPROTOCOL_INFO info; + + if (WSADuplicateSocket(handle, GetCurrentProcessId(), &info)) + return INVALID_SOCKET; + + return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, + FROM_PROTOCOL_INFO, &info, 0, 0); +} #define SOCKETCLOSE closesocket -#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */ +#else +/* On Unix we can use dup to duplicate the file descriptor of a socket*/ +#define dup_socket(fd) dup(fd) #endif #ifdef MS_WIN32 @@ -429,6 +429,10 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); #define NI_MAXSERV 32 #endif +#ifndef INVALID_SOCKET /* MS defines this */ +#define INVALID_SOCKET (-1) +#endif + /* XXX There's a problem here: *static* functions are not supposed to have a Py prefix (or use CapitalizedWords). Later... */ @@ -439,11 +443,6 @@ static PyObject *socket_herror; static PyObject *socket_gaierror; static PyObject *socket_timeout; -#ifdef RISCOS -/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */ -static int taskwindow; -#endif - /* A forward reference to the socket type object. The sock_type variable contains pointers to various functions, some of which call new_sockobject(), which uses sock_type, so @@ -473,6 +472,17 @@ select_error(void) return NULL; } +#ifdef MS_WINDOWS +#ifndef WSAEAGAIN +#define WSAEAGAIN WSAEWOULDBLOCK +#endif +#define CHECK_ERRNO(expected) \ + (WSAGetLastError() == WSA ## expected) +#else +#define CHECK_ERRNO(expected) \ + (errno == expected) +#endif + /* Convenience function to raise an error according to errno and return a NULL pointer from a function. */ @@ -524,18 +534,6 @@ set_error(void) } #endif -#if defined(RISCOS) - if (_inet_error.errnum != NULL) { - PyObject *v; - v = Py_BuildValue("(is)", errno, _inet_err()); - if (v != NULL) { - PyErr_SetObject(socket_error, v); - Py_DECREF(v); - } - return NULL; - } -#endif - return PyErr_SetFromErrno(socket_error); } @@ -612,19 +610,17 @@ sendsegmented(int sock_fd, char *buf, int len, int flags) static int internal_setblocking(PySocketSockObject *s, int block) { -#ifndef RISCOS #ifndef MS_WINDOWS int delay_flag; #endif +#ifdef SOCK_NONBLOCK + if (block) + s->sock_type &= (~SOCK_NONBLOCK); + else + s->sock_type |= SOCK_NONBLOCK; #endif Py_BEGIN_ALLOW_THREADS -#ifdef __BEOS__ - block = !block; - setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK, - (void *)(&block), sizeof(int)); -#else -#ifndef RISCOS #ifndef MS_WINDOWS #if defined(PYOS_OS2) && !defined(PYCC_GCC) block = !block; @@ -644,11 +640,6 @@ internal_setblocking(PySocketSockObject *s, int block) block = !block; ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block); #endif /* MS_WINDOWS */ -#else /* RISCOS */ - block = !block; - socketioctl(s->sock_fd, FIONBIO, (u_long*)&block); -#endif /* RISCOS */ -#endif /* __BEOS__ */ Py_END_ALLOW_THREADS /* Since these don't return anything */ @@ -661,7 +652,7 @@ internal_setblocking(PySocketSockObject *s, int block) after they've reacquired the interpreter lock. Returns 1 on timeout, -1 on error, 0 otherwise. */ static int -internal_select(PySocketSockObject *s, int writing) +internal_select_ex(PySocketSockObject *s, int writing, double interval) { int n; @@ -673,6 +664,10 @@ internal_select(PySocketSockObject *s, int writing) if (s->sock_fd < 0) return 0; + /* Handling this condition here simplifies the select loops */ + if (interval < 0.0) + return 1; + /* Prefer poll, if available, since you can poll() any fd * which can't be done with select(). */ #ifdef HAVE_POLL @@ -684,7 +679,7 @@ internal_select(PySocketSockObject *s, int writing) pollfd.events = writing ? POLLOUT : POLLIN; /* s->sock_timeout is in seconds, timeout in ms */ - timeout = (int)(s->sock_timeout * 1000 + 0.5); + timeout = (int)(interval * 1000 + 0.5); n = poll(&pollfd, 1, timeout); } #else @@ -692,16 +687,18 @@ internal_select(PySocketSockObject *s, int writing) /* Construct the arguments to select */ fd_set fds; struct timeval tv; - tv.tv_sec = (int)s->sock_timeout; - tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6); + tv.tv_sec = (int)interval; + tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6); FD_ZERO(&fds); FD_SET(s->sock_fd, &fds); /* See if the socket is ready */ if (writing) - n = select(s->sock_fd+1, NULL, &fds, NULL, &tv); + n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int), + NULL, &fds, NULL, &tv); else - n = select(s->sock_fd+1, &fds, NULL, NULL, &tv); + n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int), + &fds, NULL, NULL, &tv); } #endif @@ -712,32 +709,78 @@ internal_select(PySocketSockObject *s, int writing) return 0; } +static int +internal_select(PySocketSockObject *s, int writing) +{ + return internal_select_ex(s, writing, s->sock_timeout); +} + +/* + Two macros for automatic retry of select() in case of false positives + (for example, select() could indicate a socket is ready for reading + but the data then discarded by the OS because of a wrong checksum). + Here is an example of use: + + BEGIN_SELECT_LOOP(s) + Py_BEGIN_ALLOW_THREADS + timeout = internal_select_ex(s, 0, interval); + if (!timeout) + outlen = recv(s->sock_fd, cbuf, len, flags); + Py_END_ALLOW_THREADS + if (timeout == 1) { + PyErr_SetString(socket_timeout, "timed out"); + return -1; + } + END_SELECT_LOOP(s) +*/ + +#define BEGIN_SELECT_LOOP(s) \ + { \ + _PyTime_timeval now, deadline = {0, 0}; \ + double interval = s->sock_timeout; \ + int has_timeout = s->sock_timeout > 0.0; \ + if (has_timeout) { \ + _PyTime_gettimeofday(&now); \ + deadline = now; \ + _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \ + } \ + while (1) { \ + errno = 0; \ + +#define END_SELECT_LOOP(s) \ + if (!has_timeout || \ + (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \ + break; \ + _PyTime_gettimeofday(&now); \ + interval = _PyTime_INTERVAL(now, deadline); \ + } \ + } \ + /* Initialize a new socket object. */ static double defaulttimeout = -1.0; /* Default timeout for new sockets */ -PyMODINIT_FUNC +static void init_sockobject(PySocketSockObject *s, SOCKET_T fd, int family, int type, int proto) { -#ifdef RISCOS - int block = 1; -#endif s->sock_fd = fd; s->sock_family = family; s->sock_type = type; s->sock_proto = proto; - s->sock_timeout = defaulttimeout; s->errorhandler = &set_error; - - if (defaulttimeout >= 0.0) - internal_setblocking(s, 0); - -#ifdef RISCOS - if (taskwindow) - socketioctl(s->sock_fd, 0x80046679, (u_long*)&block); +#ifdef SOCK_NONBLOCK + if (type & SOCK_NONBLOCK) + s->sock_timeout = 0.0; + else #endif + { + s->sock_timeout = defaulttimeout; + if (defaulttimeout >= 0.0) + internal_setblocking(s, 0); + } + } @@ -909,7 +952,7 @@ makeipaddr(struct sockaddr *addr, int addrlen) set_gaierror(error); return NULL; } - return PyString_FromString(buf); + return PyUnicode_FromString(buf); } @@ -953,7 +996,7 @@ makebdaddr(bdaddr_t *bdaddr) sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", bdaddr->b[5], bdaddr->b[4], bdaddr->b[3], bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]); - return PyString_FromString(buf); + return PyUnicode_FromString(buf); } #endif @@ -965,7 +1008,7 @@ makebdaddr(bdaddr_t *bdaddr) /*ARGSUSED*/ static PyObject * -makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto) +makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) { if (addrlen == 0) { /* No address -- may be recvfrom() from known socket */ @@ -973,11 +1016,6 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto) return Py_None; } -#ifdef __BEOS__ - /* XXX: BeOS version of accept() doesn't set family correctly */ - addr->sa_family = AF_INET; -#endif - switch (addr->sa_family) { case AF_INET: @@ -1000,14 +1038,13 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto) #ifdef linux if (a->sun_path[0] == 0) { /* Linux abstract namespace */ addrlen -= offsetof(struct sockaddr_un, sun_path); - return PyString_FromStringAndSize(a->sun_path, - addrlen); + return PyBytes_FromStringAndSize(a->sun_path, addrlen); } else #endif /* linux */ { /* regular NULL-terminated string */ - return PyString_FromString(a->sun_path); + return PyUnicode_FromString(a->sun_path); } } #endif /* AF_UNIX */ @@ -1110,7 +1147,7 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto) if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0) ifname = ifr.ifr_name; } - return Py_BuildValue("shbhs#", + return Py_BuildValue("shbhy#", ifname, ntohs(a->sll_protocol), a->sll_pkttype, @@ -1157,8 +1194,8 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto) default: /* If we don't know the address family, don't raise an - exception -- return it as a tuple. */ - return Py_BuildValue("is#", + exception -- return it as an (int, bytes) tuple. */ + return Py_BuildValue("iy#", addr->sa_family, addr->sa_data, sizeof(addr->sa_data)); @@ -1184,7 +1221,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, struct sockaddr_un* addr; char *path; int len; - if (!PyArg_Parse(args, "t#", &path, &len)) + if (!PyArg_Parse(args, "s#", &path, &len)) return 0; addr = (struct sockaddr_un*)addr_ret; @@ -1372,9 +1409,9 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, { struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret; #if defined(__NetBSD__) || defined(__DragonFly__) - char *straddr = PyBytes_AS_STRING(args); + char *straddr = PyBytes_AS_STRING(args); - _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; + _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; if (straddr == NULL) { PyErr_SetString(socket_error, "getsockaddrarg: " "wrong format"); @@ -1401,12 +1438,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, addr = (struct sockaddr_sco *)addr_ret; _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; - straddr = PyString_AsString(args); - if (straddr == NULL) { + if (!PyBytes_Check(args)) { PyErr_SetString(socket_error, "getsockaddrarg: " "wrong format"); return 0; } + straddr = PyBytes_AS_STRING(args); if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0) return 0; @@ -1441,7 +1478,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, Py_TYPE(args)->tp_name); return 0; } - if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName, + if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName, &protoNumber, &pkttype, &hatype, &haddr, &halen)) return 0; @@ -1630,61 +1667,48 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) } -/* s.accept() method */ +/* s._accept() -> (fd, address) */ static PyObject * sock_accept(PySocketSockObject *s) { sock_addr_t addrbuf; - SOCKET_T newfd; + SOCKET_T newfd = INVALID_SOCKET; socklen_t addrlen; PyObject *sock = NULL; PyObject *addr = NULL; PyObject *res = NULL; int timeout; - if (!getsockaddrlen(s, &addrlen)) return NULL; memset(&addrbuf, 0, addrlen); -#ifdef MS_WINDOWS - newfd = INVALID_SOCKET; -#else - newfd = -1; -#endif - if (!IS_SELECTABLE(s)) return select_error(); + BEGIN_SELECT_LOOP(s) Py_BEGIN_ALLOW_THREADS - timeout = internal_select(s, 0); - if (!timeout) + timeout = internal_select_ex(s, 0, interval); + if (!timeout) { newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen); + } Py_END_ALLOW_THREADS if (timeout == 1) { PyErr_SetString(socket_timeout, "timed out"); return NULL; } + END_SELECT_LOOP(s) -#ifdef MS_WINDOWS if (newfd == INVALID_SOCKET) -#else - if (newfd < 0) -#endif return s->errorhandler(); - /* Create the new object with unspecified family, - to avoid calls to bind() etc. on it. */ - sock = (PyObject *) new_sockobject(newfd, - s->sock_family, - s->sock_type, - s->sock_proto); - + sock = PyLong_FromSocket_t(newfd); if (sock == NULL) { SOCKETCLOSE(newfd); goto finally; } + addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen, s->sock_proto); if (addr == NULL) @@ -1699,11 +1723,11 @@ finally: } PyDoc_STRVAR(accept_doc, -"accept() -> (socket object, address info)\n\ +"_accept() -> (integer, address info)\n\ \n\ -Wait for an incoming connection. Return a new socket representing the\n\ -connection, and the address of the client. For IP sockets, the address\n\ -info is a pair (hostaddr, port)."); +Wait for an incoming connection. Return a new socket file descriptor\n\ +representing the connection, and the address of the client.\n\ +For IP sockets, the address info is a pair (hostaddr, port)."); /* s.setblocking(flag) method. Argument: False -- non-blocking mode; same as settimeout(0) @@ -1715,7 +1739,7 @@ sock_setblocking(PySocketSockObject *s, PyObject *arg) { int block; - block = PyInt_AsLong(arg); + block = PyLong_AsLong(arg); if (block == -1 && PyErr_Occurred()) return NULL; @@ -1791,30 +1815,6 @@ Returns the timeout in seconds (float) associated with socket \n\ operations. A timeout of None indicates that timeouts on socket \n\ operations are disabled."); -#ifdef RISCOS -/* s.sleeptaskw(1 | 0) method */ - -static PyObject * -sock_sleeptaskw(PySocketSockObject *s,PyObject *arg) -{ - int block; - block = PyInt_AsLong(arg); - if (block == -1 && PyErr_Occurred()) - return NULL; - Py_BEGIN_ALLOW_THREADS - socketioctl(s->sock_fd, 0x80046679, (u_long*)&block); - Py_END_ALLOW_THREADS - - Py_INCREF(Py_None); - return Py_None; -} -PyDoc_STRVAR(sleeptaskw_doc, -"sleeptaskw(flag)\n\ -\n\ -Allow sleeps in taskwindows."); -#endif - - /* s.setsockopt() method. With an integer third argument, sets an integer option. With a string third argument, sets an option from a buffer; @@ -1837,7 +1837,7 @@ sock_setsockopt(PySocketSockObject *s, PyObject *args) } else { PyErr_Clear(); - if (!PyArg_ParseTuple(args, "iis#:setsockopt", + if (!PyArg_ParseTuple(args, "iiy#:setsockopt", &level, &optname, &buf, &buflen)) return NULL; } @@ -1869,12 +1869,6 @@ sock_getsockopt(PySocketSockObject *s, PyObject *args) PyObject *buf; socklen_t buflen = 0; -#ifdef __BEOS__ - /* We have incomplete socket support. */ - PyErr_SetString(socket_error, "getsockopt not supported"); - return NULL; -#else - if (!PyArg_ParseTuple(args, "ii|i:getsockopt", &level, &optname, &buflen)) return NULL; @@ -1886,7 +1880,7 @@ sock_getsockopt(PySocketSockObject *s, PyObject *args) (void *)&flag, &flagsize); if (res < 0) return s->errorhandler(); - return PyInt_FromLong(flag); + return PyLong_FromLong(flag); } #ifdef __VMS /* socklen_t is unsigned so no negative test is needed, @@ -1899,18 +1893,17 @@ sock_getsockopt(PySocketSockObject *s, PyObject *args) "getsockopt buflen out of range"); return NULL; } - buf = PyString_FromStringAndSize((char *)NULL, buflen); + buf = PyBytes_FromStringAndSize((char *)NULL, buflen); if (buf == NULL) return NULL; res = getsockopt(s->sock_fd, level, optname, - (void *)PyString_AS_STRING(buf), &buflen); + (void *)PyBytes_AS_STRING(buf), &buflen); if (res < 0) { Py_DECREF(buf); return s->errorhandler(); } - _PyString_Resize(&buf, buflen); + _PyBytes_Resize(&buf, buflen); return buf; -#endif /* __BEOS__ */ } PyDoc_STRVAR(getsockopt_doc, @@ -1973,6 +1966,21 @@ PyDoc_STRVAR(close_doc, \n\ Close the socket. It cannot be used after this call."); +static PyObject * +sock_detach(PySocketSockObject *s) +{ + SOCKET_T fd = s->sock_fd; + s->sock_fd = -1; + return PyLong_FromSocket_t(fd); +} + +PyDoc_STRVAR(detach_doc, +"detach()\n\ +\n\ +Close the socket object without closing the underlying file descriptor.\ +The object cannot be used after this call, but the file descriptor\ +can be reused for other purposes. The file descriptor is returned."); + static int internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen, int *timeoutp) @@ -1997,13 +2005,14 @@ internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen, FD_SET(s->sock_fd, &fds); FD_ZERO(&fds_exc); FD_SET(s->sock_fd, &fds_exc); - res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv); + res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int), + NULL, &fds, &fds_exc, &tv); if (res == 0) { res = WSAEWOULDBLOCK; timeout = 1; } else if (res > 0) { if (FD_ISSET(s->sock_fd, &fds)) - /* The socket is in the writeable set - this + /* The socket is in the writable set - this means connected */ res = 0; else { @@ -2119,7 +2128,7 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro) return NULL; #endif - return PyInt_FromLong((long) res); + return PyLong_FromLong((long) res); } PyDoc_STRVAR(connect_ex_doc, @@ -2134,11 +2143,7 @@ instead of raising an exception when an error occurs."); static PyObject * sock_fileno(PySocketSockObject *s) { -#if SIZEOF_SOCKET_T <= SIZEOF_LONG - return PyInt_FromLong((long) s->sock_fd); -#else - return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd); -#endif + return PyLong_FromSocket_t(s->sock_fd); } PyDoc_STRVAR(fileno_doc, @@ -2147,35 +2152,6 @@ PyDoc_STRVAR(fileno_doc, Return the integer file descriptor of the socket."); -#ifndef NO_DUP -/* s.dup() method */ - -static PyObject * -sock_dup(PySocketSockObject *s) -{ - SOCKET_T newfd; - PyObject *sock; - - newfd = dup(s->sock_fd); - if (newfd < 0) - return s->errorhandler(); - sock = (PyObject *) new_sockobject(newfd, - s->sock_family, - s->sock_type, - s->sock_proto); - if (sock == NULL) - SOCKETCLOSE(newfd); - return sock; -} - -PyDoc_STRVAR(dup_doc, -"dup() -> socket object\n\ -\n\ -Return a new socket object connected to the same system resource."); - -#endif - - /* s.getsockname() method */ static PyObject * @@ -2243,7 +2219,7 @@ sock_listen(PySocketSockObject *s, PyObject *arg) int backlog; int res; - backlog = PyInt_AsLong(arg); + backlog = PyLong_AsLong(arg); if (backlog == -1 && PyErr_Occurred()) return NULL; Py_BEGIN_ALLOW_THREADS @@ -2268,69 +2244,6 @@ unaccepted connections that the system will allow before refusing new\n\ connections."); -#ifndef NO_DUP -/* s.makefile(mode) method. - Create a new open file object referring to a dupped version of - the socket's file descriptor. (The dup() call is necessary so - that the open file and socket objects may be closed independent - of each other.) - The mode argument specifies 'r' or 'w' passed to fdopen(). */ - -static PyObject * -sock_makefile(PySocketSockObject *s, PyObject *args) -{ - extern int fclose(FILE *); - char *mode = "r"; - int bufsize = -1; -#ifdef MS_WIN32 - Py_intptr_t fd; -#else - int fd; -#endif - FILE *fp; - PyObject *f; -#ifdef __VMS - char *mode_r = "r"; - char *mode_w = "w"; -#endif - - if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize)) - return NULL; -#ifdef __VMS - if (strcmp(mode,"rb") == 0) { - mode = mode_r; - } - else { - if (strcmp(mode,"wb") == 0) { - mode = mode_w; - } - } -#endif -#ifdef MS_WIN32 - if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) || - ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) -#else - if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL) -#endif - { - if (fd >= 0) - SOCKETCLOSE(fd); - return s->errorhandler(); - } - f = PyFile_FromFile(fp, "<socket>", mode, fclose); - if (f != NULL) - PyFile_SetBufSize(f, bufsize); - return f; -} - -PyDoc_STRVAR(makefile_doc, -"makefile([mode[, buffersize]]) -> file object\n\ -\n\ -Return a regular file object corresponding to the socket.\n\ -The mode and buffersize arguments are as for the built-in open() function."); - -#endif /* NO_DUP */ - /* * This is the guts of the recv() and recv_into() methods, which reads into a * char buffer. If you have any inc/dec ref to do to the objects that contain @@ -2339,10 +2252,11 @@ The mode and buffersize arguments are as for the built-in open() function."); * also possible that we return a number of bytes smaller than the request * bytes. */ -static ssize_t -sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags) + +static Py_ssize_t +sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags) { - ssize_t outlen = -1; + Py_ssize_t outlen = -1; int timeout; #ifdef __VMS int remaining; @@ -2353,10 +2267,15 @@ sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags) select_error(); return -1; } + if (len == 0) { + /* If 0 bytes were requested, do nothing. */ + return 0; + } #ifndef __VMS + BEGIN_SELECT_LOOP(s) Py_BEGIN_ALLOW_THREADS - timeout = internal_select(s, 0); + timeout = internal_select_ex(s, 0, interval); if (!timeout) outlen = recv(s->sock_fd, cbuf, len, flags); Py_END_ALLOW_THREADS @@ -2365,6 +2284,7 @@ sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags) PyErr_SetString(socket_timeout, "timed out"); return -1; } + END_SELECT_LOOP(s) if (outlen < 0) { /* Note: the call to errorhandler() ALWAYS indirectly returned NULL, so ignore its return value */ @@ -2386,16 +2306,18 @@ sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags) segment = remaining; } + BEGIN_SELECT_LOOP(s) Py_BEGIN_ALLOW_THREADS - timeout = internal_select(s, 0); + timeout = internal_select_ex(s, 0, interval); if (!timeout) nread = recv(s->sock_fd, read_buf, segment, flags); Py_END_ALLOW_THREADS - if (timeout == 1) { PyErr_SetString(socket_timeout, "timed out"); return -1; } + END_SELECT_LOOP(s) + if (nread < 0) { s->errorhandler(); return -1; @@ -2420,11 +2342,11 @@ sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags) static PyObject * sock_recv(PySocketSockObject *s, PyObject *args) { - int recvlen, flags = 0; - ssize_t outlen; + Py_ssize_t recvlen, outlen; + int flags = 0; PyObject *buf; - if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags)) + if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags)) return NULL; if (recvlen < 0) { @@ -2434,12 +2356,12 @@ sock_recv(PySocketSockObject *s, PyObject *args) } /* Allocate a new string. */ - buf = PyString_FromStringAndSize((char *) 0, recvlen); + buf = PyBytes_FromStringAndSize((char *) 0, recvlen); if (buf == NULL) return NULL; /* Call the guts */ - outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags); + outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags); if (outlen < 0) { /* An error occurred, release the string and return an error. */ @@ -2449,9 +2371,7 @@ sock_recv(PySocketSockObject *s, PyObject *args) if (outlen != recvlen) { /* We did not read as many bytes as we anticipated, resize the string if possible and be successful. */ - if (_PyString_Resize(&buf, outlen) < 0) - /* Oopsy, not so successful after all. */ - return NULL; + _PyBytes_Resize(&buf, outlen); } return buf; @@ -2473,22 +2393,23 @@ sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"buffer", "nbytes", "flags", 0}; - int recvlen = 0, flags = 0; - ssize_t readlen; - Py_buffer buf; - Py_ssize_t buflen; + int flags = 0; + Py_buffer pbuf; + char *buf; + Py_ssize_t buflen, readlen, recvlen = 0; /* Get the buffer's memory */ - if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist, - &buf, &recvlen, &flags)) + if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist, + &pbuf, &recvlen, &flags)) return NULL; - buflen = buf.len; - assert(buf.buf != 0 && buflen > 0); + buf = pbuf.buf; + buflen = pbuf.len; if (recvlen < 0) { + PyBuffer_Release(&pbuf); PyErr_SetString(PyExc_ValueError, "negative buffersize in recv_into"); - goto error; + return NULL; } if (recvlen == 0) { /* If nbytes was not specified, use the buffer's length */ @@ -2497,26 +2418,24 @@ sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds) /* Check if the buffer is large enough */ if (buflen < recvlen) { + PyBuffer_Release(&pbuf); PyErr_SetString(PyExc_ValueError, "buffer too small for requested bytes"); - goto error; + return NULL; } /* Call the guts */ - readlen = sock_recv_guts(s, buf.buf, recvlen, flags); + readlen = sock_recv_guts(s, buf, recvlen, flags); if (readlen < 0) { /* Return an error. */ - goto error; + PyBuffer_Release(&pbuf); + return NULL; } - PyBuffer_Release(&buf); + PyBuffer_Release(&pbuf); /* Return the number of bytes read. Note that we do not do anything special here in the case that readlen < recvlen. */ - return PyInt_FromSsize_t(readlen); - -error: - PyBuffer_Release(&buf); - return NULL; + return PyLong_FromSsize_t(readlen); } PyDoc_STRVAR(recv_into_doc, @@ -2540,13 +2459,13 @@ See recv() for documentation about the flags."); * 'addr' is a return value for the address object. Note that you must decref * it yourself. */ -static ssize_t -sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags, +static Py_ssize_t +sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags, PyObject** addr) { sock_addr_t addrbuf; int timeout; - ssize_t n = -1; + Py_ssize_t n = -1; socklen_t addrlen; *addr = NULL; @@ -2559,9 +2478,10 @@ sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags, return -1; } + BEGIN_SELECT_LOOP(s) Py_BEGIN_ALLOW_THREADS memset(&addrbuf, 0, addrlen); - timeout = internal_select(s, 0); + timeout = internal_select_ex(s, 0, interval); if (!timeout) { #ifndef MS_WINDOWS #if defined(PYOS_OS2) && !defined(PYCC_GCC) @@ -2582,6 +2502,7 @@ sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags, PyErr_SetString(socket_timeout, "timed out"); return -1; } + END_SELECT_LOOP(s) if (n < 0) { s->errorhandler(); return -1; @@ -2602,10 +2523,10 @@ sock_recvfrom(PySocketSockObject *s, PyObject *args) PyObject *buf = NULL; PyObject *addr = NULL; PyObject *ret = NULL; - int recvlen, flags = 0; - ssize_t outlen; + int flags = 0; + Py_ssize_t recvlen, outlen; - if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags)) + if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags)) return NULL; if (recvlen < 0) { @@ -2614,11 +2535,11 @@ sock_recvfrom(PySocketSockObject *s, PyObject *args) return NULL; } - buf = PyString_FromStringAndSize((char *) 0, recvlen); + buf = PyBytes_FromStringAndSize((char *) 0, recvlen); if (buf == NULL) return NULL; - outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf), + outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf), recvlen, flags, &addr); if (outlen < 0) { goto finally; @@ -2627,7 +2548,7 @@ sock_recvfrom(PySocketSockObject *s, PyObject *args) if (outlen != recvlen) { /* We did not read as many bytes as we anticipated, resize the string if possible and be successful. */ - if (_PyString_Resize(&buf, outlen) < 0) + if (_PyBytes_Resize(&buf, outlen) < 0) /* Oopsy, not so successful after all. */ goto finally; } @@ -2653,45 +2574,44 @@ sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds) { static char *kwlist[] = {"buffer", "nbytes", "flags", 0}; - int recvlen = 0, flags = 0; - ssize_t readlen; - Py_buffer buf; - int buflen; + int flags = 0; + Py_buffer pbuf; + char *buf; + Py_ssize_t readlen, buflen, recvlen = 0; PyObject *addr = NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into", - kwlist, &buf, + if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into", + kwlist, &pbuf, &recvlen, &flags)) return NULL; - buflen = buf.len; - assert(buf.buf != 0 && buflen > 0); + buf = pbuf.buf; + buflen = pbuf.len; + assert(buf != 0 && buflen > 0); if (recvlen < 0) { + PyBuffer_Release(&pbuf); PyErr_SetString(PyExc_ValueError, "negative buffersize in recvfrom_into"); - goto error; + return NULL; } if (recvlen == 0) { /* If nbytes was not specified, use the buffer's length */ recvlen = buflen; } - readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr); + readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr); if (readlen < 0) { + PyBuffer_Release(&pbuf); /* Return an error */ - goto error; + Py_XDECREF(addr); + return NULL; } - PyBuffer_Release(&buf); + PyBuffer_Release(&pbuf); /* Return the number of bytes read and the address. Note that we do not do anything special here in the case that readlen < recvlen. */ - return Py_BuildValue("lN", readlen, addr); - -error: - Py_XDECREF(addr); - PyBuffer_Release(&buf); - return NULL; + return Py_BuildValue("nN", readlen, addr); } PyDoc_STRVAR(recvfrom_into_doc, @@ -2706,10 +2626,11 @@ static PyObject * sock_send(PySocketSockObject *s, PyObject *args) { char *buf; - int len, n = -1, flags = 0, timeout; + Py_ssize_t len, n = -1; + int flags = 0, timeout; Py_buffer pbuf; - if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags)) + if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags)) return NULL; if (!IS_SELECTABLE(s)) { @@ -2719,8 +2640,9 @@ sock_send(PySocketSockObject *s, PyObject *args) buf = pbuf.buf; len = pbuf.len; + BEGIN_SELECT_LOOP(s) Py_BEGIN_ALLOW_THREADS - timeout = internal_select(s, 1); + timeout = internal_select_ex(s, 1, interval); if (!timeout) #ifdef __VMS n = sendsegmented(s->sock_fd, buf, len, flags); @@ -2728,16 +2650,17 @@ sock_send(PySocketSockObject *s, PyObject *args) n = send(s->sock_fd, buf, len, flags); #endif Py_END_ALLOW_THREADS - - PyBuffer_Release(&pbuf); - if (timeout == 1) { + PyBuffer_Release(&pbuf); PyErr_SetString(socket_timeout, "timed out"); return NULL; } + END_SELECT_LOOP(s) + + PyBuffer_Release(&pbuf); if (n < 0) return s->errorhandler(); - return PyInt_FromLong((long)n); + return PyLong_FromSsize_t(n); } PyDoc_STRVAR(send_doc, @@ -2754,10 +2677,11 @@ static PyObject * sock_sendall(PySocketSockObject *s, PyObject *args) { char *buf; - int len, n = -1, flags = 0, timeout, saved_errno; + Py_ssize_t len, n = -1; + int flags = 0, timeout, saved_errno; Py_buffer pbuf; - if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags)) + if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags)) return NULL; buf = pbuf.buf; len = pbuf.len; @@ -2829,23 +2753,24 @@ sock_sendto(PySocketSockObject *s, PyObject *args) Py_buffer pbuf; PyObject *addro; char *buf; - Py_ssize_t len; + Py_ssize_t len, arglen; sock_addr_t addrbuf; int addrlen, n = -1, flags, timeout; - int arglen; flags = 0; arglen = PyTuple_Size(args); - switch(arglen) { + switch (arglen) { case 2: - PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro); + PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro); break; case 3: - PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro); + PyArg_ParseTuple(args, "y*iO:sendto", + &pbuf, &flags, &addro); break; default: - PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3" - " arguments (%d given)", arglen); + PyErr_Format(PyExc_TypeError, + "sendto() takes 2 or 3 arguments (%d given)", + arglen); } if (PyErr_Occurred()) return NULL; @@ -2863,20 +2788,23 @@ sock_sendto(PySocketSockObject *s, PyObject *args) return NULL; } + BEGIN_SELECT_LOOP(s) Py_BEGIN_ALLOW_THREADS - timeout = internal_select(s, 1); + timeout = internal_select_ex(s, 1, interval); if (!timeout) n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen); Py_END_ALLOW_THREADS - PyBuffer_Release(&pbuf); if (timeout == 1) { + PyBuffer_Release(&pbuf); PyErr_SetString(socket_timeout, "timed out"); return NULL; } + END_SELECT_LOOP(s) + PyBuffer_Release(&pbuf); if (n < 0) return s->errorhandler(); - return PyInt_FromLong((long)n); + return PyLong_FromSsize_t(n); } PyDoc_STRVAR(sendto_doc, @@ -2894,7 +2822,7 @@ sock_shutdown(PySocketSockObject *s, PyObject *arg) int how; int res; - how = PyInt_AsLong(arg); + how = PyLong_AsLong(arg); if (how == -1 && PyErr_Occurred()) return NULL; Py_BEGIN_ALLOW_THREADS @@ -2960,7 +2888,7 @@ SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval)."); /* List of methods for socket objects */ static PyMethodDef sock_methods[] = { - {"accept", (PyCFunction)sock_accept, METH_NOARGS, + {"_accept", (PyCFunction)sock_accept, METH_NOARGS, accept_doc}, {"bind", (PyCFunction)sock_bind, METH_O, bind_doc}, @@ -2970,10 +2898,8 @@ static PyMethodDef sock_methods[] = { connect_doc}, {"connect_ex", (PyCFunction)sock_connect_ex, METH_O, connect_ex_doc}, -#ifndef NO_DUP - {"dup", (PyCFunction)sock_dup, METH_NOARGS, - dup_doc}, -#endif + {"detach", (PyCFunction)sock_detach, METH_NOARGS, + detach_doc}, {"fileno", (PyCFunction)sock_fileno, METH_NOARGS, fileno_doc}, #ifdef HAVE_GETPEERNAME @@ -2990,10 +2916,6 @@ static PyMethodDef sock_methods[] = { #endif {"listen", (PyCFunction)sock_listen, METH_O, listen_doc}, -#ifndef NO_DUP - {"makefile", (PyCFunction)sock_makefile, METH_VARARGS, - makefile_doc}, -#endif {"recv", (PyCFunction)sock_recv, METH_VARARGS, recv_doc}, {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS, @@ -3018,10 +2940,6 @@ static PyMethodDef sock_methods[] = { setsockopt_doc}, {"shutdown", (PyCFunction)sock_shutdown, METH_O, shutdown_doc}, -#ifdef RISCOS - {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O, - sleeptaskw_doc}, -#endif {NULL, NULL} /* sentinel */ }; @@ -3040,8 +2958,20 @@ static PyMemberDef sock_memberlist[] = { static void sock_dealloc(PySocketSockObject *s) { - if (s->sock_fd != -1) + if (s->sock_fd != -1) { + PyObject *exc, *val, *tb; + Py_ssize_t old_refcount = Py_REFCNT(s); + ++Py_REFCNT(s); + PyErr_Fetch(&exc, &val, &tb); + if (PyErr_WarnFormat(PyExc_ResourceWarning, 1, + "unclosed %R", s)) + /* Spurious errors can appear at shutdown */ + if (PyErr_ExceptionMatches(PyExc_Warning)) + PyErr_WriteUnraisable((PyObject *) s); + PyErr_Restore(exc, val, tb); (void) SOCKETCLOSE(s->sock_fd); + Py_REFCNT(s) = old_refcount; + } Py_TYPE(s)->tp_free((PyObject *)s); } @@ -3049,7 +2979,6 @@ sock_dealloc(PySocketSockObject *s) static PyObject * sock_repr(PySocketSockObject *s) { - char buf[512]; #if SIZEOF_SOCKET_T > SIZEOF_LONG if (s->sock_fd > LONG_MAX) { /* this can occur on Win64, and actually there is a special @@ -3061,13 +2990,11 @@ sock_repr(PySocketSockObject *s) return NULL; } #endif - PyOS_snprintf( - buf, sizeof(buf), - "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>", + return PyUnicode_FromFormat( + "<socket object, fd=%ld, family=%d, type=%d, proto=%d>", (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto); - return PyString_FromString(buf); } @@ -3095,27 +3022,35 @@ static int sock_initobj(PyObject *self, PyObject *args, PyObject *kwds) { PySocketSockObject *s = (PySocketSockObject *)self; - SOCKET_T fd; + PyObject *fdobj = NULL; + SOCKET_T fd = INVALID_SOCKET; int family = AF_INET, type = SOCK_STREAM, proto = 0; - static char *keywords[] = {"family", "type", "proto", 0}; + static char *keywords[] = {"family", "type", "proto", "fileno", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "|iii:socket", keywords, - &family, &type, &proto)) + "|iiiO:socket", keywords, + &family, &type, &proto, &fdobj)) return -1; - Py_BEGIN_ALLOW_THREADS - fd = socket(family, type, proto); - Py_END_ALLOW_THREADS + if (fdobj != NULL && fdobj != Py_None) { + fd = PyLong_AsSocket_t(fdobj); + if (fd == (SOCKET_T)(-1) && PyErr_Occurred()) + return -1; + if (fd == INVALID_SOCKET) { + PyErr_SetString(PyExc_ValueError, + "can't use invalid socket value"); + return -1; + } + } + else { + Py_BEGIN_ALLOW_THREADS + fd = socket(family, type, proto); + Py_END_ALLOW_THREADS -#ifdef MS_WINDOWS - if (fd == INVALID_SOCKET) -#else - if (fd < 0) -#endif - { - set_error(); - return -1; + if (fd == INVALID_SOCKET) { + set_error(); + return -1; + } } init_sockobject(s, fd, family, type, proto); @@ -3135,7 +3070,7 @@ static PyTypeObject sock_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)sock_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -3175,6 +3110,31 @@ static PyTypeObject sock_type = { static PyObject * socket_gethostname(PyObject *self, PyObject *unused) { +#ifdef MS_WINDOWS + /* Don't use winsock's gethostname, as this returns the ANSI + version of the hostname, whereas we need a Unicode string. + Otherwise, gethostname apparently also returns the DNS name. */ + wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD size = sizeof(buf) / sizeof(wchar_t); + PyObject *result; + if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) { + if (GetLastError() == ERROR_MORE_DATA) { + /* MSDN says this may occur "because DNS allows longer names */ + if (size == 0) /* XXX: I'm not sure how to handle this */ + return PyUnicode_FromUnicode(NULL, 0); + result = PyUnicode_FromUnicode(NULL, size - 1); + if (!result) + return NULL; + if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, + PyUnicode_AS_UNICODE(result), + &size)) + return result; + Py_DECREF(result); + } + return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError()); + } + return PyUnicode_FromUnicode(buf, size); +#else char buf[1024]; int res; Py_BEGIN_ALLOW_THREADS @@ -3183,7 +3143,8 @@ socket_gethostname(PyObject *self, PyObject *unused) if (res < 0) return set_error(); buf[sizeof buf - 1] = '\0'; - return PyString_FromString(buf); + return PyUnicode_FromString(buf); +#endif } PyDoc_STRVAR(gethostname_doc, @@ -3200,12 +3161,16 @@ socket_gethostbyname(PyObject *self, PyObject *args) { char *name; sock_addr_t addrbuf; + PyObject *ret = NULL; - if (!PyArg_ParseTuple(args, "s:gethostbyname", &name)) + if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name)) return NULL; if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0) - return NULL; - return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in)); + goto finally; + ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in)); +finally: + PyMem_Free(name); + return ret; } PyDoc_STRVAR(gethostbyname_doc, @@ -3227,11 +3192,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af) if (h == NULL) { /* Let's get real error message to return */ -#ifndef RISCOS set_herror(h_errno); -#else - PyErr_SetString(socket_error, "host not found"); -#endif return NULL; } @@ -3269,7 +3230,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af) if (h->h_aliases) { for (pch = h->h_aliases; *pch != NULL; pch++) { int status; - tmp = PyString_FromString(*pch); + tmp = PyUnicode_FromString(*pch); if (tmp == NULL) goto err; @@ -3360,7 +3321,7 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args) struct sockaddr_in addr; #endif struct sockaddr *sa; - PyObject *ret; + PyObject *ret = NULL; #ifdef HAVE_GETHOSTBYNAME_R struct hostent hp_allocated; #ifdef HAVE_GETHOSTBYNAME_R_3_ARG @@ -3375,10 +3336,10 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args) #endif #endif /* HAVE_GETHOSTBYNAME_R */ - if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name)) + if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name)) return NULL; if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0) - return NULL; + goto finally; Py_BEGIN_ALLOW_THREADS #ifdef HAVE_GETHOSTBYNAME_R #if defined(HAVE_GETHOSTBYNAME_R_6_ARG) @@ -3408,6 +3369,8 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args) #ifdef USE_GETHOSTBYNAME_LOCK PyThread_release_lock(netdb_lock); #endif +finally: + PyMem_Free(name); return ret; } @@ -3432,7 +3395,7 @@ socket_gethostbyaddr(PyObject *self, PyObject *args) struct sockaddr *sa = (struct sockaddr *)&addr; char *ip_num; struct hostent *h; - PyObject *ret; + PyObject *ret = NULL; #ifdef HAVE_GETHOSTBYNAME_R struct hostent hp_allocated; #ifdef HAVE_GETHOSTBYNAME_R_3_ARG @@ -3454,13 +3417,14 @@ socket_gethostbyaddr(PyObject *self, PyObject *args) int al; int af; - if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num)) + if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num)) return NULL; af = AF_UNSPEC; if (setipaddr(ip_num, sa, sizeof(addr), af) < 0) - return NULL; + goto finally; af = sa->sa_family; ap = NULL; + al = 0; switch (af) { case AF_INET: ap = (char *)&((struct sockaddr_in *)sa)->sin_addr; @@ -3474,7 +3438,7 @@ socket_gethostbyaddr(PyObject *self, PyObject *args) #endif default: PyErr_SetString(socket_error, "unsupported address family"); - return NULL; + goto finally; } Py_BEGIN_ALLOW_THREADS #ifdef HAVE_GETHOSTBYNAME_R @@ -3501,6 +3465,8 @@ socket_gethostbyaddr(PyObject *self, PyObject *args) #ifdef USE_GETHOSTBYNAME_LOCK PyThread_release_lock(netdb_lock); #endif +finally: + PyMem_Free(ip_num); return ret; } @@ -3530,7 +3496,7 @@ socket_getservbyname(PyObject *self, PyObject *args) PyErr_SetString(socket_error, "service/proto not found"); return NULL; } - return PyInt_FromLong((long) ntohs(sp->s_port)); + return PyLong_FromLong((long) ntohs(sp->s_port)); } PyDoc_STRVAR(getservbyname_doc, @@ -3567,7 +3533,7 @@ socket_getservbyport(PyObject *self, PyObject *args) PyErr_SetString(socket_error, "port/proto not found"); return NULL; } - return PyString_FromString(sp->s_name); + return PyUnicode_FromString(sp->s_name); } PyDoc_STRVAR(getservbyport_doc, @@ -3587,11 +3553,6 @@ socket_getprotobyname(PyObject *self, PyObject *args) { char *name; struct protoent *sp; -#ifdef __BEOS__ -/* Not available in BeOS yet. - [cjh] */ - PyErr_SetString(socket_error, "getprotobyname not supported"); - return NULL; -#else if (!PyArg_ParseTuple(args, "s:getprotobyname", &name)) return NULL; Py_BEGIN_ALLOW_THREADS @@ -3601,8 +3562,7 @@ socket_getprotobyname(PyObject *self, PyObject *args) PyErr_SetString(socket_error, "protocol not found"); return NULL; } - return PyInt_FromLong((long) sp->p_proto); -#endif + return PyLong_FromLong((long) sp->p_proto); } PyDoc_STRVAR(getprotobyname_doc, @@ -3611,6 +3571,38 @@ PyDoc_STRVAR(getprotobyname_doc, Return the protocol number for the named protocol. (Rarely used.)"); +#ifndef NO_DUP +/* dup() function for socket fds */ + +static PyObject * +socket_dup(PyObject *self, PyObject *fdobj) +{ + SOCKET_T fd, newfd; + PyObject *newfdobj; + + + fd = PyLong_AsSocket_t(fdobj); + if (fd == (SOCKET_T)(-1) && PyErr_Occurred()) + return NULL; + + newfd = dup_socket(fd); + if (newfd == INVALID_SOCKET) + return set_error(); + + newfdobj = PyLong_FromSocket_t(newfd); + if (newfdobj == NULL) + SOCKETCLOSE(newfd); + return newfdobj; +} + +PyDoc_STRVAR(dup_doc, +"dup(integer) -> integer\n\ +\n\ +Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\ +sockets; on some platforms os.dup() won't work for socket file descriptors."); +#endif + + #ifdef HAVE_SOCKETPAIR /* Create a pair of sockets using the socketpair() function. Arguments as for socket() except the default family is AF_UNIX if @@ -3667,39 +3659,6 @@ AF_UNIX if defined on the platform; otherwise, the default is AF_INET."); #endif /* HAVE_SOCKETPAIR */ -#ifndef NO_DUP -/* Create a socket object from a numeric file description. - Useful e.g. if stdin is a socket. - Additional arguments as for socket(). */ - -/*ARGSUSED*/ -static PyObject * -socket_fromfd(PyObject *self, PyObject *args) -{ - PySocketSockObject *s; - SOCKET_T fd; - int family, type, proto = 0; - if (!PyArg_ParseTuple(args, "iii|i:fromfd", - &fd, &family, &type, &proto)) - return NULL; - /* Dup the fd so it and the socket can be closed independently */ - fd = dup(fd); - if (fd < 0) - return set_error(); - s = new_sockobject(fd, family, type, proto); - return (PyObject *) s; -} - -PyDoc_STRVAR(fromfd_doc, -"fromfd(fd, family, type[, proto]) -> socket object\n\ -\n\ -Create a socket object from a duplicate of the given\n\ -file descriptor.\n\ -The remaining arguments are the same as for socket()."); - -#endif /* NO_DUP */ - - static PyObject * socket_ntohs(PyObject *self, PyObject *args) { @@ -3714,7 +3673,7 @@ socket_ntohs(PyObject *self, PyObject *args) return NULL; } x2 = (unsigned int)ntohs((unsigned short)x1); - return PyInt_FromLong(x2); + return PyLong_FromLong(x2); } PyDoc_STRVAR(ntohs_doc, @@ -3728,17 +3687,7 @@ socket_ntohl(PyObject *self, PyObject *arg) { unsigned long x; - if (PyInt_Check(arg)) { - x = PyInt_AS_LONG(arg); - if (x == (unsigned long) -1 && PyErr_Occurred()) - return NULL; - if ((long)x < 0) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative number to unsigned long"); - return NULL; - } - } - else if (PyLong_Check(arg)) { + if (PyLong_Check(arg)) { x = PyLong_AsUnsignedLong(arg); if (x == (unsigned long) -1 && PyErr_Occurred()) return NULL; @@ -3783,7 +3732,7 @@ socket_htons(PyObject *self, PyObject *args) return NULL; } x2 = (unsigned int)htons((unsigned short)x1); - return PyInt_FromLong(x2); + return PyLong_FromLong(x2); } PyDoc_STRVAR(htons_doc, @@ -3797,17 +3746,7 @@ socket_htonl(PyObject *self, PyObject *arg) { unsigned long x; - if (PyInt_Check(arg)) { - x = PyInt_AS_LONG(arg); - if (x == (unsigned long) -1 && PyErr_Occurred()) - return NULL; - if ((long)x < 0) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative number to unsigned long"); - return NULL; - } - } - else if (PyLong_Check(arg)) { + if (PyLong_Check(arg)) { x = PyLong_AsUnsignedLong(arg); if (x == (unsigned long) -1 && PyErr_Occurred()) return NULL; @@ -3838,7 +3777,7 @@ Convert a 32-bit integer from host to network byte order."); /* socket.inet_aton() and socket.inet_ntoa() functions. */ PyDoc_STRVAR(inet_aton_doc, -"inet_aton(string) -> packed 32-bit IP representation\n\ +"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\ \n\ Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\ binary format used in low-level network functions."); @@ -3872,7 +3811,7 @@ socket_inet_aton(PyObject *self, PyObject *args) if (inet_aton != NULL) { #endif if (inet_aton(ip_addr, &buf)) - return PyString_FromStringAndSize((char *)(&buf), + return PyBytes_FromStringAndSize((char *)(&buf), sizeof(buf)); PyErr_SetString(socket_error, @@ -3901,7 +3840,7 @@ socket_inet_aton(PyObject *self, PyObject *args) return NULL; } } - return PyString_FromStringAndSize((char *) &packed_addr, + return PyBytes_FromStringAndSize((char *) &packed_addr, sizeof(packed_addr)); #ifdef USE_INET_ATON_WEAKLINK @@ -3923,7 +3862,7 @@ socket_inet_ntoa(PyObject *self, PyObject *args) int addr_len; struct in_addr packed_addr; - if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) { + if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) { return NULL; } @@ -3935,7 +3874,7 @@ socket_inet_ntoa(PyObject *self, PyObject *args) memcpy(&packed_addr, packed_str, addr_len); - return PyString_FromString(inet_ntoa(packed_addr)); + return PyUnicode_FromString(inet_ntoa(packed_addr)); } #ifdef HAVE_INET_PTON @@ -3978,12 +3917,12 @@ socket_inet_pton(PyObject *self, PyObject *args) "illegal IP address string passed to inet_pton"); return NULL; } else if (af == AF_INET) { - return PyString_FromStringAndSize(packed, - sizeof(struct in_addr)); + return PyBytes_FromStringAndSize(packed, + sizeof(struct in_addr)); #ifdef ENABLE_IPV6 } else if (af == AF_INET6) { - return PyString_FromStringAndSize(packed, - sizeof(struct in6_addr)); + return PyBytes_FromStringAndSize(packed, + sizeof(struct in6_addr)); #endif } else { PyErr_SetString(socket_error, "unknown address family"); @@ -4009,10 +3948,10 @@ socket_inet_ntop(PyObject *self, PyObject *args) char ip[INET_ADDRSTRLEN + 1]; #endif - /* Guarantee NUL-termination for PyString_FromString() below */ + /* Guarantee NUL-termination for PyUnicode_FromString() below */ memset((void *) &ip[0], '\0', sizeof(ip)); - if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) { + if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) { return NULL; } @@ -4041,7 +3980,7 @@ socket_inet_ntop(PyObject *self, PyObject *args) PyErr_SetFromErrno(socket_error); return NULL; } else { - return PyString_FromString(retval); + return PyUnicode_FromString(retval); } /* NOTREACHED */ @@ -4055,8 +3994,10 @@ socket_inet_ntop(PyObject *self, PyObject *args) /*ARGSUSED*/ static PyObject * -socket_getaddrinfo(PyObject *self, PyObject *args) +socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs) { + static char* kwnames[] = {"host", "port", "family", "type", "proto", + "flags", 0}; struct addrinfo hints, *res; struct addrinfo *res0 = NULL; PyObject *hobj = NULL; @@ -4066,13 +4007,12 @@ socket_getaddrinfo(PyObject *self, PyObject *args) int family, socktype, protocol, flags; int error; PyObject *all = (PyObject *)NULL; - PyObject *single = (PyObject *)NULL; PyObject *idna = NULL; family = socktype = protocol = flags = 0; family = AF_UNSPEC; - if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo", - &hobj, &pobj, &family, &socktype, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo", + kwnames, &hobj, &pobj, &family, &socktype, &protocol, &flags)) { return NULL; } @@ -4082,27 +4022,31 @@ socket_getaddrinfo(PyObject *self, PyObject *args) idna = PyObject_CallMethod(hobj, "encode", "s", "idna"); if (!idna) return NULL; - hptr = PyString_AsString(idna); - } else if (PyString_Check(hobj)) { - hptr = PyString_AsString(hobj); + assert(PyBytes_Check(idna)); + hptr = PyBytes_AS_STRING(idna); + } else if (PyBytes_Check(hobj)) { + hptr = PyBytes_AsString(hobj); } else { PyErr_SetString(PyExc_TypeError, "getaddrinfo() argument 1 must be string or None"); return NULL; } - if (PyInt_Check(pobj) || PyLong_Check(pobj)) { + if (PyLong_CheckExact(pobj)) { long value = PyLong_AsLong(pobj); if (value == -1 && PyErr_Occurred()) - return NULL; + goto err; PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value); pptr = pbuf; - } else if (PyString_Check(pobj)) { - pptr = PyString_AsString(pobj); + } else if (PyUnicode_Check(pobj)) { + pptr = _PyUnicode_AsString(pobj); + if (pptr == NULL) + goto err; + } else if (PyBytes_Check(pobj)) { + pptr = PyBytes_AS_STRING(pobj); } else if (pobj == Py_None) { pptr = (char *)NULL; } else { - PyErr_SetString(socket_error, - "getaddrinfo() argument 2 must be integer or string"); + PyErr_SetString(socket_error, "Int or String expected"); goto err; } memset(&hints, 0, sizeof(hints)); @@ -4123,6 +4067,7 @@ socket_getaddrinfo(PyObject *self, PyObject *args) if ((all = PyList_New(0)) == NULL) goto err; for (res = res0; res; res = res->ai_next) { + PyObject *single; PyObject *addr = makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol); if (addr == NULL) @@ -4144,7 +4089,6 @@ socket_getaddrinfo(PyObject *self, PyObject *args) freeaddrinfo(res0); return all; err: - Py_XDECREF(single); Py_XDECREF(all); Py_XDECREF(idna); if (res0) @@ -4194,6 +4138,7 @@ socket_getnameinfo(PyObject *self, PyObject *args) memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */ + hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */ Py_BEGIN_ALLOW_THREADS ACQUIRE_GETADDRINFO_LOCK error = getaddrinfo(hostp, pbuf, &hints, &res); @@ -4229,7 +4174,7 @@ socket_getnameinfo(PyObject *self, PyObject *args) } #endif } - error = getnameinfo(res->ai_addr, res->ai_addrlen, + error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen, hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags); if (error) { set_gaierror(error); @@ -4318,8 +4263,8 @@ static PyMethodDef socket_methods[] = { {"getprotobyname", socket_getprotobyname, METH_VARARGS, getprotobyname_doc}, #ifndef NO_DUP - {"fromfd", socket_fromfd, - METH_VARARGS, fromfd_doc}, + {"dup", socket_dup, + METH_O, dup_doc}, #endif #ifdef HAVE_SOCKETPAIR {"socketpair", socket_socketpair, @@ -4343,8 +4288,8 @@ static PyMethodDef socket_methods[] = { {"inet_ntop", socket_inet_ntop, METH_VARARGS, inet_ntop_doc}, #endif - {"getaddrinfo", socket_getaddrinfo, - METH_VARARGS, getaddrinfo_doc}, + {"getaddrinfo", (PyCFunction)socket_getaddrinfo, + METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc}, {"getnameinfo", socket_getnameinfo, METH_VARARGS, getnameinfo_doc}, {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout, @@ -4355,24 +4300,6 @@ static PyMethodDef socket_methods[] = { }; -#ifdef RISCOS -#define OS_INIT_DEFINED - -static int -os_init(void) -{ - _kernel_swi_regs r; - - r.r[0] = 0; - _kernel_swi(0x43380, &r, &r); - taskwindow = r.r[0]; - - return 1; -} - -#endif /* RISCOS */ - - #ifdef MS_WINDOWS #define OS_INIT_DEFINED @@ -4389,7 +4316,6 @@ os_init(void) { WSADATA WSAData; int ret; - char buf[100]; ret = WSAStartup(0x0101, &WSAData); switch (ret) { case 0: /* No error */ @@ -4406,9 +4332,7 @@ os_init(void) "WSAStartup failed: requested version not supported"); break; default: - PyOS_snprintf(buf, sizeof(buf), - "WSAStartup failed: error code %d", ret); - PyErr_SetString(PyExc_ImportError, buf); + PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret); break; } return 0; /* Failure */ @@ -4426,16 +4350,13 @@ static int os_init(void) { #ifndef PYCC_GCC - char reason[64]; int rc = sock_init(); if (rc == 0) { return 1; /* Success */ } - PyOS_snprintf(reason, sizeof(reason), - "OS/2 TCP/IP Error# %d", sock_errno()); - PyErr_SetString(PyExc_ImportError, reason); + PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno()); return 0; /* Failure */ #else @@ -4462,6 +4383,7 @@ static PySocketModule_APIObject PySocketModuleAPI = { &sock_type, + NULL, NULL }; @@ -4469,14 +4391,11 @@ PySocketModule_APIObject PySocketModuleAPI = /* Initialize the _socket module. This module is actually called "_socket", and there's a wrapper - "socket.py" which implements some additional functionality. On some - platforms (e.g. Windows and OS/2), socket.py also implements a - wrapper for the socket type that provides missing functionality such - as makefile(), dup() and fromfd(). The import of "_socket" may fail - with an ImportError exception if os-specific initialization fails. - On Windows, this does WINSOCK initialization. When WINSOCK is - initialized successfully, a call to WSACleanup() is scheduled to be - made at exit time. + "socket.py" which implements some additional functionality. + The import of "_socket" may fail with an ImportError exception if + os-specific initialization fails. On Windows, this does WINSOCK + initialization. When WINSOCK is initialized successfully, a call to + WSACleanup() is scheduled to be made at exit time. */ PyDoc_STRVAR(socket_doc, @@ -4484,54 +4403,65 @@ PyDoc_STRVAR(socket_doc, \n\ See the socket module for documentation."); +static struct PyModuleDef socketmodule = { + PyModuleDef_HEAD_INIT, + PySocket_MODULE_NAME, + socket_doc, + -1, + socket_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_socket(void) +PyInit__socket(void) { PyObject *m, *has_ipv6; if (!os_init()) - return; + return NULL; Py_TYPE(&sock_type) = &PyType_Type; - m = Py_InitModule3(PySocket_MODULE_NAME, - socket_methods, - socket_doc); + m = PyModule_Create(&socketmodule); if (m == NULL) - return; + return NULL; socket_error = PyErr_NewException("socket.error", PyExc_IOError, NULL); if (socket_error == NULL) - return; + return NULL; PySocketModuleAPI.error = socket_error; Py_INCREF(socket_error); PyModule_AddObject(m, "error", socket_error); socket_herror = PyErr_NewException("socket.herror", socket_error, NULL); if (socket_herror == NULL) - return; + return NULL; Py_INCREF(socket_herror); PyModule_AddObject(m, "herror", socket_herror); socket_gaierror = PyErr_NewException("socket.gaierror", socket_error, NULL); if (socket_gaierror == NULL) - return; + return NULL; Py_INCREF(socket_gaierror); PyModule_AddObject(m, "gaierror", socket_gaierror); socket_timeout = PyErr_NewException("socket.timeout", socket_error, NULL); if (socket_timeout == NULL) - return; + return NULL; + PySocketModuleAPI.timeout_error = socket_timeout; Py_INCREF(socket_timeout); PyModule_AddObject(m, "timeout", socket_timeout); Py_INCREF((PyObject *)&sock_type); if (PyModule_AddObject(m, "SocketType", (PyObject *)&sock_type) != 0) - return; + return NULL; Py_INCREF((PyObject *)&sock_type); if (PyModule_AddObject(m, "socket", (PyObject *)&sock_type) != 0) - return; + return NULL; #ifdef ENABLE_IPV6 has_ipv6 = Py_True; @@ -4545,7 +4475,7 @@ init_socket(void) if (PyModule_AddObject(m, PySocket_CAPI_NAME, PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL) ) != 0) - return; + return NULL; /* Address families (we only support AF_INET and AF_UNIX) */ #ifdef AF_UNSPEC @@ -4779,13 +4709,17 @@ init_socket(void) /* Socket types */ PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM); PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM); -#ifndef __BEOS__ /* We have incomplete socket support. */ PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW); PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET); #if defined(SOCK_RDM) PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM); #endif +#ifdef SOCK_CLOEXEC + PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC); +#endif +#ifdef SOCK_NONBLOCK + PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK); #endif #ifdef SO_DEBUG @@ -4846,7 +4780,7 @@ init_socket(void) #ifdef SO_TYPE PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE); #endif -#ifdef SO_SETFIB +#ifdef SO_SETFIB PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB); #endif @@ -5402,7 +5336,7 @@ init_socket(void) PyObject *tmp; tmp = PyLong_FromUnsignedLong(codes[i]); if (tmp == NULL) - return; + return NULL; PyModule_AddObject(m, names[i], tmp); } } @@ -5421,6 +5355,7 @@ init_socket(void) #if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK) netdb_lock = PyThread_allocate_lock(); #endif + return m; } diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index 8515499b028..f064795b80f 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -8,7 +8,7 @@ # include <sys/socket.h> # endif # include <netinet/in.h> -# if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP))) +# if !(defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP))) # include <netinet/tcp.h> # endif @@ -78,7 +78,7 @@ extern "C" { /* Python module and C API name */ #define PySocket_MODULE_NAME "_socket" #define PySocket_CAPI_NAME "CAPI" -#define PySocket_CAPSULE_NAME (PySocket_MODULE_NAME "." PySocket_CAPI_NAME) +#define PySocket_CAPSULE_NAME PySocket_MODULE_NAME "." PySocket_CAPI_NAME /* Abstract the socket file descriptor type */ #ifdef MS_WINDOWS @@ -93,6 +93,14 @@ typedef int SOCKET_T; # define SIZEOF_SOCKET_T SIZEOF_INT #endif +#if SIZEOF_SOCKET_T <= SIZEOF_LONG +#define PyLong_FromSocket_t(fd) PyLong_FromLong((SOCKET_T)(fd)) +#define PyLong_AsSocket_t(fd) (SOCKET_T)PyLong_AsLong(fd) +#else +#define PyLong_FromSocket_t(fd) PyLong_FromLongLong((SOCKET_T)(fd)) +#define PyLong_AsSocket_t(fd) (SOCKET_T)PyLong_AsLongLong(fd) +#endif + /* Socket address */ typedef union sock_addr { struct sockaddr_in in; @@ -188,61 +196,10 @@ typedef struct { typedef struct { PyTypeObject *Sock_Type; PyObject *error; + PyObject *timeout_error; } PySocketModule_APIObject; -/* XXX The net effect of the following appears to be to define a function - XXX named PySocketModule_APIObject in _ssl.c. It's unclear why it isn't - XXX defined there directly. - - >>> It's defined here because other modules might also want to use - >>> the C API. - -*/ -#ifndef PySocket_BUILDING_SOCKET - -/* --- C API ----------------------------------------------------*/ - -/* Interfacestructure to C API for other modules. - Call PySocketModule_ImportModuleAndAPI() to initialize this - structure. After that usage is simple: - - if (!PyArg_ParseTuple(args, "O!|zz:ssl", - &PySocketModule.Sock_Type, (PyObject*)&Sock, - &key_file, &cert_file)) - return NULL; - ... -*/ - -static -PySocketModule_APIObject PySocketModule; - -/* You *must* call this before using any of the functions in - PySocketModule and check its outcome; otherwise all accesses will - result in a segfault. Returns 0 on success. */ - -#ifndef DPRINTF -# define DPRINTF if (0) printf -#endif - -static -int PySocketModule_ImportModuleAndAPI(void) -{ - void *api; - - DPRINTF(" Loading capsule %s\n", PySocket_CAPSULE_NAME); - api = PyCapsule_Import(PySocket_CAPSULE_NAME, 1); - if (api == NULL) - goto onError; - memcpy(&PySocketModule, api, sizeof(PySocketModule)); - DPRINTF(" API object loaded and initialized.\n"); - return 0; - - onError: - DPRINTF(" not found.\n"); - return -1; -} - -#endif /* !PySocket_BUILDING_SOCKET */ +#define PySocketModule_ImportModuleAndAPI() PyCapsule_Import(PySocket_CAPSULE_NAME, 1) #ifdef __cplusplus } diff --git a/Modules/spwdmodule.c b/Modules/spwdmodule.c index 957de58e99f..194ae196ba7 100644 --- a/Modules/spwdmodule.c +++ b/Modules/spwdmodule.c @@ -4,7 +4,6 @@ /* For info also see http://www.unixpapa.com/incnote/passwd.html */ #include "Python.h" -#include "structseq.h" #include <sys/types.h> #ifdef HAVE_SHADOW_H @@ -57,11 +56,12 @@ static PyTypeObject StructSpwdType; static void -sets(PyObject *v, int i, char* val) +sets(PyObject *v, int i, const char* val) { - if (val) - PyStructSequence_SET_ITEM(v, i, PyString_FromString(val)); - else { + if (val) { + PyObject *o = PyUnicode_DecodeFSDefault(val); + PyStructSequence_SET_ITEM(v, i, o); + } else { PyStructSequence_SET_ITEM(v, i, Py_None); Py_INCREF(Py_None); } @@ -74,7 +74,7 @@ static PyObject *mkspent(struct spwd *p) if (v == NULL) return NULL; -#define SETI(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val)) +#define SETI(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val)) #define SETS(i,val) sets(v, i, val) SETS(setIndex++, p->sp_namp); @@ -113,13 +113,22 @@ static PyObject* spwd_getspnam(PyObject *self, PyObject *args) { char *name; struct spwd *p; - if (!PyArg_ParseTuple(args, "s:getspnam", &name)) + PyObject *arg, *bytes, *retval = NULL; + + if (!PyArg_ParseTuple(args, "U:getspnam", &arg)) + return NULL; + if ((bytes = PyUnicode_EncodeFSDefault(arg)) == NULL) return NULL; + if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1) + goto out; if ((p = getspnam(name)) == NULL) { PyErr_SetString(PyExc_KeyError, "getspnam(): name not found"); - return NULL; + goto out; } - return mkspent(p); + retval = mkspent(p); +out: + Py_DECREF(bytes); + return retval; } #endif /* HAVE_GETSPNAM */ @@ -167,17 +176,31 @@ static PyMethodDef spwd_methods[] = { }; + +static struct PyModuleDef spwdmodule = { + PyModuleDef_HEAD_INIT, + "spwd", + spwd__doc__, + -1, + spwd_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initspwd(void) +PyInit_spwd(void) { PyObject *m; - m=Py_InitModule3("spwd", spwd_methods, spwd__doc__); + m=PyModule_Create(&spwdmodule); if (m == NULL) - return; + return NULL; if (!initialized) PyStructSequence_InitType(&StructSpwdType, &struct_spwd_type_desc); Py_INCREF((PyObject *) &StructSpwdType); PyModule_AddObject(m, "struct_spwd", (PyObject *) &StructSpwdType); initialized = 1; + return m; } diff --git a/Modules/sre.h b/Modules/sre.h index 9bfdf7fdfcd..d389b46dd13 100644 --- a/Modules/sre.h +++ b/Modules/sre.h @@ -26,6 +26,8 @@ typedef struct { PyObject* pattern; /* pattern source (or None) */ int flags; /* flags used when compiling pattern source */ PyObject *weakreflist; /* List of weak references */ + int charsize; /* pattern charsize (or -1) */ + Py_buffer view; /* pattern code */ Py_ssize_t codesize; SRE_CODE code[1]; @@ -75,6 +77,7 @@ typedef struct { char* data_stack; size_t data_stack_size; size_t data_stack_base; + Py_buffer buffer; /* current repeat context */ SRE_REPEAT *repeat; /* hooks */ diff --git a/Modules/stropmodule.c b/Modules/stropmodule.c deleted file mode 100644 index 4684baf932b..00000000000 --- a/Modules/stropmodule.c +++ /dev/null @@ -1,1270 +0,0 @@ -/* strop module */ - -#define PY_SSIZE_T_CLEAN -#include "Python.h" -#include <ctype.h> - -PyDoc_STRVAR(strop_module__doc__, -"Common string manipulations, optimized for speed.\n" -"\n" -"Always use \"import string\" rather than referencing\n" -"this module directly."); - -/* XXX This file assumes that the <ctype.h> is*() functions - XXX are defined for all 8-bit characters! */ - -#define WARN if (PyErr_Warn(PyExc_DeprecationWarning, \ - "strop functions are obsolete; use string methods")) \ - return NULL - -/* The lstrip(), rstrip() and strip() functions are implemented - in do_strip(), which uses an additional parameter to indicate what - type of strip should occur. */ - -#define LEFTSTRIP 0 -#define RIGHTSTRIP 1 -#define BOTHSTRIP 2 - - -static PyObject * -split_whitespace(char *s, Py_ssize_t len, Py_ssize_t maxsplit) -{ - Py_ssize_t i = 0, j; - int err; - Py_ssize_t countsplit = 0; - PyObject* item; - PyObject *list = PyList_New(0); - - if (list == NULL) - return NULL; - - while (i < len) { - while (i < len && isspace(Py_CHARMASK(s[i]))) { - i = i+1; - } - j = i; - while (i < len && !isspace(Py_CHARMASK(s[i]))) { - i = i+1; - } - if (j < i) { - item = PyString_FromStringAndSize(s+j, i-j); - if (item == NULL) - goto finally; - - err = PyList_Append(list, item); - Py_DECREF(item); - if (err < 0) - goto finally; - - countsplit++; - while (i < len && isspace(Py_CHARMASK(s[i]))) { - i = i+1; - } - if (maxsplit && (countsplit >= maxsplit) && i < len) { - item = PyString_FromStringAndSize( - s+i, len - i); - if (item == NULL) - goto finally; - - err = PyList_Append(list, item); - Py_DECREF(item); - if (err < 0) - goto finally; - - i = len; - } - } - } - return list; - finally: - Py_DECREF(list); - return NULL; -} - - -PyDoc_STRVAR(splitfields__doc__, -"split(s [,sep [,maxsplit]]) -> list of strings\n" -"splitfields(s [,sep [,maxsplit]]) -> list of strings\n" -"\n" -"Return a list of the words in the string s, using sep as the\n" -"delimiter string. If maxsplit is nonzero, splits into at most\n" -"maxsplit words. If sep is not specified, any whitespace string\n" -"is a separator. Maxsplit defaults to 0.\n" -"\n" -"(split and splitfields are synonymous)"); - -static PyObject * -strop_splitfields(PyObject *self, PyObject *args) -{ - Py_ssize_t len, n, i, j, err; - Py_ssize_t splitcount, maxsplit; - char *s, *sub; - PyObject *list, *item; - - WARN; - sub = NULL; - n = 0; - splitcount = 0; - maxsplit = 0; - if (!PyArg_ParseTuple(args, "t#|z#n:split", &s, &len, &sub, &n, &maxsplit)) - return NULL; - if (sub == NULL) - return split_whitespace(s, len, maxsplit); - if (n == 0) { - PyErr_SetString(PyExc_ValueError, "empty separator"); - return NULL; - } - - list = PyList_New(0); - if (list == NULL) - return NULL; - - i = j = 0; - while (i+n <= len) { - if (s[i] == sub[0] && (n == 1 || memcmp(s+i, sub, n) == 0)) { - item = PyString_FromStringAndSize(s+j, i-j); - if (item == NULL) - goto fail; - err = PyList_Append(list, item); - Py_DECREF(item); - if (err < 0) - goto fail; - i = j = i + n; - splitcount++; - if (maxsplit && (splitcount >= maxsplit)) - break; - } - else - i++; - } - item = PyString_FromStringAndSize(s+j, len-j); - if (item == NULL) - goto fail; - err = PyList_Append(list, item); - Py_DECREF(item); - if (err < 0) - goto fail; - - return list; - - fail: - Py_DECREF(list); - return NULL; -} - - -PyDoc_STRVAR(joinfields__doc__, -"join(list [,sep]) -> string\n" -"joinfields(list [,sep]) -> string\n" -"\n" -"Return a string composed of the words in list, with\n" -"intervening occurrences of sep. Sep defaults to a single\n" -"space.\n" -"\n" -"(join and joinfields are synonymous)"); - -static PyObject * -strop_joinfields(PyObject *self, PyObject *args) -{ - PyObject *seq; - char *sep = NULL; - Py_ssize_t seqlen, seplen = 0; - Py_ssize_t i, reslen = 0, slen = 0, sz = 100; - PyObject *res = NULL; - char* p = NULL; - ssizeargfunc getitemfunc; - - WARN; - if (!PyArg_ParseTuple(args, "O|t#:join", &seq, &sep, &seplen)) - return NULL; - if (sep == NULL) { - sep = " "; - seplen = 1; - } - - seqlen = PySequence_Size(seq); - if (seqlen < 0 && PyErr_Occurred()) - return NULL; - - if (seqlen == 1) { - /* Optimization if there's only one item */ - PyObject *item = PySequence_GetItem(seq, 0); - if (item && !PyString_Check(item)) { - PyErr_SetString(PyExc_TypeError, - "first argument must be sequence of strings"); - Py_DECREF(item); - return NULL; - } - return item; - } - - if (!(res = PyString_FromStringAndSize((char*)NULL, sz))) - return NULL; - p = PyString_AsString(res); - - /* optimize for lists, since it's the most common case. all others - * (tuples and arbitrary sequences) just use the sequence abstract - * interface. - */ - if (PyList_Check(seq)) { - for (i = 0; i < seqlen; i++) { - PyObject *item = PyList_GET_ITEM(seq, i); - if (!PyString_Check(item)) { - PyErr_SetString(PyExc_TypeError, - "first argument must be sequence of strings"); - Py_DECREF(res); - return NULL; - } - slen = PyString_GET_SIZE(item); - if (slen > PY_SSIZE_T_MAX - reslen || - seplen > PY_SSIZE_T_MAX - reslen - seplen) { - PyErr_SetString(PyExc_OverflowError, - "input too long"); - Py_DECREF(res); - return NULL; - } - while (reslen + slen + seplen >= sz) { - if (_PyString_Resize(&res, sz * 2) < 0) - return NULL; - sz *= 2; - p = PyString_AsString(res) + reslen; - } - if (i > 0) { - memcpy(p, sep, seplen); - p += seplen; - reslen += seplen; - } - memcpy(p, PyString_AS_STRING(item), slen); - p += slen; - reslen += slen; - } - _PyString_Resize(&res, reslen); - return res; - } - - if (seq->ob_type->tp_as_sequence == NULL || - (getitemfunc = seq->ob_type->tp_as_sequence->sq_item) == NULL) - { - PyErr_SetString(PyExc_TypeError, - "first argument must be a sequence"); - return NULL; - } - /* This is now type safe */ - for (i = 0; i < seqlen; i++) { - PyObject *item = getitemfunc(seq, i); - if (!item || !PyString_Check(item)) { - PyErr_SetString(PyExc_TypeError, - "first argument must be sequence of strings"); - Py_DECREF(res); - Py_XDECREF(item); - return NULL; - } - slen = PyString_GET_SIZE(item); - if (slen > PY_SSIZE_T_MAX - reslen || - seplen > PY_SSIZE_T_MAX - reslen - seplen) { - PyErr_SetString(PyExc_OverflowError, - "input too long"); - Py_DECREF(res); - Py_XDECREF(item); - return NULL; - } - while (reslen + slen + seplen >= sz) { - if (_PyString_Resize(&res, sz * 2) < 0) { - Py_DECREF(item); - return NULL; - } - sz *= 2; - p = PyString_AsString(res) + reslen; - } - if (i > 0) { - memcpy(p, sep, seplen); - p += seplen; - reslen += seplen; - } - memcpy(p, PyString_AS_STRING(item), slen); - p += slen; - reslen += slen; - Py_DECREF(item); - } - _PyString_Resize(&res, reslen); - return res; -} - - -PyDoc_STRVAR(find__doc__, -"find(s, sub [,start [,end]]) -> in\n" -"\n" -"Return the lowest index in s where substring sub is found,\n" -"such that sub is contained within s[start,end]. Optional\n" -"arguments start and end are interpreted as in slice notation.\n" -"\n" -"Return -1 on failure."); - -static PyObject * -strop_find(PyObject *self, PyObject *args) -{ - char *s, *sub; - Py_ssize_t len, n, i = 0, last = PY_SSIZE_T_MAX; - - WARN; - if (!PyArg_ParseTuple(args, "t#t#|nn:find", &s, &len, &sub, &n, &i, &last)) - return NULL; - - if (last > len) - last = len; - if (last < 0) - last += len; - if (last < 0) - last = 0; - if (i < 0) - i += len; - if (i < 0) - i = 0; - - if (n == 0 && i <= last) - return PyInt_FromLong((long)i); - - last -= n; - for (; i <= last; ++i) - if (s[i] == sub[0] && - (n == 1 || memcmp(&s[i+1], &sub[1], n-1) == 0)) - return PyInt_FromLong((long)i); - - return PyInt_FromLong(-1L); -} - - -PyDoc_STRVAR(rfind__doc__, -"rfind(s, sub [,start [,end]]) -> int\n" -"\n" -"Return the highest index in s where substring sub is found,\n" -"such that sub is contained within s[start,end]. Optional\n" -"arguments start and end are interpreted as in slice notation.\n" -"\n" -"Return -1 on failure."); - -static PyObject * -strop_rfind(PyObject *self, PyObject *args) -{ - char *s, *sub; - Py_ssize_t len, n, j; - Py_ssize_t i = 0, last = PY_SSIZE_T_MAX; - - WARN; - if (!PyArg_ParseTuple(args, "t#t#|nn:rfind", &s, &len, &sub, &n, &i, &last)) - return NULL; - - if (last > len) - last = len; - if (last < 0) - last += len; - if (last < 0) - last = 0; - if (i < 0) - i += len; - if (i < 0) - i = 0; - - if (n == 0 && i <= last) - return PyInt_FromLong((long)last); - - for (j = last-n; j >= i; --j) - if (s[j] == sub[0] && - (n == 1 || memcmp(&s[j+1], &sub[1], n-1) == 0)) - return PyInt_FromLong((long)j); - - return PyInt_FromLong(-1L); -} - - -static PyObject * -do_strip(PyObject *args, int striptype) -{ - char *s; - Py_ssize_t len, i, j; - - - if (PyString_AsStringAndSize(args, &s, &len)) - return NULL; - - i = 0; - if (striptype != RIGHTSTRIP) { - while (i < len && isspace(Py_CHARMASK(s[i]))) { - i++; - } - } - - j = len; - if (striptype != LEFTSTRIP) { - do { - j--; - } while (j >= i && isspace(Py_CHARMASK(s[j]))); - j++; - } - - if (i == 0 && j == len) { - Py_INCREF(args); - return args; - } - else - return PyString_FromStringAndSize(s+i, j-i); -} - - -PyDoc_STRVAR(strip__doc__, -"strip(s) -> string\n" -"\n" -"Return a copy of the string s with leading and trailing\n" -"whitespace removed."); - -static PyObject * -strop_strip(PyObject *self, PyObject *args) -{ - WARN; - return do_strip(args, BOTHSTRIP); -} - - -PyDoc_STRVAR(lstrip__doc__, -"lstrip(s) -> string\n" -"\n" -"Return a copy of the string s with leading whitespace removed."); - -static PyObject * -strop_lstrip(PyObject *self, PyObject *args) -{ - WARN; - return do_strip(args, LEFTSTRIP); -} - - -PyDoc_STRVAR(rstrip__doc__, -"rstrip(s) -> string\n" -"\n" -"Return a copy of the string s with trailing whitespace removed."); - -static PyObject * -strop_rstrip(PyObject *self, PyObject *args) -{ - WARN; - return do_strip(args, RIGHTSTRIP); -} - - -PyDoc_STRVAR(lower__doc__, -"lower(s) -> string\n" -"\n" -"Return a copy of the string s converted to lowercase."); - -static PyObject * -strop_lower(PyObject *self, PyObject *args) -{ - char *s, *s_new; - Py_ssize_t i, n; - PyObject *newstr; - int changed; - - WARN; - if (PyString_AsStringAndSize(args, &s, &n)) - return NULL; - newstr = PyString_FromStringAndSize(NULL, n); - if (newstr == NULL) - return NULL; - s_new = PyString_AsString(newstr); - changed = 0; - for (i = 0; i < n; i++) { - int c = Py_CHARMASK(*s++); - if (isupper(c)) { - changed = 1; - *s_new = tolower(c); - } else - *s_new = c; - s_new++; - } - if (!changed) { - Py_DECREF(newstr); - Py_INCREF(args); - return args; - } - return newstr; -} - - -PyDoc_STRVAR(upper__doc__, -"upper(s) -> string\n" -"\n" -"Return a copy of the string s converted to uppercase."); - -static PyObject * -strop_upper(PyObject *self, PyObject *args) -{ - char *s, *s_new; - Py_ssize_t i, n; - PyObject *newstr; - int changed; - - WARN; - if (PyString_AsStringAndSize(args, &s, &n)) - return NULL; - newstr = PyString_FromStringAndSize(NULL, n); - if (newstr == NULL) - return NULL; - s_new = PyString_AsString(newstr); - changed = 0; - for (i = 0; i < n; i++) { - int c = Py_CHARMASK(*s++); - if (islower(c)) { - changed = 1; - *s_new = toupper(c); - } else - *s_new = c; - s_new++; - } - if (!changed) { - Py_DECREF(newstr); - Py_INCREF(args); - return args; - } - return newstr; -} - - -PyDoc_STRVAR(capitalize__doc__, -"capitalize(s) -> string\n" -"\n" -"Return a copy of the string s with only its first character\n" -"capitalized."); - -static PyObject * -strop_capitalize(PyObject *self, PyObject *args) -{ - char *s, *s_new; - Py_ssize_t i, n; - PyObject *newstr; - int changed; - - WARN; - if (PyString_AsStringAndSize(args, &s, &n)) - return NULL; - newstr = PyString_FromStringAndSize(NULL, n); - if (newstr == NULL) - return NULL; - s_new = PyString_AsString(newstr); - changed = 0; - if (0 < n) { - int c = Py_CHARMASK(*s++); - if (islower(c)) { - changed = 1; - *s_new = toupper(c); - } else - *s_new = c; - s_new++; - } - for (i = 1; i < n; i++) { - int c = Py_CHARMASK(*s++); - if (isupper(c)) { - changed = 1; - *s_new = tolower(c); - } else - *s_new = c; - s_new++; - } - if (!changed) { - Py_DECREF(newstr); - Py_INCREF(args); - return args; - } - return newstr; -} - - -PyDoc_STRVAR(expandtabs__doc__, -"expandtabs(string, [tabsize]) -> string\n" -"\n" -"Expand tabs in a string, i.e. replace them by one or more spaces,\n" -"depending on the current column and the given tab size (default 8).\n" -"The column number is reset to zero after each newline occurring in the\n" -"string. This doesn't understand other non-printing characters."); - -static PyObject * -strop_expandtabs(PyObject *self, PyObject *args) -{ - /* Original by Fredrik Lundh */ - char* e; - char* p; - char* q; - Py_ssize_t i, j, old_j; - PyObject* out; - char* string; - Py_ssize_t stringlen; - int tabsize = 8; - - WARN; - /* Get arguments */ - if (!PyArg_ParseTuple(args, "s#|i:expandtabs", &string, &stringlen, &tabsize)) - return NULL; - if (tabsize < 1) { - PyErr_SetString(PyExc_ValueError, - "tabsize must be at least 1"); - return NULL; - } - - /* First pass: determine size of output string */ - i = j = old_j = 0; /* j: current column; i: total of previous lines */ - e = string + stringlen; - for (p = string; p < e; p++) { - if (*p == '\t') { - j += tabsize - (j%tabsize); - if (old_j > j) { - PyErr_SetString(PyExc_OverflowError, - "new string is too long"); - return NULL; - } - old_j = j; - } else { - j++; - if (*p == '\n') { - i += j; - j = 0; - } - } - } - - if ((i + j) < 0) { - PyErr_SetString(PyExc_OverflowError, "new string is too long"); - return NULL; - } - - /* Second pass: create output string and fill it */ - out = PyString_FromStringAndSize(NULL, i+j); - if (out == NULL) - return NULL; - - i = 0; - q = PyString_AS_STRING(out); - - for (p = string; p < e; p++) { - if (*p == '\t') { - j = tabsize - (i%tabsize); - i += j; - while (j-- > 0) - *q++ = ' '; - } else { - *q++ = *p; - i++; - if (*p == '\n') - i = 0; - } - } - - return out; -} - - -PyDoc_STRVAR(count__doc__, -"count(s, sub[, start[, end]]) -> int\n" -"\n" -"Return the number of occurrences of substring sub in string\n" -"s[start:end]. Optional arguments start and end are\n" -"interpreted as in slice notation."); - -static PyObject * -strop_count(PyObject *self, PyObject *args) -{ - char *s, *sub; - Py_ssize_t len, n; - Py_ssize_t i = 0, last = PY_SSIZE_T_MAX; - Py_ssize_t m, r; - - WARN; - if (!PyArg_ParseTuple(args, "t#t#|nn:count", &s, &len, &sub, &n, &i, &last)) - return NULL; - if (last > len) - last = len; - if (last < 0) - last += len; - if (last < 0) - last = 0; - if (i < 0) - i += len; - if (i < 0) - i = 0; - m = last + 1 - n; - if (n == 0) - return PyInt_FromLong((long) (m-i)); - - r = 0; - while (i < m) { - if (!memcmp(s+i, sub, n)) { - r++; - i += n; - } else { - i++; - } - } - return PyInt_FromLong((long) r); -} - - -PyDoc_STRVAR(swapcase__doc__, -"swapcase(s) -> string\n" -"\n" -"Return a copy of the string s with upper case characters\n" -"converted to lowercase and vice versa."); - -static PyObject * -strop_swapcase(PyObject *self, PyObject *args) -{ - char *s, *s_new; - Py_ssize_t i, n; - PyObject *newstr; - int changed; - - WARN; - if (PyString_AsStringAndSize(args, &s, &n)) - return NULL; - newstr = PyString_FromStringAndSize(NULL, n); - if (newstr == NULL) - return NULL; - s_new = PyString_AsString(newstr); - changed = 0; - for (i = 0; i < n; i++) { - int c = Py_CHARMASK(*s++); - if (islower(c)) { - changed = 1; - *s_new = toupper(c); - } - else if (isupper(c)) { - changed = 1; - *s_new = tolower(c); - } - else - *s_new = c; - s_new++; - } - if (!changed) { - Py_DECREF(newstr); - Py_INCREF(args); - return args; - } - return newstr; -} - - -PyDoc_STRVAR(atoi__doc__, -"atoi(s [,base]) -> int\n" -"\n" -"Return the integer represented by the string s in the given\n" -"base, which defaults to 10. The string s must consist of one\n" -"or more digits, possibly preceded by a sign. If base is 0, it\n" -"is chosen from the leading characters of s, 0 for octal, 0x or\n" -"0X for hexadecimal. If base is 16, a preceding 0x or 0X is\n" -"accepted."); - -static PyObject * -strop_atoi(PyObject *self, PyObject *args) -{ - char *s, *end; - int base = 10; - long x; - char buffer[256]; /* For errors */ - - WARN; - if (!PyArg_ParseTuple(args, "s|i:atoi", &s, &base)) - return NULL; - - if ((base != 0 && base < 2) || base > 36) { - PyErr_SetString(PyExc_ValueError, "invalid base for atoi()"); - return NULL; - } - - while (*s && isspace(Py_CHARMASK(*s))) - s++; - errno = 0; - if (base == 0 && s[0] == '0') - x = (long) PyOS_strtoul(s, &end, base); - else - x = PyOS_strtol(s, &end, base); - if (end == s || !isalnum(Py_CHARMASK(end[-1]))) - goto bad; - while (*end && isspace(Py_CHARMASK(*end))) - end++; - if (*end != '\0') { - bad: - PyOS_snprintf(buffer, sizeof(buffer), - "invalid literal for atoi(): %.200s", s); - PyErr_SetString(PyExc_ValueError, buffer); - return NULL; - } - else if (errno != 0) { - PyOS_snprintf(buffer, sizeof(buffer), - "atoi() literal too large: %.200s", s); - PyErr_SetString(PyExc_ValueError, buffer); - return NULL; - } - return PyInt_FromLong(x); -} - - -PyDoc_STRVAR(atol__doc__, -"atol(s [,base]) -> long\n" -"\n" -"Return the long integer represented by the string s in the\n" -"given base, which defaults to 10. The string s must consist\n" -"of one or more digits, possibly preceded by a sign. If base\n" -"is 0, it is chosen from the leading characters of s, 0 for\n" -"octal, 0x or 0X for hexadecimal. If base is 16, a preceding\n" -"0x or 0X is accepted. A trailing L or l is not accepted,\n" -"unless base is 0."); - -static PyObject * -strop_atol(PyObject *self, PyObject *args) -{ - char *s, *end; - int base = 10; - PyObject *x; - char buffer[256]; /* For errors */ - - WARN; - if (!PyArg_ParseTuple(args, "s|i:atol", &s, &base)) - return NULL; - - if ((base != 0 && base < 2) || base > 36) { - PyErr_SetString(PyExc_ValueError, "invalid base for atol()"); - return NULL; - } - - while (*s && isspace(Py_CHARMASK(*s))) - s++; - if (s[0] == '\0') { - PyErr_SetString(PyExc_ValueError, "empty string for atol()"); - return NULL; - } - x = PyLong_FromString(s, &end, base); - if (x == NULL) - return NULL; - if (base == 0 && (*end == 'l' || *end == 'L')) - end++; - while (*end && isspace(Py_CHARMASK(*end))) - end++; - if (*end != '\0') { - PyOS_snprintf(buffer, sizeof(buffer), - "invalid literal for atol(): %.200s", s); - PyErr_SetString(PyExc_ValueError, buffer); - Py_DECREF(x); - return NULL; - } - return x; -} - - -PyDoc_STRVAR(atof__doc__, -"atof(s) -> float\n" -"\n" -"Return the floating point number represented by the string s."); - -static PyObject * -strop_atof(PyObject *self, PyObject *args) -{ - char *s, *end; - double x; - char buffer[256]; /* For errors */ - - WARN; - if (!PyArg_ParseTuple(args, "s:atof", &s)) - return NULL; - while (*s && isspace(Py_CHARMASK(*s))) - s++; - if (s[0] == '\0') { - PyErr_SetString(PyExc_ValueError, "empty string for atof()"); - return NULL; - } - - PyFPE_START_PROTECT("strop_atof", return 0) - x = PyOS_string_to_double(s, &end, PyExc_OverflowError); - PyFPE_END_PROTECT(x) - if (x == -1 && PyErr_Occurred()) - return NULL; - while (*end && isspace(Py_CHARMASK(*end))) - end++; - if (*end != '\0') { - PyOS_snprintf(buffer, sizeof(buffer), - "invalid literal for atof(): %.200s", s); - PyErr_SetString(PyExc_ValueError, buffer); - return NULL; - } - return PyFloat_FromDouble(x); -} - - -PyDoc_STRVAR(maketrans__doc__, -"maketrans(frm, to) -> string\n" -"\n" -"Return a translation table (a string of 256 bytes long)\n" -"suitable for use in string.translate. The strings frm and to\n" -"must be of the same length."); - -static PyObject * -strop_maketrans(PyObject *self, PyObject *args) -{ - unsigned char *c, *from=NULL, *to=NULL; - Py_ssize_t i, fromlen=0, tolen=0; - PyObject *result; - - if (!PyArg_ParseTuple(args, "t#t#:maketrans", &from, &fromlen, &to, &tolen)) - return NULL; - - if (fromlen != tolen) { - PyErr_SetString(PyExc_ValueError, - "maketrans arguments must have same length"); - return NULL; - } - - result = PyString_FromStringAndSize((char *)NULL, 256); - if (result == NULL) - return NULL; - c = (unsigned char *) PyString_AS_STRING((PyStringObject *)result); - for (i = 0; i < 256; i++) - c[i]=(unsigned char)i; - for (i = 0; i < fromlen; i++) - c[from[i]]=to[i]; - - return result; -} - - -PyDoc_STRVAR(translate__doc__, -"translate(s,table [,deletechars]) -> string\n" -"\n" -"Return a copy of the string s, where all characters occurring\n" -"in the optional argument deletechars are removed, and the\n" -"remaining characters have been mapped through the given\n" -"translation table, which must be a string of length 256."); - -static PyObject * -strop_translate(PyObject *self, PyObject *args) -{ - register char *input, *table, *output; - Py_ssize_t i; - int c, changed = 0; - PyObject *input_obj; - char *table1, *output_start, *del_table=NULL; - Py_ssize_t inlen, tablen, dellen = 0; - PyObject *result; - int trans_table[256]; - - WARN; - if (!PyArg_ParseTuple(args, "St#|t#:translate", &input_obj, - &table1, &tablen, &del_table, &dellen)) - return NULL; - if (tablen != 256) { - PyErr_SetString(PyExc_ValueError, - "translation table must be 256 characters long"); - return NULL; - } - - table = table1; - inlen = PyString_GET_SIZE(input_obj); - result = PyString_FromStringAndSize((char *)NULL, inlen); - if (result == NULL) - return NULL; - output_start = output = PyString_AsString(result); - input = PyString_AsString(input_obj); - - if (dellen == 0) { - /* If no deletions are required, use faster code */ - for (i = inlen; --i >= 0; ) { - c = Py_CHARMASK(*input++); - if (Py_CHARMASK((*output++ = table[c])) != c) - changed = 1; - } - if (changed) - return result; - Py_DECREF(result); - Py_INCREF(input_obj); - return input_obj; - } - - for (i = 0; i < 256; i++) - trans_table[i] = Py_CHARMASK(table[i]); - - for (i = 0; i < dellen; i++) - trans_table[(int) Py_CHARMASK(del_table[i])] = -1; - - for (i = inlen; --i >= 0; ) { - c = Py_CHARMASK(*input++); - if (trans_table[c] != -1) - if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c) - continue; - changed = 1; - } - if (!changed) { - Py_DECREF(result); - Py_INCREF(input_obj); - return input_obj; - } - /* Fix the size of the resulting string */ - if (inlen > 0) - _PyString_Resize(&result, output - output_start); - return result; -} - - -/* What follows is used for implementing replace(). Perry Stoll. */ - -/* - mymemfind - - strstr replacement for arbitrary blocks of memory. - - Locates the first occurrence in the memory pointed to by MEM of the - contents of memory pointed to by PAT. Returns the index into MEM if - found, or -1 if not found. If len of PAT is greater than length of - MEM, the function returns -1. -*/ -static Py_ssize_t -mymemfind(const char *mem, Py_ssize_t len, const char *pat, Py_ssize_t pat_len) -{ - register Py_ssize_t ii; - - /* pattern can not occur in the last pat_len-1 chars */ - len -= pat_len; - - for (ii = 0; ii <= len; ii++) { - if (mem[ii] == pat[0] && - (pat_len == 1 || - memcmp(&mem[ii+1], &pat[1], pat_len-1) == 0)) { - return ii; - } - } - return -1; -} - -/* - mymemcnt - - Return the number of distinct times PAT is found in MEM. - meaning mem=1111 and pat==11 returns 2. - mem=11111 and pat==11 also return 2. - */ -static Py_ssize_t -mymemcnt(const char *mem, Py_ssize_t len, const char *pat, Py_ssize_t pat_len) -{ - register Py_ssize_t offset = 0; - Py_ssize_t nfound = 0; - - while (len >= 0) { - offset = mymemfind(mem, len, pat, pat_len); - if (offset == -1) - break; - mem += offset + pat_len; - len -= offset + pat_len; - nfound++; - } - return nfound; -} - -/* - mymemreplace - - Return a string in which all occurrences of PAT in memory STR are - replaced with SUB. - - If length of PAT is less than length of STR or there are no occurrences - of PAT in STR, then the original string is returned. Otherwise, a new - string is allocated here and returned. - - on return, out_len is: - the length of output string, or - -1 if the input string is returned, or - unchanged if an error occurs (no memory). - - return value is: - the new string allocated locally, or - NULL if an error occurred. -*/ -static char * -mymemreplace(const char *str, Py_ssize_t len, /* input string */ - const char *pat, Py_ssize_t pat_len, /* pattern string to find */ - const char *sub, Py_ssize_t sub_len, /* substitution string */ - Py_ssize_t count, /* number of replacements */ - Py_ssize_t *out_len) -{ - char *out_s; - char *new_s; - Py_ssize_t nfound, offset, new_len; - - if (len == 0 || pat_len > len) - goto return_same; - - /* find length of output string */ - nfound = mymemcnt(str, len, pat, pat_len); - if (count < 0) - count = PY_SSIZE_T_MAX; - else if (nfound > count) - nfound = count; - if (nfound == 0) - goto return_same; - - new_len = len + nfound*(sub_len - pat_len); - if (new_len == 0) { - /* Have to allocate something for the caller to free(). */ - out_s = (char *)PyMem_MALLOC(1); - if (out_s == NULL) - return NULL; - out_s[0] = '\0'; - } - else { - assert(new_len > 0); - new_s = (char *)PyMem_MALLOC(new_len); - if (new_s == NULL) - return NULL; - out_s = new_s; - - for (; count > 0 && len > 0; --count) { - /* find index of next instance of pattern */ - offset = mymemfind(str, len, pat, pat_len); - if (offset == -1) - break; - - /* copy non matching part of input string */ - memcpy(new_s, str, offset); - str += offset + pat_len; - len -= offset + pat_len; - - /* copy substitute into the output string */ - new_s += offset; - memcpy(new_s, sub, sub_len); - new_s += sub_len; - } - /* copy any remaining values into output string */ - if (len > 0) - memcpy(new_s, str, len); - } - *out_len = new_len; - return out_s; - - return_same: - *out_len = -1; - return (char *)str; /* cast away const */ -} - - -PyDoc_STRVAR(replace__doc__, -"replace (str, old, new[, maxsplit]) -> string\n" -"\n" -"Return a copy of string str with all occurrences of substring\n" -"old replaced by new. If the optional argument maxsplit is\n" -"given, only the first maxsplit occurrences are replaced."); - -static PyObject * -strop_replace(PyObject *self, PyObject *args) -{ - char *str, *pat,*sub,*new_s; - Py_ssize_t len,pat_len,sub_len,out_len; - Py_ssize_t count = -1; - PyObject *newstr; - - WARN; - if (!PyArg_ParseTuple(args, "t#t#t#|n:replace", - &str, &len, &pat, &pat_len, &sub, &sub_len, - &count)) - return NULL; - if (pat_len <= 0) { - PyErr_SetString(PyExc_ValueError, "empty pattern string"); - return NULL; - } - /* CAUTION: strop treats a replace count of 0 as infinity, unlke - * current (2.1) string.py and string methods. Preserve this for - * ... well, hard to say for what <wink>. - */ - if (count == 0) - count = -1; - new_s = mymemreplace(str,len,pat,pat_len,sub,sub_len,count,&out_len); - if (new_s == NULL) { - PyErr_NoMemory(); - return NULL; - } - if (out_len == -1) { - /* we're returning another reference to the input string */ - newstr = PyTuple_GetItem(args, 0); - Py_XINCREF(newstr); - } - else { - newstr = PyString_FromStringAndSize(new_s, out_len); - PyMem_FREE(new_s); - } - return newstr; -} - - -/* List of functions defined in the module */ - -static PyMethodDef -strop_methods[] = { - {"atof", strop_atof, METH_VARARGS, atof__doc__}, - {"atoi", strop_atoi, METH_VARARGS, atoi__doc__}, - {"atol", strop_atol, METH_VARARGS, atol__doc__}, - {"capitalize", strop_capitalize, METH_O, capitalize__doc__}, - {"count", strop_count, METH_VARARGS, count__doc__}, - {"expandtabs", strop_expandtabs, METH_VARARGS, expandtabs__doc__}, - {"find", strop_find, METH_VARARGS, find__doc__}, - {"join", strop_joinfields, METH_VARARGS, joinfields__doc__}, - {"joinfields", strop_joinfields, METH_VARARGS, joinfields__doc__}, - {"lstrip", strop_lstrip, METH_O, lstrip__doc__}, - {"lower", strop_lower, METH_O, lower__doc__}, - {"maketrans", strop_maketrans, METH_VARARGS, maketrans__doc__}, - {"replace", strop_replace, METH_VARARGS, replace__doc__}, - {"rfind", strop_rfind, METH_VARARGS, rfind__doc__}, - {"rstrip", strop_rstrip, METH_O, rstrip__doc__}, - {"split", strop_splitfields, METH_VARARGS, splitfields__doc__}, - {"splitfields", strop_splitfields, METH_VARARGS, splitfields__doc__}, - {"strip", strop_strip, METH_O, strip__doc__}, - {"swapcase", strop_swapcase, METH_O, swapcase__doc__}, - {"translate", strop_translate, METH_VARARGS, translate__doc__}, - {"upper", strop_upper, METH_O, upper__doc__}, - {NULL, NULL} /* sentinel */ -}; - - -PyMODINIT_FUNC -initstrop(void) -{ - PyObject *m, *s; - char buf[256]; - int c, n; - m = Py_InitModule4("strop", strop_methods, strop_module__doc__, - (PyObject*)NULL, PYTHON_API_VERSION); - if (m == NULL) - return; - - /* Create 'whitespace' object */ - n = 0; - for (c = 0; c < 256; c++) { - if (isspace(c)) - buf[n++] = c; - } - s = PyString_FromStringAndSize(buf, n); - if (s) - PyModule_AddObject(m, "whitespace", s); - - /* Create 'lowercase' object */ - n = 0; - for (c = 0; c < 256; c++) { - if (islower(c)) - buf[n++] = c; - } - s = PyString_FromStringAndSize(buf, n); - if (s) - PyModule_AddObject(m, "lowercase", s); - - /* Create 'uppercase' object */ - n = 0; - for (c = 0; c < 256; c++) { - if (isupper(c)) - buf[n++] = c; - } - s = PyString_FromStringAndSize(buf, n); - if (s) - PyModule_AddObject(m, "uppercase", s); -} diff --git a/Modules/sunaudiodev.c b/Modules/sunaudiodev.c deleted file mode 100644 index 0c32fe30e71..00000000000 --- a/Modules/sunaudiodev.c +++ /dev/null @@ -1,467 +0,0 @@ - -/* Sad objects */ - -#include "Python.h" -#include "structmember.h" - -#ifdef HAVE_SYS_AUDIOIO_H -#define SOLARIS -#endif - -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif - -#include <stropts.h> -#include <sys/ioctl.h> -#ifdef SOLARIS -#include <sys/audioio.h> -#else -#include <sun/audioio.h> -#endif - -/* #define offsetof(str,mem) ((int)(((str *)0)->mem)) */ - -typedef struct { - PyObject_HEAD - int x_fd; /* The open file */ - int x_icount; /* # samples read */ - int x_ocount; /* # samples written */ - int x_isctl; /* True if control device */ - -} sadobject; - -typedef struct { - PyObject_HEAD - audio_info_t ai; -} sadstatusobject; - -static PyTypeObject Sadtype; -static PyTypeObject Sadstatustype; -static sadstatusobject *sads_alloc(void); /* Forward */ - -static PyObject *SunAudioError; - -#define is_sadobject(v) (Py_TYPE(v) == &Sadtype) -#define is_sadstatusobject(v) (Py_TYPE(v) == &Sadstatustype) - - -static sadobject * -newsadobject(PyObject *args) -{ - sadobject *xp; - int fd; - char *mode; - int imode; - char* basedev; - char* ctldev; - char* opendev; - - /* Check arg for r/w/rw */ - if (!PyArg_ParseTuple(args, "s", &mode)) - return NULL; - if (strcmp(mode, "r") == 0) - imode = 0; - else if (strcmp(mode, "w") == 0) - imode = 1; - else if (strcmp(mode, "rw") == 0) - imode = 2; - else if (strcmp(mode, "control") == 0) - imode = -1; - else { - PyErr_SetString(SunAudioError, - "Mode should be one of 'r', 'w', 'rw' or 'control'"); - return NULL; - } - - /* Open the correct device. The base device name comes from the - * AUDIODEV environment variable first, then /dev/audio. The - * control device tacks "ctl" onto the base device name. - */ - basedev = getenv("AUDIODEV"); - if (!basedev) - basedev = "/dev/audio"; - ctldev = PyMem_NEW(char, strlen(basedev) + 4); - if (!ctldev) { - PyErr_NoMemory(); - return NULL; - } - strcpy(ctldev, basedev); - strcat(ctldev, "ctl"); - - if (imode < 0) { - opendev = ctldev; - fd = open(ctldev, 2); - } - else { - opendev = basedev; - fd = open(basedev, imode); - } - if (fd < 0) { - PyErr_SetFromErrnoWithFilename(SunAudioError, opendev); - PyMem_DEL(ctldev); - return NULL; - } - PyMem_DEL(ctldev); - - /* Create and initialize the object */ - xp = PyObject_New(sadobject, &Sadtype); - if (xp == NULL) { - close(fd); - return NULL; - } - xp->x_fd = fd; - xp->x_icount = xp->x_ocount = 0; - xp->x_isctl = (imode < 0); - - return xp; -} - -/* Sad methods */ - -static void -sad_dealloc(sadobject *xp) -{ - close(xp->x_fd); - PyObject_Del(xp); -} - -static PyObject * -sad_read(sadobject *self, PyObject *args) -{ - int size, count; - char *cp; - PyObject *rv; - - if (!PyArg_ParseTuple(args, "i:read", &size)) - return NULL; - rv = PyString_FromStringAndSize(NULL, size); - if (rv == NULL) - return NULL; - - if (!(cp = PyString_AsString(rv))) - goto finally; - - count = read(self->x_fd, cp, size); - if (count < 0) { - PyErr_SetFromErrno(SunAudioError); - goto finally; - } -#if 0 - /* TBD: why print this message if you can handle the condition? - * assume it's debugging info which we can just as well get rid - * of. in any case this message should *not* be using printf! - */ - if (count != size) - printf("sunaudio: funny read rv %d wtd %d\n", count, size); -#endif - self->x_icount += count; - return rv; - - finally: - Py_DECREF(rv); - return NULL; -} - -static PyObject * -sad_write(sadobject *self, PyObject *args) -{ - char *cp; - int count, size; - - if (!PyArg_ParseTuple(args, "s#:write", &cp, &size)) - return NULL; - - count = write(self->x_fd, cp, size); - if (count < 0) { - PyErr_SetFromErrno(SunAudioError); - return NULL; - } -#if 0 - if (count != size) - printf("sunaudio: funny write rv %d wanted %d\n", count, size); -#endif - self->x_ocount += count; - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sad_getinfo(sadobject *self) -{ - sadstatusobject *rv; - - if (!(rv = sads_alloc())) - return NULL; - - if (ioctl(self->x_fd, AUDIO_GETINFO, &rv->ai) < 0) { - PyErr_SetFromErrno(SunAudioError); - Py_DECREF(rv); - return NULL; - } - return (PyObject *)rv; -} - -static PyObject * -sad_setinfo(sadobject *self, sadstatusobject *arg) -{ - if (!is_sadstatusobject(arg)) { - PyErr_SetString(PyExc_TypeError, - "Must be sun audio status object"); - return NULL; - } - if (ioctl(self->x_fd, AUDIO_SETINFO, &arg->ai) < 0) { - PyErr_SetFromErrno(SunAudioError); - return NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sad_ibufcount(sadobject *self) -{ - audio_info_t ai; - - if (ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0) { - PyErr_SetFromErrno(SunAudioError); - return NULL; - } - return PyInt_FromLong(ai.record.samples - self->x_icount); -} - -static PyObject * -sad_obufcount(sadobject *self) -{ - audio_info_t ai; - - if (ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0) { - PyErr_SetFromErrno(SunAudioError); - return NULL; - } - /* x_ocount is in bytes, whereas play.samples is in frames */ - /* we want frames */ - return PyInt_FromLong(self->x_ocount / (ai.play.channels * - ai.play.precision / 8) - - ai.play.samples); -} - -static PyObject * -sad_drain(sadobject *self) -{ - if (ioctl(self->x_fd, AUDIO_DRAIN, 0) < 0) { - PyErr_SetFromErrno(SunAudioError); - return NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -#ifdef SOLARIS -static PyObject * -sad_getdev(sadobject *self) -{ - struct audio_device ad; - - if (ioctl(self->x_fd, AUDIO_GETDEV, &ad) < 0) { - PyErr_SetFromErrno(SunAudioError); - return NULL; - } - return Py_BuildValue("(sss)", ad.name, ad.version, ad.config); -} -#endif - -static PyObject * -sad_flush(sadobject *self) -{ - if (ioctl(self->x_fd, I_FLUSH, FLUSHW) < 0) { - PyErr_SetFromErrno(SunAudioError); - return NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sad_close(sadobject *self) -{ - - if (self->x_fd >= 0) { - close(self->x_fd); - self->x_fd = -1; - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sad_fileno(sadobject *self) -{ - return PyInt_FromLong(self->x_fd); -} - - -static PyMethodDef sad_methods[] = { - { "read", (PyCFunction)sad_read, METH_VARARGS }, - { "write", (PyCFunction)sad_write, METH_VARARGS }, - { "ibufcount", (PyCFunction)sad_ibufcount, METH_NOARGS }, - { "obufcount", (PyCFunction)sad_obufcount, METH_NOARGS }, -#define CTL_METHODS 4 - { "getinfo", (PyCFunction)sad_getinfo, METH_NOARGS }, - { "setinfo", (PyCFunction)sad_setinfo, METH_O}, - { "drain", (PyCFunction)sad_drain, METH_NOARGS }, - { "flush", (PyCFunction)sad_flush, METH_NOARGS }, -#ifdef SOLARIS - { "getdev", (PyCFunction)sad_getdev, METH_NOARGS }, -#endif - { "close", (PyCFunction)sad_close, METH_NOARGS }, - { "fileno", (PyCFunction)sad_fileno, METH_NOARGS }, - {NULL, NULL} /* sentinel */ -}; - -static PyObject * -sad_getattr(sadobject *xp, char *name) -{ - if (xp->x_isctl) - return Py_FindMethod(sad_methods+CTL_METHODS, - (PyObject *)xp, name); - else - return Py_FindMethod(sad_methods, (PyObject *)xp, name); -} - -/* ----------------------------------------------------------------- */ - -static sadstatusobject * -sads_alloc(void) { - return PyObject_New(sadstatusobject, &Sadstatustype); -} - -static void -sads_dealloc(sadstatusobject *xp) -{ - PyMem_DEL(xp); -} - -#define OFF(x) offsetof(audio_info_t,x) -static struct memberlist sads_ml[] = { - { "i_sample_rate", T_UINT, OFF(record.sample_rate) }, - { "i_channels", T_UINT, OFF(record.channels) }, - { "i_precision", T_UINT, OFF(record.precision) }, - { "i_encoding", T_UINT, OFF(record.encoding) }, - { "i_gain", T_UINT, OFF(record.gain) }, - { "i_port", T_UINT, OFF(record.port) }, - { "i_samples", T_UINT, OFF(record.samples) }, - { "i_eof", T_UINT, OFF(record.eof) }, - { "i_pause", T_UBYTE, OFF(record.pause) }, - { "i_error", T_UBYTE, OFF(record.error) }, - { "i_waiting", T_UBYTE, OFF(record.waiting) }, - { "i_open", T_UBYTE, OFF(record.open) , RO}, - { "i_active", T_UBYTE, OFF(record.active) , RO}, -#ifdef SOLARIS - { "i_buffer_size", T_UINT, OFF(record.buffer_size) }, - { "i_balance", T_UBYTE, OFF(record.balance) }, - { "i_avail_ports", T_UINT, OFF(record.avail_ports) }, -#endif - - { "o_sample_rate", T_UINT, OFF(play.sample_rate) }, - { "o_channels", T_UINT, OFF(play.channels) }, - { "o_precision", T_UINT, OFF(play.precision) }, - { "o_encoding", T_UINT, OFF(play.encoding) }, - { "o_gain", T_UINT, OFF(play.gain) }, - { "o_port", T_UINT, OFF(play.port) }, - { "o_samples", T_UINT, OFF(play.samples) }, - { "o_eof", T_UINT, OFF(play.eof) }, - { "o_pause", T_UBYTE, OFF(play.pause) }, - { "o_error", T_UBYTE, OFF(play.error) }, - { "o_waiting", T_UBYTE, OFF(play.waiting) }, - { "o_open", T_UBYTE, OFF(play.open) , RO}, - { "o_active", T_UBYTE, OFF(play.active) , RO}, -#ifdef SOLARIS - { "o_buffer_size", T_UINT, OFF(play.buffer_size) }, - { "o_balance", T_UBYTE, OFF(play.balance) }, - { "o_avail_ports", T_UINT, OFF(play.avail_ports) }, -#endif - - { "monitor_gain", T_UINT, OFF(monitor_gain) }, - { NULL, 0, 0}, -}; - -static PyObject * -sads_getattr(sadstatusobject *xp, char *name) -{ - return PyMember_Get((char *)&xp->ai, sads_ml, name); -} - -static int -sads_setattr(sadstatusobject *xp, char *name, PyObject *v) -{ - - if (v == NULL) { - PyErr_SetString(PyExc_TypeError, - "can't delete sun audio status attributes"); - return -1; - } - return PyMember_Set((char *)&xp->ai, sads_ml, name, v); -} - -/* ------------------------------------------------------------------- */ - - -static PyTypeObject Sadtype = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "sunaudiodev.sun_audio_device", /*tp_name*/ - sizeof(sadobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)sad_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)sad_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ -}; - -static PyTypeObject Sadstatustype = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "sunaudiodev.sun_audio_device_status", /*tp_name*/ - sizeof(sadstatusobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)sads_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)sads_getattr, /*tp_getattr*/ - (setattrfunc)sads_setattr, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ -}; -/* ------------------------------------------------------------------- */ - -static PyObject * -sadopen(PyObject *self, PyObject *args) -{ - return (PyObject *)newsadobject(args); -} - -static PyMethodDef sunaudiodev_methods[] = { - { "open", sadopen, METH_VARARGS }, - { 0, 0 }, -}; - -void -initsunaudiodev(void) -{ - PyObject *m, *d; - - if (PyErr_WarnPy3k("the sunaudiodev module has been removed in " - "Python 3.0", 2) < 0) - return; - - m = Py_InitModule("sunaudiodev", sunaudiodev_methods); - if (m == NULL) - return; - d = PyModule_GetDict(m); - SunAudioError = PyErr_NewException("sunaudiodev.error", NULL, NULL); - if (SunAudioError) - PyDict_SetItemString(d, "error", SunAudioError); -} diff --git a/Modules/svmodule.c b/Modules/svmodule.c deleted file mode 100644 index 6e419ce9e56..00000000000 --- a/Modules/svmodule.c +++ /dev/null @@ -1,970 +0,0 @@ -/* SV module -- interface to the Indigo video board */ - -/* WARNING! This module is for hardware that we don't have any more, - so it hasn't been tested. It has been converted to the new coding - style, and it is possible that this conversion has broken something - -- user beware! */ - -#include <sys/time.h> -#include <svideo.h> -#include "Python.h" -#include "compile.h" -#include "yuv.h" /* for YUV conversion functions */ - -typedef struct { - PyObject_HEAD - SV_nodeP ob_svideo; - svCaptureInfo ob_info; -} svobject; - -typedef struct { - PyObject_HEAD - void *ob_capture; - int ob_mustunlock; - svCaptureInfo ob_info; - svobject *ob_svideo; -} captureobject; - -static PyObject *SvError; /* exception sv.error */ - -static PyObject *newcaptureobject(svobject *, void *, int); - -/* Set a SV-specific error from svideo_errno and return NULL */ -static PyObject * -sv_error(void) -{ - PyErr_SetString(SvError, svStrerror(svideo_errno)); - return NULL; -} - -static PyObject * -svc_conversion(captureobject *self, PyObject *args, void (*function)(), float factor) -{ - PyObject *output; - int invert; - char* outstr; - - if (!PyArg_Parse(args, "i", &invert)) - return NULL; - - if (!(output = PyString_FromStringAndSize( - NULL, - (int)(self->ob_info.width * self->ob_info.height * factor)))) - { - return NULL; - } - if (!(outstr = PyString_AsString(output))) { - Py_DECREF(output); - return NULL; - } - - (*function)((boolean)invert, self->ob_capture, - outstr, - self->ob_info.width, self->ob_info.height); - - return output; -} - -/* - * 3 functions to convert from Starter Video YUV 4:1:1 format to - * Compression Library 4:2:2 Duplicate Chroma format. - */ -static PyObject * -svc_YUVtoYUV422DC(captureobject *self, PyObject *args) -{ - if (self->ob_info.format != SV_YUV411_FRAMES) { - PyErr_SetString(SvError, "data has bad format"); - return NULL; - } - return svc_conversion(self, args, yuv_sv411_to_cl422dc, 2.0); -} - -static PyObject * -svc_YUVtoYUV422DC_quarter(captureobject *self, PyObject *args) -{ - if (self->ob_info.format != SV_YUV411_FRAMES) { - PyErr_SetString(SvError, "data has bad format"); - return NULL; - } - return svc_conversion(self, args, - yuv_sv411_to_cl422dc_quartersize, 0.5); -} - -static PyObject * -svc_YUVtoYUV422DC_sixteenth(captureobject *self, PyObject *args) -{ - if (self->ob_info.format != SV_YUV411_FRAMES) { - PyErr_SetString(SvError, "data has bad format"); - return NULL; - } - return svc_conversion(self, args, - yuv_sv411_to_cl422dc_sixteenthsize, 0.125); -} - -static PyObject * -svc_YUVtoRGB(captureobject *self, PyObject *args) -{ - switch (self->ob_info.format) { - case SV_YUV411_FRAMES: - case SV_YUV411_FRAMES_AND_BLANKING_BUFFER: - break; - default: - PyErr_SetString(SvError, "data had bad format"); - return NULL; - } - return svc_conversion(self, args, svYUVtoRGB, (float) sizeof(long)); -} - -static PyObject * -svc_RGB8toRGB32(captureobject *self, PyObject *args) -{ - if (self->ob_info.format != SV_RGB8_FRAMES) { - PyErr_SetString(SvError, "data has bad format"); - return NULL; - } - return svc_conversion(self, args, svRGB8toRGB32, (float) sizeof(long)); -} - -static PyObject * -svc_InterleaveFields(captureobject *self, PyObject *args) -{ - if (self->ob_info.format != SV_RGB8_FRAMES) { - PyErr_SetString(SvError, "data has bad format"); - return NULL; - } - return svc_conversion(self, args, svInterleaveFields, 1.0); -} - -static PyObject * -svc_GetFields(captureobject *self, PyObject *args) -{ - PyObject *f1 = NULL; - PyObject *f2 = NULL; - PyObject *ret = NULL; - int fieldsize; - char* obcapture; - - if (self->ob_info.format != SV_RGB8_FRAMES) { - PyErr_SetString(SvError, "data has bad format"); - return NULL; - } - - fieldsize = self->ob_info.width * self->ob_info.height / 2; - obcapture = (char*)self->ob_capture; - - if (!(f1 = PyString_FromStringAndSize(obcapture, fieldsize))) - goto finally; - if (!(f2 = PyString_FromStringAndSize(obcapture + fieldsize, - fieldsize))) - goto finally; - ret = PyTuple_Pack(2, f1, f2); - - finally: - Py_XDECREF(f1); - Py_XDECREF(f2); - return ret; -} - -static PyObject * -svc_UnlockCaptureData(captureobject *self, PyObject *args) -{ - if (!PyArg_Parse(args, "")) - return NULL; - - if (!self->ob_mustunlock) { - PyErr_SetString(SvError, "buffer should not be unlocked"); - return NULL; - } - - if (svUnlockCaptureData(self->ob_svideo->ob_svideo, self->ob_capture)) - return sv_error(); - - self->ob_mustunlock = 0; - - Py_INCREF(Py_None); - return Py_None; -} - -#ifdef USE_GL -#include <gl.h> - -static PyObject * -svc_lrectwrite(captureobject *self, PyObject *args) -{ - Screencoord x1, x2, y1, y2; - - if (!PyArg_Parse(args, "(hhhh)", &x1, &x2, &y1, &y2)) - return NULL; - - lrectwrite(x1, x2, y1, y2, (unsigned long *) self->ob_capture); - - Py_INCREF(Py_None); - return Py_None; -} -#endif - -static PyObject * -svc_writefile(captureobject *self, PyObject *args) -{ - PyObject *file; - int size; - FILE* fp; - - if (!PyArg_Parse(args, "O", &file)) - return NULL; - - if (!PyFile_Check(file)) { - PyErr_SetString(SvError, "not a file object"); - return NULL; - } - - if (!(fp = PyFile_AsFile(file))) - return NULL; - - size = self->ob_info.width * self->ob_info.height; - - if (fwrite(self->ob_capture, sizeof(long), size, fp) != size) { - PyErr_SetString(SvError, "writing failed"); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -svc_FindVisibleRegion(captureobject *self, PyObject *args) -{ - void *visible; - int width; - - if (!PyArg_Parse(args, "")) - return NULL; - - if (svFindVisibleRegion(self->ob_svideo->ob_svideo, - self->ob_capture, &visible, - self->ob_info.width)) - return sv_error(); - - if (visible == NULL) { - PyErr_SetString(SvError, "data in wrong format"); - return NULL; - } - - return newcaptureobject(self->ob_svideo, visible, 0); -} - -static PyMethodDef capture_methods[] = { - {"YUVtoRGB", (PyCFunction)svc_YUVtoRGB, METH_OLDARGS}, - {"RGB8toRGB32", (PyCFunction)svc_RGB8toRGB32, METH_OLDARGS}, - {"InterleaveFields", (PyCFunction)svc_InterleaveFields, METH_OLDARGS}, - {"UnlockCaptureData", (PyCFunction)svc_UnlockCaptureData, METH_OLDARGS}, - {"FindVisibleRegion", (PyCFunction)svc_FindVisibleRegion, METH_OLDARGS}, - {"GetFields", (PyCFunction)svc_GetFields, METH_OLDARGS}, - {"YUVtoYUV422DC", (PyCFunction)svc_YUVtoYUV422DC, METH_OLDARGS}, - {"YUVtoYUV422DC_quarter",(PyCFunction)svc_YUVtoYUV422DC_quarter, METH_OLDARGS}, - {"YUVtoYUV422DC_sixteenth",(PyCFunction)svc_YUVtoYUV422DC_sixteenth, METH_OLDARGS}, -#ifdef USE_GL - {"lrectwrite", (PyCFunction)svc_lrectwrite, METH_OLDARGS}, -#endif - {"writefile", (PyCFunction)svc_writefile, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -static void -capture_dealloc(captureobject *self) -{ - if (self->ob_capture != NULL) { - if (self->ob_mustunlock) - (void)svUnlockCaptureData(self->ob_svideo->ob_svideo, - self->ob_capture); - self->ob_capture = NULL; - Py_DECREF(self->ob_svideo); - self->ob_svideo = NULL; - } - PyObject_Del(self); -} - -static PyObject * -capture_getattr(svobject *self, char *name) -{ - return Py_FindMethod(capture_methods, (PyObject *)self, name); -} - -PyTypeObject Capturetype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "sv.capture", /*tp_name*/ - sizeof(captureobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)capture_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)capture_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ -}; - -static PyObject * -newcaptureobject(svobject *self, void *ptr, int mustunlock) -{ - captureobject *p; - - p = PyObject_New(captureobject, &Capturetype); - if (p == NULL) - return NULL; - p->ob_svideo = self; - Py_INCREF(self); - p->ob_capture = ptr; - p->ob_mustunlock = mustunlock; - p->ob_info = self->ob_info; - return (PyObject *) p; -} - -static PyObject * -sv_GetCaptureData(svobject *self, PyObject *args) -{ - void *ptr; - long fieldID; - PyObject *res, *c; - - if (!PyArg_Parse(args, "")) - return NULL; - - if (svGetCaptureData(self->ob_svideo, &ptr, &fieldID)) - return sv_error(); - - if (ptr == NULL) { - PyErr_SetString(SvError, "no data available"); - return NULL; - } - - c = newcaptureobject(self, ptr, 1); - if (c == NULL) - return NULL; - res = Py_BuildValue("(Oi)", c, fieldID); - Py_DECREF(c); - return res; -} - -static PyObject * -sv_BindGLWindow(svobject *self, PyObject *args) -{ - long wid; - int mode; - - if (!PyArg_Parse(args, "(ii)", &wid, &mode)) - return NULL; - - if (svBindGLWindow(self->ob_svideo, wid, mode)) - return sv_error(); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sv_EndContinuousCapture(svobject *self, PyObject *args) -{ - - if (!PyArg_Parse(args, "")) - return NULL; - - if (svEndContinuousCapture(self->ob_svideo)) - return sv_error(); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sv_IsVideoDisplayed(svobject *self, PyObject *args) -{ - int v; - - if (!PyArg_Parse(args, "")) - return NULL; - - v = svIsVideoDisplayed(self->ob_svideo); - if (v == -1) - return sv_error(); - - return PyInt_FromLong((long) v); -} - -static PyObject * -sv_OutputOffset(svobject *self, PyObject *args) -{ - int x_offset; - int y_offset; - - if (!PyArg_Parse(args, "(ii)", &x_offset, &y_offset)) - return NULL; - - if (svOutputOffset(self->ob_svideo, x_offset, y_offset)) - return sv_error(); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sv_PutFrame(svobject *self, PyObject *args) -{ - char *buffer; - - if (!PyArg_Parse(args, "s", &buffer)) - return NULL; - - if (svPutFrame(self->ob_svideo, buffer)) - return sv_error(); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sv_QuerySize(svobject *self, PyObject *args) -{ - int w; - int h; - int rw; - int rh; - - if (!PyArg_Parse(args, "(ii)", &w, &h)) - return NULL; - - if (svQuerySize(self->ob_svideo, w, h, &rw, &rh)) - return sv_error(); - - return Py_BuildValue("(ii)", (long) rw, (long) rh); -} - -static PyObject * -sv_SetSize(svobject *self, PyObject *args) -{ - int w; - int h; - - if (!PyArg_Parse(args, "(ii)", &w, &h)) - return NULL; - - if (svSetSize(self->ob_svideo, w, h)) - return sv_error(); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sv_SetStdDefaults(svobject *self, PyObject *args) -{ - - if (!PyArg_Parse(args, "")) - return NULL; - - if (svSetStdDefaults(self->ob_svideo)) - return sv_error(); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sv_UseExclusive(svobject *self, PyObject *args) -{ - boolean onoff; - int mode; - - if (!PyArg_Parse(args, "(ii)", &onoff, &mode)) - return NULL; - - if (svUseExclusive(self->ob_svideo, onoff, mode)) - return sv_error(); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sv_WindowOffset(svobject *self, PyObject *args) -{ - int x_offset; - int y_offset; - - if (!PyArg_Parse(args, "(ii)", &x_offset, &y_offset)) - return NULL; - - if (svWindowOffset(self->ob_svideo, x_offset, y_offset)) - return sv_error(); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sv_CaptureBurst(svobject *self, PyObject *args) -{ - int bytes, i; - svCaptureInfo info; - void *bitvector = NULL; - PyObject *videodata = NULL; - PyObject *bitvecobj = NULL; - PyObject *res = NULL; - static PyObject *evenitem, *odditem; - - if (!PyArg_Parse(args, "(iiiii)", &info.format, - &info.width, &info.height, - &info.size, &info.samplingrate)) - return NULL; - - switch (info.format) { - case SV_RGB8_FRAMES: - bitvector = malloc(SV_BITVEC_SIZE(info.size)); - break; - case SV_YUV411_FRAMES_AND_BLANKING_BUFFER: - break; - default: - PyErr_SetString(SvError, "illegal format specified"); - return NULL; - } - - if (svQueryCaptureBufferSize(self->ob_svideo, &info, &bytes)) { - res = sv_error(); - goto finally; - } - - if (!(videodata = PyString_FromStringAndSize(NULL, bytes))) - goto finally; - - /* XXX -- need to do something about the bitvector */ - { - char* str = PyString_AsString(videodata); - if (!str) - goto finally; - - if (svCaptureBurst(self->ob_svideo, &info, str, bitvector)) { - res = sv_error(); - goto finally; - } - } - - if (bitvector) { - if (evenitem == NULL) { - if (!(evenitem = PyInt_FromLong(0))) - goto finally; - } - if (odditem == NULL) { - if (!(odditem = PyInt_FromLong(1))) - goto finally; - } - if (!(bitvecobj = PyTuple_New(2 * info.size))) - goto finally; - - for (i = 0; i < 2 * info.size; i++) { - int sts; - - if (SV_GET_FIELD(bitvector, i) == SV_EVEN_FIELD) { - Py_INCREF(evenitem); - sts = PyTuple_SetItem(bitvecobj, i, evenitem); - } else { - Py_INCREF(odditem); - sts = PyTuple_SetItem(bitvecobj, i, odditem); - } - if (sts < 0) - goto finally; - } - } else { - bitvecobj = Py_None; - Py_INCREF(Py_None); - } - - res = Py_BuildValue("((iiiii)OO)", info.format, - info.width, info.height, - info.size, info.samplingrate, - videodata, bitvecobj); - - finally: - if (bitvector) - free(bitvector); - - Py_XDECREF(videodata); - Py_XDECREF(bitvecobj); - return res; -} - -static PyObject * -sv_CaptureOneFrame(svobject *self, PyObject *args) -{ - svCaptureInfo info; - int format, width, height; - int bytes; - PyObject *videodata = NULL; - PyObject *res = NULL; - char *str; - - if (!PyArg_Parse(args, "(iii)", &format, &width, &height)) - return NULL; - - info.format = format; - info.width = width; - info.height = height; - info.size = 0; - info.samplingrate = 0; - if (svQueryCaptureBufferSize(self->ob_svideo, &info, &bytes)) - return sv_error(); - - if (!(videodata = PyString_FromStringAndSize(NULL, bytes))) - return NULL; - - str = PyString_AsString(videodata); - if (!str) - goto finally; - - if (svCaptureOneFrame(self->ob_svideo, format, &width, &height, str)) { - res = sv_error(); - goto finally; - } - - res = Py_BuildValue("(iiO)", width, height, videodata); - - finally: - Py_XDECREF(videodata); - return res; -} - -static PyObject * -sv_InitContinuousCapture(svobject *self, PyObject *args) -{ - svCaptureInfo info; - - if (!PyArg_Parse(args, "(iiiii)", &info.format, - &info.width, &info.height, - &info.size, &info.samplingrate)) - return NULL; - - if (svInitContinuousCapture(self->ob_svideo, &info)) - return sv_error(); - - self->ob_info = info; - - return Py_BuildValue("(iiiii)", info.format, info.width, info.height, - info.size, info.samplingrate); -} - -static PyObject * -sv_LoadMap(svobject *self, PyObject *args) -{ - PyObject *rgb; - PyObject *res = NULL; - rgb_tuple *mapp = NULL; - int maptype; - int i, j; /* indices */ - - if (!PyArg_Parse(args, "(iO)", &maptype, &rgb)) - return NULL; - - if (!PyList_Check(rgb) || PyList_Size(rgb) != 256) { - PyErr_BadArgument(); - return NULL; - } - - if (!(mapp = PyMem_NEW(rgb_tuple, 256))) - return PyErr_NoMemory(); - - for (i = 0; i < 256; i++) { - PyObject* v = PyList_GetItem(rgb, i); - if (!v) - goto finally; - - if (!PyTuple_Check(v) || PyTuple_Size(v) != 3) { - PyErr_BadArgument(); - goto finally; - } - for (j = 0; j < 3; j++) { - PyObject* cell = PyTuple_GetItem(v, j); - if (!cell) - goto finally; - - if (!PyInt_Check(cell)) { - PyErr_BadArgument(); - goto finally; - } - switch (j) { - case 0: mapp[i].red = PyInt_AsLong(cell); break; - case 1: mapp[i].blue = PyInt_AsLong(cell); break; - case 2: mapp[i].green = PyInt_AsLong(cell); break; - } - if (PyErr_Occurred()) - goto finally; - } - } - - if (svLoadMap(self->ob_svideo, maptype, mapp)) { - res = sv_error(); - goto finally; - } - - Py_INCREF(Py_None); - res = Py_None; - - finally: - PyMem_DEL(mapp); - return res; -} - -static PyObject * -sv_CloseVideo(svobject *self, PyObject *args) -{ - if (!PyArg_Parse(args, "")) - return NULL; - - if (svCloseVideo(self->ob_svideo)) - return sv_error(); - - self->ob_svideo = NULL; - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -doParams(svobject *self, PyObject *args, - int (*func)(SV_nodeP, long *, int), int modified) -{ - PyObject *list; - PyObject *res = NULL; - long *PVbuffer = NULL; - long length; - int i; - - if (!PyArg_Parse(args, "O", &list)) - return NULL; - - if (!PyList_Check(list)) { - PyErr_BadArgument(); - return NULL; - } - - if ((length = PyList_Size(list)) < 0) - return NULL; - - PVbuffer = PyMem_NEW(long, length); - if (PVbuffer == NULL) - return PyErr_NoMemory(); - - for (i = 0; i < length; i++) { - PyObject *v = PyList_GetItem(list, i); - if (!v) - goto finally; - - if (!PyInt_Check(v)) { - PyErr_BadArgument(); - goto finally; - } - PVbuffer[i] = PyInt_AsLong(v); - /* can't just test the return value, because what if the - value was -1?! - */ - if (PVbuffer[i] == -1 && PyErr_Occurred()) - goto finally; - } - - if ((*func)(self->ob_svideo, PVbuffer, length)) { - res = sv_error(); - goto finally; - } - - if (modified) { - for (i = 0; i < length; i++) { - PyObject* v = PyInt_FromLong(PVbuffer[i]); - if (!v || PyList_SetItem(list, i, v) < 0) - goto finally; - } - } - - Py_INCREF(Py_None); - res = Py_None; - - finally: - PyMem_DEL(PVbuffer); - return res; -} - -static PyObject * -sv_GetParam(PyObject *self, PyObject *args) -{ - return doParams(self, args, svGetParam, 1); -} - -static PyObject * -sv_GetParamRange(PyObject *self, PyObject *args) -{ - return doParams(self, args, svGetParamRange, 1); -} - -static PyObject * -sv_SetParam(PyObject *self, PyObject *args) -{ - return doParams(self, args, svSetParam, 0); -} - -static PyMethodDef svideo_methods[] = { - {"BindGLWindow", (PyCFunction)sv_BindGLWindow, METH_OLDARGS}, - {"EndContinuousCapture",(PyCFunction)sv_EndContinuousCapture, METH_OLDARGS}, - {"IsVideoDisplayed", (PyCFunction)sv_IsVideoDisplayed, METH_OLDARGS}, - {"OutputOffset", (PyCFunction)sv_OutputOffset, METH_OLDARGS}, - {"PutFrame", (PyCFunction)sv_PutFrame, METH_OLDARGS}, - {"QuerySize", (PyCFunction)sv_QuerySize, METH_OLDARGS}, - {"SetSize", (PyCFunction)sv_SetSize, METH_OLDARGS}, - {"SetStdDefaults", (PyCFunction)sv_SetStdDefaults, METH_OLDARGS}, - {"UseExclusive", (PyCFunction)sv_UseExclusive, METH_OLDARGS}, - {"WindowOffset", (PyCFunction)sv_WindowOffset, METH_OLDARGS}, - {"InitContinuousCapture",(PyCFunction)sv_InitContinuousCapture, METH_OLDARGS}, - {"CaptureBurst", (PyCFunction)sv_CaptureBurst, METH_OLDARGS}, - {"CaptureOneFrame", (PyCFunction)sv_CaptureOneFrame, METH_OLDARGS}, - {"GetCaptureData", (PyCFunction)sv_GetCaptureData, METH_OLDARGS}, - {"CloseVideo", (PyCFunction)sv_CloseVideo, METH_OLDARGS}, - {"LoadMap", (PyCFunction)sv_LoadMap, METH_OLDARGS}, - {"GetParam", (PyCFunction)sv_GetParam, METH_OLDARGS}, - {"GetParamRange", (PyCFunction)sv_GetParamRange, METH_OLDARGS}, - {"SetParam", (PyCFunction)sv_SetParam, METH_OLDARGS}, - {NULL, NULL} /* sentinel */ -}; - -static PyObject * -sv_conversion(PyObject *self, PyObject *args, void (*function)(), - int inputfactor, float factor) -{ - int invert, width, height, inputlength; - char *input, *str; - PyObject *output; - - if (!PyArg_Parse(args, "(is#ii)", &invert, - &input, &inputlength, &width, &height)) - return NULL; - - if (width * height * inputfactor > inputlength) { - PyErr_SetString(SvError, "input buffer not long enough"); - return NULL; - } - - if (!(output = PyString_FromStringAndSize(NULL, - (int)(width * height * factor)))) - return NULL; - - str = PyString_AsString(output); - if (!str) { - Py_DECREF(output); - return NULL; - } - (*function)(invert, input, str, width, height); - - return output; -} - -static PyObject * -sv_InterleaveFields(PyObject *self, PyObject *args) -{ - return sv_conversion(self, args, svInterleaveFields, 1, 1.0); -} - -static PyObject * -sv_RGB8toRGB32(PyObject *self, PyObject *args) -{ - return sv_conversion(self, args, svRGB8toRGB32, 1, (float) sizeof(long)); -} - -static PyObject * -sv_YUVtoRGB(PyObject *self, PyObject *args) -{ - return sv_conversion(self, args, svYUVtoRGB, 2, (float) sizeof(long)); -} - -static void -svideo_dealloc(svobject *self) -{ - if (self->ob_svideo != NULL) - (void) svCloseVideo(self->ob_svideo); - PyObject_Del(self); -} - -static PyObject * -svideo_getattr(svobject *self, char *name) -{ - return Py_FindMethod(svideo_methods, (PyObject *)self, name); -} - -PyTypeObject Svtype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "sv.sv", /*tp_name*/ - sizeof(svobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)svideo_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)svideo_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ -}; - -static PyObject * -newsvobject(SV_nodeP svp) -{ - svobject *p; - - p = PyObject_New(svobject, &Svtype); - if (p == NULL) - return NULL; - p->ob_svideo = svp; - p->ob_info.format = 0; - p->ob_info.size = 0; - p->ob_info.width = 0; - p->ob_info.height = 0; - p->ob_info.samplingrate = 0; - return (PyObject *) p; -} - -static PyObject * -sv_OpenVideo(PyObject *self, PyObject *args) -{ - SV_nodeP svp; - - if (!PyArg_Parse(args, "")) - return NULL; - - svp = svOpenVideo(); - if (svp == NULL) - return sv_error(); - - return newsvobject(svp); -} - -static PyMethodDef sv_methods[] = { - {"InterleaveFields", (PyCFunction)sv_InterleaveFields, METH_OLDARGS}, - {"RGB8toRGB32", (PyCFunction)sv_RGB8toRGB32, METH_OLDARGS}, - {"YUVtoRGB", (PyCFunction)sv_YUVtoRGB, METH_OLDARGS}, - {"OpenVideo", (PyCFunction)sv_OpenVideo, METH_OLDARGS}, - {NULL, NULL} /* Sentinel */ -}; - -void -initsv(void) -{ - PyObject *m, *d; - - if (PyErr_WarnPy3k("the sv module has been removed in " - "Python 3.0", 2) < 0) - return; - - m = Py_InitModule("sv", sv_methods); - if (m == NULL) - return; - d = PyModule_GetDict(m); - - SvError = PyErr_NewException("sv.error", NULL, NULL); - if (SvError == NULL || PyDict_SetItemString(d, "error", SvError) != 0) - return; -} diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c index 15c0f92bf41..02a81f11dc3 100644 --- a/Modules/symtablemodule.c +++ b/Modules/symtablemodule.c @@ -1,7 +1,6 @@ #include "Python.h" #include "code.h" -#include "compile.h" #include "Python-ast.h" #include "symtable.h" @@ -33,7 +32,7 @@ symtable_symtable(PyObject *self, PyObject *args) st = Py_SymtableString(str, filename, start); if (st == NULL) return NULL; - t = st->st_symbols; + t = st->st_blocks; Py_INCREF(t); PyMem_Free((void *)st->st_future); PySymtable_Free(st); @@ -47,17 +46,29 @@ static PyMethodDef symtable_methods[] = { {NULL, NULL} /* sentinel */ }; +static struct PyModuleDef symtablemodule = { + PyModuleDef_HEAD_INIT, + "_symtable", + NULL, + -1, + symtable_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -init_symtable(void) +PyInit__symtable(void) { PyObject *m; if (PyType_Ready(&PySTEntry_Type) < 0) - return; + return NULL; - m = Py_InitModule("_symtable", symtable_methods); + m = PyModule_Create(&symtablemodule); if (m == NULL) - return; + return NULL; PyModule_AddIntConstant(m, "USE", USE); PyModule_AddIntConstant(m, "DEF_GLOBAL", DEF_GLOBAL); PyModule_AddIntConstant(m, "DEF_LOCAL", DEF_LOCAL); @@ -72,8 +83,7 @@ init_symtable(void) PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock); PyModule_AddIntConstant(m, "OPT_IMPORT_STAR", OPT_IMPORT_STAR); - PyModule_AddIntConstant(m, "OPT_EXEC", OPT_EXEC); - PyModule_AddIntConstant(m, "OPT_BARE_EXEC", OPT_BARE_EXEC); + PyModule_AddIntConstant(m, "OPT_TOPLEVEL", OPT_TOPLEVEL); PyModule_AddIntConstant(m, "LOCAL", LOCAL); PyModule_AddIntConstant(m, "GLOBAL_EXPLICIT", GLOBAL_EXPLICIT); @@ -81,6 +91,12 @@ init_symtable(void) PyModule_AddIntConstant(m, "FREE", FREE); PyModule_AddIntConstant(m, "CELL", CELL); - PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFF); + PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFFSET); PyModule_AddIntConstant(m, "SCOPE_MASK", SCOPE_MASK); + + if (PyErr_Occurred()) { + Py_DECREF(m); + m = 0; + } + return m; } diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c index 37eaebc975c..5b86963fc8f 100644 --- a/Modules/syslogmodule.c +++ b/Modules/syslogmodule.c @@ -68,9 +68,9 @@ syslog_get_argv(void) * is optional. */ - Py_ssize_t argv_len; + Py_ssize_t argv_len, scriptlen; PyObject *scriptobj; - char *atslash; + Py_UNICODE *atslash, *atstart; PyObject *argv = PySys_GetObject("argv"); if (argv == NULL) { @@ -87,16 +87,19 @@ syslog_get_argv(void) } scriptobj = PyList_GetItem(argv, 0); - if (!PyString_Check(scriptobj)) { + if (!PyUnicode_Check(scriptobj)) { return(NULL); } - if (PyString_GET_SIZE(scriptobj) == 0) { + scriptlen = PyUnicode_GET_SIZE(scriptobj); + if (scriptlen == 0) { return(NULL); } - atslash = strrchr(PyString_AsString(scriptobj), SEP); + atstart = PyUnicode_AS_UNICODE(scriptobj); + atslash = Py_UNICODE_strrchr(atstart, SEP); if (atslash) { - return(PyString_FromString(atslash + 1)); + return(PyUnicode_FromUnicode(atslash + 1, + scriptlen - (atslash - atstart) - 1)); } else { Py_INCREF(scriptobj); return(scriptobj); @@ -113,17 +116,20 @@ syslog_openlog(PyObject * self, PyObject * args, PyObject *kwds) long facility = LOG_USER; PyObject *new_S_ident_o = NULL; static char *keywords[] = {"ident", "logoption", "facility", 0}; + char *ident = NULL; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "|Sll:openlog", keywords, &new_S_ident_o, &logopt, &facility)) + "|Ull:openlog", keywords, &new_S_ident_o, &logopt, &facility)) return NULL; - if (new_S_ident_o) { Py_INCREF(new_S_ident_o); } + if (new_S_ident_o) { + Py_INCREF(new_S_ident_o); + } /* get sys.argv[0] or NULL if we can't for some reason */ if (!new_S_ident_o) { new_S_ident_o = syslog_get_argv(); - } + } Py_XDECREF(S_ident_o); S_ident_o = new_S_ident_o; @@ -132,8 +138,13 @@ syslog_openlog(PyObject * self, PyObject * args, PyObject *kwds) * make a copy, and syslog(3) later uses it. We can't garbagecollect it * If NULL, just let openlog figure it out (probably using C argv[0]). */ + if (S_ident_o) { + ident = _PyUnicode_AsString(S_ident_o); + if (ident == NULL) + return NULL; + } - openlog(S_ident_o ? PyString_AsString(S_ident_o) : NULL, logopt, facility); + openlog(ident, logopt, facility); S_log_open = 1; Py_INCREF(Py_None); @@ -144,17 +155,22 @@ syslog_openlog(PyObject * self, PyObject * args, PyObject *kwds) static PyObject * syslog_syslog(PyObject * self, PyObject * args) { - char *message; + PyObject *message_object; + const char *message; int priority = LOG_INFO; - if (!PyArg_ParseTuple(args, "is;[priority,] message string", - &priority, &message)) { + if (!PyArg_ParseTuple(args, "iU;[priority,] message string", + &priority, &message_object)) { PyErr_Clear(); - if (!PyArg_ParseTuple(args, "s;[priority,] message string", - &message)) + if (!PyArg_ParseTuple(args, "U;[priority,] message string", + &message_object)) return NULL; } + message = _PyUnicode_AsString(message_object); + if (message == NULL) + return NULL; + /* if log is not opened, open it now */ if (!S_log_open) { PyObject *openargs; @@ -173,8 +189,7 @@ syslog_syslog(PyObject * self, PyObject * args) Py_BEGIN_ALLOW_THREADS; syslog(priority, "%s", message); Py_END_ALLOW_THREADS; - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } static PyObject * @@ -198,7 +213,7 @@ syslog_setlogmask(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri)) return NULL; omaskpri = setlogmask(maskpri); - return PyInt_FromLong(omaskpri); + return PyLong_FromLong(omaskpri); } static PyObject * @@ -209,7 +224,7 @@ syslog_log_mask(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri)) return NULL; mask = LOG_MASK(pri); - return PyInt_FromLong(mask); + return PyLong_FromLong(mask); } static PyObject * @@ -220,7 +235,7 @@ syslog_log_upto(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri)) return NULL; mask = LOG_UPTO(pri); - return PyInt_FromLong(mask); + return PyLong_FromLong(mask); } /* List of functions defined in the module */ @@ -237,15 +252,28 @@ static PyMethodDef syslog_methods[] = { /* Initialization function for the module */ + +static struct PyModuleDef syslogmodule = { + PyModuleDef_HEAD_INIT, + "syslog", + NULL, + -1, + syslog_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initsyslog(void) +PyInit_syslog(void) { PyObject *m; /* Create the module and add the functions */ - m = Py_InitModule("syslog", syslog_methods); + m = PyModule_Create(&syslogmodule); if (m == NULL) - return; + return NULL; /* Add some symbolic constants to the module */ @@ -303,4 +331,5 @@ initsyslog(void) PyModule_AddIntConstant(m, "LOG_CRON", LOG_CRON); PyModule_AddIntConstant(m, "LOG_UUCP", LOG_UUCP); PyModule_AddIntConstant(m, "LOG_NEWS", LOG_NEWS); + return m; } diff --git a/Modules/termios.c b/Modules/termios.c index 57f30dc4cda..edeb6f5c452 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -2,8 +2,6 @@ #include "Python.h" -#define PyInit_termios inittermios - /* Apparently, on SGI, termios.h won't define CTRL if _XOPEN_SOURCE is defined, so we define it here. */ #if defined(__sgi) @@ -91,7 +89,7 @@ termios_tcgetattr(PyObject *self, PyObject *args) return NULL; for (i = 0; i < NCCS; i++) { ch = (char)mode.c_cc[i]; - v = PyString_FromStringAndSize(&ch, 1); + v = PyBytes_FromStringAndSize(&ch, 1); if (v == NULL) goto err; PyList_SetItem(cc, i, v); @@ -101,11 +99,11 @@ termios_tcgetattr(PyObject *self, PyObject *args) MIN and TIME slots are the same as the EOF and EOL slots. So we only do this in noncanonical input mode. */ if ((mode.c_lflag & ICANON) == 0) { - v = PyInt_FromLong((long)mode.c_cc[VMIN]); + v = PyLong_FromLong((long)mode.c_cc[VMIN]); if (v == NULL) goto err; PyList_SetItem(cc, VMIN, v); - v = PyInt_FromLong((long)mode.c_cc[VTIME]); + v = PyLong_FromLong((long)mode.c_cc[VTIME]); if (v == NULL) goto err; PyList_SetItem(cc, VTIME, v); @@ -114,12 +112,12 @@ termios_tcgetattr(PyObject *self, PyObject *args) if (!(v = PyList_New(7))) goto err; - PyList_SetItem(v, 0, PyInt_FromLong((long)mode.c_iflag)); - PyList_SetItem(v, 1, PyInt_FromLong((long)mode.c_oflag)); - PyList_SetItem(v, 2, PyInt_FromLong((long)mode.c_cflag)); - PyList_SetItem(v, 3, PyInt_FromLong((long)mode.c_lflag)); - PyList_SetItem(v, 4, PyInt_FromLong((long)ispeed)); - PyList_SetItem(v, 5, PyInt_FromLong((long)ospeed)); + PyList_SetItem(v, 0, PyLong_FromLong((long)mode.c_iflag)); + PyList_SetItem(v, 1, PyLong_FromLong((long)mode.c_oflag)); + PyList_SetItem(v, 2, PyLong_FromLong((long)mode.c_cflag)); + PyList_SetItem(v, 3, PyLong_FromLong((long)mode.c_lflag)); + PyList_SetItem(v, 4, PyLong_FromLong((long)ispeed)); + PyList_SetItem(v, 5, PyLong_FromLong((long)ospeed)); PyList_SetItem(v, 6, cc); if (PyErr_Occurred()){ Py_DECREF(v); @@ -163,12 +161,12 @@ termios_tcsetattr(PyObject *self, PyObject *args) /* Get the old mode, in case there are any hidden fields... */ if (tcgetattr(fd, &mode) == -1) return PyErr_SetFromErrno(TermiosError); - mode.c_iflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 0)); - mode.c_oflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 1)); - mode.c_cflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 2)); - mode.c_lflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 3)); - ispeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 4)); - ospeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 5)); + mode.c_iflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 0)); + mode.c_oflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 1)); + mode.c_cflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 2)); + mode.c_lflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 3)); + ispeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 4)); + ospeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 5)); cc = PyList_GetItem(term, 6); if (PyErr_Occurred()) return NULL; @@ -183,10 +181,10 @@ termios_tcsetattr(PyObject *self, PyObject *args) for (i = 0; i < NCCS; i++) { v = PyList_GetItem(cc, i); - if (PyString_Check(v) && PyString_Size(v) == 1) - mode.c_cc[i] = (cc_t) * PyString_AsString(v); - else if (PyInt_Check(v)) - mode.c_cc[i] = (cc_t) PyInt_AsLong(v); + if (PyBytes_Check(v) && PyBytes_Size(v) == 1) + mode.c_cc[i] = (cc_t) * PyBytes_AsString(v); + else if (PyLong_Check(v)) + mode.c_cc[i] = (cc_t) PyLong_AsLong(v); else { PyErr_SetString(PyExc_TypeError, "tcsetattr: elements of attributes must be characters or integers"); @@ -349,6 +347,43 @@ static struct constant { #ifdef B230400 {"B230400", B230400}, #endif +#ifdef B460800 + {"B460800", B460800}, +#endif +#ifdef B500000 + {"B500000", B500000}, +#endif +#ifdef B576000 + {"B576000", B576000}, +#endif +#ifdef B921600 + {"B921600", B921600}, +#endif +#ifdef B1000000 + {"B1000000", B1000000}, +#endif +#ifdef B1152000 + {"B1152000", B1152000}, +#endif +#ifdef B1500000 + {"B1500000", B1500000}, +#endif +#ifdef B2000000 + {"B2000000", B2000000}, +#endif +#ifdef B2500000 + {"B2500000", B2500000}, +#endif +#ifdef B3000000 + {"B3000000", B3000000}, +#endif +#ifdef B3500000 + {"B3500000", B3500000}, +#endif +#ifdef B4000000 + {"B4000000", B4000000}, +#endif + #ifdef CBAUDEX {"CBAUDEX", CBAUDEX}, #endif @@ -905,16 +940,27 @@ static struct constant { }; +static struct PyModuleDef termiosmodule = { + PyModuleDef_HEAD_INIT, + "termios", + termios__doc__, + -1, + termios_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC PyInit_termios(void) { PyObject *m; struct constant *constant = termios_constants; - m = Py_InitModule4("termios", termios_methods, termios__doc__, - (PyObject *)NULL, PYTHON_API_VERSION); + m = PyModule_Create(&termiosmodule); if (m == NULL) - return; + return NULL; if (TermiosError == NULL) { TermiosError = PyErr_NewException("termios.error", NULL, NULL); @@ -926,4 +972,5 @@ PyInit_termios(void) PyModule_AddIntConstant(m, constant->name, constant->value); ++constant; } + return m; } diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 13be691979f..35162ff1331 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -1,21 +1,7 @@ - /* Time module */ #include "Python.h" -#include "structseq.h" -#include "timefuncs.h" - -#ifdef __APPLE__ -#if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME) - /* - * floattime falls back to ftime when getttimeofday fails because the latter - * might fail on some platforms. This fallback is unwanted on MacOSX because - * that makes it impossible to use a binary build on OSX 10.4 on earlier - * releases of the OS. Therefore claim we don't support ftime. - */ -# undef HAVE_FTIME -#endif -#endif +#include "_time.h" #include <ctype.h> @@ -27,13 +13,6 @@ #include <io.h> #endif -#ifdef HAVE_FTIME -#include <sys/timeb.h> -#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) -extern int ftime(struct timeb *); -#endif /* MS_WINDOWS */ -#endif /* HAVE_FTIME */ - #if defined(__WATCOMC__) && !defined(__QNX__) #include <i86.h> #else @@ -55,7 +34,6 @@ static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType) } static long main_thread; - #if defined(__BORLANDC__) /* These overrides not needed for Win32 */ #define timezone _timezone @@ -80,17 +58,6 @@ static long main_thread; #include <sys/time.h> #endif -#ifdef __BEOS__ -#include <time.h> -/* For bigtime_t, snooze(). - [cjh] */ -#include <support/SupportDefs.h> -#include <kernel/OS.h> -#endif - -#ifdef RISCOS -extern int riscos_sleep(double); -#endif - /* Forward declarations */ static int floatsleep(double); static double floattime(void); @@ -98,32 +65,6 @@ static double floattime(void); /* For Y2K check */ static PyObject *moddict = NULL; -/* Exposed in timefuncs.h. */ -time_t -_PyTime_DoubleToTimet(double x) -{ - time_t result; - double diff; - - result = (time_t)x; - /* How much info did we lose? time_t may be an integral or - * floating type, and we don't know which. If it's integral, - * we don't know whether C truncates, rounds, returns the floor, - * etc. If we lost a second or more, the C rounding is - * unreasonable, or the input just doesn't fit in a time_t; - * call it an error regardless. Note that the original cast to - * time_t can cause a C error too, but nothing we can do to - * worm around that. - */ - diff = x - (double)result; - if (diff <= -1.0 || diff >= 1.0) { - PyErr_SetString(PyExc_ValueError, - "timestamp out of range for platform time_t"); - result = (time_t)-1; - } - return result; -} - static PyObject * time_time(PyObject *self, PyObject *unused) { @@ -251,7 +192,7 @@ tmtotuple(struct tm *p) if (v == NULL) return NULL; -#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val)) +#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val)) SET(0, p->tm_year + 1900); SET(1, p->tm_mon + 1); /* Want January == 1 */ @@ -345,41 +286,69 @@ PyDoc_STRVAR(localtime_doc, Convert seconds since the Epoch to a time tuple expressing local time.\n\ When 'seconds' is not passed in, convert the current time instead."); +/* Convert 9-item tuple to tm structure. Return 1 on success, set + * an exception and return 0 on error. + */ static int gettmarg(PyObject *args, struct tm *p) { int y; + memset((void *) p, '\0', sizeof(struct tm)); - if (!PyArg_Parse(args, "(iiiiiiiii)", - &y, - &p->tm_mon, - &p->tm_mday, - &p->tm_hour, - &p->tm_min, - &p->tm_sec, - &p->tm_wday, - &p->tm_yday, - &p->tm_isdst)) + if (!PyTuple_Check(args)) { + PyErr_SetString(PyExc_TypeError, + "Tuple or struct_time argument required"); return 0; - if (y < 1900) { + } + + if (!PyArg_ParseTuple(args, "iiiiiiiii", + &y, &p->tm_mon, &p->tm_mday, + &p->tm_hour, &p->tm_min, &p->tm_sec, + &p->tm_wday, &p->tm_yday, &p->tm_isdst)) + return 0; + + /* If year is specified with less than 4 digits, its interpretation + * depends on the accept2dyear value. + * + * If accept2dyear is true (default), a backward compatibility behavior is + * invoked as follows: + * + * - for 2-digit year, century is guessed according to POSIX rules for + * %y strptime format: 21st century for y < 69, 20th century + * otherwise. A deprecation warning is issued when century + * information is guessed in this way. + * + * - for 3-digit or negative year, a ValueError exception is raised. + * + * If accept2dyear is false (set by the program or as a result of a + * non-empty value assigned to PYTHONY2K environment variable) all year + * values are interpreted as given. + */ + if (y < 1000) { PyObject *accept = PyDict_GetItemString(moddict, "accept2dyear"); - if (accept == NULL || !PyInt_Check(accept) || - PyInt_AsLong(accept) == 0) { - PyErr_SetString(PyExc_ValueError, - "year >= 1900 required"); - return 0; + if (accept != NULL) { + int acceptval = PyObject_IsTrue(accept); + if (acceptval == -1) + return 0; + if (acceptval) { + if (0 <= y && y < 69) + y += 2000; + else if (69 <= y && y < 100) + y += 1900; + else { + PyErr_SetString(PyExc_ValueError, + "year out of range"); + return 0; + } + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "Century info guessed for a 2-digit year.", 1) != 0) + return 0; + } } - if (69 <= y && y <= 99) - y += 1900; - else if (0 <= y && y <= 68) - y += 2000; - else { - PyErr_SetString(PyExc_ValueError, - "year out of range"); + else return 0; - } } p->tm_year = y - 1900; p->tm_mon--; @@ -388,88 +357,132 @@ gettmarg(PyObject *args, struct tm *p) return 1; } -#ifdef HAVE_STRFTIME -static PyObject * -time_strftime(PyObject *self, PyObject *args) +/* Check values of the struct tm fields before it is passed to strftime() and + * asctime(). Return 1 if all values are valid, otherwise set an exception + * and returns 0. + */ +static int +checktm(struct tm* buf) { - PyObject *tup = NULL; - struct tm buf; - const char *fmt; - size_t fmtlen, buflen; - char *outbuf = 0; - size_t i; - - memset((void *) &buf, '\0', sizeof(buf)); - - if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup)) - return NULL; - - if (tup == NULL) { - time_t tt = time(NULL); - buf = *localtime(&tt); - } else if (!gettmarg(tup, &buf)) - return NULL; - - /* Checks added to make sure strftime() does not crash Python by + /* Checks added to make sure strftime() and asctime() does not crash Python by indexing blindly into some array for a textual representation - by some bad index (fixes bug #897625). - - Also support values of zero from Python code for arguments in which - that is out of range by forcing that value to the lowest value that - is valid (fixed bug #1520914). - - Valid ranges based on what is allowed in struct tm: - - - tm_year: [0, max(int)] (1) - - tm_mon: [0, 11] (2) - - tm_mday: [1, 31] - - tm_hour: [0, 23] - - tm_min: [0, 59] - - tm_sec: [0, 60] - - tm_wday: [0, 6] (1) - - tm_yday: [0, 365] (2) - - tm_isdst: [-max(int), max(int)] - - (1) gettmarg() handles bounds-checking. - (2) Python's acceptable range is one greater than the range in C, - thus need to check against automatic decrement by gettmarg(). + by some bad index (fixes bug #897625 and #6608). + + Also support values of zero from Python code for arguments in which + that is out of range by forcing that value to the lowest value that + is valid (fixed bug #1520914). + + Valid ranges based on what is allowed in struct tm: + + - tm_year: [0, max(int)] (1) + - tm_mon: [0, 11] (2) + - tm_mday: [1, 31] + - tm_hour: [0, 23] + - tm_min: [0, 59] + - tm_sec: [0, 60] + - tm_wday: [0, 6] (1) + - tm_yday: [0, 365] (2) + - tm_isdst: [-max(int), max(int)] + + (1) gettmarg() handles bounds-checking. + (2) Python's acceptable range is one greater than the range in C, + thus need to check against automatic decrement by gettmarg(). */ - if (buf.tm_mon == -1) - buf.tm_mon = 0; - else if (buf.tm_mon < 0 || buf.tm_mon > 11) { + if (buf->tm_mon == -1) + buf->tm_mon = 0; + else if (buf->tm_mon < 0 || buf->tm_mon > 11) { PyErr_SetString(PyExc_ValueError, "month out of range"); - return NULL; + return 0; } - if (buf.tm_mday == 0) - buf.tm_mday = 1; - else if (buf.tm_mday < 0 || buf.tm_mday > 31) { + if (buf->tm_mday == 0) + buf->tm_mday = 1; + else if (buf->tm_mday < 0 || buf->tm_mday > 31) { PyErr_SetString(PyExc_ValueError, "day of month out of range"); - return NULL; + return 0; } - if (buf.tm_hour < 0 || buf.tm_hour > 23) { + if (buf->tm_hour < 0 || buf->tm_hour > 23) { PyErr_SetString(PyExc_ValueError, "hour out of range"); - return NULL; + return 0; } - if (buf.tm_min < 0 || buf.tm_min > 59) { + if (buf->tm_min < 0 || buf->tm_min > 59) { PyErr_SetString(PyExc_ValueError, "minute out of range"); - return NULL; + return 0; } - if (buf.tm_sec < 0 || buf.tm_sec > 61) { + if (buf->tm_sec < 0 || buf->tm_sec > 61) { PyErr_SetString(PyExc_ValueError, "seconds out of range"); - return NULL; + return 0; } /* tm_wday does not need checking of its upper-bound since taking ``% 7`` in gettmarg() automatically restricts the range. */ - if (buf.tm_wday < 0) { + if (buf->tm_wday < 0) { PyErr_SetString(PyExc_ValueError, "day of week out of range"); - return NULL; + return 0; } - if (buf.tm_yday == -1) - buf.tm_yday = 0; - else if (buf.tm_yday < 0 || buf.tm_yday > 365) { + if (buf->tm_yday == -1) + buf->tm_yday = 0; + else if (buf->tm_yday < 0 || buf->tm_yday > 365) { PyErr_SetString(PyExc_ValueError, "day of year out of range"); + return 0; + } + return 1; +} + +#ifdef MS_WINDOWS + /* wcsftime() doesn't format correctly time zones, see issue #10653 */ +# undef HAVE_WCSFTIME +#endif + +#ifdef HAVE_STRFTIME +#ifdef HAVE_WCSFTIME +#define time_char wchar_t +#define format_time wcsftime +#define time_strlen wcslen +#else +#define time_char char +#define format_time strftime +#define time_strlen strlen +#endif + +static PyObject * +time_strftime(PyObject *self, PyObject *args) +{ + PyObject *tup = NULL; + struct tm buf; + const time_char *fmt; +#ifdef HAVE_WCSFTIME + wchar_t *format; +#else + PyObject *format; +#endif + PyObject *format_arg; + size_t fmtlen, buflen; + time_char *outbuf = NULL; + size_t i; + PyObject *ret = NULL; + + memset((void *) &buf, '\0', sizeof(buf)); + + /* Will always expect a unicode string to be passed as format. + Given that there's no str type anymore in py3k this seems safe. + */ + if (!PyArg_ParseTuple(args, "U|O:strftime", &format_arg, &tup)) return NULL; + + if (tup == NULL) { + time_t tt = time(NULL); + buf = *localtime(&tt); } + else if (!gettmarg(tup, &buf) || !checktm(&buf)) + return NULL; + +#if defined(_MSC_VER) || defined(sun) + if (buf.tm_year + 1900 < 1 || 9999 < buf.tm_year + 1900) { + PyErr_SetString(PyExc_ValueError, + "strftime() requires year in [1; 9999]"); + return NULL; + } +#endif + /* Normalize tm_isdst just in case someone foolishly implements %Z based on the assumption that tm_isdst falls within the range of [-1, 1] */ @@ -478,7 +491,20 @@ time_strftime(PyObject *self, PyObject *args) else if (buf.tm_isdst > 1) buf.tm_isdst = 1; -#ifdef MS_WINDOWS +#ifdef HAVE_WCSFTIME + format = PyUnicode_AsWideCharString(format_arg, NULL); + if (format == NULL) + return NULL; + fmt = format; +#else + /* Convert the unicode string to an ascii one */ + format = PyUnicode_EncodeFSDefault(format_arg); + if (format == NULL) + return NULL; + fmt = PyBytes_AS_STRING(format); +#endif + +#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME) /* check that the format string contains only valid directives */ for(outbuf = strchr(fmt, '%'); outbuf != NULL; @@ -490,45 +516,64 @@ time_strftime(PyObject *self, PyObject *args) !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1])) { PyErr_SetString(PyExc_ValueError, "Invalid format string"); - return 0; + Py_DECREF(format); + return NULL; } } #endif - fmtlen = strlen(fmt); + fmtlen = time_strlen(fmt); /* I hate these functions that presume you know how big the output * will be ahead of time... */ for (i = 1024; ; i += i) { - outbuf = (char *)malloc(i); +#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__) + int err; +#endif + outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char)); if (outbuf == NULL) { - return PyErr_NoMemory(); + PyErr_NoMemory(); + break; } - buflen = strftime(outbuf, i, fmt, &buf); + buflen = format_time(outbuf, i, fmt, &buf); +#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__) + err = errno; +#endif if (buflen > 0 || i >= 256 * fmtlen) { /* If the buffer is 256 times as long as the format, it's probably not failing for lack of room! More likely, the format yields an empty result, e.g. an empty format, or %Z when the timezone is unknown. */ - PyObject *ret; - ret = PyString_FromStringAndSize(outbuf, buflen); - free(outbuf); - return ret; +#ifdef HAVE_WCSFTIME + ret = PyUnicode_FromWideChar(outbuf, buflen); +#else + ret = PyUnicode_DecodeFSDefaultAndSize(outbuf, buflen); +#endif + PyMem_Free(outbuf); + break; } - free(outbuf); + PyMem_Free(outbuf); #if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__) /* VisualStudio .NET 2005 does this properly */ - if (buflen == 0 && errno == EINVAL) { + if (buflen == 0 && err == EINVAL) { PyErr_SetString(PyExc_ValueError, "Invalid format string"); - return 0; + break; } #endif - } +#ifdef HAVE_WCSFTIME + PyMem_Free(format); +#else + Py_DECREF(format); +#endif + return ret; } +#undef time_char +#undef format_time + PyDoc_STRVAR(strftime_doc, "strftime(format[, tuple]) -> string\n\ \n\ @@ -551,34 +596,59 @@ time_strptime(PyObject *self, PyObject *args) return strptime_result; } + 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())."); +static PyObject * +_asctime(struct tm *timeptr) +{ + /* Inspired by Open Group reference implementation available at + * http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */ + static char wday_name[7][3] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" + }; + static char mon_name[12][3] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; + char buf[20]; /* 'Sun Sep 16 01:03:52\0' */ + int n; + + n = PyOS_snprintf(buf, sizeof(buf), "%.3s %.3s%3d %.2d:%.2d:%.2d", + wday_name[timeptr->tm_wday], + mon_name[timeptr->tm_mon], + timeptr->tm_mday, timeptr->tm_hour, + timeptr->tm_min, timeptr->tm_sec); + /* XXX: since the fields used by snprintf above are validated in checktm, + * the following condition should never trigger. We keep the check because + * historically fixed size buffer used in asctime was the source of + * crashes. */ + if (n + 1 != sizeof(buf)) { + PyErr_SetString(PyExc_ValueError, "unconvertible time"); + return NULL; + } + + return PyUnicode_FromFormat("%s %d", buf, 1900 + timeptr->tm_year); +} static PyObject * time_asctime(PyObject *self, PyObject *args) { PyObject *tup = NULL; struct tm buf; - char *p; + if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup)) return NULL; if (tup == NULL) { time_t tt = time(NULL); buf = *localtime(&tt); - } else if (!gettmarg(tup, &buf)) + } else if (!gettmarg(tup, &buf) || !checktm(&buf)) return NULL; - p = asctime(&buf); - if (p == NULL) { - PyErr_SetString(PyExc_ValueError, "invalid time"); - return NULL; - } - if (p[24] == '\n') - p[24] = '\0'; - return PyString_FromString(p); + return _asctime(&buf); } PyDoc_STRVAR(asctime_doc, @@ -593,7 +663,7 @@ time_ctime(PyObject *self, PyObject *args) { PyObject *ot = NULL; time_t tt; - char *p; + struct tm *timeptr; if (!PyArg_UnpackTuple(args, "ctime", 0, 1, &ot)) return NULL; @@ -607,14 +677,12 @@ time_ctime(PyObject *self, PyObject *args) if (tt == (time_t)-1 && PyErr_Occurred()) return NULL; } - p = ctime(&tt); - if (p == NULL) { + timeptr = localtime(&tt); + if (timeptr == NULL) { PyErr_SetString(PyExc_ValueError, "unconvertible time"); return NULL; } - if (p[24] == '\n') - p[24] = '\0'; - return PyString_FromString(p); + return _asctime(timeptr); } PyDoc_STRVAR(ctime_doc, @@ -651,7 +719,7 @@ Convert a time tuple in local time to seconds since the Epoch."); #endif /* HAVE_MKTIME */ #ifdef HAVE_WORKING_TZSET -static void inittimezone(PyObject *module); +static void PyInit_timezone(PyObject *module); static PyObject * time_tzset(PyObject *self, PyObject *unused) @@ -666,7 +734,7 @@ time_tzset(PyObject *self, PyObject *unused) tzset(); /* Reset timezone, altzone, daylight and tzname */ - inittimezone(m); + PyInit_timezone(m); Py_DECREF(m); Py_INCREF(Py_None); @@ -688,8 +756,8 @@ should not be relied on."); #endif /* HAVE_WORKING_TZSET */ static void -inittimezone(PyObject *m) { - /* This code moved from inittime wholesale to allow calling it from +PyInit_timezone(PyObject *m) { + /* This code moved from PyInit_time wholesale to allow calling it from time_tzset. In the future, some parts of it can be moved back (for platforms that don't HAVE_WORKING_TZSET, when we know what they are), and the extraneous calls to tzset(3) should be removed. @@ -706,6 +774,7 @@ inittimezone(PyObject *m) { And I'm lazy and hate C so nyer. */ #if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__) + PyObject *otz0, *otz1; tzset(); #ifdef PYOS_OS2 PyModule_AddIntConstant(m, "timezone", _timezone); @@ -722,8 +791,9 @@ inittimezone(PyObject *m) { #endif /* PYOS_OS2 */ #endif PyModule_AddIntConstant(m, "daylight", daylight); - PyModule_AddObject(m, "tzname", - Py_BuildValue("(zz)", tzname[0], tzname[1])); + otz0 = PyUnicode_DecodeFSDefaultAndSize(tzname[0], strlen(tzname[0])); + otz1 = PyUnicode_DecodeFSDefaultAndSize(tzname[1], strlen(tzname[1])); + PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1)); #else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/ #ifdef HAVE_STRUCT_TM_TM_ZONE { @@ -846,14 +916,27 @@ strptime() -- parse string to time tuple according to format specification\n\ tzset() -- change the local timezone"); + +static struct PyModuleDef timemodule = { + PyModuleDef_HEAD_INIT, + "time", + module_doc, + -1, + time_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -inittime(void) +PyInit_time(void) { PyObject *m; char *p; - m = Py_InitModule3("time", time_methods, module_doc); + m = PyModule_Create(&timemodule); if (m == NULL) - return; + return NULL; /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */ p = Py_GETENV("PYTHONY2K"); @@ -868,7 +951,7 @@ inittime(void) Py_INCREF(moddict); /* Set, or reset, module variables like time.timezone */ - inittimezone(m); + PyInit_timezone(m); #ifdef MS_WINDOWS /* Helper to allow interrupts for Windows. @@ -886,46 +969,15 @@ inittime(void) Py_INCREF(&StructTimeType); PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType); initialized = 1; + return m; } - -/* Implement floattime() for various platforms */ - static double floattime(void) { - /* There are three ways to get the time: - (1) gettimeofday() -- resolution in microseconds - (2) ftime() -- resolution in milliseconds - (3) time() -- resolution in seconds - In all cases the return value is a float in seconds. - Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may - fail, so we fall back on ftime() or time(). - Note: clock resolution does not imply clock accuracy! */ -#ifdef HAVE_GETTIMEOFDAY - { - struct timeval t; -#ifdef GETTIMEOFDAY_NO_TZ - if (gettimeofday(&t) == 0) - return (double)t.tv_sec + t.tv_usec*0.000001; -#else /* !GETTIMEOFDAY_NO_TZ */ - if (gettimeofday(&t, (struct timezone *)NULL) == 0) - return (double)t.tv_sec + t.tv_usec*0.000001; -#endif /* !GETTIMEOFDAY_NO_TZ */ - } - -#endif /* !HAVE_GETTIMEOFDAY */ - { -#if defined(HAVE_FTIME) - struct timeb t; - ftime(&t); - return (double)t.time + (double)t.millitm * (double)0.001; -#else /* !HAVE_FTIME */ - time_t secs; - time(&secs); - return (double)secs; -#endif /* !HAVE_FTIME */ - } + _PyTime_timeval t; + _PyTime_gettimeofday(&t); + return (double)t.tv_sec + t.tv_usec*0.000001; } @@ -937,7 +989,7 @@ static int floatsleep(double secs) { /* XXX Should test for MS_WINDOWS first! */ -#if defined(HAVE_SELECT) && !defined(__BEOS__) && !defined(__EMX__) +#if defined(HAVE_SELECT) && !defined(__EMX__) struct timeval t; double frac; frac = fmod(secs, 1.0); @@ -1006,46 +1058,6 @@ floatsleep(double secs) return -1; } Py_END_ALLOW_THREADS -#elif defined(__BEOS__) - /* This sleep *CAN BE* interrupted. */ - { - if( secs <= 0.0 ) { - return; - } - - Py_BEGIN_ALLOW_THREADS - /* BeOS snooze() is in microseconds... */ - if( snooze( (bigtime_t)( secs * 1000.0 * 1000.0 ) ) == B_INTERRUPTED ) { - Py_BLOCK_THREADS - PyErr_SetFromErrno( PyExc_IOError ); - return -1; - } - Py_END_ALLOW_THREADS - } -#elif defined(RISCOS) - if (secs <= 0.0) - return 0; - Py_BEGIN_ALLOW_THREADS - /* This sleep *CAN BE* interrupted. */ - if ( riscos_sleep(secs) ) - return -1; - Py_END_ALLOW_THREADS -#elif defined(PLAN9) - { - double millisecs = secs * 1000.0; - if (millisecs > (double)LONG_MAX) { - PyErr_SetString(PyExc_OverflowError, "sleep length is too large"); - return -1; - } - /* This sleep *CAN BE* interrupted. */ - Py_BEGIN_ALLOW_THREADS - if(sleep((long)millisecs) < 0){ - 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/timing.h b/Modules/timing.h deleted file mode 100644 index 553d76f7f70..00000000000 --- a/Modules/timing.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 1993 George V. Neville-Neil - * 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. The name, George Neville-Neil may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. - */ - -#ifndef _TIMING_H_ -#define _TIMING_H_ - -#ifdef TIME_WITH_SYS_TIME -#include <sys/time.h> -#include <time.h> -#else /* !TIME_WITH_SYS_TIME */ -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#else /* !HAVE_SYS_TIME_H */ -#include <time.h> -#endif /* !HAVE_SYS_TIME_H */ -#endif /* !TIME_WITH_SYS_TIME */ - -static struct timeval aftertp, beforetp; - -#define BEGINTIMING gettimeofday(&beforetp, NULL) - -#define ENDTIMING gettimeofday(&aftertp, NULL); \ - if(beforetp.tv_usec > aftertp.tv_usec) \ - { \ - aftertp.tv_usec += 1000000; \ - aftertp.tv_sec--; \ - } - -#define TIMINGUS (((aftertp.tv_sec - beforetp.tv_sec) * 1000000) + \ - (aftertp.tv_usec - beforetp.tv_usec)) - -#define TIMINGMS (((aftertp.tv_sec - beforetp.tv_sec) * 1000) + \ - ((aftertp.tv_usec - beforetp.tv_usec) / 1000)) - -#define TIMINGS ((aftertp.tv_sec - beforetp.tv_sec) + \ - (aftertp.tv_usec - beforetp.tv_usec) / 1000000) - -#endif /* _TIMING_H_ */ diff --git a/Modules/timingmodule.c b/Modules/timingmodule.c deleted file mode 100644 index a4e2c7eb17c..00000000000 --- a/Modules/timingmodule.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Author: George V. Neville-Neil - */ - -#include "Python.h" - -/* Our stuff... */ -#include "timing.h" - -static PyObject * -start_timing(PyObject *self) -{ - Py_INCREF(Py_None); - BEGINTIMING; - return Py_None; -} - -static PyObject * -finish_timing(PyObject *self) -{ - ENDTIMING - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -seconds(PyObject *self) -{ - return PyInt_FromLong(TIMINGS); -} - -static PyObject * -milli(PyObject *self) -{ - return PyInt_FromLong(TIMINGMS); -} - -static PyObject * -micro(PyObject *self) -{ - return PyInt_FromLong(TIMINGUS); -} - - -static PyMethodDef timing_methods[] = { - {"start", (PyCFunction)start_timing, METH_NOARGS}, - {"finish", (PyCFunction)finish_timing, METH_NOARGS}, - {"seconds", (PyCFunction)seconds, METH_NOARGS}, - {"milli", (PyCFunction)milli, METH_NOARGS}, - {"micro", (PyCFunction)micro, METH_NOARGS}, - {NULL, NULL} -}; - - -PyMODINIT_FUNC inittiming(void) -{ - if (PyErr_WarnPy3k("the timing module has been removed in " - "Python 3.0; use time.clock() instead", 2) < 0) - return; - - (void)Py_InitModule("timing", timing_methods); -} diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 95bdf3cfd1e..4db5087f113 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1,12 +1,13 @@ /* ------------------------------------------------------------------------ - unicodedata -- Provides access to the Unicode 5.2 data base. + unicodedata -- Provides access to the Unicode database. - Data was extracted from the Unicode 5.2 UnicodeData.txt file. + Data was extracted from the UnicodeData.txt file. + The current version number is reported in the unidata_version constant. Written by Marc-Andre Lemburg (mal@lemburg.com). Modified for Python 2.0 by Fredrik Lundh (fredrik@pythonware.com) - Modified by Martin v. Löwis (martin@v.loewis.de) + Modified by Martin v. Löwis (martin@v.loewis.de) Copyright (c) Corporation for National Research Initiatives. @@ -73,6 +74,7 @@ static PyMemberDef DB_members[] = { /* forward declaration */ static PyTypeObject UCD_Type; +#define UCD_Check(o) (Py_TYPE(o)==&UCD_Type) static PyObject* new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4), @@ -130,7 +132,7 @@ unicodedata_decimal(PyObject *self, PyObject *args) if (c == (Py_UCS4)-1) return NULL; - if (self) { + if (self && UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) { /* unassigned */ @@ -156,7 +158,7 @@ unicodedata_decimal(PyObject *self, PyObject *args) return defobj; } } - return PyInt_FromLong(rc); + return PyLong_FromLong(rc); } PyDoc_STRVAR(unicodedata_digit__doc__, @@ -190,7 +192,7 @@ unicodedata_digit(PyObject *self, PyObject *args) return defobj; } } - return PyInt_FromLong(rc); + return PyLong_FromLong(rc); } PyDoc_STRVAR(unicodedata_numeric__doc__, @@ -215,7 +217,7 @@ unicodedata_numeric(PyObject *self, PyObject *args) if (c == (Py_UCS4)-1) return NULL; - if (self) { + if (self && UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) { /* unassigned */ @@ -263,12 +265,12 @@ unicodedata_category(PyObject *self, PyObject *args) if (c == (Py_UCS4)-1) return NULL; index = (int) _getrecord_ex(c)->category; - if (self) { + if (self && UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed != 0xFF) index = old->category_changed; } - return PyString_FromString(_PyUnicode_CategoryNames[index]); + return PyUnicode_FromString(_PyUnicode_CategoryNames[index]); } PyDoc_STRVAR(unicodedata_bidirectional__doc__, @@ -292,14 +294,14 @@ unicodedata_bidirectional(PyObject *self, PyObject *args) if (c == (Py_UCS4)-1) return NULL; index = (int) _getrecord_ex(c)->bidirectional; - if (self) { + if (self && UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ else if (old->bidir_changed != 0xFF) index = old->bidir_changed; } - return PyString_FromString(_PyUnicode_BidirectionalNames[index]); + return PyUnicode_FromString(_PyUnicode_BidirectionalNames[index]); } PyDoc_STRVAR(unicodedata_combining__doc__, @@ -323,12 +325,12 @@ unicodedata_combining(PyObject *self, PyObject *args) if (c == (Py_UCS4)-1) return NULL; index = (int) _getrecord_ex(c)->combining; - if (self) { + if (self && UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ } - return PyInt_FromLong(index); + return PyLong_FromLong(index); } PyDoc_STRVAR(unicodedata_mirrored__doc__, @@ -352,14 +354,14 @@ unicodedata_mirrored(PyObject *self, PyObject *args) if (c == (Py_UCS4)-1) return NULL; index = (int) _getrecord_ex(c)->mirrored; - if (self) { + if (self && UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ else if (old->mirrored_changed != 0xFF) index = old->mirrored_changed; } - return PyInt_FromLong(index); + return PyLong_FromLong(index); } PyDoc_STRVAR(unicodedata_east_asian_width__doc__, @@ -382,12 +384,12 @@ unicodedata_east_asian_width(PyObject *self, PyObject *args) if (c == (Py_UCS4)-1) return NULL; index = (int) _getrecord_ex(c)->east_asian_width; - if (self) { + if (self && UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) index = 0; /* unassigned */ } - return PyString_FromString(_PyUnicode_EastAsianWidthNames[index]); + return PyUnicode_FromString(_PyUnicode_EastAsianWidthNames[index]); } PyDoc_STRVAR(unicodedata_decomposition__doc__, @@ -402,7 +404,8 @@ unicodedata_decomposition(PyObject *self, PyObject *args) { PyUnicodeObject *v; char decomp[256]; - int code, index, count, i; + int code, index, count; + size_t i; unsigned int prefix_index; Py_UCS4 c; @@ -415,10 +418,10 @@ unicodedata_decomposition(PyObject *self, PyObject *args) code = (int)c; - if (self) { + if (self && UCD_Check(self)) { const change_record *old = get_old_record(self, c); if (old->category_changed == 0) - return PyString_FromString(""); /* unassigned */ + return PyUnicode_FromString(""); /* unassigned */ } if (code < 0 || code >= 0x110000) @@ -449,15 +452,12 @@ unicodedata_decomposition(PyObject *self, PyObject *args) while (count-- > 0) { if (i) decomp[i++] = ' '; - assert((size_t)i < sizeof(decomp)); + assert(i < sizeof(decomp)); PyOS_snprintf(decomp + i, sizeof(decomp) - i, "%04X", decomp_data[++index]); i += strlen(decomp + i); } - - decomp[i] = '\0'; - - return PyString_FromString(decomp); + return PyUnicode_FromStringAndSize(decomp, i); } static void @@ -465,7 +465,8 @@ get_decomp_record(PyObject *self, Py_UCS4 code, int *index, int *prefix, int *co { if (code >= 0x110000) { *index = 0; - } else if (self && get_old_record(self, code)->category_changed==0) { + } else if (self && UCD_Check(self) && + get_old_record(self, code)->category_changed==0) { /* unassigned in old version */ *index = 0; } @@ -522,7 +523,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k) /* Hangul Decomposition adds three characters in a single step, so we need atleast that much room. */ if (space < 3) { - Py_ssize_t newsize = PyString_GET_SIZE(result) + 10; + Py_ssize_t newsize = PyUnicode_GET_SIZE(result) + 10; space += 10; if (PyUnicode_Resize(&result, newsize) == -1) return NULL; @@ -544,7 +545,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k) continue; } /* normalization changes */ - if (self) { + if (self && UCD_Check(self)) { Py_UCS4 value = ((PreviousDBVersion*)self)->normalization(code); if (value != 0) { stack[stackptr++] = value; @@ -736,7 +737,7 @@ is_normalized(PyObject *self, PyObject *input, int nfc, int k) /* An older version of the database is requested, quickchecks must be disabled. */ - if (self != NULL) + if (self && UCD_Check(self)) return 0; /* The two quickcheck bits at this shift mean 0=Yes, 1=Maybe, 2=No, @@ -869,14 +870,16 @@ static char *hangul_syllables[][3] = { { 0, 0, "H" } }; +/* These ranges need to match makeunicodedata.py:cjk_ranges. */ static int is_unified_ideograph(Py_UCS4 code) { - return ( - (0x3400 <= code && code <= 0x4DB5) || /* CJK Ideograph Extension A */ - (0x4E00 <= code && code <= 0x9FCB) || /* CJK Ideograph, Unicode 5.2 */ + return + (0x3400 <= code && code <= 0x4DB5) || /* CJK Ideograph Extension A */ + (0x4E00 <= code && code <= 0x9FCB) || /* CJK Ideograph */ (0x20000 <= code && code <= 0x2A6D6) || /* CJK Ideograph Extension B */ - (0x2A700 <= code && code <= 0x2B734)); /* CJK Ideograph Extension C */ + (0x2A700 <= code && code <= 0x2B734) || /* CJK Ideograph Extension C */ + (0x2B740 <= code && code <= 0x2B81D); /* CJK Ideograph Extension D */ } static int @@ -890,7 +893,7 @@ _getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen) if (code >= 0x110000) return 0; - if (self) { + if (self && UCD_Check(self)) { const change_record *old = get_old_record(self, code); if (old->category_changed == 0) { /* unassigned */ @@ -1126,7 +1129,7 @@ unicodedata_name(PyObject* self, PyObject* args) } } - return Py_BuildValue("s", name); + return PyUnicode_FromString(name); } PyDoc_STRVAR(unicodedata_lookup__doc__, @@ -1201,7 +1204,7 @@ static PyTypeObject UCD_Type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -1239,23 +1242,35 @@ PyDoc_STRVAR(unicodedata_docstring, "This module provides access to the Unicode Character Database which\n\ defines character properties for all Unicode characters. The data in\n\ this database is based on the UnicodeData.txt file version\n\ -5.2.0 which is publically available from ftp://ftp.unicode.org/.\n\ +6.0.0 which is publically available from ftp://ftp.unicode.org/.\n\ \n\ The module uses the same names and symbols as defined by the\n\ -UnicodeData File Format 5.2.0 (see\n\ -http://www.unicode.org/reports/tr44/tr44-4.html)."); +UnicodeData File Format 6.0.0 (see\n\ +http://www.unicode.org/reports/tr44/tr44-6.html)."); + + +static struct PyModuleDef unicodedatamodule = { + PyModuleDef_HEAD_INIT, + "unicodedata", + unicodedata_docstring, + -1, + unicodedata_functions, + NULL, + NULL, + NULL, + NULL +}; PyMODINIT_FUNC -initunicodedata(void) +PyInit_unicodedata(void) { PyObject *m, *v; Py_TYPE(&UCD_Type) = &PyType_Type; - m = Py_InitModule3( - "unicodedata", unicodedata_functions, unicodedata_docstring); + m = PyModule_Create(&unicodedatamodule); if (!m) - return; + return NULL; PyModule_AddStringConstant(m, "unidata_version", UNIDATA_VERSION); Py_INCREF(&UCD_Type); @@ -1270,6 +1285,7 @@ initunicodedata(void) v = PyCapsule_New((void *)&hashAPI, PyUnicodeData_CAPSULE_NAME, NULL); if (v != NULL) PyModule_AddObject(m, "ucnhash_CAPI", v); + return m; } /* diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h index fd0dacdd374..8e2e72452ac 100644 --- a/Modules/unicodedata_db.h +++ b/Modules/unicodedata_db.h @@ -1,6 +1,6 @@ -/* this file was generated by Tools/unicode/makeunicodedata.py 2.6 */ +/* this file was generated by Tools/unicode/makeunicodedata.py 3.2 */ -#define UNIDATA_VERSION "5.2.0" +#define UNIDATA_VERSION "6.0.0" /* a list of unique database records */ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {0, 0, 0, 0, 0, 0}, @@ -134,7 +134,6 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {19, 0, 5, 0, 5, 136}, {7, 0, 9, 0, 5, 0}, {30, 0, 5, 0, 5, 0}, - {14, 0, 15, 0, 5, 0}, {4, 36, 14, 0, 5, 0}, {4, 0, 14, 0, 5, 0}, {7, 0, 4, 0, 5, 0}, @@ -182,6 +181,7 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {4, 234, 14, 0, 5, 0}, {4, 214, 14, 0, 5, 0}, {4, 202, 14, 0, 5, 0}, + {4, 233, 14, 0, 5, 0}, {2, 0, 1, 0, 5, 138}, {2, 0, 1, 0, 5, 170}, {3, 0, 1, 0, 5, 10}, @@ -189,6 +189,7 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {29, 0, 19, 0, 5, 170}, {10, 0, 18, 0, 5, 170}, {10, 0, 18, 0, 5, 136}, + {14, 0, 15, 0, 5, 0}, {14, 0, 4, 0, 5, 0}, {21, 0, 19, 0, 4, 0}, {21, 0, 19, 0, 5, 136}, @@ -274,6 +275,7 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {19, 0, 4, 0, 5, 170}, {4, 26, 14, 0, 5, 0}, {19, 0, 4, 0, 5, 136}, + {29, 0, 5, 0, 5, 0}, {23, 0, 19, 0, 5, 0}, {28, 0, 5, 0, 5, 136}, {26, 0, 19, 0, 2, 136}, @@ -687,31 +689,31 @@ static unsigned char index1[] = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 102, 103, 100, 100, 100, 100, 100, 100, 100, 100, 104, 41, 41, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 17, 115, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 120, 120, 121, 122, 123, 124, - 125, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 17, 136, 137, - 138, 139, 140, 17, 17, 17, 17, 17, 17, 141, 17, 142, 17, 143, 17, 144, - 17, 145, 17, 17, 17, 146, 17, 17, 17, 17, 147, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 41, 41, 41, 41, 41, 41, 148, 17, 149, 17, 17, 17, + 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 122, 123, 124, + 125, 126, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 17, 137, + 138, 139, 140, 141, 17, 17, 17, 17, 17, 17, 142, 17, 143, 17, 144, 17, + 145, 17, 146, 17, 17, 17, 147, 17, 17, 17, 148, 149, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 41, 41, 41, 41, 41, 41, 41, 41, 150, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 41, 41, 41, 41, 41, 41, 150, 17, 151, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 41, 41, 41, 41, 41, 41, 41, 41, 152, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 41, 41, 41, 41, 153, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, @@ -719,16 +721,16 @@ static unsigned char index1[] = { 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 154, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 78, + 155, 156, 157, 158, 17, 159, 17, 160, 161, 162, 163, 164, 165, 166, 167, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 78, 151, - 152, 153, 154, 17, 155, 17, 156, 157, 158, 159, 160, 161, 162, 163, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 164, 165, 166, 167, 168, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 100, 100, 100, 100, 100, 100, 100, 100, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 168, 169, 170, 171, 172, + 17, 173, 174, 175, 176, 177, 178, 179, 180, 181, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, @@ -752,17 +754,17 @@ static unsigned char index1[] = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, 100, 100, 169, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 182, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, 100, 100, 100, 100, 100, 100, 100, 170, 17, 17, 17, 17, 17, 17, 17, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 183, 100, 184, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 120, 120, 120, - 120, 171, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 121, + 121, 121, 121, 185, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, @@ -1075,7 +1077,8 @@ static unsigned char index1[] = { 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 172, 17, 173, 174, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 186, 17, 187, + 188, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, @@ -1103,81 +1106,80 @@ static unsigned char index1[] = { 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 175, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 175, + 17, 17, 17, 17, 17, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 189, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 189, }; static unsigned short index2[] = { @@ -1252,8 +1254,8 @@ static unsigned short index2[] = { 38, 43, 38, 43, 38, 43, 44, 46, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 46, 38, 43, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, - 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 0, 0, 0, + 0, 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, 0, 0, 52, 82, 82, 82, 82, 82, 82, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, @@ -1266,12 +1268,12 @@ static unsigned short index2[] = { 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 105, 105, 105, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 106, 106, 106, 0, 0, 77, 77, 107, 108, 108, 109, 110, 111, 27, 27, 80, 80, 80, 80, - 80, 80, 80, 80, 112, 113, 114, 111, 0, 0, 111, 111, 0, 115, 116, 116, + 80, 80, 80, 80, 112, 113, 114, 111, 0, 0, 111, 111, 115, 115, 116, 116, 116, 116, 116, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 117, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 118, 119, 120, 112, 113, 114, 121, 122, 123, 123, 124, 84, 80, 80, 80, 80, 80, 84, 80, - 80, 0, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 108, 126, 126, + 80, 84, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 108, 126, 126, 111, 115, 115, 127, 115, 115, 115, 115, 128, 128, 128, 128, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, @@ -1279,11 +1281,11 @@ static unsigned short index2[] = { 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 116, 115, 116, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 116, 111, 115, 80, 80, 80, 80, 80, 80, 80, 106, 81, + 115, 115, 115, 115, 116, 111, 115, 80, 80, 80, 80, 80, 80, 80, 106, 27, 80, 80, 80, 80, 84, 80, 117, 117, 80, 80, 27, 84, 80, 80, 84, 115, 115, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 115, 115, 115, 130, 130, 115, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, - 111, 111, 0, 131, 115, 132, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 111, 111, 0, 106, 115, 131, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 80, 84, 80, 80, 84, 80, 80, 84, 84, 84, 80, 84, 84, 80, 84, 80, 80, 80, 84, 80, 84, 80, 84, 80, 84, 80, 80, @@ -1293,182 +1295,185 @@ static unsigned short index2[] = { 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 133, 133, 133, 133, 133, 133, 133, 133, - 133, 133, 133, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, 105, 105, 105, 105, 105, 105, + 115, 115, 115, 115, 115, 115, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 80, 80, - 80, 80, 80, 80, 80, 84, 80, 135, 135, 27, 136, 136, 136, 135, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 84, 80, 134, 134, 27, 135, 135, 135, 134, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 105, 105, 105, 105, 105, 80, 80, 80, 80, 135, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 135, 80, 80, 80, 135, 80, 80, 80, 80, 80, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 105, 80, 80, 80, 80, 134, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 134, 80, 80, 80, 134, 80, 80, 80, 80, 80, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 102, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 84, 84, 84, + 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 133, 133, 133, 137, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 132, + 132, 136, 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, 138, 47, 47, 47, 47, 47, 47, 47, 138, 47, 47, - 138, 47, 47, 47, 47, 47, 0, 0, 139, 47, 137, 137, 137, 133, 133, 133, - 133, 133, 133, 133, 133, 137, 137, 137, 137, 140, 137, 0, 47, 80, 84, 80, - 80, 133, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 47, 47, 133, 133, - 82, 82, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 82, 52, 47, 0, - 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 0, 133, 137, 137, 0, 47, 47, + 47, 47, 47, 137, 47, 47, 47, 47, 47, 47, 47, 137, 47, 47, 137, 47, 47, + 47, 47, 47, 132, 136, 138, 47, 136, 136, 136, 132, 132, 132, 132, 132, + 132, 132, 132, 136, 136, 136, 136, 139, 136, 136, 47, 80, 84, 80, 80, + 132, 132, 132, 140, 140, 140, 140, 140, 140, 140, 140, 47, 47, 132, 132, + 82, 82, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 82, 52, 47, 47, + 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 132, 136, 136, 0, 47, + 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, + 47, 47, 47, 47, 47, 47, 0, 47, 0, 0, 0, 47, 47, 47, 47, 0, 0, 142, 47, + 143, 136, 136, 132, 132, 132, 132, 0, 0, 136, 136, 0, 0, 144, 144, 139, + 47, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 140, 140, 0, 140, 47, 47, + 132, 132, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 47, 47, + 145, 145, 146, 146, 146, 146, 146, 146, 79, 145, 0, 0, 0, 0, 0, 132, 132, + 136, 0, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 140, 0, 47, 140, 0, 47, 47, 0, 0, + 142, 0, 136, 136, 136, 132, 132, 0, 0, 0, 0, 132, 132, 0, 0, 132, 132, + 139, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 140, 140, 140, 47, 0, 140, 0, 0, + 0, 0, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 132, + 132, 47, 47, 47, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 132, 136, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 0, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, + 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 142, + 47, 136, 136, 136, 132, 132, 132, 132, 132, 0, 132, 132, 136, 0, 136, + 136, 139, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, + 132, 132, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 145, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 136, 136, 0, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, - 47, 47, 47, 47, 47, 0, 47, 0, 0, 0, 47, 47, 47, 47, 0, 0, 143, 47, 144, - 137, 137, 133, 133, 133, 133, 0, 0, 137, 137, 0, 0, 145, 145, 140, 47, 0, - 0, 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 141, 141, 0, 141, 47, 47, 133, 133, - 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 47, 47, 146, 146, - 147, 147, 147, 147, 147, 147, 79, 146, 0, 0, 0, 0, 0, 133, 133, 137, 0, - 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, - 47, 47, 47, 47, 47, 47, 0, 47, 141, 0, 47, 141, 0, 47, 47, 0, 0, 143, 0, - 137, 137, 137, 133, 133, 0, 0, 0, 0, 133, 133, 0, 0, 133, 133, 140, 0, 0, - 0, 133, 0, 0, 0, 0, 0, 0, 0, 141, 141, 141, 47, 0, 141, 0, 0, 0, 0, 0, 0, - 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 133, 133, 47, 47, - 47, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 133, 137, 0, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, - 47, 47, 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 143, 47, 137, - 137, 137, 133, 133, 133, 133, 133, 0, 133, 133, 137, 0, 137, 137, 140, 0, - 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 133, 133, 0, - 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 0, 146, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 137, 137, 0, 47, 47, 47, 47, 47, - 47, 47, 47, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, - 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 143, 47, 144, 133, 137, - 133, 133, 133, 133, 0, 0, 137, 145, 0, 0, 145, 145, 140, 0, 0, 0, 0, 0, - 0, 0, 0, 148, 144, 0, 0, 0, 0, 141, 141, 0, 47, 47, 47, 133, 133, 0, 0, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 79, 47, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 47, 0, 47, 47, 47, 47, 47, 47, 0, - 0, 0, 47, 47, 47, 0, 47, 47, 138, 47, 0, 0, 0, 47, 47, 0, 47, 0, 47, 47, - 0, 0, 0, 47, 47, 0, 0, 0, 47, 47, 47, 0, 0, 0, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 144, 137, 133, 137, 137, 0, 0, 0, - 137, 137, 137, 0, 145, 145, 145, 140, 0, 0, 47, 0, 0, 0, 0, 0, 0, 144, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 147, 147, 147, 27, 27, 27, 27, 27, 27, 146, 27, 0, 0, 0, - 0, 0, 0, 137, 137, 137, 0, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, - 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, - 47, 47, 47, 47, 0, 0, 0, 47, 133, 133, 133, 137, 137, 137, 137, 0, 133, - 133, 149, 0, 133, 133, 133, 140, 0, 0, 0, 0, 0, 0, 0, 150, 151, 0, 47, - 47, 0, 0, 0, 0, 0, 0, 47, 47, 133, 133, 0, 0, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 0, 0, 0, 0, 0, 0, 0, 0, 152, 152, 152, 152, 152, - 152, 152, 79, 0, 0, 137, 137, 0, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, - 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 0, 47, 47, 47, 47, 47, 0, 0, 143, 47, 137, 153, 145, 137, 144, 137, - 137, 0, 153, 145, 145, 0, 145, 145, 133, 140, 0, 0, 0, 0, 0, 0, 0, 144, - 144, 0, 0, 0, 0, 0, 0, 0, 47, 0, 47, 47, 133, 133, 0, 0, 142, 142, 142, - 142, 142, 142, 142, 142, 142, 142, 0, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 137, 137, 0, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, - 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 0, 0, 0, 47, 144, 137, 137, 133, 133, 133, 133, - 0, 137, 137, 137, 0, 145, 145, 145, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, - 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 133, 133, 0, 0, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 147, 147, 147, 147, 147, 147, 0, 0, 0, 79, 47, - 47, 47, 47, 47, 47, 0, 0, 137, 137, 0, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 142, 47, 143, + 132, 136, 132, 132, 132, 132, 0, 0, 136, 144, 0, 0, 144, 144, 139, 0, 0, + 0, 0, 0, 0, 0, 0, 147, 143, 0, 0, 0, 0, 140, 140, 0, 47, 47, 47, 132, + 132, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 79, 47, 146, + 146, 146, 146, 146, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 47, 0, 47, + 47, 47, 47, 47, 47, 0, 0, 0, 47, 47, 47, 0, 47, 47, 137, 47, 0, 0, 0, 47, + 47, 0, 47, 0, 47, 47, 0, 0, 0, 47, 47, 0, 0, 0, 47, 47, 47, 0, 0, 0, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 143, 136, 132, + 136, 136, 0, 0, 0, 136, 136, 136, 0, 144, 144, 144, 139, 0, 0, 47, 0, 0, + 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 146, 146, 146, 27, 27, 27, 27, 27, 27, + 145, 27, 0, 0, 0, 0, 0, 0, 136, 136, 136, 0, 47, 47, 47, 47, 47, 47, 47, + 47, 0, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 0, 47, 132, 132, 132, 136, 136, + 136, 136, 0, 132, 132, 148, 0, 132, 132, 132, 139, 0, 0, 0, 0, 0, 0, 0, + 149, 150, 0, 47, 47, 0, 0, 0, 0, 0, 0, 47, 47, 132, 132, 0, 0, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0, 0, 151, 151, + 151, 151, 151, 151, 151, 79, 0, 0, 136, 136, 0, 47, 47, 47, 47, 47, 47, + 47, 47, 0, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 142, 47, 136, 152, 144, 136, + 143, 136, 136, 0, 152, 144, 144, 0, 144, 144, 132, 139, 0, 0, 0, 0, 0, 0, + 0, 143, 143, 0, 0, 0, 0, 0, 0, 0, 47, 0, 47, 47, 132, 132, 0, 0, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 47, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 136, 0, 47, 47, 47, 47, 47, 47, 47, 47, + 0, 47, 47, 47, 0, 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, - 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 0, 47, 47, 47, 47, 47, - 47, 47, 0, 0, 0, 154, 0, 0, 0, 0, 144, 137, 137, 133, 133, 133, 0, 133, - 0, 137, 137, 145, 137, 145, 145, 145, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 137, 137, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, 143, 136, 136, 132, 132, + 132, 132, 0, 136, 136, 136, 0, 144, 144, 144, 139, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 132, 132, 0, 0, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 141, 146, 146, 146, 146, 146, 146, 0, 0, 0, + 79, 47, 47, 47, 47, 47, 47, 0, 0, 136, 136, 0, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 0, 47, 47, 47, + 47, 47, 47, 47, 0, 0, 0, 153, 0, 0, 0, 0, 143, 136, 136, 132, 132, 132, + 0, 132, 0, 136, 136, 144, 136, 144, 144, 144, 143, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 136, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, 133, 47, 155, 133, 133, - 133, 133, 156, 156, 140, 0, 0, 0, 0, 146, 47, 47, 47, 47, 47, 47, 52, - 133, 157, 157, 157, 157, 133, 133, 133, 82, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, - 0, 47, 0, 0, 47, 47, 0, 47, 0, 0, 47, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, - 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 0, 47, 0, 47, 0, 0, 47, 47, - 0, 47, 47, 47, 47, 133, 47, 155, 133, 133, 133, 133, 158, 158, 0, 133, - 133, 47, 0, 0, 47, 47, 47, 47, 47, 0, 52, 0, 159, 159, 159, 159, 133, - 133, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 0, 0, 155, - 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 79, 79, 79, 82, 82, 82, 82, 82, 82, - 82, 82, 160, 82, 82, 82, 82, 82, 82, 79, 79, 79, 79, 79, 84, 84, 79, 79, - 79, 79, 79, 79, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 147, - 147, 147, 147, 147, 147, 147, 147, 147, 147, 79, 84, 79, 84, 79, 161, - 162, 163, 162, 163, 137, 137, 47, 47, 47, 141, 47, 47, 47, 47, 0, 47, 47, - 47, 47, 141, 47, 47, 47, 47, 141, 47, 47, 47, 47, 141, 47, 47, 47, 47, - 141, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 141, 47, 47, 47, 0, - 0, 0, 0, 164, 165, 166, 167, 166, 166, 168, 166, 168, 165, 165, 165, 165, - 133, 137, 165, 166, 80, 80, 140, 82, 80, 80, 47, 47, 47, 47, 0, 0, 0, 0, - 133, 133, 133, 166, 133, 133, 133, 133, 0, 133, 133, 133, 133, 166, 133, - 133, 133, 133, 166, 133, 133, 133, 133, 166, 133, 133, 133, 133, 166, - 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 166, 133, - 133, 133, 0, 79, 79, 79, 79, 79, 79, 79, 79, 84, 79, 79, 79, 79, 79, 79, - 0, 79, 79, 82, 82, 82, 82, 82, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 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, 132, 47, 154, + 132, 132, 132, 132, 155, 155, 139, 0, 0, 0, 0, 145, 47, 47, 47, 47, 47, + 47, 52, 132, 156, 156, 156, 156, 132, 132, 132, 82, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 47, 47, 0, 47, 0, 0, 47, 47, 0, 47, 0, 0, 47, 0, 0, 0, 0, 0, 0, 47, + 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 0, 47, 0, 47, + 0, 0, 47, 47, 0, 47, 47, 47, 47, 132, 47, 154, 132, 132, 132, 132, 157, + 157, 0, 132, 132, 47, 0, 0, 47, 47, 47, 47, 47, 0, 52, 0, 158, 158, 158, + 158, 132, 132, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, + 0, 154, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 79, 79, 79, 82, 82, 82, 82, + 82, 82, 82, 82, 159, 82, 82, 82, 82, 82, 82, 79, 79, 79, 79, 79, 84, 84, + 79, 79, 79, 79, 79, 79, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 79, 84, 79, 84, 79, + 160, 161, 162, 161, 162, 136, 136, 47, 47, 47, 140, 47, 47, 47, 47, 0, + 47, 47, 47, 47, 140, 47, 47, 47, 47, 140, 47, 47, 47, 47, 140, 47, 47, + 47, 47, 140, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 140, 47, 47, + 47, 0, 0, 0, 0, 163, 164, 165, 166, 165, 165, 167, 165, 167, 164, 164, + 164, 164, 132, 136, 164, 165, 80, 80, 139, 82, 80, 80, 47, 47, 47, 47, + 47, 132, 132, 132, 132, 132, 132, 165, 132, 132, 132, 132, 0, 132, 132, + 132, 132, 165, 132, 132, 132, 132, 165, 132, 132, 132, 132, 165, 132, + 132, 132, 132, 165, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 165, 132, 132, 132, 0, 79, 79, 79, 79, 79, 79, 79, 79, 84, 79, + 79, 79, 79, 79, 79, 0, 79, 79, 82, 82, 82, 82, 82, 79, 79, 79, 79, 82, + 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 138, 47, 47, 47, 47, 137, 137, 133, 148, 133, - 133, 137, 133, 133, 133, 133, 133, 143, 137, 140, 140, 137, 137, 133, - 133, 47, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 82, 82, 82, - 82, 82, 82, 47, 47, 47, 47, 47, 47, 137, 137, 133, 133, 47, 47, 47, 47, - 133, 133, 133, 47, 137, 137, 137, 47, 47, 137, 137, 137, 137, 137, 137, - 137, 47, 47, 47, 133, 133, 133, 133, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 133, 137, 137, 133, 133, 137, 137, 137, 137, 137, 137, - 84, 47, 137, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 137, 137, - 137, 133, 79, 79, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 47, 47, 47, 47, 136, + 136, 132, 147, 132, 132, 136, 132, 132, 132, 132, 132, 142, 136, 139, + 139, 136, 136, 132, 132, 47, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 82, 82, 82, 82, 82, 82, 47, 47, 47, 47, 47, 47, 136, 136, 132, 132, + 47, 47, 47, 47, 132, 132, 132, 47, 136, 136, 136, 47, 47, 136, 136, 136, + 136, 136, 136, 136, 47, 47, 47, 132, 132, 132, 132, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 132, 136, 136, 132, 132, 136, 136, 136, + 136, 136, 136, 84, 47, 136, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 136, 136, 136, 132, 79, 79, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 82, 50, 0, 0, 0, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 47, 47, 47, 47, 47, 47, 82, 50, 0, 0, 0, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 47, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 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, 168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 47, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 47, 47, 47, 47, 47, 47, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 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, 169, 169, 169, 169, 169, 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, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 168, 168, 168, 168, 168, + 168, 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, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 169, 169, 169, 169, 169, 169, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, + 47, 47, 47, 47, 0, 0, 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, 0, 47, 47, 47, 47, 0, 0, 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, 0, 47, - 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 47, 47, 47, 47, - 0, 0, 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, 0, 47, 47, 47, 47, 0, + 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 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, 0, 47, 47, 47, 47, 0, 0, 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, 0, 47, 47, 47, 47, 0, 0, 47, 47, 47, - 47, 47, 47, 47, 0, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 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, 0, + 47, 47, 47, 47, 0, 0, 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, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 0, - 0, 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, + 0, 0, 80, 80, 80, 79, 82, 82, 82, 82, 82, 82, 82, 82, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 80, - 79, 82, 82, 82, 82, 82, 82, 82, 82, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 83, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 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, 47, 47, 47, 47, 47, 47, 47, 47, 47, @@ -1487,115 +1492,114 @@ static unsigned short index2[] = { 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, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 170, 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, 161, + 162, 0, 0, 0, 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, 47, 47, 47, 47, - 47, 47, 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 171, 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, 162, 163, 0, 0, 0, 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, 82, 82, 82, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 0, 47, 47, 47, 47, 132, 132, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 132, 132, 139, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 132, 132, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 0, 47, 47, 47, 0, 132, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 82, 82, 82, 172, 172, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, - 47, 133, 133, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 133, 133, 140, 82, - 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 133, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, - 0, 133, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 172, 172, 136, + 132, 132, 132, 132, 132, 132, 132, 136, 136, 136, 136, 136, 136, 136, + 136, 132, 136, 136, 132, 132, 132, 132, 132, 132, 132, 132, 132, 139, + 132, 82, 82, 82, 52, 82, 82, 82, 145, 47, 80, 0, 0, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 135, 135, + 83, 135, 135, 135, 135, 132, 132, 132, 170, 0, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 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, 52, 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, 173, 173, 137, 133, 133, 133, - 133, 133, 133, 133, 137, 137, 137, 137, 137, 137, 137, 137, 133, 137, - 137, 133, 133, 133, 133, 133, 133, 133, 133, 133, 140, 133, 82, 82, 82, - 52, 82, 82, 82, 146, 47, 80, 0, 0, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 0, 0, 0, 0, 0, 0, 152, 152, 152, 152, 152, 152, 152, 152, - 152, 152, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 83, 136, 136, - 136, 136, 133, 133, 133, 171, 0, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 0, 0, 0, 0, 0, 0, 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, 52, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 86, 47, 0, 0, 0, 0, 0, 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, 86, 47, - 0, 0, 0, 0, 0, 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, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 0, 0, 0, 132, 132, 132, 136, 136, 136, 136, 132, + 132, 136, 136, 136, 0, 0, 0, 0, 136, 136, 132, 136, 136, 136, 136, 136, + 136, 85, 80, 84, 0, 0, 0, 0, 27, 0, 0, 0, 135, 135, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 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, 0, 0, 0, 133, 133, 133, 137, 137, 137, 137, 133, 133, 137, 137, - 137, 0, 0, 0, 0, 137, 137, 133, 137, 137, 137, 137, 137, 137, 85, 80, 84, - 0, 0, 0, 0, 27, 0, 0, 0, 136, 136, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 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, 0, 0, 47, - 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, + 47, 0, 0, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 47, 47, 47, 47, 47, 47, 47, 137, 137, - 0, 0, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 0, 0, 0, 136, 136, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 47, 47, 47, 47, 47, 47, + 47, 136, 136, 0, 0, 0, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 146, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 80, 84, 137, 137, 137, 0, 0, 82, 82, 47, 47, 47, + 27, 27, 27, 27, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 80, 84, 136, 136, 136, 0, 0, 82, 82, 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, 47, 47, 47, 137, 133, 137, - 133, 133, 133, 133, 133, 133, 133, 0, 140, 137, 133, 137, 137, 133, 133, - 133, 133, 133, 133, 133, 133, 137, 137, 137, 137, 137, 137, 133, 133, 80, - 80, 80, 80, 80, 80, 80, 80, 0, 0, 84, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 0, 0, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 0, 0, 0, 0, 0, 0, 82, 82, 82, 82, 82, 82, 82, 52, 82, 82, 82, - 82, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 136, + 132, 136, 132, 132, 132, 132, 132, 132, 132, 0, 139, 136, 132, 136, 136, + 132, 132, 132, 132, 132, 132, 132, 132, 136, 136, 136, 136, 136, 136, + 132, 132, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 84, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 82, 82, 82, 82, 82, 82, 82, + 52, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 133, 133, 133, 137, 47, - 138, 47, 138, 47, 138, 47, 138, 47, 138, 47, 47, 47, 138, 47, 47, 47, 47, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 132, 132, + 132, 136, 47, 137, 47, 137, 47, 137, 47, 137, 47, 137, 47, 47, 47, 137, 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, 143, 144, 133, 133, 133, 133, - 133, 145, 133, 145, 137, 137, 145, 145, 133, 145, 174, 47, 47, 47, 47, - 47, 47, 47, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 82, 82, 82, 82, 82, 82, 82, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, - 84, 80, 80, 80, 80, 80, 80, 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, - 0, 133, 133, 137, 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, 137, 133, - 133, 133, 133, 137, 137, 133, 133, 174, 0, 0, 0, 47, 47, 142, 142, 142, - 142, 142, 142, 142, 142, 142, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 142, 143, + 132, 132, 132, 132, 132, 144, 132, 144, 136, 136, 144, 144, 132, 144, + 173, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 82, 82, 82, 82, 82, 82, 82, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 80, 84, 80, 80, 80, 80, 80, 80, 80, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 0, 0, 0, 132, 132, 136, 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, 137, 137, 137, 137, 137, 137, 137, 137, 133, - 133, 133, 133, 133, 133, 133, 133, 137, 137, 133, 143, 0, 0, 0, 82, 82, - 82, 82, 82, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 0, 0, 0, - 47, 47, 47, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 47, 47, 47, + 47, 47, 47, 47, 47, 136, 132, 132, 132, 132, 136, 136, 132, 132, 173, 0, + 0, 0, 47, 47, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0, + 0, 0, 0, 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, 52, 52, 52, 52, 52, 52, 82, 82, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 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, 82, 175, 84, 84, 84, 84, 84, 80, 80, 84, - 84, 84, 84, 80, 137, 175, 175, 175, 175, 175, 175, 175, 47, 47, 47, 47, - 84, 47, 47, 47, 47, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 47, 47, 47, 47, 142, 136, 132, 132, 136, 136, 136, 132, 136, 132, 132, + 132, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 82, 82, 82, 82, 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, 136, 136, 136, + 136, 136, 136, 136, 136, 132, 132, 132, 132, 132, 132, 132, 132, 136, + 136, 132, 142, 0, 0, 0, 82, 82, 82, 82, 82, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 0, 0, 0, 47, 47, 47, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 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, 52, + 52, 52, 52, 52, 52, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 82, 174, + 84, 84, 84, 84, 84, 80, 80, 84, 84, 84, 84, 80, 136, 174, 174, 174, 174, + 174, 174, 174, 47, 47, 47, 47, 84, 47, 47, 47, 47, 136, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 50, 50, 50, 52, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 52, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 52, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 35, 35, 35, 35, 35, 35, 35, 35, 35, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 50, 50, 52, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 52, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 52, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 80, 80, 84, 80, 80, 80, 80, 80, - 80, 80, 84, 80, 80, 176, 177, 84, 178, 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, 84, 80, 84, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 80, + 80, 84, 80, 80, 80, 80, 80, 80, 80, 84, 80, 80, 175, 176, 84, 177, 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, 178, 84, 80, 84, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, @@ -1603,185 +1607,186 @@ static unsigned short index2[] = { 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 43, 43, 43, 43, 35, 179, 46, 46, 44, 46, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 43, 43, 43, 43, 35, 179, 46, + 46, 44, 46, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, - 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 46, 44, 46, 44, - 46, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, + 43, 38, 43, 44, 46, 44, 46, 44, 46, 43, 43, 43, 43, 43, 43, 43, 43, 38, + 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38, + 38, 38, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, + 38, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, 0, 0, 43, 43, 43, 43, - 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, - 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, - 38, 38, 38, 38, 38, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 0, 38, 0, 38, - 0, 38, 0, 38, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, - 38, 43, 180, 43, 180, 43, 180, 43, 180, 43, 180, 43, 180, 43, 180, 0, 0, - 43, 43, 43, 43, 43, 43, 43, 43, 181, 181, 181, 181, 181, 181, 181, 181, - 43, 43, 43, 43, 43, 43, 43, 43, 181, 181, 181, 181, 181, 181, 181, 181, - 43, 43, 43, 43, 43, 43, 43, 43, 181, 181, 181, 181, 181, 181, 181, 181, - 43, 43, 43, 43, 43, 0, 43, 43, 38, 38, 38, 182, 181, 57, 180, 57, 57, 75, - 43, 43, 43, 0, 43, 43, 38, 182, 38, 182, 181, 75, 75, 75, 43, 43, 43, - 180, 0, 0, 43, 43, 38, 38, 38, 182, 0, 75, 75, 75, 43, 43, 43, 180, 43, - 43, 43, 43, 38, 38, 38, 182, 38, 75, 183, 183, 0, 0, 43, 43, 43, 0, 43, - 43, 38, 182, 38, 182, 181, 183, 57, 0, 184, 184, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 131, 131, 131, 173, 186, 187, 188, 83, 187, 187, 187, - 22, 189, 190, 191, 192, 193, 190, 191, 192, 193, 22, 22, 22, 136, 194, - 194, 194, 22, 195, 196, 197, 198, 199, 200, 201, 21, 202, 108, 202, 203, - 204, 22, 189, 189, 136, 29, 36, 22, 189, 136, 194, 205, 205, 136, 136, - 136, 206, 162, 163, 189, 189, 189, 136, 136, 136, 136, 136, 136, 136, - 136, 77, 136, 205, 136, 136, 189, 136, 136, 136, 136, 136, 136, 136, 185, - 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, - 207, 50, 0, 0, 34, 207, 207, 207, 207, 207, 208, 208, 209, 210, 211, 212, - 207, 34, 34, 34, 34, 207, 207, 207, 207, 207, 208, 208, 209, 210, 211, 0, - 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 146, 146, 146, - 146, 146, 146, 146, 213, 214, 146, 146, 23, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 146, 146, 146, 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, 175, 175, 80, 80, 80, 80, 175, 175, - 175, 80, 80, 81, 81, 81, 81, 80, 81, 81, 81, 175, 175, 80, 84, 80, 175, - 175, 84, 84, 84, 84, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 215, 215, 48, 216, 27, 216, 215, 48, 27, 216, 35, 48, 48, 48, 35, 35, 48, - 48, 48, 28, 27, 48, 216, 27, 27, 48, 48, 48, 48, 48, 27, 27, 215, 216, - 216, 27, 48, 27, 217, 27, 48, 27, 182, 217, 48, 48, 218, 35, 48, 48, 44, - 48, 35, 155, 155, 155, 155, 35, 27, 215, 35, 35, 48, 48, 219, 77, 77, 77, - 77, 48, 35, 35, 35, 35, 27, 77, 27, 27, 46, 79, 220, 220, 220, 37, 37, - 220, 220, 220, 220, 220, 220, 37, 37, 37, 37, 220, 221, 221, 221, 221, - 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 221, 221, - 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 222, 222, - 172, 172, 172, 44, 46, 172, 172, 172, 172, 37, 0, 0, 0, 0, 0, 0, 40, 40, - 40, 40, 40, 25, 25, 25, 25, 25, 223, 223, 27, 27, 27, 27, 77, 27, 27, 77, - 27, 27, 77, 27, 27, 27, 27, 27, 27, 27, 223, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 224, 223, 223, 27, 27, 40, 27, 40, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 40, 225, 226, 226, 227, 77, 77, 40, 226, 227, 225, 226, 227, - 225, 77, 40, 77, 226, 228, 229, 77, 226, 225, 77, 77, 77, 226, 225, 225, - 226, 40, 226, 226, 225, 225, 40, 227, 40, 227, 40, 40, 40, 40, 226, 230, - 219, 226, 219, 219, 225, 225, 225, 40, 40, 40, 40, 77, 225, 77, 225, 226, - 226, 225, 225, 225, 227, 225, 225, 227, 225, 225, 227, 226, 227, 225, - 225, 226, 77, 77, 77, 77, 77, 226, 225, 225, 225, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 225, 231, 40, 227, 77, 226, 226, 226, 226, 225, 225, 226, - 226, 77, 223, 231, 231, 227, 227, 225, 225, 227, 227, 225, 225, 227, 227, - 225, 225, 225, 225, 225, 225, 227, 227, 226, 226, 227, 227, 226, 226, - 227, 227, 225, 225, 225, 77, 77, 225, 225, 225, 225, 77, 77, 40, 77, 77, - 225, 40, 77, 77, 77, 77, 77, 77, 77, 77, 225, 225, 77, 40, 225, 225, 225, - 225, 225, 225, 227, 227, 227, 227, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 77, 77, 77, 77, 77, 225, 226, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 225, 225, 225, 225, 225, 77, 77, 225, 225, 77, 77, 77, 77, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 227, 227, 227, 227, 225, 225, - 225, 225, 225, 225, 227, 227, 227, 227, 77, 77, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 27, 27, 27, 27, - 27, 27, 27, 27, 225, 225, 225, 225, 27, 27, 27, 27, 27, 27, 25, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 225, 225, 27, 27, 27, 27, 27, - 27, 27, 232, 233, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 79, 79, 79, + 43, 43, 43, 43, 0, 38, 0, 38, 0, 38, 0, 38, 43, 43, 43, 43, 43, 43, 43, + 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 180, 43, 180, 43, 180, 43, 180, + 43, 180, 43, 180, 43, 180, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 181, + 181, 181, 181, 181, 181, 181, 181, 43, 43, 43, 43, 43, 43, 43, 43, 181, + 181, 181, 181, 181, 181, 181, 181, 43, 43, 43, 43, 43, 43, 43, 43, 181, + 181, 181, 181, 181, 181, 181, 181, 43, 43, 43, 43, 43, 0, 43, 43, 38, 38, + 38, 182, 181, 57, 180, 57, 57, 75, 43, 43, 43, 0, 43, 43, 38, 182, 38, + 182, 181, 75, 75, 75, 43, 43, 43, 180, 0, 0, 43, 43, 38, 38, 38, 182, 0, + 75, 75, 75, 43, 43, 43, 180, 43, 43, 43, 43, 38, 38, 38, 182, 38, 75, + 183, 183, 0, 0, 43, 43, 43, 0, 43, 43, 38, 182, 38, 182, 181, 183, 57, 0, + 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, 185, 186, 186, 186, + 172, 187, 188, 189, 83, 188, 188, 188, 22, 190, 191, 192, 193, 194, 191, + 192, 193, 194, 22, 22, 22, 135, 195, 195, 195, 22, 196, 197, 198, 199, + 200, 201, 202, 21, 203, 108, 203, 204, 205, 22, 190, 190, 135, 29, 36, + 22, 190, 135, 195, 206, 206, 135, 135, 135, 207, 161, 162, 190, 190, 190, + 135, 135, 135, 135, 135, 135, 135, 135, 77, 135, 206, 135, 135, 190, 135, + 135, 135, 135, 135, 135, 135, 185, 186, 186, 186, 186, 186, 0, 0, 0, 0, + 0, 186, 186, 186, 186, 186, 186, 208, 50, 0, 0, 34, 208, 208, 208, 208, + 208, 209, 209, 210, 211, 212, 213, 208, 34, 34, 34, 34, 208, 208, 208, + 208, 208, 209, 209, 210, 211, 212, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 214, + 215, 145, 145, 23, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 80, 80, 174, 174, 80, 80, 80, 80, 174, 174, 174, 80, 80, 81, 81, 81, + 81, 80, 81, 81, 81, 174, 174, 80, 84, 80, 174, 174, 84, 84, 84, 84, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 216, 48, 217, 27, 217, + 216, 48, 27, 217, 35, 48, 48, 48, 35, 35, 48, 48, 48, 28, 27, 48, 217, + 27, 77, 48, 48, 48, 48, 48, 27, 27, 216, 217, 217, 27, 48, 27, 218, 27, + 48, 27, 182, 218, 48, 48, 219, 35, 48, 48, 44, 48, 35, 154, 154, 154, + 154, 35, 27, 216, 35, 35, 48, 48, 220, 77, 77, 77, 77, 48, 35, 35, 35, + 35, 27, 77, 27, 27, 46, 79, 221, 221, 221, 37, 37, 221, 221, 221, 221, + 221, 221, 37, 37, 37, 37, 221, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 223, 223, 223, 223, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 223, 223, 223, 223, 223, 223, 171, 171, 171, 44, 46, + 171, 171, 171, 171, 37, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 25, 25, 25, + 25, 25, 224, 224, 27, 27, 27, 27, 77, 27, 27, 77, 27, 27, 77, 27, 27, 27, + 27, 27, 27, 27, 224, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 225, + 224, 224, 27, 27, 40, 27, 40, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 40, 226, 227, + 227, 228, 77, 77, 40, 227, 228, 226, 227, 228, 226, 77, 40, 77, 227, 229, + 230, 77, 227, 226, 77, 77, 77, 227, 226, 226, 227, 40, 227, 227, 226, + 226, 40, 228, 40, 228, 40, 40, 40, 40, 227, 231, 220, 227, 220, 220, 226, + 226, 226, 40, 40, 40, 40, 77, 226, 77, 226, 227, 227, 226, 226, 226, 228, + 226, 226, 228, 226, 226, 228, 227, 228, 226, 226, 227, 77, 77, 77, 77, + 77, 227, 226, 226, 226, 77, 77, 77, 77, 77, 77, 77, 77, 77, 226, 232, 40, + 228, 77, 227, 227, 227, 227, 226, 226, 227, 227, 77, 224, 232, 232, 228, + 228, 226, 226, 228, 228, 226, 226, 228, 228, 226, 226, 226, 226, 226, + 226, 228, 228, 227, 227, 228, 228, 227, 227, 228, 228, 226, 226, 226, 77, + 77, 226, 226, 226, 226, 77, 77, 40, 77, 77, 226, 40, 77, 77, 77, 77, 77, + 77, 77, 77, 226, 226, 77, 40, 226, 226, 226, 226, 226, 226, 228, 228, + 228, 228, 226, 226, 226, 226, 226, 226, 226, 226, 226, 77, 77, 77, 77, + 77, 226, 227, 77, 77, 77, 77, 77, 77, 77, 77, 77, 226, 226, 226, 226, + 226, 77, 77, 226, 226, 77, 77, 77, 77, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 228, 228, 228, 228, 226, 226, 226, 226, 226, 226, 228, + 228, 228, 228, 77, 77, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 27, 27, 27, 27, 27, 27, 27, 27, 226, 226, + 226, 226, 27, 27, 27, 27, 27, 27, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 226, 226, 27, 27, 27, 27, 27, 27, 27, 233, 234, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 27, 77, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 79, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 79, 79, 79, 79, 79, 79, 27, 77, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 79, 27, 27, 27, + 27, 27, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 77, 77, 77, 77, 77, 77, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, + 77, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 220, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 37, 37, 37, 37, 37, 37, 37, 37, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 221, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 27, 27, 27, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 27, + 27, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 27, 25, - 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 25, 25, - 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, 25, - 40, 27, 27, 27, 27, 25, 25, 27, 27, 25, 40, 27, 27, 27, 27, 25, 25, 25, - 27, 27, 25, 27, 27, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 25, 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77, 77, - 77, 27, 27, 27, 27, 27, 25, 25, 27, 27, 25, 27, 27, 27, 27, 25, 25, 27, - 27, 27, 27, 25, 25, 27, 27, 27, 27, 27, 27, 25, 27, 25, 27, 27, 27, 27, + 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 27, 25, 25, 25, 25, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 25, 25, 25, 25, 25, + 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, 25, 40, 27, 27, + 27, 27, 25, 25, 27, 27, 25, 40, 27, 27, 27, 27, 25, 25, 25, 27, 27, 25, + 27, 27, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, + 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77, 77, 77, 27, 27, + 27, 27, 27, 25, 25, 27, 27, 25, 27, 27, 27, 27, 25, 25, 27, 27, 27, 27, + 25, 25, 27, 27, 27, 27, 27, 27, 25, 27, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 27, 25, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 25, 27, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 25, 25, 25, 27, 25, 25, 25, 25, - 27, 25, 25, 27, 40, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 25, 25, 27, 25, 25, 25, 27, 25, 25, 25, 25, 27, 25, 25, + 27, 40, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 79, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, 27, 27, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, 0, 0, 0, 25, 25, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 79, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, 27, 27, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 27, 25, 27, 27, 27, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 0, 27, 27, 27, 27, 0, 27, 27, 27, 27, 0, 0, 27, 27, 27, + 25, 25, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 0, 27, 0, 27, 27, 27, 27, 0, 0, 0, 27, 25, - 27, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, 27, 27, 27, 162, 163, - 162, 163, 162, 163, 162, 163, 162, 163, 162, 163, 162, 163, 235, 235, - 235, 235, 235, 235, 235, 235, 235, 235, 152, 152, 152, 152, 152, 152, - 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 27, - 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 0, 225, 77, 77, 225, 225, 162, 163, 77, 225, 225, 77, - 0, 225, 0, 0, 0, 77, 77, 77, 225, 225, 225, 225, 77, 77, 77, 77, 77, 225, - 225, 225, 77, 77, 77, 225, 225, 225, 225, 9, 10, 9, 10, 9, 10, 9, 10, - 162, 163, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 161, 162, + 161, 162, 161, 162, 161, 162, 161, 162, 161, 162, 161, 162, 236, 236, + 236, 236, 236, 236, 236, 236, 236, 236, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 226, 77, 77, 226, 226, 161, 162, 77, 226, + 226, 77, 0, 226, 0, 77, 77, 77, 77, 77, 226, 226, 226, 226, 77, 77, 77, + 77, 77, 226, 226, 226, 77, 77, 77, 226, 226, 226, 226, 9, 10, 9, 10, 9, + 10, 9, 10, 161, 162, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 79, 79, 79, 79, 79, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 162, 163, 9, 10, 162, 163, 162, 163, 162, - 163, 162, 163, 162, 163, 162, 163, 162, 163, 162, 163, 162, 163, 77, 77, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 77, 77, 77, 77, 77, 77, 77, 77, 225, - 77, 77, 77, 77, 77, 77, 77, 225, 225, 225, 225, 225, 225, 77, 77, 77, - 225, 77, 77, 77, 77, 225, 225, 225, 225, 225, 77, 225, 225, 77, 77, 162, - 163, 162, 163, 225, 77, 77, 77, 77, 225, 77, 225, 225, 225, 77, 77, 225, - 225, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 225, 225, 225, 225, 225, - 225, 77, 77, 162, 163, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 225, 225, 219, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 77, 225, 225, 225, 225, 77, 77, 225, 77, 225, - 77, 77, 225, 77, 225, 225, 225, 225, 77, 77, 77, 77, 77, 225, 225, 77, - 77, 77, 77, 77, 77, 225, 225, 225, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 225, 225, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 225, 225, 77, 77, 77, 77, 225, - 225, 225, 225, 77, 225, 225, 77, 77, 225, 219, 209, 209, 77, 77, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 77, - 77, 225, 225, 225, 225, 225, 225, 225, 225, 77, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 77, 77, 77, 77, 77, 236, 77, 225, 77, - 77, 77, 225, 225, 225, 225, 225, 77, 77, 77, 77, 77, 225, 225, 225, 77, - 77, 77, 77, 225, 77, 77, 77, 225, 225, 225, 225, 225, 77, 225, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 161, 162, 9, 10, 161, 162, 161, + 162, 161, 162, 161, 162, 161, 162, 161, 162, 161, 162, 161, 162, 161, + 162, 77, 77, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 77, 77, 77, 77, 77, 77, 77, + 77, 226, 77, 77, 77, 77, 77, 77, 77, 226, 226, 226, 226, 226, 226, 77, + 77, 77, 226, 77, 77, 77, 77, 226, 226, 226, 226, 226, 77, 226, 226, 77, + 77, 161, 162, 161, 162, 226, 77, 77, 77, 77, 226, 77, 226, 226, 226, 77, + 77, 226, 226, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 226, 226, 226, 226, + 226, 226, 77, 77, 161, 162, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 226, 226, 220, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 77, 226, 226, 226, 226, 77, 77, 226, 77, 226, + 77, 77, 226, 77, 226, 226, 226, 226, 77, 77, 77, 77, 77, 226, 226, 77, + 77, 77, 77, 77, 77, 226, 226, 226, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 226, 226, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 226, 226, 77, 77, 77, 77, 226, + 226, 226, 226, 77, 226, 226, 77, 77, 226, 220, 210, 210, 77, 77, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 77, + 77, 226, 226, 226, 226, 226, 226, 226, 226, 77, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 77, 77, 77, 77, 77, 237, 77, 226, 77, + 77, 77, 226, 226, 226, 226, 226, 77, 77, 77, 77, 77, 226, 226, 226, 77, + 77, 77, 77, 226, 77, 77, 77, 226, 226, 226, 226, 226, 77, 226, 77, 77, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77, @@ -1802,269 +1807,265 @@ static unsigned short index2[] = { 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 46, 27, 27, 27, 27, 27, 27, 44, 46, 44, 46, 80, 80, 80, - 0, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 152, 136, 136, 46, 46, 46, 46, + 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 151, 135, 135, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47, 47, - 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 82, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 139, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 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, 136, 136, 29, 36, 29, 36, 136, 136, 136, 29, 36, 136, 29, - 36, 136, 136, 136, 136, 136, 136, 136, 136, 136, 83, 136, 136, 83, 136, - 29, 36, 136, 136, 29, 36, 162, 163, 162, 163, 162, 163, 162, 163, 136, - 136, 136, 136, 136, 51, 136, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 237, 237, 237, 237, 238, 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, 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, 237, 237, 237, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 238, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 80, 80, 80, 80, 135, 135, 29, 36, 29, 36, 135, 135, 135, 29, 36, 135, 29, + 36, 135, 135, 135, 135, 135, 135, 135, 135, 135, 83, 135, 135, 83, 135, + 29, 36, 135, 135, 29, 36, 161, 162, 161, 162, 161, 162, 161, 162, 135, + 135, 135, 135, 135, 51, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 0, 238, 238, 238, 238, 239, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 239, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 0, 0, 0, 0, 240, 241, 241, 241, + 238, 242, 168, 243, 244, 245, 244, 245, 244, 245, 244, 245, 244, 245, + 238, 238, 244, 245, 244, 245, 244, 245, 244, 245, 246, 247, 248, 248, + 238, 243, 243, 243, 243, 243, 243, 243, 243, 243, 249, 250, 251, 252, + 253, 253, 246, 242, 242, 242, 242, 242, 239, 238, 254, 254, 254, 242, + 168, 241, 238, 27, 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, + 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, 168, 255, 168, + 255, 168, 255, 168, 168, 168, 168, 168, 168, 255, 255, 168, 255, 255, + 168, 255, 255, 168, 255, 255, 168, 255, 255, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 255, 168, 168, 0, 0, 256, 256, 257, 257, 242, 258, 259, + 246, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 255, 168, + 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, + 255, 168, 255, 168, 255, 168, 255, 168, 168, 255, 168, 255, 168, 255, + 168, 168, 168, 168, 168, 168, 255, 255, 168, 255, 255, 168, 255, 255, + 168, 255, 255, 168, 255, 255, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 255, 168, 168, 255, 255, 255, 255, 241, 242, 242, 258, 259, 0, 0, 0, 0, + 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 0, 260, 260, 261, 261, + 261, 261, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0, 0, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 237, 237, 237, - 237, 237, 237, 237, 237, 237, 237, 237, 0, 0, 0, 0, 239, 240, 240, 240, - 237, 241, 169, 242, 243, 244, 243, 244, 243, 244, 243, 244, 243, 244, - 237, 237, 243, 244, 243, 244, 243, 244, 243, 244, 245, 246, 247, 247, - 237, 242, 242, 242, 242, 242, 242, 242, 242, 242, 248, 249, 250, 251, - 252, 252, 245, 241, 241, 241, 241, 241, 238, 237, 253, 253, 253, 241, - 169, 240, 237, 27, 0, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, 254, - 169, 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, 169, 254, 169, - 254, 169, 254, 169, 169, 169, 169, 169, 169, 254, 254, 169, 254, 254, - 169, 254, 254, 169, 254, 254, 169, 254, 254, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 254, 169, 169, 0, 0, 255, 255, 256, 256, 241, 257, 258, - 245, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 254, 169, - 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, - 254, 169, 254, 169, 254, 169, 254, 169, 169, 254, 169, 254, 169, 254, - 169, 169, 169, 169, 169, 169, 254, 254, 169, 254, 254, 169, 254, 254, - 169, 254, 254, 169, 254, 254, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 254, 169, 169, 254, 254, 254, 254, 240, 241, 241, 257, 258, 0, 0, 0, 0, - 0, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, - 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, - 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, - 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, - 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, - 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, - 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, - 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 0, 259, 259, 260, 260, - 260, 260, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, 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, - 237, 237, 237, 237, 237, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 238, 238, 0, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 262, 262, 262, 262, 262, 262, 262, 262, 238, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 238, 238, - 238, 259, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 238, 238, 238, 238, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 0, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 238, 238, 238, 238, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 238, 238, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 238, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, + 238, 238, 238, 238, 238, 238, 238, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 239, 239, 0, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 263, 263, 263, 263, 263, 263, 263, 263, 239, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 239, + 239, 239, 260, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 239, 239, 239, 239, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 0, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 239, 239, 239, + 239, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 239, 239, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 239, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 241, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 242, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 0, 0, 0, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 52, 52, 52, 52, 52, 52, - 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 52, 136, 136, - 136, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 142, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 47, 47, 0, 0, 0, 0, 0, 0, 0, + 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 52, 135, 135, + 135, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 141, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, - 44, 46, 44, 46, 44, 46, 0, 0, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, - 46, 47, 80, 81, 81, 81, 136, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 136, 51, 44, - 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, - 46, 44, 46, 44, 46, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, + 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, + 44, 46, 47, 80, 81, 81, 81, 135, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 135, 51, + 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, + 44, 46, 44, 46, 44, 46, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 80, 80, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 53, 53, 44, 46, - 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 46, 46, 44, 46, 44, 46, - 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, - 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, - 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, - 44, 46, 44, 46, 50, 46, 46, 46, 46, 46, 46, 46, 46, 44, 46, 44, 46, 44, - 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 51, 264, 264, 44, 46, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 80, 80, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, 0, + 0, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 53, 53, 44, + 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 46, 46, 44, 46, 44, + 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, + 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, + 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, + 46, 44, 46, 44, 46, 50, 46, 46, 46, 46, 46, 46, 46, 46, 44, 46, 44, 46, + 44, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 51, 265, 265, 44, 46, 44, 46, + 0, 44, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 46, 44, 46, 44, + 46, 44, 46, 44, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 133, 47, 47, - 47, 140, 47, 47, 47, 47, 133, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 137, 133, 133, 137, - 27, 27, 27, 27, 0, 0, 0, 0, 147, 147, 147, 147, 147, 147, 79, 79, 146, - 218, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 47, 47, 47, 47, 47, 47, + 132, 47, 47, 47, 139, 47, 47, 47, 47, 132, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 136, 136, + 132, 132, 136, 27, 27, 27, 27, 0, 0, 0, 0, 146, 146, 146, 146, 146, 146, + 79, 79, 145, 219, 0, 0, 0, 0, 0, 0, 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, 47, 47, 136, 136, 136, 136, 0, 0, 0, 0, 0, 0, 0, 0, 137, 137, 47, + 47, 47, 47, 47, 47, 47, 47, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, + 136, 136, 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, 47, 47, 47, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 82, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 47, 47, 47, 47, 47, 47, 82, 82, 82, + 47, 0, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 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, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 140, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 82, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 47, 47, 47, 47, 47, 47, 82, 82, 82, 47, 0, 0, 0, - 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 132, 132, 132, 132, 132, 84, 84, 84, 82, + 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 136, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 132, 132, + 132, 136, 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, 133, 133, 133, 133, 133, 84, 84, 84, 82, 82, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 137, - 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, 133, 133, 133, 137, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 142, 136, 136, 132, + 132, 132, 132, 136, 136, 132, 136, 136, 136, 173, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 0, 52, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 0, 0, 0, 0, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47, 47, 47, 47, 143, 137, 137, 133, 133, 133, - 133, 137, 137, 133, 137, 137, 137, 174, 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 0, 52, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 0, 0, 0, 0, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, + 47, 132, 132, 132, 132, 132, 132, 136, 136, 132, 132, 136, 136, 132, 132, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 132, 47, 47, 47, 47, 47, 47, 47, + 47, 132, 136, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, + 0, 82, 82, 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 52, 47, 47, 47, 47, 47, 47, 79, 79, 79, 47, 136, 0, 0, 0, 0, 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, 133, - 133, 133, 133, 133, 133, 137, 137, 133, 133, 137, 137, 133, 133, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 47, 47, 47, 133, 47, 47, 47, 47, 47, 47, 47, 47, 133, - 137, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 0, 0, 82, - 82, 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 52, 47, 47, 47, 47, 47, 47, 79, 79, 79, 47, 137, 0, 0, 0, 0, 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, 47, 80, 47, 80, 80, 84, 47, 47, 80, - 80, 47, 47, 47, 47, 47, 80, 80, 47, 80, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 52, 82, 82, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 80, 47, 80, 80, 84, 47, + 47, 80, 80, 47, 47, 47, 47, 47, 80, 80, 47, 80, 47, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 52, 82, 82, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, + 47, 0, 0, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, + 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 137, 137, 133, - 137, 137, 133, 137, 137, 82, 137, 140, 0, 0, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 0, 0, 0, 0, 0, 0, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 0, 0, 0, 0, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 0, 0, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 136, 136, 132, 136, 136, 132, + 136, 136, 82, 136, 139, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 0, 0, 0, 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, @@ -2073,24 +2074,9 @@ static unsigned short index2[] = { 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 169, 169, 267, 169, 267, - 169, 169, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 169, 267, - 169, 267, 169, 169, 267, 267, 169, 169, 169, 267, 267, 267, 267, 0, 0, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 0, 0, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, @@ -2098,21 +2084,47 @@ static unsigned short index2[] = { 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, - 268, 269, 268, 270, 270, 270, 270, 270, 270, 270, 270, 270, 208, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 0, 268, 268, - 268, 268, 268, 0, 268, 0, 268, 268, 0, 268, 268, 0, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 270, 128, 128, 128, 128, 128, 128, 128, 128, + 267, 267, 267, 267, 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, 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, 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, 168, 168, 268, 168, 268, 168, 168, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 168, 268, 168, 268, 168, + 168, 268, 268, 168, 168, 168, 268, 268, 268, 268, 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, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 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, 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, 268, 268, 268, 268, 268, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 269, 270, 269, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 209, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 0, 269, 269, 269, 269, 269, + 0, 269, 0, 269, 269, 0, 269, 269, 0, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 271, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, + 128, 128, 128, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, @@ -2128,27 +2140,27 @@ static unsigned short index2[] = { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 193, 273, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 192, 271, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 128, + 128, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 274, 27, 0, 0, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 275, 275, 275, 275, 275, 275, + 275, 276, 277, 275, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 278, 278, 279, 279, 276, 277, 276, 277, 276, + 277, 276, 277, 276, 277, 276, 277, 276, 277, 276, 277, 241, 241, 276, + 277, 275, 275, 275, 275, 279, 279, 279, 280, 275, 280, 0, 275, 280, 275, + 275, 278, 281, 282, 281, 282, 281, 282, 283, 275, 275, 284, 285, 286, + 286, 287, 0, 275, 288, 283, 275, 0, 0, 0, 0, 128, 128, 128, 115, 128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 272, 27, 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 273, 273, 273, 273, 273, 273, 273, 274, 275, - 273, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 273, 276, 276, 277, 277, 274, 275, 274, 275, 274, 275, 274, 275, - 274, 275, 274, 275, 274, 275, 274, 275, 240, 240, 274, 275, 273, 273, - 273, 273, 277, 277, 277, 278, 273, 278, 0, 273, 278, 273, 273, 276, 279, - 280, 279, 280, 279, 280, 281, 273, 273, 282, 283, 284, 284, 285, 0, 273, - 286, 281, 273, 0, 0, 0, 0, 128, 128, 128, 115, 128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, @@ -2157,71 +2169,70 @@ static unsigned short index2[] = { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 0, 0, 131, 0, 287, 287, 288, 289, 288, 287, - 287, 290, 291, 287, 292, 293, 294, 293, 293, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 293, 287, 296, 297, 296, 287, 287, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 290, 287, 291, 299, - 300, 299, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, - 290, 297, 291, 297, 290, 291, 302, 303, 304, 302, 302, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 306, 305, 305, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 306, 306, 305, - 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, - 305, 305, 0, 0, 0, 305, 305, 305, 305, 305, 305, 0, 0, 305, 305, 305, - 305, 305, 305, 0, 0, 305, 305, 305, 305, 305, 305, 0, 0, 305, 305, 305, - 0, 0, 0, 289, 289, 297, 299, 307, 289, 289, 0, 308, 309, 309, 309, 309, - 308, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 310, 310, 310, 27, 25, 0, 0, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 186, 0, 289, 289, 290, + 291, 290, 289, 289, 292, 293, 289, 294, 295, 296, 295, 295, 297, 297, + 297, 297, 297, 297, 297, 297, 297, 297, 295, 289, 298, 299, 298, 289, + 289, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 292, + 289, 293, 301, 302, 301, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 292, 299, 293, 299, 292, 293, 304, 305, 306, 304, 304, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 308, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 308, 308, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 0, 0, 0, 307, 307, 307, 307, 307, 307, 0, 0, + 307, 307, 307, 307, 307, 307, 0, 0, 307, 307, 307, 307, 307, 307, 0, 0, + 307, 307, 307, 0, 0, 0, 291, 291, 299, 301, 309, 291, 291, 0, 310, 311, + 311, 311, 311, 310, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 312, 312, 27, + 25, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, 0, 82, 136, 79, 0, 0, 0, 0, 147, 147, - 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, 79, 311, 311, 311, 311, - 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, - 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, - 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, - 311, 311, 311, 311, 311, 311, 311, 152, 152, 152, 152, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 152, 0, 0, 0, 0, 0, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 82, 135, 79, 0, 0, 0, 0, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, 79, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 151, 151, 151, 151, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 151, 0, 0, 0, + 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 84, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 79, 79, 79, 79, 79, 79, 79, 84, 0, 0, 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, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 0, 0, 0, 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, 47, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 147, 147, 147, 147, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 172, 47, 47, 47, 47, 47, 47, 47, 47, 172, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 146, 146, 146, 146, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 171, 47, 47, 47, 47, 47, 47, 47, 47, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 82, 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, 0, 0, 0, - 0, 47, 47, 47, 47, 47, 47, 47, 47, 82, 172, 172, 172, 172, 172, 0, 0, 0, + 0, 47, 47, 47, 47, 47, 47, 47, 47, 82, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, @@ -2232,8 +2243,8 @@ static unsigned short index2[] = { 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, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, @@ -2242,33 +2253,33 @@ static unsigned short index2[] = { 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 105, 105, 0, 0, 0, 105, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 105, 105, 105, 105, 0, 102, 312, 312, 312, 312, 312, 312, - 312, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 0, 102, 314, 314, 314, 314, 314, 314, + 314, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - 312, 312, 312, 312, 312, 312, 0, 0, 0, 136, 105, 105, 105, 105, 105, 105, + 314, 314, 314, 314, 314, 314, 0, 0, 0, 135, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 105, 133, 133, 133, 0, 133, 133, 0, 0, 0, 0, 0, - 133, 84, 133, 80, 105, 105, 105, 105, 0, 105, 105, 105, 0, 105, 105, 105, + 0, 0, 0, 0, 0, 0, 0, 0, 105, 132, 132, 132, 0, 132, 132, 0, 0, 0, 0, 0, + 132, 84, 132, 80, 105, 105, 105, 105, 0, 105, 105, 105, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 80, 175, - 84, 0, 0, 0, 0, 140, 312, 312, 312, 312, 312, 312, 312, 312, 0, 0, 0, 0, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 80, 174, + 84, 0, 0, 0, 0, 139, 314, 314, 314, 314, 314, 314, 314, 314, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 312, 312, 102, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 314, 314, 102, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 105, 105, 105, + 105, 105, 105, 0, 0, 0, 135, 135, 135, 135, 135, 135, 135, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 105, 105, 0, 0, 312, 312, 312, 312, 312, 312, 312, 312, + 105, 105, 105, 105, 105, 0, 0, 314, 314, 314, 314, 314, 314, 314, 314, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 312, 312, 312, 312, 312, 312, - 312, 312, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 314, 314, 314, 314, 314, 314, + 314, 314, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, @@ -2279,34 +2290,53 @@ static unsigned short index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 0, 133, 133, - 137, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 138, 47, 138, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 138, 47, 47, 47, 47, 137, 137, 137, 133, 133, 133, - 133, 137, 137, 140, 139, 82, 82, 173, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 136, 132, + 136, 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, 47, 47, 47, 47, 47, 47, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 139, 82, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 132, 136, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 47, + 137, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 47, 47, + 47, 47, 136, 136, 136, 132, 132, 132, 132, 136, 136, 139, 138, 82, 82, + 172, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 82, 82, - 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 168, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, @@ -2321,13 +2351,13 @@ static unsigned short index2[] = { 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 314, 314, 314, 314, 314, - 314, 314, 315, 315, 175, 175, 175, 79, 79, 79, 316, 315, 315, 315, 315, - 315, 131, 131, 131, 131, 131, 131, 131, 131, 84, 84, 84, 84, 84, 84, 84, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 316, 316, 316, 316, 316, + 316, 316, 317, 317, 174, 174, 174, 79, 79, 79, 318, 317, 317, 317, 317, + 317, 186, 186, 186, 186, 186, 186, 186, 186, 84, 84, 84, 84, 84, 84, 84, 84, 79, 79, 80, 80, 80, 80, 80, 84, 84, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 314, 314, 314, 314, 314, 314, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 316, 316, 316, 316, 316, 316, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, @@ -2342,8 +2372,8 @@ static unsigned short index2[] = { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, + 0, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 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, 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, 48, 48, 48, 48, 48, @@ -2382,25 +2412,25 @@ static unsigned short index2[] = { 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 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, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 317, 35, 35, 35, 35, 35, 35, 35, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 319, 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, - 219, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 317, 35, 35, 35, + 220, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 319, 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, 219, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, + 35, 35, 35, 35, 220, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 317, 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, 219, 35, 35, 35, 35, 35, 35, 48, 48, 48, + 319, 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, 220, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 317, 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, 219, 35, 35, 35, 35, 35, + 48, 48, 48, 48, 319, 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, 220, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 317, 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, 219, 35, - 35, 35, 35, 35, 35, 48, 35, 0, 0, 318, 318, 318, 318, 318, 318, 318, 318, - 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 27, + 48, 48, 48, 48, 48, 48, 48, 48, 319, 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, 220, 35, + 35, 35, 35, 35, 35, 48, 35, 0, 0, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, @@ -2409,59 +2439,130 @@ static unsigned short index2[] = { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 319, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 234, 0, 234, 0, 0, 234, 0, 0, 0, 234, 0, 0, 0, 234, 234, 234, - 234, 234, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, - 262, 262, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 262, 262, 262, 0, - 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 261, 261, 261, 261, 261, 261, 261, 261, 261, 0, + 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 0, 0, 0, 0, 0, 0, 0, 0, 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, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 321, 0, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 0, 0, 0, 0, 0, 0, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 235, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 262, 262, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 0, 0, 0, 0, 0, 262, 262, 262, 262, 262, 262, 262, 262, 262, 0, + 0, 0, 0, 0, 0, 0, 262, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, + 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 27, 27, 27, + 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 0, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 79, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, 0, 0, 0, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 79, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 27, 27, 27, 0, 27, 0, 27, 0, 27, + 0, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, 0, 27, 0, + 0, 27, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, + 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, @@ -2474,17 +2575,17 @@ static unsigned short index2[] = { 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 0, 0, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 0, 0, }; /* decomposition data */ @@ -2712,610 +2813,580 @@ static unsigned int decomp_data[] = { 8722, 259, 61, 259, 40, 259, 41, 259, 110, 261, 48, 261, 49, 261, 50, 261, 51, 261, 52, 261, 53, 261, 54, 261, 55, 261, 56, 261, 57, 261, 43, 261, 8722, 261, 61, 261, 40, 261, 41, 261, 97, 261, 101, 261, 111, 261, - 120, 261, 601, 514, 82, 115, 770, 97, 47, 99, 770, 97, 47, 115, 262, 67, - 514, 176, 67, 770, 99, 47, 111, 770, 99, 47, 117, 258, 400, 514, 176, 70, - 262, 103, 262, 72, 262, 72, 262, 72, 262, 104, 262, 295, 262, 73, 262, - 73, 262, 76, 262, 108, 262, 78, 514, 78, 111, 262, 80, 262, 81, 262, 82, - 262, 82, 262, 82, 515, 83, 77, 770, 84, 69, 76, 515, 84, 77, 262, 90, - 256, 937, 262, 90, 256, 75, 256, 197, 262, 66, 262, 67, 262, 101, 262, - 69, 262, 70, 262, 77, 262, 111, 258, 1488, 258, 1489, 258, 1490, 258, - 1491, 262, 105, 770, 70, 65, 88, 262, 960, 262, 947, 262, 915, 262, 928, - 262, 8721, 262, 68, 262, 100, 262, 101, 262, 105, 262, 106, 772, 49, - 8260, 55, 772, 49, 8260, 57, 1028, 49, 8260, 49, 48, 772, 49, 8260, 51, - 772, 50, 8260, 51, 772, 49, 8260, 53, 772, 50, 8260, 53, 772, 51, 8260, - 53, 772, 52, 8260, 53, 772, 49, 8260, 54, 772, 53, 8260, 54, 772, 49, - 8260, 56, 772, 51, 8260, 56, 772, 53, 8260, 56, 772, 55, 8260, 56, 516, - 49, 8260, 258, 73, 514, 73, 73, 770, 73, 73, 73, 514, 73, 86, 258, 86, - 514, 86, 73, 770, 86, 73, 73, 1026, 86, 73, 73, 73, 514, 73, 88, 258, 88, - 514, 88, 73, 770, 88, 73, 73, 258, 76, 258, 67, 258, 68, 258, 77, 258, - 105, 514, 105, 105, 770, 105, 105, 105, 514, 105, 118, 258, 118, 514, - 118, 105, 770, 118, 105, 105, 1026, 118, 105, 105, 105, 514, 105, 120, - 258, 120, 514, 120, 105, 770, 120, 105, 105, 258, 108, 258, 99, 258, 100, - 258, 109, 772, 48, 8260, 51, 512, 8592, 824, 512, 8594, 824, 512, 8596, - 824, 512, 8656, 824, 512, 8660, 824, 512, 8658, 824, 512, 8707, 824, 512, - 8712, 824, 512, 8715, 824, 512, 8739, 824, 512, 8741, 824, 514, 8747, - 8747, 770, 8747, 8747, 8747, 514, 8750, 8750, 770, 8750, 8750, 8750, 512, - 8764, 824, 512, 8771, 824, 512, 8773, 824, 512, 8776, 824, 512, 61, 824, - 512, 8801, 824, 512, 8781, 824, 512, 60, 824, 512, 62, 824, 512, 8804, - 824, 512, 8805, 824, 512, 8818, 824, 512, 8819, 824, 512, 8822, 824, 512, - 8823, 824, 512, 8826, 824, 512, 8827, 824, 512, 8834, 824, 512, 8835, - 824, 512, 8838, 824, 512, 8839, 824, 512, 8866, 824, 512, 8872, 824, 512, - 8873, 824, 512, 8875, 824, 512, 8828, 824, 512, 8829, 824, 512, 8849, - 824, 512, 8850, 824, 512, 8882, 824, 512, 8883, 824, 512, 8884, 824, 512, - 8885, 824, 256, 12296, 256, 12297, 263, 49, 263, 50, 263, 51, 263, 52, - 263, 53, 263, 54, 263, 55, 263, 56, 263, 57, 519, 49, 48, 519, 49, 49, - 519, 49, 50, 519, 49, 51, 519, 49, 52, 519, 49, 53, 519, 49, 54, 519, 49, - 55, 519, 49, 56, 519, 49, 57, 519, 50, 48, 770, 40, 49, 41, 770, 40, 50, - 41, 770, 40, 51, 41, 770, 40, 52, 41, 770, 40, 53, 41, 770, 40, 54, 41, - 770, 40, 55, 41, 770, 40, 56, 41, 770, 40, 57, 41, 1026, 40, 49, 48, 41, - 1026, 40, 49, 49, 41, 1026, 40, 49, 50, 41, 1026, 40, 49, 51, 41, 1026, - 40, 49, 52, 41, 1026, 40, 49, 53, 41, 1026, 40, 49, 54, 41, 1026, 40, 49, - 55, 41, 1026, 40, 49, 56, 41, 1026, 40, 49, 57, 41, 1026, 40, 50, 48, 41, - 514, 49, 46, 514, 50, 46, 514, 51, 46, 514, 52, 46, 514, 53, 46, 514, 54, - 46, 514, 55, 46, 514, 56, 46, 514, 57, 46, 770, 49, 48, 46, 770, 49, 49, - 46, 770, 49, 50, 46, 770, 49, 51, 46, 770, 49, 52, 46, 770, 49, 53, 46, - 770, 49, 54, 46, 770, 49, 55, 46, 770, 49, 56, 46, 770, 49, 57, 46, 770, - 50, 48, 46, 770, 40, 97, 41, 770, 40, 98, 41, 770, 40, 99, 41, 770, 40, - 100, 41, 770, 40, 101, 41, 770, 40, 102, 41, 770, 40, 103, 41, 770, 40, - 104, 41, 770, 40, 105, 41, 770, 40, 106, 41, 770, 40, 107, 41, 770, 40, - 108, 41, 770, 40, 109, 41, 770, 40, 110, 41, 770, 40, 111, 41, 770, 40, - 112, 41, 770, 40, 113, 41, 770, 40, 114, 41, 770, 40, 115, 41, 770, 40, - 116, 41, 770, 40, 117, 41, 770, 40, 118, 41, 770, 40, 119, 41, 770, 40, - 120, 41, 770, 40, 121, 41, 770, 40, 122, 41, 263, 65, 263, 66, 263, 67, - 263, 68, 263, 69, 263, 70, 263, 71, 263, 72, 263, 73, 263, 74, 263, 75, - 263, 76, 263, 77, 263, 78, 263, 79, 263, 80, 263, 81, 263, 82, 263, 83, - 263, 84, 263, 85, 263, 86, 263, 87, 263, 88, 263, 89, 263, 90, 263, 97, - 263, 98, 263, 99, 263, 100, 263, 101, 263, 102, 263, 103, 263, 104, 263, - 105, 263, 106, 263, 107, 263, 108, 263, 109, 263, 110, 263, 111, 263, - 112, 263, 113, 263, 114, 263, 115, 263, 116, 263, 117, 263, 118, 263, - 119, 263, 120, 263, 121, 263, 122, 263, 48, 1026, 8747, 8747, 8747, 8747, - 770, 58, 58, 61, 514, 61, 61, 770, 61, 61, 61, 512, 10973, 824, 261, 106, - 259, 86, 259, 11617, 258, 27597, 258, 40863, 258, 19968, 258, 20008, 258, - 20022, 258, 20031, 258, 20057, 258, 20101, 258, 20108, 258, 20128, 258, - 20154, 258, 20799, 258, 20837, 258, 20843, 258, 20866, 258, 20886, 258, - 20907, 258, 20960, 258, 20981, 258, 20992, 258, 21147, 258, 21241, 258, - 21269, 258, 21274, 258, 21304, 258, 21313, 258, 21340, 258, 21353, 258, - 21378, 258, 21430, 258, 21448, 258, 21475, 258, 22231, 258, 22303, 258, - 22763, 258, 22786, 258, 22794, 258, 22805, 258, 22823, 258, 22899, 258, - 23376, 258, 23424, 258, 23544, 258, 23567, 258, 23586, 258, 23608, 258, - 23662, 258, 23665, 258, 24027, 258, 24037, 258, 24049, 258, 24062, 258, - 24178, 258, 24186, 258, 24191, 258, 24308, 258, 24318, 258, 24331, 258, - 24339, 258, 24400, 258, 24417, 258, 24435, 258, 24515, 258, 25096, 258, - 25142, 258, 25163, 258, 25903, 258, 25908, 258, 25991, 258, 26007, 258, - 26020, 258, 26041, 258, 26080, 258, 26085, 258, 26352, 258, 26376, 258, - 26408, 258, 27424, 258, 27490, 258, 27513, 258, 27571, 258, 27595, 258, - 27604, 258, 27611, 258, 27663, 258, 27668, 258, 27700, 258, 28779, 258, - 29226, 258, 29238, 258, 29243, 258, 29247, 258, 29255, 258, 29273, 258, - 29275, 258, 29356, 258, 29572, 258, 29577, 258, 29916, 258, 29926, 258, - 29976, 258, 29983, 258, 29992, 258, 30000, 258, 30091, 258, 30098, 258, - 30326, 258, 30333, 258, 30382, 258, 30399, 258, 30446, 258, 30683, 258, - 30690, 258, 30707, 258, 31034, 258, 31160, 258, 31166, 258, 31348, 258, - 31435, 258, 31481, 258, 31859, 258, 31992, 258, 32566, 258, 32593, 258, - 32650, 258, 32701, 258, 32769, 258, 32780, 258, 32786, 258, 32819, 258, - 32895, 258, 32905, 258, 33251, 258, 33258, 258, 33267, 258, 33276, 258, - 33292, 258, 33307, 258, 33311, 258, 33390, 258, 33394, 258, 33400, 258, - 34381, 258, 34411, 258, 34880, 258, 34892, 258, 34915, 258, 35198, 258, - 35211, 258, 35282, 258, 35328, 258, 35895, 258, 35910, 258, 35925, 258, - 35960, 258, 35997, 258, 36196, 258, 36208, 258, 36275, 258, 36523, 258, - 36554, 258, 36763, 258, 36784, 258, 36789, 258, 37009, 258, 37193, 258, - 37318, 258, 37324, 258, 37329, 258, 38263, 258, 38272, 258, 38428, 258, - 38582, 258, 38585, 258, 38632, 258, 38737, 258, 38750, 258, 38754, 258, - 38761, 258, 38859, 258, 38893, 258, 38899, 258, 38913, 258, 39080, 258, - 39131, 258, 39135, 258, 39318, 258, 39321, 258, 39340, 258, 39592, 258, - 39640, 258, 39647, 258, 39717, 258, 39727, 258, 39730, 258, 39740, 258, - 39770, 258, 40165, 258, 40565, 258, 40575, 258, 40613, 258, 40635, 258, - 40643, 258, 40653, 258, 40657, 258, 40697, 258, 40701, 258, 40718, 258, - 40723, 258, 40736, 258, 40763, 258, 40778, 258, 40786, 258, 40845, 258, - 40860, 258, 40864, 264, 32, 258, 12306, 258, 21313, 258, 21316, 258, - 21317, 512, 12363, 12441, 512, 12365, 12441, 512, 12367, 12441, 512, - 12369, 12441, 512, 12371, 12441, 512, 12373, 12441, 512, 12375, 12441, - 512, 12377, 12441, 512, 12379, 12441, 512, 12381, 12441, 512, 12383, - 12441, 512, 12385, 12441, 512, 12388, 12441, 512, 12390, 12441, 512, - 12392, 12441, 512, 12399, 12441, 512, 12399, 12442, 512, 12402, 12441, - 512, 12402, 12442, 512, 12405, 12441, 512, 12405, 12442, 512, 12408, - 12441, 512, 12408, 12442, 512, 12411, 12441, 512, 12411, 12442, 512, - 12358, 12441, 514, 32, 12441, 514, 32, 12442, 512, 12445, 12441, 521, - 12424, 12426, 512, 12459, 12441, 512, 12461, 12441, 512, 12463, 12441, - 512, 12465, 12441, 512, 12467, 12441, 512, 12469, 12441, 512, 12471, - 12441, 512, 12473, 12441, 512, 12475, 12441, 512, 12477, 12441, 512, - 12479, 12441, 512, 12481, 12441, 512, 12484, 12441, 512, 12486, 12441, - 512, 12488, 12441, 512, 12495, 12441, 512, 12495, 12442, 512, 12498, - 12441, 512, 12498, 12442, 512, 12501, 12441, 512, 12501, 12442, 512, - 12504, 12441, 512, 12504, 12442, 512, 12507, 12441, 512, 12507, 12442, - 512, 12454, 12441, 512, 12527, 12441, 512, 12528, 12441, 512, 12529, - 12441, 512, 12530, 12441, 512, 12541, 12441, 521, 12467, 12488, 258, - 4352, 258, 4353, 258, 4522, 258, 4354, 258, 4524, 258, 4525, 258, 4355, - 258, 4356, 258, 4357, 258, 4528, 258, 4529, 258, 4530, 258, 4531, 258, - 4532, 258, 4533, 258, 4378, 258, 4358, 258, 4359, 258, 4360, 258, 4385, - 258, 4361, 258, 4362, 258, 4363, 258, 4364, 258, 4365, 258, 4366, 258, - 4367, 258, 4368, 258, 4369, 258, 4370, 258, 4449, 258, 4450, 258, 4451, - 258, 4452, 258, 4453, 258, 4454, 258, 4455, 258, 4456, 258, 4457, 258, - 4458, 258, 4459, 258, 4460, 258, 4461, 258, 4462, 258, 4463, 258, 4464, - 258, 4465, 258, 4466, 258, 4467, 258, 4468, 258, 4469, 258, 4448, 258, - 4372, 258, 4373, 258, 4551, 258, 4552, 258, 4556, 258, 4558, 258, 4563, - 258, 4567, 258, 4569, 258, 4380, 258, 4573, 258, 4575, 258, 4381, 258, - 4382, 258, 4384, 258, 4386, 258, 4387, 258, 4391, 258, 4393, 258, 4395, - 258, 4396, 258, 4397, 258, 4398, 258, 4399, 258, 4402, 258, 4406, 258, - 4416, 258, 4423, 258, 4428, 258, 4593, 258, 4594, 258, 4439, 258, 4440, - 258, 4441, 258, 4484, 258, 4485, 258, 4488, 258, 4497, 258, 4498, 258, - 4500, 258, 4510, 258, 4513, 259, 19968, 259, 20108, 259, 19977, 259, - 22235, 259, 19978, 259, 20013, 259, 19979, 259, 30002, 259, 20057, 259, - 19993, 259, 19969, 259, 22825, 259, 22320, 259, 20154, 770, 40, 4352, 41, - 770, 40, 4354, 41, 770, 40, 4355, 41, 770, 40, 4357, 41, 770, 40, 4358, - 41, 770, 40, 4359, 41, 770, 40, 4361, 41, 770, 40, 4363, 41, 770, 40, - 4364, 41, 770, 40, 4366, 41, 770, 40, 4367, 41, 770, 40, 4368, 41, 770, - 40, 4369, 41, 770, 40, 4370, 41, 1026, 40, 4352, 4449, 41, 1026, 40, - 4354, 4449, 41, 1026, 40, 4355, 4449, 41, 1026, 40, 4357, 4449, 41, 1026, - 40, 4358, 4449, 41, 1026, 40, 4359, 4449, 41, 1026, 40, 4361, 4449, 41, - 1026, 40, 4363, 4449, 41, 1026, 40, 4364, 4449, 41, 1026, 40, 4366, 4449, - 41, 1026, 40, 4367, 4449, 41, 1026, 40, 4368, 4449, 41, 1026, 40, 4369, - 4449, 41, 1026, 40, 4370, 4449, 41, 1026, 40, 4364, 4462, 41, 1794, 40, - 4363, 4457, 4364, 4453, 4523, 41, 1538, 40, 4363, 4457, 4370, 4462, 41, - 770, 40, 19968, 41, 770, 40, 20108, 41, 770, 40, 19977, 41, 770, 40, - 22235, 41, 770, 40, 20116, 41, 770, 40, 20845, 41, 770, 40, 19971, 41, - 770, 40, 20843, 41, 770, 40, 20061, 41, 770, 40, 21313, 41, 770, 40, - 26376, 41, 770, 40, 28779, 41, 770, 40, 27700, 41, 770, 40, 26408, 41, - 770, 40, 37329, 41, 770, 40, 22303, 41, 770, 40, 26085, 41, 770, 40, - 26666, 41, 770, 40, 26377, 41, 770, 40, 31038, 41, 770, 40, 21517, 41, - 770, 40, 29305, 41, 770, 40, 36001, 41, 770, 40, 31069, 41, 770, 40, - 21172, 41, 770, 40, 20195, 41, 770, 40, 21628, 41, 770, 40, 23398, 41, - 770, 40, 30435, 41, 770, 40, 20225, 41, 770, 40, 36039, 41, 770, 40, - 21332, 41, 770, 40, 31085, 41, 770, 40, 20241, 41, 770, 40, 33258, 41, - 770, 40, 33267, 41, 263, 21839, 263, 24188, 263, 25991, 263, 31631, 778, - 80, 84, 69, 519, 50, 49, 519, 50, 50, 519, 50, 51, 519, 50, 52, 519, 50, - 53, 519, 50, 54, 519, 50, 55, 519, 50, 56, 519, 50, 57, 519, 51, 48, 519, - 51, 49, 519, 51, 50, 519, 51, 51, 519, 51, 52, 519, 51, 53, 263, 4352, - 263, 4354, 263, 4355, 263, 4357, 263, 4358, 263, 4359, 263, 4361, 263, - 4363, 263, 4364, 263, 4366, 263, 4367, 263, 4368, 263, 4369, 263, 4370, - 519, 4352, 4449, 519, 4354, 4449, 519, 4355, 4449, 519, 4357, 4449, 519, - 4358, 4449, 519, 4359, 4449, 519, 4361, 4449, 519, 4363, 4449, 519, 4364, - 4449, 519, 4366, 4449, 519, 4367, 4449, 519, 4368, 4449, 519, 4369, 4449, - 519, 4370, 4449, 1287, 4366, 4449, 4535, 4352, 4457, 1031, 4364, 4462, - 4363, 4468, 519, 4363, 4462, 263, 19968, 263, 20108, 263, 19977, 263, - 22235, 263, 20116, 263, 20845, 263, 19971, 263, 20843, 263, 20061, 263, - 21313, 263, 26376, 263, 28779, 263, 27700, 263, 26408, 263, 37329, 263, - 22303, 263, 26085, 263, 26666, 263, 26377, 263, 31038, 263, 21517, 263, - 29305, 263, 36001, 263, 31069, 263, 21172, 263, 31192, 263, 30007, 263, - 22899, 263, 36969, 263, 20778, 263, 21360, 263, 27880, 263, 38917, 263, - 20241, 263, 20889, 263, 27491, 263, 19978, 263, 20013, 263, 19979, 263, - 24038, 263, 21491, 263, 21307, 263, 23447, 263, 23398, 263, 30435, 263, - 20225, 263, 36039, 263, 21332, 263, 22812, 519, 51, 54, 519, 51, 55, 519, - 51, 56, 519, 51, 57, 519, 52, 48, 519, 52, 49, 519, 52, 50, 519, 52, 51, - 519, 52, 52, 519, 52, 53, 519, 52, 54, 519, 52, 55, 519, 52, 56, 519, 52, - 57, 519, 53, 48, 514, 49, 26376, 514, 50, 26376, 514, 51, 26376, 514, 52, - 26376, 514, 53, 26376, 514, 54, 26376, 514, 55, 26376, 514, 56, 26376, - 514, 57, 26376, 770, 49, 48, 26376, 770, 49, 49, 26376, 770, 49, 50, - 26376, 522, 72, 103, 778, 101, 114, 103, 522, 101, 86, 778, 76, 84, 68, - 263, 12450, 263, 12452, 263, 12454, 263, 12456, 263, 12458, 263, 12459, - 263, 12461, 263, 12463, 263, 12465, 263, 12467, 263, 12469, 263, 12471, - 263, 12473, 263, 12475, 263, 12477, 263, 12479, 263, 12481, 263, 12484, - 263, 12486, 263, 12488, 263, 12490, 263, 12491, 263, 12492, 263, 12493, - 263, 12494, 263, 12495, 263, 12498, 263, 12501, 263, 12504, 263, 12507, - 263, 12510, 263, 12511, 263, 12512, 263, 12513, 263, 12514, 263, 12516, - 263, 12518, 263, 12520, 263, 12521, 263, 12522, 263, 12523, 263, 12524, - 263, 12525, 263, 12527, 263, 12528, 263, 12529, 263, 12530, 1034, 12450, - 12497, 12540, 12488, 1034, 12450, 12523, 12501, 12449, 1034, 12450, - 12531, 12506, 12450, 778, 12450, 12540, 12523, 1034, 12452, 12491, 12531, - 12464, 778, 12452, 12531, 12481, 778, 12454, 12457, 12531, 1290, 12456, - 12473, 12463, 12540, 12489, 1034, 12456, 12540, 12459, 12540, 778, 12458, - 12531, 12473, 778, 12458, 12540, 12512, 778, 12459, 12452, 12522, 1034, - 12459, 12521, 12483, 12488, 1034, 12459, 12525, 12522, 12540, 778, 12460, - 12525, 12531, 778, 12460, 12531, 12510, 522, 12462, 12460, 778, 12462, - 12491, 12540, 1034, 12461, 12517, 12522, 12540, 1034, 12462, 12523, - 12480, 12540, 522, 12461, 12525, 1290, 12461, 12525, 12464, 12521, 12512, - 1546, 12461, 12525, 12513, 12540, 12488, 12523, 1290, 12461, 12525, - 12527, 12483, 12488, 778, 12464, 12521, 12512, 1290, 12464, 12521, 12512, - 12488, 12531, 1290, 12463, 12523, 12476, 12452, 12525, 1034, 12463, - 12525, 12540, 12493, 778, 12465, 12540, 12473, 778, 12467, 12523, 12490, - 778, 12467, 12540, 12509, 1034, 12469, 12452, 12463, 12523, 1290, 12469, - 12531, 12481, 12540, 12512, 1034, 12471, 12522, 12531, 12464, 778, 12475, - 12531, 12481, 778, 12475, 12531, 12488, 778, 12480, 12540, 12473, 522, - 12487, 12471, 522, 12489, 12523, 522, 12488, 12531, 522, 12490, 12494, - 778, 12494, 12483, 12488, 778, 12495, 12452, 12484, 1290, 12497, 12540, - 12475, 12531, 12488, 778, 12497, 12540, 12484, 1034, 12496, 12540, 12524, - 12523, 1290, 12500, 12450, 12473, 12488, 12523, 778, 12500, 12463, 12523, - 522, 12500, 12467, 522, 12499, 12523, 1290, 12501, 12449, 12521, 12483, - 12489, 1034, 12501, 12451, 12540, 12488, 1290, 12502, 12483, 12471, - 12455, 12523, 778, 12501, 12521, 12531, 1290, 12504, 12463, 12479, 12540, - 12523, 522, 12506, 12477, 778, 12506, 12491, 12498, 778, 12504, 12523, - 12484, 778, 12506, 12531, 12473, 778, 12506, 12540, 12472, 778, 12505, - 12540, 12479, 1034, 12509, 12452, 12531, 12488, 778, 12508, 12523, 12488, - 522, 12507, 12531, 778, 12509, 12531, 12489, 778, 12507, 12540, 12523, - 778, 12507, 12540, 12531, 1034, 12510, 12452, 12463, 12525, 778, 12510, - 12452, 12523, 778, 12510, 12483, 12495, 778, 12510, 12523, 12463, 1290, - 12510, 12531, 12471, 12519, 12531, 1034, 12511, 12463, 12525, 12531, 522, - 12511, 12522, 1290, 12511, 12522, 12496, 12540, 12523, 522, 12513, 12460, - 1034, 12513, 12460, 12488, 12531, 1034, 12513, 12540, 12488, 12523, 778, - 12516, 12540, 12489, 778, 12516, 12540, 12523, 778, 12518, 12450, 12531, - 1034, 12522, 12483, 12488, 12523, 522, 12522, 12521, 778, 12523, 12500, - 12540, 1034, 12523, 12540, 12502, 12523, 522, 12524, 12512, 1290, 12524, - 12531, 12488, 12466, 12531, 778, 12527, 12483, 12488, 514, 48, 28857, - 514, 49, 28857, 514, 50, 28857, 514, 51, 28857, 514, 52, 28857, 514, 53, - 28857, 514, 54, 28857, 514, 55, 28857, 514, 56, 28857, 514, 57, 28857, - 770, 49, 48, 28857, 770, 49, 49, 28857, 770, 49, 50, 28857, 770, 49, 51, - 28857, 770, 49, 52, 28857, 770, 49, 53, 28857, 770, 49, 54, 28857, 770, - 49, 55, 28857, 770, 49, 56, 28857, 770, 49, 57, 28857, 770, 50, 48, - 28857, 770, 50, 49, 28857, 770, 50, 50, 28857, 770, 50, 51, 28857, 770, - 50, 52, 28857, 778, 104, 80, 97, 522, 100, 97, 522, 65, 85, 778, 98, 97, - 114, 522, 111, 86, 522, 112, 99, 522, 100, 109, 778, 100, 109, 178, 778, - 100, 109, 179, 522, 73, 85, 522, 24179, 25104, 522, 26157, 21644, 522, - 22823, 27491, 522, 26126, 27835, 1034, 26666, 24335, 20250, 31038, 522, - 112, 65, 522, 110, 65, 522, 956, 65, 522, 109, 65, 522, 107, 65, 522, 75, - 66, 522, 77, 66, 522, 71, 66, 778, 99, 97, 108, 1034, 107, 99, 97, 108, - 522, 112, 70, 522, 110, 70, 522, 956, 70, 522, 956, 103, 522, 109, 103, - 522, 107, 103, 522, 72, 122, 778, 107, 72, 122, 778, 77, 72, 122, 778, - 71, 72, 122, 778, 84, 72, 122, 522, 956, 8467, 522, 109, 8467, 522, 100, - 8467, 522, 107, 8467, 522, 102, 109, 522, 110, 109, 522, 956, 109, 522, - 109, 109, 522, 99, 109, 522, 107, 109, 778, 109, 109, 178, 778, 99, 109, - 178, 522, 109, 178, 778, 107, 109, 178, 778, 109, 109, 179, 778, 99, 109, - 179, 522, 109, 179, 778, 107, 109, 179, 778, 109, 8725, 115, 1034, 109, - 8725, 115, 178, 522, 80, 97, 778, 107, 80, 97, 778, 77, 80, 97, 778, 71, - 80, 97, 778, 114, 97, 100, 1290, 114, 97, 100, 8725, 115, 1546, 114, 97, - 100, 8725, 115, 178, 522, 112, 115, 522, 110, 115, 522, 956, 115, 522, - 109, 115, 522, 112, 86, 522, 110, 86, 522, 956, 86, 522, 109, 86, 522, - 107, 86, 522, 77, 86, 522, 112, 87, 522, 110, 87, 522, 956, 87, 522, 109, - 87, 522, 107, 87, 522, 77, 87, 522, 107, 937, 522, 77, 937, 1034, 97, 46, - 109, 46, 522, 66, 113, 522, 99, 99, 522, 99, 100, 1034, 67, 8725, 107, - 103, 778, 67, 111, 46, 522, 100, 66, 522, 71, 121, 522, 104, 97, 522, 72, - 80, 522, 105, 110, 522, 75, 75, 522, 75, 77, 522, 107, 116, 522, 108, - 109, 522, 108, 110, 778, 108, 111, 103, 522, 108, 120, 522, 109, 98, 778, - 109, 105, 108, 778, 109, 111, 108, 522, 80, 72, 1034, 112, 46, 109, 46, - 778, 80, 80, 77, 522, 80, 82, 522, 115, 114, 522, 83, 118, 522, 87, 98, - 778, 86, 8725, 109, 778, 65, 8725, 109, 514, 49, 26085, 514, 50, 26085, - 514, 51, 26085, 514, 52, 26085, 514, 53, 26085, 514, 54, 26085, 514, 55, - 26085, 514, 56, 26085, 514, 57, 26085, 770, 49, 48, 26085, 770, 49, 49, - 26085, 770, 49, 50, 26085, 770, 49, 51, 26085, 770, 49, 52, 26085, 770, - 49, 53, 26085, 770, 49, 54, 26085, 770, 49, 55, 26085, 770, 49, 56, - 26085, 770, 49, 57, 26085, 770, 50, 48, 26085, 770, 50, 49, 26085, 770, - 50, 50, 26085, 770, 50, 51, 26085, 770, 50, 52, 26085, 770, 50, 53, - 26085, 770, 50, 54, 26085, 770, 50, 55, 26085, 770, 50, 56, 26085, 770, - 50, 57, 26085, 770, 51, 48, 26085, 770, 51, 49, 26085, 778, 103, 97, 108, - 259, 42863, 256, 35912, 256, 26356, 256, 36554, 256, 36040, 256, 28369, - 256, 20018, 256, 21477, 256, 40860, 256, 40860, 256, 22865, 256, 37329, - 256, 21895, 256, 22856, 256, 25078, 256, 30313, 256, 32645, 256, 34367, - 256, 34746, 256, 35064, 256, 37007, 256, 27138, 256, 27931, 256, 28889, - 256, 29662, 256, 33853, 256, 37226, 256, 39409, 256, 20098, 256, 21365, - 256, 27396, 256, 29211, 256, 34349, 256, 40478, 256, 23888, 256, 28651, - 256, 34253, 256, 35172, 256, 25289, 256, 33240, 256, 34847, 256, 24266, - 256, 26391, 256, 28010, 256, 29436, 256, 37070, 256, 20358, 256, 20919, - 256, 21214, 256, 25796, 256, 27347, 256, 29200, 256, 30439, 256, 32769, - 256, 34310, 256, 34396, 256, 36335, 256, 38706, 256, 39791, 256, 40442, - 256, 30860, 256, 31103, 256, 32160, 256, 33737, 256, 37636, 256, 40575, - 256, 35542, 256, 22751, 256, 24324, 256, 31840, 256, 32894, 256, 29282, - 256, 30922, 256, 36034, 256, 38647, 256, 22744, 256, 23650, 256, 27155, - 256, 28122, 256, 28431, 256, 32047, 256, 32311, 256, 38475, 256, 21202, - 256, 32907, 256, 20956, 256, 20940, 256, 31260, 256, 32190, 256, 33777, - 256, 38517, 256, 35712, 256, 25295, 256, 27138, 256, 35582, 256, 20025, - 256, 23527, 256, 24594, 256, 29575, 256, 30064, 256, 21271, 256, 30971, - 256, 20415, 256, 24489, 256, 19981, 256, 27852, 256, 25976, 256, 32034, - 256, 21443, 256, 22622, 256, 30465, 256, 33865, 256, 35498, 256, 27578, - 256, 36784, 256, 27784, 256, 25342, 256, 33509, 256, 25504, 256, 30053, - 256, 20142, 256, 20841, 256, 20937, 256, 26753, 256, 31975, 256, 33391, - 256, 35538, 256, 37327, 256, 21237, 256, 21570, 256, 22899, 256, 24300, - 256, 26053, 256, 28670, 256, 31018, 256, 38317, 256, 39530, 256, 40599, - 256, 40654, 256, 21147, 256, 26310, 256, 27511, 256, 36706, 256, 24180, - 256, 24976, 256, 25088, 256, 25754, 256, 28451, 256, 29001, 256, 29833, - 256, 31178, 256, 32244, 256, 32879, 256, 36646, 256, 34030, 256, 36899, - 256, 37706, 256, 21015, 256, 21155, 256, 21693, 256, 28872, 256, 35010, - 256, 35498, 256, 24265, 256, 24565, 256, 25467, 256, 27566, 256, 31806, - 256, 29557, 256, 20196, 256, 22265, 256, 23527, 256, 23994, 256, 24604, - 256, 29618, 256, 29801, 256, 32666, 256, 32838, 256, 37428, 256, 38646, - 256, 38728, 256, 38936, 256, 20363, 256, 31150, 256, 37300, 256, 38584, - 256, 24801, 256, 20102, 256, 20698, 256, 23534, 256, 23615, 256, 26009, - 256, 27138, 256, 29134, 256, 30274, 256, 34044, 256, 36988, 256, 40845, - 256, 26248, 256, 38446, 256, 21129, 256, 26491, 256, 26611, 256, 27969, - 256, 28316, 256, 29705, 256, 30041, 256, 30827, 256, 32016, 256, 39006, - 256, 20845, 256, 25134, 256, 38520, 256, 20523, 256, 23833, 256, 28138, - 256, 36650, 256, 24459, 256, 24900, 256, 26647, 256, 29575, 256, 38534, - 256, 21033, 256, 21519, 256, 23653, 256, 26131, 256, 26446, 256, 26792, - 256, 27877, 256, 29702, 256, 30178, 256, 32633, 256, 35023, 256, 35041, - 256, 37324, 256, 38626, 256, 21311, 256, 28346, 256, 21533, 256, 29136, - 256, 29848, 256, 34298, 256, 38563, 256, 40023, 256, 40607, 256, 26519, - 256, 28107, 256, 33256, 256, 31435, 256, 31520, 256, 31890, 256, 29376, - 256, 28825, 256, 35672, 256, 20160, 256, 33590, 256, 21050, 256, 20999, - 256, 24230, 256, 25299, 256, 31958, 256, 23429, 256, 27934, 256, 26292, - 256, 36667, 256, 34892, 256, 38477, 256, 35211, 256, 24275, 256, 20800, - 256, 21952, 256, 22618, 256, 26228, 256, 20958, 256, 29482, 256, 30410, - 256, 31036, 256, 31070, 256, 31077, 256, 31119, 256, 38742, 256, 31934, - 256, 32701, 256, 34322, 256, 35576, 256, 36920, 256, 37117, 256, 39151, - 256, 39164, 256, 39208, 256, 40372, 256, 20398, 256, 20711, 256, 20813, - 256, 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120, - 256, 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936, - 256, 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757, - 256, 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730, - 256, 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062, - 256, 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680, - 256, 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261, - 256, 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585, - 256, 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627, - 256, 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, 256, 20006, - 256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191, - 256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618, - 256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274, - 256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840, - 256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628, - 256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454, - 256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450, - 256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482, - 256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410, - 256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409, - 256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773, - 256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222, - 256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565, - 256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273, - 256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911, - 256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, 256, 141380, - 256, 144341, 256, 15261, 256, 16408, 256, 16441, 256, 152137, 256, - 154832, 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, 514, 102, - 105, 514, 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, 514, 383, - 116, 514, 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, 1396, 1387, - 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, 1463, 262, - 1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, 262, 1501, - 262, 1512, 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, 1474, 512, - 64329, 1473, 512, 64329, 1474, 512, 1488, 1463, 512, 1488, 1464, 512, - 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, 512, 1492, - 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496, 1468, 512, 1497, 1468, - 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468, 512, 1502, 1468, 512, - 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, 512, 1510, - 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513, 1468, 512, 1514, 1468, - 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471, 512, 1508, 1471, 514, - 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268, 1659, 269, 1659, 270, - 1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662, 267, 1664, 268, 1664, - 269, 1664, 270, 1664, 267, 1658, 268, 1658, 269, 1658, 270, 1658, 267, - 1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657, 268, 1657, 269, 1657, - 270, 1657, 267, 1700, 268, 1700, 269, 1700, 270, 1700, 267, 1702, 268, - 1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668, 269, 1668, 270, 1668, - 267, 1667, 268, 1667, 269, 1667, 270, 1667, 267, 1670, 268, 1670, 269, - 1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671, 270, 1671, 267, 1677, - 268, 1677, 267, 1676, 268, 1676, 267, 1678, 268, 1678, 267, 1672, 268, - 1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681, 267, 1705, 268, 1705, - 269, 1705, 270, 1705, 267, 1711, 268, 1711, 269, 1711, 270, 1711, 267, - 1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713, 268, 1713, 269, 1713, - 270, 1713, 267, 1722, 268, 1722, 267, 1723, 268, 1723, 269, 1723, 270, - 1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729, 269, 1729, 270, 1729, - 267, 1726, 268, 1726, 269, 1726, 270, 1726, 267, 1746, 268, 1746, 267, - 1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709, 270, 1709, 267, 1735, - 268, 1735, 267, 1734, 268, 1734, 267, 1736, 268, 1736, 267, 1655, 267, - 1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737, 268, 1737, 267, 1744, - 268, 1744, 269, 1744, 270, 1744, 269, 1609, 270, 1609, 523, 1574, 1575, - 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749, 523, 1574, 1608, 524, - 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, 524, 1574, - 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574, 1744, 524, 1574, 1744, - 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609, 525, 1574, 1609, 267, - 1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574, 1580, 523, 1574, 1581, - 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610, 523, 1576, 1580, 523, - 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, 523, 1576, - 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578, 1582, 523, 1578, 1605, - 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580, 523, 1579, 1605, 523, - 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, 523, 1581, - 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582, 1581, 523, 1582, 1605, - 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582, 523, 1587, 1605, 523, - 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, 523, 1590, - 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591, 1605, 523, 1592, 1605, - 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580, 523, 1594, 1605, 523, - 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, 523, 1601, - 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602, 1605, 523, 1602, 1609, - 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580, 523, 1603, 1581, 523, - 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, 523, 1603, - 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604, 1582, 523, 1604, 1605, - 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580, 523, 1605, 1581, 523, - 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, 523, 1606, - 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606, 1605, 523, 1606, 1609, - 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605, 523, 1607, 1609, 523, - 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, 523, 1610, - 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584, 1648, 523, 1585, 1648, - 523, 1609, 1648, 779, 32, 1612, 1617, 779, 32, 1613, 1617, 779, 32, 1614, - 1617, 779, 32, 1615, 1617, 779, 32, 1616, 1617, 779, 32, 1617, 1648, 524, - 1574, 1585, 524, 1574, 1586, 524, 1574, 1605, 524, 1574, 1606, 524, 1574, - 1609, 524, 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, 524, 1576, 1605, - 524, 1576, 1606, 524, 1576, 1609, 524, 1576, 1610, 524, 1578, 1585, 524, - 1578, 1586, 524, 1578, 1605, 524, 1578, 1606, 524, 1578, 1609, 524, 1578, - 1610, 524, 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, 524, 1579, 1606, - 524, 1579, 1609, 524, 1579, 1610, 524, 1601, 1609, 524, 1601, 1610, 524, - 1602, 1609, 524, 1602, 1610, 524, 1603, 1575, 524, 1603, 1604, 524, 1603, - 1605, 524, 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, 524, 1604, 1609, - 524, 1604, 1610, 524, 1605, 1575, 524, 1605, 1605, 524, 1606, 1585, 524, - 1606, 1586, 524, 1606, 1605, 524, 1606, 1606, 524, 1606, 1609, 524, 1606, - 1610, 524, 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, 524, 1610, 1605, - 524, 1610, 1606, 524, 1610, 1609, 524, 1610, 1610, 525, 1574, 1580, 525, - 1574, 1581, 525, 1574, 1582, 525, 1574, 1605, 525, 1574, 1607, 525, 1576, - 1580, 525, 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, 525, 1576, 1607, - 525, 1578, 1580, 525, 1578, 1581, 525, 1578, 1582, 525, 1578, 1605, 525, - 1578, 1607, 525, 1579, 1605, 525, 1580, 1581, 525, 1580, 1605, 525, 1581, - 1580, 525, 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, 525, 1587, 1580, - 525, 1587, 1581, 525, 1587, 1582, 525, 1587, 1605, 525, 1589, 1581, 525, - 1589, 1582, 525, 1589, 1605, 525, 1590, 1580, 525, 1590, 1581, 525, 1590, - 1582, 525, 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, 525, 1593, 1580, - 525, 1593, 1605, 525, 1594, 1580, 525, 1594, 1605, 525, 1601, 1580, 525, - 1601, 1581, 525, 1601, 1582, 525, 1601, 1605, 525, 1602, 1581, 525, 1602, - 1605, 525, 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, 525, 1603, 1604, - 525, 1603, 1605, 525, 1604, 1580, 525, 1604, 1581, 525, 1604, 1582, 525, - 1604, 1605, 525, 1604, 1607, 525, 1605, 1580, 525, 1605, 1581, 525, 1605, - 1582, 525, 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, 525, 1606, 1582, - 525, 1606, 1605, 525, 1606, 1607, 525, 1607, 1580, 525, 1607, 1605, 525, - 1607, 1648, 525, 1610, 1580, 525, 1610, 1581, 525, 1610, 1582, 525, 1610, - 1605, 525, 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, 526, 1576, 1605, - 526, 1576, 1607, 526, 1578, 1605, 526, 1578, 1607, 526, 1579, 1605, 526, - 1579, 1607, 526, 1587, 1605, 526, 1587, 1607, 526, 1588, 1605, 526, 1588, - 1607, 526, 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, 526, 1606, 1605, - 526, 1606, 1607, 526, 1610, 1605, 526, 1610, 1607, 782, 1600, 1614, 1617, - 782, 1600, 1615, 1617, 782, 1600, 1616, 1617, 523, 1591, 1609, 523, 1591, - 1610, 523, 1593, 1609, 523, 1593, 1610, 523, 1594, 1609, 523, 1594, 1610, - 523, 1587, 1609, 523, 1587, 1610, 523, 1588, 1609, 523, 1588, 1610, 523, - 1581, 1609, 523, 1581, 1610, 523, 1580, 1609, 523, 1580, 1610, 523, 1582, - 1609, 523, 1582, 1610, 523, 1589, 1609, 523, 1589, 1610, 523, 1590, 1609, - 523, 1590, 1610, 523, 1588, 1580, 523, 1588, 1581, 523, 1588, 1582, 523, - 1588, 1605, 523, 1588, 1585, 523, 1587, 1585, 523, 1589, 1585, 523, 1590, - 1585, 524, 1591, 1609, 524, 1591, 1610, 524, 1593, 1609, 524, 1593, 1610, - 524, 1594, 1609, 524, 1594, 1610, 524, 1587, 1609, 524, 1587, 1610, 524, - 1588, 1609, 524, 1588, 1610, 524, 1581, 1609, 524, 1581, 1610, 524, 1580, - 1609, 524, 1580, 1610, 524, 1582, 1609, 524, 1582, 1610, 524, 1589, 1609, - 524, 1589, 1610, 524, 1590, 1609, 524, 1590, 1610, 524, 1588, 1580, 524, - 1588, 1581, 524, 1588, 1582, 524, 1588, 1605, 524, 1588, 1585, 524, 1587, - 1585, 524, 1589, 1585, 524, 1590, 1585, 525, 1588, 1580, 525, 1588, 1581, - 525, 1588, 1582, 525, 1588, 1605, 525, 1587, 1607, 525, 1588, 1607, 525, - 1591, 1605, 526, 1587, 1580, 526, 1587, 1581, 526, 1587, 1582, 526, 1588, - 1580, 526, 1588, 1581, 526, 1588, 1582, 526, 1591, 1605, 526, 1592, 1605, - 524, 1575, 1611, 523, 1575, 1611, 781, 1578, 1580, 1605, 780, 1578, 1581, - 1580, 781, 1578, 1581, 1580, 781, 1578, 1581, 1605, 781, 1578, 1582, - 1605, 781, 1578, 1605, 1580, 781, 1578, 1605, 1581, 781, 1578, 1605, - 1582, 780, 1580, 1605, 1581, 781, 1580, 1605, 1581, 780, 1581, 1605, - 1610, 780, 1581, 1605, 1609, 781, 1587, 1581, 1580, 781, 1587, 1580, - 1581, 780, 1587, 1580, 1609, 780, 1587, 1605, 1581, 781, 1587, 1605, - 1581, 781, 1587, 1605, 1580, 780, 1587, 1605, 1605, 781, 1587, 1605, - 1605, 780, 1589, 1581, 1581, 781, 1589, 1581, 1581, 780, 1589, 1605, - 1605, 780, 1588, 1581, 1605, 781, 1588, 1581, 1605, 780, 1588, 1580, - 1610, 780, 1588, 1605, 1582, 781, 1588, 1605, 1582, 780, 1588, 1605, - 1605, 781, 1588, 1605, 1605, 780, 1590, 1581, 1609, 780, 1590, 1582, - 1605, 781, 1590, 1582, 1605, 780, 1591, 1605, 1581, 781, 1591, 1605, - 1581, 781, 1591, 1605, 1605, 780, 1591, 1605, 1610, 780, 1593, 1580, - 1605, 780, 1593, 1605, 1605, 781, 1593, 1605, 1605, 780, 1593, 1605, - 1609, 780, 1594, 1605, 1605, 780, 1594, 1605, 1610, 780, 1594, 1605, - 1609, 780, 1601, 1582, 1605, 781, 1601, 1582, 1605, 780, 1602, 1605, - 1581, 780, 1602, 1605, 1605, 780, 1604, 1581, 1605, 780, 1604, 1581, - 1610, 780, 1604, 1581, 1609, 781, 1604, 1580, 1580, 780, 1604, 1580, - 1580, 780, 1604, 1582, 1605, 781, 1604, 1582, 1605, 780, 1604, 1605, - 1581, 781, 1604, 1605, 1581, 781, 1605, 1581, 1580, 781, 1605, 1581, - 1605, 780, 1605, 1581, 1610, 781, 1605, 1580, 1581, 781, 1605, 1580, - 1605, 781, 1605, 1582, 1580, 781, 1605, 1582, 1605, 781, 1605, 1580, - 1582, 781, 1607, 1605, 1580, 781, 1607, 1605, 1605, 781, 1606, 1581, - 1605, 780, 1606, 1581, 1609, 780, 1606, 1580, 1605, 781, 1606, 1580, - 1605, 780, 1606, 1580, 1609, 780, 1606, 1605, 1610, 780, 1606, 1605, - 1609, 780, 1610, 1605, 1605, 781, 1610, 1605, 1605, 780, 1576, 1582, - 1610, 780, 1578, 1580, 1610, 780, 1578, 1580, 1609, 780, 1578, 1582, - 1610, 780, 1578, 1582, 1609, 780, 1578, 1605, 1610, 780, 1578, 1605, - 1609, 780, 1580, 1605, 1610, 780, 1580, 1581, 1609, 780, 1580, 1605, - 1609, 780, 1587, 1582, 1609, 780, 1589, 1581, 1610, 780, 1588, 1581, - 1610, 780, 1590, 1581, 1610, 780, 1604, 1580, 1610, 780, 1604, 1605, - 1610, 780, 1610, 1581, 1610, 780, 1610, 1580, 1610, 780, 1610, 1605, - 1610, 780, 1605, 1605, 1610, 780, 1602, 1605, 1610, 780, 1606, 1581, - 1610, 781, 1602, 1605, 1581, 781, 1604, 1581, 1605, 780, 1593, 1605, - 1610, 780, 1603, 1605, 1610, 781, 1606, 1580, 1581, 780, 1605, 1582, - 1610, 781, 1604, 1580, 1605, 780, 1603, 1605, 1605, 780, 1604, 1580, - 1605, 780, 1606, 1580, 1581, 780, 1580, 1581, 1610, 780, 1581, 1580, - 1610, 780, 1605, 1580, 1610, 780, 1601, 1605, 1610, 780, 1576, 1581, - 1610, 781, 1603, 1605, 1605, 781, 1593, 1580, 1605, 781, 1589, 1605, - 1605, 780, 1587, 1582, 1610, 780, 1606, 1580, 1610, 779, 1589, 1604, - 1746, 779, 1602, 1604, 1746, 1035, 1575, 1604, 1604, 1607, 1035, 1575, - 1603, 1576, 1585, 1035, 1605, 1581, 1605, 1583, 1035, 1589, 1604, 1593, - 1605, 1035, 1585, 1587, 1608, 1604, 1035, 1593, 1604, 1610, 1607, 1035, - 1608, 1587, 1604, 1605, 779, 1589, 1604, 1609, 4619, 1589, 1604, 1609, - 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, - 1604, 1605, 2059, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1035, - 1585, 1740, 1575, 1604, 265, 44, 265, 12289, 265, 12290, 265, 58, 265, - 59, 265, 33, 265, 63, 265, 12310, 265, 12311, 265, 8230, 265, 8229, 265, - 8212, 265, 8211, 265, 95, 265, 95, 265, 40, 265, 41, 265, 123, 265, 125, - 265, 12308, 265, 12309, 265, 12304, 265, 12305, 265, 12298, 265, 12299, - 265, 12296, 265, 12297, 265, 12300, 265, 12301, 265, 12302, 265, 12303, - 265, 91, 265, 93, 258, 8254, 258, 8254, 258, 8254, 258, 8254, 258, 95, - 258, 95, 258, 95, 271, 44, 271, 12289, 271, 46, 271, 59, 271, 58, 271, - 63, 271, 33, 271, 8212, 271, 40, 271, 41, 271, 123, 271, 125, 271, 12308, - 271, 12309, 271, 35, 271, 38, 271, 42, 271, 43, 271, 45, 271, 60, 271, - 62, 271, 61, 271, 92, 271, 36, 271, 37, 271, 64, 523, 32, 1611, 526, - 1600, 1611, 523, 32, 1612, 523, 32, 1613, 523, 32, 1614, 526, 1600, 1614, - 523, 32, 1615, 526, 1600, 1615, 523, 32, 1616, 526, 1600, 1616, 523, 32, - 1617, 526, 1600, 1617, 523, 32, 1618, 526, 1600, 1618, 267, 1569, 267, - 1570, 268, 1570, 267, 1571, 268, 1571, 267, 1572, 268, 1572, 267, 1573, - 268, 1573, 267, 1574, 268, 1574, 269, 1574, 270, 1574, 267, 1575, 268, - 1575, 267, 1576, 268, 1576, 269, 1576, 270, 1576, 267, 1577, 268, 1577, - 267, 1578, 268, 1578, 269, 1578, 270, 1578, 267, 1579, 268, 1579, 269, - 1579, 270, 1579, 267, 1580, 268, 1580, 269, 1580, 270, 1580, 267, 1581, - 268, 1581, 269, 1581, 270, 1581, 267, 1582, 268, 1582, 269, 1582, 270, - 1582, 267, 1583, 268, 1583, 267, 1584, 268, 1584, 267, 1585, 268, 1585, - 267, 1586, 268, 1586, 267, 1587, 268, 1587, 269, 1587, 270, 1587, 267, - 1588, 268, 1588, 269, 1588, 270, 1588, 267, 1589, 268, 1589, 269, 1589, - 270, 1589, 267, 1590, 268, 1590, 269, 1590, 270, 1590, 267, 1591, 268, - 1591, 269, 1591, 270, 1591, 267, 1592, 268, 1592, 269, 1592, 270, 1592, - 267, 1593, 268, 1593, 269, 1593, 270, 1593, 267, 1594, 268, 1594, 269, - 1594, 270, 1594, 267, 1601, 268, 1601, 269, 1601, 270, 1601, 267, 1602, - 268, 1602, 269, 1602, 270, 1602, 267, 1603, 268, 1603, 269, 1603, 270, - 1603, 267, 1604, 268, 1604, 269, 1604, 270, 1604, 267, 1605, 268, 1605, - 269, 1605, 270, 1605, 267, 1606, 268, 1606, 269, 1606, 270, 1606, 267, - 1607, 268, 1607, 269, 1607, 270, 1607, 267, 1608, 268, 1608, 267, 1609, - 268, 1609, 267, 1610, 268, 1610, 269, 1610, 270, 1610, 523, 1604, 1570, - 524, 1604, 1570, 523, 1604, 1571, 524, 1604, 1571, 523, 1604, 1573, 524, - 1604, 1573, 523, 1604, 1575, 524, 1604, 1575, 264, 33, 264, 34, 264, 35, - 264, 36, 264, 37, 264, 38, 264, 39, 264, 40, 264, 41, 264, 42, 264, 43, - 264, 44, 264, 45, 264, 46, 264, 47, 264, 48, 264, 49, 264, 50, 264, 51, - 264, 52, 264, 53, 264, 54, 264, 55, 264, 56, 264, 57, 264, 58, 264, 59, - 264, 60, 264, 61, 264, 62, 264, 63, 264, 64, 264, 65, 264, 66, 264, 67, - 264, 68, 264, 69, 264, 70, 264, 71, 264, 72, 264, 73, 264, 74, 264, 75, - 264, 76, 264, 77, 264, 78, 264, 79, 264, 80, 264, 81, 264, 82, 264, 83, - 264, 84, 264, 85, 264, 86, 264, 87, 264, 88, 264, 89, 264, 90, 264, 91, - 264, 92, 264, 93, 264, 94, 264, 95, 264, 96, 264, 97, 264, 98, 264, 99, - 264, 100, 264, 101, 264, 102, 264, 103, 264, 104, 264, 105, 264, 106, - 264, 107, 264, 108, 264, 109, 264, 110, 264, 111, 264, 112, 264, 113, - 264, 114, 264, 115, 264, 116, 264, 117, 264, 118, 264, 119, 264, 120, - 264, 121, 264, 122, 264, 123, 264, 124, 264, 125, 264, 126, 264, 10629, - 264, 10630, 272, 12290, 272, 12300, 272, 12301, 272, 12289, 272, 12539, - 272, 12530, 272, 12449, 272, 12451, 272, 12453, 272, 12455, 272, 12457, - 272, 12515, 272, 12517, 272, 12519, 272, 12483, 272, 12540, 272, 12450, - 272, 12452, 272, 12454, 272, 12456, 272, 12458, 272, 12459, 272, 12461, - 272, 12463, 272, 12465, 272, 12467, 272, 12469, 272, 12471, 272, 12473, - 272, 12475, 272, 12477, 272, 12479, 272, 12481, 272, 12484, 272, 12486, - 272, 12488, 272, 12490, 272, 12491, 272, 12492, 272, 12493, 272, 12494, - 272, 12495, 272, 12498, 272, 12501, 272, 12504, 272, 12507, 272, 12510, - 272, 12511, 272, 12512, 272, 12513, 272, 12514, 272, 12516, 272, 12518, - 272, 12520, 272, 12521, 272, 12522, 272, 12523, 272, 12524, 272, 12525, - 272, 12527, 272, 12531, 272, 12441, 272, 12442, 272, 12644, 272, 12593, - 272, 12594, 272, 12595, 272, 12596, 272, 12597, 272, 12598, 272, 12599, - 272, 12600, 272, 12601, 272, 12602, 272, 12603, 272, 12604, 272, 12605, - 272, 12606, 272, 12607, 272, 12608, 272, 12609, 272, 12610, 272, 12611, - 272, 12612, 272, 12613, 272, 12614, 272, 12615, 272, 12616, 272, 12617, - 272, 12618, 272, 12619, 272, 12620, 272, 12621, 272, 12622, 272, 12623, - 272, 12624, 272, 12625, 272, 12626, 272, 12627, 272, 12628, 272, 12629, - 272, 12630, 272, 12631, 272, 12632, 272, 12633, 272, 12634, 272, 12635, - 272, 12636, 272, 12637, 272, 12638, 272, 12639, 272, 12640, 272, 12641, - 272, 12642, 272, 12643, 264, 162, 264, 163, 264, 172, 264, 175, 264, 166, - 264, 165, 264, 8361, 272, 9474, 272, 8592, 272, 8593, 272, 8594, 272, - 8595, 272, 9632, 272, 9675, 512, 69785, 69818, 512, 69787, 69818, 512, - 69797, 69818, 512, 119127, 119141, 512, 119128, 119141, 512, 119135, - 119150, 512, 119135, 119151, 512, 119135, 119152, 512, 119135, 119153, - 512, 119135, 119154, 512, 119225, 119141, 512, 119226, 119141, 512, - 119227, 119150, 512, 119228, 119150, 512, 119227, 119151, 512, 119228, - 119151, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, - 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, - 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, - 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, - 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, - 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, - 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, - 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, - 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, - 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, - 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, - 102, 262, 103, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, - 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, - 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, - 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, - 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, - 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, - 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, - 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 67, 262, 68, - 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, 262, 80, 262, 81, 262, 83, - 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, - 262, 98, 262, 99, 262, 100, 262, 102, 262, 104, 262, 105, 262, 106, 262, - 107, 262, 108, 262, 109, 262, 110, 262, 112, 262, 113, 262, 114, 262, - 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, - 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, - 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, - 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, - 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, - 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, - 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, - 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, - 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, 262, 74, 262, 75, 262, 76, - 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 83, 262, 84, 262, 85, - 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, - 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, - 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, - 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, - 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, 262, 73, - 262, 74, 262, 75, 262, 76, 262, 77, 262, 79, 262, 83, 262, 84, 262, 85, - 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, - 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, + 120, 261, 601, 261, 104, 261, 107, 261, 108, 261, 109, 261, 110, 261, + 112, 261, 115, 261, 116, 514, 82, 115, 770, 97, 47, 99, 770, 97, 47, 115, + 262, 67, 514, 176, 67, 770, 99, 47, 111, 770, 99, 47, 117, 258, 400, 514, + 176, 70, 262, 103, 262, 72, 262, 72, 262, 72, 262, 104, 262, 295, 262, + 73, 262, 73, 262, 76, 262, 108, 262, 78, 514, 78, 111, 262, 80, 262, 81, + 262, 82, 262, 82, 262, 82, 515, 83, 77, 770, 84, 69, 76, 515, 84, 77, + 262, 90, 256, 937, 262, 90, 256, 75, 256, 197, 262, 66, 262, 67, 262, + 101, 262, 69, 262, 70, 262, 77, 262, 111, 258, 1488, 258, 1489, 258, + 1490, 258, 1491, 262, 105, 770, 70, 65, 88, 262, 960, 262, 947, 262, 915, + 262, 928, 262, 8721, 262, 68, 262, 100, 262, 101, 262, 105, 262, 106, + 772, 49, 8260, 55, 772, 49, 8260, 57, 1028, 49, 8260, 49, 48, 772, 49, + 8260, 51, 772, 50, 8260, 51, 772, 49, 8260, 53, 772, 50, 8260, 53, 772, + 51, 8260, 53, 772, 52, 8260, 53, 772, 49, 8260, 54, 772, 53, 8260, 54, + 772, 49, 8260, 56, 772, 51, 8260, 56, 772, 53, 8260, 56, 772, 55, 8260, + 56, 516, 49, 8260, 258, 73, 514, 73, 73, 770, 73, 73, 73, 514, 73, 86, + 258, 86, 514, 86, 73, 770, 86, 73, 73, 1026, 86, 73, 73, 73, 514, 73, 88, + 258, 88, 514, 88, 73, 770, 88, 73, 73, 258, 76, 258, 67, 258, 68, 258, + 77, 258, 105, 514, 105, 105, 770, 105, 105, 105, 514, 105, 118, 258, 118, + 514, 118, 105, 770, 118, 105, 105, 1026, 118, 105, 105, 105, 514, 105, + 120, 258, 120, 514, 120, 105, 770, 120, 105, 105, 258, 108, 258, 99, 258, + 100, 258, 109, 772, 48, 8260, 51, 512, 8592, 824, 512, 8594, 824, 512, + 8596, 824, 512, 8656, 824, 512, 8660, 824, 512, 8658, 824, 512, 8707, + 824, 512, 8712, 824, 512, 8715, 824, 512, 8739, 824, 512, 8741, 824, 514, + 8747, 8747, 770, 8747, 8747, 8747, 514, 8750, 8750, 770, 8750, 8750, + 8750, 512, 8764, 824, 512, 8771, 824, 512, 8773, 824, 512, 8776, 824, + 512, 61, 824, 512, 8801, 824, 512, 8781, 824, 512, 60, 824, 512, 62, 824, + 512, 8804, 824, 512, 8805, 824, 512, 8818, 824, 512, 8819, 824, 512, + 8822, 824, 512, 8823, 824, 512, 8826, 824, 512, 8827, 824, 512, 8834, + 824, 512, 8835, 824, 512, 8838, 824, 512, 8839, 824, 512, 8866, 824, 512, + 8872, 824, 512, 8873, 824, 512, 8875, 824, 512, 8828, 824, 512, 8829, + 824, 512, 8849, 824, 512, 8850, 824, 512, 8882, 824, 512, 8883, 824, 512, + 8884, 824, 512, 8885, 824, 256, 12296, 256, 12297, 263, 49, 263, 50, 263, + 51, 263, 52, 263, 53, 263, 54, 263, 55, 263, 56, 263, 57, 519, 49, 48, + 519, 49, 49, 519, 49, 50, 519, 49, 51, 519, 49, 52, 519, 49, 53, 519, 49, + 54, 519, 49, 55, 519, 49, 56, 519, 49, 57, 519, 50, 48, 770, 40, 49, 41, + 770, 40, 50, 41, 770, 40, 51, 41, 770, 40, 52, 41, 770, 40, 53, 41, 770, + 40, 54, 41, 770, 40, 55, 41, 770, 40, 56, 41, 770, 40, 57, 41, 1026, 40, + 49, 48, 41, 1026, 40, 49, 49, 41, 1026, 40, 49, 50, 41, 1026, 40, 49, 51, + 41, 1026, 40, 49, 52, 41, 1026, 40, 49, 53, 41, 1026, 40, 49, 54, 41, + 1026, 40, 49, 55, 41, 1026, 40, 49, 56, 41, 1026, 40, 49, 57, 41, 1026, + 40, 50, 48, 41, 514, 49, 46, 514, 50, 46, 514, 51, 46, 514, 52, 46, 514, + 53, 46, 514, 54, 46, 514, 55, 46, 514, 56, 46, 514, 57, 46, 770, 49, 48, + 46, 770, 49, 49, 46, 770, 49, 50, 46, 770, 49, 51, 46, 770, 49, 52, 46, + 770, 49, 53, 46, 770, 49, 54, 46, 770, 49, 55, 46, 770, 49, 56, 46, 770, + 49, 57, 46, 770, 50, 48, 46, 770, 40, 97, 41, 770, 40, 98, 41, 770, 40, + 99, 41, 770, 40, 100, 41, 770, 40, 101, 41, 770, 40, 102, 41, 770, 40, + 103, 41, 770, 40, 104, 41, 770, 40, 105, 41, 770, 40, 106, 41, 770, 40, + 107, 41, 770, 40, 108, 41, 770, 40, 109, 41, 770, 40, 110, 41, 770, 40, + 111, 41, 770, 40, 112, 41, 770, 40, 113, 41, 770, 40, 114, 41, 770, 40, + 115, 41, 770, 40, 116, 41, 770, 40, 117, 41, 770, 40, 118, 41, 770, 40, + 119, 41, 770, 40, 120, 41, 770, 40, 121, 41, 770, 40, 122, 41, 263, 65, + 263, 66, 263, 67, 263, 68, 263, 69, 263, 70, 263, 71, 263, 72, 263, 73, + 263, 74, 263, 75, 263, 76, 263, 77, 263, 78, 263, 79, 263, 80, 263, 81, + 263, 82, 263, 83, 263, 84, 263, 85, 263, 86, 263, 87, 263, 88, 263, 89, + 263, 90, 263, 97, 263, 98, 263, 99, 263, 100, 263, 101, 263, 102, 263, + 103, 263, 104, 263, 105, 263, 106, 263, 107, 263, 108, 263, 109, 263, + 110, 263, 111, 263, 112, 263, 113, 263, 114, 263, 115, 263, 116, 263, + 117, 263, 118, 263, 119, 263, 120, 263, 121, 263, 122, 263, 48, 1026, + 8747, 8747, 8747, 8747, 770, 58, 58, 61, 514, 61, 61, 770, 61, 61, 61, + 512, 10973, 824, 261, 106, 259, 86, 259, 11617, 258, 27597, 258, 40863, + 258, 19968, 258, 20008, 258, 20022, 258, 20031, 258, 20057, 258, 20101, + 258, 20108, 258, 20128, 258, 20154, 258, 20799, 258, 20837, 258, 20843, + 258, 20866, 258, 20886, 258, 20907, 258, 20960, 258, 20981, 258, 20992, + 258, 21147, 258, 21241, 258, 21269, 258, 21274, 258, 21304, 258, 21313, + 258, 21340, 258, 21353, 258, 21378, 258, 21430, 258, 21448, 258, 21475, + 258, 22231, 258, 22303, 258, 22763, 258, 22786, 258, 22794, 258, 22805, + 258, 22823, 258, 22899, 258, 23376, 258, 23424, 258, 23544, 258, 23567, + 258, 23586, 258, 23608, 258, 23662, 258, 23665, 258, 24027, 258, 24037, + 258, 24049, 258, 24062, 258, 24178, 258, 24186, 258, 24191, 258, 24308, + 258, 24318, 258, 24331, 258, 24339, 258, 24400, 258, 24417, 258, 24435, + 258, 24515, 258, 25096, 258, 25142, 258, 25163, 258, 25903, 258, 25908, + 258, 25991, 258, 26007, 258, 26020, 258, 26041, 258, 26080, 258, 26085, + 258, 26352, 258, 26376, 258, 26408, 258, 27424, 258, 27490, 258, 27513, + 258, 27571, 258, 27595, 258, 27604, 258, 27611, 258, 27663, 258, 27668, + 258, 27700, 258, 28779, 258, 29226, 258, 29238, 258, 29243, 258, 29247, + 258, 29255, 258, 29273, 258, 29275, 258, 29356, 258, 29572, 258, 29577, + 258, 29916, 258, 29926, 258, 29976, 258, 29983, 258, 29992, 258, 30000, + 258, 30091, 258, 30098, 258, 30326, 258, 30333, 258, 30382, 258, 30399, + 258, 30446, 258, 30683, 258, 30690, 258, 30707, 258, 31034, 258, 31160, + 258, 31166, 258, 31348, 258, 31435, 258, 31481, 258, 31859, 258, 31992, + 258, 32566, 258, 32593, 258, 32650, 258, 32701, 258, 32769, 258, 32780, + 258, 32786, 258, 32819, 258, 32895, 258, 32905, 258, 33251, 258, 33258, + 258, 33267, 258, 33276, 258, 33292, 258, 33307, 258, 33311, 258, 33390, + 258, 33394, 258, 33400, 258, 34381, 258, 34411, 258, 34880, 258, 34892, + 258, 34915, 258, 35198, 258, 35211, 258, 35282, 258, 35328, 258, 35895, + 258, 35910, 258, 35925, 258, 35960, 258, 35997, 258, 36196, 258, 36208, + 258, 36275, 258, 36523, 258, 36554, 258, 36763, 258, 36784, 258, 36789, + 258, 37009, 258, 37193, 258, 37318, 258, 37324, 258, 37329, 258, 38263, + 258, 38272, 258, 38428, 258, 38582, 258, 38585, 258, 38632, 258, 38737, + 258, 38750, 258, 38754, 258, 38761, 258, 38859, 258, 38893, 258, 38899, + 258, 38913, 258, 39080, 258, 39131, 258, 39135, 258, 39318, 258, 39321, + 258, 39340, 258, 39592, 258, 39640, 258, 39647, 258, 39717, 258, 39727, + 258, 39730, 258, 39740, 258, 39770, 258, 40165, 258, 40565, 258, 40575, + 258, 40613, 258, 40635, 258, 40643, 258, 40653, 258, 40657, 258, 40697, + 258, 40701, 258, 40718, 258, 40723, 258, 40736, 258, 40763, 258, 40778, + 258, 40786, 258, 40845, 258, 40860, 258, 40864, 264, 32, 258, 12306, 258, + 21313, 258, 21316, 258, 21317, 512, 12363, 12441, 512, 12365, 12441, 512, + 12367, 12441, 512, 12369, 12441, 512, 12371, 12441, 512, 12373, 12441, + 512, 12375, 12441, 512, 12377, 12441, 512, 12379, 12441, 512, 12381, + 12441, 512, 12383, 12441, 512, 12385, 12441, 512, 12388, 12441, 512, + 12390, 12441, 512, 12392, 12441, 512, 12399, 12441, 512, 12399, 12442, + 512, 12402, 12441, 512, 12402, 12442, 512, 12405, 12441, 512, 12405, + 12442, 512, 12408, 12441, 512, 12408, 12442, 512, 12411, 12441, 512, + 12411, 12442, 512, 12358, 12441, 514, 32, 12441, 514, 32, 12442, 512, + 12445, 12441, 521, 12424, 12426, 512, 12459, 12441, 512, 12461, 12441, + 512, 12463, 12441, 512, 12465, 12441, 512, 12467, 12441, 512, 12469, + 12441, 512, 12471, 12441, 512, 12473, 12441, 512, 12475, 12441, 512, + 12477, 12441, 512, 12479, 12441, 512, 12481, 12441, 512, 12484, 12441, + 512, 12486, 12441, 512, 12488, 12441, 512, 12495, 12441, 512, 12495, + 12442, 512, 12498, 12441, 512, 12498, 12442, 512, 12501, 12441, 512, + 12501, 12442, 512, 12504, 12441, 512, 12504, 12442, 512, 12507, 12441, + 512, 12507, 12442, 512, 12454, 12441, 512, 12527, 12441, 512, 12528, + 12441, 512, 12529, 12441, 512, 12530, 12441, 512, 12541, 12441, 521, + 12467, 12488, 258, 4352, 258, 4353, 258, 4522, 258, 4354, 258, 4524, 258, + 4525, 258, 4355, 258, 4356, 258, 4357, 258, 4528, 258, 4529, 258, 4530, + 258, 4531, 258, 4532, 258, 4533, 258, 4378, 258, 4358, 258, 4359, 258, + 4360, 258, 4385, 258, 4361, 258, 4362, 258, 4363, 258, 4364, 258, 4365, + 258, 4366, 258, 4367, 258, 4368, 258, 4369, 258, 4370, 258, 4449, 258, + 4450, 258, 4451, 258, 4452, 258, 4453, 258, 4454, 258, 4455, 258, 4456, + 258, 4457, 258, 4458, 258, 4459, 258, 4460, 258, 4461, 258, 4462, 258, + 4463, 258, 4464, 258, 4465, 258, 4466, 258, 4467, 258, 4468, 258, 4469, + 258, 4448, 258, 4372, 258, 4373, 258, 4551, 258, 4552, 258, 4556, 258, + 4558, 258, 4563, 258, 4567, 258, 4569, 258, 4380, 258, 4573, 258, 4575, + 258, 4381, 258, 4382, 258, 4384, 258, 4386, 258, 4387, 258, 4391, 258, + 4393, 258, 4395, 258, 4396, 258, 4397, 258, 4398, 258, 4399, 258, 4402, + 258, 4406, 258, 4416, 258, 4423, 258, 4428, 258, 4593, 258, 4594, 258, + 4439, 258, 4440, 258, 4441, 258, 4484, 258, 4485, 258, 4488, 258, 4497, + 258, 4498, 258, 4500, 258, 4510, 258, 4513, 259, 19968, 259, 20108, 259, + 19977, 259, 22235, 259, 19978, 259, 20013, 259, 19979, 259, 30002, 259, + 20057, 259, 19993, 259, 19969, 259, 22825, 259, 22320, 259, 20154, 770, + 40, 4352, 41, 770, 40, 4354, 41, 770, 40, 4355, 41, 770, 40, 4357, 41, + 770, 40, 4358, 41, 770, 40, 4359, 41, 770, 40, 4361, 41, 770, 40, 4363, + 41, 770, 40, 4364, 41, 770, 40, 4366, 41, 770, 40, 4367, 41, 770, 40, + 4368, 41, 770, 40, 4369, 41, 770, 40, 4370, 41, 1026, 40, 4352, 4449, 41, + 1026, 40, 4354, 4449, 41, 1026, 40, 4355, 4449, 41, 1026, 40, 4357, 4449, + 41, 1026, 40, 4358, 4449, 41, 1026, 40, 4359, 4449, 41, 1026, 40, 4361, + 4449, 41, 1026, 40, 4363, 4449, 41, 1026, 40, 4364, 4449, 41, 1026, 40, + 4366, 4449, 41, 1026, 40, 4367, 4449, 41, 1026, 40, 4368, 4449, 41, 1026, + 40, 4369, 4449, 41, 1026, 40, 4370, 4449, 41, 1026, 40, 4364, 4462, 41, + 1794, 40, 4363, 4457, 4364, 4453, 4523, 41, 1538, 40, 4363, 4457, 4370, + 4462, 41, 770, 40, 19968, 41, 770, 40, 20108, 41, 770, 40, 19977, 41, + 770, 40, 22235, 41, 770, 40, 20116, 41, 770, 40, 20845, 41, 770, 40, + 19971, 41, 770, 40, 20843, 41, 770, 40, 20061, 41, 770, 40, 21313, 41, + 770, 40, 26376, 41, 770, 40, 28779, 41, 770, 40, 27700, 41, 770, 40, + 26408, 41, 770, 40, 37329, 41, 770, 40, 22303, 41, 770, 40, 26085, 41, + 770, 40, 26666, 41, 770, 40, 26377, 41, 770, 40, 31038, 41, 770, 40, + 21517, 41, 770, 40, 29305, 41, 770, 40, 36001, 41, 770, 40, 31069, 41, + 770, 40, 21172, 41, 770, 40, 20195, 41, 770, 40, 21628, 41, 770, 40, + 23398, 41, 770, 40, 30435, 41, 770, 40, 20225, 41, 770, 40, 36039, 41, + 770, 40, 21332, 41, 770, 40, 31085, 41, 770, 40, 20241, 41, 770, 40, + 33258, 41, 770, 40, 33267, 41, 263, 21839, 263, 24188, 263, 25991, 263, + 31631, 778, 80, 84, 69, 519, 50, 49, 519, 50, 50, 519, 50, 51, 519, 50, + 52, 519, 50, 53, 519, 50, 54, 519, 50, 55, 519, 50, 56, 519, 50, 57, 519, + 51, 48, 519, 51, 49, 519, 51, 50, 519, 51, 51, 519, 51, 52, 519, 51, 53, + 263, 4352, 263, 4354, 263, 4355, 263, 4357, 263, 4358, 263, 4359, 263, + 4361, 263, 4363, 263, 4364, 263, 4366, 263, 4367, 263, 4368, 263, 4369, + 263, 4370, 519, 4352, 4449, 519, 4354, 4449, 519, 4355, 4449, 519, 4357, + 4449, 519, 4358, 4449, 519, 4359, 4449, 519, 4361, 4449, 519, 4363, 4449, + 519, 4364, 4449, 519, 4366, 4449, 519, 4367, 4449, 519, 4368, 4449, 519, + 4369, 4449, 519, 4370, 4449, 1287, 4366, 4449, 4535, 4352, 4457, 1031, + 4364, 4462, 4363, 4468, 519, 4363, 4462, 263, 19968, 263, 20108, 263, + 19977, 263, 22235, 263, 20116, 263, 20845, 263, 19971, 263, 20843, 263, + 20061, 263, 21313, 263, 26376, 263, 28779, 263, 27700, 263, 26408, 263, + 37329, 263, 22303, 263, 26085, 263, 26666, 263, 26377, 263, 31038, 263, + 21517, 263, 29305, 263, 36001, 263, 31069, 263, 21172, 263, 31192, 263, + 30007, 263, 22899, 263, 36969, 263, 20778, 263, 21360, 263, 27880, 263, + 38917, 263, 20241, 263, 20889, 263, 27491, 263, 19978, 263, 20013, 263, + 19979, 263, 24038, 263, 21491, 263, 21307, 263, 23447, 263, 23398, 263, + 30435, 263, 20225, 263, 36039, 263, 21332, 263, 22812, 519, 51, 54, 519, + 51, 55, 519, 51, 56, 519, 51, 57, 519, 52, 48, 519, 52, 49, 519, 52, 50, + 519, 52, 51, 519, 52, 52, 519, 52, 53, 519, 52, 54, 519, 52, 55, 519, 52, + 56, 519, 52, 57, 519, 53, 48, 514, 49, 26376, 514, 50, 26376, 514, 51, + 26376, 514, 52, 26376, 514, 53, 26376, 514, 54, 26376, 514, 55, 26376, + 514, 56, 26376, 514, 57, 26376, 770, 49, 48, 26376, 770, 49, 49, 26376, + 770, 49, 50, 26376, 522, 72, 103, 778, 101, 114, 103, 522, 101, 86, 778, + 76, 84, 68, 263, 12450, 263, 12452, 263, 12454, 263, 12456, 263, 12458, + 263, 12459, 263, 12461, 263, 12463, 263, 12465, 263, 12467, 263, 12469, + 263, 12471, 263, 12473, 263, 12475, 263, 12477, 263, 12479, 263, 12481, + 263, 12484, 263, 12486, 263, 12488, 263, 12490, 263, 12491, 263, 12492, + 263, 12493, 263, 12494, 263, 12495, 263, 12498, 263, 12501, 263, 12504, + 263, 12507, 263, 12510, 263, 12511, 263, 12512, 263, 12513, 263, 12514, + 263, 12516, 263, 12518, 263, 12520, 263, 12521, 263, 12522, 263, 12523, + 263, 12524, 263, 12525, 263, 12527, 263, 12528, 263, 12529, 263, 12530, + 1034, 12450, 12497, 12540, 12488, 1034, 12450, 12523, 12501, 12449, 1034, + 12450, 12531, 12506, 12450, 778, 12450, 12540, 12523, 1034, 12452, 12491, + 12531, 12464, 778, 12452, 12531, 12481, 778, 12454, 12457, 12531, 1290, + 12456, 12473, 12463, 12540, 12489, 1034, 12456, 12540, 12459, 12540, 778, + 12458, 12531, 12473, 778, 12458, 12540, 12512, 778, 12459, 12452, 12522, + 1034, 12459, 12521, 12483, 12488, 1034, 12459, 12525, 12522, 12540, 778, + 12460, 12525, 12531, 778, 12460, 12531, 12510, 522, 12462, 12460, 778, + 12462, 12491, 12540, 1034, 12461, 12517, 12522, 12540, 1034, 12462, + 12523, 12480, 12540, 522, 12461, 12525, 1290, 12461, 12525, 12464, 12521, + 12512, 1546, 12461, 12525, 12513, 12540, 12488, 12523, 1290, 12461, + 12525, 12527, 12483, 12488, 778, 12464, 12521, 12512, 1290, 12464, 12521, + 12512, 12488, 12531, 1290, 12463, 12523, 12476, 12452, 12525, 1034, + 12463, 12525, 12540, 12493, 778, 12465, 12540, 12473, 778, 12467, 12523, + 12490, 778, 12467, 12540, 12509, 1034, 12469, 12452, 12463, 12523, 1290, + 12469, 12531, 12481, 12540, 12512, 1034, 12471, 12522, 12531, 12464, 778, + 12475, 12531, 12481, 778, 12475, 12531, 12488, 778, 12480, 12540, 12473, + 522, 12487, 12471, 522, 12489, 12523, 522, 12488, 12531, 522, 12490, + 12494, 778, 12494, 12483, 12488, 778, 12495, 12452, 12484, 1290, 12497, + 12540, 12475, 12531, 12488, 778, 12497, 12540, 12484, 1034, 12496, 12540, + 12524, 12523, 1290, 12500, 12450, 12473, 12488, 12523, 778, 12500, 12463, + 12523, 522, 12500, 12467, 522, 12499, 12523, 1290, 12501, 12449, 12521, + 12483, 12489, 1034, 12501, 12451, 12540, 12488, 1290, 12502, 12483, + 12471, 12455, 12523, 778, 12501, 12521, 12531, 1290, 12504, 12463, 12479, + 12540, 12523, 522, 12506, 12477, 778, 12506, 12491, 12498, 778, 12504, + 12523, 12484, 778, 12506, 12531, 12473, 778, 12506, 12540, 12472, 778, + 12505, 12540, 12479, 1034, 12509, 12452, 12531, 12488, 778, 12508, 12523, + 12488, 522, 12507, 12531, 778, 12509, 12531, 12489, 778, 12507, 12540, + 12523, 778, 12507, 12540, 12531, 1034, 12510, 12452, 12463, 12525, 778, + 12510, 12452, 12523, 778, 12510, 12483, 12495, 778, 12510, 12523, 12463, + 1290, 12510, 12531, 12471, 12519, 12531, 1034, 12511, 12463, 12525, + 12531, 522, 12511, 12522, 1290, 12511, 12522, 12496, 12540, 12523, 522, + 12513, 12460, 1034, 12513, 12460, 12488, 12531, 1034, 12513, 12540, + 12488, 12523, 778, 12516, 12540, 12489, 778, 12516, 12540, 12523, 778, + 12518, 12450, 12531, 1034, 12522, 12483, 12488, 12523, 522, 12522, 12521, + 778, 12523, 12500, 12540, 1034, 12523, 12540, 12502, 12523, 522, 12524, + 12512, 1290, 12524, 12531, 12488, 12466, 12531, 778, 12527, 12483, 12488, + 514, 48, 28857, 514, 49, 28857, 514, 50, 28857, 514, 51, 28857, 514, 52, + 28857, 514, 53, 28857, 514, 54, 28857, 514, 55, 28857, 514, 56, 28857, + 514, 57, 28857, 770, 49, 48, 28857, 770, 49, 49, 28857, 770, 49, 50, + 28857, 770, 49, 51, 28857, 770, 49, 52, 28857, 770, 49, 53, 28857, 770, + 49, 54, 28857, 770, 49, 55, 28857, 770, 49, 56, 28857, 770, 49, 57, + 28857, 770, 50, 48, 28857, 770, 50, 49, 28857, 770, 50, 50, 28857, 770, + 50, 51, 28857, 770, 50, 52, 28857, 778, 104, 80, 97, 522, 100, 97, 522, + 65, 85, 778, 98, 97, 114, 522, 111, 86, 522, 112, 99, 522, 100, 109, 778, + 100, 109, 178, 778, 100, 109, 179, 522, 73, 85, 522, 24179, 25104, 522, + 26157, 21644, 522, 22823, 27491, 522, 26126, 27835, 1034, 26666, 24335, + 20250, 31038, 522, 112, 65, 522, 110, 65, 522, 956, 65, 522, 109, 65, + 522, 107, 65, 522, 75, 66, 522, 77, 66, 522, 71, 66, 778, 99, 97, 108, + 1034, 107, 99, 97, 108, 522, 112, 70, 522, 110, 70, 522, 956, 70, 522, + 956, 103, 522, 109, 103, 522, 107, 103, 522, 72, 122, 778, 107, 72, 122, + 778, 77, 72, 122, 778, 71, 72, 122, 778, 84, 72, 122, 522, 956, 8467, + 522, 109, 8467, 522, 100, 8467, 522, 107, 8467, 522, 102, 109, 522, 110, + 109, 522, 956, 109, 522, 109, 109, 522, 99, 109, 522, 107, 109, 778, 109, + 109, 178, 778, 99, 109, 178, 522, 109, 178, 778, 107, 109, 178, 778, 109, + 109, 179, 778, 99, 109, 179, 522, 109, 179, 778, 107, 109, 179, 778, 109, + 8725, 115, 1034, 109, 8725, 115, 178, 522, 80, 97, 778, 107, 80, 97, 778, + 77, 80, 97, 778, 71, 80, 97, 778, 114, 97, 100, 1290, 114, 97, 100, 8725, + 115, 1546, 114, 97, 100, 8725, 115, 178, 522, 112, 115, 522, 110, 115, + 522, 956, 115, 522, 109, 115, 522, 112, 86, 522, 110, 86, 522, 956, 86, + 522, 109, 86, 522, 107, 86, 522, 77, 86, 522, 112, 87, 522, 110, 87, 522, + 956, 87, 522, 109, 87, 522, 107, 87, 522, 77, 87, 522, 107, 937, 522, 77, + 937, 1034, 97, 46, 109, 46, 522, 66, 113, 522, 99, 99, 522, 99, 100, + 1034, 67, 8725, 107, 103, 778, 67, 111, 46, 522, 100, 66, 522, 71, 121, + 522, 104, 97, 522, 72, 80, 522, 105, 110, 522, 75, 75, 522, 75, 77, 522, + 107, 116, 522, 108, 109, 522, 108, 110, 778, 108, 111, 103, 522, 108, + 120, 522, 109, 98, 778, 109, 105, 108, 778, 109, 111, 108, 522, 80, 72, + 1034, 112, 46, 109, 46, 778, 80, 80, 77, 522, 80, 82, 522, 115, 114, 522, + 83, 118, 522, 87, 98, 778, 86, 8725, 109, 778, 65, 8725, 109, 514, 49, + 26085, 514, 50, 26085, 514, 51, 26085, 514, 52, 26085, 514, 53, 26085, + 514, 54, 26085, 514, 55, 26085, 514, 56, 26085, 514, 57, 26085, 770, 49, + 48, 26085, 770, 49, 49, 26085, 770, 49, 50, 26085, 770, 49, 51, 26085, + 770, 49, 52, 26085, 770, 49, 53, 26085, 770, 49, 54, 26085, 770, 49, 55, + 26085, 770, 49, 56, 26085, 770, 49, 57, 26085, 770, 50, 48, 26085, 770, + 50, 49, 26085, 770, 50, 50, 26085, 770, 50, 51, 26085, 770, 50, 52, + 26085, 770, 50, 53, 26085, 770, 50, 54, 26085, 770, 50, 55, 26085, 770, + 50, 56, 26085, 770, 50, 57, 26085, 770, 51, 48, 26085, 770, 51, 49, + 26085, 778, 103, 97, 108, 259, 42863, 256, 35912, 256, 26356, 256, 36554, + 256, 36040, 256, 28369, 256, 20018, 256, 21477, 256, 40860, 256, 40860, + 256, 22865, 256, 37329, 256, 21895, 256, 22856, 256, 25078, 256, 30313, + 256, 32645, 256, 34367, 256, 34746, 256, 35064, 256, 37007, 256, 27138, + 256, 27931, 256, 28889, 256, 29662, 256, 33853, 256, 37226, 256, 39409, + 256, 20098, 256, 21365, 256, 27396, 256, 29211, 256, 34349, 256, 40478, + 256, 23888, 256, 28651, 256, 34253, 256, 35172, 256, 25289, 256, 33240, + 256, 34847, 256, 24266, 256, 26391, 256, 28010, 256, 29436, 256, 37070, + 256, 20358, 256, 20919, 256, 21214, 256, 25796, 256, 27347, 256, 29200, + 256, 30439, 256, 32769, 256, 34310, 256, 34396, 256, 36335, 256, 38706, + 256, 39791, 256, 40442, 256, 30860, 256, 31103, 256, 32160, 256, 33737, + 256, 37636, 256, 40575, 256, 35542, 256, 22751, 256, 24324, 256, 31840, + 256, 32894, 256, 29282, 256, 30922, 256, 36034, 256, 38647, 256, 22744, + 256, 23650, 256, 27155, 256, 28122, 256, 28431, 256, 32047, 256, 32311, + 256, 38475, 256, 21202, 256, 32907, 256, 20956, 256, 20940, 256, 31260, + 256, 32190, 256, 33777, 256, 38517, 256, 35712, 256, 25295, 256, 27138, + 256, 35582, 256, 20025, 256, 23527, 256, 24594, 256, 29575, 256, 30064, + 256, 21271, 256, 30971, 256, 20415, 256, 24489, 256, 19981, 256, 27852, + 256, 25976, 256, 32034, 256, 21443, 256, 22622, 256, 30465, 256, 33865, + 256, 35498, 256, 27578, 256, 36784, 256, 27784, 256, 25342, 256, 33509, + 256, 25504, 256, 30053, 256, 20142, 256, 20841, 256, 20937, 256, 26753, + 256, 31975, 256, 33391, 256, 35538, 256, 37327, 256, 21237, 256, 21570, + 256, 22899, 256, 24300, 256, 26053, 256, 28670, 256, 31018, 256, 38317, + 256, 39530, 256, 40599, 256, 40654, 256, 21147, 256, 26310, 256, 27511, + 256, 36706, 256, 24180, 256, 24976, 256, 25088, 256, 25754, 256, 28451, + 256, 29001, 256, 29833, 256, 31178, 256, 32244, 256, 32879, 256, 36646, + 256, 34030, 256, 36899, 256, 37706, 256, 21015, 256, 21155, 256, 21693, + 256, 28872, 256, 35010, 256, 35498, 256, 24265, 256, 24565, 256, 25467, + 256, 27566, 256, 31806, 256, 29557, 256, 20196, 256, 22265, 256, 23527, + 256, 23994, 256, 24604, 256, 29618, 256, 29801, 256, 32666, 256, 32838, + 256, 37428, 256, 38646, 256, 38728, 256, 38936, 256, 20363, 256, 31150, + 256, 37300, 256, 38584, 256, 24801, 256, 20102, 256, 20698, 256, 23534, + 256, 23615, 256, 26009, 256, 27138, 256, 29134, 256, 30274, 256, 34044, + 256, 36988, 256, 40845, 256, 26248, 256, 38446, 256, 21129, 256, 26491, + 256, 26611, 256, 27969, 256, 28316, 256, 29705, 256, 30041, 256, 30827, + 256, 32016, 256, 39006, 256, 20845, 256, 25134, 256, 38520, 256, 20523, + 256, 23833, 256, 28138, 256, 36650, 256, 24459, 256, 24900, 256, 26647, + 256, 29575, 256, 38534, 256, 21033, 256, 21519, 256, 23653, 256, 26131, + 256, 26446, 256, 26792, 256, 27877, 256, 29702, 256, 30178, 256, 32633, + 256, 35023, 256, 35041, 256, 37324, 256, 38626, 256, 21311, 256, 28346, + 256, 21533, 256, 29136, 256, 29848, 256, 34298, 256, 38563, 256, 40023, + 256, 40607, 256, 26519, 256, 28107, 256, 33256, 256, 31435, 256, 31520, + 256, 31890, 256, 29376, 256, 28825, 256, 35672, 256, 20160, 256, 33590, + 256, 21050, 256, 20999, 256, 24230, 256, 25299, 256, 31958, 256, 23429, + 256, 27934, 256, 26292, 256, 36667, 256, 34892, 256, 38477, 256, 35211, + 256, 24275, 256, 20800, 256, 21952, 256, 22618, 256, 26228, 256, 20958, + 256, 29482, 256, 30410, 256, 31036, 256, 31070, 256, 31077, 256, 31119, + 256, 38742, 256, 31934, 256, 32701, 256, 34322, 256, 35576, 256, 36920, + 256, 37117, 256, 39151, 256, 39164, 256, 39208, 256, 40372, 256, 20398, + 256, 20711, 256, 20813, 256, 21193, 256, 21220, 256, 21329, 256, 21917, + 256, 22022, 256, 22120, 256, 22592, 256, 22696, 256, 23652, 256, 23662, + 256, 24724, 256, 24936, 256, 24974, 256, 25074, 256, 25935, 256, 26082, + 256, 26257, 256, 26757, 256, 28023, 256, 28186, 256, 28450, 256, 29038, + 256, 29227, 256, 29730, 256, 30865, 256, 31038, 256, 31049, 256, 31048, + 256, 31056, 256, 31062, 256, 31069, 256, 31117, 256, 31118, 256, 31296, + 256, 31361, 256, 31680, 256, 32244, 256, 32265, 256, 32321, 256, 32626, + 256, 32773, 256, 33261, 256, 33401, 256, 33401, 256, 33879, 256, 35088, + 256, 35222, 256, 35585, 256, 35641, 256, 36051, 256, 36104, 256, 36790, + 256, 36920, 256, 38627, 256, 38911, 256, 38971, 256, 24693, 256, 148206, + 256, 33304, 256, 20006, 256, 20917, 256, 20840, 256, 20352, 256, 20805, + 256, 20864, 256, 21191, 256, 21242, 256, 21917, 256, 21845, 256, 21913, + 256, 21986, 256, 22618, 256, 22707, 256, 22852, 256, 22868, 256, 23138, + 256, 23336, 256, 24274, 256, 24281, 256, 24425, 256, 24493, 256, 24792, + 256, 24910, 256, 24840, 256, 24974, 256, 24928, 256, 25074, 256, 25140, + 256, 25540, 256, 25628, 256, 25682, 256, 25942, 256, 26228, 256, 26391, + 256, 26395, 256, 26454, 256, 27513, 256, 27578, 256, 27969, 256, 28379, + 256, 28363, 256, 28450, 256, 28702, 256, 29038, 256, 30631, 256, 29237, + 256, 29359, 256, 29482, 256, 29809, 256, 29958, 256, 30011, 256, 30237, + 256, 30239, 256, 30410, 256, 30427, 256, 30452, 256, 30538, 256, 30528, + 256, 30924, 256, 31409, 256, 31680, 256, 31867, 256, 32091, 256, 32244, + 256, 32574, 256, 32773, 256, 33618, 256, 33775, 256, 34681, 256, 35137, + 256, 35206, 256, 35222, 256, 35519, 256, 35576, 256, 35531, 256, 35585, + 256, 35582, 256, 35565, 256, 35641, 256, 35722, 256, 36104, 256, 36664, + 256, 36978, 256, 37273, 256, 37494, 256, 38524, 256, 38627, 256, 38742, + 256, 38875, 256, 38911, 256, 38923, 256, 38971, 256, 39698, 256, 40860, + 256, 141386, 256, 141380, 256, 144341, 256, 15261, 256, 16408, 256, + 16441, 256, 152137, 256, 154832, 256, 163539, 256, 40771, 256, 40846, + 514, 102, 102, 514, 102, 105, 514, 102, 108, 770, 102, 102, 105, 770, + 102, 102, 108, 514, 383, 116, 514, 115, 116, 514, 1396, 1398, 514, 1396, + 1381, 514, 1396, 1387, 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460, + 512, 1522, 1463, 262, 1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499, + 262, 1500, 262, 1501, 262, 1512, 262, 1514, 262, 43, 512, 1513, 1473, + 512, 1513, 1474, 512, 64329, 1473, 512, 64329, 1474, 512, 1488, 1463, + 512, 1488, 1464, 512, 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512, + 1491, 1468, 512, 1492, 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496, + 1468, 512, 1497, 1468, 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468, + 512, 1502, 1468, 512, 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512, + 1508, 1468, 512, 1510, 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513, + 1468, 512, 1514, 1468, 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471, + 512, 1508, 1471, 514, 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268, + 1659, 269, 1659, 270, 1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662, + 267, 1664, 268, 1664, 269, 1664, 270, 1664, 267, 1658, 268, 1658, 269, + 1658, 270, 1658, 267, 1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657, + 268, 1657, 269, 1657, 270, 1657, 267, 1700, 268, 1700, 269, 1700, 270, + 1700, 267, 1702, 268, 1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668, + 269, 1668, 270, 1668, 267, 1667, 268, 1667, 269, 1667, 270, 1667, 267, + 1670, 268, 1670, 269, 1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671, + 270, 1671, 267, 1677, 268, 1677, 267, 1676, 268, 1676, 267, 1678, 268, + 1678, 267, 1672, 268, 1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681, + 267, 1705, 268, 1705, 269, 1705, 270, 1705, 267, 1711, 268, 1711, 269, + 1711, 270, 1711, 267, 1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713, + 268, 1713, 269, 1713, 270, 1713, 267, 1722, 268, 1722, 267, 1723, 268, + 1723, 269, 1723, 270, 1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729, + 269, 1729, 270, 1729, 267, 1726, 268, 1726, 269, 1726, 270, 1726, 267, + 1746, 268, 1746, 267, 1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709, + 270, 1709, 267, 1735, 268, 1735, 267, 1734, 268, 1734, 267, 1736, 268, + 1736, 267, 1655, 267, 1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737, + 268, 1737, 267, 1744, 268, 1744, 269, 1744, 270, 1744, 269, 1609, 270, + 1609, 523, 1574, 1575, 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749, + 523, 1574, 1608, 524, 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523, + 1574, 1734, 524, 1574, 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574, + 1744, 524, 1574, 1744, 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609, + 525, 1574, 1609, 267, 1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574, + 1580, 523, 1574, 1581, 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610, + 523, 1576, 1580, 523, 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523, + 1576, 1609, 523, 1576, 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578, + 1582, 523, 1578, 1605, 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580, + 523, 1579, 1605, 523, 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523, + 1580, 1605, 523, 1581, 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582, + 1581, 523, 1582, 1605, 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582, + 523, 1587, 1605, 523, 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523, + 1590, 1581, 523, 1590, 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591, + 1605, 523, 1592, 1605, 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580, + 523, 1594, 1605, 523, 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523, + 1601, 1605, 523, 1601, 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602, + 1605, 523, 1602, 1609, 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580, + 523, 1603, 1581, 523, 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523, + 1603, 1609, 523, 1603, 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604, + 1582, 523, 1604, 1605, 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580, + 523, 1605, 1581, 523, 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523, + 1605, 1610, 523, 1606, 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606, + 1605, 523, 1606, 1609, 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605, + 523, 1607, 1609, 523, 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523, + 1610, 1582, 523, 1610, 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584, + 1648, 523, 1585, 1648, 523, 1609, 1648, 779, 32, 1612, 1617, 779, 32, + 1613, 1617, 779, 32, 1614, 1617, 779, 32, 1615, 1617, 779, 32, 1616, + 1617, 779, 32, 1617, 1648, 524, 1574, 1585, 524, 1574, 1586, 524, 1574, + 1605, 524, 1574, 1606, 524, 1574, 1609, 524, 1574, 1610, 524, 1576, 1585, + 524, 1576, 1586, 524, 1576, 1605, 524, 1576, 1606, 524, 1576, 1609, 524, + 1576, 1610, 524, 1578, 1585, 524, 1578, 1586, 524, 1578, 1605, 524, 1578, + 1606, 524, 1578, 1609, 524, 1578, 1610, 524, 1579, 1585, 524, 1579, 1586, + 524, 1579, 1605, 524, 1579, 1606, 524, 1579, 1609, 524, 1579, 1610, 524, + 1601, 1609, 524, 1601, 1610, 524, 1602, 1609, 524, 1602, 1610, 524, 1603, + 1575, 524, 1603, 1604, 524, 1603, 1605, 524, 1603, 1609, 524, 1603, 1610, + 524, 1604, 1605, 524, 1604, 1609, 524, 1604, 1610, 524, 1605, 1575, 524, + 1605, 1605, 524, 1606, 1585, 524, 1606, 1586, 524, 1606, 1605, 524, 1606, + 1606, 524, 1606, 1609, 524, 1606, 1610, 524, 1609, 1648, 524, 1610, 1585, + 524, 1610, 1586, 524, 1610, 1605, 524, 1610, 1606, 524, 1610, 1609, 524, + 1610, 1610, 525, 1574, 1580, 525, 1574, 1581, 525, 1574, 1582, 525, 1574, + 1605, 525, 1574, 1607, 525, 1576, 1580, 525, 1576, 1581, 525, 1576, 1582, + 525, 1576, 1605, 525, 1576, 1607, 525, 1578, 1580, 525, 1578, 1581, 525, + 1578, 1582, 525, 1578, 1605, 525, 1578, 1607, 525, 1579, 1605, 525, 1580, + 1581, 525, 1580, 1605, 525, 1581, 1580, 525, 1581, 1605, 525, 1582, 1580, + 525, 1582, 1605, 525, 1587, 1580, 525, 1587, 1581, 525, 1587, 1582, 525, + 1587, 1605, 525, 1589, 1581, 525, 1589, 1582, 525, 1589, 1605, 525, 1590, + 1580, 525, 1590, 1581, 525, 1590, 1582, 525, 1590, 1605, 525, 1591, 1581, + 525, 1592, 1605, 525, 1593, 1580, 525, 1593, 1605, 525, 1594, 1580, 525, + 1594, 1605, 525, 1601, 1580, 525, 1601, 1581, 525, 1601, 1582, 525, 1601, + 1605, 525, 1602, 1581, 525, 1602, 1605, 525, 1603, 1580, 525, 1603, 1581, + 525, 1603, 1582, 525, 1603, 1604, 525, 1603, 1605, 525, 1604, 1580, 525, + 1604, 1581, 525, 1604, 1582, 525, 1604, 1605, 525, 1604, 1607, 525, 1605, + 1580, 525, 1605, 1581, 525, 1605, 1582, 525, 1605, 1605, 525, 1606, 1580, + 525, 1606, 1581, 525, 1606, 1582, 525, 1606, 1605, 525, 1606, 1607, 525, + 1607, 1580, 525, 1607, 1605, 525, 1607, 1648, 525, 1610, 1580, 525, 1610, + 1581, 525, 1610, 1582, 525, 1610, 1605, 525, 1610, 1607, 526, 1574, 1605, + 526, 1574, 1607, 526, 1576, 1605, 526, 1576, 1607, 526, 1578, 1605, 526, + 1578, 1607, 526, 1579, 1605, 526, 1579, 1607, 526, 1587, 1605, 526, 1587, + 1607, 526, 1588, 1605, 526, 1588, 1607, 526, 1603, 1604, 526, 1603, 1605, + 526, 1604, 1605, 526, 1606, 1605, 526, 1606, 1607, 526, 1610, 1605, 526, + 1610, 1607, 782, 1600, 1614, 1617, 782, 1600, 1615, 1617, 782, 1600, + 1616, 1617, 523, 1591, 1609, 523, 1591, 1610, 523, 1593, 1609, 523, 1593, + 1610, 523, 1594, 1609, 523, 1594, 1610, 523, 1587, 1609, 523, 1587, 1610, + 523, 1588, 1609, 523, 1588, 1610, 523, 1581, 1609, 523, 1581, 1610, 523, + 1580, 1609, 523, 1580, 1610, 523, 1582, 1609, 523, 1582, 1610, 523, 1589, + 1609, 523, 1589, 1610, 523, 1590, 1609, 523, 1590, 1610, 523, 1588, 1580, + 523, 1588, 1581, 523, 1588, 1582, 523, 1588, 1605, 523, 1588, 1585, 523, + 1587, 1585, 523, 1589, 1585, 523, 1590, 1585, 524, 1591, 1609, 524, 1591, + 1610, 524, 1593, 1609, 524, 1593, 1610, 524, 1594, 1609, 524, 1594, 1610, + 524, 1587, 1609, 524, 1587, 1610, 524, 1588, 1609, 524, 1588, 1610, 524, + 1581, 1609, 524, 1581, 1610, 524, 1580, 1609, 524, 1580, 1610, 524, 1582, + 1609, 524, 1582, 1610, 524, 1589, 1609, 524, 1589, 1610, 524, 1590, 1609, + 524, 1590, 1610, 524, 1588, 1580, 524, 1588, 1581, 524, 1588, 1582, 524, + 1588, 1605, 524, 1588, 1585, 524, 1587, 1585, 524, 1589, 1585, 524, 1590, + 1585, 525, 1588, 1580, 525, 1588, 1581, 525, 1588, 1582, 525, 1588, 1605, + 525, 1587, 1607, 525, 1588, 1607, 525, 1591, 1605, 526, 1587, 1580, 526, + 1587, 1581, 526, 1587, 1582, 526, 1588, 1580, 526, 1588, 1581, 526, 1588, + 1582, 526, 1591, 1605, 526, 1592, 1605, 524, 1575, 1611, 523, 1575, 1611, + 781, 1578, 1580, 1605, 780, 1578, 1581, 1580, 781, 1578, 1581, 1580, 781, + 1578, 1581, 1605, 781, 1578, 1582, 1605, 781, 1578, 1605, 1580, 781, + 1578, 1605, 1581, 781, 1578, 1605, 1582, 780, 1580, 1605, 1581, 781, + 1580, 1605, 1581, 780, 1581, 1605, 1610, 780, 1581, 1605, 1609, 781, + 1587, 1581, 1580, 781, 1587, 1580, 1581, 780, 1587, 1580, 1609, 780, + 1587, 1605, 1581, 781, 1587, 1605, 1581, 781, 1587, 1605, 1580, 780, + 1587, 1605, 1605, 781, 1587, 1605, 1605, 780, 1589, 1581, 1581, 781, + 1589, 1581, 1581, 780, 1589, 1605, 1605, 780, 1588, 1581, 1605, 781, + 1588, 1581, 1605, 780, 1588, 1580, 1610, 780, 1588, 1605, 1582, 781, + 1588, 1605, 1582, 780, 1588, 1605, 1605, 781, 1588, 1605, 1605, 780, + 1590, 1581, 1609, 780, 1590, 1582, 1605, 781, 1590, 1582, 1605, 780, + 1591, 1605, 1581, 781, 1591, 1605, 1581, 781, 1591, 1605, 1605, 780, + 1591, 1605, 1610, 780, 1593, 1580, 1605, 780, 1593, 1605, 1605, 781, + 1593, 1605, 1605, 780, 1593, 1605, 1609, 780, 1594, 1605, 1605, 780, + 1594, 1605, 1610, 780, 1594, 1605, 1609, 780, 1601, 1582, 1605, 781, + 1601, 1582, 1605, 780, 1602, 1605, 1581, 780, 1602, 1605, 1605, 780, + 1604, 1581, 1605, 780, 1604, 1581, 1610, 780, 1604, 1581, 1609, 781, + 1604, 1580, 1580, 780, 1604, 1580, 1580, 780, 1604, 1582, 1605, 781, + 1604, 1582, 1605, 780, 1604, 1605, 1581, 781, 1604, 1605, 1581, 781, + 1605, 1581, 1580, 781, 1605, 1581, 1605, 780, 1605, 1581, 1610, 781, + 1605, 1580, 1581, 781, 1605, 1580, 1605, 781, 1605, 1582, 1580, 781, + 1605, 1582, 1605, 781, 1605, 1580, 1582, 781, 1607, 1605, 1580, 781, + 1607, 1605, 1605, 781, 1606, 1581, 1605, 780, 1606, 1581, 1609, 780, + 1606, 1580, 1605, 781, 1606, 1580, 1605, 780, 1606, 1580, 1609, 780, + 1606, 1605, 1610, 780, 1606, 1605, 1609, 780, 1610, 1605, 1605, 781, + 1610, 1605, 1605, 780, 1576, 1582, 1610, 780, 1578, 1580, 1610, 780, + 1578, 1580, 1609, 780, 1578, 1582, 1610, 780, 1578, 1582, 1609, 780, + 1578, 1605, 1610, 780, 1578, 1605, 1609, 780, 1580, 1605, 1610, 780, + 1580, 1581, 1609, 780, 1580, 1605, 1609, 780, 1587, 1582, 1609, 780, + 1589, 1581, 1610, 780, 1588, 1581, 1610, 780, 1590, 1581, 1610, 780, + 1604, 1580, 1610, 780, 1604, 1605, 1610, 780, 1610, 1581, 1610, 780, + 1610, 1580, 1610, 780, 1610, 1605, 1610, 780, 1605, 1605, 1610, 780, + 1602, 1605, 1610, 780, 1606, 1581, 1610, 781, 1602, 1605, 1581, 781, + 1604, 1581, 1605, 780, 1593, 1605, 1610, 780, 1603, 1605, 1610, 781, + 1606, 1580, 1581, 780, 1605, 1582, 1610, 781, 1604, 1580, 1605, 780, + 1603, 1605, 1605, 780, 1604, 1580, 1605, 780, 1606, 1580, 1581, 780, + 1580, 1581, 1610, 780, 1581, 1580, 1610, 780, 1605, 1580, 1610, 780, + 1601, 1605, 1610, 780, 1576, 1581, 1610, 781, 1603, 1605, 1605, 781, + 1593, 1580, 1605, 781, 1589, 1605, 1605, 780, 1587, 1582, 1610, 780, + 1606, 1580, 1610, 779, 1589, 1604, 1746, 779, 1602, 1604, 1746, 1035, + 1575, 1604, 1604, 1607, 1035, 1575, 1603, 1576, 1585, 1035, 1605, 1581, + 1605, 1583, 1035, 1589, 1604, 1593, 1605, 1035, 1585, 1587, 1608, 1604, + 1035, 1593, 1604, 1610, 1607, 1035, 1608, 1587, 1604, 1605, 779, 1589, + 1604, 1609, 4619, 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, + 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, 2059, 1580, 1604, 32, 1580, + 1604, 1575, 1604, 1607, 1035, 1585, 1740, 1575, 1604, 265, 44, 265, + 12289, 265, 12290, 265, 58, 265, 59, 265, 33, 265, 63, 265, 12310, 265, + 12311, 265, 8230, 265, 8229, 265, 8212, 265, 8211, 265, 95, 265, 95, 265, + 40, 265, 41, 265, 123, 265, 125, 265, 12308, 265, 12309, 265, 12304, 265, + 12305, 265, 12298, 265, 12299, 265, 12296, 265, 12297, 265, 12300, 265, + 12301, 265, 12302, 265, 12303, 265, 91, 265, 93, 258, 8254, 258, 8254, + 258, 8254, 258, 8254, 258, 95, 258, 95, 258, 95, 271, 44, 271, 12289, + 271, 46, 271, 59, 271, 58, 271, 63, 271, 33, 271, 8212, 271, 40, 271, 41, + 271, 123, 271, 125, 271, 12308, 271, 12309, 271, 35, 271, 38, 271, 42, + 271, 43, 271, 45, 271, 60, 271, 62, 271, 61, 271, 92, 271, 36, 271, 37, + 271, 64, 523, 32, 1611, 526, 1600, 1611, 523, 32, 1612, 523, 32, 1613, + 523, 32, 1614, 526, 1600, 1614, 523, 32, 1615, 526, 1600, 1615, 523, 32, + 1616, 526, 1600, 1616, 523, 32, 1617, 526, 1600, 1617, 523, 32, 1618, + 526, 1600, 1618, 267, 1569, 267, 1570, 268, 1570, 267, 1571, 268, 1571, + 267, 1572, 268, 1572, 267, 1573, 268, 1573, 267, 1574, 268, 1574, 269, + 1574, 270, 1574, 267, 1575, 268, 1575, 267, 1576, 268, 1576, 269, 1576, + 270, 1576, 267, 1577, 268, 1577, 267, 1578, 268, 1578, 269, 1578, 270, + 1578, 267, 1579, 268, 1579, 269, 1579, 270, 1579, 267, 1580, 268, 1580, + 269, 1580, 270, 1580, 267, 1581, 268, 1581, 269, 1581, 270, 1581, 267, + 1582, 268, 1582, 269, 1582, 270, 1582, 267, 1583, 268, 1583, 267, 1584, + 268, 1584, 267, 1585, 268, 1585, 267, 1586, 268, 1586, 267, 1587, 268, + 1587, 269, 1587, 270, 1587, 267, 1588, 268, 1588, 269, 1588, 270, 1588, + 267, 1589, 268, 1589, 269, 1589, 270, 1589, 267, 1590, 268, 1590, 269, + 1590, 270, 1590, 267, 1591, 268, 1591, 269, 1591, 270, 1591, 267, 1592, + 268, 1592, 269, 1592, 270, 1592, 267, 1593, 268, 1593, 269, 1593, 270, + 1593, 267, 1594, 268, 1594, 269, 1594, 270, 1594, 267, 1601, 268, 1601, + 269, 1601, 270, 1601, 267, 1602, 268, 1602, 269, 1602, 270, 1602, 267, + 1603, 268, 1603, 269, 1603, 270, 1603, 267, 1604, 268, 1604, 269, 1604, + 270, 1604, 267, 1605, 268, 1605, 269, 1605, 270, 1605, 267, 1606, 268, + 1606, 269, 1606, 270, 1606, 267, 1607, 268, 1607, 269, 1607, 270, 1607, + 267, 1608, 268, 1608, 267, 1609, 268, 1609, 267, 1610, 268, 1610, 269, + 1610, 270, 1610, 523, 1604, 1570, 524, 1604, 1570, 523, 1604, 1571, 524, + 1604, 1571, 523, 1604, 1573, 524, 1604, 1573, 523, 1604, 1575, 524, 1604, + 1575, 264, 33, 264, 34, 264, 35, 264, 36, 264, 37, 264, 38, 264, 39, 264, + 40, 264, 41, 264, 42, 264, 43, 264, 44, 264, 45, 264, 46, 264, 47, 264, + 48, 264, 49, 264, 50, 264, 51, 264, 52, 264, 53, 264, 54, 264, 55, 264, + 56, 264, 57, 264, 58, 264, 59, 264, 60, 264, 61, 264, 62, 264, 63, 264, + 64, 264, 65, 264, 66, 264, 67, 264, 68, 264, 69, 264, 70, 264, 71, 264, + 72, 264, 73, 264, 74, 264, 75, 264, 76, 264, 77, 264, 78, 264, 79, 264, + 80, 264, 81, 264, 82, 264, 83, 264, 84, 264, 85, 264, 86, 264, 87, 264, + 88, 264, 89, 264, 90, 264, 91, 264, 92, 264, 93, 264, 94, 264, 95, 264, + 96, 264, 97, 264, 98, 264, 99, 264, 100, 264, 101, 264, 102, 264, 103, + 264, 104, 264, 105, 264, 106, 264, 107, 264, 108, 264, 109, 264, 110, + 264, 111, 264, 112, 264, 113, 264, 114, 264, 115, 264, 116, 264, 117, + 264, 118, 264, 119, 264, 120, 264, 121, 264, 122, 264, 123, 264, 124, + 264, 125, 264, 126, 264, 10629, 264, 10630, 272, 12290, 272, 12300, 272, + 12301, 272, 12289, 272, 12539, 272, 12530, 272, 12449, 272, 12451, 272, + 12453, 272, 12455, 272, 12457, 272, 12515, 272, 12517, 272, 12519, 272, + 12483, 272, 12540, 272, 12450, 272, 12452, 272, 12454, 272, 12456, 272, + 12458, 272, 12459, 272, 12461, 272, 12463, 272, 12465, 272, 12467, 272, + 12469, 272, 12471, 272, 12473, 272, 12475, 272, 12477, 272, 12479, 272, + 12481, 272, 12484, 272, 12486, 272, 12488, 272, 12490, 272, 12491, 272, + 12492, 272, 12493, 272, 12494, 272, 12495, 272, 12498, 272, 12501, 272, + 12504, 272, 12507, 272, 12510, 272, 12511, 272, 12512, 272, 12513, 272, + 12514, 272, 12516, 272, 12518, 272, 12520, 272, 12521, 272, 12522, 272, + 12523, 272, 12524, 272, 12525, 272, 12527, 272, 12531, 272, 12441, 272, + 12442, 272, 12644, 272, 12593, 272, 12594, 272, 12595, 272, 12596, 272, + 12597, 272, 12598, 272, 12599, 272, 12600, 272, 12601, 272, 12602, 272, + 12603, 272, 12604, 272, 12605, 272, 12606, 272, 12607, 272, 12608, 272, + 12609, 272, 12610, 272, 12611, 272, 12612, 272, 12613, 272, 12614, 272, + 12615, 272, 12616, 272, 12617, 272, 12618, 272, 12619, 272, 12620, 272, + 12621, 272, 12622, 272, 12623, 272, 12624, 272, 12625, 272, 12626, 272, + 12627, 272, 12628, 272, 12629, 272, 12630, 272, 12631, 272, 12632, 272, + 12633, 272, 12634, 272, 12635, 272, 12636, 272, 12637, 272, 12638, 272, + 12639, 272, 12640, 272, 12641, 272, 12642, 272, 12643, 264, 162, 264, + 163, 264, 172, 264, 175, 264, 166, 264, 165, 264, 8361, 272, 9474, 272, + 8592, 272, 8593, 272, 8594, 272, 8595, 272, 9632, 272, 9675, 512, 69785, + 69818, 512, 69787, 69818, 512, 69797, 69818, 512, 119127, 119141, 512, + 119128, 119141, 512, 119135, 119150, 512, 119135, 119151, 512, 119135, + 119152, 512, 119135, 119153, 512, 119135, 119154, 512, 119225, 119141, + 512, 119226, 119141, 512, 119227, 119150, 512, 119228, 119150, 512, + 119227, 119151, 512, 119228, 119151, 262, 65, 262, 66, 262, 67, 262, 68, + 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, + 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, + 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, + 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, + 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, + 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, + 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, + 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, + 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, + 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, + 262, 100, 262, 101, 262, 102, 262, 103, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, @@ -3325,23 +3396,27 @@ static unsigned int decomp_data[] = { 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, - 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, - 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, - 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, - 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, - 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, - 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, - 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, - 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, - 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, - 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, - 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, - 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, - 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, - 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, - 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, - 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, - 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, + 262, 65, 262, 67, 262, 68, 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, + 262, 80, 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, + 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 102, 262, + 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, + 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, + 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, + 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, + 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, + 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, + 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, + 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, + 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, + 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, + 262, 71, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, + 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, + 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, + 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, + 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, + 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, + 262, 69, 262, 70, 262, 71, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, + 262, 79, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, @@ -3359,24 +3434,35 @@ static unsigned int decomp_data[] = { 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, - 120, 262, 121, 262, 122, 262, 305, 262, 567, 262, 913, 262, 914, 262, - 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, - 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, - 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, - 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, - 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, - 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, - 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, - 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, - 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, - 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, - 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, - 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, - 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, - 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, - 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, - 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, - 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, + 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, + 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, + 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, + 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, + 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, + 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, + 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, + 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, + 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, + 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, + 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, + 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, + 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, + 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, + 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, + 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, + 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, + 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, + 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, + 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, + 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, + 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, + 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, + 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, + 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, + 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, + 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, + 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, + 305, 262, 567, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, @@ -3401,124 +3487,146 @@ static unsigned int decomp_data[] = { 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, - 982, 262, 988, 262, 989, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, - 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, - 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, - 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, - 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, - 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, - 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 514, 48, 46, 514, 48, 44, - 514, 49, 44, 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53, 44, 514, 54, - 44, 514, 55, 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41, 770, 40, 66, - 41, 770, 40, 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770, 40, 70, 41, - 770, 40, 71, 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40, 74, 41, 770, - 40, 75, 41, 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78, 41, 770, 40, - 79, 41, 770, 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41, 770, 40, 83, - 41, 770, 40, 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770, 40, 87, 41, - 770, 40, 88, 41, 770, 40, 89, 41, 770, 40, 90, 41, 770, 12308, 83, 12309, - 263, 67, 263, 82, 519, 67, 68, 519, 87, 90, 266, 66, 266, 78, 266, 80, - 266, 83, 266, 87, 522, 72, 86, 522, 77, 86, 522, 83, 68, 522, 83, 83, - 778, 80, 80, 86, 522, 68, 74, 522, 12411, 12363, 266, 25163, 266, 23383, - 266, 21452, 266, 12487, 266, 20108, 266, 22810, 266, 35299, 266, 22825, - 266, 20132, 266, 26144, 266, 28961, 266, 26009, 266, 21069, 266, 24460, - 266, 20877, 266, 26032, 266, 21021, 266, 32066, 266, 29983, 266, 36009, - 266, 22768, 266, 21561, 266, 28436, 266, 25237, 266, 25429, 266, 19968, - 266, 19977, 266, 36938, 266, 24038, 266, 20013, 266, 21491, 266, 25351, - 266, 36208, 266, 25171, 770, 12308, 26412, 12309, 770, 12308, 19977, - 12309, 770, 12308, 20108, 12309, 770, 12308, 23433, 12309, 770, 12308, - 28857, 12309, 770, 12308, 25171, 12309, 770, 12308, 30423, 12309, 770, - 12308, 21213, 12309, 770, 12308, 25943, 12309, 256, 20029, 256, 20024, - 256, 20033, 256, 131362, 256, 20320, 256, 20398, 256, 20411, 256, 20482, - 256, 20602, 256, 20633, 256, 20711, 256, 20687, 256, 13470, 256, 132666, - 256, 20813, 256, 20820, 256, 20836, 256, 20855, 256, 132380, 256, 13497, - 256, 20839, 256, 20877, 256, 132427, 256, 20887, 256, 20900, 256, 20172, - 256, 20908, 256, 20917, 256, 168415, 256, 20981, 256, 20995, 256, 13535, - 256, 21051, 256, 21062, 256, 21106, 256, 21111, 256, 13589, 256, 21191, - 256, 21193, 256, 21220, 256, 21242, 256, 21253, 256, 21254, 256, 21271, - 256, 21321, 256, 21329, 256, 21338, 256, 21363, 256, 21373, 256, 21375, - 256, 21375, 256, 21375, 256, 133676, 256, 28784, 256, 21450, 256, 21471, - 256, 133987, 256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, - 256, 21576, 256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, - 256, 21859, 256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, - 256, 21954, 256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, - 256, 20999, 256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, - 256, 22578, 256, 22577, 256, 22700, 256, 136420, 256, 22770, 256, 22775, - 256, 22790, 256, 22810, 256, 22818, 256, 22882, 256, 136872, 256, 136938, - 256, 23020, 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, - 256, 14076, 256, 23304, 256, 23358, 256, 23358, 256, 137672, 256, 23491, - 256, 23512, 256, 23527, 256, 23539, 256, 138008, 256, 23551, 256, 23558, - 256, 24403, 256, 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744, - 256, 23693, 256, 138724, 256, 23875, 256, 138726, 256, 23918, 256, 23915, - 256, 23932, 256, 24033, 256, 24034, 256, 14383, 256, 24061, 256, 24104, - 256, 24125, 256, 24169, 256, 14434, 256, 139651, 256, 14460, 256, 24240, - 256, 24243, 256, 24246, 256, 24266, 256, 172946, 256, 24318, 256, 140081, - 256, 140081, 256, 33281, 256, 24354, 256, 24354, 256, 14535, 256, 144056, - 256, 156122, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, - 256, 24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, - 256, 141012, 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, - 256, 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, - 256, 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, - 256, 25300, 256, 25424, 256, 142092, 256, 25405, 256, 25340, 256, 25448, - 256, 25475, 256, 25572, 256, 142321, 256, 25634, 256, 25541, 256, 25513, - 256, 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, - 256, 25935, 256, 25964, 256, 143370, 256, 26083, 256, 26360, 256, 26185, - 256, 15129, 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885, - 256, 26368, 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395, - 256, 26401, 256, 26462, 256, 26451, 256, 144323, 256, 15177, 256, 26618, - 256, 26501, 256, 26706, 256, 26757, 256, 144493, 256, 26766, 256, 26655, - 256, 26900, 256, 15261, 256, 26946, 256, 27043, 256, 27114, 256, 27304, - 256, 145059, 256, 27355, 256, 15384, 256, 27425, 256, 145575, 256, 27476, - 256, 15438, 256, 27506, 256, 27551, 256, 27578, 256, 27579, 256, 146061, - 256, 138507, 256, 146170, 256, 27726, 256, 146620, 256, 27839, 256, - 27853, 256, 27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, - 28009, 256, 28024, 256, 28037, 256, 146718, 256, 27956, 256, 28207, 256, - 28270, 256, 15667, 256, 28363, 256, 28359, 256, 147153, 256, 28153, 256, - 28526, 256, 147294, 256, 147342, 256, 28614, 256, 28729, 256, 28702, 256, - 28699, 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, - 132389, 256, 28997, 256, 148067, 256, 29084, 256, 148395, 256, 29224, - 256, 29237, 256, 29264, 256, 149000, 256, 29312, 256, 29333, 256, 149301, - 256, 149524, 256, 29562, 256, 29579, 256, 16044, 256, 29605, 256, 16056, - 256, 16056, 256, 29767, 256, 29788, 256, 29809, 256, 29829, 256, 29898, - 256, 16155, 256, 29988, 256, 150582, 256, 30014, 256, 150674, 256, 30064, - 256, 139679, 256, 30224, 256, 151457, 256, 151480, 256, 151620, 256, - 16380, 256, 16392, 256, 30452, 256, 151795, 256, 151794, 256, 151833, - 256, 151859, 256, 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, - 256, 30603, 256, 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, - 256, 30924, 256, 16611, 256, 153126, 256, 31062, 256, 153242, 256, - 153285, 256, 31119, 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, - 31311, 256, 153980, 256, 154279, 256, 154279, 256, 31470, 256, 16898, - 256, 154539, 256, 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, - 256, 17056, 256, 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, - 256, 17153, 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, - 256, 156231, 256, 17241, 256, 156377, 256, 32634, 256, 156478, 256, - 32661, 256, 32762, 256, 32773, 256, 156890, 256, 156963, 256, 32864, 256, - 157096, 256, 32880, 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, - 17419, 256, 33086, 256, 23221, 256, 157607, 256, 157621, 256, 144275, - 256, 144284, 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, - 256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, - 256, 33510, 256, 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, - 256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, - 256, 33740, 256, 33756, 256, 158774, 256, 159083, 256, 158933, 256, - 17707, 256, 34033, 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, - 159532, 256, 17757, 256, 17761, 256, 159665, 256, 159954, 256, 17771, - 256, 34384, 256, 34396, 256, 34407, 256, 34409, 256, 34473, 256, 34440, - 256, 34574, 256, 34530, 256, 34681, 256, 34600, 256, 34667, 256, 34694, - 256, 17879, 256, 34785, 256, 34817, 256, 17913, 256, 34912, 256, 34915, - 256, 161383, 256, 35031, 256, 35038, 256, 17973, 256, 35066, 256, 13499, - 256, 161966, 256, 162150, 256, 18110, 256, 18119, 256, 35488, 256, 35565, - 256, 35722, 256, 35925, 256, 162984, 256, 36011, 256, 36033, 256, 36123, - 256, 36215, 256, 163631, 256, 133124, 256, 36299, 256, 36284, 256, 36336, - 256, 133342, 256, 36564, 256, 36664, 256, 165330, 256, 165357, 256, - 37012, 256, 37105, 256, 37137, 256, 165678, 256, 37147, 256, 37432, 256, - 37591, 256, 37592, 256, 37500, 256, 37881, 256, 37909, 256, 166906, 256, - 38283, 256, 18837, 256, 38327, 256, 167287, 256, 18918, 256, 38595, 256, - 23986, 256, 38691, 256, 168261, 256, 168474, 256, 19054, 256, 19062, 256, - 38880, 256, 168970, 256, 19122, 256, 169110, 256, 38923, 256, 38923, 256, - 38953, 256, 169398, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, - 39362, 256, 39422, 256, 19406, 256, 170800, 256, 39698, 256, 40000, 256, - 40189, 256, 19662, 256, 19693, 256, 40295, 256, 172238, 256, 19704, 256, - 172293, 256, 172558, 256, 172689, 256, 40635, 256, 19798, 256, 40697, - 256, 40702, 256, 40709, 256, 40719, 256, 40726, 256, 40763, 256, 173568, + 982, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, + 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, + 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, + 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, + 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, + 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, + 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, + 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, + 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, 916, 262, + 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, + 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, + 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, + 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, + 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, + 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, + 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, + 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 988, 262, 989, 262, + 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, + 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, + 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, + 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, + 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, + 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, + 56, 262, 57, 514, 48, 46, 514, 48, 44, 514, 49, 44, 514, 50, 44, 514, 51, + 44, 514, 52, 44, 514, 53, 44, 514, 54, 44, 514, 55, 44, 514, 56, 44, 514, + 57, 44, 770, 40, 65, 41, 770, 40, 66, 41, 770, 40, 67, 41, 770, 40, 68, + 41, 770, 40, 69, 41, 770, 40, 70, 41, 770, 40, 71, 41, 770, 40, 72, 41, + 770, 40, 73, 41, 770, 40, 74, 41, 770, 40, 75, 41, 770, 40, 76, 41, 770, + 40, 77, 41, 770, 40, 78, 41, 770, 40, 79, 41, 770, 40, 80, 41, 770, 40, + 81, 41, 770, 40, 82, 41, 770, 40, 83, 41, 770, 40, 84, 41, 770, 40, 85, + 41, 770, 40, 86, 41, 770, 40, 87, 41, 770, 40, 88, 41, 770, 40, 89, 41, + 770, 40, 90, 41, 770, 12308, 83, 12309, 263, 67, 263, 82, 519, 67, 68, + 519, 87, 90, 266, 65, 266, 66, 266, 67, 266, 68, 266, 69, 266, 70, 266, + 71, 266, 72, 266, 73, 266, 74, 266, 75, 266, 76, 266, 77, 266, 78, 266, + 79, 266, 80, 266, 81, 266, 82, 266, 83, 266, 84, 266, 85, 266, 86, 266, + 87, 266, 88, 266, 89, 266, 90, 522, 72, 86, 522, 77, 86, 522, 83, 68, + 522, 83, 83, 778, 80, 80, 86, 522, 87, 67, 522, 68, 74, 522, 12411, + 12363, 522, 12467, 12467, 266, 12469, 266, 25163, 266, 23383, 266, 21452, + 266, 12487, 266, 20108, 266, 22810, 266, 35299, 266, 22825, 266, 20132, + 266, 26144, 266, 28961, 266, 26009, 266, 21069, 266, 24460, 266, 20877, + 266, 26032, 266, 21021, 266, 32066, 266, 29983, 266, 36009, 266, 22768, + 266, 21561, 266, 28436, 266, 25237, 266, 25429, 266, 19968, 266, 19977, + 266, 36938, 266, 24038, 266, 20013, 266, 21491, 266, 25351, 266, 36208, + 266, 25171, 266, 31105, 266, 31354, 266, 21512, 266, 28288, 266, 26377, + 266, 26376, 266, 30003, 266, 21106, 266, 21942, 770, 12308, 26412, 12309, + 770, 12308, 19977, 12309, 770, 12308, 20108, 12309, 770, 12308, 23433, + 12309, 770, 12308, 28857, 12309, 770, 12308, 25171, 12309, 770, 12308, + 30423, 12309, 770, 12308, 21213, 12309, 770, 12308, 25943, 12309, 263, + 24471, 263, 21487, 256, 20029, 256, 20024, 256, 20033, 256, 131362, 256, + 20320, 256, 20398, 256, 20411, 256, 20482, 256, 20602, 256, 20633, 256, + 20711, 256, 20687, 256, 13470, 256, 132666, 256, 20813, 256, 20820, 256, + 20836, 256, 20855, 256, 132380, 256, 13497, 256, 20839, 256, 20877, 256, + 132427, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256, + 168415, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062, 256, + 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220, 256, + 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329, 256, + 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375, 256, + 133676, 256, 28784, 256, 21450, 256, 21471, 256, 133987, 256, 21483, 256, + 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, 21608, 256, + 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, 21892, 256, + 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, 22294, 256, + 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, 22766, 256, + 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, 22577, 256, + 22700, 256, 136420, 256, 22770, 256, 22775, 256, 22790, 256, 22810, 256, + 22818, 256, 22882, 256, 136872, 256, 136938, 256, 23020, 256, 23067, 256, + 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, 256, 23304, 256, + 23358, 256, 23358, 256, 137672, 256, 23491, 256, 23512, 256, 23527, 256, + 23539, 256, 138008, 256, 23551, 256, 23558, 256, 24403, 256, 23586, 256, + 14209, 256, 23648, 256, 23662, 256, 23744, 256, 23693, 256, 138724, 256, + 23875, 256, 138726, 256, 23918, 256, 23915, 256, 23932, 256, 24033, 256, + 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, 256, 24169, 256, + 14434, 256, 139651, 256, 14460, 256, 24240, 256, 24243, 256, 24246, 256, + 24266, 256, 172946, 256, 24318, 256, 140081, 256, 140081, 256, 33281, + 256, 24354, 256, 24354, 256, 14535, 256, 144056, 256, 156122, 256, 24418, + 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, 256, 24569, + 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 141012, 256, 24775, + 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, 256, 24974, + 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, 256, 25078, + 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, 256, 25424, + 256, 142092, 256, 25405, 256, 25340, 256, 25448, 256, 25475, 256, 25572, + 256, 142321, 256, 25634, 256, 25541, 256, 25513, 256, 14894, 256, 25705, + 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, 25935, 256, 25964, + 256, 143370, 256, 26083, 256, 26360, 256, 26185, 256, 15129, 256, 26257, + 256, 15112, 256, 15076, 256, 20882, 256, 20885, 256, 26368, 256, 26268, + 256, 32941, 256, 17369, 256, 26391, 256, 26395, 256, 26401, 256, 26462, + 256, 26451, 256, 144323, 256, 15177, 256, 26618, 256, 26501, 256, 26706, + 256, 26757, 256, 144493, 256, 26766, 256, 26655, 256, 26900, 256, 15261, + 256, 26946, 256, 27043, 256, 27114, 256, 27304, 256, 145059, 256, 27355, + 256, 15384, 256, 27425, 256, 145575, 256, 27476, 256, 15438, 256, 27506, + 256, 27551, 256, 27578, 256, 27579, 256, 146061, 256, 138507, 256, + 146170, 256, 27726, 256, 146620, 256, 27839, 256, 27853, 256, 27751, 256, + 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, 256, + 28037, 256, 146718, 256, 27956, 256, 28207, 256, 28270, 256, 15667, 256, + 28363, 256, 28359, 256, 147153, 256, 28153, 256, 28526, 256, 147294, 256, + 147342, 256, 28614, 256, 28729, 256, 28702, 256, 28699, 256, 15766, 256, + 28746, 256, 28797, 256, 28791, 256, 28845, 256, 132389, 256, 28997, 256, + 148067, 256, 29084, 256, 148395, 256, 29224, 256, 29237, 256, 29264, 256, + 149000, 256, 29312, 256, 29333, 256, 149301, 256, 149524, 256, 29562, + 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, 29767, + 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, 29988, + 256, 150582, 256, 30014, 256, 150674, 256, 30064, 256, 139679, 256, + 30224, 256, 151457, 256, 151480, 256, 151620, 256, 16380, 256, 16392, + 256, 30452, 256, 151795, 256, 151794, 256, 151833, 256, 151859, 256, + 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, 256, 30603, 256, + 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, 256, 30924, 256, + 16611, 256, 153126, 256, 31062, 256, 153242, 256, 153285, 256, 31119, + 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, 153980, + 256, 154279, 256, 154279, 256, 31470, 256, 16898, 256, 154539, 256, + 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, 256, 17056, 256, + 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, 256, 17153, 256, + 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, 256, 156231, 256, + 17241, 256, 156377, 256, 32634, 256, 156478, 256, 32661, 256, 32762, 256, + 32773, 256, 156890, 256, 156963, 256, 32864, 256, 157096, 256, 32880, + 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086, + 256, 23221, 256, 157607, 256, 157621, 256, 144275, 256, 144284, 256, + 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419, 256, + 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510, 256, + 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256, 33571, 256, + 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256, 33740, 256, + 33756, 256, 158774, 256, 159083, 256, 158933, 256, 17707, 256, 34033, + 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, 159532, 256, 17757, + 256, 17761, 256, 159665, 256, 159954, 256, 17771, 256, 34384, 256, 34396, + 256, 34407, 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, + 256, 34681, 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, + 256, 34817, 256, 17913, 256, 34912, 256, 34915, 256, 161383, 256, 35031, + 256, 35038, 256, 17973, 256, 35066, 256, 13499, 256, 161966, 256, 162150, + 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, 35925, + 256, 162984, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256, 163631, + 256, 133124, 256, 36299, 256, 36284, 256, 36336, 256, 133342, 256, 36564, + 256, 36664, 256, 165330, 256, 165357, 256, 37012, 256, 37105, 256, 37137, + 256, 165678, 256, 37147, 256, 37432, 256, 37591, 256, 37592, 256, 37500, + 256, 37881, 256, 37909, 256, 166906, 256, 38283, 256, 18837, 256, 38327, + 256, 167287, 256, 18918, 256, 38595, 256, 23986, 256, 38691, 256, 168261, + 256, 168474, 256, 19054, 256, 19062, 256, 38880, 256, 168970, 256, 19122, + 256, 169110, 256, 38923, 256, 38923, 256, 38953, 256, 169398, 256, 39138, + 256, 19251, 256, 39209, 256, 39335, 256, 39362, 256, 39422, 256, 19406, + 256, 170800, 256, 39698, 256, 40000, 256, 40189, 256, 19662, 256, 19693, + 256, 40295, 256, 172238, 256, 19704, 256, 172293, 256, 172558, 256, + 172689, 256, 40635, 256, 19798, 256, 40697, 256, 40702, 256, 40709, 256, + 40719, 256, 40726, 256, 40763, 256, 173568, }; /* index tables for the decomposition data */ @@ -3970,42 +4078,43 @@ static unsigned short decomp_index2[] = { 0, 0, 3127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3129, 3131, 0, 0, 3133, 3135, 3137, 3139, 3141, 3143, 3145, 3147, 3149, 3151, 3153, 3155, 3157, 3159, 3161, 3163, 3165, 3167, 3169, 3171, 3173, 3175, 3177, - 3179, 3181, 3183, 3185, 0, 3187, 3189, 3191, 3193, 3195, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3197, 0, 0, 0, 0, 0, 0, 0, 0, + 3179, 3181, 3183, 3185, 0, 3187, 3189, 3191, 3193, 3195, 3197, 3199, + 3201, 3203, 3205, 3207, 3209, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3216, 3220, 3224, + 3226, 0, 3229, 3233, 3237, 0, 3239, 3242, 3244, 3246, 3248, 3250, 3252, + 3254, 3256, 3258, 3260, 0, 3262, 3264, 0, 0, 3267, 3269, 3271, 3273, + 3275, 0, 0, 3277, 3280, 3284, 0, 3287, 0, 3289, 0, 3291, 0, 3293, 3295, + 3297, 3299, 0, 3301, 3303, 3305, 0, 3307, 3309, 3311, 3313, 3315, 3317, + 3319, 0, 3321, 3325, 3327, 3329, 3331, 3333, 0, 0, 0, 0, 3335, 3337, + 3339, 3341, 3343, 0, 0, 0, 0, 0, 0, 3345, 3349, 3353, 3358, 3362, 3366, + 3370, 3374, 3378, 3382, 3386, 3390, 3394, 3398, 3402, 3406, 3409, 3411, + 3414, 3418, 3421, 3423, 3426, 3430, 3435, 3438, 3440, 3443, 3447, 3449, + 3451, 3453, 3455, 3457, 3460, 3464, 3467, 3469, 3472, 3476, 3481, 3484, + 3486, 3489, 3493, 3495, 3497, 3499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3501, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3505, 3508, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3511, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3514, + 3517, 3520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3200, 3204, 3208, 3210, 0, 3213, 3217, 3221, 0, - 3223, 3226, 3228, 3230, 3232, 3234, 3236, 3238, 3240, 3242, 3244, 0, - 3246, 3248, 0, 0, 3251, 3253, 3255, 3257, 3259, 0, 0, 3261, 3264, 3268, - 0, 3271, 0, 3273, 0, 3275, 0, 3277, 3279, 3281, 3283, 0, 3285, 3287, - 3289, 0, 3291, 3293, 3295, 3297, 3299, 3301, 3303, 0, 3305, 3309, 3311, - 3313, 3315, 3317, 0, 0, 0, 0, 3319, 3321, 3323, 3325, 3327, 0, 0, 0, 0, - 0, 0, 3329, 3333, 3337, 3342, 3346, 3350, 3354, 3358, 3362, 3366, 3370, - 3374, 3378, 3382, 3386, 3390, 3393, 3395, 3398, 3402, 3405, 3407, 3410, - 3414, 3419, 3422, 3424, 3427, 3431, 3433, 3435, 3437, 3439, 3441, 3444, - 3448, 3451, 3453, 3456, 3460, 3465, 3468, 3470, 3473, 3477, 3479, 3481, - 3483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3489, 3492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3498, 3501, 3504, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3523, 0, 0, 0, 0, 3526, 0, 0, 3529, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3532, 0, 3535, + 0, 0, 0, 0, 0, 3538, 3541, 0, 3545, 3548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3552, 0, 0, 3555, 0, 0, 3558, 0, 3561, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3564, 0, 3567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3570, 3573, 3576, 3579, 3582, 0, 0, 3585, 3588, + 0, 0, 3591, 3594, 0, 0, 0, 0, 0, 0, 3597, 3600, 0, 0, 3603, 3606, 0, 0, + 3609, 3612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3615, 3618, 3621, 3624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3507, 0, - 0, 0, 0, 3510, 0, 0, 3513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3516, 0, 3519, 0, 0, 0, 0, 0, 3522, 3525, 0, - 3529, 3532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3536, 0, 0, - 3539, 0, 0, 3542, 0, 3545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3548, 0, 3551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3554, - 3557, 3560, 3563, 3566, 0, 0, 3569, 3572, 0, 0, 3575, 3578, 0, 0, 0, 0, - 0, 0, 3581, 3584, 0, 0, 3587, 3590, 0, 0, 3593, 3596, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3627, + 3630, 3633, 3636, 0, 0, 0, 0, 0, 0, 3639, 3642, 3645, 3648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3599, 3602, 3605, 3608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3611, 3614, 3617, 3620, 0, 0, 0, 0, - 0, 0, 3623, 3626, 3629, 3632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3651, 3653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3635, - 3637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4017,36 +4126,35 @@ static unsigned short decomp_index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3639, 3641, 3643, 3645, 3647, 3649, 3651, 3653, 3655, 3657, 3660, 3663, - 3666, 3669, 3672, 3675, 3678, 3681, 3684, 3687, 3690, 3694, 3698, 3702, - 3706, 3710, 3714, 3718, 3722, 3726, 3731, 3736, 3741, 3746, 3751, 3756, - 3761, 3766, 3771, 3776, 3781, 3784, 3787, 3790, 3793, 3796, 3799, 3802, - 3805, 3808, 3812, 3816, 3820, 3824, 3828, 3832, 3836, 3840, 3844, 3848, + 0, 0, 0, 0, 0, 0, 0, 0, 3655, 3657, 3659, 3661, 3663, 3665, 3667, 3669, + 3671, 3673, 3676, 3679, 3682, 3685, 3688, 3691, 3694, 3697, 3700, 3703, + 3706, 3710, 3714, 3718, 3722, 3726, 3730, 3734, 3738, 3742, 3747, 3752, + 3757, 3762, 3767, 3772, 3777, 3782, 3787, 3792, 3797, 3800, 3803, 3806, + 3809, 3812, 3815, 3818, 3821, 3824, 3828, 3832, 3836, 3840, 3844, 3848, 3852, 3856, 3860, 3864, 3868, 3872, 3876, 3880, 3884, 3888, 3892, 3896, 3900, 3904, 3908, 3912, 3916, 3920, 3924, 3928, 3932, 3936, 3940, 3944, - 3948, 3952, 3956, 3958, 3960, 3962, 3964, 3966, 3968, 3970, 3972, 3974, - 3976, 3978, 3980, 3982, 3984, 3986, 3988, 3990, 3992, 3994, 3996, 3998, - 4000, 4002, 4004, 4006, 4008, 4010, 4012, 4014, 4016, 4018, 4020, 4022, - 4024, 4026, 4028, 4030, 4032, 4034, 4036, 4038, 4040, 4042, 4044, 4046, - 4048, 4050, 4052, 4054, 4056, 4058, 4060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3948, 3952, 3956, 3960, 3964, 3968, 3972, 3974, 3976, 3978, 3980, 3982, + 3984, 3986, 3988, 3990, 3992, 3994, 3996, 3998, 4000, 4002, 4004, 4006, + 4008, 4010, 4012, 4014, 4016, 4018, 4020, 4022, 4024, 4026, 4028, 4030, + 4032, 4034, 4036, 4038, 4040, 4042, 4044, 4046, 4048, 4050, 4052, 4054, + 4056, 4058, 4060, 4062, 4064, 4066, 4068, 4070, 4072, 4074, 4076, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4067, 4071, 4074, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4083, 4087, 4090, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4081, 4083, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4097, 4099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4056,8 +4164,8 @@ static unsigned short decomp_index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4069,468 +4177,471 @@ static unsigned short decomp_index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4089, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4091, 4093, 4095, 4097, 4099, - 4101, 4103, 4105, 4107, 4109, 4111, 4113, 4115, 4117, 4119, 4121, 4123, - 4125, 4127, 4129, 4131, 4133, 4135, 4137, 4139, 4141, 4143, 4145, 4147, - 4149, 4151, 4153, 4155, 4157, 4159, 4161, 4163, 4165, 4167, 4169, 4171, - 4173, 4175, 4177, 4179, 4181, 4183, 4185, 4187, 4189, 4191, 4193, 4195, - 4197, 4199, 4201, 4203, 4205, 4207, 4209, 4211, 4213, 4215, 4217, 4219, - 4221, 4223, 4225, 4227, 4229, 4231, 4233, 4235, 4237, 4239, 4241, 4243, - 4245, 4247, 4249, 4251, 4253, 4255, 4257, 4259, 4261, 4263, 4265, 4267, - 4269, 4271, 4273, 4275, 4277, 4279, 4281, 4283, 4285, 4287, 4289, 4291, - 4293, 4295, 4297, 4299, 4301, 4303, 4305, 4307, 4309, 4311, 4313, 4315, - 4317, 4319, 4321, 4323, 4325, 4327, 4329, 4331, 4333, 4335, 4337, 4339, - 4341, 4343, 4345, 4347, 4349, 4351, 4353, 4355, 4357, 4359, 4361, 4363, - 4365, 4367, 4369, 4371, 4373, 4375, 4377, 4379, 4381, 4383, 4385, 4387, - 4389, 4391, 4393, 4395, 4397, 4399, 4401, 4403, 4405, 4407, 4409, 4411, - 4413, 4415, 4417, 4419, 4421, 4423, 4425, 4427, 4429, 4431, 4433, 4435, - 4437, 4439, 4441, 4443, 4445, 4447, 4449, 4451, 4453, 4455, 4457, 4459, - 4461, 4463, 4465, 4467, 4469, 4471, 4473, 4475, 4477, 4479, 4481, 4483, - 4485, 4487, 4489, 4491, 4493, 4495, 4497, 4499, 4501, 4503, 4505, 4507, - 4509, 4511, 4513, 4515, 4517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4107, + 4109, 4111, 4113, 4115, 4117, 4119, 4121, 4123, 4125, 4127, 4129, 4131, + 4133, 4135, 4137, 4139, 4141, 4143, 4145, 4147, 4149, 4151, 4153, 4155, + 4157, 4159, 4161, 4163, 4165, 4167, 4169, 4171, 4173, 4175, 4177, 4179, + 4181, 4183, 4185, 4187, 4189, 4191, 4193, 4195, 4197, 4199, 4201, 4203, + 4205, 4207, 4209, 4211, 4213, 4215, 4217, 4219, 4221, 4223, 4225, 4227, + 4229, 4231, 4233, 4235, 4237, 4239, 4241, 4243, 4245, 4247, 4249, 4251, + 4253, 4255, 4257, 4259, 4261, 4263, 4265, 4267, 4269, 4271, 4273, 4275, + 4277, 4279, 4281, 4283, 4285, 4287, 4289, 4291, 4293, 4295, 4297, 4299, + 4301, 4303, 4305, 4307, 4309, 4311, 4313, 4315, 4317, 4319, 4321, 4323, + 4325, 4327, 4329, 4331, 4333, 4335, 4337, 4339, 4341, 4343, 4345, 4347, + 4349, 4351, 4353, 4355, 4357, 4359, 4361, 4363, 4365, 4367, 4369, 4371, + 4373, 4375, 4377, 4379, 4381, 4383, 4385, 4387, 4389, 4391, 4393, 4395, + 4397, 4399, 4401, 4403, 4405, 4407, 4409, 4411, 4413, 4415, 4417, 4419, + 4421, 4423, 4425, 4427, 4429, 4431, 4433, 4435, 4437, 4439, 4441, 4443, + 4445, 4447, 4449, 4451, 4453, 4455, 4457, 4459, 4461, 4463, 4465, 4467, + 4469, 4471, 4473, 4475, 4477, 4479, 4481, 4483, 4485, 4487, 4489, 4491, + 4493, 4495, 4497, 4499, 4501, 4503, 4505, 4507, 4509, 4511, 4513, 4515, + 4517, 4519, 4521, 4523, 4525, 4527, 4529, 4531, 4533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4521, 0, 4523, 4525, 4527, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4529, 0, 4532, 0, 4535, 0, 4538, - 0, 4541, 0, 4544, 0, 4547, 0, 4550, 0, 4553, 0, 4556, 0, 4559, 0, 4562, - 0, 0, 4565, 0, 4568, 0, 4571, 0, 0, 0, 0, 0, 0, 4574, 4577, 0, 4580, - 4583, 0, 4586, 4589, 0, 4592, 4595, 0, 4598, 4601, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4604, 0, 0, 0, 0, 0, 0, - 4607, 4610, 0, 4613, 4616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4619, 0, - 4622, 0, 4625, 0, 4628, 0, 4631, 0, 4634, 0, 4637, 0, 4640, 0, 4643, 0, - 4646, 0, 4649, 0, 4652, 0, 0, 4655, 0, 4658, 0, 4661, 0, 0, 0, 0, 0, 0, - 4664, 4667, 0, 4670, 4673, 0, 4676, 4679, 0, 4682, 4685, 0, 4688, 4691, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4694, - 0, 0, 4697, 4700, 4703, 4706, 0, 0, 0, 4709, 4712, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4537, 0, 4539, + 4541, 4543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4545, 0, + 4548, 0, 4551, 0, 4554, 0, 4557, 0, 4560, 0, 4563, 0, 4566, 0, 4569, 0, + 4572, 0, 4575, 0, 4578, 0, 0, 4581, 0, 4584, 0, 4587, 0, 0, 0, 0, 0, 0, + 4590, 4593, 0, 4596, 4599, 0, 4602, 4605, 0, 4608, 4611, 0, 4614, 4617, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4620, + 0, 0, 0, 0, 0, 0, 4623, 4626, 0, 4629, 4632, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4635, 0, 4638, 0, 4641, 0, 4644, 0, 4647, 0, 4650, 0, 4653, 0, + 4656, 0, 4659, 0, 4662, 0, 4665, 0, 4668, 0, 0, 4671, 0, 4674, 0, 4677, + 0, 0, 0, 0, 0, 0, 4680, 4683, 0, 4686, 4689, 0, 4692, 4695, 0, 4698, + 4701, 0, 4704, 4707, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4710, 0, 0, 4713, 4716, 4719, 4722, 0, 0, 0, 4725, 4728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4715, 4717, 4719, - 4721, 4723, 4725, 4727, 4729, 4731, 4733, 4735, 4737, 4739, 4741, 4743, - 4745, 4747, 4749, 4751, 4753, 4755, 4757, 4759, 4761, 4763, 4765, 4767, - 4769, 4771, 4773, 4775, 4777, 4779, 4781, 4783, 4785, 4787, 4789, 4791, - 4793, 4795, 4797, 4799, 4801, 4803, 4805, 4807, 4809, 4811, 4813, 4815, - 4817, 4819, 4821, 4823, 4825, 4827, 4829, 4831, 4833, 4835, 4837, 4839, - 4841, 4843, 4845, 4847, 4849, 4851, 4853, 4855, 4857, 4859, 4861, 4863, - 4865, 4867, 4869, 4871, 4873, 4875, 4877, 4879, 4881, 4883, 4885, 4887, - 4889, 4891, 4893, 4895, 4897, 4899, 4901, 0, 0, 0, 4903, 4905, 4907, - 4909, 4911, 4913, 4915, 4917, 4919, 4921, 4923, 4925, 4927, 4929, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4731, 4733, 4735, 4737, 4739, 4741, 4743, 4745, 4747, 4749, 4751, + 4753, 4755, 4757, 4759, 4761, 4763, 4765, 4767, 4769, 4771, 4773, 4775, + 4777, 4779, 4781, 4783, 4785, 4787, 4789, 4791, 4793, 4795, 4797, 4799, + 4801, 4803, 4805, 4807, 4809, 4811, 4813, 4815, 4817, 4819, 4821, 4823, + 4825, 4827, 4829, 4831, 4833, 4835, 4837, 4839, 4841, 4843, 4845, 4847, + 4849, 4851, 4853, 4855, 4857, 4859, 4861, 4863, 4865, 4867, 4869, 4871, + 4873, 4875, 4877, 4879, 4881, 4883, 4885, 4887, 4889, 4891, 4893, 4895, + 4897, 4899, 4901, 4903, 4905, 4907, 4909, 4911, 4913, 4915, 4917, 0, 0, + 0, 4919, 4921, 4923, 4925, 4927, 4929, 4931, 4933, 4935, 4937, 4939, + 4941, 4943, 4945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4931, - 4935, 4939, 4943, 4947, 4951, 4955, 4959, 4963, 4967, 4971, 4975, 4979, - 4983, 4987, 4992, 4997, 5002, 5007, 5012, 5017, 5022, 5027, 5032, 5037, - 5042, 5047, 5052, 5057, 5062, 5070, 0, 5077, 5081, 5085, 5089, 5093, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4947, 4951, 4955, 4959, 4963, 4967, 4971, 4975, 4979, + 4983, 4987, 4991, 4995, 4999, 5003, 5008, 5013, 5018, 5023, 5028, 5033, + 5038, 5043, 5048, 5053, 5058, 5063, 5068, 5073, 5078, 5086, 0, 5093, 5097, 5101, 5105, 5109, 5113, 5117, 5121, 5125, 5129, 5133, 5137, 5141, 5145, 5149, 5153, 5157, 5161, 5165, 5169, 5173, 5177, 5181, 5185, 5189, - 5193, 5197, 5201, 5205, 5209, 5213, 5217, 5221, 5223, 5225, 5227, 0, 0, - 0, 0, 0, 0, 0, 0, 5229, 5233, 5236, 5239, 5242, 5245, 5248, 5251, 5254, - 5257, 5260, 5263, 5266, 5269, 5272, 5275, 5278, 5280, 5282, 5284, 5286, - 5288, 5290, 5292, 5294, 5296, 5298, 5300, 5302, 5304, 5306, 5309, 5312, - 5315, 5318, 5321, 5324, 5327, 5330, 5333, 5336, 5339, 5342, 5345, 5348, - 5354, 5359, 0, 5362, 5364, 5366, 5368, 5370, 5372, 5374, 5376, 5378, - 5380, 5382, 5384, 5386, 5388, 5390, 5392, 5394, 5396, 5398, 5400, 5402, - 5404, 5406, 5408, 5410, 5412, 5414, 5416, 5418, 5420, 5422, 5424, 5426, - 5428, 5430, 5432, 5434, 5436, 5438, 5440, 5442, 5444, 5446, 5448, 5450, - 5452, 5454, 5456, 5458, 5460, 5463, 5466, 5469, 5472, 5475, 5478, 5481, - 5484, 5487, 5490, 5493, 5496, 5499, 5502, 5505, 5508, 5511, 5514, 5517, - 5520, 5523, 5526, 5529, 5532, 5536, 5540, 5544, 5547, 5551, 5554, 5558, - 5560, 5562, 5564, 5566, 5568, 5570, 5572, 5574, 5576, 5578, 5580, 5582, - 5584, 5586, 5588, 5590, 5592, 5594, 5596, 5598, 5600, 5602, 5604, 5606, - 5608, 5610, 5612, 5614, 5616, 5618, 5620, 5622, 5624, 5626, 5628, 5630, - 5632, 5634, 5636, 5638, 5640, 5642, 5644, 5646, 5648, 5650, 0, 5652, - 5657, 5662, 5667, 5671, 5676, 5680, 5684, 5690, 5695, 5699, 5703, 5707, - 5712, 5717, 5721, 5725, 5728, 5732, 5737, 5742, 5745, 5751, 5758, 5764, - 5768, 5774, 5780, 5785, 5789, 5793, 5797, 5802, 5808, 5813, 5817, 5821, - 5825, 5828, 5831, 5834, 5837, 5841, 5845, 5851, 5855, 5860, 5866, 5870, - 5873, 5876, 5882, 5887, 5893, 5897, 5903, 5906, 5910, 5914, 5918, 5922, - 5926, 5931, 5935, 5938, 5942, 5946, 5950, 5955, 5959, 5963, 5967, 5973, - 5978, 5981, 5987, 5990, 5995, 6000, 6004, 6008, 6012, 6017, 6020, 6024, - 6029, 6032, 6038, 6042, 6045, 6048, 6051, 6054, 6057, 6060, 6063, 6066, - 6069, 6072, 6076, 6080, 6084, 6088, 6092, 6096, 6100, 6104, 6108, 6112, - 6116, 6120, 6124, 6128, 6132, 6136, 6139, 6142, 6146, 6149, 6152, 6155, - 6159, 6163, 6166, 6169, 6172, 6175, 6178, 6183, 6186, 6189, 6192, 6195, - 6198, 6201, 6204, 6207, 6211, 6216, 6219, 6222, 6225, 6228, 6231, 6234, - 6237, 6241, 6245, 6249, 6253, 6256, 6259, 6262, 6265, 6268, 6271, 6274, - 6277, 6280, 6283, 6287, 6291, 6294, 6298, 6302, 6306, 6309, 6313, 6317, - 6322, 6325, 6329, 6333, 6337, 6341, 6347, 6354, 6357, 6360, 6363, 6366, - 6369, 6372, 6375, 6378, 6381, 6384, 6387, 6390, 6393, 6396, 6399, 6402, - 6405, 6408, 6413, 6416, 6419, 6422, 6427, 6431, 6434, 6437, 6440, 6443, - 6446, 6449, 6452, 6455, 6458, 6461, 6465, 6468, 6471, 6475, 6479, 6482, - 6487, 6491, 6494, 6497, 6500, 6503, 6507, 6511, 6514, 6517, 6520, 6523, - 6526, 6529, 6532, 6535, 6538, 6542, 6546, 6550, 6554, 6558, 6562, 6566, + 5193, 5197, 5201, 5205, 5209, 5213, 5217, 5221, 5225, 5229, 5233, 5237, + 5239, 5241, 5243, 0, 0, 0, 0, 0, 0, 0, 0, 5245, 5249, 5252, 5255, 5258, + 5261, 5264, 5267, 5270, 5273, 5276, 5279, 5282, 5285, 5288, 5291, 5294, + 5296, 5298, 5300, 5302, 5304, 5306, 5308, 5310, 5312, 5314, 5316, 5318, + 5320, 5322, 5325, 5328, 5331, 5334, 5337, 5340, 5343, 5346, 5349, 5352, + 5355, 5358, 5361, 5364, 5370, 5375, 0, 5378, 5380, 5382, 5384, 5386, + 5388, 5390, 5392, 5394, 5396, 5398, 5400, 5402, 5404, 5406, 5408, 5410, + 5412, 5414, 5416, 5418, 5420, 5422, 5424, 5426, 5428, 5430, 5432, 5434, + 5436, 5438, 5440, 5442, 5444, 5446, 5448, 5450, 5452, 5454, 5456, 5458, + 5460, 5462, 5464, 5466, 5468, 5470, 5472, 5474, 5476, 5479, 5482, 5485, + 5488, 5491, 5494, 5497, 5500, 5503, 5506, 5509, 5512, 5515, 5518, 5521, + 5524, 5527, 5530, 5533, 5536, 5539, 5542, 5545, 5548, 5552, 5556, 5560, + 5563, 5567, 5570, 5574, 5576, 5578, 5580, 5582, 5584, 5586, 5588, 5590, + 5592, 5594, 5596, 5598, 5600, 5602, 5604, 5606, 5608, 5610, 5612, 5614, + 5616, 5618, 5620, 5622, 5624, 5626, 5628, 5630, 5632, 5634, 5636, 5638, + 5640, 5642, 5644, 5646, 5648, 5650, 5652, 5654, 5656, 5658, 5660, 5662, + 5664, 5666, 0, 5668, 5673, 5678, 5683, 5687, 5692, 5696, 5700, 5706, + 5711, 5715, 5719, 5723, 5728, 5733, 5737, 5741, 5744, 5748, 5753, 5758, + 5761, 5767, 5774, 5780, 5784, 5790, 5796, 5801, 5805, 5809, 5813, 5818, + 5824, 5829, 5833, 5837, 5841, 5844, 5847, 5850, 5853, 5857, 5861, 5867, + 5871, 5876, 5882, 5886, 5889, 5892, 5898, 5903, 5909, 5913, 5919, 5922, + 5926, 5930, 5934, 5938, 5942, 5947, 5951, 5954, 5958, 5962, 5966, 5971, + 5975, 5979, 5983, 5989, 5994, 5997, 6003, 6006, 6011, 6016, 6020, 6024, + 6028, 6033, 6036, 6040, 6045, 6048, 6054, 6058, 6061, 6064, 6067, 6070, + 6073, 6076, 6079, 6082, 6085, 6088, 6092, 6096, 6100, 6104, 6108, 6112, + 6116, 6120, 6124, 6128, 6132, 6136, 6140, 6144, 6148, 6152, 6155, 6158, + 6162, 6165, 6168, 6171, 6175, 6179, 6182, 6185, 6188, 6191, 6194, 6199, + 6202, 6205, 6208, 6211, 6214, 6217, 6220, 6223, 6227, 6232, 6235, 6238, + 6241, 6244, 6247, 6250, 6253, 6257, 6261, 6265, 6269, 6272, 6275, 6278, + 6281, 6284, 6287, 6290, 6293, 6296, 6299, 6303, 6307, 6310, 6314, 6318, + 6322, 6325, 6329, 6333, 6338, 6341, 6345, 6349, 6353, 6357, 6363, 6370, + 6373, 6376, 6379, 6382, 6385, 6388, 6391, 6394, 6397, 6400, 6403, 6406, + 6409, 6412, 6415, 6418, 6421, 6424, 6429, 6432, 6435, 6438, 6443, 6447, + 6450, 6453, 6456, 6459, 6462, 6465, 6468, 6471, 6474, 6477, 6481, 6484, + 6487, 6491, 6495, 6498, 6503, 6507, 6510, 6513, 6516, 6519, 6523, 6527, + 6530, 6533, 6536, 6539, 6542, 6545, 6548, 6551, 6554, 6558, 6562, 6566, 6570, 6574, 6578, 6582, 6586, 6590, 6594, 6598, 6602, 6606, 6610, 6614, - 6618, 6622, 6626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6630, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6632, 6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6654, - 6656, 6658, 6660, 6662, 6664, 6666, 6668, 6670, 6672, 6674, 6676, 6678, - 6680, 6682, 6684, 6686, 6688, 6690, 6692, 6694, 6696, 6698, 6700, 6702, - 6704, 6706, 6708, 6710, 6712, 6714, 6716, 6718, 6720, 6722, 6724, 6726, - 6728, 6730, 6732, 6734, 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, - 6752, 6754, 6756, 6758, 6760, 6762, 6764, 6766, 6768, 6770, 6772, 6774, - 6776, 6778, 6780, 6782, 6784, 6786, 6788, 6790, 6792, 6794, 6796, 6798, - 6800, 6802, 6804, 6806, 6808, 6810, 6812, 6814, 6816, 6818, 6820, 6822, - 6824, 6826, 6828, 6830, 6832, 6834, 6836, 6838, 6840, 6842, 6844, 6846, - 6848, 6850, 6852, 6854, 6856, 6858, 6860, 6862, 6864, 6866, 6868, 6870, - 6872, 6874, 6876, 6878, 6880, 6882, 6884, 6886, 6888, 6890, 6892, 6894, - 6896, 6898, 6900, 6902, 6904, 6906, 6908, 6910, 6912, 6914, 6916, 6918, - 6920, 6922, 6924, 6926, 6928, 6930, 6932, 6934, 6936, 6938, 6940, 6942, - 6944, 6946, 6948, 6950, 6952, 6954, 6956, 6958, 6960, 6962, 6964, 6966, - 6968, 6970, 6972, 6974, 6976, 6978, 6980, 6982, 6984, 6986, 6988, 6990, - 6992, 6994, 6996, 6998, 7000, 7002, 7004, 7006, 7008, 7010, 7012, 7014, - 7016, 7018, 7020, 7022, 7024, 7026, 7028, 7030, 7032, 7034, 7036, 7038, - 7040, 7042, 7044, 7046, 7048, 7050, 7052, 7054, 7056, 7058, 7060, 7062, - 7064, 7066, 7068, 7070, 7072, 7074, 7076, 7078, 7080, 7082, 7084, 7086, - 7088, 7090, 7092, 7094, 7096, 7098, 7100, 7102, 7104, 7106, 7108, 7110, - 7112, 7114, 7116, 7118, 7120, 7122, 7124, 7126, 7128, 7130, 7132, 7134, - 7136, 7138, 7140, 7142, 7144, 7146, 7148, 7150, 7152, 7154, 7156, 7158, - 7160, 7162, 7164, 7166, 7168, 7170, 0, 0, 7172, 0, 7174, 0, 0, 7176, - 7178, 7180, 7182, 7184, 7186, 7188, 7190, 7192, 7194, 0, 7196, 0, 7198, - 0, 0, 7200, 7202, 0, 0, 0, 7204, 7206, 7208, 7210, 0, 0, 7212, 7214, - 7216, 7218, 7220, 7222, 7224, 7226, 7228, 7230, 7232, 7234, 7236, 7238, - 7240, 7242, 7244, 7246, 7248, 7250, 7252, 7254, 7256, 7258, 7260, 7262, - 7264, 7266, 7268, 7270, 7272, 7274, 7276, 7278, 7280, 7282, 7284, 7286, - 7288, 7290, 7292, 7294, 7296, 7298, 7300, 7302, 7304, 7306, 7308, 7310, - 7312, 7314, 7316, 7318, 7320, 7322, 7324, 7326, 7328, 7330, 7332, 7334, - 0, 0, 7336, 7338, 7340, 7342, 7344, 7346, 7348, 7350, 7352, 7354, 7356, - 7358, 7360, 7362, 7364, 7366, 7368, 7370, 7372, 7374, 7376, 7378, 7380, - 7382, 7384, 7386, 7388, 7390, 7392, 7394, 7396, 7398, 7400, 7402, 7404, - 7406, 7408, 7410, 7412, 7414, 7416, 7418, 7420, 7422, 7424, 7426, 7428, - 7430, 7432, 7434, 7436, 7438, 7440, 7442, 7444, 7446, 7448, 7450, 7452, - 7454, 7456, 7458, 7460, 7462, 7464, 7466, 7468, 7470, 7472, 7474, 7476, - 7478, 7480, 7482, 7484, 7486, 7488, 7490, 7492, 7494, 7496, 7498, 7500, - 7502, 7504, 7506, 7508, 7510, 7512, 7514, 7516, 7518, 7520, 7522, 7524, - 7526, 7528, 7530, 7532, 7534, 7536, 7538, 7540, 7542, 7544, 7546, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7548, 7551, 7554, 7557, 7561, 7565, - 7568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7571, 7574, 7577, 7580, 7583, - 0, 0, 0, 0, 0, 7586, 0, 7589, 7592, 7594, 7596, 7598, 7600, 7602, 7604, - 7606, 7608, 7610, 7612, 7615, 7618, 7621, 7624, 7627, 7630, 7633, 7636, - 7639, 7642, 7645, 7648, 0, 7651, 7654, 7657, 7660, 7663, 0, 7666, 0, - 7669, 7672, 0, 7675, 7678, 0, 7681, 7684, 7687, 7690, 7693, 7696, 7699, - 7702, 7705, 7708, 7711, 7713, 7715, 7717, 7719, 7721, 7723, 7725, 7727, - 7729, 7731, 7733, 7735, 7737, 7739, 7741, 7743, 7745, 7747, 7749, 7751, - 7753, 7755, 7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, 7775, - 7777, 7779, 7781, 7783, 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, - 7801, 7803, 7805, 7807, 7809, 7811, 7813, 7815, 7817, 7819, 7821, 7823, - 7825, 7827, 7829, 7831, 7833, 7835, 7837, 7839, 7841, 7843, 7845, 7847, - 7849, 7851, 7853, 7855, 7857, 7859, 7861, 7863, 7865, 7867, 7869, 7871, - 7873, 7875, 7877, 7879, 7881, 7883, 7885, 7887, 7889, 7891, 7893, 7895, - 7897, 7899, 7901, 7903, 7905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7907, 7909, - 7911, 7913, 7915, 7917, 7919, 7921, 7923, 7925, 7927, 7929, 7931, 7933, - 7935, 7937, 7939, 7941, 7943, 7945, 7947, 7949, 7951, 7953, 7956, 7959, - 7962, 7965, 7968, 7971, 7974, 7977, 7980, 7983, 7986, 7989, 7992, 7995, - 7998, 8001, 8004, 8007, 8009, 8011, 8013, 8015, 8018, 8021, 8024, 8027, - 8030, 8033, 8036, 8039, 8042, 8045, 8048, 8051, 8054, 8057, 8060, 8063, - 8066, 8069, 8072, 8075, 8078, 8081, 8084, 8087, 8090, 8093, 8096, 8099, - 8102, 8105, 8108, 8111, 8114, 8117, 8120, 8123, 8126, 8129, 8132, 8135, - 8138, 8141, 8144, 8147, 8150, 8153, 8156, 8159, 8162, 8165, 8168, 8171, - 8174, 8177, 8180, 8183, 8186, 8189, 8192, 8195, 8198, 8201, 8204, 8207, - 8210, 8213, 8216, 8219, 8222, 8225, 8228, 8231, 8234, 8237, 8240, 8243, - 8246, 8249, 8252, 8255, 8258, 8261, 8264, 8267, 8270, 8273, 8276, 8279, - 8282, 8285, 8288, 8291, 8294, 8297, 8301, 8305, 8309, 8313, 8317, 8321, - 8324, 8327, 8330, 8333, 8336, 8339, 8342, 8345, 8348, 8351, 8354, 8357, - 8360, 8363, 8366, 8369, 8372, 8375, 8378, 8381, 8384, 8387, 8390, 8393, - 8396, 8399, 8402, 8405, 8408, 8411, 8414, 8417, 8420, 8423, 8426, 8429, - 8432, 8435, 8438, 8441, 8444, 8447, 8450, 8453, 8456, 8459, 8462, 8465, - 8468, 8471, 8474, 8477, 8480, 8483, 8486, 8489, 8492, 8495, 8498, 8501, - 8504, 8507, 8510, 8513, 8516, 8519, 8522, 8525, 8528, 8531, 8534, 8537, - 8540, 8543, 8546, 8549, 8552, 8555, 8558, 8561, 8564, 8567, 8570, 8573, - 8576, 8579, 8582, 8585, 8588, 8591, 8594, 8597, 8600, 8603, 8606, 8609, - 8612, 8615, 8618, 8621, 8624, 8627, 8630, 8633, 8636, 8639, 8642, 8645, - 8648, 8651, 8654, 8657, 8660, 8663, 8666, 8669, 8672, 8675, 8678, 8681, - 8684, 8687, 8690, 8693, 8696, 8699, 8702, 8705, 8708, 8711, 8714, 8717, - 8720, 8723, 8726, 8729, 8732, 8735, 8738, 8741, 8744, 8747, 8751, 8755, - 8759, 8762, 8765, 8768, 8771, 8774, 8777, 8780, 8783, 8786, 8789, 8792, - 8795, 8798, 8801, 8804, 8807, 8810, 8813, 8816, 8819, 8822, 8825, 8828, - 8831, 8834, 8837, 8840, 8843, 8846, 8849, 8852, 8855, 8858, 8861, 8864, - 8867, 8870, 8873, 8876, 8879, 8882, 8885, 8888, 8891, 8894, 8897, 8900, - 8903, 8906, 8909, 8912, 8915, 8918, 8921, 8924, 8927, 8930, 8933, 8936, - 8939, 8942, 8945, 8948, 8951, 8954, 8957, 8960, 8963, 8966, 8969, 8972, - 8975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8978, 8982, - 8986, 8990, 8994, 8998, 9002, 9006, 9010, 9014, 9018, 9022, 9026, 9030, + 6618, 6622, 6626, 6630, 6634, 6638, 6642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6648, 6650, 6652, 6654, 6656, 6658, 6660, 6662, + 6664, 6666, 6668, 6670, 6672, 6674, 6676, 6678, 6680, 6682, 6684, 6686, + 6688, 6690, 6692, 6694, 6696, 6698, 6700, 6702, 6704, 6706, 6708, 6710, + 6712, 6714, 6716, 6718, 6720, 6722, 6724, 6726, 6728, 6730, 6732, 6734, + 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, 6752, 6754, 6756, 6758, + 6760, 6762, 6764, 6766, 6768, 6770, 6772, 6774, 6776, 6778, 6780, 6782, + 6784, 6786, 6788, 6790, 6792, 6794, 6796, 6798, 6800, 6802, 6804, 6806, + 6808, 6810, 6812, 6814, 6816, 6818, 6820, 6822, 6824, 6826, 6828, 6830, + 6832, 6834, 6836, 6838, 6840, 6842, 6844, 6846, 6848, 6850, 6852, 6854, + 6856, 6858, 6860, 6862, 6864, 6866, 6868, 6870, 6872, 6874, 6876, 6878, + 6880, 6882, 6884, 6886, 6888, 6890, 6892, 6894, 6896, 6898, 6900, 6902, + 6904, 6906, 6908, 6910, 6912, 6914, 6916, 6918, 6920, 6922, 6924, 6926, + 6928, 6930, 6932, 6934, 6936, 6938, 6940, 6942, 6944, 6946, 6948, 6950, + 6952, 6954, 6956, 6958, 6960, 6962, 6964, 6966, 6968, 6970, 6972, 6974, + 6976, 6978, 6980, 6982, 6984, 6986, 6988, 6990, 6992, 6994, 6996, 6998, + 7000, 7002, 7004, 7006, 7008, 7010, 7012, 7014, 7016, 7018, 7020, 7022, + 7024, 7026, 7028, 7030, 7032, 7034, 7036, 7038, 7040, 7042, 7044, 7046, + 7048, 7050, 7052, 7054, 7056, 7058, 7060, 7062, 7064, 7066, 7068, 7070, + 7072, 7074, 7076, 7078, 7080, 7082, 7084, 7086, 7088, 7090, 7092, 7094, + 7096, 7098, 7100, 7102, 7104, 7106, 7108, 7110, 7112, 7114, 7116, 7118, + 7120, 7122, 7124, 7126, 7128, 7130, 7132, 7134, 7136, 7138, 7140, 7142, + 7144, 7146, 7148, 7150, 7152, 7154, 7156, 7158, 7160, 7162, 7164, 7166, + 7168, 7170, 7172, 7174, 7176, 7178, 7180, 7182, 7184, 7186, 0, 0, 7188, + 0, 7190, 0, 0, 7192, 7194, 7196, 7198, 7200, 7202, 7204, 7206, 7208, + 7210, 0, 7212, 0, 7214, 0, 0, 7216, 7218, 0, 0, 0, 7220, 7222, 7224, + 7226, 0, 0, 7228, 7230, 7232, 7234, 7236, 7238, 7240, 7242, 7244, 7246, + 7248, 7250, 7252, 7254, 7256, 7258, 7260, 7262, 7264, 7266, 7268, 7270, + 7272, 7274, 7276, 7278, 7280, 7282, 7284, 7286, 7288, 7290, 7292, 7294, + 7296, 7298, 7300, 7302, 7304, 7306, 7308, 7310, 7312, 7314, 7316, 7318, + 7320, 7322, 7324, 7326, 7328, 7330, 7332, 7334, 7336, 7338, 7340, 7342, + 7344, 7346, 7348, 7350, 0, 0, 7352, 7354, 7356, 7358, 7360, 7362, 7364, + 7366, 7368, 7370, 7372, 7374, 7376, 7378, 7380, 7382, 7384, 7386, 7388, + 7390, 7392, 7394, 7396, 7398, 7400, 7402, 7404, 7406, 7408, 7410, 7412, + 7414, 7416, 7418, 7420, 7422, 7424, 7426, 7428, 7430, 7432, 7434, 7436, + 7438, 7440, 7442, 7444, 7446, 7448, 7450, 7452, 7454, 7456, 7458, 7460, + 7462, 7464, 7466, 7468, 7470, 7472, 7474, 7476, 7478, 7480, 7482, 7484, + 7486, 7488, 7490, 7492, 7494, 7496, 7498, 7500, 7502, 7504, 7506, 7508, + 7510, 7512, 7514, 7516, 7518, 7520, 7522, 7524, 7526, 7528, 7530, 7532, + 7534, 7536, 7538, 7540, 7542, 7544, 7546, 7548, 7550, 7552, 7554, 7556, + 7558, 7560, 7562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7564, 7567, + 7570, 7573, 7577, 7581, 7584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7587, + 7590, 7593, 7596, 7599, 0, 0, 0, 0, 0, 7602, 0, 7605, 7608, 7610, 7612, + 7614, 7616, 7618, 7620, 7622, 7624, 7626, 7628, 7631, 7634, 7637, 7640, + 7643, 7646, 7649, 7652, 7655, 7658, 7661, 7664, 0, 7667, 7670, 7673, + 7676, 7679, 0, 7682, 0, 7685, 7688, 0, 7691, 7694, 0, 7697, 7700, 7703, + 7706, 7709, 7712, 7715, 7718, 7721, 7724, 7727, 7729, 7731, 7733, 7735, + 7737, 7739, 7741, 7743, 7745, 7747, 7749, 7751, 7753, 7755, 7757, 7759, + 7761, 7763, 7765, 7767, 7769, 7771, 7773, 7775, 7777, 7779, 7781, 7783, + 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, 7801, 7803, 7805, 7807, + 7809, 7811, 7813, 7815, 7817, 7819, 7821, 7823, 7825, 7827, 7829, 7831, + 7833, 7835, 7837, 7839, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, + 7857, 7859, 7861, 7863, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879, + 7881, 7883, 7885, 7887, 7889, 7891, 7893, 7895, 7897, 7899, 7901, 7903, + 7905, 7907, 7909, 7911, 7913, 7915, 7917, 7919, 7921, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7923, 7925, 7927, 7929, 7931, 7933, 7935, 7937, 7939, 7941, + 7943, 7945, 7947, 7949, 7951, 7953, 7955, 7957, 7959, 7961, 7963, 7965, + 7967, 7969, 7972, 7975, 7978, 7981, 7984, 7987, 7990, 7993, 7996, 7999, + 8002, 8005, 8008, 8011, 8014, 8017, 8020, 8023, 8025, 8027, 8029, 8031, + 8034, 8037, 8040, 8043, 8046, 8049, 8052, 8055, 8058, 8061, 8064, 8067, + 8070, 8073, 8076, 8079, 8082, 8085, 8088, 8091, 8094, 8097, 8100, 8103, + 8106, 8109, 8112, 8115, 8118, 8121, 8124, 8127, 8130, 8133, 8136, 8139, + 8142, 8145, 8148, 8151, 8154, 8157, 8160, 8163, 8166, 8169, 8172, 8175, + 8178, 8181, 8184, 8187, 8190, 8193, 8196, 8199, 8202, 8205, 8208, 8211, + 8214, 8217, 8220, 8223, 8226, 8229, 8232, 8235, 8238, 8241, 8244, 8247, + 8250, 8253, 8256, 8259, 8262, 8265, 8268, 8271, 8274, 8277, 8280, 8283, + 8286, 8289, 8292, 8295, 8298, 8301, 8304, 8307, 8310, 8313, 8317, 8321, + 8325, 8329, 8333, 8337, 8340, 8343, 8346, 8349, 8352, 8355, 8358, 8361, + 8364, 8367, 8370, 8373, 8376, 8379, 8382, 8385, 8388, 8391, 8394, 8397, + 8400, 8403, 8406, 8409, 8412, 8415, 8418, 8421, 8424, 8427, 8430, 8433, + 8436, 8439, 8442, 8445, 8448, 8451, 8454, 8457, 8460, 8463, 8466, 8469, + 8472, 8475, 8478, 8481, 8484, 8487, 8490, 8493, 8496, 8499, 8502, 8505, + 8508, 8511, 8514, 8517, 8520, 8523, 8526, 8529, 8532, 8535, 8538, 8541, + 8544, 8547, 8550, 8553, 8556, 8559, 8562, 8565, 8568, 8571, 8574, 8577, + 8580, 8583, 8586, 8589, 8592, 8595, 8598, 8601, 8604, 8607, 8610, 8613, + 8616, 8619, 8622, 8625, 8628, 8631, 8634, 8637, 8640, 8643, 8646, 8649, + 8652, 8655, 8658, 8661, 8664, 8667, 8670, 8673, 8676, 8679, 8682, 8685, + 8688, 8691, 8694, 8697, 8700, 8703, 8706, 8709, 8712, 8715, 8718, 8721, + 8724, 8727, 8730, 8733, 8736, 8739, 8742, 8745, 8748, 8751, 8754, 8757, + 8760, 8763, 8767, 8771, 8775, 8778, 8781, 8784, 8787, 8790, 8793, 8796, + 8799, 8802, 8805, 8808, 8811, 8814, 8817, 8820, 8823, 8826, 8829, 8832, + 8835, 8838, 8841, 8844, 8847, 8850, 8853, 8856, 8859, 8862, 8865, 8868, + 8871, 8874, 8877, 8880, 8883, 8886, 8889, 8892, 8895, 8898, 8901, 8904, + 8907, 8910, 8913, 8916, 8919, 8922, 8925, 8928, 8931, 8934, 8937, 8940, + 8943, 8946, 8949, 8952, 8955, 8958, 8961, 8964, 8967, 8970, 8973, 8976, + 8979, 8982, 8985, 8988, 8991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8994, 8998, 9002, 9006, 9010, 9014, 9018, 9022, 9026, 9030, 9034, 9038, 9042, 9046, 9050, 9054, 9058, 9062, 9066, 9070, 9074, 9078, 9082, 9086, 9090, 9094, 9098, 9102, 9106, 9110, 9114, 9118, 9122, 9126, 9130, 9134, 9138, 9142, 9146, 9150, 9154, 9158, 9162, 9166, 9170, 9174, 9178, 9182, 9186, 9190, 9194, 9198, 9202, 9206, 9210, 9214, 9218, 9222, - 9226, 9230, 0, 0, 9234, 9238, 9242, 9246, 9250, 9254, 9258, 9262, 9266, + 9226, 9230, 9234, 9238, 9242, 9246, 0, 0, 9250, 9254, 9258, 9262, 9266, 9270, 9274, 9278, 9282, 9286, 9290, 9294, 9298, 9302, 9306, 9310, 9314, 9318, 9322, 9326, 9330, 9334, 9338, 9342, 9346, 9350, 9354, 9358, 9362, 9366, 9370, 9374, 9378, 9382, 9386, 9390, 9394, 9398, 9402, 9406, 9410, - 9414, 9418, 9422, 9426, 9430, 9434, 9438, 9442, 9446, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9450, 9454, 9458, 9463, 9468, 9473, 9478, - 9483, 9488, 9493, 9497, 9516, 9525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9530, 9532, 9534, 9536, 9538, 9540, 9542, 9544, - 9546, 9548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9550, 9552, 9554, 9556, 9558, 9560, 9562, 9564, 9566, 9568, 9570, - 9572, 9574, 9576, 9578, 9580, 9582, 9584, 9586, 9588, 9590, 0, 0, 9592, - 9594, 9596, 9598, 9600, 9602, 9604, 9606, 9608, 9610, 9612, 9614, 0, - 9616, 9618, 9620, 9622, 9624, 9626, 9628, 9630, 9632, 9634, 9636, 9638, - 9640, 9642, 9644, 9646, 9648, 9650, 9652, 0, 9654, 9656, 9658, 9660, 0, - 0, 0, 0, 9662, 9665, 9668, 0, 9671, 0, 9674, 9677, 9680, 9683, 9686, - 9689, 9692, 9695, 9698, 9701, 9704, 9706, 9708, 9710, 9712, 9714, 9716, - 9718, 9720, 9722, 9724, 9726, 9728, 9730, 9732, 9734, 9736, 9738, 9740, - 9742, 9744, 9746, 9748, 9750, 9752, 9754, 9756, 9758, 9760, 9762, 9764, - 9766, 9768, 9770, 9772, 9774, 9776, 9778, 9780, 9782, 9784, 9786, 9788, - 9790, 9792, 9794, 9796, 9798, 9800, 9802, 9804, 9806, 9808, 9810, 9812, - 9814, 9816, 9818, 9820, 9822, 9824, 9826, 9828, 9830, 9832, 9834, 9836, - 9838, 9840, 9842, 9844, 9846, 9848, 9850, 9852, 9854, 9856, 9858, 9860, - 9862, 9864, 9866, 9868, 9870, 9872, 9874, 9876, 9878, 9880, 9882, 9884, - 9886, 9888, 9890, 9892, 9894, 9896, 9898, 9900, 9902, 9904, 9906, 9908, - 9910, 9912, 9914, 9916, 9918, 9920, 9922, 9924, 9926, 9928, 9930, 9932, - 9934, 9936, 9938, 9941, 9944, 9947, 9950, 9953, 9956, 9959, 0, 0, 0, 0, - 9962, 9964, 9966, 9968, 9970, 9972, 9974, 9976, 9978, 9980, 9982, 9984, - 9986, 9988, 9990, 9992, 9994, 9996, 9998, 10000, 10002, 10004, 10006, - 10008, 10010, 10012, 10014, 10016, 10018, 10020, 10022, 10024, 10026, - 10028, 10030, 10032, 10034, 10036, 10038, 10040, 10042, 10044, 10046, - 10048, 10050, 10052, 10054, 10056, 10058, 10060, 10062, 10064, 10066, - 10068, 10070, 10072, 10074, 10076, 10078, 10080, 10082, 10084, 10086, - 10088, 10090, 10092, 10094, 10096, 10098, 10100, 10102, 10104, 10106, - 10108, 10110, 10112, 10114, 10116, 10118, 10120, 10122, 10124, 10126, - 10128, 10130, 10132, 10134, 10136, 10138, 10140, 10142, 10144, 10146, - 10148, 10150, 10152, 10154, 10156, 10158, 10160, 10162, 10164, 10166, - 10168, 10170, 10172, 10174, 10176, 10178, 10180, 10182, 10184, 10186, - 10188, 10190, 10192, 10194, 10196, 10198, 10200, 10202, 10204, 10206, - 10208, 10210, 10212, 10214, 10216, 10218, 10220, 10222, 10224, 10226, - 10228, 10230, 10232, 10234, 10236, 10238, 10240, 10242, 10244, 10246, - 10248, 10250, 10252, 10254, 10256, 10258, 10260, 10262, 10264, 10266, - 10268, 10270, 10272, 10274, 10276, 10278, 10280, 10282, 10284, 10286, - 10288, 10290, 10292, 10294, 10296, 10298, 10300, 10302, 10304, 10306, - 10308, 10310, 10312, 10314, 10316, 10318, 10320, 10322, 10324, 10326, - 10328, 10330, 10332, 10334, 10336, 10338, 10340, 0, 0, 0, 10342, 10344, - 10346, 10348, 10350, 10352, 0, 0, 10354, 10356, 10358, 10360, 10362, - 10364, 0, 0, 10366, 10368, 10370, 10372, 10374, 10376, 0, 0, 10378, - 10380, 10382, 0, 0, 0, 10384, 10386, 10388, 10390, 10392, 10394, 10396, - 0, 10398, 10400, 10402, 10404, 10406, 10408, 10410, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10412, 0, - 10415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10418, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10421, 10424, 10427, 10430, 10433, 10436, 10439, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10442, 10445, 10448, 10451, 10454, 10457, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10460, 10462, 10464, 10466, - 10468, 10470, 10472, 10474, 10476, 10478, 10480, 10482, 10484, 10486, - 10488, 10490, 10492, 10494, 10496, 10498, 10500, 10502, 10504, 10506, - 10508, 10510, 10512, 10514, 10516, 10518, 10520, 10522, 10524, 10526, - 10528, 10530, 10532, 10534, 10536, 10538, 10540, 10542, 10544, 10546, - 10548, 10550, 10552, 10554, 10556, 10558, 10560, 10562, 10564, 10566, - 10568, 10570, 10572, 10574, 10576, 10578, 10580, 10582, 10584, 10586, - 10588, 10590, 10592, 10594, 10596, 10598, 10600, 10602, 10604, 10606, - 10608, 10610, 10612, 10614, 10616, 10618, 10620, 10622, 10624, 10626, - 10628, 0, 10630, 10632, 10634, 10636, 10638, 10640, 10642, 10644, 10646, - 10648, 10650, 10652, 10654, 10656, 10658, 10660, 10662, 10664, 10666, - 10668, 10670, 10672, 10674, 10676, 10678, 10680, 10682, 10684, 10686, - 10688, 10690, 10692, 10694, 10696, 10698, 10700, 10702, 10704, 10706, - 10708, 10710, 10712, 10714, 10716, 10718, 10720, 10722, 10724, 10726, - 10728, 10730, 10732, 10734, 10736, 10738, 10740, 10742, 10744, 10746, - 10748, 10750, 10752, 10754, 10756, 10758, 10760, 10762, 10764, 10766, - 10768, 10770, 0, 10772, 10774, 0, 0, 10776, 0, 0, 10778, 10780, 0, 0, - 10782, 10784, 10786, 10788, 0, 10790, 10792, 10794, 10796, 10798, 10800, - 10802, 10804, 10806, 10808, 10810, 10812, 0, 10814, 0, 10816, 10818, - 10820, 10822, 10824, 10826, 10828, 0, 10830, 10832, 10834, 10836, 10838, - 10840, 10842, 10844, 10846, 10848, 10850, 10852, 10854, 10856, 10858, - 10860, 10862, 10864, 10866, 10868, 10870, 10872, 10874, 10876, 10878, - 10880, 10882, 10884, 10886, 10888, 10890, 10892, 10894, 10896, 10898, - 10900, 10902, 10904, 10906, 10908, 10910, 10912, 10914, 10916, 10918, - 10920, 10922, 10924, 10926, 10928, 10930, 10932, 10934, 10936, 10938, - 10940, 10942, 10944, 10946, 10948, 10950, 10952, 10954, 10956, 10958, 0, - 10960, 10962, 10964, 10966, 0, 0, 10968, 10970, 10972, 10974, 10976, - 10978, 10980, 10982, 0, 10984, 10986, 10988, 10990, 10992, 10994, 10996, - 0, 10998, 11000, 11002, 11004, 11006, 11008, 11010, 11012, 11014, 11016, - 11018, 11020, 11022, 11024, 11026, 11028, 11030, 11032, 11034, 11036, - 11038, 11040, 11042, 11044, 11046, 11048, 11050, 11052, 0, 11054, 11056, - 11058, 11060, 0, 11062, 11064, 11066, 11068, 11070, 0, 11072, 0, 0, 0, - 11074, 11076, 11078, 11080, 11082, 11084, 11086, 0, 11088, 11090, 11092, - 11094, 11096, 11098, 11100, 11102, 11104, 11106, 11108, 11110, 11112, - 11114, 11116, 11118, 11120, 11122, 11124, 11126, 11128, 11130, 11132, - 11134, 11136, 11138, 11140, 11142, 11144, 11146, 11148, 11150, 11152, - 11154, 11156, 11158, 11160, 11162, 11164, 11166, 11168, 11170, 11172, - 11174, 11176, 11178, 11180, 11182, 11184, 11186, 11188, 11190, 11192, - 11194, 11196, 11198, 11200, 11202, 11204, 11206, 11208, 11210, 11212, - 11214, 11216, 11218, 11220, 11222, 11224, 11226, 11228, 11230, 11232, - 11234, 11236, 11238, 11240, 11242, 11244, 11246, 11248, 11250, 11252, - 11254, 11256, 11258, 11260, 11262, 11264, 11266, 11268, 11270, 11272, - 11274, 11276, 11278, 11280, 11282, 11284, 11286, 11288, 11290, 11292, - 11294, 11296, 11298, 11300, 11302, 11304, 11306, 11308, 11310, 11312, - 11314, 11316, 11318, 11320, 11322, 11324, 11326, 11328, 11330, 11332, - 11334, 11336, 11338, 11340, 11342, 11344, 11346, 11348, 11350, 11352, - 11354, 11356, 11358, 11360, 11362, 11364, 11366, 11368, 11370, 11372, - 11374, 11376, 11378, 11380, 11382, 11384, 11386, 11388, 11390, 11392, - 11394, 11396, 11398, 11400, 11402, 11404, 11406, 11408, 11410, 11412, - 11414, 11416, 11418, 11420, 11422, 11424, 11426, 11428, 11430, 11432, - 11434, 11436, 11438, 11440, 11442, 11444, 11446, 11448, 11450, 11452, - 11454, 11456, 11458, 11460, 11462, 11464, 11466, 11468, 11470, 11472, - 11474, 11476, 11478, 11480, 11482, 11484, 11486, 11488, 11490, 11492, - 11494, 11496, 11498, 11500, 11502, 11504, 11506, 11508, 11510, 11512, - 11514, 11516, 11518, 11520, 11522, 11524, 11526, 11528, 11530, 11532, - 11534, 11536, 11538, 11540, 11542, 11544, 11546, 11548, 11550, 11552, - 11554, 11556, 11558, 11560, 11562, 11564, 11566, 11568, 11570, 11572, - 11574, 11576, 11578, 11580, 11582, 11584, 11586, 11588, 11590, 11592, - 11594, 11596, 11598, 11600, 11602, 11604, 11606, 11608, 11610, 11612, - 11614, 11616, 11618, 11620, 11622, 11624, 11626, 11628, 11630, 11632, - 11634, 11636, 11638, 11640, 11642, 11644, 11646, 11648, 11650, 11652, - 11654, 11656, 11658, 11660, 11662, 11664, 11666, 11668, 11670, 11672, - 11674, 11676, 11678, 11680, 11682, 11684, 11686, 11688, 11690, 11692, - 11694, 11696, 11698, 11700, 11702, 11704, 11706, 11708, 11710, 11712, - 11714, 11716, 11718, 11720, 11722, 11724, 11726, 11728, 11730, 11732, - 11734, 11736, 11738, 11740, 11742, 11744, 11746, 11748, 11750, 11752, - 11754, 11756, 11758, 11760, 11762, 11764, 11766, 0, 0, 11768, 11770, - 11772, 11774, 11776, 11778, 11780, 11782, 11784, 11786, 11788, 11790, - 11792, 11794, 11796, 11798, 11800, 11802, 11804, 11806, 11808, 11810, - 11812, 11814, 11816, 11818, 11820, 11822, 11824, 11826, 11828, 11830, - 11832, 11834, 11836, 11838, 11840, 11842, 11844, 11846, 11848, 11850, - 11852, 11854, 11856, 11858, 11860, 11862, 11864, 11866, 11868, 11870, - 11872, 11874, 11876, 11878, 11880, 11882, 11884, 11886, 11888, 11890, - 11892, 11894, 11896, 11898, 11900, 11902, 11904, 11906, 11908, 11910, - 11912, 11914, 11916, 11918, 11920, 11922, 11924, 11926, 11928, 11930, - 11932, 11934, 11936, 11938, 11940, 11942, 11944, 11946, 11948, 11950, - 11952, 11954, 11956, 11958, 11960, 11962, 11964, 11966, 11968, 11970, - 11972, 11974, 11976, 11978, 11980, 11982, 11984, 11986, 11988, 11990, - 11992, 11994, 11996, 11998, 12000, 12002, 12004, 12006, 12008, 12010, - 12012, 12014, 12016, 12018, 12020, 12022, 12024, 12026, 12028, 12030, - 12032, 12034, 12036, 12038, 12040, 12042, 12044, 12046, 12048, 12050, - 12052, 12054, 12056, 12058, 12060, 12062, 12064, 12066, 12068, 12070, - 12072, 12074, 12076, 12078, 12080, 12082, 12084, 12086, 12088, 12090, - 12092, 12094, 12096, 12098, 12100, 12102, 12104, 12106, 12108, 12110, - 12112, 12114, 12116, 12118, 12120, 12122, 12124, 12126, 12128, 12130, - 12132, 12134, 12136, 12138, 12140, 12142, 12144, 12146, 12148, 12150, - 12152, 12154, 12156, 12158, 12160, 12162, 12164, 12166, 12168, 12170, - 12172, 12174, 12176, 12178, 12180, 12182, 12184, 12186, 12188, 12190, - 12192, 12194, 12196, 12198, 12200, 12202, 12204, 12206, 12208, 12210, - 12212, 12214, 12216, 12218, 12220, 12222, 12224, 12226, 12228, 12230, - 12232, 12234, 12236, 12238, 12240, 12242, 12244, 12246, 12248, 12250, - 12252, 12254, 12256, 12258, 12260, 12262, 12264, 12266, 12268, 12270, - 12272, 12274, 12276, 12278, 12280, 12282, 12284, 12286, 12288, 12290, - 12292, 12294, 12296, 12298, 12300, 12302, 12304, 12306, 12308, 12310, - 12312, 12314, 12316, 12318, 12320, 12322, 12324, 12326, 12328, 12330, - 12332, 12334, 12336, 12338, 12340, 12342, 12344, 12346, 12348, 12350, 0, - 0, 12352, 12354, 12356, 12358, 12360, 12362, 12364, 12366, 12368, 12370, - 12372, 12374, 12376, 12378, 12380, 12382, 12384, 12386, 12388, 12390, - 12392, 12394, 12396, 12398, 12400, 12402, 12404, 12406, 12408, 12410, - 12412, 12414, 12416, 12418, 12420, 12422, 12424, 12426, 12428, 12430, - 12432, 12434, 12436, 12438, 12440, 12442, 12444, 12446, 12448, 12450, - 12452, 12455, 12458, 12461, 12464, 12467, 12470, 12473, 12476, 12479, - 12482, 0, 0, 0, 0, 0, 12485, 12489, 12493, 12497, 12501, 12505, 12509, - 12513, 12517, 12521, 12525, 12529, 12533, 12537, 12541, 12545, 12549, - 12553, 12557, 12561, 12565, 12569, 12573, 12577, 12581, 12585, 12589, - 12593, 12595, 12597, 12600, 0, 0, 12603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12605, 0, 12607, 0, 0, 12609, 0, 0, 0, 12611, 0, 0, 0, 12613, 12616, - 12619, 12622, 12625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12632, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12635, 12637, 12639, 12641, 12643, 12645, - 12647, 12649, 12651, 12653, 12655, 12657, 12659, 12661, 12663, 12665, - 12667, 12669, 12671, 12673, 12675, 12677, 12679, 12681, 12683, 12685, - 12687, 12689, 12691, 12693, 12695, 12697, 12699, 12701, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 12703, 12707, 12711, 12715, 12719, 12723, 12727, - 12731, 12735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12739, 12741, - 12743, 12745, 12747, 12749, 12751, 12753, 12755, 12757, 12759, 12761, - 12763, 12765, 12767, 12769, 12771, 12773, 12775, 12777, 12779, 12781, - 12783, 12785, 12787, 12789, 12791, 12793, 12795, 12797, 12799, 12801, - 12803, 12805, 12807, 12809, 12811, 12813, 12815, 12817, 12819, 12821, - 12823, 12825, 12827, 12829, 12831, 12833, 12835, 12837, 12839, 12841, - 12843, 12845, 12847, 12849, 12851, 12853, 12855, 12857, 12859, 12861, - 12863, 12865, 12867, 12869, 12871, 12873, 12875, 12877, 12879, 12881, - 12883, 12885, 12887, 12889, 12891, 12893, 12895, 12897, 12899, 12901, - 12903, 12905, 12907, 12909, 12911, 12913, 12915, 12917, 12919, 12921, - 12923, 12925, 12927, 12929, 12931, 12933, 12935, 12937, 12939, 12941, - 12943, 12945, 12947, 12949, 12951, 12953, 12955, 12957, 12959, 12961, - 12963, 12965, 12967, 12969, 12971, 12973, 12975, 12977, 12979, 12981, - 12983, 12985, 12987, 12989, 12991, 12993, 12995, 12997, 12999, 13001, - 13003, 13005, 13007, 13009, 13011, 13013, 13015, 13017, 13019, 13021, - 13023, 13025, 13027, 13029, 13031, 13033, 13035, 13037, 13039, 13041, - 13043, 13045, 13047, 13049, 13051, 13053, 13055, 13057, 13059, 13061, - 13063, 13065, 13067, 13069, 13071, 13073, 13075, 13077, 13079, 13081, - 13083, 13085, 13087, 13089, 13091, 13093, 13095, 13097, 13099, 13101, - 13103, 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, 13121, - 13123, 13125, 13127, 13129, 13131, 13133, 13135, 13137, 13139, 13141, - 13143, 13145, 13147, 13149, 13151, 13153, 13155, 13157, 13159, 13161, - 13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 13179, 13181, - 13183, 13185, 13187, 13189, 13191, 13193, 13195, 13197, 13199, 13201, - 13203, 13205, 13207, 13209, 13211, 13213, 13215, 13217, 13219, 13221, - 13223, 13225, 13227, 13229, 13231, 13233, 13235, 13237, 13239, 13241, - 13243, 13245, 13247, 13249, 13251, 13253, 13255, 13257, 13259, 13261, - 13263, 13265, 13267, 13269, 13271, 13273, 13275, 13277, 13279, 13281, - 13283, 13285, 13287, 13289, 13291, 13293, 13295, 13297, 13299, 13301, - 13303, 13305, 13307, 13309, 13311, 13313, 13315, 13317, 13319, 13321, - 13323, 13325, 13327, 13329, 13331, 13333, 13335, 13337, 13339, 13341, - 13343, 13345, 13347, 13349, 13351, 13353, 13355, 13357, 13359, 13361, - 13363, 13365, 13367, 13369, 13371, 13373, 13375, 13377, 13379, 13381, - 13383, 13385, 13387, 13389, 13391, 13393, 13395, 13397, 13399, 13401, - 13403, 13405, 13407, 13409, 13411, 13413, 13415, 13417, 13419, 13421, - 13423, 13425, 13427, 13429, 13431, 13433, 13435, 13437, 13439, 13441, - 13443, 13445, 13447, 13449, 13451, 13453, 13455, 13457, 13459, 13461, - 13463, 13465, 13467, 13469, 13471, 13473, 13475, 13477, 13479, 13481, - 13483, 13485, 13487, 13489, 13491, 13493, 13495, 13497, 13499, 13501, - 13503, 13505, 13507, 13509, 13511, 13513, 13515, 13517, 13519, 13521, - 13523, 13525, 13527, 13529, 13531, 13533, 13535, 13537, 13539, 13541, - 13543, 13545, 13547, 13549, 13551, 13553, 13555, 13557, 13559, 13561, - 13563, 13565, 13567, 13569, 13571, 13573, 13575, 13577, 13579, 13581, - 13583, 13585, 13587, 13589, 13591, 13593, 13595, 13597, 13599, 13601, - 13603, 13605, 13607, 13609, 13611, 13613, 13615, 13617, 13619, 13621, - 13623, 13625, 13627, 13629, 13631, 13633, 13635, 13637, 13639, 13641, - 13643, 13645, 13647, 13649, 13651, 13653, 13655, 13657, 13659, 13661, - 13663, 13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681, - 13683, 13685, 13687, 13689, 13691, 13693, 13695, 13697, 13699, 13701, - 13703, 13705, 13707, 13709, 13711, 13713, 13715, 13717, 13719, 13721, - 13723, 13725, 13727, 13729, 13731, 13733, 13735, 13737, 13739, 13741, - 13743, 13745, 13747, 13749, 13751, 13753, 13755, 13757, 13759, 13761, - 13763, 13765, 13767, 13769, 13771, 13773, 13775, 13777, 13779, 13781, - 13783, 13785, 13787, 13789, 13791, 13793, 13795, 13797, 13799, 13801, - 13803, 13805, 13807, 13809, 13811, 13813, 13815, 13817, 13819, 13821, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9414, 9418, 9422, 9426, 9430, 9434, 9438, 9442, 9446, 9450, 9454, 9458, + 9462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9466, 9470, 9474, + 9479, 9484, 9489, 9494, 9499, 9504, 9509, 9513, 9532, 9541, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9546, 9548, 9550, 9552, + 9554, 9556, 9558, 9560, 9562, 9564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9566, 9568, 9570, 9572, 9574, 9576, 9578, + 9580, 9582, 9584, 9586, 9588, 9590, 9592, 9594, 9596, 9598, 9600, 9602, + 9604, 9606, 0, 0, 9608, 9610, 9612, 9614, 9616, 9618, 9620, 9622, 9624, + 9626, 9628, 9630, 0, 9632, 9634, 9636, 9638, 9640, 9642, 9644, 9646, + 9648, 9650, 9652, 9654, 9656, 9658, 9660, 9662, 9664, 9666, 9668, 0, + 9670, 9672, 9674, 9676, 0, 0, 0, 0, 9678, 9681, 9684, 0, 9687, 0, 9690, + 9693, 9696, 9699, 9702, 9705, 9708, 9711, 9714, 9717, 9720, 9722, 9724, + 9726, 9728, 9730, 9732, 9734, 9736, 9738, 9740, 9742, 9744, 9746, 9748, + 9750, 9752, 9754, 9756, 9758, 9760, 9762, 9764, 9766, 9768, 9770, 9772, + 9774, 9776, 9778, 9780, 9782, 9784, 9786, 9788, 9790, 9792, 9794, 9796, + 9798, 9800, 9802, 9804, 9806, 9808, 9810, 9812, 9814, 9816, 9818, 9820, + 9822, 9824, 9826, 9828, 9830, 9832, 9834, 9836, 9838, 9840, 9842, 9844, + 9846, 9848, 9850, 9852, 9854, 9856, 9858, 9860, 9862, 9864, 9866, 9868, + 9870, 9872, 9874, 9876, 9878, 9880, 9882, 9884, 9886, 9888, 9890, 9892, + 9894, 9896, 9898, 9900, 9902, 9904, 9906, 9908, 9910, 9912, 9914, 9916, + 9918, 9920, 9922, 9924, 9926, 9928, 9930, 9932, 9934, 9936, 9938, 9940, + 9942, 9944, 9946, 9948, 9950, 9952, 9954, 9957, 9960, 9963, 9966, 9969, + 9972, 9975, 0, 0, 0, 0, 9978, 9980, 9982, 9984, 9986, 9988, 9990, 9992, + 9994, 9996, 9998, 10000, 10002, 10004, 10006, 10008, 10010, 10012, 10014, + 10016, 10018, 10020, 10022, 10024, 10026, 10028, 10030, 10032, 10034, + 10036, 10038, 10040, 10042, 10044, 10046, 10048, 10050, 10052, 10054, + 10056, 10058, 10060, 10062, 10064, 10066, 10068, 10070, 10072, 10074, + 10076, 10078, 10080, 10082, 10084, 10086, 10088, 10090, 10092, 10094, + 10096, 10098, 10100, 10102, 10104, 10106, 10108, 10110, 10112, 10114, + 10116, 10118, 10120, 10122, 10124, 10126, 10128, 10130, 10132, 10134, + 10136, 10138, 10140, 10142, 10144, 10146, 10148, 10150, 10152, 10154, + 10156, 10158, 10160, 10162, 10164, 10166, 10168, 10170, 10172, 10174, + 10176, 10178, 10180, 10182, 10184, 10186, 10188, 10190, 10192, 10194, + 10196, 10198, 10200, 10202, 10204, 10206, 10208, 10210, 10212, 10214, + 10216, 10218, 10220, 10222, 10224, 10226, 10228, 10230, 10232, 10234, + 10236, 10238, 10240, 10242, 10244, 10246, 10248, 10250, 10252, 10254, + 10256, 10258, 10260, 10262, 10264, 10266, 10268, 10270, 10272, 10274, + 10276, 10278, 10280, 10282, 10284, 10286, 10288, 10290, 10292, 10294, + 10296, 10298, 10300, 10302, 10304, 10306, 10308, 10310, 10312, 10314, + 10316, 10318, 10320, 10322, 10324, 10326, 10328, 10330, 10332, 10334, + 10336, 10338, 10340, 10342, 10344, 10346, 10348, 10350, 10352, 10354, + 10356, 0, 0, 0, 10358, 10360, 10362, 10364, 10366, 10368, 0, 0, 10370, + 10372, 10374, 10376, 10378, 10380, 0, 0, 10382, 10384, 10386, 10388, + 10390, 10392, 0, 0, 10394, 10396, 10398, 0, 0, 0, 10400, 10402, 10404, + 10406, 10408, 10410, 10412, 0, 10414, 10416, 10418, 10420, 10422, 10424, + 10426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10428, 0, 10431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10437, 10440, 10443, 10446, 10449, + 10452, 10455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10458, 10461, + 10464, 10467, 10470, 10473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10476, 10478, 10480, 10482, 10484, 10486, 10488, 10490, 10492, 10494, + 10496, 10498, 10500, 10502, 10504, 10506, 10508, 10510, 10512, 10514, + 10516, 10518, 10520, 10522, 10524, 10526, 10528, 10530, 10532, 10534, + 10536, 10538, 10540, 10542, 10544, 10546, 10548, 10550, 10552, 10554, + 10556, 10558, 10560, 10562, 10564, 10566, 10568, 10570, 10572, 10574, + 10576, 10578, 10580, 10582, 10584, 10586, 10588, 10590, 10592, 10594, + 10596, 10598, 10600, 10602, 10604, 10606, 10608, 10610, 10612, 10614, + 10616, 10618, 10620, 10622, 10624, 10626, 10628, 10630, 10632, 10634, + 10636, 10638, 10640, 10642, 10644, 0, 10646, 10648, 10650, 10652, 10654, + 10656, 10658, 10660, 10662, 10664, 10666, 10668, 10670, 10672, 10674, + 10676, 10678, 10680, 10682, 10684, 10686, 10688, 10690, 10692, 10694, + 10696, 10698, 10700, 10702, 10704, 10706, 10708, 10710, 10712, 10714, + 10716, 10718, 10720, 10722, 10724, 10726, 10728, 10730, 10732, 10734, + 10736, 10738, 10740, 10742, 10744, 10746, 10748, 10750, 10752, 10754, + 10756, 10758, 10760, 10762, 10764, 10766, 10768, 10770, 10772, 10774, + 10776, 10778, 10780, 10782, 10784, 10786, 0, 10788, 10790, 0, 0, 10792, + 0, 0, 10794, 10796, 0, 0, 10798, 10800, 10802, 10804, 0, 10806, 10808, + 10810, 10812, 10814, 10816, 10818, 10820, 10822, 10824, 10826, 10828, 0, + 10830, 0, 10832, 10834, 10836, 10838, 10840, 10842, 10844, 0, 10846, + 10848, 10850, 10852, 10854, 10856, 10858, 10860, 10862, 10864, 10866, + 10868, 10870, 10872, 10874, 10876, 10878, 10880, 10882, 10884, 10886, + 10888, 10890, 10892, 10894, 10896, 10898, 10900, 10902, 10904, 10906, + 10908, 10910, 10912, 10914, 10916, 10918, 10920, 10922, 10924, 10926, + 10928, 10930, 10932, 10934, 10936, 10938, 10940, 10942, 10944, 10946, + 10948, 10950, 10952, 10954, 10956, 10958, 10960, 10962, 10964, 10966, + 10968, 10970, 10972, 10974, 0, 10976, 10978, 10980, 10982, 0, 0, 10984, + 10986, 10988, 10990, 10992, 10994, 10996, 10998, 0, 11000, 11002, 11004, + 11006, 11008, 11010, 11012, 0, 11014, 11016, 11018, 11020, 11022, 11024, + 11026, 11028, 11030, 11032, 11034, 11036, 11038, 11040, 11042, 11044, + 11046, 11048, 11050, 11052, 11054, 11056, 11058, 11060, 11062, 11064, + 11066, 11068, 0, 11070, 11072, 11074, 11076, 0, 11078, 11080, 11082, + 11084, 11086, 0, 11088, 0, 0, 0, 11090, 11092, 11094, 11096, 11098, + 11100, 11102, 0, 11104, 11106, 11108, 11110, 11112, 11114, 11116, 11118, + 11120, 11122, 11124, 11126, 11128, 11130, 11132, 11134, 11136, 11138, + 11140, 11142, 11144, 11146, 11148, 11150, 11152, 11154, 11156, 11158, + 11160, 11162, 11164, 11166, 11168, 11170, 11172, 11174, 11176, 11178, + 11180, 11182, 11184, 11186, 11188, 11190, 11192, 11194, 11196, 11198, + 11200, 11202, 11204, 11206, 11208, 11210, 11212, 11214, 11216, 11218, + 11220, 11222, 11224, 11226, 11228, 11230, 11232, 11234, 11236, 11238, + 11240, 11242, 11244, 11246, 11248, 11250, 11252, 11254, 11256, 11258, + 11260, 11262, 11264, 11266, 11268, 11270, 11272, 11274, 11276, 11278, + 11280, 11282, 11284, 11286, 11288, 11290, 11292, 11294, 11296, 11298, + 11300, 11302, 11304, 11306, 11308, 11310, 11312, 11314, 11316, 11318, + 11320, 11322, 11324, 11326, 11328, 11330, 11332, 11334, 11336, 11338, + 11340, 11342, 11344, 11346, 11348, 11350, 11352, 11354, 11356, 11358, + 11360, 11362, 11364, 11366, 11368, 11370, 11372, 11374, 11376, 11378, + 11380, 11382, 11384, 11386, 11388, 11390, 11392, 11394, 11396, 11398, + 11400, 11402, 11404, 11406, 11408, 11410, 11412, 11414, 11416, 11418, + 11420, 11422, 11424, 11426, 11428, 11430, 11432, 11434, 11436, 11438, + 11440, 11442, 11444, 11446, 11448, 11450, 11452, 11454, 11456, 11458, + 11460, 11462, 11464, 11466, 11468, 11470, 11472, 11474, 11476, 11478, + 11480, 11482, 11484, 11486, 11488, 11490, 11492, 11494, 11496, 11498, + 11500, 11502, 11504, 11506, 11508, 11510, 11512, 11514, 11516, 11518, + 11520, 11522, 11524, 11526, 11528, 11530, 11532, 11534, 11536, 11538, + 11540, 11542, 11544, 11546, 11548, 11550, 11552, 11554, 11556, 11558, + 11560, 11562, 11564, 11566, 11568, 11570, 11572, 11574, 11576, 11578, + 11580, 11582, 11584, 11586, 11588, 11590, 11592, 11594, 11596, 11598, + 11600, 11602, 11604, 11606, 11608, 11610, 11612, 11614, 11616, 11618, + 11620, 11622, 11624, 11626, 11628, 11630, 11632, 11634, 11636, 11638, + 11640, 11642, 11644, 11646, 11648, 11650, 11652, 11654, 11656, 11658, + 11660, 11662, 11664, 11666, 11668, 11670, 11672, 11674, 11676, 11678, + 11680, 11682, 11684, 11686, 11688, 11690, 11692, 11694, 11696, 11698, + 11700, 11702, 11704, 11706, 11708, 11710, 11712, 11714, 11716, 11718, + 11720, 11722, 11724, 11726, 11728, 11730, 11732, 11734, 11736, 11738, + 11740, 11742, 11744, 11746, 11748, 11750, 11752, 11754, 11756, 11758, + 11760, 11762, 11764, 11766, 11768, 11770, 11772, 11774, 11776, 11778, + 11780, 11782, 0, 0, 11784, 11786, 11788, 11790, 11792, 11794, 11796, + 11798, 11800, 11802, 11804, 11806, 11808, 11810, 11812, 11814, 11816, + 11818, 11820, 11822, 11824, 11826, 11828, 11830, 11832, 11834, 11836, + 11838, 11840, 11842, 11844, 11846, 11848, 11850, 11852, 11854, 11856, + 11858, 11860, 11862, 11864, 11866, 11868, 11870, 11872, 11874, 11876, + 11878, 11880, 11882, 11884, 11886, 11888, 11890, 11892, 11894, 11896, + 11898, 11900, 11902, 11904, 11906, 11908, 11910, 11912, 11914, 11916, + 11918, 11920, 11922, 11924, 11926, 11928, 11930, 11932, 11934, 11936, + 11938, 11940, 11942, 11944, 11946, 11948, 11950, 11952, 11954, 11956, + 11958, 11960, 11962, 11964, 11966, 11968, 11970, 11972, 11974, 11976, + 11978, 11980, 11982, 11984, 11986, 11988, 11990, 11992, 11994, 11996, + 11998, 12000, 12002, 12004, 12006, 12008, 12010, 12012, 12014, 12016, + 12018, 12020, 12022, 12024, 12026, 12028, 12030, 12032, 12034, 12036, + 12038, 12040, 12042, 12044, 12046, 12048, 12050, 12052, 12054, 12056, + 12058, 12060, 12062, 12064, 12066, 12068, 12070, 12072, 12074, 12076, + 12078, 12080, 12082, 12084, 12086, 12088, 12090, 12092, 12094, 12096, + 12098, 12100, 12102, 12104, 12106, 12108, 12110, 12112, 12114, 12116, + 12118, 12120, 12122, 12124, 12126, 12128, 12130, 12132, 12134, 12136, + 12138, 12140, 12142, 12144, 12146, 12148, 12150, 12152, 12154, 12156, + 12158, 12160, 12162, 12164, 12166, 12168, 12170, 12172, 12174, 12176, + 12178, 12180, 12182, 12184, 12186, 12188, 12190, 12192, 12194, 12196, + 12198, 12200, 12202, 12204, 12206, 12208, 12210, 12212, 12214, 12216, + 12218, 12220, 12222, 12224, 12226, 12228, 12230, 12232, 12234, 12236, + 12238, 12240, 12242, 12244, 12246, 12248, 12250, 12252, 12254, 12256, + 12258, 12260, 12262, 12264, 12266, 12268, 12270, 12272, 12274, 12276, + 12278, 12280, 12282, 12284, 12286, 12288, 12290, 12292, 12294, 12296, + 12298, 12300, 12302, 12304, 12306, 12308, 12310, 12312, 12314, 12316, + 12318, 12320, 12322, 12324, 12326, 12328, 12330, 12332, 12334, 12336, + 12338, 12340, 12342, 12344, 12346, 12348, 12350, 12352, 12354, 12356, + 12358, 12360, 12362, 12364, 12366, 0, 0, 12368, 12370, 12372, 12374, + 12376, 12378, 12380, 12382, 12384, 12386, 12388, 12390, 12392, 12394, + 12396, 12398, 12400, 12402, 12404, 12406, 12408, 12410, 12412, 12414, + 12416, 12418, 12420, 12422, 12424, 12426, 12428, 12430, 12432, 12434, + 12436, 12438, 12440, 12442, 12444, 12446, 12448, 12450, 12452, 12454, + 12456, 12458, 12460, 12462, 12464, 12466, 12468, 12471, 12474, 12477, + 12480, 12483, 12486, 12489, 12492, 12495, 12498, 0, 0, 0, 0, 0, 12501, + 12505, 12509, 12513, 12517, 12521, 12525, 12529, 12533, 12537, 12541, + 12545, 12549, 12553, 12557, 12561, 12565, 12569, 12573, 12577, 12581, + 12585, 12589, 12593, 12597, 12601, 12605, 12609, 12611, 12613, 12616, 0, + 12619, 12621, 12623, 12625, 12627, 12629, 12631, 12633, 12635, 12637, + 12639, 12641, 12643, 12645, 12647, 12649, 12651, 12653, 12655, 12657, + 12659, 12661, 12663, 12665, 12667, 12669, 12671, 12674, 12677, 12680, + 12683, 12687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12690, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12693, 12696, 12699, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 12701, 12703, 12705, 12707, 12709, 12711, + 12713, 12715, 12717, 12719, 12721, 12723, 12725, 12727, 12729, 12731, + 12733, 12735, 12737, 12739, 12741, 12743, 12745, 12747, 12749, 12751, + 12753, 12755, 12757, 12759, 12761, 12763, 12765, 12767, 12769, 12771, + 12773, 12775, 12777, 12779, 12781, 12783, 12785, 0, 0, 0, 0, 0, 12787, + 12791, 12795, 12799, 12803, 12807, 12811, 12815, 12819, 0, 0, 0, 0, 0, 0, + 0, 12823, 12825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12827, 12829, 12831, 12833, 12835, + 12837, 12839, 12841, 12843, 12845, 12847, 12849, 12851, 12853, 12855, + 12857, 12859, 12861, 12863, 12865, 12867, 12869, 12871, 12873, 12875, + 12877, 12879, 12881, 12883, 12885, 12887, 12889, 12891, 12893, 12895, + 12897, 12899, 12901, 12903, 12905, 12907, 12909, 12911, 12913, 12915, + 12917, 12919, 12921, 12923, 12925, 12927, 12929, 12931, 12933, 12935, + 12937, 12939, 12941, 12943, 12945, 12947, 12949, 12951, 12953, 12955, + 12957, 12959, 12961, 12963, 12965, 12967, 12969, 12971, 12973, 12975, + 12977, 12979, 12981, 12983, 12985, 12987, 12989, 12991, 12993, 12995, + 12997, 12999, 13001, 13003, 13005, 13007, 13009, 13011, 13013, 13015, + 13017, 13019, 13021, 13023, 13025, 13027, 13029, 13031, 13033, 13035, + 13037, 13039, 13041, 13043, 13045, 13047, 13049, 13051, 13053, 13055, + 13057, 13059, 13061, 13063, 13065, 13067, 13069, 13071, 13073, 13075, + 13077, 13079, 13081, 13083, 13085, 13087, 13089, 13091, 13093, 13095, + 13097, 13099, 13101, 13103, 13105, 13107, 13109, 13111, 13113, 13115, + 13117, 13119, 13121, 13123, 13125, 13127, 13129, 13131, 13133, 13135, + 13137, 13139, 13141, 13143, 13145, 13147, 13149, 13151, 13153, 13155, + 13157, 13159, 13161, 13163, 13165, 13167, 13169, 13171, 13173, 13175, + 13177, 13179, 13181, 13183, 13185, 13187, 13189, 13191, 13193, 13195, + 13197, 13199, 13201, 13203, 13205, 13207, 13209, 13211, 13213, 13215, + 13217, 13219, 13221, 13223, 13225, 13227, 13229, 13231, 13233, 13235, + 13237, 13239, 13241, 13243, 13245, 13247, 13249, 13251, 13253, 13255, + 13257, 13259, 13261, 13263, 13265, 13267, 13269, 13271, 13273, 13275, + 13277, 13279, 13281, 13283, 13285, 13287, 13289, 13291, 13293, 13295, + 13297, 13299, 13301, 13303, 13305, 13307, 13309, 13311, 13313, 13315, + 13317, 13319, 13321, 13323, 13325, 13327, 13329, 13331, 13333, 13335, + 13337, 13339, 13341, 13343, 13345, 13347, 13349, 13351, 13353, 13355, + 13357, 13359, 13361, 13363, 13365, 13367, 13369, 13371, 13373, 13375, + 13377, 13379, 13381, 13383, 13385, 13387, 13389, 13391, 13393, 13395, + 13397, 13399, 13401, 13403, 13405, 13407, 13409, 13411, 13413, 13415, + 13417, 13419, 13421, 13423, 13425, 13427, 13429, 13431, 13433, 13435, + 13437, 13439, 13441, 13443, 13445, 13447, 13449, 13451, 13453, 13455, + 13457, 13459, 13461, 13463, 13465, 13467, 13469, 13471, 13473, 13475, + 13477, 13479, 13481, 13483, 13485, 13487, 13489, 13491, 13493, 13495, + 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13511, 13513, 13515, + 13517, 13519, 13521, 13523, 13525, 13527, 13529, 13531, 13533, 13535, + 13537, 13539, 13541, 13543, 13545, 13547, 13549, 13551, 13553, 13555, + 13557, 13559, 13561, 13563, 13565, 13567, 13569, 13571, 13573, 13575, + 13577, 13579, 13581, 13583, 13585, 13587, 13589, 13591, 13593, 13595, + 13597, 13599, 13601, 13603, 13605, 13607, 13609, 13611, 13613, 13615, + 13617, 13619, 13621, 13623, 13625, 13627, 13629, 13631, 13633, 13635, + 13637, 13639, 13641, 13643, 13645, 13647, 13649, 13651, 13653, 13655, + 13657, 13659, 13661, 13663, 13665, 13667, 13669, 13671, 13673, 13675, + 13677, 13679, 13681, 13683, 13685, 13687, 13689, 13691, 13693, 13695, + 13697, 13699, 13701, 13703, 13705, 13707, 13709, 13711, 13713, 13715, + 13717, 13719, 13721, 13723, 13725, 13727, 13729, 13731, 13733, 13735, + 13737, 13739, 13741, 13743, 13745, 13747, 13749, 13751, 13753, 13755, + 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771, 13773, 13775, + 13777, 13779, 13781, 13783, 13785, 13787, 13789, 13791, 13793, 13795, + 13797, 13799, 13801, 13803, 13805, 13807, 13809, 13811, 13813, 13815, + 13817, 13819, 13821, 13823, 13825, 13827, 13829, 13831, 13833, 13835, + 13837, 13839, 13841, 13843, 13845, 13847, 13849, 13851, 13853, 13855, + 13857, 13859, 13861, 13863, 13865, 13867, 13869, 13871, 13873, 13875, + 13877, 13879, 13881, 13883, 13885, 13887, 13889, 13891, 13893, 13895, + 13897, 13899, 13901, 13903, 13905, 13907, 13909, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, }; /* NFC pairs */ @@ -4929,6 +5040,8 @@ static const change_record change_records_3_2_0[] = { { 255, 29, 255, 255, 0 }, { 255, 26, 255, 255, 0 }, { 5, 255, 255, 255, 0 }, + { 14, 6, 255, 255, 0 }, + { 15, 255, 255, 255, 0 }, { 255, 255, 255, 255, 1.0 }, { 255, 255, 255, 255, 2.0 }, { 255, 255, 255, 255, 3.0 }, @@ -4957,6 +5070,7 @@ static const change_record change_records_3_2_0[] = { { 255, 255, 7, 255, 0 }, { 255, 255, 8, 255, 0 }, { 255, 255, 9, 255, 0 }, + { 255, 30, 255, 255, 0 }, { 19, 30, 255, 255, 0 }, { 255, 8, 255, 255, 0 }, { 255, 22, 255, 255, 0 }, @@ -4966,7 +5080,6 @@ static const change_record change_records_3_2_0[] = { { 255, 255, 255, 255, 1e+16 }, { 255, 255, 255, 255, 1e+20 }, { 255, 19, 255, 255, 0 }, - { 15, 255, 255, 255, 0 }, { 255, 19, 255, 255, -1 }, { 1, 255, 255, 0, 0 }, }; @@ -4986,58 +5099,60 @@ static unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 89, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 91, 92, 2, 2, 2, 2, 2, 2, 2, 2, 93, 48, 48, - 94, 95, 48, 96, 97, 98, 99, 100, 101, 102, 2, 103, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 94, 95, 48, 96, 97, 98, 99, 100, 101, 102, 103, 104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 105, 106, 107, 108, 109, 2, 2, 2, 2, 110, 111, 2, 112, 113, 114, - 115, 116, 117, 2, 118, 119, 120, 121, 122, 2, 2, 2, 2, 2, 2, 123, 2, 124, - 2, 125, 2, 126, 2, 127, 2, 2, 2, 128, 2, 2, 2, 2, 129, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 105, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 48, 48, 48, 48, 48, 48, 130, 2, 131, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 132, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 106, 107, 108, 109, 110, 111, 2, 2, 2, 112, 113, 2, 114, 115, + 116, 117, 118, 119, 2, 120, 121, 122, 123, 124, 2, 2, 2, 2, 2, 2, 125, 2, + 126, 2, 127, 2, 128, 2, 129, 2, 2, 2, 130, 2, 2, 2, 131, 132, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 48, 48, 48, 48, 48, 48, 133, 2, 134, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, + 135, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 136, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 137, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 138, 2, 139, 2, 140, 2, 2, 141, 2, 2, 2, 142, 143, 144, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 133, 2, 134, 2, 135, 2, 2, 136, 2, 2, 2, 137, 138, 139, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 145, + 146, 147, 148, 149, 2, 150, 151, 152, 153, 154, 155, 156, 139, 157, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 158, 159, 90, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 79, 160, 2, 161, 162, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 140, 141, 142, 143, - 144, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 145, 146, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 79, 147, 2, 148, 149, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 163, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 164, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 165, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 151, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 152, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 166, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 153, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 167, 48, 168, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 154, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 163, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -5271,9 +5386,8 @@ static unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 48, 169, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, - 155, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -5336,7 +5450,7 @@ static unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, }; static unsigned char changes_3_2_0_data[] = { @@ -5384,7 +5498,7 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5394,17 +5508,17 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, @@ -5417,20 +5531,20 @@ static unsigned char changes_3_2_0_data[] = { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 13, 14, 15, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 14, 15, 16, 17, 18, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5446,7 +5560,7 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5460,24 +5574,24 @@ static unsigned char changes_3_2_0_data[] = { 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, - 17, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, @@ -5514,8 +5628,8 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 20, 21, 22, 23, 24, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5533,17 +5647,17 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5582,10 +5696,10 @@ static unsigned char changes_3_2_0_data[] = { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, @@ -5606,29 +5720,29 @@ static unsigned char changes_3_2_0_data[] = { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 7, 7, 7, - 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 8, 0, - 0, 34, 35, 36, 37, 38, 39, 1, 1, 0, 0, 0, 8, 33, 6, 4, 5, 34, 35, 36, 37, - 38, 39, 1, 1, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 7, 7, 7, + 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 8, 0, + 0, 36, 37, 38, 39, 40, 41, 1, 1, 0, 0, 0, 8, 35, 6, 4, 5, 36, 37, 38, 39, + 40, 41, 1, 1, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5641,20 +5755,20 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 42, 43, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 45, 46, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5664,26 +5778,26 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 0, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 7, 7, 7, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 0, 0, 7, 7, 7, 7, 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, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, @@ -5704,8 +5818,8 @@ static unsigned char changes_3_2_0_data[] = { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, @@ -5721,7 +5835,7 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5729,7 +5843,7 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5753,26 +5867,26 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5780,23 +5894,23 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5806,25 +5920,25 @@ static unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5834,7 +5948,7 @@ static unsigned char changes_3_2_0_data[] = { 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5848,18 +5962,18 @@ static unsigned char changes_3_2_0_data[] = { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, @@ -5892,289 +6006,364 @@ static unsigned char changes_3_2_0_data[] = { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, - 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 0, 0, 0, 1, 1, 18, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 20, 20, 20, 20, 20, 20, 0, 0, 0, 1, 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 49, 49, 49, 0, 0, 0, 0, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 13, 13, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, + 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, + 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, - 7, 7, 0, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 0, 7, 7, 0, 0, 0, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 7, 0, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 0, 0, 0, 7, + 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 7, 7, 0, 0, 0, 0, 0, - 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 0, - 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 7, 7, 7, 7, 0, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, + 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, 51, - 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 7, 0, - 0, 0, 7, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 0, 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, + 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, + 7, 7, 0, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 0, 7, 0, 0, 7, 7, 7, 7, 0, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const change_record* get_change_3_2_0(Py_UCS4 n) diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h index 1a24cceaad0..8830560c1fb 100644 --- a/Modules/unicodename_db.h +++ b/Modules/unicodename_db.h @@ -1,4 +1,4 @@ -/* this file was generated by Tools/unicode/makeunicodedata.py 2.6 */ +/* this file was generated by Tools/unicode/makeunicodedata.py 3.2 */ #define NAME_MAXLEN 256 @@ -11,136 +11,137 @@ static unsigned char lexicon[] = { 67, 79, 77, 80, 65, 84, 73, 66, 73, 76, 73, 84, 217, 77, 65, 84, 72, 69, 77, 65, 84, 73, 67, 65, 204, 67, 85, 78, 69, 73, 70, 79, 82, 205, 83, 89, 77, 66, 79, 204, 70, 79, 82, 77, 128, 67, 65, 78, 65, 68, 73, 65, 206, - 83, 89, 76, 76, 65, 66, 73, 67, 211, 68, 73, 71, 73, 212, 66, 79, 76, - 196, 72, 65, 78, 71, 85, 204, 71, 82, 69, 69, 203, 76, 73, 71, 65, 84, - 85, 82, 197, 65, 78, 196, 77, 85, 83, 73, 67, 65, 204, 84, 73, 77, 69, - 211, 69, 84, 72, 73, 79, 80, 73, 195, 86, 79, 87, 69, 204, 73, 84, 65, - 76, 73, 195, 67, 89, 82, 73, 76, 76, 73, 195, 82, 65, 68, 73, 67, 65, - 204, 83, 65, 78, 83, 45, 83, 69, 82, 73, 198, 67, 73, 82, 67, 76, 69, - 196, 70, 79, 210, 67, 79, 77, 66, 73, 78, 73, 78, 199, 84, 65, 201, 86, - 65, 201, 70, 73, 78, 65, 204, 83, 81, 85, 65, 82, 197, 86, 65, 82, 73, - 65, 84, 73, 79, 206, 76, 69, 70, 212, 66, 82, 65, 73, 76, 76, 197, 80, - 65, 84, 84, 69, 82, 206, 82, 73, 71, 72, 212, 66, 89, 90, 65, 78, 84, 73, - 78, 197, 73, 83, 79, 76, 65, 84, 69, 196, 194, 65, 66, 79, 86, 69, 128, - 68, 79, 85, 66, 76, 197, 75, 65, 84, 65, 75, 65, 78, 193, 75, 65, 78, 71, - 88, 201, 78, 85, 77, 66, 69, 210, 83, 73, 71, 78, 128, 66, 69, 76, 79, - 87, 128, 76, 73, 78, 69, 65, 210, 77, 79, 68, 73, 70, 73, 69, 210, 84, - 73, 66, 69, 84, 65, 206, 65, 128, 68, 79, 212, 77, 69, 69, 205, 77, 89, - 65, 78, 77, 65, 210, 67, 65, 82, 82, 73, 69, 210, 65, 82, 82, 79, 87, - 128, 73, 78, 73, 84, 73, 65, 204, 87, 72, 73, 84, 197, 85, 128, 86, 69, - 82, 84, 73, 67, 65, 204, 89, 69, 200, 65, 66, 79, 86, 197, 73, 128, 79, - 128, 67, 79, 80, 84, 73, 195, 65, 82, 82, 79, 215, 77, 79, 78, 71, 79, - 76, 73, 65, 206, 77, 65, 82, 75, 128, 75, 72, 77, 69, 210, 68, 69, 86, - 65, 78, 65, 71, 65, 82, 201, 84, 73, 76, 197, 80, 65, 82, 69, 78, 84, 72, - 69, 83, 73, 90, 69, 196, 84, 72, 65, 205, 66, 76, 65, 67, 203, 74, 79, - 78, 71, 83, 69, 79, 78, 199, 66, 79, 216, 72, 69, 66, 82, 69, 215, 80, - 76, 85, 211, 68, 82, 65, 87, 73, 78, 71, 211, 82, 73, 71, 72, 84, 87, 65, - 82, 68, 211, 67, 72, 79, 83, 69, 79, 78, 199, 83, 84, 82, 79, 75, 69, - 128, 72, 65, 76, 70, 87, 73, 68, 84, 200, 66, 65, 76, 73, 78, 69, 83, - 197, 71, 69, 79, 82, 71, 73, 65, 206, 72, 79, 79, 75, 128, 73, 68, 69, - 79, 71, 82, 65, 205, 73, 68, 69, 79, 71, 82, 65, 80, 72, 73, 195, 65, 76, - 69, 198, 83, 89, 77, 66, 79, 76, 128, 84, 79, 128, 83, 67, 82, 73, 80, - 212, 84, 87, 79, 128, 79, 86, 69, 210, 213, 72, 69, 65, 86, 217, 79, 78, - 69, 128, 85, 208, 76, 79, 215, 70, 85, 76, 76, 87, 73, 68, 84, 200, 72, - 65, 200, 68, 79, 87, 206, 69, 81, 85, 65, 204, 66, 82, 65, 67, 75, 69, - 84, 128, 72, 73, 71, 200, 79, 198, 84, 65, 199, 68, 79, 77, 73, 78, 207, - 78, 85, 77, 69, 82, 73, 195, 70, 82, 65, 75, 84, 85, 210, 74, 85, 78, 71, - 83, 69, 79, 78, 199, 77, 65, 76, 65, 89, 65, 76, 65, 205, 84, 87, 207, - 71, 76, 65, 71, 79, 76, 73, 84, 73, 195, 67, 72, 65, 82, 65, 67, 84, 69, - 210, 76, 69, 70, 84, 87, 65, 82, 68, 211, 77, 69, 68, 73, 65, 204, 84, - 69, 76, 85, 71, 213, 66, 69, 78, 71, 65, 76, 201, 79, 78, 197, 65, 82, - 77, 69, 78, 73, 65, 206, 74, 65, 86, 65, 78, 69, 83, 197, 74, 69, 69, - 205, 66, 65, 82, 128, 72, 73, 82, 65, 71, 65, 78, 193, 87, 69, 83, 84, - 45, 67, 82, 69, 197, 73, 68, 69, 79, 71, 82, 65, 80, 200, 66, 65, 77, 85, - 205, 84, 72, 65, 201, 75, 65, 78, 78, 65, 68, 193, 67, 72, 69, 82, 79, - 75, 69, 197, 72, 65, 76, 198, 84, 79, 78, 197, 78, 69, 215, 79, 82, 73, - 89, 193, 84, 72, 82, 69, 197, 67, 72, 65, 205, 71, 85, 74, 65, 82, 65, - 84, 201, 76, 85, 197, 70, 79, 85, 82, 128, 72, 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, 84, 72, 82, 69, 69, 128, 68, 69, 83, 69, 82, 69, 212, 83, 73, - 78, 72, 65, 76, 193, 71, 85, 82, 77, 85, 75, 72, 201, 77, 65, 82, 203, - 78, 79, 84, 65, 84, 73, 79, 206, 83, 89, 82, 73, 65, 195, 86, 79, 67, 65, - 76, 73, 195, 65, 67, 85, 84, 69, 128, 76, 69, 80, 67, 72, 193, 76, 73, - 71, 72, 212, 76, 79, 78, 199, 84, 85, 82, 75, 73, 195, 68, 79, 85, 66, - 76, 69, 45, 83, 84, 82, 85, 67, 203, 70, 73, 86, 69, 128, 75, 65, 128, - 84, 65, 77, 73, 204, 86, 73, 69, 212, 65, 80, 204, 70, 85, 78, 67, 84, - 73, 79, 78, 65, 204, 72, 65, 77, 90, 193, 83, 73, 88, 128, 84, 69, 76, - 69, 71, 82, 65, 80, 200, 89, 65, 128, 69, 73, 71, 72, 84, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 204, 80, 65, 128, 68, 79, 84, 211, 78, 73, - 78, 69, 128, 83, 69, 86, 69, 78, 128, 66, 65, 82, 194, 68, 65, 83, 73, - 193, 75, 65, 73, 84, 72, 201, 76, 73, 77, 66, 213, 77, 65, 128, 77, 65, - 75, 83, 85, 82, 193, 83, 128, 84, 207, 66, 79, 80, 79, 77, 79, 70, 207, - 75, 72, 65, 82, 79, 83, 72, 84, 72, 201, 76, 65, 207, 82, 65, 128, 83, - 81, 85, 65, 82, 69, 196, 72, 69, 88, 65, 71, 82, 65, 205, 75, 193, 78, - 65, 128, 80, 83, 73, 76, 201, 82, 69, 86, 69, 82, 83, 69, 196, 77, 79, - 78, 79, 83, 80, 65, 67, 197, 78, 79, 212, 83, 65, 77, 65, 82, 73, 84, 65, - 206, 83, 84, 82, 79, 75, 197, 84, 85, 82, 78, 69, 196, 86, 128, 90, 90, - 89, 88, 128, 90, 90, 89, 84, 128, 90, 90, 89, 82, 88, 128, 90, 90, 89, - 82, 128, 90, 90, 89, 80, 128, 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, - 90, 85, 82, 88, 128, 90, 90, 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, - 85, 128, 90, 90, 79, 88, 128, 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, - 90, 73, 88, 128, 90, 90, 73, 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, - 69, 88, 128, 90, 90, 73, 69, 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, - 73, 69, 128, 90, 90, 73, 128, 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, - 90, 90, 69, 69, 128, 90, 90, 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, - 84, 128, 90, 90, 65, 80, 128, 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, - 89, 71, 79, 83, 128, 90, 87, 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, - 128, 90, 85, 84, 128, 90, 85, 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, - 79, 128, 90, 85, 77, 128, 90, 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, - 85, 181, 90, 82, 65, 128, 90, 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, - 79, 79, 128, 90, 79, 65, 128, 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, - 76, 193, 90, 74, 69, 128, 90, 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, - 90, 73, 78, 79, 82, 128, 90, 73, 76, 68, 69, 128, 90, 73, 71, 90, 65, - 199, 90, 73, 71, 128, 90, 73, 68, 193, 90, 73, 66, 128, 90, 73, 194, 90, - 73, 51, 128, 90, 201, 90, 72, 89, 88, 128, 90, 72, 89, 84, 128, 90, 72, - 89, 82, 88, 128, 90, 72, 89, 82, 128, 90, 72, 89, 80, 128, 90, 72, 89, - 128, 90, 72, 87, 69, 128, 90, 72, 87, 65, 128, 90, 72, 85, 88, 128, 90, - 72, 85, 84, 128, 90, 72, 85, 82, 88, 128, 90, 72, 85, 82, 128, 90, 72, - 85, 80, 128, 90, 72, 85, 79, 88, 128, 90, 72, 85, 79, 80, 128, 90, 72, - 85, 79, 128, 90, 72, 85, 128, 90, 72, 79, 88, 128, 90, 72, 79, 84, 128, - 90, 72, 79, 80, 128, 90, 72, 79, 79, 128, 90, 72, 79, 128, 90, 72, 73, - 86, 69, 84, 69, 128, 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, - 84, 128, 90, 72, 69, 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, - 72, 197, 90, 72, 65, 88, 128, 90, 72, 65, 84, 128, 90, 72, 65, 82, 128, - 90, 72, 65, 80, 128, 90, 72, 65, 73, 78, 128, 90, 72, 65, 65, 128, 90, - 72, 65, 128, 90, 72, 128, 90, 69, 84, 65, 128, 90, 69, 82, 79, 128, 90, - 69, 82, 207, 90, 69, 78, 128, 90, 69, 77, 76, 89, 65, 128, 90, 69, 77, - 76, 74, 65, 128, 90, 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, - 89, 73, 78, 128, 90, 65, 89, 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, - 128, 90, 65, 84, 65, 128, 90, 65, 82, 81, 65, 128, 90, 65, 81, 69, 198, - 90, 65, 77, 88, 128, 90, 65, 204, 90, 65, 73, 78, 128, 90, 65, 73, 206, - 90, 65, 73, 128, 90, 65, 72, 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, - 69, 70, 128, 90, 48, 49, 54, 72, 128, 90, 48, 49, 54, 71, 128, 90, 48, - 49, 54, 70, 128, 90, 48, 49, 54, 69, 128, 90, 48, 49, 54, 68, 128, 90, - 48, 49, 54, 67, 128, 90, 48, 49, 54, 66, 128, 90, 48, 49, 54, 65, 128, - 90, 48, 49, 54, 128, 90, 48, 49, 53, 73, 128, 90, 48, 49, 53, 72, 128, - 90, 48, 49, 53, 71, 128, 90, 48, 49, 53, 70, 128, 90, 48, 49, 53, 69, - 128, 90, 48, 49, 53, 68, 128, 90, 48, 49, 53, 67, 128, 90, 48, 49, 53, - 66, 128, 90, 48, 49, 53, 65, 128, 90, 48, 49, 53, 128, 90, 48, 49, 52, - 128, 90, 48, 49, 51, 128, 90, 48, 49, 50, 128, 90, 48, 49, 49, 128, 90, - 48, 49, 48, 128, 90, 48, 48, 57, 128, 90, 48, 48, 56, 128, 90, 48, 48, - 55, 128, 90, 48, 48, 54, 128, 90, 48, 48, 53, 65, 128, 90, 48, 48, 53, - 128, 90, 48, 48, 52, 65, 128, 90, 48, 48, 52, 128, 90, 48, 48, 51, 66, - 128, 90, 48, 48, 51, 65, 128, 90, 48, 48, 51, 128, 90, 48, 48, 50, 68, - 128, 90, 48, 48, 50, 67, 128, 90, 48, 48, 50, 66, 128, 90, 48, 48, 50, - 65, 128, 90, 48, 48, 50, 128, 90, 48, 48, 49, 128, 90, 128, 218, 89, 89, - 88, 128, 89, 89, 84, 128, 89, 89, 82, 88, 128, 89, 89, 82, 128, 89, 89, - 80, 128, 89, 89, 69, 128, 89, 89, 65, 128, 89, 89, 128, 89, 87, 79, 79, - 128, 89, 87, 79, 128, 89, 87, 73, 73, 128, 89, 87, 73, 128, 89, 87, 69, - 128, 89, 87, 65, 65, 128, 89, 87, 65, 128, 89, 86, 128, 89, 85, 88, 128, - 89, 85, 85, 75, 65, 76, 69, 65, 80, 73, 78, 84, 85, 128, 89, 85, 84, 128, - 89, 85, 83, 128, 89, 85, 211, 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, - 85, 81, 128, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, 79, 84, 128, - 89, 85, 79, 80, 128, 89, 85, 79, 128, 89, 85, 68, 72, 128, 89, 85, 68, - 200, 89, 85, 65, 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, - 69, 128, 89, 85, 45, 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, - 89, 85, 45, 69, 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, - 89, 85, 45, 65, 128, 89, 85, 128, 89, 213, 89, 80, 83, 73, 76, 73, 128, - 89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, 73, 83, 128, - 89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, 82, 65, 77, - 77, 69, 78, 73, 128, 89, 79, 89, 128, 89, 79, 88, 128, 89, 79, 85, 84, - 72, 70, 85, 76, 78, 69, 83, 83, 128, 89, 79, 85, 84, 72, 70, 85, 204, 89, - 79, 84, 128, 89, 79, 82, 73, 128, 89, 79, 81, 128, 89, 79, 80, 128, 89, + 83, 89, 76, 76, 65, 66, 73, 67, 211, 66, 65, 77, 85, 205, 68, 73, 71, 73, + 212, 66, 79, 76, 196, 72, 65, 78, 71, 85, 204, 65, 78, 196, 71, 82, 69, + 69, 203, 76, 73, 71, 65, 84, 85, 82, 197, 77, 85, 83, 73, 67, 65, 204, + 69, 84, 72, 73, 79, 80, 73, 195, 84, 73, 77, 69, 211, 86, 79, 87, 69, + 204, 70, 79, 210, 73, 84, 65, 76, 73, 195, 67, 89, 82, 73, 76, 76, 73, + 195, 82, 65, 68, 73, 67, 65, 204, 83, 65, 78, 83, 45, 83, 69, 82, 73, + 198, 67, 73, 82, 67, 76, 69, 196, 67, 79, 77, 66, 73, 78, 73, 78, 199, + 84, 65, 201, 86, 65, 201, 70, 73, 78, 65, 204, 83, 81, 85, 65, 82, 197, + 76, 69, 70, 212, 86, 65, 82, 73, 65, 84, 73, 79, 206, 66, 82, 65, 73, 76, + 76, 197, 80, 65, 84, 84, 69, 82, 206, 82, 73, 71, 72, 212, 66, 89, 90, + 65, 78, 84, 73, 78, 197, 73, 83, 79, 76, 65, 84, 69, 196, 65, 66, 79, 86, + 69, 128, 78, 85, 77, 66, 69, 210, 68, 79, 85, 66, 76, 197, 83, 73, 71, + 78, 128, 194, 66, 69, 76, 79, 87, 128, 75, 65, 84, 65, 75, 65, 78, 193, + 75, 65, 78, 71, 88, 201, 76, 73, 78, 69, 65, 210, 77, 79, 68, 73, 70, 73, + 69, 210, 84, 73, 66, 69, 84, 65, 206, 65, 128, 68, 79, 212, 77, 69, 69, + 205, 77, 89, 65, 78, 77, 65, 210, 79, 198, 67, 65, 82, 82, 73, 69, 210, + 87, 72, 73, 84, 197, 65, 82, 82, 79, 87, 128, 85, 128, 73, 78, 73, 84, + 73, 65, 204, 86, 69, 82, 84, 73, 67, 65, 204, 73, 128, 89, 69, 200, 79, + 128, 65, 82, 82, 79, 215, 77, 65, 82, 75, 128, 65, 66, 79, 86, 197, 67, + 79, 80, 84, 73, 195, 80, 72, 65, 83, 69, 45, 197, 77, 79, 78, 71, 79, 76, + 73, 65, 206, 68, 69, 86, 65, 78, 65, 71, 65, 82, 201, 66, 76, 65, 67, + 203, 75, 72, 77, 69, 210, 84, 73, 76, 197, 80, 65, 82, 69, 78, 84, 72, + 69, 83, 73, 90, 69, 196, 83, 89, 77, 66, 79, 76, 128, 84, 72, 65, 205, + 74, 79, 78, 71, 83, 69, 79, 78, 199, 83, 84, 82, 79, 75, 69, 128, 83, 81, + 85, 65, 82, 69, 196, 66, 79, 216, 72, 69, 66, 82, 69, 215, 80, 76, 85, + 211, 82, 73, 71, 72, 84, 87, 65, 82, 68, 211, 68, 82, 65, 87, 73, 78, 71, + 211, 67, 72, 79, 83, 69, 79, 78, 199, 72, 65, 76, 70, 87, 73, 68, 84, + 200, 66, 65, 76, 73, 78, 69, 83, 197, 71, 69, 79, 82, 71, 73, 65, 206, + 72, 79, 79, 75, 128, 73, 68, 69, 79, 71, 82, 65, 205, 80, 72, 65, 83, 69, + 45, 196, 65, 76, 67, 72, 69, 77, 73, 67, 65, 204, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 73, 195, 65, 76, 69, 198, 72, 69, 65, 86, 217, 84, 79, 128, + 84, 87, 79, 128, 79, 86, 69, 210, 213, 66, 82, 65, 72, 77, 201, 83, 67, + 82, 73, 80, 212, 85, 208, 76, 79, 215, 79, 78, 69, 128, 84, 87, 207, 68, + 79, 87, 206, 70, 85, 76, 76, 87, 73, 68, 84, 200, 72, 65, 200, 79, 78, + 197, 69, 81, 85, 65, 204, 72, 73, 71, 200, 66, 82, 65, 67, 75, 69, 84, + 128, 84, 65, 199, 68, 79, 77, 73, 78, 207, 78, 85, 77, 69, 82, 73, 195, + 70, 82, 65, 75, 84, 85, 210, 77, 65, 76, 65, 89, 65, 76, 65, 205, 80, 72, + 65, 83, 69, 45, 195, 76, 69, 70, 84, 87, 65, 82, 68, 211, 84, 72, 82, 69, + 197, 66, 65, 82, 128, 74, 85, 78, 71, 83, 69, 79, 78, 199, 71, 76, 65, + 71, 79, 76, 73, 84, 73, 195, 67, 72, 65, 82, 65, 67, 84, 69, 210, 77, 69, + 68, 73, 65, 204, 84, 69, 76, 85, 71, 213, 66, 69, 78, 71, 65, 76, 201, + 65, 82, 77, 69, 78, 73, 65, 206, 72, 73, 82, 65, 71, 65, 78, 193, 73, 68, + 69, 79, 71, 82, 65, 80, 200, 74, 65, 86, 65, 78, 69, 83, 197, 74, 69, 69, + 205, 78, 69, 71, 65, 84, 73, 86, 197, 79, 82, 73, 89, 193, 87, 69, 83, + 84, 45, 67, 82, 69, 197, 72, 65, 76, 198, 77, 65, 82, 203, 80, 72, 65, + 83, 69, 45, 193, 84, 72, 65, 201, 75, 65, 78, 78, 65, 68, 193, 78, 69, + 215, 67, 72, 69, 82, 79, 75, 69, 197, 72, 65, 128, 84, 79, 78, 197, 86, + 79, 67, 65, 76, 73, 195, 67, 72, 65, 205, 70, 79, 85, 82, 128, 71, 85, + 74, 65, 82, 65, 84, 201, 76, 85, 197, 84, 72, 82, 69, 69, 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, 83, 73, 78, 72, 65, 76, + 193, 71, 85, 82, 77, 85, 75, 72, 201, 78, 79, 84, 65, 84, 73, 79, 206, + 83, 89, 82, 73, 65, 195, 68, 79, 84, 211, 76, 73, 71, 72, 212, 84, 65, + 77, 73, 204, 65, 67, 85, 84, 69, 128, 70, 73, 86, 69, 128, 75, 65, 128, + 76, 69, 80, 67, 72, 193, 76, 79, 78, 199, 84, 85, 82, 75, 73, 195, 89, + 65, 128, 68, 79, 85, 66, 76, 69, 45, 83, 84, 82, 85, 67, 203, 77, 65, + 128, 83, 73, 88, 128, 86, 73, 69, 212, 72, 65, 77, 90, 193, 80, 65, 128, + 65, 80, 204, 69, 73, 71, 72, 84, 128, 70, 85, 78, 67, 84, 73, 79, 78, 65, + 204, 83, 128, 83, 69, 86, 69, 78, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 204, 78, 73, 78, 69, 128, 84, 69, 76, 69, 71, 82, 65, 80, 200, 66, + 79, 80, 79, 77, 79, 70, 207, 82, 65, 128, 78, 65, 128, 66, 65, 82, 194, + 68, 65, 83, 73, 193, 75, 65, 73, 84, 72, 201, 76, 73, 77, 66, 213, 77, + 65, 75, 83, 85, 82, 193, 84, 207, 90, 90, 89, 88, 128, 90, 90, 89, 84, + 128, 90, 90, 89, 82, 88, 128, 90, 90, 89, 82, 128, 90, 90, 89, 80, 128, + 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, 90, 90, + 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 79, 88, 128, + 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, 90, 73, 88, 128, 90, 90, 73, + 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, 69, 88, 128, 90, 90, 73, 69, + 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, 73, 69, 128, 90, 90, 73, 128, + 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, 90, 90, 69, 69, 128, 90, 90, + 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, 84, 128, 90, 90, 65, 80, 128, + 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, 89, 71, 79, 83, 128, 90, 87, + 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, 128, 90, 85, + 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, 77, 128, 90, + 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 82, 65, 128, 90, + 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, 79, 79, 128, 90, 79, 65, 128, + 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, 74, 69, 128, 90, + 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 78, 79, 82, 128, 90, + 73, 76, 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, 73, 71, 128, 90, 73, + 68, 193, 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, 128, 90, 201, 90, 72, + 89, 88, 128, 90, 72, 89, 84, 128, 90, 72, 89, 82, 88, 128, 90, 72, 89, + 82, 128, 90, 72, 89, 80, 128, 90, 72, 89, 128, 90, 72, 87, 69, 128, 90, + 72, 87, 65, 128, 90, 72, 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85, + 82, 88, 128, 90, 72, 85, 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79, + 88, 128, 90, 72, 85, 79, 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128, + 90, 72, 79, 88, 128, 90, 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72, + 79, 79, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, 128, 90, 72, + 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, 84, 128, 90, 72, 69, 80, 128, + 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, 72, 197, 90, 72, 65, 88, 128, + 90, 72, 65, 84, 128, 90, 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72, + 65, 73, 78, 128, 90, 72, 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90, + 69, 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, 82, 207, 90, 69, 78, 128, + 90, 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, 90, 69, 50, + 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, 128, 90, 65, 89, + 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, 128, 90, + 65, 82, 81, 65, 128, 90, 65, 81, 69, 198, 90, 65, 77, 88, 128, 90, 65, + 204, 90, 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, 65, 72, + 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 48, 49, 54, + 72, 128, 90, 48, 49, 54, 71, 128, 90, 48, 49, 54, 70, 128, 90, 48, 49, + 54, 69, 128, 90, 48, 49, 54, 68, 128, 90, 48, 49, 54, 67, 128, 90, 48, + 49, 54, 66, 128, 90, 48, 49, 54, 65, 128, 90, 48, 49, 54, 128, 90, 48, + 49, 53, 73, 128, 90, 48, 49, 53, 72, 128, 90, 48, 49, 53, 71, 128, 90, + 48, 49, 53, 70, 128, 90, 48, 49, 53, 69, 128, 90, 48, 49, 53, 68, 128, + 90, 48, 49, 53, 67, 128, 90, 48, 49, 53, 66, 128, 90, 48, 49, 53, 65, + 128, 90, 48, 49, 53, 128, 90, 48, 49, 52, 128, 90, 48, 49, 51, 128, 90, + 48, 49, 50, 128, 90, 48, 49, 49, 128, 90, 48, 49, 48, 128, 90, 48, 48, + 57, 128, 90, 48, 48, 56, 128, 90, 48, 48, 55, 128, 90, 48, 48, 54, 128, + 90, 48, 48, 53, 65, 128, 90, 48, 48, 53, 128, 90, 48, 48, 52, 65, 128, + 90, 48, 48, 52, 128, 90, 48, 48, 51, 66, 128, 90, 48, 48, 51, 65, 128, + 90, 48, 48, 51, 128, 90, 48, 48, 50, 68, 128, 90, 48, 48, 50, 67, 128, + 90, 48, 48, 50, 66, 128, 90, 48, 48, 50, 65, 128, 90, 48, 48, 50, 128, + 90, 48, 48, 49, 128, 90, 128, 218, 89, 89, 88, 128, 89, 89, 84, 128, 89, + 89, 82, 88, 128, 89, 89, 82, 128, 89, 89, 80, 128, 89, 89, 69, 128, 89, + 89, 65, 128, 89, 89, 128, 89, 87, 79, 79, 128, 89, 87, 79, 128, 89, 87, + 73, 73, 128, 89, 87, 73, 128, 89, 87, 69, 128, 89, 87, 65, 65, 128, 89, + 87, 65, 128, 89, 86, 128, 89, 85, 88, 128, 89, 85, 87, 79, 81, 128, 89, + 85, 85, 75, 65, 76, 69, 65, 80, 73, 78, 84, 85, 128, 89, 85, 84, 128, 89, + 85, 83, 128, 89, 85, 211, 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, 85, + 81, 128, 89, 85, 209, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, 79, + 84, 128, 89, 85, 79, 80, 128, 89, 85, 79, 77, 128, 89, 85, 79, 128, 89, + 85, 78, 128, 89, 85, 77, 128, 89, 85, 69, 81, 128, 89, 85, 69, 128, 89, + 85, 68, 72, 128, 89, 85, 68, 200, 89, 85, 65, 78, 128, 89, 85, 65, 69, + 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, 69, 128, 89, 85, + 45, 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, 89, 85, 45, 69, + 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, 89, 85, 45, 65, + 128, 89, 85, 128, 89, 213, 89, 80, 83, 73, 76, 73, 128, 89, 80, 79, 82, + 82, 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, 73, 83, 128, 89, 80, 79, 75, + 82, 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, + 128, 89, 79, 89, 128, 89, 79, 88, 128, 89, 79, 85, 84, 72, 70, 85, 76, + 78, 69, 83, 83, 128, 89, 79, 85, 84, 72, 70, 85, 204, 89, 79, 84, 128, + 89, 79, 82, 73, 128, 89, 79, 81, 128, 89, 79, 209, 89, 79, 80, 128, 89, 79, 79, 128, 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 72, 128, 89, 79, 68, 128, 89, 79, 196, 89, 79, 65, 128, 89, 79, 45, 89, 69, 79, 128, 89, 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, 65, 128, 89, 79, @@ -148,19 +149,22 @@ static unsigned char lexicon[] = { 65, 69, 128, 89, 79, 45, 65, 128, 89, 79, 128, 89, 207, 89, 73, 90, 69, 84, 128, 89, 73, 88, 128, 89, 73, 87, 78, 128, 89, 73, 84, 128, 89, 73, 80, 128, 89, 73, 78, 71, 128, 89, 73, 73, 128, 89, 73, 199, 89, 73, 69, - 88, 128, 89, 73, 69, 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 128, 89, - 73, 68, 68, 73, 83, 200, 89, 73, 45, 85, 128, 89, 73, 128, 89, 70, 69, - 83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, 70, 69, 206, 89, 69, 89, - 128, 89, 69, 87, 128, 89, 69, 84, 73, 86, 128, 89, 69, 83, 84, 85, 128, - 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, - 69, 85, 78, 71, 45, 80, 65, 78, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, - 85, 78, 71, 45, 77, 73, 69, 85, 77, 128, 89, 69, 83, 73, 69, 85, 78, 71, - 45, 72, 73, 69, 85, 72, 128, 89, 69, 83, 73, 69, 85, 78, 71, 128, 89, 69, - 82, 85, 128, 89, 69, 82, 213, 89, 69, 82, 73, 128, 89, 69, 82, 65, 200, - 89, 69, 82, 128, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 89, 69, - 79, 45, 89, 65, 128, 89, 69, 79, 45, 85, 128, 89, 69, 79, 45, 79, 128, - 89, 69, 78, 73, 83, 69, 201, 89, 69, 78, 65, 80, 128, 89, 69, 206, 89, - 69, 76, 76, 79, 87, 128, 89, 69, 72, 128, 89, 69, 69, 128, 89, 69, 65, + 88, 128, 89, 73, 69, 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 69, 128, + 89, 73, 69, 128, 89, 73, 68, 68, 73, 83, 200, 89, 73, 45, 85, 128, 89, + 73, 128, 89, 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, 70, + 69, 206, 89, 69, 89, 128, 89, 69, 87, 128, 89, 69, 85, 88, 128, 89, 69, + 85, 82, 65, 69, 128, 89, 69, 85, 81, 128, 89, 69, 85, 77, 128, 89, 69, + 85, 65, 69, 84, 128, 89, 69, 85, 65, 69, 128, 89, 69, 84, 73, 86, 128, + 89, 69, 83, 84, 85, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, + 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, 65, 78, 83, 73, 79, 83, + 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, 77, 128, 89, 69, + 83, 73, 69, 85, 78, 71, 45, 72, 73, 69, 85, 72, 128, 89, 69, 83, 73, 69, + 85, 78, 71, 128, 89, 69, 82, 85, 128, 89, 69, 82, 213, 89, 69, 82, 73, + 128, 89, 69, 82, 65, 200, 89, 69, 82, 128, 89, 69, 79, 82, 73, 78, 72, + 73, 69, 85, 72, 128, 89, 69, 79, 45, 89, 65, 128, 89, 69, 79, 45, 85, + 128, 89, 69, 79, 45, 79, 128, 89, 69, 78, 73, 83, 69, 201, 89, 69, 78, + 65, 80, 128, 89, 69, 78, 128, 89, 69, 206, 89, 69, 76, 76, 79, 87, 128, + 89, 69, 76, 76, 79, 215, 89, 69, 72, 128, 89, 69, 69, 128, 89, 69, 65, 210, 89, 69, 65, 128, 89, 65, 90, 90, 128, 89, 65, 90, 72, 128, 89, 65, 90, 128, 89, 65, 89, 65, 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87, 128, 89, 65, 86, 128, 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65, @@ -172,1393 +176,1603 @@ static unsigned char lexicon[] = { 75, 72, 128, 89, 65, 75, 65, 83, 72, 128, 89, 65, 75, 128, 89, 65, 74, 85, 82, 86, 69, 68, 73, 195, 89, 65, 74, 128, 89, 65, 72, 72, 128, 89, 65, 72, 128, 89, 65, 71, 78, 128, 89, 65, 71, 72, 72, 128, 89, 65, 71, - 72, 128, 89, 65, 71, 128, 89, 65, 70, 128, 89, 65, 68, 72, 128, 89, 65, - 68, 68, 72, 128, 89, 65, 68, 68, 128, 89, 65, 68, 128, 89, 65, 67, 72, - 128, 89, 65, 66, 72, 128, 89, 65, 66, 128, 89, 65, 65, 82, 85, 128, 89, - 65, 65, 73, 128, 89, 65, 65, 68, 79, 128, 89, 65, 65, 128, 89, 65, 45, - 89, 79, 128, 89, 65, 45, 85, 128, 89, 65, 45, 79, 128, 89, 48, 48, 56, - 128, 89, 48, 48, 55, 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, - 48, 48, 52, 128, 89, 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, - 49, 65, 128, 89, 48, 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, - 128, 88, 89, 85, 128, 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, - 128, 88, 89, 80, 128, 88, 89, 79, 128, 88, 89, 73, 128, 88, 89, 69, 69, - 128, 88, 89, 69, 128, 88, 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, - 88, 87, 73, 128, 88, 87, 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, - 128, 88, 87, 65, 128, 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, 88, - 128, 88, 85, 79, 128, 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, 72, - 73, 89, 65, 128, 88, 79, 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, 88, - 79, 80, 128, 88, 79, 65, 128, 88, 79, 128, 88, 73, 88, 128, 88, 73, 84, - 128, 88, 73, 82, 79, 206, 88, 73, 80, 128, 88, 73, 69, 88, 128, 88, 73, - 69, 84, 128, 88, 73, 69, 80, 128, 88, 73, 69, 128, 88, 73, 128, 88, 71, - 128, 88, 69, 83, 84, 69, 211, 88, 69, 72, 128, 88, 69, 69, 128, 88, 69, - 128, 88, 65, 78, 128, 88, 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, 65, - 128, 88, 48, 48, 56, 128, 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, 128, - 88, 48, 48, 54, 128, 88, 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, 88, - 48, 48, 52, 65, 128, 88, 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, 48, - 48, 50, 128, 88, 48, 48, 49, 128, 87, 90, 128, 87, 89, 78, 78, 128, 87, - 89, 78, 206, 87, 86, 128, 87, 85, 79, 88, 128, 87, 85, 79, 80, 128, 87, - 85, 79, 128, 87, 85, 78, 74, 207, 87, 85, 78, 128, 87, 85, 76, 85, 128, - 87, 85, 76, 213, 87, 85, 69, 128, 87, 85, 128, 87, 82, 79, 78, 71, 128, - 87, 82, 73, 84, 73, 78, 199, 87, 82, 69, 65, 84, 200, 87, 82, 65, 80, - 128, 87, 79, 88, 128, 87, 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82, + 72, 128, 89, 65, 71, 128, 89, 65, 70, 213, 89, 65, 70, 128, 89, 65, 69, + 77, 77, 65, 69, 128, 89, 65, 68, 72, 128, 89, 65, 68, 68, 72, 128, 89, + 65, 68, 68, 128, 89, 65, 68, 128, 89, 65, 67, 72, 128, 89, 65, 66, 72, + 128, 89, 65, 66, 128, 89, 65, 65, 82, 85, 128, 89, 65, 65, 73, 128, 89, + 65, 65, 68, 79, 128, 89, 65, 65, 128, 89, 65, 45, 89, 79, 128, 89, 65, + 45, 85, 128, 89, 65, 45, 79, 128, 89, 48, 48, 56, 128, 89, 48, 48, 55, + 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, 48, 48, 52, 128, 89, + 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, 49, 65, 128, 89, 48, + 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, 128, 88, 89, 85, 128, + 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, 128, 88, 89, 80, 128, + 88, 89, 79, 128, 88, 89, 73, 128, 88, 89, 69, 69, 128, 88, 89, 69, 128, + 88, 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, 88, 87, 73, 128, 88, + 87, 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, 128, 88, 87, 65, 128, + 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, 88, 128, 88, 85, 79, 128, + 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, 72, 73, 89, 65, 128, 88, 79, + 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, 88, 79, 80, 128, 88, 79, 65, + 128, 88, 79, 128, 88, 73, 88, 128, 88, 73, 84, 128, 88, 73, 82, 79, 206, + 88, 73, 80, 128, 88, 73, 69, 88, 128, 88, 73, 69, 84, 128, 88, 73, 69, + 80, 128, 88, 73, 69, 128, 88, 73, 128, 88, 71, 128, 88, 69, 83, 84, 69, + 211, 88, 69, 72, 128, 88, 69, 69, 128, 88, 69, 128, 88, 65, 78, 128, 88, + 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, 65, 128, 88, 48, 48, 56, 128, + 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, 128, 88, 48, 48, 54, 128, 88, + 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, 88, 48, 48, 52, 65, 128, 88, + 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, 48, 48, 50, 128, 88, 48, 48, + 49, 128, 87, 90, 128, 87, 89, 78, 78, 128, 87, 89, 78, 206, 87, 86, 128, + 87, 85, 80, 128, 87, 85, 79, 88, 128, 87, 85, 79, 80, 128, 87, 85, 79, + 128, 87, 85, 78, 74, 207, 87, 85, 78, 128, 87, 85, 76, 85, 128, 87, 85, + 76, 213, 87, 85, 69, 128, 87, 85, 65, 69, 84, 128, 87, 85, 65, 69, 78, + 128, 87, 85, 128, 87, 82, 217, 87, 82, 79, 78, 71, 128, 87, 82, 73, 84, + 73, 78, 199, 87, 82, 69, 78, 67, 72, 128, 87, 82, 69, 65, 84, 200, 87, + 82, 65, 80, 80, 69, 196, 87, 82, 65, 80, 128, 87, 79, 88, 128, 87, 79, + 82, 75, 69, 82, 128, 87, 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82, 68, 83, 80, 65, 67, 69, 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, 79, 79, 78, 128, 87, 79, 79, 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, - 197, 87, 79, 79, 68, 128, 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 65, - 78, 128, 87, 79, 76, 79, 83, 79, 128, 87, 79, 69, 128, 87, 79, 65, 128, - 87, 73, 84, 72, 79, 85, 212, 87, 73, 78, 84, 69, 82, 128, 87, 73, 78, 74, - 65, 128, 87, 73, 78, 69, 128, 87, 73, 78, 68, 85, 128, 87, 73, 78, 68, - 128, 87, 73, 78, 128, 87, 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, - 76, 217, 87, 73, 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, 73, 68, 197, - 87, 73, 65, 78, 71, 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, 128, 87, 72, - 79, 76, 197, 87, 72, 73, 84, 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, - 87, 72, 73, 84, 69, 128, 87, 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, - 67, 72, 65, 73, 210, 87, 72, 69, 69, 76, 128, 87, 72, 69, 69, 204, 87, - 72, 69, 65, 84, 128, 87, 71, 128, 87, 69, 88, 128, 87, 69, 83, 84, 69, - 82, 206, 87, 69, 83, 84, 128, 87, 69, 83, 212, 87, 69, 80, 128, 87, 69, - 79, 128, 87, 69, 78, 128, 87, 69, 76, 76, 128, 87, 69, 73, 71, 72, 212, - 87, 69, 69, 78, 128, 87, 69, 68, 71, 69, 45, 84, 65, 73, 76, 69, 196, 87, - 69, 65, 80, 79, 78, 128, 87, 66, 128, 87, 65, 89, 128, 87, 65, 217, 87, - 65, 88, 128, 87, 65, 87, 45, 65, 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, - 65, 87, 128, 87, 65, 215, 87, 65, 86, 217, 87, 65, 86, 69, 128, 87, 65, - 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, 79, 128, 87, 65, 84, 69, 82, + 197, 87, 79, 79, 68, 128, 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 69, + 78, 211, 87, 79, 77, 69, 206, 87, 79, 77, 65, 78, 211, 87, 79, 77, 65, + 78, 128, 87, 79, 77, 65, 206, 87, 79, 76, 79, 83, 79, 128, 87, 79, 76, + 198, 87, 79, 69, 128, 87, 79, 65, 128, 87, 73, 84, 72, 79, 85, 212, 87, + 73, 78, 84, 69, 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 74, 65, + 128, 87, 73, 78, 71, 83, 128, 87, 73, 78, 69, 128, 87, 73, 78, 197, 87, + 73, 78, 68, 85, 128, 87, 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, 78, + 128, 87, 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, 217, 87, 73, + 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, 73, 68, 197, 87, 73, 65, 78, 71, + 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, 128, 87, 72, 79, 76, 197, 87, + 72, 73, 84, 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, + 69, 128, 87, 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, + 210, 87, 72, 69, 69, 76, 128, 87, 72, 69, 69, 204, 87, 72, 69, 65, 84, + 128, 87, 72, 65, 76, 69, 128, 87, 71, 128, 87, 69, 88, 128, 87, 69, 85, + 88, 128, 87, 69, 83, 84, 69, 82, 206, 87, 69, 83, 84, 128, 87, 69, 83, + 212, 87, 69, 80, 128, 87, 69, 79, 128, 87, 69, 78, 128, 87, 69, 76, 76, + 128, 87, 69, 73, 71, 72, 212, 87, 69, 69, 78, 128, 87, 69, 68, 71, 69, + 45, 84, 65, 73, 76, 69, 196, 87, 69, 68, 68, 73, 78, 71, 128, 87, 69, 65, + 82, 217, 87, 69, 65, 80, 79, 78, 128, 87, 67, 128, 87, 66, 128, 87, 65, + 89, 128, 87, 65, 217, 87, 65, 88, 73, 78, 199, 87, 65, 88, 128, 87, 65, + 87, 45, 65, 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, 65, 87, 128, 87, 65, + 215, 87, 65, 86, 217, 87, 65, 86, 73, 78, 199, 87, 65, 86, 69, 83, 128, + 87, 65, 86, 69, 128, 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, + 79, 128, 87, 65, 84, 69, 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, 69, 82, 128, 87, 65, 84, 69, 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87, 65, 83, 84, 73, 78, 71, 128, 87, 65, 83, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, 128, 87, 65, 83, 76, 193, 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 65, 76, 76, 65, 205, 87, 65, 82, 78, 73, 78, 199, 87, - 65, 80, 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 128, 87, - 65, 76, 76, 128, 87, 65, 76, 75, 128, 87, 65, 76, 203, 87, 65, 73, 84, - 73, 78, 71, 128, 87, 65, 73, 128, 87, 65, 69, 78, 128, 87, 65, 69, 128, - 87, 65, 65, 86, 85, 128, 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, - 87, 48, 50, 52, 128, 87, 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, - 50, 49, 128, 87, 48, 50, 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, - 65, 128, 87, 48, 49, 56, 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, - 128, 87, 48, 49, 54, 128, 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, - 87, 48, 49, 52, 128, 87, 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, - 49, 49, 128, 87, 48, 49, 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, - 57, 65, 128, 87, 48, 48, 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, - 128, 87, 48, 48, 54, 128, 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, - 48, 48, 51, 65, 128, 87, 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, - 48, 49, 128, 86, 90, 77, 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, - 86, 89, 82, 88, 128, 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, - 87, 65, 128, 86, 85, 88, 128, 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, - 85, 82, 128, 86, 85, 80, 128, 86, 85, 76, 71, 65, 210, 86, 82, 65, 67, - 72, 89, 128, 86, 79, 88, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, - 69, 210, 86, 79, 87, 128, 86, 79, 85, 128, 86, 79, 84, 128, 86, 79, 80, - 128, 86, 79, 79, 128, 86, 79, 76, 85, 77, 197, 86, 79, 76, 84, 65, 71, - 197, 86, 79, 73, 196, 86, 79, 73, 67, 73, 78, 71, 128, 86, 79, 73, 67, - 69, 76, 69, 83, 211, 86, 79, 73, 67, 69, 196, 86, 79, 67, 65, 204, 86, - 79, 128, 86, 73, 88, 128, 86, 73, 84, 128, 86, 73, 83, 73, 71, 79, 84, - 72, 73, 195, 86, 73, 83, 65, 82, 71, 65, 89, 65, 128, 86, 73, 83, 65, 82, - 71, 65, 128, 86, 73, 83, 65, 82, 71, 193, 86, 73, 82, 73, 65, 77, 128, - 86, 73, 82, 71, 79, 128, 86, 73, 82, 71, 65, 128, 86, 73, 82, 65, 77, 65, - 128, 86, 73, 80, 128, 86, 73, 78, 69, 128, 86, 73, 78, 128, 86, 73, 76, - 76, 65, 71, 69, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, 68, 65, 84, - 193, 86, 73, 69, 84, 128, 86, 73, 69, 80, 128, 86, 73, 69, 128, 86, 73, - 68, 65, 128, 86, 73, 67, 84, 79, 82, 217, 86, 73, 128, 86, 69, 88, 128, - 86, 69, 87, 128, 86, 69, 215, 86, 69, 83, 84, 65, 128, 86, 69, 83, 83, - 69, 204, 86, 69, 82, 217, 86, 69, 82, 84, 73, 67, 65, 76, 76, 89, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 86, 69, 82, 84, 73, 67, 65, 76, - 45, 48, 54, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, - 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 52, - 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 51, 128, 86, 69, - 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 50, 128, 86, 69, 82, 84, 73, - 67, 65, 76, 45, 48, 54, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, - 45, 48, 54, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, - 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 53, - 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 52, 128, 86, 69, - 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 51, 128, 86, 69, 82, 84, 73, - 67, 65, 76, 45, 48, 53, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, - 45, 48, 53, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, - 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 54, - 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 53, 128, 86, 69, - 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 52, 128, 86, 69, 82, 84, 73, - 67, 65, 76, 45, 48, 52, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, - 45, 48, 52, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, - 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 48, - 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 54, 128, 86, 69, - 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 53, 128, 86, 69, 82, 84, 73, - 67, 65, 76, 45, 48, 51, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, - 45, 48, 51, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, - 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 49, - 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 48, 128, 86, 69, - 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 54, 128, 86, 69, 82, 84, 73, - 67, 65, 76, 45, 48, 50, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, - 45, 48, 50, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, - 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 50, - 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 49, 128, 86, 69, - 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 48, 128, 86, 69, 82, 84, 73, - 67, 65, 76, 45, 48, 49, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, - 45, 48, 49, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, - 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 51, - 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 50, 128, 86, 69, - 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 49, 128, 86, 69, 82, 84, 73, - 67, 65, 76, 45, 48, 49, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, - 45, 48, 48, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, - 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 52, - 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 51, 128, 86, 69, - 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 50, 128, 86, 69, 82, 84, 73, - 67, 65, 76, 45, 48, 48, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, - 45, 48, 48, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 128, 86, 69, - 82, 83, 73, 67, 76, 69, 128, 86, 69, 82, 83, 197, 86, 69, 82, 71, 69, - 128, 86, 69, 80, 128, 86, 69, 78, 68, 128, 86, 69, 72, 128, 86, 69, 200, - 86, 69, 69, 128, 86, 69, 197, 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, - 210, 86, 65, 89, 65, 78, 78, 65, 128, 86, 65, 88, 128, 86, 65, 86, 128, - 86, 65, 214, 86, 65, 84, 72, 89, 128, 86, 65, 84, 128, 86, 65, 83, 84, - 78, 69, 83, 211, 86, 65, 83, 73, 83, 128, 86, 65, 82, 89, 211, 86, 65, - 82, 73, 75, 65, 128, 86, 65, 82, 73, 65, 78, 212, 86, 65, 82, 73, 65, - 128, 86, 65, 82, 73, 193, 86, 65, 82, 69, 73, 65, 201, 86, 65, 82, 69, - 73, 193, 86, 65, 80, 128, 86, 65, 78, 69, 128, 86, 65, 77, 65, 71, 79, - 77, 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, 72, 193, 86, - 65, 76, 76, 69, 89, 128, 86, 65, 65, 86, 85, 128, 86, 65, 65, 128, 86, - 48, 52, 48, 65, 128, 86, 48, 52, 48, 128, 86, 48, 51, 57, 128, 86, 48, - 51, 56, 128, 86, 48, 51, 55, 65, 128, 86, 48, 51, 55, 128, 86, 48, 51, - 54, 128, 86, 48, 51, 53, 128, 86, 48, 51, 52, 128, 86, 48, 51, 51, 65, - 128, 86, 48, 51, 51, 128, 86, 48, 51, 50, 128, 86, 48, 51, 49, 65, 128, - 86, 48, 51, 49, 128, 86, 48, 51, 48, 65, 128, 86, 48, 51, 48, 128, 86, - 48, 50, 57, 65, 128, 86, 48, 50, 57, 128, 86, 48, 50, 56, 65, 128, 86, - 48, 50, 56, 128, 86, 48, 50, 55, 128, 86, 48, 50, 54, 128, 86, 48, 50, - 53, 128, 86, 48, 50, 52, 128, 86, 48, 50, 51, 65, 128, 86, 48, 50, 51, - 128, 86, 48, 50, 50, 128, 86, 48, 50, 49, 128, 86, 48, 50, 48, 76, 128, - 86, 48, 50, 48, 75, 128, 86, 48, 50, 48, 74, 128, 86, 48, 50, 48, 73, - 128, 86, 48, 50, 48, 72, 128, 86, 48, 50, 48, 71, 128, 86, 48, 50, 48, - 70, 128, 86, 48, 50, 48, 69, 128, 86, 48, 50, 48, 68, 128, 86, 48, 50, - 48, 67, 128, 86, 48, 50, 48, 66, 128, 86, 48, 50, 48, 65, 128, 86, 48, - 50, 48, 128, 86, 48, 49, 57, 128, 86, 48, 49, 56, 128, 86, 48, 49, 55, - 128, 86, 48, 49, 54, 128, 86, 48, 49, 53, 128, 86, 48, 49, 52, 128, 86, - 48, 49, 51, 128, 86, 48, 49, 50, 66, 128, 86, 48, 49, 50, 65, 128, 86, - 48, 49, 50, 128, 86, 48, 49, 49, 67, 128, 86, 48, 49, 49, 66, 128, 86, - 48, 49, 49, 65, 128, 86, 48, 49, 49, 128, 86, 48, 49, 48, 128, 86, 48, - 48, 57, 128, 86, 48, 48, 56, 128, 86, 48, 48, 55, 66, 128, 86, 48, 48, - 55, 65, 128, 86, 48, 48, 55, 128, 86, 48, 48, 54, 128, 86, 48, 48, 53, - 128, 86, 48, 48, 52, 128, 86, 48, 48, 51, 128, 86, 48, 48, 50, 65, 128, - 86, 48, 48, 50, 128, 86, 48, 48, 49, 73, 128, 86, 48, 48, 49, 72, 128, - 86, 48, 48, 49, 71, 128, 86, 48, 48, 49, 70, 128, 86, 48, 48, 49, 69, - 128, 86, 48, 48, 49, 68, 128, 86, 48, 48, 49, 67, 128, 86, 48, 48, 49, - 66, 128, 86, 48, 48, 49, 65, 128, 86, 48, 48, 49, 128, 85, 90, 85, 128, - 85, 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, 128, 85, 89, 128, - 85, 85, 89, 65, 78, 78, 65, 128, 85, 85, 85, 85, 128, 85, 85, 85, 51, - 128, 85, 85, 85, 50, 128, 85, 85, 69, 128, 85, 84, 85, 75, 73, 128, 85, - 83, 83, 85, 51, 128, 85, 83, 83, 85, 128, 85, 83, 72, 88, 128, 85, 83, - 72, 85, 77, 88, 128, 85, 83, 72, 50, 128, 85, 83, 72, 128, 85, 83, 200, - 85, 83, 69, 196, 85, 83, 69, 128, 85, 82, 85, 218, 85, 82, 85, 83, 128, - 85, 82, 85, 68, 65, 128, 85, 82, 85, 68, 193, 85, 82, 85, 128, 85, 82, - 213, 85, 82, 78, 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, 85, 82, 65, - 78, 85, 83, 128, 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, 50, 128, 85, - 82, 178, 85, 80, 87, 65, 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, 211, - 85, 80, 87, 65, 82, 68, 128, 85, 80, 87, 65, 82, 196, 85, 80, 84, 85, 82, - 78, 128, 85, 80, 83, 73, 76, 79, 78, 128, 85, 80, 83, 73, 76, 79, 206, - 85, 80, 82, 73, 71, 72, 212, 85, 80, 80, 69, 210, 85, 80, 65, 68, 72, 77, - 65, 78, 73, 89, 65, 128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, - 79, 78, 128, 85, 78, 78, 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, 85, - 78, 73, 86, 69, 82, 83, 65, 204, 85, 78, 73, 84, 89, 128, 85, 78, 73, 84, - 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, 78, 73, 79, 206, 85, - 78, 73, 70, 73, 69, 196, 85, 78, 68, 207, 85, 78, 68, 69, 82, 84, 73, 69, - 128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, 78, 68, 69, 82, 68, 79, 84, - 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 85, 78, 68, 69, 210, 85, 78, - 67, 73, 193, 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, 128, 85, 78, 65, - 80, 128, 85, 78, 65, 128, 85, 206, 85, 77, 85, 77, 128, 85, 77, 85, 205, - 85, 77, 66, 82, 69, 76, 76, 65, 128, 85, 77, 66, 82, 69, 76, 76, 193, 85, - 77, 66, 73, 78, 128, 85, 75, 85, 128, 85, 75, 82, 65, 73, 78, 73, 65, - 206, 85, 75, 65, 82, 65, 128, 85, 75, 65, 82, 193, 85, 75, 128, 85, 73, - 76, 76, 69, 65, 78, 78, 128, 85, 73, 71, 72, 85, 210, 85, 71, 65, 82, 73, - 84, 73, 195, 85, 69, 89, 128, 85, 69, 69, 128, 85, 69, 65, 128, 85, 68, - 85, 71, 128, 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, 84, 193, 85, - 68, 65, 65, 84, 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, 66, 85, 70, - 73, 76, 73, 128, 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, 68, 65, 77, - 65, 128, 85, 66, 128, 85, 65, 84, 72, 128, 85, 65, 128, 85, 178, 85, 48, - 52, 50, 128, 85, 48, 52, 49, 128, 85, 48, 52, 48, 128, 85, 48, 51, 57, - 128, 85, 48, 51, 56, 128, 85, 48, 51, 55, 128, 85, 48, 51, 54, 128, 85, - 48, 51, 53, 128, 85, 48, 51, 52, 128, 85, 48, 51, 51, 128, 85, 48, 51, - 50, 65, 128, 85, 48, 51, 50, 128, 85, 48, 51, 49, 128, 85, 48, 51, 48, - 128, 85, 48, 50, 57, 65, 128, 85, 48, 50, 57, 128, 85, 48, 50, 56, 128, - 85, 48, 50, 55, 128, 85, 48, 50, 54, 128, 85, 48, 50, 53, 128, 85, 48, - 50, 52, 128, 85, 48, 50, 51, 65, 128, 85, 48, 50, 51, 128, 85, 48, 50, - 50, 128, 85, 48, 50, 49, 128, 85, 48, 50, 48, 128, 85, 48, 49, 57, 128, - 85, 48, 49, 56, 128, 85, 48, 49, 55, 128, 85, 48, 49, 54, 128, 85, 48, - 49, 53, 128, 85, 48, 49, 52, 128, 85, 48, 49, 51, 128, 85, 48, 49, 50, - 128, 85, 48, 49, 49, 128, 85, 48, 49, 48, 128, 85, 48, 48, 57, 128, 85, - 48, 48, 56, 128, 85, 48, 48, 55, 128, 85, 48, 48, 54, 66, 128, 85, 48, - 48, 54, 65, 128, 85, 48, 48, 54, 128, 85, 48, 48, 53, 128, 85, 48, 48, - 52, 128, 85, 48, 48, 51, 128, 85, 48, 48, 50, 128, 85, 48, 48, 49, 128, - 85, 45, 73, 45, 73, 128, 85, 45, 69, 79, 45, 69, 85, 128, 84, 90, 85, - 128, 84, 90, 79, 65, 128, 84, 90, 79, 128, 84, 90, 73, 210, 84, 90, 73, - 128, 84, 90, 69, 69, 128, 84, 90, 69, 128, 84, 90, 65, 65, 128, 84, 90, - 65, 128, 84, 90, 128, 84, 89, 210, 84, 89, 80, 69, 45, 183, 84, 89, 80, - 69, 45, 182, 84, 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, 180, 84, 89, - 80, 69, 45, 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 177, 84, - 89, 80, 197, 84, 89, 79, 128, 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, - 65, 128, 84, 87, 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, 79, - 45, 76, 73, 78, 197, 84, 87, 79, 45, 72, 69, 65, 68, 69, 196, 84, 87, 73, - 73, 128, 84, 87, 73, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, 128, - 84, 87, 69, 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, 84, - 89, 45, 83, 73, 88, 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, 78, - 128, 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, - 45, 78, 73, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, - 84, 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, 89, - 45, 69, 73, 71, 72, 84, 200, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, - 84, 128, 84, 87, 69, 78, 84, 89, 128, 84, 87, 69, 78, 84, 217, 84, 87, - 69, 76, 86, 69, 128, 84, 87, 69, 76, 86, 197, 84, 87, 69, 128, 84, 87, - 65, 65, 128, 84, 87, 65, 128, 84, 86, 82, 73, 68, 79, 128, 84, 86, 73, - 77, 65, 68, 85, 210, 84, 85, 88, 128, 84, 85, 85, 77, 85, 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, 206, 84, 85, + 65, 80, 128, 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, 75, 85, 79, 81, + 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 128, 87, 65, 76, + 76, 128, 87, 65, 76, 75, 128, 87, 65, 76, 203, 87, 65, 73, 84, 73, 78, + 71, 128, 87, 65, 73, 128, 87, 65, 69, 78, 128, 87, 65, 69, 128, 87, 65, + 65, 86, 85, 128, 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, 87, 48, + 50, 52, 128, 87, 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, 50, 49, + 128, 87, 48, 50, 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, 65, 128, + 87, 48, 49, 56, 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, 128, 87, + 48, 49, 54, 128, 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, 87, 48, + 49, 52, 128, 87, 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, 49, 49, + 128, 87, 48, 49, 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, 57, 65, + 128, 87, 48, 48, 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, 128, 87, + 48, 48, 54, 128, 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, 48, 48, + 51, 65, 128, 87, 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, 48, 49, + 128, 86, 90, 77, 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, 86, 89, + 82, 88, 128, 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, 87, 65, + 128, 86, 85, 88, 128, 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, 85, 82, + 128, 86, 85, 80, 128, 86, 85, 76, 71, 65, 210, 86, 85, 69, 81, 128, 86, + 83, 128, 86, 82, 65, 67, 72, 89, 128, 86, 79, 88, 128, 86, 79, 87, 69, + 76, 45, 67, 65, 82, 82, 73, 69, 210, 86, 79, 87, 128, 86, 79, 85, 128, + 86, 79, 84, 128, 86, 79, 80, 128, 86, 79, 79, 128, 86, 79, 77, 128, 86, + 79, 76, 85, 77, 197, 86, 79, 76, 84, 65, 71, 197, 86, 79, 76, 67, 65, 78, + 79, 128, 86, 79, 73, 196, 86, 79, 73, 67, 73, 78, 71, 128, 86, 79, 73, + 67, 69, 76, 69, 83, 211, 86, 79, 73, 67, 69, 196, 86, 79, 67, 65, 76, 73, + 90, 65, 84, 73, 79, 206, 86, 79, 67, 65, 204, 86, 79, 128, 86, 73, 88, + 128, 86, 73, 84, 82, 73, 79, 76, 45, 50, 128, 86, 73, 84, 82, 73, 79, 76, + 128, 86, 73, 84, 65, 69, 45, 50, 128, 86, 73, 84, 65, 69, 128, 86, 73, + 84, 128, 86, 73, 83, 73, 71, 79, 84, 72, 73, 195, 86, 73, 83, 65, 82, 71, + 65, 89, 65, 128, 86, 73, 83, 65, 82, 71, 65, 128, 86, 73, 83, 65, 82, 71, + 193, 86, 73, 82, 73, 65, 77, 128, 86, 73, 82, 71, 79, 128, 86, 73, 82, + 71, 65, 128, 86, 73, 82, 65, 77, 65, 128, 86, 73, 80, 128, 86, 73, 79, + 76, 73, 78, 128, 86, 73, 78, 69, 71, 65, 82, 45, 51, 128, 86, 73, 78, 69, + 71, 65, 82, 45, 50, 128, 86, 73, 78, 69, 71, 65, 82, 128, 86, 73, 78, 69, + 71, 65, 210, 86, 73, 78, 69, 128, 86, 73, 78, 128, 86, 73, 76, 76, 65, + 71, 69, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, 73, 78, 199, 86, 73, + 69, 87, 68, 65, 84, 193, 86, 73, 69, 84, 128, 86, 73, 69, 80, 128, 86, + 73, 69, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, 84, 69, 128, 86, + 73, 68, 69, 207, 86, 73, 68, 65, 128, 86, 73, 67, 84, 79, 82, 217, 86, + 73, 66, 82, 65, 84, 73, 79, 206, 86, 73, 128, 86, 69, 88, 128, 86, 69, + 87, 128, 86, 69, 215, 86, 69, 85, 88, 128, 86, 69, 85, 77, 128, 86, 69, + 85, 65, 69, 80, 69, 78, 128, 86, 69, 85, 65, 69, 128, 86, 69, 83, 84, 65, + 128, 86, 69, 83, 83, 69, 204, 86, 69, 82, 217, 86, 69, 82, 84, 73, 67, + 65, 76, 76, 89, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 54, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 54, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, + 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 50, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 49, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 53, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 53, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, + 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 51, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 50, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 53, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 52, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, + 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 52, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 51, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 52, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 52, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, + 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 53, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 52, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 51, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 51, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, + 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 54, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 53, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 50, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 50, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, + 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 48, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 54, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 49, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 49, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, + 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 49, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 48, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 48, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 48, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, + 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 50, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 49, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 128, 86, 69, 82, 83, 73, 67, 76, 69, 128, 86, 69, 82, 83, 197, + 86, 69, 82, 71, 69, 128, 86, 69, 82, 68, 73, 71, 82, 73, 83, 128, 86, 69, + 80, 128, 86, 69, 78, 68, 128, 86, 69, 73, 76, 128, 86, 69, 72, 73, 67, + 76, 69, 128, 86, 69, 72, 128, 86, 69, 200, 86, 69, 69, 128, 86, 69, 197, + 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, 210, 86, 65, 89, 65, 78, 78, 65, + 128, 86, 65, 88, 128, 86, 65, 86, 128, 86, 65, 214, 86, 65, 84, 72, 89, + 128, 86, 65, 84, 128, 86, 65, 83, 84, 78, 69, 83, 211, 86, 65, 83, 73, + 83, 128, 86, 65, 82, 89, 211, 86, 65, 82, 73, 75, 65, 128, 86, 65, 82, + 73, 65, 78, 212, 86, 65, 82, 73, 65, 128, 86, 65, 82, 73, 193, 86, 65, + 82, 69, 73, 65, 201, 86, 65, 82, 69, 73, 193, 86, 65, 80, 79, 85, 82, 83, + 128, 86, 65, 80, 128, 86, 65, 78, 69, 128, 86, 65, 77, 65, 71, 79, 77, + 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, 72, 193, 86, 65, + 76, 76, 69, 89, 128, 86, 65, 65, 86, 85, 128, 86, 65, 65, 128, 86, 48, + 52, 48, 65, 128, 86, 48, 52, 48, 128, 86, 48, 51, 57, 128, 86, 48, 51, + 56, 128, 86, 48, 51, 55, 65, 128, 86, 48, 51, 55, 128, 86, 48, 51, 54, + 128, 86, 48, 51, 53, 128, 86, 48, 51, 52, 128, 86, 48, 51, 51, 65, 128, + 86, 48, 51, 51, 128, 86, 48, 51, 50, 128, 86, 48, 51, 49, 65, 128, 86, + 48, 51, 49, 128, 86, 48, 51, 48, 65, 128, 86, 48, 51, 48, 128, 86, 48, + 50, 57, 65, 128, 86, 48, 50, 57, 128, 86, 48, 50, 56, 65, 128, 86, 48, + 50, 56, 128, 86, 48, 50, 55, 128, 86, 48, 50, 54, 128, 86, 48, 50, 53, + 128, 86, 48, 50, 52, 128, 86, 48, 50, 51, 65, 128, 86, 48, 50, 51, 128, + 86, 48, 50, 50, 128, 86, 48, 50, 49, 128, 86, 48, 50, 48, 76, 128, 86, + 48, 50, 48, 75, 128, 86, 48, 50, 48, 74, 128, 86, 48, 50, 48, 73, 128, + 86, 48, 50, 48, 72, 128, 86, 48, 50, 48, 71, 128, 86, 48, 50, 48, 70, + 128, 86, 48, 50, 48, 69, 128, 86, 48, 50, 48, 68, 128, 86, 48, 50, 48, + 67, 128, 86, 48, 50, 48, 66, 128, 86, 48, 50, 48, 65, 128, 86, 48, 50, + 48, 128, 86, 48, 49, 57, 128, 86, 48, 49, 56, 128, 86, 48, 49, 55, 128, + 86, 48, 49, 54, 128, 86, 48, 49, 53, 128, 86, 48, 49, 52, 128, 86, 48, + 49, 51, 128, 86, 48, 49, 50, 66, 128, 86, 48, 49, 50, 65, 128, 86, 48, + 49, 50, 128, 86, 48, 49, 49, 67, 128, 86, 48, 49, 49, 66, 128, 86, 48, + 49, 49, 65, 128, 86, 48, 49, 49, 128, 86, 48, 49, 48, 128, 86, 48, 48, + 57, 128, 86, 48, 48, 56, 128, 86, 48, 48, 55, 66, 128, 86, 48, 48, 55, + 65, 128, 86, 48, 48, 55, 128, 86, 48, 48, 54, 128, 86, 48, 48, 53, 128, + 86, 48, 48, 52, 128, 86, 48, 48, 51, 128, 86, 48, 48, 50, 65, 128, 86, + 48, 48, 50, 128, 86, 48, 48, 49, 73, 128, 86, 48, 48, 49, 72, 128, 86, + 48, 48, 49, 71, 128, 86, 48, 48, 49, 70, 128, 86, 48, 48, 49, 69, 128, + 86, 48, 48, 49, 68, 128, 86, 48, 48, 49, 67, 128, 86, 48, 48, 49, 66, + 128, 86, 48, 48, 49, 65, 128, 86, 48, 48, 49, 128, 85, 90, 85, 128, 85, + 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, 128, 85, 89, 128, 85, + 85, 89, 65, 78, 78, 65, 128, 85, 85, 85, 85, 128, 85, 85, 85, 51, 128, + 85, 85, 85, 50, 128, 85, 85, 69, 128, 85, 84, 85, 75, 73, 128, 85, 83, + 83, 85, 51, 128, 85, 83, 83, 85, 128, 85, 83, 72, 88, 128, 85, 83, 72, + 85, 77, 88, 128, 85, 83, 72, 69, 78, 78, 65, 128, 85, 83, 72, 50, 128, + 85, 83, 72, 128, 85, 83, 200, 85, 83, 69, 196, 85, 83, 69, 128, 85, 82, + 85, 218, 85, 82, 85, 83, 128, 85, 82, 85, 68, 65, 128, 85, 82, 85, 68, + 193, 85, 82, 85, 128, 85, 82, 213, 85, 82, 78, 128, 85, 82, 73, 78, 69, + 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, 85, 82, 65, 78, 85, 83, 128, + 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, 50, 128, 85, 82, 178, 85, 80, + 87, 65, 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, 211, 85, 80, 87, 65, 82, + 68, 128, 85, 80, 87, 65, 82, 196, 85, 80, 84, 85, 82, 78, 128, 85, 80, + 83, 73, 76, 79, 78, 128, 85, 80, 83, 73, 76, 79, 206, 85, 80, 82, 73, 71, + 72, 212, 85, 80, 80, 69, 210, 85, 80, 65, 68, 72, 77, 65, 78, 73, 89, 65, + 128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, 79, 78, 128, 85, + 78, 78, 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, 85, 78, 75, 78, 79, 87, + 78, 128, 85, 78, 73, 86, 69, 82, 83, 65, 204, 85, 78, 73, 84, 89, 128, + 85, 78, 73, 84, 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, 78, + 73, 79, 206, 85, 78, 73, 70, 73, 69, 196, 85, 78, 68, 207, 85, 78, 68, + 69, 82, 84, 73, 69, 128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, 78, 68, + 69, 82, 68, 79, 84, 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 85, 78, 68, + 69, 210, 85, 78, 67, 73, 193, 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, + 128, 85, 78, 65, 80, 128, 85, 78, 65, 77, 85, 83, 69, 196, 85, 78, 65, + 128, 85, 206, 85, 77, 85, 77, 128, 85, 77, 85, 205, 85, 77, 66, 82, 69, + 76, 76, 65, 128, 85, 77, 66, 82, 69, 76, 76, 193, 85, 77, 66, 73, 78, + 128, 85, 75, 85, 128, 85, 75, 82, 65, 73, 78, 73, 65, 206, 85, 75, 65, + 82, 65, 128, 85, 75, 65, 82, 193, 85, 75, 128, 85, 73, 76, 76, 69, 65, + 78, 78, 128, 85, 73, 71, 72, 85, 210, 85, 71, 65, 82, 73, 84, 73, 195, + 85, 69, 89, 128, 85, 69, 69, 128, 85, 69, 65, 128, 85, 68, 85, 71, 128, + 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, 84, 193, 85, 68, 65, 65, 84, + 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, 66, 85, 70, 73, 76, 73, 128, + 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, 68, 65, 77, 65, 128, 85, 66, + 128, 85, 65, 84, 72, 128, 85, 65, 128, 85, 178, 85, 48, 52, 50, 128, 85, + 48, 52, 49, 128, 85, 48, 52, 48, 128, 85, 48, 51, 57, 128, 85, 48, 51, + 56, 128, 85, 48, 51, 55, 128, 85, 48, 51, 54, 128, 85, 48, 51, 53, 128, + 85, 48, 51, 52, 128, 85, 48, 51, 51, 128, 85, 48, 51, 50, 65, 128, 85, + 48, 51, 50, 128, 85, 48, 51, 49, 128, 85, 48, 51, 48, 128, 85, 48, 50, + 57, 65, 128, 85, 48, 50, 57, 128, 85, 48, 50, 56, 128, 85, 48, 50, 55, + 128, 85, 48, 50, 54, 128, 85, 48, 50, 53, 128, 85, 48, 50, 52, 128, 85, + 48, 50, 51, 65, 128, 85, 48, 50, 51, 128, 85, 48, 50, 50, 128, 85, 48, + 50, 49, 128, 85, 48, 50, 48, 128, 85, 48, 49, 57, 128, 85, 48, 49, 56, + 128, 85, 48, 49, 55, 128, 85, 48, 49, 54, 128, 85, 48, 49, 53, 128, 85, + 48, 49, 52, 128, 85, 48, 49, 51, 128, 85, 48, 49, 50, 128, 85, 48, 49, + 49, 128, 85, 48, 49, 48, 128, 85, 48, 48, 57, 128, 85, 48, 48, 56, 128, + 85, 48, 48, 55, 128, 85, 48, 48, 54, 66, 128, 85, 48, 48, 54, 65, 128, + 85, 48, 48, 54, 128, 85, 48, 48, 53, 128, 85, 48, 48, 52, 128, 85, 48, + 48, 51, 128, 85, 48, 48, 50, 128, 85, 48, 48, 49, 128, 85, 45, 73, 45, + 73, 128, 85, 45, 69, 79, 45, 69, 85, 128, 84, 90, 85, 128, 84, 90, 79, + 65, 128, 84, 90, 79, 128, 84, 90, 73, 210, 84, 90, 73, 128, 84, 90, 69, + 69, 128, 84, 90, 69, 128, 84, 90, 65, 65, 128, 84, 90, 65, 128, 84, 90, + 128, 84, 89, 210, 84, 89, 80, 69, 45, 183, 84, 89, 80, 69, 45, 182, 84, + 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, 180, 84, 89, 80, 69, 45, 179, + 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 177, 84, 89, 80, 197, 84, + 89, 79, 128, 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, 65, 128, 84, 87, + 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, 79, 45, 84, 72, 73, 82, + 84, 89, 128, 84, 87, 79, 45, 76, 73, 78, 197, 84, 87, 79, 45, 72, 69, 65, + 68, 69, 196, 84, 87, 73, 83, 84, 69, 196, 84, 87, 73, 73, 128, 84, 87, + 73, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, 128, 84, 87, 69, 78, 84, + 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, 84, 89, 45, 83, 73, 88, + 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, 78, 128, 84, 87, 69, 78, + 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 78, 73, 78, 69, + 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 84, 87, 69, 78, 84, + 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, + 84, 200, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69, + 78, 84, 89, 128, 84, 87, 69, 78, 84, 217, 84, 87, 69, 76, 86, 69, 45, 84, + 72, 73, 82, 84, 89, 128, 84, 87, 69, 76, 86, 69, 128, 84, 87, 69, 76, 86, + 197, 84, 87, 69, 128, 84, 87, 65, 65, 128, 84, 87, 65, 128, 84, 86, 82, + 73, 68, 79, 128, 84, 86, 73, 77, 65, 68, 85, 210, 84, 85, 88, 128, 84, + 85, 85, 77, 85, 128, 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, 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, - 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, 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, 73, 128, 84, 84, 72, 87, 69, 128, 84, 84, - 72, 79, 79, 128, 84, 84, 72, 79, 128, 84, 84, 72, 73, 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, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, - 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, 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, 69, 128, 84, 82, 85, 67, 75, 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, 75, 85, 84, 65, 83, 84, 201, 84, 82, - 79, 69, 90, 69, 78, 73, 65, 206, 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, 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, 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, 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, 83, 83, 73, 79, 78, 128, 84, 82, - 65, 78, 83, 77, 73, 83, 83, 73, 79, 206, 84, 82, 65, 70, 70, 73, 67, 128, - 84, 82, 65, 68, 197, 84, 82, 65, 67, 75, 128, 84, 82, 128, 84, 79, 88, - 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, 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, 128, 84, 79, 78, 79, 83, 128, 84, - 79, 78, 71, 85, 69, 128, 84, 79, 78, 71, 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, 76, 79, 78, 71, - 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, 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, 76, 72, 69, 69, 128, 84, 76, 72, - 69, 128, 84, 76, 72, 65, 128, 84, 76, 69, 69, 128, 84, 76, 65, 128, 84, - 74, 69, 128, 84, 73, 88, 128, 84, 73, 87, 78, 128, 84, 73, 87, 65, 218, - 84, 73, 84, 76, 79, 128, 84, 73, 84, 128, 84, 73, 82, 89, 65, 75, 128, - 84, 73, 82, 84, 193, 84, 73, 82, 79, 78, 73, 65, 206, 84, 73, 82, 128, - 84, 73, 210, 84, 73, 80, 80, 73, 128, 84, 73, 80, 69, 72, 65, 128, 84, - 73, 80, 128, 84, 73, 208, 84, 73, 78, 89, 128, 84, 73, 78, 217, 84, 73, - 78, 78, 69, 128, 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, - 128, 84, 73, 77, 69, 128, 84, 73, 76, 68, 69, 128, 84, 73, 76, 68, 197, - 84, 73, 76, 128, 84, 73, 204, 84, 73, 75, 69, 85, 84, 45, 84, 72, 73, 69, - 85, 84, 72, 128, 84, 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, 45, 75, 73, - 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, 128, 84, - 73, 75, 69, 85, 84, 45, 82, 73, 69, 85, 76, 128, 84, 73, 75, 69, 85, 84, - 45, 80, 73, 69, 85, 80, 128, 84, 73, 75, 69, 85, 84, 45, 77, 73, 69, 85, - 77, 128, 84, 73, 75, 69, 85, 84, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, - 75, 69, 85, 84, 45, 67, 73, 69, 85, 67, 128, 84, 73, 75, 69, 85, 84, 45, - 67, 72, 73, 69, 85, 67, 72, 128, 84, 73, 75, 69, 85, 84, 128, 84, 73, 75, - 69, 85, 212, 84, 73, 73, 128, 84, 73, 71, 72, 212, 84, 73, 71, 69, 82, - 128, 84, 73, 70, 73, 78, 65, 71, 200, 84, 73, 69, 88, 128, 84, 73, 69, - 80, 128, 84, 73, 197, 84, 73, 67, 75, 128, 84, 73, 67, 203, 84, 73, 65, - 82, 65, 128, 84, 72, 90, 128, 84, 72, 89, 79, 79, 205, 84, 72, 87, 79, - 79, 128, 84, 72, 87, 79, 128, 84, 72, 87, 73, 73, 128, 84, 72, 87, 73, - 128, 84, 72, 87, 69, 69, 128, 84, 72, 87, 65, 65, 128, 84, 72, 87, 65, - 128, 84, 72, 85, 82, 211, 84, 72, 85, 82, 73, 83, 65, 218, 84, 72, 85, - 78, 71, 128, 84, 72, 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 72, - 85, 78, 68, 69, 82, 128, 84, 72, 85, 78, 68, 69, 210, 84, 72, 85, 128, - 84, 72, 82, 79, 85, 71, 72, 128, 84, 72, 82, 79, 85, 71, 200, 84, 72, 82, - 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, 76, 73, 78, - 197, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 65, 68, 128, 84, 72, - 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, 83, 65, 78, 68, 128, 84, 72, - 79, 85, 83, 65, 78, 196, 84, 72, 79, 85, 128, 84, 72, 79, 82, 78, 128, - 84, 72, 79, 82, 206, 84, 72, 79, 78, 71, 128, 84, 72, 79, 65, 128, 84, - 72, 207, 84, 72, 73, 85, 84, 72, 128, 84, 72, 73, 84, 65, 128, 84, 72, - 73, 82, 84, 89, 45, 83, 69, 67, 79, 78, 196, 84, 72, 73, 82, 84, 89, 45, - 79, 78, 69, 128, 84, 72, 73, 82, 84, 89, 128, 84, 72, 73, 82, 84, 217, - 84, 72, 73, 82, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 206, 84, - 72, 73, 82, 68, 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 82, 68, - 128, 84, 72, 73, 82, 196, 84, 72, 73, 206, 84, 72, 73, 73, 128, 84, 72, - 73, 71, 72, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, 69, 89, 128, 84, - 72, 69, 84, 72, 69, 128, 84, 72, 69, 84, 72, 128, 84, 72, 69, 84, 65, - 128, 84, 72, 69, 84, 193, 84, 72, 69, 83, 80, 73, 65, 206, 84, 72, 69, - 83, 69, 79, 83, 128, 84, 72, 69, 83, 69, 79, 211, 84, 72, 69, 211, 84, - 72, 69, 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 84, 72, 69, 82, 69, - 70, 79, 82, 69, 128, 84, 72, 69, 82, 197, 84, 72, 69, 206, 84, 72, 69, - 77, 65, 84, 73, 83, 77, 79, 211, 84, 72, 69, 77, 65, 128, 84, 72, 69, 77, - 193, 84, 72, 69, 72, 128, 84, 72, 69, 200, 84, 72, 69, 69, 128, 84, 72, - 197, 84, 72, 65, 87, 128, 84, 72, 65, 78, 84, 72, 65, 75, 72, 65, 84, - 128, 84, 72, 65, 78, 78, 65, 128, 84, 72, 65, 78, 128, 84, 72, 65, 206, - 84, 72, 65, 76, 128, 84, 72, 65, 204, 84, 72, 65, 72, 65, 78, 128, 84, - 72, 65, 65, 78, 193, 84, 72, 65, 65, 76, 85, 128, 84, 72, 45, 67, 82, 69, - 197, 84, 69, 88, 84, 128, 84, 69, 88, 128, 84, 69, 86, 73, 82, 128, 84, - 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, 69, 84, 82, 65, 83, 69, 77, - 69, 128, 84, 69, 84, 82, 65, 80, 76, 73, 128, 84, 69, 84, 82, 65, 70, 79, - 78, 73, 65, 83, 128, 84, 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, 84, - 65, 82, 84, 79, 211, 84, 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, - 128, 84, 69, 84, 128, 84, 69, 212, 84, 69, 83, 83, 69, 82, 65, 128, 84, - 69, 83, 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, - 200, 84, 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 69, 80, 128, 84, - 69, 78, 85, 84, 79, 128, 84, 69, 78, 85, 128, 84, 69, 78, 213, 84, 69, - 78, 84, 72, 128, 84, 69, 78, 84, 128, 84, 69, 78, 211, 84, 69, 78, 71, - 197, 84, 69, 78, 128, 84, 69, 206, 84, 69, 77, 80, 85, 211, 84, 69, 76, - 85, 128, 84, 69, 76, 79, 85, 211, 84, 69, 76, 73, 83, 72, 193, 84, 69, - 76, 69, 80, 72, 79, 78, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 197, 84, - 69, 76, 69, 73, 65, 128, 84, 69, 73, 87, 83, 128, 84, 69, 71, 69, 72, - 128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128, 84, 69, 65, 82, 68, 82, - 79, 80, 45, 83, 80, 79, 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, - 83, 72, 65, 78, 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 66, 65, - 82, 66, 69, 196, 84, 69, 45, 85, 128, 84, 67, 72, 69, 72, 69, 72, 128, - 84, 67, 72, 69, 72, 69, 200, 84, 67, 72, 69, 72, 128, 84, 67, 72, 69, - 200, 84, 67, 72, 69, 128, 84, 195, 84, 65, 89, 128, 84, 65, 88, 128, 84, - 65, 87, 69, 76, 76, 69, 77, 69, 212, 84, 65, 87, 65, 128, 84, 65, 87, - 128, 84, 65, 86, 73, 89, 65, 78, 73, 128, 84, 65, 86, 128, 84, 65, 214, - 84, 65, 85, 82, 85, 83, 128, 84, 65, 85, 128, 84, 65, 213, 84, 65, 84, - 87, 69, 69, 76, 128, 84, 65, 84, 87, 69, 69, 204, 84, 65, 84, 84, 79, 79, - 69, 196, 84, 65, 84, 128, 84, 65, 82, 85, 78, 71, 128, 84, 65, 82, 128, - 84, 65, 80, 69, 82, 128, 84, 65, 80, 197, 84, 65, 80, 128, 84, 65, 79, - 128, 84, 65, 78, 78, 69, 196, 84, 65, 78, 199, 84, 65, 78, 128, 84, 65, - 77, 73, 78, 71, 128, 84, 65, 77, 128, 84, 65, 76, 76, 128, 84, 65, 76, - 204, 84, 65, 76, 73, 78, 71, 128, 84, 65, 76, 73, 78, 199, 84, 65, 76, - 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, 212, 84, 65, 75, 72, 65, 76, 76, - 85, 83, 128, 84, 65, 75, 69, 128, 84, 65, 75, 52, 128, 84, 65, 75, 128, - 84, 65, 73, 83, 89, 79, 85, 128, 84, 65, 73, 76, 76, 69, 83, 211, 84, 65, - 73, 76, 128, 84, 65, 73, 204, 84, 65, 72, 128, 84, 65, 200, 84, 65, 71, - 66, 65, 78, 87, 193, 84, 65, 71, 65, 76, 79, 199, 84, 65, 71, 128, 84, - 65, 69, 128, 84, 65, 67, 75, 128, 84, 65, 67, 203, 84, 65, 66, 85, 76, - 65, 84, 73, 79, 78, 128, 84, 65, 66, 76, 69, 128, 84, 65, 66, 128, 84, - 65, 194, 84, 65, 65, 76, 85, 74, 193, 84, 65, 65, 73, 128, 84, 65, 65, - 70, 128, 84, 65, 50, 128, 84, 65, 45, 82, 79, 76, 128, 84, 48, 51, 54, - 128, 84, 48, 51, 53, 128, 84, 48, 51, 52, 128, 84, 48, 51, 51, 65, 128, - 84, 48, 51, 51, 128, 84, 48, 51, 50, 65, 128, 84, 48, 51, 50, 128, 84, - 48, 51, 49, 128, 84, 48, 51, 48, 128, 84, 48, 50, 57, 128, 84, 48, 50, - 56, 128, 84, 48, 50, 55, 128, 84, 48, 50, 54, 128, 84, 48, 50, 53, 128, - 84, 48, 50, 52, 128, 84, 48, 50, 51, 128, 84, 48, 50, 50, 128, 84, 48, - 50, 49, 128, 84, 48, 50, 48, 128, 84, 48, 49, 57, 128, 84, 48, 49, 56, - 128, 84, 48, 49, 55, 128, 84, 48, 49, 54, 65, 128, 84, 48, 49, 54, 128, - 84, 48, 49, 53, 128, 84, 48, 49, 52, 128, 84, 48, 49, 51, 128, 84, 48, - 49, 50, 128, 84, 48, 49, 49, 65, 128, 84, 48, 49, 49, 128, 84, 48, 49, - 48, 128, 84, 48, 48, 57, 65, 128, 84, 48, 48, 57, 128, 84, 48, 48, 56, - 65, 128, 84, 48, 48, 56, 128, 84, 48, 48, 55, 65, 128, 84, 48, 48, 55, - 128, 84, 48, 48, 54, 128, 84, 48, 48, 53, 128, 84, 48, 48, 52, 128, 84, - 48, 48, 51, 65, 128, 84, 48, 48, 51, 128, 84, 48, 48, 50, 128, 84, 48, - 48, 49, 128, 83, 90, 90, 128, 83, 90, 87, 71, 128, 83, 90, 87, 65, 128, - 83, 90, 85, 128, 83, 90, 79, 128, 83, 90, 73, 128, 83, 90, 69, 69, 128, - 83, 90, 69, 128, 83, 90, 65, 65, 128, 83, 90, 65, 128, 83, 90, 128, 83, - 89, 88, 128, 83, 89, 84, 128, 83, 89, 82, 88, 128, 83, 89, 82, 77, 65, - 84, 73, 75, 73, 128, 83, 89, 82, 77, 65, 128, 83, 89, 82, 128, 83, 89, - 80, 128, 83, 89, 79, 85, 87, 65, 128, 83, 89, 78, 69, 86, 77, 65, 128, - 83, 89, 78, 68, 69, 83, 77, 79, 211, 83, 89, 78, 67, 72, 82, 79, 78, 79, - 85, 211, 83, 89, 78, 65, 71, 77, 193, 83, 89, 78, 65, 70, 73, 128, 83, - 89, 77, 77, 69, 84, 82, 89, 128, 83, 89, 77, 77, 69, 84, 82, 73, 195, 83, - 89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, 56, 128, 83, - 89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, 54, 128, 83, - 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, 53, 51, - 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, 76, 45, - 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, 66, 79, - 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, 77, 66, - 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, 83, 89, - 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 51, 128, - 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, 45, 52, - 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, 76, 45, - 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, 66, 79, - 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, 89, 77, - 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, 128, 83, - 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, 57, 128, - 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, 45, 50, - 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, 79, 76, - 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, 77, 66, - 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, 83, 89, - 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, 128, 83, - 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, 49, 56, - 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, 66, 79, - 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, 89, 77, - 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, 128, 83, - 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45, 49, 128, - 83, 89, 76, 79, 84, 201, 83, 89, 65, 128, 83, 89, 128, 83, 87, 90, 128, - 83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, 82, 68, - 128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 73, 128, 83, 87, - 73, 128, 83, 87, 71, 128, 83, 87, 69, 69, 84, 128, 83, 87, 65, 83, 200, - 83, 87, 65, 80, 80, 73, 78, 71, 128, 83, 87, 65, 65, 128, 83, 87, 128, - 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, 128, 83, 86, 65, 82, - 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, 85, 84, 128, 83, 85, - 83, 80, 69, 78, 83, 73, 79, 206, 83, 85, 82, 88, 128, 83, 85, 82, 82, 79, - 85, 78, 68, 128, 83, 85, 82, 82, 79, 85, 78, 196, 83, 85, 82, 70, 65, 67, - 197, 83, 85, 82, 69, 128, 83, 85, 82, 65, 78, 71, 128, 83, 85, 82, 57, - 128, 83, 85, 82, 128, 83, 85, 210, 83, 85, 80, 82, 65, 76, 73, 78, 69, - 65, 210, 83, 85, 80, 69, 82, 86, 73, 83, 69, 128, 83, 85, 80, 69, 82, 83, - 69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, 85, 80, 69, 82, 83, 67, - 82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, 83, 85, - 80, 69, 82, 70, 73, 88, 69, 196, 83, 85, 80, 128, 83, 85, 79, 88, 128, - 83, 85, 79, 80, 128, 83, 85, 79, 128, 83, 85, 78, 71, 128, 83, 85, 78, - 68, 65, 78, 69, 83, 197, 83, 85, 78, 128, 83, 85, 206, 83, 85, 77, 77, - 69, 82, 128, 83, 85, 77, 77, 65, 84, 73, 79, 78, 128, 83, 85, 77, 77, 65, - 84, 73, 79, 206, 83, 85, 77, 65, 83, 72, 128, 83, 85, 77, 128, 83, 85, - 75, 85, 78, 128, 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, 85, 75, - 213, 83, 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, 73, 84, 128, 83, 85, - 72, 85, 82, 128, 83, 85, 68, 50, 128, 83, 85, 68, 128, 83, 85, 67, 67, - 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, 67, 69, - 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, 84, - 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, 84, - 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, 85, - 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, 73, - 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, 73, - 78, 69, 65, 210, 83, 85, 66, 74, 79, 73, 78, 69, 196, 83, 85, 66, 74, 69, - 67, 84, 128, 83, 85, 66, 73, 84, 79, 128, 83, 85, 66, 71, 82, 79, 85, 80, - 128, 83, 85, 66, 71, 82, 79, 85, 208, 83, 85, 65, 128, 83, 213, 83, 84, - 87, 65, 128, 83, 84, 85, 68, 89, 128, 83, 84, 82, 79, 75, 69, 83, 128, - 83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, 57, 128, 83, 84, - 82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, 55, 128, 83, 84, - 82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, 53, 128, 83, 84, - 82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, 51, 128, 83, 84, - 82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, 49, 49, 128, 83, - 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, 69, 45, 49, 128, - 83, 84, 82, 73, 80, 69, 128, 83, 84, 82, 73, 75, 69, 84, 72, 82, 79, 85, - 71, 72, 128, 83, 84, 82, 73, 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, - 217, 83, 84, 82, 69, 84, 67, 72, 69, 196, 83, 84, 82, 69, 83, 211, 83, - 84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, - 82, 65, 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, - 83, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, 82, 65, 73, 70, 128, - 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, 83, 84, 79, 86, 69, + 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, 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, 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, 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, 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, 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, 79, 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, + 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, 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, + 76, 72, 69, 69, 128, 84, 76, 72, 69, 128, 84, 76, 72, 65, 128, 84, 76, + 69, 69, 128, 84, 76, 65, 128, 84, 74, 69, 128, 84, 73, 88, 128, 84, 73, + 87, 78, 128, 84, 73, 87, 65, 218, 84, 73, 84, 85, 65, 69, 80, 128, 84, + 73, 84, 76, 79, 128, 84, 73, 84, 193, 84, 73, 84, 128, 84, 73, 82, 89, + 65, 75, 128, 84, 73, 82, 84, 193, 84, 73, 82, 79, 78, 73, 65, 206, 84, + 73, 82, 69, 196, 84, 73, 82, 128, 84, 73, 210, 84, 73, 80, 80, 73, 128, + 84, 73, 80, 69, 72, 65, 128, 84, 73, 80, 128, 84, 73, 208, 84, 73, 78, + 89, 128, 84, 73, 78, 217, 84, 73, 78, 78, 69, 128, 84, 73, 78, 67, 84, + 85, 82, 69, 128, 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, + 128, 84, 73, 77, 69, 210, 84, 73, 77, 69, 128, 84, 73, 76, 68, 69, 128, + 84, 73, 76, 68, 197, 84, 73, 76, 128, 84, 73, 204, 84, 73, 75, 69, 85, + 84, 45, 84, 72, 73, 69, 85, 84, 72, 128, 84, 73, 75, 69, 85, 84, 45, 83, + 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, + 83, 73, 79, 83, 128, 84, 73, 75, 69, 85, 84, 45, 82, 73, 69, 85, 76, 128, + 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 84, 73, 75, 69, 85, + 84, 45, 77, 73, 69, 85, 77, 128, 84, 73, 75, 69, 85, 84, 45, 75, 73, 89, + 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 67, 73, 69, 85, 67, 128, 84, + 73, 75, 69, 85, 84, 45, 67, 72, 73, 69, 85, 67, 72, 128, 84, 73, 75, 69, + 85, 84, 128, 84, 73, 75, 69, 85, 212, 84, 73, 73, 128, 84, 73, 71, 72, + 84, 76, 89, 45, 67, 76, 79, 83, 69, 196, 84, 73, 71, 72, 212, 84, 73, 71, + 69, 82, 128, 84, 73, 71, 69, 210, 84, 73, 70, 73, 78, 65, 71, 200, 84, + 73, 69, 88, 128, 84, 73, 69, 80, 128, 84, 73, 197, 84, 73, 67, 75, 69, + 84, 128, 84, 73, 67, 75, 128, 84, 73, 67, 203, 84, 73, 65, 82, 65, 128, + 84, 72, 90, 128, 84, 72, 89, 79, 79, 205, 84, 72, 87, 79, 79, 128, 84, + 72, 87, 79, 128, 84, 72, 87, 73, 73, 128, 84, 72, 87, 73, 128, 84, 72, + 87, 69, 69, 128, 84, 72, 87, 65, 65, 128, 84, 72, 87, 65, 128, 84, 72, + 85, 82, 211, 84, 72, 85, 82, 73, 83, 65, 218, 84, 72, 85, 78, 71, 128, + 84, 72, 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 72, 85, 78, 68, + 69, 82, 128, 84, 72, 85, 78, 68, 69, 210, 84, 72, 85, 77, 66, 211, 84, + 72, 82, 79, 87, 73, 78, 199, 84, 72, 82, 79, 85, 71, 72, 128, 84, 72, 82, + 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 84, 72, 73, 82, 84, 89, 128, 84, + 72, 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, 76, + 73, 78, 197, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 65, 68, 128, + 84, 72, 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, 83, 65, 78, 68, 128, + 84, 72, 79, 85, 83, 65, 78, 196, 84, 72, 79, 85, 71, 72, 212, 84, 72, 79, + 85, 128, 84, 72, 79, 82, 78, 128, 84, 72, 79, 82, 206, 84, 72, 79, 78, + 71, 128, 84, 72, 79, 65, 128, 84, 72, 207, 84, 72, 73, 85, 84, 72, 128, + 84, 72, 73, 84, 65, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, 67, 79, 78, + 196, 84, 72, 73, 82, 84, 89, 45, 79, 78, 69, 128, 84, 72, 73, 82, 84, + 217, 84, 72, 73, 82, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, + 206, 84, 72, 73, 82, 68, 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, + 82, 68, 128, 84, 72, 73, 82, 196, 84, 72, 73, 206, 84, 72, 73, 73, 128, + 84, 72, 73, 71, 72, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, 69, 89, + 128, 84, 72, 69, 84, 72, 69, 128, 84, 72, 69, 84, 72, 128, 84, 72, 69, + 84, 65, 128, 84, 72, 69, 84, 193, 84, 72, 69, 83, 80, 73, 65, 206, 84, + 72, 69, 83, 69, 79, 83, 128, 84, 72, 69, 83, 69, 79, 211, 84, 72, 69, + 211, 84, 72, 69, 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 84, 72, 69, + 82, 69, 70, 79, 82, 69, 128, 84, 72, 69, 82, 197, 84, 72, 69, 206, 84, + 72, 69, 77, 65, 84, 73, 83, 77, 79, 211, 84, 72, 69, 77, 65, 128, 84, 72, + 69, 77, 193, 84, 72, 69, 72, 128, 84, 72, 69, 200, 84, 72, 197, 84, 72, + 65, 87, 128, 84, 72, 65, 78, 84, 72, 65, 75, 72, 65, 84, 128, 84, 72, 65, + 78, 78, 65, 128, 84, 72, 65, 78, 128, 84, 72, 65, 206, 84, 72, 65, 76, + 128, 84, 72, 65, 204, 84, 72, 65, 72, 65, 78, 128, 84, 72, 65, 65, 78, + 193, 84, 72, 65, 65, 76, 85, 128, 84, 72, 45, 67, 82, 69, 197, 84, 69, + 88, 84, 128, 84, 69, 88, 128, 84, 69, 86, 73, 82, 128, 84, 69, 85, 84, + 69, 85, 88, 128, 84, 69, 85, 84, 69, 85, 87, 69, 78, 128, 84, 69, 85, 84, + 128, 84, 69, 85, 78, 128, 84, 69, 85, 65, 69, 81, 128, 84, 69, 85, 65, + 69, 78, 128, 84, 69, 85, 128, 84, 69, 84, 82, 65, 83, 73, 77, 79, 85, + 128, 84, 69, 84, 82, 65, 83, 69, 77, 69, 128, 84, 69, 84, 82, 65, 80, 76, + 73, 128, 84, 69, 84, 82, 65, 70, 79, 78, 73, 65, 83, 128, 84, 69, 84, 72, + 128, 84, 69, 84, 200, 84, 69, 84, 65, 82, 84, 79, 211, 84, 69, 84, 65, + 82, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 69, 84, 128, 84, 69, 212, + 84, 69, 83, 83, 69, 82, 65, 128, 84, 69, 83, 83, 69, 82, 193, 84, 69, 83, + 83, 65, 82, 79, 206, 84, 69, 83, 200, 84, 69, 82, 77, 73, 78, 65, 84, 79, + 82, 128, 84, 69, 80, 128, 84, 69, 78, 85, 84, 79, 128, 84, 69, 78, 85, + 128, 84, 69, 78, 213, 84, 69, 78, 84, 72, 128, 84, 69, 78, 84, 128, 84, + 69, 78, 211, 84, 69, 78, 78, 73, 211, 84, 69, 78, 71, 197, 84, 69, 78, + 45, 84, 72, 73, 82, 84, 89, 128, 84, 69, 78, 128, 84, 69, 206, 84, 69, + 77, 80, 85, 211, 84, 69, 76, 85, 128, 84, 69, 76, 79, 85, 211, 84, 69, + 76, 76, 69, 210, 84, 69, 76, 73, 83, 72, 193, 84, 69, 76, 69, 86, 73, 83, + 73, 79, 78, 128, 84, 69, 76, 69, 83, 67, 79, 80, 69, 128, 84, 69, 76, 69, + 80, 72, 79, 78, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 197, 84, 69, 76, + 69, 73, 65, 128, 84, 69, 73, 87, 83, 128, 84, 69, 71, 69, 72, 128, 84, + 69, 69, 69, 69, 128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128, 84, 69, + 65, 82, 211, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 80, 79, 75, 69, 196, + 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, 75, 69, 196, 84, 69, + 65, 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 69, 65, 82, 45, + 79, 70, 198, 84, 69, 65, 67, 85, 208, 84, 69, 45, 85, 128, 84, 67, 72, + 69, 72, 69, 72, 128, 84, 67, 72, 69, 72, 69, 200, 84, 67, 72, 69, 72, + 128, 84, 67, 72, 69, 200, 84, 67, 72, 69, 128, 84, 195, 84, 65, 89, 128, + 84, 65, 88, 73, 128, 84, 65, 88, 128, 84, 65, 87, 69, 76, 76, 69, 77, 69, + 212, 84, 65, 87, 65, 128, 84, 65, 87, 128, 84, 65, 86, 73, 89, 65, 78, + 73, 128, 84, 65, 86, 128, 84, 65, 214, 84, 65, 85, 82, 85, 83, 128, 84, + 65, 85, 128, 84, 65, 213, 84, 65, 84, 87, 69, 69, 76, 128, 84, 65, 84, + 87, 69, 69, 204, 84, 65, 84, 84, 79, 79, 69, 196, 84, 65, 84, 128, 84, + 65, 82, 85, 78, 71, 128, 84, 65, 82, 84, 65, 82, 45, 50, 128, 84, 65, 82, + 84, 65, 82, 128, 84, 65, 81, 128, 84, 65, 80, 69, 82, 128, 84, 65, 80, + 197, 84, 65, 80, 128, 84, 65, 79, 128, 84, 65, 78, 78, 69, 196, 84, 65, + 78, 71, 69, 82, 73, 78, 69, 128, 84, 65, 78, 199, 84, 65, 78, 65, 66, 65, + 84, 193, 84, 65, 78, 128, 84, 65, 77, 73, 78, 71, 128, 84, 65, 77, 128, + 84, 65, 76, 76, 128, 84, 65, 76, 204, 84, 65, 76, 73, 78, 71, 128, 84, + 65, 76, 73, 78, 199, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, + 212, 84, 65, 75, 72, 65, 76, 76, 85, 83, 128, 84, 65, 75, 69, 128, 84, + 65, 75, 52, 128, 84, 65, 75, 128, 84, 65, 73, 83, 89, 79, 85, 128, 84, + 65, 73, 76, 76, 69, 83, 211, 84, 65, 73, 76, 128, 84, 65, 73, 204, 84, + 65, 72, 128, 84, 65, 200, 84, 65, 71, 66, 65, 78, 87, 193, 84, 65, 71, + 65, 76, 79, 199, 84, 65, 71, 128, 84, 65, 69, 206, 84, 65, 67, 75, 128, + 84, 65, 67, 203, 84, 65, 66, 85, 76, 65, 84, 73, 79, 78, 128, 84, 65, 66, + 83, 128, 84, 65, 66, 76, 69, 128, 84, 65, 66, 128, 84, 65, 194, 84, 65, + 65, 83, 72, 65, 69, 128, 84, 65, 65, 81, 128, 84, 65, 65, 77, 128, 84, + 65, 65, 76, 85, 74, 193, 84, 65, 65, 73, 128, 84, 65, 65, 70, 128, 84, + 65, 50, 128, 84, 65, 45, 82, 79, 76, 128, 84, 48, 51, 54, 128, 84, 48, + 51, 53, 128, 84, 48, 51, 52, 128, 84, 48, 51, 51, 65, 128, 84, 48, 51, + 51, 128, 84, 48, 51, 50, 65, 128, 84, 48, 51, 50, 128, 84, 48, 51, 49, + 128, 84, 48, 51, 48, 128, 84, 48, 50, 57, 128, 84, 48, 50, 56, 128, 84, + 48, 50, 55, 128, 84, 48, 50, 54, 128, 84, 48, 50, 53, 128, 84, 48, 50, + 52, 128, 84, 48, 50, 51, 128, 84, 48, 50, 50, 128, 84, 48, 50, 49, 128, + 84, 48, 50, 48, 128, 84, 48, 49, 57, 128, 84, 48, 49, 56, 128, 84, 48, + 49, 55, 128, 84, 48, 49, 54, 65, 128, 84, 48, 49, 54, 128, 84, 48, 49, + 53, 128, 84, 48, 49, 52, 128, 84, 48, 49, 51, 128, 84, 48, 49, 50, 128, + 84, 48, 49, 49, 65, 128, 84, 48, 49, 49, 128, 84, 48, 49, 48, 128, 84, + 48, 48, 57, 65, 128, 84, 48, 48, 57, 128, 84, 48, 48, 56, 65, 128, 84, + 48, 48, 56, 128, 84, 48, 48, 55, 65, 128, 84, 48, 48, 55, 128, 84, 48, + 48, 54, 128, 84, 48, 48, 53, 128, 84, 48, 48, 52, 128, 84, 48, 48, 51, + 65, 128, 84, 48, 48, 51, 128, 84, 48, 48, 50, 128, 84, 48, 48, 49, 128, + 84, 45, 83, 72, 73, 82, 84, 128, 83, 90, 90, 128, 83, 90, 87, 71, 128, + 83, 90, 87, 65, 128, 83, 90, 85, 128, 83, 90, 79, 128, 83, 90, 73, 128, + 83, 90, 69, 69, 128, 83, 90, 69, 128, 83, 90, 65, 65, 128, 83, 90, 65, + 128, 83, 90, 128, 83, 89, 88, 128, 83, 89, 84, 128, 83, 89, 82, 88, 128, + 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, 83, 89, 82, 77, 65, 128, 83, 89, + 82, 73, 78, 71, 69, 128, 83, 89, 82, 128, 83, 89, 80, 128, 83, 89, 79, + 85, 87, 65, 128, 83, 89, 78, 69, 86, 77, 65, 128, 83, 89, 78, 68, 69, 83, + 77, 79, 211, 83, 89, 78, 67, 72, 82, 79, 78, 79, 85, 211, 83, 89, 78, 65, + 71, 77, 193, 83, 89, 78, 65, 70, 73, 128, 83, 89, 77, 77, 69, 84, 82, 89, + 128, 83, 89, 77, 77, 69, 84, 82, 73, 195, 83, 89, 77, 66, 79, 76, 83, + 128, 83, 89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, 56, + 128, 83, 89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, 54, + 128, 83, 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, + 53, 51, 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, + 76, 45, 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, + 66, 79, 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, + 77, 66, 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, + 83, 89, 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, + 51, 128, 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, + 45, 52, 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, + 76, 45, 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, + 66, 79, 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, + 89, 77, 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, + 128, 83, 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, + 57, 128, 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, + 45, 50, 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, + 79, 76, 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, + 77, 66, 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, + 83, 89, 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, + 128, 83, 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, + 49, 56, 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, + 76, 45, 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, + 66, 79, 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, + 89, 77, 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, + 128, 83, 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45, + 49, 128, 83, 89, 76, 79, 84, 201, 83, 89, 65, 128, 83, 89, 128, 83, 87, + 90, 128, 83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, + 82, 68, 128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204, + 83, 87, 73, 77, 77, 73, 78, 71, 128, 83, 87, 73, 77, 77, 69, 82, 128, 83, + 87, 73, 73, 128, 83, 87, 73, 128, 83, 87, 71, 128, 83, 87, 69, 69, 84, + 128, 83, 87, 69, 69, 212, 83, 87, 69, 65, 84, 128, 83, 87, 69, 65, 212, + 83, 87, 65, 83, 200, 83, 87, 65, 80, 80, 73, 78, 71, 128, 83, 87, 65, 65, + 128, 83, 87, 128, 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, + 128, 83, 86, 65, 82, 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, + 85, 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, 85, 83, 72, 73, + 128, 83, 85, 82, 88, 128, 83, 85, 82, 82, 79, 85, 78, 68, 128, 83, 85, + 82, 82, 79, 85, 78, 196, 83, 85, 82, 70, 69, 82, 128, 83, 85, 82, 70, 65, + 67, 197, 83, 85, 82, 69, 128, 83, 85, 82, 65, 78, 71, 128, 83, 85, 82, + 57, 128, 83, 85, 82, 128, 83, 85, 210, 83, 85, 80, 82, 65, 76, 73, 78, + 69, 65, 210, 83, 85, 80, 69, 82, 86, 73, 83, 69, 128, 83, 85, 80, 69, 82, + 83, 69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, 85, 80, 69, 82, 83, + 67, 82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, 83, + 85, 80, 69, 82, 70, 73, 88, 69, 196, 83, 85, 80, 69, 210, 83, 85, 80, + 128, 83, 85, 79, 88, 128, 83, 85, 79, 80, 128, 83, 85, 79, 128, 83, 85, + 78, 83, 69, 212, 83, 85, 78, 82, 73, 83, 69, 128, 83, 85, 78, 82, 73, 83, + 197, 83, 85, 78, 71, 76, 65, 83, 83, 69, 83, 128, 83, 85, 78, 71, 128, + 83, 85, 78, 70, 76, 79, 87, 69, 82, 128, 83, 85, 78, 68, 65, 78, 69, 83, + 197, 83, 85, 78, 128, 83, 85, 206, 83, 85, 77, 77, 69, 82, 128, 83, 85, + 77, 77, 65, 84, 73, 79, 78, 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 83, + 85, 77, 65, 83, 72, 128, 83, 85, 77, 128, 83, 85, 76, 70, 85, 82, 128, + 83, 85, 75, 85, 78, 128, 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, + 85, 75, 213, 83, 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, 73, 84, 128, + 83, 85, 72, 85, 82, 128, 83, 85, 69, 128, 83, 85, 68, 50, 128, 83, 85, + 68, 128, 83, 85, 67, 67, 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, + 211, 83, 85, 67, 67, 69, 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, + 85, 66, 85, 78, 73, 84, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, + 206, 83, 85, 66, 83, 84, 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, + 84, 85, 84, 197, 83, 85, 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, + 83, 85, 66, 83, 67, 82, 73, 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, + 83, 128, 83, 85, 66, 76, 73, 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65, + 84, 73, 79, 78, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83, + 85, 66, 76, 73, 77, 65, 84, 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65, + 84, 69, 128, 83, 85, 66, 76, 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73, + 78, 69, 196, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, 73, 84, 79, + 128, 83, 85, 66, 71, 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, 79, 85, + 208, 83, 85, 65, 69, 84, 128, 83, 85, 65, 69, 78, 128, 83, 85, 65, 69, + 128, 83, 85, 65, 128, 83, 213, 83, 84, 87, 65, 128, 83, 84, 85, 68, 89, + 128, 83, 84, 85, 67, 75, 45, 79, 85, 212, 83, 84, 82, 79, 75, 69, 83, + 128, 83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, 57, 128, + 83, 84, 82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, 55, 128, + 83, 84, 82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, 53, 128, + 83, 84, 82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, 51, 128, + 83, 84, 82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, 49, 49, + 128, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, 69, 45, + 49, 128, 83, 84, 82, 79, 75, 197, 83, 84, 82, 73, 80, 69, 128, 83, 84, + 82, 73, 75, 69, 84, 72, 82, 79, 85, 71, 72, 128, 83, 84, 82, 73, 68, 69, + 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, 72, 69, + 196, 83, 84, 82, 69, 83, 211, 83, 84, 82, 69, 78, 71, 84, 72, 128, 83, + 84, 82, 69, 65, 77, 69, 82, 128, 83, 84, 82, 65, 87, 66, 69, 82, 82, 89, + 128, 83, 84, 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, + 128, 83, 84, 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, + 84, 82, 65, 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, + 83, 83, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, 82, 65, 73, 70, + 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, 83, 84, 79, 86, + 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, 87, 65, 84, 67, 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, 80, 80, 65, 71, 69, 128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, 79, 78, 69, 128, 83, 84, 79, 67, 75, 128, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, 83, 84, 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 69, 80, 128, - 83, 84, 69, 77, 128, 83, 84, 69, 205, 83, 84, 69, 65, 77, 128, 83, 84, - 65, 86, 82, 79, 85, 128, 83, 84, 65, 86, 82, 79, 83, 128, 83, 84, 65, 86, - 82, 79, 211, 83, 84, 65, 85, 82, 79, 83, 128, 83, 84, 65, 84, 69, 82, 83, - 128, 83, 84, 65, 82, 212, 83, 84, 65, 82, 75, 128, 83, 84, 65, 82, 128, - 83, 84, 65, 210, 83, 84, 65, 78, 68, 83, 84, 73, 76, 76, 128, 83, 84, 65, - 78, 68, 65, 82, 196, 83, 84, 65, 78, 68, 128, 83, 84, 65, 78, 128, 83, - 84, 65, 76, 76, 73, 79, 78, 128, 83, 84, 65, 70, 70, 128, 83, 84, 65, 70, - 198, 83, 84, 65, 67, 67, 65, 84, 79, 128, 83, 84, 65, 67, 67, 65, 84, 73, - 83, 83, 73, 77, 79, 128, 83, 84, 50, 128, 83, 83, 89, 88, 128, 83, 83, - 89, 84, 128, 83, 83, 89, 82, 88, 128, 83, 83, 89, 82, 128, 83, 83, 89, - 80, 128, 83, 83, 89, 128, 83, 83, 85, 88, 128, 83, 83, 85, 84, 128, 83, - 83, 85, 80, 128, 83, 83, 79, 88, 128, 83, 83, 79, 84, 128, 83, 83, 79, - 80, 128, 83, 83, 79, 128, 83, 83, 73, 88, 128, 83, 83, 73, 84, 128, 83, - 83, 73, 80, 128, 83, 83, 73, 69, 88, 128, 83, 83, 73, 69, 80, 128, 83, - 83, 73, 69, 128, 83, 83, 73, 128, 83, 83, 72, 69, 128, 83, 83, 69, 88, - 128, 83, 83, 69, 80, 128, 83, 83, 69, 69, 128, 83, 83, 65, 88, 128, 83, - 83, 65, 84, 128, 83, 83, 65, 80, 128, 83, 83, 65, 78, 71, 89, 69, 79, 82, - 73, 78, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, - 84, 45, 80, 73, 69, 85, 80, 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, - 84, 128, 83, 83, 65, 78, 71, 84, 72, 73, 69, 85, 84, 72, 128, 83, 83, 65, - 78, 71, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, - 71, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 83, 83, 65, 78, 71, 83, - 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 83, 83, 65, 78, 71, 83, 73, - 79, 83, 128, 83, 83, 65, 78, 71, 82, 73, 69, 85, 76, 45, 75, 72, 73, 69, - 85, 75, 72, 128, 83, 83, 65, 78, 71, 82, 73, 69, 85, 76, 128, 83, 83, 65, - 78, 71, 80, 73, 69, 85, 80, 128, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, - 128, 83, 83, 65, 78, 71, 77, 73, 69, 85, 77, 128, 83, 83, 65, 78, 71, 75, - 73, 89, 69, 79, 75, 128, 83, 83, 65, 78, 71, 73, 69, 85, 78, 71, 128, 83, - 83, 65, 78, 71, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, - 85, 67, 45, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, - 67, 128, 83, 83, 65, 78, 71, 65, 82, 65, 69, 65, 128, 83, 83, 65, 65, - 128, 83, 83, 65, 128, 83, 82, 128, 83, 81, 85, 73, 83, 200, 83, 81, 85, - 73, 82, 82, 69, 204, 83, 81, 85, 73, 71, 71, 76, 197, 83, 81, 85, 65, - 212, 83, 81, 85, 65, 82, 69, 83, 128, 83, 81, 85, 65, 82, 69, 68, 128, - 83, 81, 85, 65, 82, 69, 128, 83, 80, 87, 65, 128, 83, 80, 85, 78, 71, - 211, 83, 80, 82, 79, 85, 84, 128, 83, 80, 82, 73, 78, 71, 83, 128, 83, - 80, 82, 73, 78, 71, 128, 83, 80, 82, 69, 67, 72, 71, 69, 83, 65, 78, 199, - 83, 80, 79, 84, 128, 83, 80, 79, 79, 78, 128, 83, 80, 76, 73, 84, 84, 73, - 78, 199, 83, 80, 73, 82, 73, 84, 85, 211, 83, 80, 73, 82, 73, 84, 128, - 83, 80, 73, 82, 73, 212, 83, 80, 73, 82, 65, 78, 84, 128, 83, 80, 73, 82, - 65, 76, 128, 83, 80, 73, 68, 69, 82, 217, 83, 80, 73, 67, 69, 128, 83, - 80, 72, 69, 82, 73, 67, 65, 204, 83, 80, 69, 83, 77, 73, 76, 207, 83, 80, - 69, 69, 67, 72, 128, 83, 80, 69, 67, 73, 65, 76, 128, 83, 80, 69, 65, 82, - 128, 83, 80, 65, 84, 72, 73, 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, - 80, 65, 68, 197, 83, 80, 65, 67, 73, 78, 199, 83, 80, 128, 83, 79, 89, - 128, 83, 79, 87, 73, 76, 207, 83, 79, 87, 128, 83, 79, 85, 84, 72, 45, - 83, 76, 65, 86, 69, 217, 83, 79, 85, 84, 200, 83, 79, 85, 82, 67, 69, - 128, 83, 79, 85, 78, 68, 128, 83, 79, 85, 78, 196, 83, 79, 85, 78, 65, - 80, 128, 83, 79, 85, 128, 83, 79, 79, 128, 83, 79, 78, 71, 128, 83, 79, - 78, 128, 83, 79, 76, 73, 68, 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, - 83, 79, 71, 68, 73, 65, 206, 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, - 78, 67, 84, 73, 79, 206, 83, 79, 70, 212, 83, 79, 198, 83, 79, 67, 73, - 69, 84, 89, 128, 83, 79, 67, 67, 69, 210, 83, 79, 65, 128, 83, 207, 83, - 78, 79, 87, 77, 65, 78, 128, 83, 78, 79, 87, 77, 65, 206, 83, 78, 79, 87, - 70, 76, 65, 75, 69, 128, 83, 78, 79, 87, 128, 83, 78, 79, 85, 84, 128, - 83, 78, 79, 85, 212, 83, 78, 65, 208, 83, 78, 65, 75, 69, 128, 83, 78, - 65, 75, 197, 83, 78, 193, 83, 77, 73, 76, 73, 78, 199, 83, 77, 73, 76, - 69, 128, 83, 77, 69, 65, 82, 128, 83, 77, 65, 83, 200, 83, 77, 65, 76, - 76, 69, 210, 83, 77, 65, 76, 76, 128, 83, 76, 85, 82, 128, 83, 76, 79, - 87, 76, 89, 128, 83, 76, 79, 215, 83, 76, 79, 86, 79, 128, 83, 76, 79, - 80, 73, 78, 199, 83, 76, 79, 80, 69, 128, 83, 76, 73, 78, 71, 128, 83, - 76, 73, 68, 73, 78, 71, 128, 83, 76, 73, 67, 69, 128, 83, 76, 65, 86, 79, - 78, 73, 195, 83, 76, 65, 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, - 65, 83, 200, 83, 76, 65, 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, - 87, 128, 83, 75, 85, 76, 204, 83, 75, 76, 73, 82, 79, 206, 83, 75, 73, - 78, 128, 83, 75, 73, 69, 82, 128, 83, 75, 69, 87, 69, 196, 83, 75, 65, - 84, 69, 128, 83, 75, 128, 83, 74, 69, 128, 83, 73, 88, 84, 89, 45, 70, - 79, 85, 82, 84, 200, 83, 73, 88, 84, 89, 128, 83, 73, 88, 84, 217, 83, - 73, 88, 84, 72, 83, 128, 83, 73, 88, 84, 72, 211, 83, 73, 88, 84, 72, - 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 83, 128, 83, 73, 88, 84, 69, 69, - 78, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, 83, 73, 88, 84, 69, - 69, 78, 128, 83, 73, 88, 84, 69, 69, 206, 83, 73, 88, 45, 83, 84, 82, 73, - 78, 199, 83, 73, 88, 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 76, 73, - 78, 197, 83, 73, 216, 83, 73, 84, 69, 128, 83, 73, 82, 73, 78, 71, 85, - 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 83, 73, 79, 83, - 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, 82, 73, - 69, 85, 76, 128, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 45, 75, 73, 89, - 69, 79, 75, 128, 83, 73, 79, 83, 45, 80, 72, 73, 69, 85, 80, 72, 128, 83, - 73, 79, 83, 45, 80, 65, 78, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, 78, - 73, 69, 85, 78, 128, 83, 73, 79, 83, 45, 77, 73, 69, 85, 77, 128, 83, 73, - 79, 83, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 73, 79, 83, 45, 75, 65, - 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 83, 73, 79, 83, 45, 73, - 69, 85, 78, 71, 128, 83, 73, 79, 83, 45, 72, 73, 69, 85, 72, 128, 83, 73, - 79, 83, 45, 67, 73, 69, 85, 67, 128, 83, 73, 79, 83, 45, 67, 72, 73, 69, - 85, 67, 72, 128, 83, 73, 79, 211, 83, 73, 78, 75, 73, 78, 71, 128, 83, - 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128, 83, - 73, 78, 71, 76, 197, 83, 73, 78, 71, 65, 65, 84, 128, 83, 73, 78, 197, - 83, 73, 78, 68, 72, 201, 83, 73, 206, 83, 73, 77, 80, 76, 73, 70, 73, 69, - 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, 210, 83, - 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 128, 83, 73, 76, 75, 128, - 83, 73, 76, 73, 81, 85, 193, 83, 73, 76, 65, 51, 128, 83, 73, 75, 73, - 128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 73, 128, 83, 73, 71, - 78, 83, 128, 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, - 69, 204, 83, 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, - 68, 69, 87, 65, 89, 211, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, - 75, 76, 69, 128, 83, 73, 66, 197, 83, 201, 83, 72, 89, 88, 128, 83, 72, - 89, 84, 128, 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, - 80, 128, 83, 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, - 72, 87, 79, 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, - 72, 87, 73, 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, - 87, 65, 65, 128, 83, 72, 87, 65, 128, 83, 72, 85, 88, 128, 83, 72, 85, - 84, 128, 83, 72, 85, 82, 88, 128, 83, 72, 85, 82, 128, 83, 72, 85, 80, - 128, 83, 72, 85, 79, 88, 128, 83, 72, 85, 79, 80, 128, 83, 72, 85, 79, - 128, 83, 72, 85, 70, 70, 76, 197, 83, 72, 85, 66, 85, 82, 128, 83, 72, - 85, 50, 128, 83, 72, 85, 178, 83, 72, 85, 128, 83, 72, 213, 83, 72, 84, - 65, 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 73, 78, 69, 128, - 83, 72, 79, 89, 128, 83, 72, 79, 88, 128, 83, 72, 79, 85, 76, 68, 69, 82, - 69, 196, 83, 72, 79, 84, 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, - 82, 84, 211, 83, 72, 79, 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, 84, - 45, 84, 87, 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, - 71, 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, - 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, 79, - 82, 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, 45, - 84, 87, 73, 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, - 71, 45, 72, 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, - 45, 66, 74, 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, - 45, 65, 210, 83, 72, 79, 82, 84, 128, 83, 72, 79, 82, 212, 83, 72, 79, - 80, 128, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79, 128, 83, 72, 79, 71, - 201, 83, 72, 79, 199, 83, 72, 79, 197, 83, 72, 79, 65, 128, 83, 72, 79, - 128, 83, 72, 73, 89, 89, 65, 65, 76, 65, 65, 128, 83, 72, 73, 84, 65, - 128, 83, 72, 73, 84, 193, 83, 72, 73, 82, 128, 83, 72, 73, 210, 83, 72, - 73, 80, 128, 83, 72, 73, 78, 84, 207, 83, 72, 73, 78, 73, 71, 128, 83, - 72, 73, 78, 128, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, - 77, 193, 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, 78, 128, - 83, 72, 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, 68, 128, - 83, 72, 73, 68, 128, 83, 72, 73, 196, 83, 72, 73, 128, 83, 72, 72, 65, - 128, 83, 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, 85, 88, - 128, 83, 72, 69, 84, 128, 83, 72, 69, 83, 72, 76, 65, 77, 128, 83, 72, - 69, 83, 72, 73, 71, 128, 83, 72, 69, 83, 72, 73, 199, 83, 72, 69, 83, 72, - 50, 128, 83, 72, 69, 83, 72, 128, 83, 72, 69, 81, 69, 204, 83, 72, 69, - 80, 128, 83, 72, 69, 78, 128, 83, 72, 69, 76, 76, 128, 83, 72, 69, 76, - 204, 83, 72, 69, 76, 70, 128, 83, 72, 69, 73, 128, 83, 72, 69, 71, 57, - 128, 83, 72, 69, 69, 80, 128, 83, 72, 69, 69, 78, 85, 128, 83, 72, 69, - 69, 78, 128, 83, 72, 69, 69, 206, 83, 72, 69, 69, 128, 83, 72, 69, 45, - 71, 79, 65, 84, 128, 83, 72, 197, 83, 72, 67, 72, 65, 128, 83, 72, 65, - 89, 128, 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, - 83, 72, 65, 86, 73, 65, 206, 83, 72, 65, 84, 128, 83, 72, 65, 82, 85, - 128, 83, 72, 65, 82, 213, 83, 72, 65, 82, 80, 128, 83, 72, 65, 82, 208, - 83, 72, 65, 82, 65, 128, 83, 72, 65, 82, 50, 128, 83, 72, 65, 82, 178, - 83, 72, 65, 80, 73, 78, 71, 128, 83, 72, 65, 80, 69, 83, 128, 83, 72, 65, - 80, 128, 83, 72, 65, 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, 206, - 83, 72, 65, 77, 82, 79, 67, 75, 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, - 84, 128, 83, 72, 65, 75, 84, 73, 128, 83, 72, 65, 68, 79, 87, 69, 196, - 83, 72, 65, 68, 69, 128, 83, 72, 65, 68, 68, 65, 128, 83, 72, 65, 68, 68, - 193, 83, 72, 65, 68, 128, 83, 72, 65, 196, 83, 72, 65, 66, 54, 128, 83, - 72, 65, 65, 128, 83, 72, 65, 54, 128, 83, 72, 65, 51, 128, 83, 72, 65, - 179, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, 65, 215, 83, 71, 65, 194, - 83, 71, 128, 83, 69, 88, 84, 85, 76, 193, 83, 69, 88, 84, 73, 76, 69, - 128, 83, 69, 88, 84, 65, 78, 211, 83, 69, 86, 69, 82, 65, 78, 67, 69, - 128, 83, 69, 86, 69, 78, 84, 89, 128, 83, 69, 86, 69, 78, 84, 217, 83, - 69, 86, 69, 78, 84, 72, 128, 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 83, - 69, 86, 69, 78, 84, 69, 69, 206, 83, 69, 86, 69, 206, 83, 69, 85, 88, - 128, 83, 69, 83, 84, 69, 82, 84, 73, 85, 211, 83, 69, 83, 81, 85, 73, 81, - 85, 65, 68, 82, 65, 84, 69, 128, 83, 69, 83, 65, 77, 197, 83, 69, 82, 86, - 73, 67, 197, 83, 69, 82, 73, 70, 83, 128, 83, 69, 82, 73, 70, 211, 83, - 69, 80, 84, 69, 77, 66, 69, 82, 128, 83, 69, 80, 65, 82, 65, 84, 79, 82, - 128, 83, 69, 80, 65, 82, 65, 84, 79, 210, 83, 69, 78, 84, 79, 128, 83, - 69, 78, 84, 73, 128, 83, 69, 77, 85, 78, 67, 73, 193, 83, 69, 77, 75, 65, - 84, 72, 128, 83, 69, 77, 75, 128, 83, 69, 77, 73, 86, 79, 87, 69, 204, - 83, 69, 77, 73, 83, 79, 70, 212, 83, 69, 77, 73, 83, 69, 88, 84, 73, 76, - 69, 128, 83, 69, 77, 73, 77, 73, 78, 73, 77, 193, 83, 69, 77, 73, 68, 73, - 82, 69, 67, 212, 83, 69, 77, 73, 67, 79, 76, 79, 78, 128, 83, 69, 77, 73, - 67, 79, 76, 79, 206, 83, 69, 77, 73, 67, 73, 82, 67, 85, 76, 65, 210, 83, - 69, 77, 73, 67, 73, 82, 67, 76, 197, 83, 69, 77, 73, 66, 82, 69, 86, 73, - 211, 83, 69, 77, 73, 45, 86, 79, 73, 67, 69, 196, 83, 69, 76, 70, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 57, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 55, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 54, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 57, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 52, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 51, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 57, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 49, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 48, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 57, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 56, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 54, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 51, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 48, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 56, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 55, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 55, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 53, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 55, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 55, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 50, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 55, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 55, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 54, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 55, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 54, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 52, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 54, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 54, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 57, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 53, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, - 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 54, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, - 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 51, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, - 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 48, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 57, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 56, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 54, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 53, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 51, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 50, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 48, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 56, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 55, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 53, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 52, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 50, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 49, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 55, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 53, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 52, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 49, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 48, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 57, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 56, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 53, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 52, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, - 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 57, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 56, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, - 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 53, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 50, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 49, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 57, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 54, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 53, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 50, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 57, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 54, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 51, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 50, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 55, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 54, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 48, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 51, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 50, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, - 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, - 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 56, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 57, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 53, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 52, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 57, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 57, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 49, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 57, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 56, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 56, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 56, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 53, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 56, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 50, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 49, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 57, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 55, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 54, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 53, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 55, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 55, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 50, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 49, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 55, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 57, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 54, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 54, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 53, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, - 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 50, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 54, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 57, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 53, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, - 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 54, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 51, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 50, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 55, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 54, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 51, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 48, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 55, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 52, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 51, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 48, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 56, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 55, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 52, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 51, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, - 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 48, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 56, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 55, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, - 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 52, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 49, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 48, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, - 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 56, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 48, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 53, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 52, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 48, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 49, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 48, 48, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, - 76, 69, 67, 84, 79, 210, 83, 69, 73, 83, 77, 65, 128, 83, 69, 73, 83, 77, - 193, 83, 69, 72, 128, 83, 69, 71, 79, 76, 128, 83, 69, 71, 78, 79, 128, - 83, 69, 71, 77, 69, 78, 84, 128, 83, 69, 69, 78, 85, 128, 83, 69, 69, 78, - 128, 83, 69, 69, 206, 83, 69, 67, 84, 79, 82, 128, 83, 69, 67, 84, 73, - 79, 78, 128, 83, 69, 67, 84, 73, 79, 206, 83, 69, 67, 82, 69, 84, 128, - 83, 69, 67, 79, 78, 68, 128, 83, 69, 66, 65, 84, 66, 69, 73, 212, 83, 69, - 65, 76, 128, 83, 69, 65, 71, 85, 76, 204, 83, 68, 79, 78, 199, 83, 68, - 128, 83, 67, 87, 65, 128, 83, 67, 82, 85, 80, 76, 69, 128, 83, 67, 82, - 73, 80, 84, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, 206, - 83, 67, 79, 82, 80, 73, 85, 83, 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, - 83, 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79, 69, 68, - 69, 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 76, 65, 82, - 128, 83, 67, 72, 69, 77, 193, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, - 83, 67, 65, 78, 68, 73, 67, 85, 211, 83, 67, 65, 206, 83, 67, 65, 76, 69, - 83, 128, 83, 66, 85, 194, 83, 66, 82, 85, 204, 83, 65, 89, 73, 83, 201, - 83, 65, 89, 65, 78, 78, 65, 128, 83, 65, 89, 128, 83, 65, 88, 73, 77, 65, - 84, 65, 128, 83, 65, 87, 65, 78, 128, 83, 65, 87, 128, 83, 65, 85, 73, - 76, 128, 83, 65, 84, 85, 82, 78, 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, - 85, 128, 83, 65, 84, 75, 65, 65, 78, 128, 83, 65, 83, 65, 75, 128, 83, - 65, 82, 73, 128, 83, 65, 82, 193, 83, 65, 82, 128, 83, 65, 80, 65, 128, - 83, 65, 78, 89, 79, 79, 71, 193, 83, 65, 78, 89, 65, 75, 193, 83, 65, 78, - 84, 73, 73, 77, 85, 128, 83, 65, 78, 78, 89, 65, 128, 83, 65, 78, 71, 65, - 50, 128, 83, 65, 78, 65, 72, 128, 83, 65, 78, 128, 83, 65, 77, 89, 79, - 203, 83, 65, 77, 80, 73, 128, 83, 65, 77, 80, 72, 65, 79, 128, 83, 65, - 77, 75, 65, 128, 83, 65, 77, 69, 75, 72, 128, 83, 65, 77, 69, 75, 200, - 83, 65, 77, 66, 65, 128, 83, 65, 77, 128, 83, 65, 76, 84, 73, 82, 69, - 128, 83, 65, 76, 84, 73, 76, 76, 79, 128, 83, 65, 76, 84, 128, 83, 65, + 83, 84, 69, 77, 128, 83, 84, 69, 205, 83, 84, 69, 65, 77, 73, 78, 199, + 83, 84, 69, 65, 77, 128, 83, 84, 69, 65, 205, 83, 84, 65, 86, 82, 79, 85, + 128, 83, 84, 65, 86, 82, 79, 83, 128, 83, 84, 65, 86, 82, 79, 211, 83, + 84, 65, 85, 82, 79, 83, 128, 83, 84, 65, 84, 85, 197, 83, 84, 65, 84, 73, + 79, 78, 128, 83, 84, 65, 84, 69, 82, 83, 128, 83, 84, 65, 82, 212, 83, + 84, 65, 82, 83, 128, 83, 84, 65, 82, 82, 69, 196, 83, 84, 65, 82, 75, + 128, 83, 84, 65, 82, 128, 83, 84, 65, 210, 83, 84, 65, 78, 68, 83, 84, + 73, 76, 76, 128, 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, 65, 78, 68, + 128, 83, 84, 65, 78, 128, 83, 84, 65, 76, 76, 73, 79, 78, 128, 83, 84, + 65, 70, 70, 128, 83, 84, 65, 70, 198, 83, 84, 65, 67, 67, 65, 84, 79, + 128, 83, 84, 65, 67, 67, 65, 84, 73, 83, 83, 73, 77, 79, 128, 83, 84, 50, + 128, 83, 83, 89, 88, 128, 83, 83, 89, 84, 128, 83, 83, 89, 82, 88, 128, + 83, 83, 89, 82, 128, 83, 83, 89, 80, 128, 83, 83, 89, 128, 83, 83, 85, + 88, 128, 83, 83, 85, 84, 128, 83, 83, 85, 80, 128, 83, 83, 79, 88, 128, + 83, 83, 79, 84, 128, 83, 83, 79, 80, 128, 83, 83, 79, 128, 83, 83, 73, + 88, 128, 83, 83, 73, 84, 128, 83, 83, 73, 80, 128, 83, 83, 73, 69, 88, + 128, 83, 83, 73, 69, 80, 128, 83, 83, 73, 69, 128, 83, 83, 73, 128, 83, + 83, 72, 69, 128, 83, 83, 69, 88, 128, 83, 83, 69, 80, 128, 83, 83, 69, + 69, 128, 83, 83, 65, 88, 128, 83, 83, 65, 84, 128, 83, 83, 65, 80, 128, + 83, 83, 65, 78, 71, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 83, + 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 83, + 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 84, 72, + 73, 69, 85, 84, 72, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 84, 73, + 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 80, 73, 69, + 85, 80, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, + 75, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 83, 65, 78, 71, 82, + 73, 69, 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 83, 65, 78, 71, + 82, 73, 69, 85, 76, 128, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 83, + 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 83, 83, 65, 78, 71, 77, 73, 69, + 85, 77, 128, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 83, 83, 65, + 78, 71, 73, 69, 85, 78, 71, 128, 83, 83, 65, 78, 71, 72, 73, 69, 85, 72, + 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 45, 72, 73, 69, 85, 72, 128, + 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 83, 83, 65, 78, 71, 65, 82, + 65, 69, 65, 128, 83, 83, 65, 65, 128, 83, 83, 65, 128, 83, 82, 128, 83, + 81, 85, 73, 83, 200, 83, 81, 85, 73, 82, 82, 69, 204, 83, 81, 85, 73, 71, + 71, 76, 197, 83, 81, 85, 65, 212, 83, 81, 85, 65, 82, 69, 83, 128, 83, + 81, 85, 65, 82, 69, 68, 128, 83, 81, 85, 65, 82, 69, 128, 83, 80, 87, 65, + 128, 83, 80, 85, 78, 71, 211, 83, 80, 82, 79, 85, 84, 128, 83, 80, 82, + 73, 78, 71, 83, 128, 83, 80, 82, 73, 78, 71, 128, 83, 80, 82, 69, 67, 72, + 71, 69, 83, 65, 78, 199, 83, 80, 79, 85, 84, 73, 78, 199, 83, 80, 79, 84, + 128, 83, 80, 79, 79, 78, 128, 83, 80, 76, 73, 84, 84, 73, 78, 199, 83, + 80, 76, 65, 83, 72, 73, 78, 199, 83, 80, 73, 82, 73, 84, 85, 211, 83, 80, + 73, 82, 73, 84, 128, 83, 80, 73, 82, 73, 212, 83, 80, 73, 82, 65, 78, 84, + 128, 83, 80, 73, 82, 65, 76, 128, 83, 80, 73, 82, 65, 204, 83, 80, 73, + 68, 69, 82, 217, 83, 80, 73, 67, 69, 128, 83, 80, 72, 69, 82, 73, 67, 65, + 204, 83, 80, 69, 83, 77, 73, 76, 207, 83, 80, 69, 69, 68, 66, 79, 65, 84, + 128, 83, 80, 69, 69, 67, 72, 128, 83, 80, 69, 69, 67, 200, 83, 80, 69, + 67, 73, 65, 76, 128, 83, 80, 69, 65, 82, 128, 83, 80, 69, 65, 75, 69, 82, + 128, 83, 80, 69, 65, 75, 69, 210, 83, 80, 69, 65, 75, 45, 78, 79, 45, 69, + 86, 73, 204, 83, 80, 65, 84, 72, 73, 128, 83, 80, 65, 82, 75, 76, 73, 78, + 199, 83, 80, 65, 82, 75, 76, 69, 83, 128, 83, 80, 65, 82, 75, 76, 69, 82, + 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, 80, 65, 71, 72, 69, 84, 84, 73, + 128, 83, 80, 65, 68, 69, 83, 128, 83, 80, 65, 68, 197, 83, 80, 65, 67, + 73, 78, 199, 83, 80, 65, 67, 197, 83, 80, 128, 83, 79, 89, 128, 83, 79, + 87, 73, 76, 207, 83, 79, 87, 128, 83, 79, 85, 84, 72, 69, 82, 206, 83, + 79, 85, 84, 72, 45, 83, 76, 65, 86, 69, 217, 83, 79, 85, 84, 200, 83, 79, + 85, 82, 67, 69, 128, 83, 79, 85, 78, 68, 128, 83, 79, 85, 78, 196, 83, + 79, 85, 78, 65, 80, 128, 83, 79, 85, 128, 83, 79, 83, 128, 83, 79, 81, + 128, 83, 79, 79, 206, 83, 79, 79, 128, 83, 79, 78, 74, 65, 77, 128, 83, + 79, 78, 71, 128, 83, 79, 78, 128, 83, 79, 77, 128, 83, 79, 76, 73, 68, + 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, 83, 79, 71, 68, 73, 65, 206, + 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, 67, 84, 73, 79, 206, 83, + 79, 70, 84, 78, 69, 83, 83, 128, 83, 79, 70, 212, 83, 79, 198, 83, 79, + 67, 73, 69, 84, 89, 128, 83, 79, 67, 67, 69, 210, 83, 79, 65, 80, 128, + 83, 79, 65, 128, 83, 207, 83, 78, 79, 87, 77, 65, 78, 128, 83, 78, 79, + 87, 77, 65, 206, 83, 78, 79, 87, 70, 76, 65, 75, 69, 128, 83, 78, 79, 87, + 66, 79, 65, 82, 68, 69, 82, 128, 83, 78, 79, 87, 128, 83, 78, 79, 85, 84, + 128, 83, 78, 79, 85, 212, 83, 78, 65, 208, 83, 78, 65, 75, 69, 128, 83, + 78, 65, 75, 197, 83, 78, 65, 73, 76, 128, 83, 78, 193, 83, 77, 79, 75, + 73, 78, 199, 83, 77, 73, 82, 75, 73, 78, 199, 83, 77, 73, 76, 73, 78, + 199, 83, 77, 73, 76, 69, 128, 83, 77, 69, 65, 82, 128, 83, 77, 65, 83, + 200, 83, 77, 65, 76, 76, 69, 210, 83, 77, 65, 76, 76, 128, 83, 76, 85, + 82, 128, 83, 76, 79, 87, 76, 89, 128, 83, 76, 79, 215, 83, 76, 79, 86, + 79, 128, 83, 76, 79, 212, 83, 76, 79, 80, 73, 78, 199, 83, 76, 79, 80, + 69, 128, 83, 76, 73, 78, 71, 128, 83, 76, 73, 68, 73, 78, 71, 128, 83, + 76, 73, 67, 69, 128, 83, 76, 73, 67, 197, 83, 76, 69, 69, 80, 217, 83, + 76, 69, 69, 80, 73, 78, 199, 83, 76, 65, 86, 79, 78, 73, 195, 83, 76, 65, + 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, 65, 83, 200, 83, 76, 65, + 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, 87, 128, 83, 75, 85, 76, + 76, 128, 83, 75, 85, 76, 204, 83, 75, 76, 73, 82, 79, 206, 83, 75, 73, + 78, 128, 83, 75, 73, 69, 82, 128, 83, 75, 201, 83, 75, 69, 87, 69, 196, + 83, 75, 65, 84, 69, 128, 83, 75, 128, 83, 74, 69, 128, 83, 73, 88, 84, + 89, 45, 70, 79, 85, 82, 84, 200, 83, 73, 88, 84, 89, 128, 83, 73, 88, 84, + 217, 83, 73, 88, 84, 72, 83, 128, 83, 73, 88, 84, 72, 211, 83, 73, 88, + 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 83, 128, 83, 73, 88, 84, + 69, 69, 78, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, 83, 73, 88, + 84, 69, 69, 78, 128, 83, 73, 88, 84, 69, 69, 206, 83, 73, 88, 45, 84, 72, + 73, 82, 84, 89, 128, 83, 73, 88, 45, 83, 84, 82, 73, 78, 199, 83, 73, 88, + 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 76, 73, 78, 197, 83, 73, + 216, 83, 73, 84, 69, 128, 83, 73, 83, 65, 128, 83, 73, 82, 73, 78, 71, + 85, 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 83, 73, 79, + 83, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, 82, + 73, 69, 85, 76, 128, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 45, 75, 73, + 89, 69, 79, 75, 128, 83, 73, 79, 83, 45, 80, 72, 73, 69, 85, 80, 72, 128, + 83, 73, 79, 83, 45, 80, 65, 78, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, + 78, 73, 69, 85, 78, 128, 83, 73, 79, 83, 45, 77, 73, 69, 85, 77, 128, 83, + 73, 79, 83, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 73, 79, 83, 45, 75, + 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 83, 73, 79, 83, 45, + 73, 69, 85, 78, 71, 128, 83, 73, 79, 83, 45, 72, 73, 69, 85, 72, 128, 83, + 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 83, 73, 79, 83, 45, 67, 72, 73, + 69, 85, 67, 72, 128, 83, 73, 79, 211, 83, 73, 78, 75, 73, 78, 71, 128, + 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128, + 83, 73, 78, 71, 76, 197, 83, 73, 78, 71, 65, 65, 84, 128, 83, 73, 78, + 197, 83, 73, 78, 68, 72, 201, 83, 73, 206, 83, 73, 77, 80, 76, 73, 70, + 73, 69, 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, + 210, 83, 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 76, 85, 78, 71, 85, + 206, 83, 73, 77, 65, 128, 83, 73, 76, 86, 69, 82, 128, 83, 73, 76, 75, + 128, 83, 73, 76, 73, 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, 84, 84, 69, + 128, 83, 73, 76, 72, 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, 51, 128, + 83, 73, 75, 73, 128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 73, + 128, 83, 73, 71, 78, 83, 128, 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, + 193, 83, 73, 71, 69, 204, 83, 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, + 71, 128, 83, 73, 69, 69, 128, 83, 73, 68, 69, 87, 65, 89, 211, 83, 73, + 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, 75, 76, 69, 128, 83, 73, 66, + 197, 83, 201, 83, 72, 89, 88, 128, 83, 72, 89, 84, 128, 83, 72, 89, 82, + 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, 80, 128, 83, 72, 89, 69, 128, + 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, 72, 87, 79, 89, 128, 83, 72, + 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, 72, 87, 73, 73, 128, 83, 72, + 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, 87, 65, 65, 128, 83, 72, 87, + 65, 128, 83, 72, 85, 88, 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, + 128, 83, 72, 85, 82, 128, 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, + 83, 72, 85, 79, 80, 128, 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83, + 72, 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, 69, 78, 83, + 72, 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, 50, 128, + 83, 72, 85, 178, 83, 72, 85, 128, 83, 72, 213, 83, 72, 84, 65, 80, 73, + 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 73, 78, 69, 128, 83, 72, 82, + 73, 77, 80, 128, 83, 72, 79, 89, 128, 83, 72, 79, 88, 128, 83, 72, 79, + 87, 69, 82, 128, 83, 72, 79, 85, 76, 68, 69, 82, 69, 196, 83, 72, 79, 84, + 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, 84, 211, 83, 72, 79, + 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, 84, 67, 65, 75, 69, 128, 83, + 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84, + 45, 84, 87, 73, 71, 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, + 71, 45, 83, 79, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, + 211, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72, + 79, 82, 84, 45, 84, 87, 73, 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84, + 45, 84, 87, 73, 71, 45, 72, 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45, + 84, 87, 73, 71, 45, 66, 74, 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45, + 84, 87, 73, 71, 45, 65, 210, 83, 72, 79, 82, 84, 128, 83, 72, 79, 82, + 212, 83, 72, 79, 81, 128, 83, 72, 79, 209, 83, 72, 79, 80, 128, 83, 72, + 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79, 128, + 83, 72, 79, 71, 201, 83, 72, 79, 199, 83, 72, 79, 69, 128, 83, 72, 79, + 197, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, 73, 89, 89, 65, 65, + 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, 84, 193, 83, 72, + 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, 82, 128, 83, 72, + 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 80, 128, 83, 72, 73, 78, 84, + 207, 83, 72, 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72, 73, + 78, 128, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, 77, 193, + 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, 78, 128, 83, 72, + 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, 68, 128, 83, 72, + 73, 68, 128, 83, 72, 73, 196, 83, 72, 72, 65, 128, 83, 72, 72, 193, 83, + 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, 85, 88, 128, 83, + 72, 69, 85, 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, 85, 128, 83, 72, + 69, 85, 65, 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, 83, 72, 69, 84, + 128, 83, 72, 69, 212, 83, 72, 69, 83, 72, 76, 65, 77, 128, 83, 72, 69, + 83, 72, 73, 71, 128, 83, 72, 69, 83, 72, 73, 199, 83, 72, 69, 83, 72, 50, + 128, 83, 72, 69, 83, 72, 128, 83, 72, 69, 81, 69, 204, 83, 72, 69, 80, + 128, 83, 72, 69, 78, 128, 83, 72, 69, 76, 76, 128, 83, 72, 69, 76, 204, + 83, 72, 69, 76, 70, 128, 83, 72, 69, 73, 128, 83, 72, 69, 71, 57, 128, + 83, 72, 69, 69, 80, 128, 83, 72, 69, 69, 78, 85, 128, 83, 72, 69, 69, 78, + 128, 83, 72, 69, 69, 206, 83, 72, 69, 69, 128, 83, 72, 69, 45, 71, 79, + 65, 84, 128, 83, 72, 197, 83, 72, 67, 72, 65, 128, 83, 72, 65, 89, 128, + 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, 83, 72, 65, + 86, 73, 65, 206, 83, 72, 65, 86, 69, 196, 83, 72, 65, 84, 128, 83, 72, + 65, 82, 85, 128, 83, 72, 65, 82, 213, 83, 72, 65, 82, 80, 128, 83, 72, + 65, 82, 208, 83, 72, 65, 82, 65, 128, 83, 72, 65, 82, 50, 128, 83, 72, + 65, 82, 178, 83, 72, 65, 80, 73, 78, 71, 128, 83, 72, 65, 80, 69, 83, + 128, 83, 72, 65, 80, 197, 83, 72, 65, 80, 128, 83, 72, 65, 78, 71, 128, + 83, 72, 65, 78, 128, 83, 72, 65, 206, 83, 72, 65, 77, 82, 79, 67, 75, + 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, 84, 128, 83, 72, 65, 75, 84, 73, + 128, 83, 72, 65, 68, 79, 87, 69, 196, 83, 72, 65, 68, 69, 128, 83, 72, + 65, 68, 68, 65, 128, 83, 72, 65, 68, 68, 193, 83, 72, 65, 68, 128, 83, + 72, 65, 196, 83, 72, 65, 66, 54, 128, 83, 72, 65, 65, 128, 83, 72, 65, + 54, 128, 83, 72, 65, 51, 128, 83, 72, 65, 179, 83, 71, 82, 193, 83, 71, + 79, 210, 83, 71, 65, 215, 83, 71, 65, 194, 83, 71, 128, 83, 69, 88, 84, + 85, 76, 193, 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 88, 84, 65, 78, + 211, 83, 69, 86, 69, 82, 65, 78, 67, 69, 128, 83, 69, 86, 69, 78, 84, 89, + 128, 83, 69, 86, 69, 78, 84, 217, 83, 69, 86, 69, 78, 84, 72, 128, 83, + 69, 86, 69, 78, 84, 69, 69, 78, 128, 83, 69, 86, 69, 78, 84, 69, 69, 206, + 83, 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 83, 69, 86, 69, 206, + 83, 69, 85, 88, 128, 83, 69, 85, 78, 89, 65, 77, 128, 83, 69, 85, 65, 69, + 81, 128, 83, 69, 84, 70, 79, 78, 128, 83, 69, 83, 84, 69, 82, 84, 73, 85, + 211, 83, 69, 83, 81, 85, 73, 81, 85, 65, 68, 82, 65, 84, 69, 128, 83, 69, + 83, 65, 77, 197, 83, 69, 82, 86, 73, 67, 197, 83, 69, 82, 73, 70, 83, + 128, 83, 69, 82, 73, 70, 211, 83, 69, 80, 84, 69, 77, 66, 69, 82, 128, + 83, 69, 80, 65, 82, 65, 84, 79, 82, 128, 83, 69, 80, 65, 82, 65, 84, 79, + 210, 83, 69, 78, 84, 79, 128, 83, 69, 78, 84, 73, 128, 83, 69, 77, 85, + 78, 67, 73, 193, 83, 69, 77, 75, 65, 84, 72, 128, 83, 69, 77, 75, 128, + 83, 69, 77, 73, 86, 79, 87, 69, 204, 83, 69, 77, 73, 83, 79, 70, 212, 83, + 69, 77, 73, 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 77, 73, 77, 73, 78, + 73, 77, 193, 83, 69, 77, 73, 68, 73, 82, 69, 67, 212, 83, 69, 77, 73, 67, + 79, 76, 79, 78, 128, 83, 69, 77, 73, 67, 79, 76, 79, 206, 83, 69, 77, 73, + 67, 73, 82, 67, 85, 76, 65, 210, 83, 69, 77, 73, 67, 73, 82, 67, 76, 197, + 83, 69, 77, 73, 66, 82, 69, 86, 73, 211, 83, 69, 77, 73, 45, 86, 79, 73, + 67, 69, 196, 83, 69, 76, 70, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, + 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 56, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, + 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 53, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, + 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 50, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, + 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 56, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 55, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 56, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 53, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 52, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 56, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 50, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 49, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 57, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 55, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 54, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 52, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 51, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 49, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 48, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 57, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 54, 56, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 54, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 54, 53, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 51, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 48, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 56, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 53, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 53, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 50, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 55, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 52, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 49, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 57, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, + 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 54, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, + 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 51, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, + 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 48, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 57, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 56, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 54, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 54, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 51, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 50, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, + 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 55, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 54, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, + 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 51, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 48, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, + 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 55, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 52, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 51, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 48, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 56, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 55, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 52, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 49, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 48, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 56, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 53, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 52, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 49, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 48, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 57, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 56, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 48, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 53, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 52, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, + 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 49, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 48, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 57, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 55, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 54, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 57, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 51, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 57, 50, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 48, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 55, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 56, 54, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 52, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 51, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 48, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 56, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 55, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 55, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 52, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 51, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, + 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 48, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 56, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 55, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, + 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 52, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 54, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 49, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 48, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, + 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 56, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 53, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 53, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 52, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 49, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 57, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 56, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 53, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 50, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 49, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 57, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 54, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 53, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 50, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 49, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 57, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 54, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 53, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, + 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 50, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 57, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, + 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 54, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 51, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 50, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 55, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 54, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 48, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 51, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 48, 50, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 48, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, 210, 83, 69, 73, 83, + 77, 65, 128, 83, 69, 73, 83, 77, 193, 83, 69, 72, 128, 83, 69, 71, 79, + 76, 128, 83, 69, 71, 78, 79, 128, 83, 69, 71, 77, 69, 78, 84, 128, 83, + 69, 69, 78, 85, 128, 83, 69, 69, 78, 128, 83, 69, 69, 206, 83, 69, 69, + 68, 76, 73, 78, 71, 128, 83, 69, 69, 45, 78, 79, 45, 69, 86, 73, 204, 83, + 69, 67, 84, 79, 82, 128, 83, 69, 67, 84, 73, 79, 78, 128, 83, 69, 67, 84, + 73, 79, 206, 83, 69, 67, 82, 69, 84, 128, 83, 69, 67, 79, 78, 68, 128, + 83, 69, 66, 65, 84, 66, 69, 73, 212, 83, 69, 65, 84, 128, 83, 69, 65, 76, + 128, 83, 69, 65, 71, 85, 76, 204, 83, 68, 79, 78, 199, 83, 68, 128, 83, + 67, 87, 65, 128, 83, 67, 82, 85, 80, 76, 69, 128, 83, 67, 82, 79, 76, 76, + 128, 83, 67, 82, 73, 80, 84, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, + 82, 69, 69, 206, 83, 67, 82, 69, 65, 77, 73, 78, 199, 83, 67, 79, 82, 80, + 73, 85, 83, 128, 83, 67, 79, 82, 69, 128, 83, 67, 73, 83, 83, 79, 82, 83, + 128, 83, 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79, + 69, 68, 69, 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79, + 204, 83, 67, 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67, + 69, 80, 84, 69, 210, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, 83, 67, 65, + 78, 68, 73, 67, 85, 211, 83, 67, 65, 206, 83, 67, 65, 76, 69, 83, 128, + 83, 66, 85, 194, 83, 66, 82, 85, 204, 83, 65, 89, 73, 83, 201, 83, 65, + 89, 65, 78, 78, 65, 128, 83, 65, 89, 128, 83, 65, 88, 79, 80, 72, 79, 78, + 69, 128, 83, 65, 88, 73, 77, 65, 84, 65, 128, 83, 65, 87, 65, 78, 128, + 83, 65, 87, 128, 83, 65, 86, 79, 85, 82, 73, 78, 199, 83, 65, 85, 73, 76, + 128, 83, 65, 84, 85, 82, 78, 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, 85, + 128, 83, 65, 84, 75, 65, 65, 78, 128, 83, 65, 84, 69, 76, 76, 73, 84, + 197, 83, 65, 84, 67, 72, 69, 76, 128, 83, 65, 83, 72, 128, 83, 65, 83, + 65, 75, 128, 83, 65, 82, 73, 128, 83, 65, 82, 193, 83, 65, 82, 128, 83, + 65, 81, 128, 83, 65, 80, 65, 128, 83, 65, 78, 89, 79, 79, 71, 193, 83, + 65, 78, 89, 65, 75, 193, 83, 65, 78, 84, 73, 73, 77, 85, 128, 83, 65, 78, + 78, 89, 65, 128, 83, 65, 78, 71, 65, 50, 128, 83, 65, 78, 68, 65, 76, + 128, 83, 65, 78, 65, 72, 128, 83, 65, 78, 128, 83, 65, 77, 89, 79, 203, + 83, 65, 77, 80, 73, 128, 83, 65, 77, 80, 72, 65, 79, 128, 83, 65, 77, 75, + 65, 128, 83, 65, 77, 69, 75, 72, 128, 83, 65, 77, 69, 75, 200, 83, 65, + 77, 66, 65, 128, 83, 65, 77, 65, 82, 73, 84, 65, 206, 83, 65, 77, 128, + 83, 65, 76, 84, 73, 82, 69, 128, 83, 65, 76, 84, 73, 76, 76, 79, 128, 83, + 65, 76, 84, 45, 50, 128, 83, 65, 76, 84, 128, 83, 65, 76, 212, 83, 65, 76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 65, 76, 76, 193, 83, 65, 76, 65, - 205, 83, 65, 76, 65, 128, 83, 65, 76, 128, 83, 65, 75, 79, 84, 128, 83, - 65, 74, 68, 65, 72, 128, 83, 65, 73, 76, 66, 79, 65, 84, 128, 83, 65, 73, - 76, 128, 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 71, 73, 84, 84, 65, 82, - 73, 85, 83, 128, 83, 65, 71, 65, 128, 83, 65, 71, 128, 83, 65, 199, 83, - 65, 70, 72, 65, 128, 83, 65, 68, 72, 69, 128, 83, 65, 68, 69, 128, 83, - 65, 68, 128, 83, 65, 196, 83, 65, 67, 82, 73, 70, 73, 67, 73, 65, 204, - 83, 65, 65, 73, 128, 83, 65, 65, 68, 72, 85, 128, 83, 65, 45, 73, 128, - 83, 48, 52, 54, 128, 83, 48, 52, 53, 128, 83, 48, 52, 52, 128, 83, 48, - 52, 51, 128, 83, 48, 52, 50, 128, 83, 48, 52, 49, 128, 83, 48, 52, 48, - 128, 83, 48, 51, 57, 128, 83, 48, 51, 56, 128, 83, 48, 51, 55, 128, 83, - 48, 51, 54, 128, 83, 48, 51, 53, 65, 128, 83, 48, 51, 53, 128, 83, 48, - 51, 52, 128, 83, 48, 51, 51, 128, 83, 48, 51, 50, 128, 83, 48, 51, 49, - 128, 83, 48, 51, 48, 128, 83, 48, 50, 57, 128, 83, 48, 50, 56, 128, 83, - 48, 50, 55, 128, 83, 48, 50, 54, 66, 128, 83, 48, 50, 54, 65, 128, 83, - 48, 50, 54, 128, 83, 48, 50, 53, 128, 83, 48, 50, 52, 128, 83, 48, 50, - 51, 128, 83, 48, 50, 50, 128, 83, 48, 50, 49, 128, 83, 48, 50, 48, 128, - 83, 48, 49, 57, 128, 83, 48, 49, 56, 128, 83, 48, 49, 55, 65, 128, 83, - 48, 49, 55, 128, 83, 48, 49, 54, 128, 83, 48, 49, 53, 128, 83, 48, 49, - 52, 66, 128, 83, 48, 49, 52, 65, 128, 83, 48, 49, 52, 128, 83, 48, 49, - 51, 128, 83, 48, 49, 50, 128, 83, 48, 49, 49, 128, 83, 48, 49, 48, 128, - 83, 48, 48, 57, 128, 83, 48, 48, 56, 128, 83, 48, 48, 55, 128, 83, 48, - 48, 54, 65, 128, 83, 48, 48, 54, 128, 83, 48, 48, 53, 128, 83, 48, 48, - 52, 128, 83, 48, 48, 51, 128, 83, 48, 48, 50, 65, 128, 83, 48, 48, 50, - 128, 83, 48, 48, 49, 128, 83, 45, 87, 128, 83, 45, 83, 72, 65, 80, 69, - 196, 82, 89, 89, 128, 82, 89, 88, 128, 82, 89, 84, 128, 82, 89, 82, 88, - 128, 82, 89, 82, 128, 82, 89, 80, 128, 82, 89, 65, 128, 82, 87, 79, 79, - 128, 82, 87, 79, 128, 82, 87, 73, 73, 128, 82, 87, 73, 128, 82, 87, 69, - 69, 128, 82, 87, 69, 128, 82, 87, 65, 72, 65, 128, 82, 87, 65, 65, 128, - 82, 87, 65, 128, 82, 85, 88, 128, 82, 85, 85, 66, 85, 82, 85, 128, 82, - 85, 84, 128, 82, 85, 83, 73, 128, 82, 85, 82, 88, 128, 82, 85, 82, 128, - 82, 85, 80, 73, 73, 128, 82, 85, 80, 69, 197, 82, 85, 80, 128, 82, 85, - 79, 88, 128, 82, 85, 79, 80, 128, 82, 85, 79, 128, 82, 85, 78, 79, 85, - 84, 128, 82, 85, 78, 128, 82, 85, 77, 201, 82, 85, 77, 65, 201, 82, 85, - 77, 128, 82, 85, 205, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, - 128, 82, 85, 76, 69, 128, 82, 85, 75, 75, 65, 75, 72, 65, 128, 82, 85, - 73, 83, 128, 82, 85, 194, 82, 85, 65, 128, 82, 84, 72, 65, 78, 199, 82, - 84, 65, 71, 83, 128, 82, 84, 65, 71, 211, 82, 82, 89, 88, 128, 82, 82, - 89, 84, 128, 82, 82, 89, 82, 88, 128, 82, 82, 89, 82, 128, 82, 82, 89, - 80, 128, 82, 82, 89, 128, 82, 82, 85, 88, 128, 82, 82, 85, 84, 128, 82, - 82, 85, 82, 88, 128, 82, 82, 85, 82, 128, 82, 82, 85, 80, 128, 82, 82, - 85, 79, 88, 128, 82, 82, 85, 79, 128, 82, 82, 85, 128, 82, 82, 79, 88, - 128, 82, 82, 79, 84, 128, 82, 82, 79, 80, 128, 82, 82, 79, 128, 82, 82, - 69, 88, 128, 82, 82, 69, 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, - 128, 82, 82, 69, 200, 82, 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, 65, - 128, 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, 73, 80, 80, - 69, 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, 84, 65, 84, 69, 196, - 82, 79, 83, 72, 128, 82, 79, 83, 69, 84, 84, 69, 128, 82, 79, 79, 84, - 128, 82, 79, 79, 75, 128, 82, 79, 79, 70, 128, 82, 79, 79, 128, 82, 79, - 77, 65, 206, 82, 79, 196, 82, 79, 67, 128, 82, 79, 66, 65, 84, 128, 82, - 79, 65, 82, 128, 82, 79, 65, 128, 82, 78, 89, 73, 78, 199, 82, 78, 79, - 79, 78, 128, 82, 78, 79, 79, 206, 82, 78, 65, 205, 82, 74, 69, 211, 82, - 74, 69, 128, 82, 74, 197, 82, 73, 86, 69, 82, 128, 82, 73, 84, 85, 65, - 76, 128, 82, 73, 84, 84, 79, 82, 85, 128, 82, 73, 84, 83, 73, 128, 82, - 73, 83, 73, 78, 199, 82, 73, 83, 72, 128, 82, 73, 82, 65, 128, 82, 73, - 80, 128, 82, 73, 78, 71, 211, 82, 73, 78, 70, 79, 82, 90, 65, 78, 68, 79, - 128, 82, 73, 206, 82, 73, 75, 82, 73, 75, 128, 82, 73, 73, 128, 82, 73, - 71, 86, 69, 68, 73, 195, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 82, - 73, 71, 72, 84, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, - 69, 70, 212, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 82, 73, 71, 72, 84, - 45, 83, 72, 65, 68, 79, 87, 69, 196, 82, 73, 71, 72, 84, 45, 83, 72, 65, - 68, 69, 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, - 73, 71, 72, 84, 45, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, - 73, 78, 199, 82, 73, 71, 72, 84, 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, - 73, 69, 85, 78, 71, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, - 72, 73, 69, 85, 72, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, - 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, - 84, 73, 75, 69, 85, 84, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, - 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 84, 72, 73, 69, - 85, 84, 72, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 84, 73, 75, - 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, - 83, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, - 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, - 128, 82, 73, 69, 85, 76, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, - 80, 73, 69, 85, 80, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, - 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, - 80, 73, 69, 85, 80, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, - 76, 45, 80, 73, 69, 85, 80, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, - 76, 45, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, - 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, - 82, 73, 69, 85, 76, 45, 78, 73, 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, - 77, 73, 69, 85, 77, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, - 73, 69, 85, 77, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, - 77, 73, 69, 85, 77, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, - 77, 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, - 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, - 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, - 75, 128, 82, 73, 69, 85, 76, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, - 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, - 69, 85, 76, 45, 67, 73, 69, 85, 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, - 76, 128, 82, 73, 69, 69, 128, 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, - 128, 82, 73, 65, 204, 82, 72, 79, 84, 73, 195, 82, 72, 79, 128, 82, 72, - 207, 82, 72, 65, 128, 82, 71, 89, 73, 78, 71, 83, 128, 82, 71, 89, 65, - 78, 128, 82, 71, 89, 193, 82, 69, 86, 79, 76, 85, 84, 73, 79, 78, 128, - 82, 69, 86, 77, 65, 128, 82, 69, 86, 73, 65, 128, 82, 69, 86, 69, 82, 83, - 69, 68, 128, 82, 69, 86, 69, 82, 83, 197, 82, 69, 85, 88, 128, 82, 69, - 84, 85, 82, 78, 128, 82, 69, 84, 85, 82, 206, 82, 69, 84, 82, 79, 70, 76, - 69, 216, 82, 69, 84, 82, 69, 65, 84, 128, 82, 69, 83, 85, 80, 73, 78, 85, - 83, 128, 82, 69, 83, 84, 82, 73, 67, 84, 69, 196, 82, 69, 83, 84, 128, - 82, 69, 83, 80, 79, 78, 83, 69, 128, 82, 69, 83, 79, 85, 82, 67, 69, 128, - 82, 69, 83, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 83, 73, 83, 84, 65, - 78, 67, 69, 128, 82, 69, 83, 73, 68, 69, 78, 67, 69, 128, 82, 69, 83, + 205, 83, 65, 76, 65, 128, 83, 65, 76, 45, 65, 77, 77, 79, 78, 73, 65, 67, + 128, 83, 65, 76, 128, 83, 65, 75, 79, 84, 128, 83, 65, 75, 69, 85, 65, + 69, 128, 83, 65, 75, 197, 83, 65, 74, 68, 65, 72, 128, 83, 65, 73, 76, + 66, 79, 65, 84, 128, 83, 65, 73, 76, 128, 83, 65, 73, 75, 85, 82, 85, + 128, 83, 65, 71, 73, 84, 84, 65, 82, 73, 85, 83, 128, 83, 65, 71, 65, + 128, 83, 65, 71, 128, 83, 65, 199, 83, 65, 70, 72, 65, 128, 83, 65, 68, + 72, 69, 128, 83, 65, 68, 69, 128, 83, 65, 68, 128, 83, 65, 196, 83, 65, + 67, 82, 73, 70, 73, 67, 73, 65, 204, 83, 65, 65, 73, 128, 83, 65, 65, 68, + 72, 85, 128, 83, 65, 45, 73, 128, 83, 48, 52, 54, 128, 83, 48, 52, 53, + 128, 83, 48, 52, 52, 128, 83, 48, 52, 51, 128, 83, 48, 52, 50, 128, 83, + 48, 52, 49, 128, 83, 48, 52, 48, 128, 83, 48, 51, 57, 128, 83, 48, 51, + 56, 128, 83, 48, 51, 55, 128, 83, 48, 51, 54, 128, 83, 48, 51, 53, 65, + 128, 83, 48, 51, 53, 128, 83, 48, 51, 52, 128, 83, 48, 51, 51, 128, 83, + 48, 51, 50, 128, 83, 48, 51, 49, 128, 83, 48, 51, 48, 128, 83, 48, 50, + 57, 128, 83, 48, 50, 56, 128, 83, 48, 50, 55, 128, 83, 48, 50, 54, 66, + 128, 83, 48, 50, 54, 65, 128, 83, 48, 50, 54, 128, 83, 48, 50, 53, 128, + 83, 48, 50, 52, 128, 83, 48, 50, 51, 128, 83, 48, 50, 50, 128, 83, 48, + 50, 49, 128, 83, 48, 50, 48, 128, 83, 48, 49, 57, 128, 83, 48, 49, 56, + 128, 83, 48, 49, 55, 65, 128, 83, 48, 49, 55, 128, 83, 48, 49, 54, 128, + 83, 48, 49, 53, 128, 83, 48, 49, 52, 66, 128, 83, 48, 49, 52, 65, 128, + 83, 48, 49, 52, 128, 83, 48, 49, 51, 128, 83, 48, 49, 50, 128, 83, 48, + 49, 49, 128, 83, 48, 49, 48, 128, 83, 48, 48, 57, 128, 83, 48, 48, 56, + 128, 83, 48, 48, 55, 128, 83, 48, 48, 54, 65, 128, 83, 48, 48, 54, 128, + 83, 48, 48, 53, 128, 83, 48, 48, 52, 128, 83, 48, 48, 51, 128, 83, 48, + 48, 50, 65, 128, 83, 48, 48, 50, 128, 83, 48, 48, 49, 128, 83, 45, 87, + 128, 83, 45, 83, 72, 65, 80, 69, 196, 82, 89, 89, 128, 82, 89, 88, 128, + 82, 89, 84, 128, 82, 89, 82, 88, 128, 82, 89, 82, 128, 82, 89, 80, 128, + 82, 89, 65, 128, 82, 87, 79, 79, 128, 82, 87, 79, 128, 82, 87, 73, 73, + 128, 82, 87, 73, 128, 82, 87, 69, 69, 128, 82, 87, 69, 128, 82, 87, 65, + 72, 65, 128, 82, 87, 65, 65, 128, 82, 87, 65, 128, 82, 85, 88, 128, 82, + 85, 85, 66, 85, 82, 85, 128, 82, 85, 84, 128, 82, 85, 83, 73, 128, 82, + 85, 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, 128, 82, 85, 80, + 69, 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, 79, 80, 128, 82, + 85, 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, 78, 73, 78, 199, + 82, 85, 78, 78, 69, 82, 128, 82, 85, 78, 128, 82, 85, 77, 201, 82, 85, + 77, 65, 201, 82, 85, 77, 128, 82, 85, 205, 82, 85, 76, 69, 82, 128, 82, + 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, 128, 82, 85, 76, 69, 128, 82, + 85, 75, 75, 65, 75, 72, 65, 128, 82, 85, 73, 83, 128, 82, 85, 71, 66, + 217, 82, 85, 194, 82, 85, 65, 128, 82, 84, 72, 65, 78, 199, 82, 84, 65, + 71, 83, 128, 82, 84, 65, 71, 211, 82, 82, 89, 88, 128, 82, 82, 89, 84, + 128, 82, 82, 89, 82, 88, 128, 82, 82, 89, 82, 128, 82, 82, 89, 80, 128, + 82, 82, 85, 88, 128, 82, 82, 85, 84, 128, 82, 82, 85, 82, 88, 128, 82, + 82, 85, 82, 128, 82, 82, 85, 80, 128, 82, 82, 85, 79, 88, 128, 82, 82, + 85, 79, 128, 82, 82, 85, 128, 82, 82, 79, 88, 128, 82, 82, 79, 84, 128, + 82, 82, 79, 80, 128, 82, 82, 79, 128, 82, 82, 69, 88, 128, 82, 82, 69, + 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, 128, 82, 82, 69, 200, 82, + 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, 65, 128, 82, 79, 87, 66, 79, + 65, 84, 128, 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, 73, + 80, 80, 69, 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, 84, 65, 84, 69, + 196, 82, 79, 83, 72, 128, 82, 79, 83, 69, 84, 84, 69, 128, 82, 79, 83, + 69, 128, 82, 79, 79, 84, 128, 82, 79, 79, 83, 84, 69, 82, 128, 82, 79, + 79, 75, 128, 82, 79, 79, 70, 128, 82, 79, 79, 128, 82, 79, 77, 65, 206, + 82, 79, 77, 128, 82, 79, 76, 76, 69, 210, 82, 79, 196, 82, 79, 67, 75, + 69, 84, 128, 82, 79, 67, 203, 82, 79, 67, 128, 82, 79, 66, 65, 84, 128, + 82, 79, 65, 83, 84, 69, 196, 82, 79, 65, 82, 128, 82, 79, 65, 128, 82, + 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, 82, 78, 79, 79, 206, 82, + 78, 65, 205, 82, 74, 69, 211, 82, 74, 69, 128, 82, 74, 197, 82, 73, 86, + 69, 82, 128, 82, 73, 84, 85, 65, 76, 128, 82, 73, 84, 84, 79, 82, 85, + 128, 82, 73, 84, 83, 73, 128, 82, 73, 83, 73, 78, 199, 82, 73, 83, 72, + 128, 82, 73, 82, 65, 128, 82, 73, 80, 128, 82, 73, 78, 71, 211, 82, 73, + 78, 70, 79, 82, 90, 65, 78, 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, 66, + 65, 128, 82, 73, 75, 82, 73, 75, 128, 82, 73, 73, 128, 82, 73, 71, 86, + 69, 68, 73, 195, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 82, 73, 71, + 72, 84, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, 69, 70, + 212, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 82, 73, 71, 72, 84, 45, 83, + 72, 65, 68, 79, 87, 69, 196, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 69, + 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, 73, 71, + 72, 84, 45, 72, 65, 78, 68, 69, 196, 82, 73, 71, 72, 84, 45, 72, 65, 78, + 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, 73, 78, 199, 82, 73, 71, 72, 84, + 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, 128, 82, 73, + 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 45, 72, 73, + 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, + 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 45, 72, + 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 128, + 82, 73, 69, 85, 76, 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, 73, 69, 85, + 76, 45, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, + 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, + 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 83, + 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 83, + 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 84, 73, + 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 83, + 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 80, 72, + 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, + 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 128, + 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, + 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 78, 73, + 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 83, 73, + 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 75, 73, 89, + 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 72, 73, + 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, 82, 73, + 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 128, 82, 73, + 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 72, 73, 69, 85, 72, 128, 82, + 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, + 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, + 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 67, 73, 69, 85, + 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, 76, 128, 82, 73, 69, 69, 128, + 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, 128, 82, 73, 67, 197, 82, 73, + 66, 66, 79, 78, 128, 82, 73, 65, 204, 82, 72, 79, 84, 73, 195, 82, 72, + 79, 128, 82, 72, 207, 82, 72, 65, 128, 82, 71, 89, 73, 78, 71, 83, 128, + 82, 71, 89, 65, 78, 128, 82, 71, 89, 193, 82, 69, 86, 79, 76, 86, 73, 78, + 199, 82, 69, 86, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 86, 77, 65, + 128, 82, 69, 86, 73, 65, 128, 82, 69, 86, 69, 82, 83, 69, 68, 128, 82, + 69, 86, 69, 82, 83, 69, 196, 82, 69, 86, 69, 82, 83, 197, 82, 69, 85, 88, + 128, 82, 69, 84, 85, 82, 78, 128, 82, 69, 84, 85, 82, 206, 82, 69, 84, + 82, 79, 70, 76, 69, 216, 82, 69, 84, 82, 69, 65, 84, 128, 82, 69, 84, 79, + 82, 84, 128, 82, 69, 83, 85, 80, 73, 78, 85, 83, 128, 82, 69, 83, 84, 82, + 79, 79, 77, 128, 82, 69, 83, 84, 82, 73, 67, 84, 69, 196, 82, 69, 83, 84, + 128, 82, 69, 83, 80, 79, 78, 83, 69, 128, 82, 69, 83, 79, 85, 82, 67, 69, + 128, 82, 69, 83, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 83, 73, 83, 84, + 65, 78, 67, 69, 128, 82, 69, 83, 73, 68, 69, 78, 67, 69, 128, 82, 69, 83, 200, 82, 69, 82, 69, 78, 71, 71, 65, 78, 128, 82, 69, 82, 69, 75, 65, 78, 128, 82, 69, 80, 82, 69, 83, 69, 78, 84, 128, 82, 69, 80, 76, 65, 67, 69, - 77, 69, 78, 212, 82, 69, 80, 69, 65, 84, 69, 196, 82, 69, 80, 69, 65, 84, - 128, 82, 69, 80, 69, 65, 212, 82, 69, 80, 65, 128, 82, 69, 80, 193, 82, - 69, 78, 84, 79, 71, 69, 78, 128, 82, 69, 78, 128, 82, 69, 77, 85, 128, - 82, 69, 76, 73, 71, 73, 79, 78, 128, 82, 69, 76, 69, 65, 83, 69, 128, 82, - 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, 76, 65, 84, 73, 79, 78, 128, - 82, 69, 76, 65, 65, 128, 82, 69, 74, 65, 78, 199, 82, 69, 73, 196, 82, - 69, 71, 73, 83, 84, 69, 82, 69, 196, 82, 69, 70, 69, 82, 69, 78, 67, 197, - 82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 82, 69, 67, 89, - 67, 76, 73, 78, 199, 82, 69, 67, 89, 67, 76, 69, 196, 82, 69, 67, 84, 73, - 76, 73, 78, 69, 65, 210, 82, 69, 67, 84, 65, 78, 71, 85, 76, 65, 210, 82, - 69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, 67, 84, 65, 78, 71, 76, 197, - 82, 69, 67, 79, 82, 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, 128, - 82, 69, 67, 79, 82, 196, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, 65, - 72, 77, 85, 75, 128, 82, 69, 65, 67, 72, 128, 82, 68, 207, 82, 68, 69, - 204, 82, 66, 65, 83, 193, 82, 65, 89, 83, 128, 82, 65, 89, 65, 78, 78, - 65, 128, 82, 65, 89, 128, 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, + 77, 69, 78, 212, 82, 69, 80, 72, 128, 82, 69, 80, 69, 65, 84, 69, 196, + 82, 69, 80, 69, 65, 84, 128, 82, 69, 80, 69, 65, 212, 82, 69, 80, 65, + 128, 82, 69, 80, 193, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, 69, 78, + 128, 82, 69, 206, 82, 69, 77, 85, 128, 82, 69, 77, 69, 68, 89, 128, 82, + 69, 76, 73, 71, 73, 79, 78, 128, 82, 69, 76, 73, 69, 86, 69, 196, 82, 69, + 76, 69, 65, 83, 69, 128, 82, 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, + 76, 65, 84, 73, 79, 78, 128, 82, 69, 76, 65, 65, 128, 82, 69, 74, 65, 78, + 199, 82, 69, 73, 196, 82, 69, 71, 85, 76, 85, 83, 45, 52, 128, 82, 69, + 71, 85, 76, 85, 83, 45, 51, 128, 82, 69, 71, 85, 76, 85, 83, 45, 50, 128, + 82, 69, 71, 85, 76, 85, 83, 128, 82, 69, 71, 85, 76, 85, 211, 82, 69, 71, + 73, 83, 84, 69, 82, 69, 196, 82, 69, 71, 73, 79, 78, 65, 204, 82, 69, 71, + 73, 65, 45, 50, 128, 82, 69, 71, 73, 65, 128, 82, 69, 70, 69, 82, 69, 78, + 67, 197, 82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 82, 69, + 67, 89, 67, 76, 73, 78, 199, 82, 69, 67, 89, 67, 76, 69, 196, 82, 69, 67, + 84, 73, 76, 73, 78, 69, 65, 210, 82, 69, 67, 84, 65, 78, 71, 85, 76, 65, + 210, 82, 69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, 67, 84, 65, 78, 71, + 76, 197, 82, 69, 67, 82, 69, 65, 84, 73, 79, 78, 65, 204, 82, 69, 67, 79, + 82, 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, 128, 82, 69, 67, 79, + 82, 196, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, 67, 69, 73, 86, 69, + 82, 128, 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, 82, 69, 65, 76, 71, 65, + 82, 128, 82, 69, 65, 72, 77, 85, 75, 128, 82, 69, 65, 67, 72, 128, 82, + 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, 65, 89, 83, 128, 82, + 65, 89, 65, 78, 78, 65, 128, 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, 128, 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, 83, 87, 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, - 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, 82, 65, 78, - 65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, 66, 65, 84, 128, - 82, 65, 77, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 73, 83, 69, - 196, 82, 65, 73, 78, 128, 82, 65, 73, 206, 82, 65, 73, 68, 207, 82, 65, - 73, 68, 65, 128, 82, 65, 73, 128, 82, 65, 72, 77, 65, 84, 85, 76, 76, 65, - 200, 82, 65, 70, 69, 128, 82, 65, 69, 128, 82, 65, 68, 73, 79, 65, 67, - 84, 73, 86, 197, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, 196, 82, 65, - 66, 128, 82, 65, 65, 73, 128, 82, 65, 65, 128, 82, 65, 51, 128, 82, 65, - 50, 128, 82, 48, 50, 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, - 82, 48, 50, 54, 128, 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, - 50, 51, 128, 82, 48, 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, - 128, 82, 48, 49, 57, 128, 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, - 48, 49, 54, 65, 128, 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, - 49, 52, 128, 82, 48, 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, - 128, 82, 48, 49, 48, 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, - 82, 48, 48, 56, 128, 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, - 48, 53, 128, 82, 48, 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, - 51, 65, 128, 82, 48, 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, - 50, 128, 82, 48, 48, 49, 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, - 81, 89, 85, 128, 81, 89, 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, - 81, 89, 80, 128, 81, 89, 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, - 81, 89, 69, 128, 81, 89, 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, - 87, 73, 128, 81, 87, 69, 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, - 81, 87, 65, 128, 81, 85, 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, - 81, 85, 85, 128, 81, 85, 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, - 128, 81, 85, 82, 88, 128, 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, - 88, 128, 81, 85, 79, 84, 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, - 85, 79, 84, 128, 81, 85, 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, - 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, 78, 67, 85, - 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, 76, 76, - 128, 81, 85, 73, 128, 81, 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, 78, - 69, 196, 81, 85, 69, 83, 84, 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, 79, - 206, 81, 85, 69, 69, 78, 128, 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, - 128, 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, - 83, 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, - 128, 81, 85, 65, 82, 84, 69, 210, 81, 85, 65, 78, 84, 73, 84, 217, 81, - 85, 65, 68, 82, 85, 80, 76, 197, 81, 85, 65, 68, 82, 65, 78, 84, 128, 81, - 85, 65, 68, 82, 65, 78, 212, 81, 85, 65, 68, 128, 81, 85, 65, 196, 81, - 85, 65, 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, 81, - 79, 80, 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, 81, 79, 79, 128, - 81, 79, 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, 128, 81, 79, 128, - 81, 78, 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, 81, 73, 84, 128, - 81, 73, 80, 128, 81, 73, 73, 128, 81, 73, 69, 88, 128, 81, 73, 69, 84, - 128, 81, 73, 69, 80, 128, 81, 73, 69, 128, 81, 73, 128, 81, 72, 87, 73, - 128, 81, 72, 87, 69, 69, 128, 81, 72, 87, 69, 128, 81, 72, 87, 65, 65, - 128, 81, 72, 87, 65, 128, 81, 72, 85, 128, 81, 72, 79, 128, 81, 72, 73, - 128, 81, 72, 69, 69, 128, 81, 72, 69, 128, 81, 72, 65, 65, 128, 81, 72, - 65, 128, 81, 69, 84, 65, 78, 65, 128, 81, 69, 69, 128, 81, 69, 128, 81, - 65, 85, 128, 81, 65, 84, 65, 78, 128, 81, 65, 82, 78, 69, 217, 81, 65, - 82, 128, 81, 65, 81, 128, 81, 65, 80, 72, 128, 81, 65, 77, 65, 84, 83, - 128, 81, 65, 77, 65, 84, 211, 81, 65, 76, 193, 81, 65, 73, 82, 84, 72, - 82, 65, 128, 81, 65, 73, 128, 81, 65, 70, 128, 81, 65, 198, 81, 65, 68, - 77, 65, 128, 81, 65, 65, 73, 128, 81, 65, 65, 70, 85, 128, 81, 65, 65, - 70, 128, 81, 48, 48, 55, 128, 81, 48, 48, 54, 128, 81, 48, 48, 53, 128, - 81, 48, 48, 52, 128, 81, 48, 48, 51, 128, 81, 48, 48, 50, 128, 81, 48, - 48, 49, 128, 209, 80, 90, 128, 80, 89, 88, 128, 80, 89, 84, 128, 80, 89, - 82, 88, 128, 80, 89, 82, 128, 80, 89, 80, 128, 80, 89, 128, 80, 87, 79, - 89, 128, 80, 87, 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, 80, 87, 73, - 73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, 80, 87, 69, 128, 80, 87, - 65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, 88, 128, 80, 85, 84, 128, - 80, 85, 83, 72, 80, 73, 75, 65, 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, - 82, 88, 128, 80, 85, 82, 73, 84, 89, 128, 80, 85, 82, 128, 80, 85, 80, - 128, 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, 80, 85, - 78, 71, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 78, 128, 80, 85, 78, - 67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, 80, 128, 80, 85, 69, 128, - 80, 85, 65, 69, 128, 80, 85, 50, 128, 80, 85, 128, 80, 84, 72, 65, 72, - 193, 80, 84, 69, 128, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, - 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, - 69, 83, 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, - 73, 83, 84, 79, 76, 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, - 128, 80, 82, 79, 86, 69, 128, 80, 82, 79, 84, 79, 86, 65, 82, 89, 211, - 80, 82, 79, 84, 79, 211, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, - 78, 73, 128, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 65, 204, 80, 82, 79, - 80, 79, 82, 84, 73, 79, 78, 128, 80, 82, 79, 80, 69, 82, 84, 217, 80, 82, - 79, 80, 69, 76, 76, 69, 210, 80, 82, 79, 79, 70, 128, 80, 82, 79, 76, 79, - 78, 71, 69, 196, 80, 82, 79, 76, 65, 84, 73, 79, 78, 197, 80, 82, 79, 74, - 69, 67, 84, 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, - 80, 82, 79, 71, 82, 69, 83, 83, 128, 80, 82, 79, 70, 79, 85, 78, 68, 128, - 80, 82, 79, 68, 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 73, - 86, 65, 84, 69, 128, 80, 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, 193, - 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, 80, 82, 73, 77, 69, 128, - 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, 79, 85, 211, 80, 82, 69, 83, 69, - 78, 84, 65, 84, 73, 79, 206, 80, 82, 69, 83, 67, 82, 73, 80, 84, 73, 79, - 206, 80, 82, 69, 80, 79, 78, 68, 69, 82, 65, 78, 67, 69, 128, 80, 82, 69, - 78, 75, 72, 65, 128, 80, 82, 69, 70, 65, 67, 197, 80, 82, 69, 67, 69, 68, - 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, 82, 69, 67, 69, 68, - 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, 67, 69, 68, 69, - 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 77, 45, 80, 73, 73, 128, - 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, 45, 77, 85, 79, 89, 128, - 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, 77, 45, 66, 85, 79, 78, - 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, 65, 77, 45, 66, 69, 73, - 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, 77, 128, 80, 82, 65, - 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, 80, 80, 65, 128, 80, - 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, 211, 80, 79, 87, 69, - 82, 128, 80, 79, 85, 78, 196, 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, - 206, 80, 79, 83, 84, 65, 204, 80, 79, 83, 83, 69, 83, 83, 73, 79, 78, - 128, 80, 79, 82, 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, - 85, 211, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, 128, 80, 79, 78, 68, - 79, 128, 80, 79, 76, 201, 80, 79, 76, 69, 128, 80, 79, 75, 82, 89, 84, - 73, 69, 128, 80, 79, 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 79, 128, - 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, 69, 196, 80, 79, 73, - 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, 82, 217, 80, 79, 69, - 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, 79, 65, 128, 80, 79, - 128, 80, 207, 80, 78, 69, 85, 77, 65, 84, 65, 128, 80, 76, 85, 84, 79, - 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, - 76, 85, 77, 69, 196, 80, 76, 85, 77, 128, 80, 76, 85, 75, 128, 80, 76, - 79, 87, 128, 80, 76, 79, 80, 72, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, - 128, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, 65, 78, 69, 128, 80, - 76, 65, 78, 197, 80, 76, 65, 78, 67, 203, 80, 76, 65, 75, 128, 80, 76, - 65, 71, 73, 79, 211, 80, 76, 65, 67, 69, 72, 79, 76, 68, 69, 210, 80, 76, - 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, 67, 65, 84, 79, 128, - 80, 73, 88, 128, 80, 73, 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, - 128, 80, 73, 84, 67, 72, 70, 79, 82, 203, 80, 73, 84, 128, 80, 73, 83, - 69, 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, - 128, 80, 73, 82, 73, 199, 80, 73, 80, 73, 78, 71, 128, 80, 73, 80, 128, - 80, 73, 78, 87, 72, 69, 69, 204, 80, 73, 76, 67, 82, 79, 215, 80, 73, 75, - 85, 82, 85, 128, 80, 73, 75, 79, 128, 80, 73, 71, 128, 80, 73, 69, 88, - 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, - 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, 80, - 45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, 80, - 45, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, - 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, - 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, - 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, - 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, - 78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, 85, - 80, 45, 75, 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, 73, - 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, - 80, 73, 69, 85, 208, 80, 73, 69, 80, 128, 80, 73, 69, 67, 69, 128, 80, - 73, 69, 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, 79, 82, 85, - 128, 80, 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, 201, 80, 72, - 87, 65, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, 210, 80, 72, - 85, 78, 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79, 69, 78, 73, 67, - 73, 65, 206, 80, 72, 79, 65, 128, 80, 72, 79, 128, 80, 72, 207, 80, 72, - 78, 65, 69, 203, 80, 72, 73, 78, 84, 72, 85, 128, 80, 72, 73, 76, 73, 80, - 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, 72, 73, 69, 85, 84, - 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, 83, 128, 80, 72, 73, - 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, 73, 69, 85, 80, 72, - 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80, 200, 80, 72, 73, - 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, 80, 72, 65, 82, - 89, 78, 71, 69, 65, 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, - 72, 65, 77, 128, 80, 72, 65, 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, - 80, 193, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, - 72, 65, 128, 80, 71, 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 84, - 65, 83, 84, 79, 75, 79, 85, 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, - 84, 73, 128, 80, 69, 84, 65, 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, - 196, 80, 69, 83, 79, 128, 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, - 69, 83, 69, 84, 193, 80, 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, - 83, 80, 69, 67, 84, 73, 86, 69, 128, 80, 69, 82, 83, 79, 78, 128, 80, 69, - 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, 206, 80, 69, 82, 80, 69, 78, 68, - 73, 67, 85, 76, 65, 82, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, - 65, 210, 80, 69, 82, 77, 65, 78, 69, 78, 212, 80, 69, 82, 73, 83, 80, 79, - 77, 69, 78, 73, 128, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 201, 80, 69, - 82, 70, 69, 67, 84, 85, 205, 80, 69, 82, 70, 69, 67, 84, 65, 128, 80, 69, - 82, 70, 69, 67, 84, 193, 80, 69, 82, 67, 85, 83, 83, 73, 86, 69, 128, 80, - 69, 82, 67, 69, 78, 212, 80, 69, 80, 69, 84, 128, 80, 69, 80, 69, 212, - 80, 69, 79, 82, 84, 200, 80, 69, 78, 84, 65, 83, 69, 77, 69, 128, 80, 69, - 78, 84, 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, 128, 80, 69, 78, 78, - 217, 80, 69, 78, 73, 72, 73, 128, 80, 69, 78, 71, 75, 65, 76, 128, 80, - 69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, 78, 67, 73, 76, 128, - 80, 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, 79, 206, 80, - 69, 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, 69, 200, 80, - 69, 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, 69, 80, 128, - 80, 69, 69, 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 128, 80, 69, 68, - 69, 83, 84, 65, 76, 128, 80, 69, 68, 69, 83, 84, 65, 204, 80, 69, 68, 65, - 204, 80, 69, 65, 67, 69, 128, 80, 69, 65, 67, 197, 80, 68, 128, 80, 67, - 128, 80, 65, 90, 69, 82, 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, - 89, 65, 78, 78, 65, 128, 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, - 78, 128, 80, 65, 215, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 84, - 84, 69, 82, 78, 128, 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, - 84, 200, 80, 65, 84, 65, 75, 128, 80, 65, 84, 65, 72, 128, 80, 65, 84, - 128, 80, 65, 83, 85, 81, 128, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, - 76, 45, 85, 80, 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, 86, 69, - 45, 80, 85, 76, 76, 45, 68, 79, 87, 78, 45, 79, 85, 84, 80, 85, 212, 80, - 65, 83, 72, 84, 65, 128, 80, 65, 83, 69, 81, 128, 80, 65, 82, 84, 78, 69, - 82, 83, 72, 73, 208, 80, 65, 82, 84, 73, 65, 76, 76, 89, 45, 82, 69, 67, - 89, 67, 76, 69, 196, 80, 65, 82, 84, 73, 65, 204, 80, 65, 82, 84, 72, 73, - 65, 206, 80, 65, 82, 212, 80, 65, 82, 73, 67, 72, 79, 78, 128, 80, 65, - 82, 69, 83, 84, 73, 71, 77, 69, 78, 79, 206, 80, 65, 82, 69, 82, 69, 78, - 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 83, 128, 80, 65, 82, 69, 78, - 84, 72, 69, 83, 73, 211, 80, 65, 82, 65, 80, 72, 82, 65, 83, 197, 80, 65, - 82, 65, 76, 76, 69, 76, 79, 71, 82, 65, 77, 128, 80, 65, 82, 65, 76, 76, - 69, 76, 128, 80, 65, 82, 65, 76, 76, 69, 204, 80, 65, 82, 65, 75, 76, 73, - 84, 73, 75, 73, 128, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 201, 80, 65, - 82, 65, 75, 65, 76, 69, 83, 77, 193, 80, 65, 82, 65, 71, 82, 65, 80, 72, - 79, 83, 128, 80, 65, 82, 65, 71, 82, 65, 80, 72, 128, 80, 65, 82, 65, 71, - 82, 65, 80, 200, 80, 65, 82, 65, 128, 80, 65, 82, 128, 80, 65, 80, 89, - 82, 85, 83, 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, 65, 208, 80, + 128, 82, 65, 81, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, + 197, 82, 65, 78, 65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, + 66, 65, 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 73, 83, 73, 78, + 199, 82, 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, 82, 65, + 73, 76, 87, 65, 89, 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, 76, + 128, 82, 65, 73, 68, 207, 82, 65, 73, 68, 65, 128, 82, 65, 73, 128, 82, + 65, 72, 77, 65, 84, 85, 76, 76, 65, 200, 82, 65, 70, 69, 128, 82, 65, 69, + 77, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, 73, 79, + 128, 82, 65, 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, 196, + 82, 65, 67, 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, 65, 66, 66, + 73, 84, 128, 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, + 128, 82, 65, 65, 128, 82, 65, 51, 128, 82, 65, 50, 128, 82, 48, 50, 57, + 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, 82, 48, 50, 54, 128, 82, + 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, 50, 51, 128, 82, 48, 50, + 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, 128, 82, 48, 49, 57, 128, + 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, 48, 49, 54, 65, 128, 82, + 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, 49, 52, 128, 82, 48, 49, + 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, 128, 82, 48, 49, 48, 65, + 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, 82, 48, 48, 56, 128, 82, + 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, 48, 53, 128, 82, 48, 48, + 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, 51, 65, 128, 82, 48, 48, + 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, 50, 128, 82, 48, 48, 49, + 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, 81, 89, 85, 128, 81, 89, + 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, 81, 89, 80, 128, 81, 89, + 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, 81, 89, 69, 128, 81, 89, + 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, 87, 73, 128, 81, 87, 69, + 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, 81, 87, 65, 128, 81, 85, + 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, 81, 85, 85, 128, 81, 85, + 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, 128, 81, 85, 82, 88, 128, + 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, 88, 128, 81, 85, 79, 84, + 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, 85, 79, 84, 128, 81, 85, + 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, 81, 85, 73, 78, 84, 69, + 83, 83, 69, 78, 67, 69, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, + 193, 81, 85, 73, 78, 67, 85, 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, + 211, 81, 85, 73, 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, 128, 81, + 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, 69, 83, 84, + 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, 69, 78, + 128, 81, 85, 69, 69, 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, 128, + 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, 83, + 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, 128, + 81, 85, 65, 82, 84, 69, 210, 81, 85, 65, 78, 84, 73, 84, 217, 81, 85, 65, + 68, 82, 85, 80, 76, 197, 81, 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65, + 68, 82, 65, 78, 212, 81, 85, 65, 68, 128, 81, 85, 65, 196, 81, 85, 65, + 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, 81, 79, 80, + 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, 81, 79, 79, 128, 81, 79, + 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, 128, 81, 79, 128, 81, 78, + 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, 81, 73, 84, 128, 81, 73, + 80, 128, 81, 73, 73, 128, 81, 73, 69, 88, 128, 81, 73, 69, 84, 128, 81, + 73, 69, 80, 128, 81, 73, 69, 128, 81, 73, 128, 81, 72, 87, 73, 128, 81, + 72, 87, 69, 69, 128, 81, 72, 87, 69, 128, 81, 72, 87, 65, 65, 128, 81, + 72, 87, 65, 128, 81, 72, 85, 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, + 72, 69, 69, 128, 81, 72, 69, 128, 81, 72, 65, 65, 128, 81, 72, 65, 128, + 81, 69, 84, 65, 78, 65, 128, 81, 69, 69, 128, 81, 69, 128, 81, 65, 85, + 128, 81, 65, 84, 65, 78, 128, 81, 65, 82, 78, 69, 217, 81, 65, 82, 128, + 81, 65, 81, 128, 81, 65, 80, 72, 128, 81, 65, 77, 65, 84, 83, 128, 81, + 65, 77, 65, 84, 211, 81, 65, 76, 193, 81, 65, 73, 82, 84, 72, 82, 65, + 128, 81, 65, 73, 128, 81, 65, 70, 128, 81, 65, 198, 81, 65, 68, 77, 65, + 128, 81, 65, 65, 73, 128, 81, 65, 65, 70, 85, 128, 81, 65, 65, 70, 128, + 81, 48, 48, 55, 128, 81, 48, 48, 54, 128, 81, 48, 48, 53, 128, 81, 48, + 48, 52, 128, 81, 48, 48, 51, 128, 81, 48, 48, 50, 128, 81, 48, 48, 49, + 128, 80, 90, 128, 80, 89, 88, 128, 80, 89, 84, 128, 80, 89, 82, 88, 128, + 80, 89, 82, 128, 80, 89, 80, 128, 80, 89, 128, 80, 87, 79, 89, 128, 80, + 87, 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, 80, 87, 73, 73, 128, 80, + 87, 73, 128, 80, 87, 69, 69, 128, 80, 87, 69, 128, 80, 87, 65, 65, 128, + 80, 87, 128, 80, 86, 128, 80, 85, 88, 128, 80, 85, 85, 84, 128, 80, 85, + 84, 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, 85, + 212, 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65, + 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83, + 69, 128, 80, 85, 82, 80, 76, 197, 80, 85, 82, 73, 84, 89, 128, 80, 85, + 82, 73, 70, 89, 128, 80, 85, 82, 128, 80, 85, 81, 128, 80, 85, 80, 128, + 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, 80, 85, 78, + 71, 65, 65, 77, 128, 80, 85, 78, 71, 128, 80, 85, 78, 67, 84, 85, 65, 84, + 73, 79, 78, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, + 80, 128, 80, 85, 77, 128, 80, 85, 69, 128, 80, 85, 66, 76, 73, 195, 80, + 85, 65, 81, 128, 80, 85, 65, 69, 128, 80, 85, 50, 128, 80, 85, 128, 80, + 84, 72, 65, 72, 193, 80, 84, 69, 128, 80, 83, 73, 76, 201, 80, 83, 73, + 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 80, 83, 73, 70, 73, + 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 80, 83, 73, + 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, 73, 83, 84, 79, 76, 89, 71, 73, + 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, 128, 80, 82, 79, 86, 69, 128, + 80, 82, 79, 84, 79, 86, 65, 82, 89, 211, 80, 82, 79, 84, 79, 211, 80, 82, + 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 80, 82, 79, 80, 79, + 82, 84, 73, 79, 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, + 80, 82, 79, 80, 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80, + 82, 79, 79, 70, 128, 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76, + 65, 84, 73, 79, 78, 197, 80, 82, 79, 74, 69, 67, 84, 73, 86, 69, 128, 80, + 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, 79, 71, 82, 69, 83, 83, + 128, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, 68, 85, 67, 84, + 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 73, 86, 65, 84, 69, 128, 80, + 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, 193, 80, 82, 73, 78, 84, 83, + 128, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, 80, 82, 73, 78, 67, + 69, 83, 83, 128, 80, 82, 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, 82, + 69, 86, 73, 79, 85, 211, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, + 80, 82, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, 79, 78, + 68, 69, 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, 80, 82, + 69, 70, 65, 67, 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, + 82, 69, 67, 69, 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, + 82, 69, 67, 69, 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, + 67, 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 77, 45, 80, + 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, 45, 77, 85, + 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, 77, 45, 66, + 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, 65, 77, 45, + 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, 77, 128, + 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, 80, 80, + 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, 211, 80, + 79, 87, 69, 82, 128, 80, 79, 87, 68, 69, 82, 69, 196, 80, 79, 87, 68, 69, + 82, 128, 80, 79, 85, 78, 196, 80, 79, 85, 76, 84, 82, 217, 80, 79, 85, + 67, 72, 128, 80, 79, 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, 76, 197, + 80, 79, 212, 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 79, 83, + 84, 66, 79, 88, 128, 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, 128, 80, + 79, 83, 212, 80, 79, 83, 83, 69, 83, 83, 73, 79, 78, 128, 80, 79, 82, 82, + 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, 85, 211, 80, 79, 80, + 80, 69, 82, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, 68, 76, 69, + 128, 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, 80, 79, 76, + 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, 76, 201, 80, 79, 76, + 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, 73, 69, 128, 80, 79, + 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 80, 79, 73, 78, 84, 79, + 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, 69, 196, 80, + 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, 82, 217, 80, + 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, 79, 65, 128, + 80, 79, 128, 80, 207, 80, 78, 69, 85, 77, 65, 84, 65, 128, 80, 76, 85, + 84, 79, 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, + 128, 80, 76, 85, 82, 65, 76, 128, 80, 76, 85, 77, 69, 196, 80, 76, 85, + 77, 128, 80, 76, 85, 75, 128, 80, 76, 85, 71, 128, 80, 76, 79, 87, 128, + 80, 76, 79, 80, 72, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, 128, 80, 76, + 65, 89, 73, 78, 199, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, 65, 78, + 69, 128, 80, 76, 65, 78, 197, 80, 76, 65, 78, 67, 203, 80, 76, 65, 75, + 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, 65, 67, 69, 72, 79, 76, 68, 69, + 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, 67, 65, + 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, 80, 73, 87, 82, + 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, 67, 72, 70, 79, + 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, 80, 73, 83, 69, + 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, 128, + 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, 73, 80, 73, 78, + 71, 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, 80, 65, + 69, 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, 204, + 80, 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, 78, 65, + 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, 128, 80, 73, 76, 197, 80, + 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, 85, 128, 80, 73, 75, 79, + 128, 80, 73, 71, 128, 80, 73, 199, 80, 73, 69, 88, 128, 80, 73, 69, 85, + 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 83, 83, + 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, + 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, + 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, + 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, + 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, + 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, + 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, + 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, 78, 128, 80, 73, 69, + 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, 85, 80, 45, 75, 72, 73, + 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, 73, 69, 85, 67, 128, 80, + 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, 80, 73, 69, 85, 208, + 80, 73, 69, 84, 128, 80, 73, 69, 80, 128, 80, 73, 69, 69, 84, 128, 80, + 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, 80, 73, 69, 128, 80, 73, + 67, 75, 69, 84, 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, 79, 82, + 85, 128, 80, 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, 201, 80, + 72, 87, 65, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, 210, 80, + 72, 85, 78, 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79, 78, 69, 83, + 128, 80, 72, 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, 79, 65, 128, 80, + 72, 79, 128, 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, 72, 73, 78, 84, + 72, 85, 128, 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, 211, 80, 72, 73, + 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, 72, 73, + 69, 85, 84, 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, 83, 128, + 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, 73, 69, + 85, 80, 72, 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80, 200, 80, + 72, 73, 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, 80, 72, + 65, 83, 69, 45, 198, 80, 72, 65, 83, 69, 45, 194, 80, 72, 65, 82, 89, 78, + 71, 69, 65, 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, + 77, 128, 80, 72, 65, 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, + 193, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, 72, + 65, 128, 80, 71, 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, + 65, 69, 128, 80, 69, 85, 84, 128, 80, 69, 84, 65, 83, 84, 79, 75, 79, 85, + 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, 65, + 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, 128, + 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 69, 84, 193, 80, + 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, 83, 80, 69, 67, 84, 73, 86, + 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, 69, 82, 83, 79, 78, 128, + 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, 206, 80, 69, 82, 83, 69, + 86, 69, 82, 73, 78, 199, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, + 82, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 210, 80, 69, 82, + 77, 65, 78, 69, 78, 212, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 73, 128, + 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 201, 80, 69, 82, 70, 79, 82, 77, + 73, 78, 199, 80, 69, 82, 70, 69, 67, 84, 85, 205, 80, 69, 82, 70, 69, 67, + 84, 65, 128, 80, 69, 82, 70, 69, 67, 84, 193, 80, 69, 82, 67, 85, 83, 83, + 73, 86, 69, 128, 80, 69, 82, 67, 69, 78, 212, 80, 69, 80, 69, 84, 128, + 80, 69, 80, 69, 212, 80, 69, 79, 82, 84, 200, 80, 69, 79, 80, 76, 69, + 128, 80, 69, 78, 84, 65, 83, 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, 82, + 65, 77, 128, 80, 69, 78, 84, 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, + 128, 80, 69, 78, 83, 73, 86, 197, 80, 69, 78, 78, 217, 80, 69, 78, 73, + 72, 73, 128, 80, 69, 78, 71, 85, 73, 78, 128, 80, 69, 78, 71, 75, 65, 76, + 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, 78, 67, 73, + 76, 128, 80, 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, 79, + 206, 80, 69, 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, 69, + 200, 80, 69, 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, 69, + 83, 72, 73, 128, 80, 69, 69, 80, 128, 80, 69, 69, 77, 128, 80, 69, 69, + 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 83, 128, 80, 69, 68, 69, 83, + 84, 82, 73, 65, 78, 128, 80, 69, 68, 69, 83, 84, 65, 76, 128, 80, 69, 68, + 69, 83, 84, 65, 204, 80, 69, 68, 65, 204, 80, 69, 65, 67, 72, 128, 80, + 69, 65, 67, 69, 128, 80, 69, 65, 67, 197, 80, 68, 128, 80, 67, 128, 80, + 65, 90, 69, 82, 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, 78, + 78, 65, 128, 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80, + 65, 215, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 84, 84, 69, 82, 78, + 128, 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, 84, 200, 80, + 65, 84, 65, 75, 128, 80, 65, 84, 65, 72, 128, 80, 65, 84, 128, 80, 65, + 83, 85, 81, 128, 80, 65, 83, 83, 80, 79, 82, 212, 80, 65, 83, 83, 73, 86, + 69, 45, 80, 85, 76, 76, 45, 85, 80, 45, 79, 85, 84, 80, 85, 212, 80, 65, + 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 68, 79, 87, 78, 45, 79, 85, + 84, 80, 85, 212, 80, 65, 83, 72, 84, 65, 128, 80, 65, 83, 72, 65, 69, + 128, 80, 65, 83, 69, 81, 128, 80, 65, 82, 85, 77, 128, 80, 65, 82, 84, + 217, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, 208, 80, 65, 82, 84, 73, 65, + 76, 76, 89, 45, 82, 69, 67, 89, 67, 76, 69, 196, 80, 65, 82, 84, 73, 65, + 204, 80, 65, 82, 84, 72, 73, 65, 206, 80, 65, 82, 212, 80, 65, 82, 73, + 67, 72, 79, 78, 128, 80, 65, 82, 69, 83, 84, 73, 71, 77, 69, 78, 79, 206, + 80, 65, 82, 69, 82, 69, 78, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, + 83, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 80, 65, 82, 65, 80, + 72, 82, 65, 83, 197, 80, 65, 82, 65, 76, 76, 69, 76, 79, 71, 82, 65, 77, + 128, 80, 65, 82, 65, 76, 76, 69, 76, 128, 80, 65, 82, 65, 76, 76, 69, + 204, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 73, 128, 80, 65, 82, 65, 75, + 76, 73, 84, 73, 75, 201, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 193, 80, + 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 80, 65, 82, 65, 71, 82, 65, + 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 200, 80, 65, 82, 65, 128, + 80, 65, 82, 128, 80, 65, 80, 89, 82, 85, 83, 128, 80, 65, 80, 69, 82, 67, + 76, 73, 80, 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, 65, 208, 80, 65, 207, 80, 65, 78, 89, 85, 75, 85, 128, 80, 65, 78, 89, 73, 75, 85, 128, 80, 65, 78, 89, 69, 67, 69, 75, 128, 80, 65, 78, 89, 65, 78, 71, 71, 65, 128, 80, 65, 78, 89, 65, 75, 82, 65, 128, 80, 65, 78, 84, 73, 128, 80, 65, 78, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 65, 78, 83, 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, - 80, 65, 78, 79, 76, 79, 78, 71, 128, 80, 65, 78, 71, 87, 73, 83, 65, 68, - 128, 80, 65, 78, 71, 82, 65, 78, 71, 75, 69, 80, 128, 80, 65, 78, 71, 76, - 65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, 65, 78, 71, 75, - 65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, 78, 71, 128, - 80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 65, 69, 76, 65, - 69, 78, 71, 128, 80, 65, 78, 128, 80, 65, 77, 85, 78, 71, 75, 65, 72, - 128, 80, 65, 77, 85, 68, 80, 79, 68, 128, 80, 65, 77, 80, 72, 89, 76, 73, - 65, 206, 80, 65, 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, 80, 69, - 84, 128, 80, 65, 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, 65, - 128, 80, 65, 77, 65, 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, 80, - 65, 76, 79, 67, 72, 75, 65, 128, 80, 65, 76, 205, 80, 65, 76, 76, 65, 87, - 65, 128, 80, 65, 76, 76, 65, 83, 128, 80, 65, 76, 65, 85, 78, 199, 80, - 65, 76, 65, 84, 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, 76, 73, - 90, 65, 84, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, 73, 89, - 65, 78, 78, 79, 73, 128, 80, 65, 73, 82, 84, 72, 82, 65, 128, 80, 65, 73, - 82, 69, 196, 80, 65, 72, 76, 65, 86, 201, 80, 65, 68, 77, 193, 80, 65, - 68, 193, 80, 65, 68, 128, 80, 65, 67, 75, 73, 78, 71, 128, 80, 65, 65, - 84, 85, 128, 80, 65, 65, 83, 69, 78, 84, 79, 128, 80, 65, 65, 73, 128, - 80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, 80, 50, 128, - 80, 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, 128, 80, 48, - 48, 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, 48, 48, 53, - 128, 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, 48, 51, 128, - 80, 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, 49, 128, 79, - 89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65, 128, 79, 88, 73, - 65, 128, 79, 88, 73, 193, 79, 88, 69, 73, 65, 201, 79, 88, 69, 73, 193, - 79, 86, 69, 82, 82, 73, 68, 69, 128, 79, 86, 69, 82, 76, 79, 78, 199, 79, - 86, 69, 82, 76, 73, 78, 69, 128, 79, 86, 69, 82, 76, 65, 89, 128, 79, 86, - 69, 82, 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, 65, 73, 68, 128, - 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 204, 79, 86, 128, 79, 85, - 84, 76, 73, 78, 69, 196, 79, 85, 84, 76, 73, 78, 69, 128, 79, 85, 84, 69, - 210, 79, 85, 78, 75, 73, 193, 79, 85, 78, 67, 197, 79, 84, 85, 128, 79, + 80, 65, 78, 79, 78, 71, 79, 78, 65, 78, 128, 80, 65, 78, 79, 76, 79, 78, + 71, 128, 80, 65, 78, 71, 87, 73, 83, 65, 68, 128, 80, 65, 78, 71, 82, 65, + 78, 71, 75, 69, 80, 128, 80, 65, 78, 71, 79, 76, 65, 84, 128, 80, 65, 78, + 71, 76, 65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, 65, 78, + 71, 75, 65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, 78, 71, + 128, 80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 68, 193, + 80, 65, 78, 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, 80, 65, 77, + 85, 78, 71, 75, 65, 72, 128, 80, 65, 77, 85, 68, 80, 79, 68, 128, 80, 65, + 77, 83, 72, 65, 69, 128, 80, 65, 77, 80, 72, 89, 76, 73, 65, 206, 80, 65, + 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, 80, 69, 84, 128, 80, 65, + 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, 65, 128, 80, 65, 77, 65, + 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, 80, 65, 76, 79, 67, 72, 75, + 65, 128, 80, 65, 76, 205, 80, 65, 76, 76, 65, 87, 65, 128, 80, 65, 76, + 76, 65, 83, 128, 80, 65, 76, 69, 84, 84, 69, 128, 80, 65, 76, 65, 85, 78, + 199, 80, 65, 76, 65, 84, 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, + 76, 73, 90, 65, 84, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, + 75, 80, 65, 203, 80, 65, 73, 89, 65, 78, 78, 79, 73, 128, 80, 65, 73, 82, + 84, 72, 82, 65, 128, 80, 65, 73, 82, 69, 196, 80, 65, 72, 76, 65, 86, + 201, 80, 65, 71, 69, 82, 128, 80, 65, 71, 197, 80, 65, 68, 77, 193, 80, + 65, 68, 193, 80, 65, 68, 128, 80, 65, 67, 75, 73, 78, 71, 128, 80, 65, + 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, 85, 128, 80, 65, 65, 83, 69, 78, + 84, 79, 128, 80, 65, 65, 82, 65, 69, 128, 80, 65, 65, 77, 128, 80, 65, + 65, 73, 128, 80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, + 80, 50, 128, 80, 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, + 128, 80, 48, 48, 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, + 48, 48, 53, 128, 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, + 48, 51, 128, 80, 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, + 49, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65, + 128, 79, 88, 73, 65, 128, 79, 88, 73, 193, 79, 88, 69, 73, 65, 201, 79, + 88, 69, 73, 193, 79, 86, 69, 82, 82, 73, 68, 69, 128, 79, 86, 69, 82, 76, + 79, 78, 199, 79, 86, 69, 82, 76, 73, 78, 69, 128, 79, 86, 69, 82, 76, 65, + 89, 128, 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, + 65, 73, 68, 128, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 204, 79, + 86, 128, 79, 85, 84, 76, 73, 78, 69, 196, 79, 85, 84, 76, 73, 78, 69, + 128, 79, 85, 84, 69, 210, 79, 85, 84, 66, 79, 216, 79, 85, 78, 75, 73, + 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, 197, 79, 84, 85, 128, 79, 84, 84, 65, 86, 193, 79, 84, 84, 128, 79, 84, 72, 65, 76, 65, 206, 79, 84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, 193, 79, 82, 84, 72, 79, 71, 79, 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, 65, 84, 197, 79, 82, 78, 65, 77, 69, 78, 84, 128, 79, 82, 78, 65, 77, 69, 78, 212, 79, 82, 75, 72, 79, 206, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, - 73, 71, 73, 78, 128, 79, 82, 68, 73, 78, 65, 204, 79, 82, 67, 72, 73, 68, - 128, 79, 80, 84, 73, 79, 206, 79, 80, 80, 82, 69, 83, 83, 73, 79, 78, - 128, 79, 80, 80, 79, 83, 73, 84, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, - 78, 199, 79, 80, 80, 79, 83, 69, 128, 79, 80, 69, 82, 65, 84, 79, 82, - 128, 79, 80, 69, 82, 65, 84, 79, 210, 79, 80, 69, 78, 73, 78, 199, 79, - 80, 69, 78, 45, 80, 128, 79, 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, - 196, 79, 80, 69, 78, 45, 72, 69, 65, 68, 69, 196, 79, 80, 69, 78, 45, 67, - 73, 82, 67, 85, 73, 84, 45, 79, 85, 84, 80, 85, 212, 79, 80, 69, 206, 79, - 79, 90, 69, 128, 79, 79, 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, - 79, 77, 85, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 78, 85, - 128, 79, 78, 83, 85, 128, 79, 78, 78, 128, 79, 78, 75, 65, 82, 128, 79, - 78, 69, 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, 65, 217, 79, 78, 69, 45, - 76, 73, 78, 197, 79, 78, 65, 80, 128, 79, 77, 73, 83, 83, 73, 79, 206, - 79, 77, 73, 67, 82, 79, 78, 128, 79, 77, 73, 67, 82, 79, 206, 79, 77, 69, - 71, 65, 128, 79, 77, 69, 71, 193, 79, 77, 65, 76, 79, 78, 128, 79, 77, - 128, 79, 76, 73, 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76, 68, 128, - 79, 75, 84, 207, 79, 75, 65, 82, 65, 128, 79, 75, 65, 82, 193, 79, 74, - 73, 66, 87, 65, 217, 79, 74, 69, 79, 78, 128, 79, 73, 76, 128, 79, 72, - 77, 128, 79, 72, 205, 79, 72, 128, 79, 71, 79, 78, 69, 75, 128, 79, 71, - 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 69, 75, 128, 79, 68, 196, 79, - 67, 84, 79, 66, 69, 82, 128, 79, 67, 210, 79, 67, 67, 76, 85, 83, 73, 79, - 78, 128, 79, 66, 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, 79, 76, - 211, 79, 66, 79, 204, 79, 66, 79, 70, 73, 76, 73, 128, 79, 66, 76, 73, - 81, 85, 197, 79, 66, 74, 69, 67, 212, 79, 66, 69, 76, 85, 83, 128, 79, - 66, 69, 76, 79, 83, 128, 79, 66, 128, 79, 65, 89, 128, 79, 65, 75, 128, - 79, 65, 66, 79, 65, 70, 73, 76, 73, 128, 79, 193, 79, 48, 53, 49, 128, - 79, 48, 53, 48, 66, 128, 79, 48, 53, 48, 65, 128, 79, 48, 53, 48, 128, - 79, 48, 52, 57, 128, 79, 48, 52, 56, 128, 79, 48, 52, 55, 128, 79, 48, - 52, 54, 128, 79, 48, 52, 53, 128, 79, 48, 52, 52, 128, 79, 48, 52, 51, - 128, 79, 48, 52, 50, 128, 79, 48, 52, 49, 128, 79, 48, 52, 48, 128, 79, - 48, 51, 57, 128, 79, 48, 51, 56, 128, 79, 48, 51, 55, 128, 79, 48, 51, - 54, 68, 128, 79, 48, 51, 54, 67, 128, 79, 48, 51, 54, 66, 128, 79, 48, - 51, 54, 65, 128, 79, 48, 51, 54, 128, 79, 48, 51, 53, 128, 79, 48, 51, - 52, 128, 79, 48, 51, 51, 65, 128, 79, 48, 51, 51, 128, 79, 48, 51, 50, - 128, 79, 48, 51, 49, 128, 79, 48, 51, 48, 65, 128, 79, 48, 51, 48, 128, - 79, 48, 50, 57, 65, 128, 79, 48, 50, 57, 128, 79, 48, 50, 56, 128, 79, - 48, 50, 55, 128, 79, 48, 50, 54, 128, 79, 48, 50, 53, 65, 128, 79, 48, - 50, 53, 128, 79, 48, 50, 52, 65, 128, 79, 48, 50, 52, 128, 79, 48, 50, - 51, 128, 79, 48, 50, 50, 128, 79, 48, 50, 49, 128, 79, 48, 50, 48, 65, - 128, 79, 48, 50, 48, 128, 79, 48, 49, 57, 65, 128, 79, 48, 49, 57, 128, - 79, 48, 49, 56, 128, 79, 48, 49, 55, 128, 79, 48, 49, 54, 128, 79, 48, - 49, 53, 128, 79, 48, 49, 52, 128, 79, 48, 49, 51, 128, 79, 48, 49, 50, - 128, 79, 48, 49, 49, 128, 79, 48, 49, 48, 67, 128, 79, 48, 49, 48, 66, - 128, 79, 48, 49, 48, 65, 128, 79, 48, 49, 48, 128, 79, 48, 48, 57, 128, - 79, 48, 48, 56, 128, 79, 48, 48, 55, 128, 79, 48, 48, 54, 70, 128, 79, - 48, 48, 54, 69, 128, 79, 48, 48, 54, 68, 128, 79, 48, 48, 54, 67, 128, - 79, 48, 48, 54, 66, 128, 79, 48, 48, 54, 65, 128, 79, 48, 48, 54, 128, - 79, 48, 48, 53, 65, 128, 79, 48, 48, 53, 128, 79, 48, 48, 52, 128, 79, - 48, 48, 51, 128, 79, 48, 48, 50, 128, 79, 48, 48, 49, 65, 128, 79, 48, - 48, 49, 128, 79, 45, 89, 69, 128, 79, 45, 79, 45, 73, 128, 79, 45, 69, - 128, 78, 90, 89, 88, 128, 78, 90, 89, 84, 128, 78, 90, 89, 82, 88, 128, - 78, 90, 89, 82, 128, 78, 90, 89, 80, 128, 78, 90, 89, 128, 78, 90, 85, - 88, 128, 78, 90, 85, 82, 88, 128, 78, 90, 85, 82, 128, 78, 90, 85, 80, - 128, 78, 90, 85, 79, 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 128, 78, - 90, 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, 73, - 84, 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, 69, - 80, 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 69, 88, 128, 78, - 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84, 128, 78, 90, 65, 80, - 128, 78, 90, 65, 128, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, - 85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, 78, 89, 85, - 79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 128, 78, 89, 79, 88, 128, - 78, 89, 79, 84, 128, 78, 89, 79, 80, 128, 78, 89, 79, 79, 128, 78, 89, - 79, 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, 128, 78, 89, 73, 88, 128, - 78, 89, 73, 84, 128, 78, 89, 73, 211, 78, 89, 73, 80, 128, 78, 89, 73, - 78, 45, 68, 79, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, 84, 128, - 78, 89, 73, 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 128, 78, 89, - 201, 78, 89, 69, 212, 78, 89, 69, 72, 128, 78, 89, 69, 200, 78, 89, 69, - 69, 128, 78, 89, 69, 128, 78, 89, 196, 78, 89, 67, 65, 128, 78, 89, 65, - 65, 128, 78, 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, 128, 78, - 87, 73, 128, 78, 87, 69, 128, 78, 87, 65, 65, 128, 78, 87, 65, 128, 78, - 87, 128, 78, 86, 128, 78, 85, 88, 128, 78, 85, 85, 78, 128, 78, 85, 84, - 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, 82, 88, 128, 78, 85, 82, - 128, 78, 85, 80, 128, 78, 85, 79, 88, 128, 78, 85, 79, 80, 128, 78, 85, - 79, 128, 78, 85, 78, 85, 90, 128, 78, 85, 78, 85, 218, 78, 85, 78, 71, - 128, 78, 85, 78, 65, 86, 85, 212, 78, 85, 78, 65, 86, 73, 203, 78, 85, - 78, 128, 78, 85, 206, 78, 85, 77, 69, 82, 207, 78, 85, 77, 69, 82, 65, - 84, 79, 210, 78, 85, 77, 69, 82, 65, 204, 78, 85, 77, 66, 69, 82, 128, - 78, 85, 77, 128, 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, 85, 75, 84, - 65, 128, 78, 85, 69, 78, 71, 128, 78, 85, 69, 128, 78, 85, 66, 73, 65, - 206, 78, 85, 65, 69, 128, 78, 85, 49, 49, 128, 78, 85, 48, 50, 50, 65, - 128, 78, 85, 48, 50, 50, 128, 78, 85, 48, 50, 49, 128, 78, 85, 48, 50, - 48, 128, 78, 85, 48, 49, 57, 128, 78, 85, 48, 49, 56, 65, 128, 78, 85, - 48, 49, 56, 128, 78, 85, 48, 49, 55, 128, 78, 85, 48, 49, 54, 128, 78, - 85, 48, 49, 53, 128, 78, 85, 48, 49, 52, 128, 78, 85, 48, 49, 51, 128, - 78, 85, 48, 49, 50, 128, 78, 85, 48, 49, 49, 65, 128, 78, 85, 48, 49, 49, - 128, 78, 85, 48, 49, 48, 65, 128, 78, 85, 48, 49, 48, 128, 78, 85, 48, - 48, 57, 128, 78, 85, 48, 48, 56, 128, 78, 85, 48, 48, 55, 128, 78, 85, - 48, 48, 54, 128, 78, 85, 48, 48, 53, 128, 78, 85, 48, 48, 52, 128, 78, - 85, 48, 48, 51, 128, 78, 85, 48, 48, 50, 128, 78, 85, 48, 48, 49, 128, - 78, 84, 85, 85, 128, 78, 84, 69, 69, 128, 78, 83, 72, 65, 128, 78, 82, - 89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, 82, 88, 128, 78, 82, 89, - 82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, 78, 82, 85, 88, 128, 78, - 82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, 82, 85, 82, 128, 78, 82, - 85, 80, 128, 78, 82, 85, 128, 78, 82, 79, 88, 128, 78, 82, 79, 80, 128, - 78, 82, 79, 128, 78, 82, 69, 88, 128, 78, 82, 69, 84, 128, 78, 82, 69, - 80, 128, 78, 82, 69, 128, 78, 82, 65, 88, 128, 78, 82, 65, 84, 128, 78, - 82, 65, 80, 128, 78, 82, 65, 128, 78, 79, 89, 128, 78, 79, 88, 128, 78, - 79, 86, 69, 77, 66, 69, 82, 128, 78, 79, 84, 84, 79, 128, 78, 79, 84, 69, - 83, 128, 78, 79, 84, 69, 72, 69, 65, 68, 128, 78, 79, 84, 69, 72, 69, 65, - 196, 78, 79, 84, 69, 128, 78, 79, 84, 197, 78, 79, 84, 67, 72, 69, 196, - 78, 79, 84, 67, 72, 128, 78, 79, 84, 128, 78, 79, 83, 69, 128, 78, 79, - 82, 84, 72, 87, 69, 83, 212, 78, 79, 82, 84, 200, 78, 79, 82, 77, 65, - 204, 78, 79, 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, 78, 79, 79, - 128, 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, 45, 74, 79, - 73, 78, 69, 82, 128, 78, 79, 78, 45, 66, 82, 69, 65, 75, 73, 78, 199, 78, - 79, 77, 73, 78, 65, 204, 78, 79, 75, 72, 85, 75, 128, 78, 79, 68, 69, - 128, 78, 79, 65, 128, 78, 79, 45, 66, 82, 69, 65, 203, 78, 78, 79, 128, - 78, 78, 78, 65, 128, 78, 78, 71, 79, 79, 128, 78, 78, 71, 79, 128, 78, - 78, 71, 73, 73, 128, 78, 78, 71, 73, 128, 78, 78, 71, 65, 65, 128, 78, - 78, 71, 65, 128, 78, 78, 71, 128, 78, 77, 128, 78, 76, 48, 50, 48, 128, - 78, 76, 48, 49, 57, 128, 78, 76, 48, 49, 56, 128, 78, 76, 48, 49, 55, 65, - 128, 78, 76, 48, 49, 55, 128, 78, 76, 48, 49, 54, 128, 78, 76, 48, 49, - 53, 128, 78, 76, 48, 49, 52, 128, 78, 76, 48, 49, 51, 128, 78, 76, 48, - 49, 50, 128, 78, 76, 48, 49, 49, 128, 78, 76, 48, 49, 48, 128, 78, 76, - 48, 48, 57, 128, 78, 76, 48, 48, 56, 128, 78, 76, 48, 48, 55, 128, 78, - 76, 48, 48, 54, 128, 78, 76, 48, 48, 53, 65, 128, 78, 76, 48, 48, 53, - 128, 78, 76, 48, 48, 52, 128, 78, 76, 48, 48, 51, 128, 78, 76, 48, 48, - 50, 128, 78, 76, 48, 48, 49, 128, 78, 75, 207, 78, 74, 89, 88, 128, 78, - 74, 89, 84, 128, 78, 74, 89, 82, 88, 128, 78, 74, 89, 82, 128, 78, 74, - 89, 80, 128, 78, 74, 89, 128, 78, 74, 85, 88, 128, 78, 74, 85, 82, 88, - 128, 78, 74, 85, 82, 128, 78, 74, 85, 80, 128, 78, 74, 85, 79, 88, 128, - 78, 74, 85, 79, 128, 78, 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74, - 79, 88, 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79, - 128, 78, 74, 79, 128, 78, 74, 73, 88, 128, 78, 74, 73, 84, 128, 78, 74, - 73, 80, 128, 78, 74, 73, 69, 88, 128, 78, 74, 73, 69, 84, 128, 78, 74, - 73, 69, 80, 128, 78, 74, 73, 69, 128, 78, 74, 73, 128, 78, 74, 69, 69, - 128, 78, 74, 69, 128, 78, 74, 65, 69, 77, 76, 73, 128, 78, 74, 65, 69, - 77, 128, 78, 74, 128, 78, 73, 88, 128, 78, 73, 83, 65, 71, 128, 78, 73, - 82, 85, 71, 85, 128, 78, 73, 80, 128, 78, 73, 78, 84, 72, 128, 78, 73, - 78, 69, 84, 89, 128, 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, - 78, 128, 78, 73, 78, 69, 84, 69, 69, 206, 78, 73, 78, 197, 78, 73, 78, - 68, 65, 50, 128, 78, 73, 78, 68, 65, 178, 78, 73, 77, 128, 78, 73, 205, - 78, 73, 75, 72, 65, 72, 73, 84, 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, - 73, 73, 128, 78, 73, 72, 83, 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, - 65, 77, 73, 78, 128, 78, 73, 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, - 72, 84, 128, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88, - 128, 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85, - 78, 45, 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73, - 79, 83, 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, 128, 78, 73, 69, - 85, 78, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, 45, 80, 65, 78, - 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, - 78, 73, 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, 69, 85, 78, 45, - 67, 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, 73, 69, 85, 67, - 72, 128, 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, - 73, 66, 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 72, 85, 69, 128, 78, - 72, 74, 65, 128, 78, 72, 65, 128, 78, 72, 128, 78, 71, 89, 69, 128, 78, - 71, 86, 69, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, - 71, 85, 79, 128, 78, 71, 79, 88, 128, 78, 71, 79, 85, 128, 78, 71, 79, - 213, 78, 71, 79, 84, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, 128, 78, - 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, 71, 207, 78, 71, 75, 87, - 65, 69, 78, 128, 78, 71, 75, 65, 128, 78, 71, 73, 69, 88, 128, 78, 71, - 73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71, 71, 85, 128, 78, 71, 71, - 79, 79, 128, 78, 71, 71, 79, 128, 78, 71, 71, 73, 128, 78, 71, 71, 69, - 78, 128, 78, 71, 71, 69, 69, 128, 78, 71, 71, 69, 128, 78, 71, 71, 128, - 78, 71, 69, 88, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, 128, 78, 71, - 69, 65, 68, 65, 76, 128, 78, 71, 69, 128, 78, 71, 65, 88, 128, 78, 71, - 65, 84, 128, 78, 71, 65, 211, 78, 71, 65, 80, 128, 78, 71, 65, 78, 128, - 78, 71, 65, 73, 128, 78, 71, 65, 65, 73, 128, 78, 71, 193, 78, 70, 128, - 78, 69, 88, 212, 78, 69, 88, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, - 69, 85, 84, 82, 65, 204, 78, 69, 85, 84, 69, 82, 128, 78, 69, 84, 128, - 78, 69, 212, 78, 69, 83, 84, 69, 196, 78, 69, 81, 85, 68, 65, 65, 128, - 78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 80, 128, 78, 69, 79, 128, 78, - 69, 207, 78, 69, 78, 65, 78, 79, 128, 78, 69, 78, 128, 78, 69, 73, 84, - 72, 69, 210, 78, 69, 71, 65, 84, 73, 86, 197, 78, 69, 71, 65, 84, 73, 79, - 206, 78, 69, 71, 65, 84, 69, 196, 78, 69, 69, 128, 78, 69, 66, 69, 78, - 83, 84, 73, 77, 77, 69, 128, 78, 68, 85, 88, 128, 78, 68, 85, 84, 128, - 78, 68, 85, 82, 88, 128, 78, 68, 85, 82, 128, 78, 68, 85, 80, 128, 78, - 68, 79, 88, 128, 78, 68, 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 79, - 79, 128, 78, 68, 79, 76, 197, 78, 68, 73, 88, 128, 78, 68, 73, 84, 128, - 78, 68, 73, 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, 78, - 68, 73, 128, 78, 68, 69, 88, 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, - 128, 78, 68, 69, 128, 78, 68, 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, - 65, 80, 128, 78, 68, 65, 65, 128, 78, 66, 89, 88, 128, 78, 66, 89, 84, - 128, 78, 66, 89, 82, 88, 128, 78, 66, 89, 82, 128, 78, 66, 89, 80, 128, - 78, 66, 89, 128, 78, 66, 85, 88, 128, 78, 66, 85, 84, 128, 78, 66, 85, - 82, 88, 128, 78, 66, 85, 82, 128, 78, 66, 85, 80, 128, 78, 66, 85, 128, - 78, 66, 79, 88, 128, 78, 66, 79, 84, 128, 78, 66, 79, 80, 128, 78, 66, - 79, 128, 78, 66, 73, 88, 128, 78, 66, 73, 84, 128, 78, 66, 73, 80, 128, - 78, 66, 73, 69, 88, 128, 78, 66, 73, 69, 80, 128, 78, 66, 73, 69, 128, - 78, 66, 73, 128, 78, 66, 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, 65, - 80, 128, 78, 66, 65, 128, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 89, - 128, 78, 65, 88, 73, 65, 206, 78, 65, 88, 128, 78, 65, 85, 84, 72, 83, - 128, 78, 65, 85, 68, 73, 218, 78, 65, 84, 85, 82, 65, 204, 78, 65, 84, - 73, 79, 78, 65, 204, 78, 65, 83, 75, 65, 80, 201, 78, 65, 83, 72, 73, - 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 82, 82, 79, - 215, 78, 65, 82, 128, 78, 65, 79, 211, 78, 65, 78, 71, 77, 79, 78, 84, - 72, 79, 128, 78, 65, 78, 68, 128, 78, 65, 78, 65, 128, 78, 65, 77, 69, - 128, 78, 65, 77, 197, 78, 65, 77, 50, 128, 78, 65, 77, 128, 78, 65, 73, - 82, 193, 78, 65, 71, 82, 201, 78, 65, 71, 65, 82, 128, 78, 65, 71, 65, - 128, 78, 65, 71, 193, 78, 65, 71, 128, 78, 65, 199, 78, 65, 66, 76, 65, + 73, 71, 73, 78, 128, 79, 82, 69, 45, 50, 128, 79, 82, 68, 73, 78, 65, + 204, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 197, 79, 80, 84, + 73, 79, 206, 79, 80, 84, 73, 67, 65, 204, 79, 80, 80, 82, 69, 83, 83, 73, + 79, 78, 128, 79, 80, 80, 79, 83, 73, 84, 73, 79, 78, 128, 79, 80, 80, 79, + 83, 73, 78, 199, 79, 80, 80, 79, 83, 69, 128, 79, 80, 72, 73, 85, 67, 72, + 85, 83, 128, 79, 80, 69, 82, 65, 84, 79, 82, 128, 79, 80, 69, 82, 65, 84, + 79, 210, 79, 80, 69, 78, 73, 78, 199, 79, 80, 69, 78, 45, 80, 128, 79, + 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 79, 80, 69, 78, 45, 72, + 69, 65, 68, 69, 196, 79, 80, 69, 78, 45, 67, 73, 82, 67, 85, 73, 84, 45, + 79, 85, 84, 80, 85, 212, 79, 80, 69, 206, 79, 79, 90, 69, 128, 79, 79, + 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, 85, 128, 79, 79, + 69, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 78, 85, 128, 79, + 78, 83, 85, 128, 79, 78, 78, 128, 79, 78, 75, 65, 82, 128, 79, 78, 69, + 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, 65, 217, 79, 78, 69, 45, 84, 72, + 73, 82, 84, 89, 128, 79, 78, 69, 45, 76, 73, 78, 197, 79, 78, 67, 79, 77, + 73, 78, 199, 79, 78, 65, 80, 128, 79, 77, 73, 83, 83, 73, 79, 206, 79, + 77, 73, 67, 82, 79, 78, 128, 79, 77, 73, 67, 82, 79, 206, 79, 77, 69, 71, + 65, 128, 79, 77, 69, 71, 193, 79, 77, 65, 76, 79, 78, 128, 79, 76, 73, + 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76, 68, 128, 79, 75, 84, 207, + 79, 75, 65, 82, 65, 128, 79, 75, 65, 82, 193, 79, 74, 73, 66, 87, 65, + 217, 79, 74, 69, 79, 78, 128, 79, 73, 76, 128, 79, 72, 77, 128, 79, 72, + 205, 79, 72, 128, 79, 71, 82, 69, 128, 79, 71, 79, 78, 69, 75, 128, 79, + 71, 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, 70, 73, 67, 69, 82, + 128, 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, 197, 79, 70, 70, + 128, 79, 69, 75, 128, 79, 68, 69, 78, 128, 79, 68, 196, 79, 67, 84, 79, + 80, 85, 83, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, 210, 79, 67, + 76, 79, 67, 75, 128, 79, 67, 67, 76, 85, 83, 73, 79, 78, 128, 79, 66, 83, + 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, 79, 76, 211, 79, 66, 79, + 204, 79, 66, 79, 70, 73, 76, 73, 128, 79, 66, 76, 73, 81, 85, 197, 79, + 66, 74, 69, 67, 212, 79, 66, 69, 76, 85, 83, 128, 79, 66, 69, 76, 79, 83, + 128, 79, 66, 128, 79, 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, + 70, 73, 76, 73, 128, 79, 193, 79, 48, 53, 49, 128, 79, 48, 53, 48, 66, + 128, 79, 48, 53, 48, 65, 128, 79, 48, 53, 48, 128, 79, 48, 52, 57, 128, + 79, 48, 52, 56, 128, 79, 48, 52, 55, 128, 79, 48, 52, 54, 128, 79, 48, + 52, 53, 128, 79, 48, 52, 52, 128, 79, 48, 52, 51, 128, 79, 48, 52, 50, + 128, 79, 48, 52, 49, 128, 79, 48, 52, 48, 128, 79, 48, 51, 57, 128, 79, + 48, 51, 56, 128, 79, 48, 51, 55, 128, 79, 48, 51, 54, 68, 128, 79, 48, + 51, 54, 67, 128, 79, 48, 51, 54, 66, 128, 79, 48, 51, 54, 65, 128, 79, + 48, 51, 54, 128, 79, 48, 51, 53, 128, 79, 48, 51, 52, 128, 79, 48, 51, + 51, 65, 128, 79, 48, 51, 51, 128, 79, 48, 51, 50, 128, 79, 48, 51, 49, + 128, 79, 48, 51, 48, 65, 128, 79, 48, 51, 48, 128, 79, 48, 50, 57, 65, + 128, 79, 48, 50, 57, 128, 79, 48, 50, 56, 128, 79, 48, 50, 55, 128, 79, + 48, 50, 54, 128, 79, 48, 50, 53, 65, 128, 79, 48, 50, 53, 128, 79, 48, + 50, 52, 65, 128, 79, 48, 50, 52, 128, 79, 48, 50, 51, 128, 79, 48, 50, + 50, 128, 79, 48, 50, 49, 128, 79, 48, 50, 48, 65, 128, 79, 48, 50, 48, + 128, 79, 48, 49, 57, 65, 128, 79, 48, 49, 57, 128, 79, 48, 49, 56, 128, + 79, 48, 49, 55, 128, 79, 48, 49, 54, 128, 79, 48, 49, 53, 128, 79, 48, + 49, 52, 128, 79, 48, 49, 51, 128, 79, 48, 49, 50, 128, 79, 48, 49, 49, + 128, 79, 48, 49, 48, 67, 128, 79, 48, 49, 48, 66, 128, 79, 48, 49, 48, + 65, 128, 79, 48, 49, 48, 128, 79, 48, 48, 57, 128, 79, 48, 48, 56, 128, + 79, 48, 48, 55, 128, 79, 48, 48, 54, 70, 128, 79, 48, 48, 54, 69, 128, + 79, 48, 48, 54, 68, 128, 79, 48, 48, 54, 67, 128, 79, 48, 48, 54, 66, + 128, 79, 48, 48, 54, 65, 128, 79, 48, 48, 54, 128, 79, 48, 48, 53, 65, + 128, 79, 48, 48, 53, 128, 79, 48, 48, 52, 128, 79, 48, 48, 51, 128, 79, + 48, 48, 50, 128, 79, 48, 48, 49, 65, 128, 79, 48, 48, 49, 128, 79, 45, + 89, 69, 128, 79, 45, 79, 45, 73, 128, 79, 45, 69, 128, 78, 90, 89, 88, + 128, 78, 90, 89, 84, 128, 78, 90, 89, 82, 88, 128, 78, 90, 89, 82, 128, + 78, 90, 89, 80, 128, 78, 90, 89, 128, 78, 90, 85, 88, 128, 78, 90, 85, + 82, 88, 128, 78, 90, 85, 82, 128, 78, 90, 85, 81, 128, 78, 90, 85, 80, + 128, 78, 90, 85, 79, 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 206, 78, + 90, 85, 128, 78, 90, 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, + 128, 78, 90, 73, 84, 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, + 78, 90, 73, 69, 80, 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, + 69, 88, 128, 78, 90, 69, 85, 77, 128, 78, 90, 69, 128, 78, 90, 65, 88, + 128, 78, 90, 65, 84, 128, 78, 90, 65, 81, 128, 78, 90, 65, 80, 128, 78, + 90, 65, 128, 78, 90, 193, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, + 89, 85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, 78, 89, + 85, 79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 69, 128, 78, 89, 85, + 128, 78, 89, 79, 88, 128, 78, 89, 79, 84, 128, 78, 89, 79, 80, 128, 78, + 89, 79, 79, 128, 78, 89, 79, 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, + 128, 78, 89, 73, 88, 128, 78, 89, 73, 84, 128, 78, 89, 73, 212, 78, 89, + 73, 211, 78, 89, 73, 210, 78, 89, 73, 80, 128, 78, 89, 73, 78, 45, 68, + 79, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, 84, 128, 78, 89, 73, + 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 128, 78, 89, 201, 78, 89, + 69, 84, 128, 78, 89, 69, 212, 78, 89, 69, 72, 128, 78, 89, 69, 200, 78, + 89, 69, 69, 128, 78, 89, 69, 128, 78, 89, 196, 78, 89, 67, 65, 128, 78, + 89, 65, 69, 77, 65, 69, 128, 78, 89, 65, 65, 128, 78, 87, 79, 79, 128, + 78, 87, 79, 128, 78, 87, 73, 73, 128, 78, 87, 73, 128, 78, 87, 69, 128, + 78, 87, 65, 65, 128, 78, 87, 65, 128, 78, 87, 128, 78, 86, 128, 78, 85, + 88, 128, 78, 85, 85, 78, 128, 78, 85, 84, 73, 76, 76, 85, 128, 78, 85, + 84, 128, 78, 85, 212, 78, 85, 82, 88, 128, 78, 85, 82, 128, 78, 85, 80, + 128, 78, 85, 79, 88, 128, 78, 85, 79, 80, 128, 78, 85, 79, 128, 78, 85, + 78, 85, 90, 128, 78, 85, 78, 85, 218, 78, 85, 78, 71, 128, 78, 85, 78, + 65, 86, 85, 212, 78, 85, 78, 65, 86, 73, 203, 78, 85, 78, 128, 78, 85, + 206, 78, 85, 77, 69, 82, 207, 78, 85, 77, 69, 82, 65, 84, 79, 210, 78, + 85, 77, 69, 82, 65, 204, 78, 85, 77, 66, 69, 82, 83, 128, 78, 85, 77, 66, + 69, 82, 128, 78, 85, 77, 128, 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, + 85, 75, 84, 65, 128, 78, 85, 69, 78, 71, 128, 78, 85, 69, 128, 78, 85, + 66, 73, 65, 206, 78, 85, 65, 69, 128, 78, 85, 49, 49, 128, 78, 85, 48, + 50, 50, 65, 128, 78, 85, 48, 50, 50, 128, 78, 85, 48, 50, 49, 128, 78, + 85, 48, 50, 48, 128, 78, 85, 48, 49, 57, 128, 78, 85, 48, 49, 56, 65, + 128, 78, 85, 48, 49, 56, 128, 78, 85, 48, 49, 55, 128, 78, 85, 48, 49, + 54, 128, 78, 85, 48, 49, 53, 128, 78, 85, 48, 49, 52, 128, 78, 85, 48, + 49, 51, 128, 78, 85, 48, 49, 50, 128, 78, 85, 48, 49, 49, 65, 128, 78, + 85, 48, 49, 49, 128, 78, 85, 48, 49, 48, 65, 128, 78, 85, 48, 49, 48, + 128, 78, 85, 48, 48, 57, 128, 78, 85, 48, 48, 56, 128, 78, 85, 48, 48, + 55, 128, 78, 85, 48, 48, 54, 128, 78, 85, 48, 48, 53, 128, 78, 85, 48, + 48, 52, 128, 78, 85, 48, 48, 51, 128, 78, 85, 48, 48, 50, 128, 78, 85, + 48, 48, 49, 128, 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, 213, + 78, 84, 79, 81, 80, 69, 78, 128, 78, 84, 73, 69, 197, 78, 84, 69, 85, 78, + 71, 66, 65, 128, 78, 84, 69, 85, 77, 128, 78, 84, 69, 78, 128, 78, 84, + 69, 69, 128, 78, 84, 65, 80, 128, 78, 84, 65, 208, 78, 84, 65, 65, 128, + 78, 83, 85, 79, 212, 78, 83, 85, 78, 128, 78, 83, 85, 77, 128, 78, 83, + 79, 77, 128, 78, 83, 73, 69, 69, 84, 128, 78, 83, 73, 69, 69, 80, 128, + 78, 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, 128, 78, 83, 72, 85, 212, + 78, 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, 69, 128, 78, 83, 72, 73, 69, + 69, 128, 78, 83, 72, 69, 69, 128, 78, 83, 72, 65, 81, 128, 78, 83, 72, + 65, 128, 78, 83, 69, 85, 65, 69, 78, 128, 78, 83, 69, 78, 128, 78, 83, + 65, 128, 78, 82, 89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, 82, 88, + 128, 78, 82, 89, 82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, 78, 82, + 85, 88, 128, 78, 82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, 82, 85, + 82, 128, 78, 82, 85, 80, 128, 78, 82, 85, 128, 78, 82, 79, 88, 128, 78, + 82, 79, 80, 128, 78, 82, 79, 128, 78, 82, 69, 88, 128, 78, 82, 69, 84, + 128, 78, 82, 69, 80, 128, 78, 82, 69, 128, 78, 82, 65, 88, 128, 78, 82, + 65, 84, 128, 78, 82, 65, 80, 128, 78, 82, 65, 128, 78, 79, 89, 128, 78, + 79, 88, 128, 78, 79, 86, 69, 77, 66, 69, 82, 128, 78, 79, 84, 84, 79, + 128, 78, 79, 84, 69, 83, 128, 78, 79, 84, 69, 72, 69, 65, 68, 128, 78, + 79, 84, 69, 72, 69, 65, 196, 78, 79, 84, 69, 66, 79, 79, 75, 128, 78, 79, + 84, 69, 66, 79, 79, 203, 78, 79, 84, 69, 128, 78, 79, 84, 197, 78, 79, + 84, 67, 72, 69, 196, 78, 79, 84, 67, 72, 128, 78, 79, 84, 128, 78, 79, + 212, 78, 79, 83, 69, 128, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, + 82, 84, 72, 69, 82, 206, 78, 79, 82, 84, 200, 78, 79, 82, 77, 65, 204, + 78, 79, 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, 78, 79, 79, 128, + 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, 45, 80, 79, 84, + 65, 66, 76, 197, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, 128, 78, 79, 78, + 45, 66, 82, 69, 65, 75, 73, 78, 199, 78, 79, 77, 73, 78, 65, 204, 78, 79, + 75, 72, 85, 75, 128, 78, 79, 68, 69, 128, 78, 79, 65, 128, 78, 79, 45, + 66, 82, 69, 65, 203, 78, 78, 79, 128, 78, 78, 78, 65, 128, 78, 78, 71, + 79, 79, 128, 78, 78, 71, 79, 128, 78, 78, 71, 73, 73, 128, 78, 78, 71, + 73, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 65, 128, 78, 78, 71, 128, + 78, 77, 128, 78, 76, 48, 50, 48, 128, 78, 76, 48, 49, 57, 128, 78, 76, + 48, 49, 56, 128, 78, 76, 48, 49, 55, 65, 128, 78, 76, 48, 49, 55, 128, + 78, 76, 48, 49, 54, 128, 78, 76, 48, 49, 53, 128, 78, 76, 48, 49, 52, + 128, 78, 76, 48, 49, 51, 128, 78, 76, 48, 49, 50, 128, 78, 76, 48, 49, + 49, 128, 78, 76, 48, 49, 48, 128, 78, 76, 48, 48, 57, 128, 78, 76, 48, + 48, 56, 128, 78, 76, 48, 48, 55, 128, 78, 76, 48, 48, 54, 128, 78, 76, + 48, 48, 53, 65, 128, 78, 76, 48, 48, 53, 128, 78, 76, 48, 48, 52, 128, + 78, 76, 48, 48, 51, 128, 78, 76, 48, 48, 50, 128, 78, 76, 48, 48, 49, + 128, 78, 75, 79, 77, 128, 78, 75, 207, 78, 75, 73, 78, 68, 73, 128, 78, + 75, 65, 65, 82, 65, 69, 128, 78, 74, 89, 88, 128, 78, 74, 89, 84, 128, + 78, 74, 89, 82, 88, 128, 78, 74, 89, 82, 128, 78, 74, 89, 80, 128, 78, + 74, 89, 128, 78, 74, 85, 88, 128, 78, 74, 85, 82, 88, 128, 78, 74, 85, + 82, 128, 78, 74, 85, 81, 65, 128, 78, 74, 85, 80, 128, 78, 74, 85, 79, + 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, 69, 81, 128, 78, 74, 85, 65, + 69, 128, 78, 74, 85, 128, 78, 74, 79, 88, 128, 78, 74, 79, 84, 128, 78, + 74, 79, 80, 128, 78, 74, 79, 79, 128, 78, 74, 79, 128, 78, 74, 73, 88, + 128, 78, 74, 73, 84, 128, 78, 74, 73, 80, 128, 78, 74, 73, 69, 88, 128, + 78, 74, 73, 69, 84, 128, 78, 74, 73, 69, 80, 128, 78, 74, 73, 69, 69, + 128, 78, 74, 73, 69, 128, 78, 74, 73, 128, 78, 74, 201, 78, 74, 69, 85, + 88, 128, 78, 74, 69, 85, 84, 128, 78, 74, 69, 85, 65, 69, 78, 65, 128, + 78, 74, 69, 85, 65, 69, 77, 128, 78, 74, 69, 69, 69, 69, 128, 78, 74, 69, + 69, 128, 78, 74, 69, 197, 78, 74, 69, 128, 78, 74, 65, 81, 128, 78, 74, + 65, 80, 128, 78, 74, 65, 69, 77, 76, 73, 128, 78, 74, 65, 69, 77, 128, + 78, 74, 65, 65, 128, 78, 74, 128, 78, 73, 88, 128, 78, 73, 84, 82, 69, + 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, 71, 85, 128, 78, 73, 80, + 128, 78, 73, 78, 84, 72, 128, 78, 73, 78, 69, 84, 89, 128, 78, 73, 78, + 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, 78, 128, 78, 73, 78, 69, 84, 69, + 69, 206, 78, 73, 78, 69, 45, 84, 72, 73, 82, 84, 89, 128, 78, 73, 78, + 197, 78, 73, 78, 68, 65, 50, 128, 78, 73, 78, 68, 65, 178, 78, 73, 77, + 128, 78, 73, 205, 78, 73, 75, 72, 65, 72, 73, 84, 128, 78, 73, 75, 65, + 72, 73, 84, 128, 78, 73, 75, 65, 128, 78, 73, 73, 128, 78, 73, 72, 83, + 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, 77, 73, 78, 128, 78, 73, + 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, 84, 128, 78, 73, 71, 72, + 212, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88, 128, 78, + 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85, 78, 45, + 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73, 79, 83, + 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, 128, 78, 73, 69, 85, 78, + 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, 45, 80, 65, 78, 83, 73, + 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, 78, 73, + 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, 69, 85, 78, 45, 67, 73, + 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, 73, 69, 85, 67, 72, 128, + 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, 73, 66, + 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 72, 85, 69, 128, 78, 72, 74, + 65, 128, 78, 72, 65, 128, 78, 72, 128, 78, 71, 89, 69, 128, 78, 71, 86, + 69, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, 71, 85, + 79, 128, 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69, 128, 78, 71, + 79, 88, 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71, 79, 84, 128, + 78, 71, 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, 128, 78, 71, + 79, 77, 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, 71, 207, + 78, 71, 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78, 128, 78, 71, 75, + 85, 80, 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85, 77, 128, 78, 71, + 75, 85, 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85, 197, 78, 71, 75, 73, + 78, 68, 201, 78, 71, 75, 73, 69, 69, 128, 78, 71, 75, 69, 85, 88, 128, + 78, 71, 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85, 65, 69, 81, 128, 78, + 71, 75, 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81, 128, 78, 71, 75, 65, + 80, 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71, 75, 65, 128, 78, 71, + 73, 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71, + 71, 87, 65, 69, 78, 128, 78, 71, 71, 85, 82, 65, 69, 128, 78, 71, 71, 85, + 80, 128, 78, 71, 71, 85, 79, 81, 128, 78, 71, 71, 85, 79, 209, 78, 71, + 71, 85, 79, 78, 128, 78, 71, 71, 85, 79, 77, 128, 78, 71, 71, 85, 77, + 128, 78, 71, 71, 85, 69, 69, 84, 128, 78, 71, 71, 85, 65, 69, 83, 72, 65, + 197, 78, 71, 71, 85, 65, 69, 206, 78, 71, 71, 85, 128, 78, 71, 71, 79, + 79, 128, 78, 71, 71, 79, 128, 78, 71, 71, 73, 128, 78, 71, 71, 69, 85, + 88, 128, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 71, 71, 69, 85, 65, 69, + 128, 78, 71, 71, 69, 213, 78, 71, 71, 69, 78, 128, 78, 71, 71, 69, 69, + 84, 128, 78, 71, 71, 69, 69, 69, 69, 128, 78, 71, 71, 69, 69, 128, 78, + 71, 71, 69, 128, 78, 71, 71, 65, 80, 128, 78, 71, 71, 65, 65, 77, 65, 69, + 128, 78, 71, 71, 65, 65, 77, 128, 78, 71, 71, 128, 78, 71, 69, 88, 128, + 78, 71, 69, 85, 82, 69, 85, 84, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, + 128, 78, 71, 69, 65, 68, 65, 76, 128, 78, 71, 65, 88, 128, 78, 71, 65, + 84, 128, 78, 71, 65, 211, 78, 71, 65, 81, 128, 78, 71, 65, 80, 128, 78, + 71, 65, 78, 71, 85, 128, 78, 71, 65, 78, 128, 78, 71, 65, 73, 128, 78, + 71, 65, 65, 73, 128, 78, 71, 193, 78, 70, 128, 78, 69, 88, 212, 78, 69, + 88, 128, 78, 69, 87, 83, 80, 65, 80, 69, 82, 128, 78, 69, 87, 76, 73, 78, + 69, 128, 78, 69, 87, 128, 78, 69, 85, 84, 82, 65, 204, 78, 69, 85, 84, + 69, 82, 128, 78, 69, 84, 128, 78, 69, 212, 78, 69, 83, 84, 69, 196, 78, + 69, 81, 85, 68, 65, 65, 128, 78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 80, + 128, 78, 69, 79, 128, 78, 69, 207, 78, 69, 78, 65, 78, 79, 128, 78, 69, + 78, 128, 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, 65, 84, 73, 79, 206, + 78, 69, 71, 65, 84, 69, 196, 78, 69, 69, 128, 78, 69, 67, 75, 84, 73, 69, + 128, 78, 69, 66, 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 68, 85, 88, + 128, 78, 68, 85, 84, 128, 78, 68, 85, 82, 88, 128, 78, 68, 85, 82, 128, + 78, 68, 85, 80, 128, 78, 68, 85, 78, 128, 78, 68, 213, 78, 68, 79, 88, + 128, 78, 68, 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 79, 79, 128, 78, + 68, 79, 78, 128, 78, 68, 79, 77, 66, 85, 128, 78, 68, 79, 76, 197, 78, + 68, 73, 88, 128, 78, 68, 73, 84, 128, 78, 68, 73, 81, 128, 78, 68, 73, + 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, 78, 68, 73, 68, + 65, 128, 78, 68, 73, 65, 81, 128, 78, 68, 69, 88, 128, 78, 68, 69, 85, + 88, 128, 78, 68, 69, 85, 84, 128, 78, 68, 69, 85, 65, 69, 82, 69, 69, + 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, 128, 78, 68, 69, 128, 78, 68, + 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, 65, 80, 128, 78, 68, 65, 77, + 128, 78, 68, 65, 65, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 68, 65, 65, + 128, 78, 68, 65, 193, 78, 66, 89, 88, 128, 78, 66, 89, 84, 128, 78, 66, + 89, 82, 88, 128, 78, 66, 89, 82, 128, 78, 66, 89, 80, 128, 78, 66, 89, + 128, 78, 66, 85, 88, 128, 78, 66, 85, 84, 128, 78, 66, 85, 82, 88, 128, + 78, 66, 85, 82, 128, 78, 66, 85, 80, 128, 78, 66, 85, 128, 78, 66, 79, + 88, 128, 78, 66, 79, 84, 128, 78, 66, 79, 80, 128, 78, 66, 79, 128, 78, + 66, 73, 88, 128, 78, 66, 73, 84, 128, 78, 66, 73, 80, 128, 78, 66, 73, + 69, 88, 128, 78, 66, 73, 69, 80, 128, 78, 66, 73, 69, 128, 78, 66, 73, + 128, 78, 66, 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, 65, 80, 128, 78, + 66, 65, 128, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 89, 128, 78, 65, + 88, 73, 65, 206, 78, 65, 88, 128, 78, 65, 85, 84, 72, 83, 128, 78, 65, + 85, 68, 73, 218, 78, 65, 84, 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65, + 204, 78, 65, 83, 75, 65, 80, 201, 78, 65, 83, 72, 73, 128, 78, 65, 83, + 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 82, 82, 79, 215, 78, 65, 82, + 128, 78, 65, 81, 128, 78, 65, 79, 211, 78, 65, 78, 83, 65, 78, 65, 81, + 128, 78, 65, 78, 71, 77, 79, 78, 84, 72, 79, 128, 78, 65, 78, 68, 128, + 78, 65, 78, 65, 128, 78, 65, 77, 69, 128, 78, 65, 77, 197, 78, 65, 77, + 50, 128, 78, 65, 77, 128, 78, 65, 73, 82, 193, 78, 65, 73, 204, 78, 65, + 71, 82, 201, 78, 65, 71, 65, 82, 128, 78, 65, 71, 65, 128, 78, 65, 71, + 193, 78, 65, 71, 128, 78, 65, 199, 78, 65, 69, 128, 78, 65, 66, 76, 65, 128, 78, 65, 65, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, 73, 128, 78, 65, 65, 128, 78, 65, 193, 78, 65, 50, 128, 78, 48, 52, 50, 128, 78, 48, 52, 49, 128, 78, 48, @@ -1578,1590 +1792,1708 @@ static unsigned char lexicon[] = { 48, 48, 52, 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, 128, 78, 48, 48, 49, 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, 82, 217, 77, 89, 88, 128, 77, 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, 128, 77, 89, 80, 128, 77, - 89, 65, 128, 77, 89, 193, 77, 89, 128, 77, 87, 79, 79, 128, 77, 87, 79, - 128, 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, 87, 69, 69, 128, 77, 87, - 69, 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, 77, 87, 128, 77, 215, 77, - 86, 128, 77, 214, 77, 85, 88, 128, 77, 85, 85, 83, 73, 75, 65, 84, 79, - 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, 193, 77, 85, 84, 128, 77, - 85, 83, 73, 67, 128, 77, 85, 83, 73, 195, 77, 85, 83, 72, 51, 128, 77, - 85, 83, 72, 179, 77, 85, 83, 72, 128, 77, 85, 83, 200, 77, 85, 82, 88, - 128, 77, 85, 82, 71, 85, 50, 128, 77, 85, 82, 69, 128, 77, 85, 82, 68, - 65, 128, 77, 85, 82, 68, 193, 77, 85, 82, 128, 77, 85, 81, 68, 65, 77, - 128, 77, 85, 80, 128, 77, 85, 79, 88, 128, 77, 85, 79, 84, 128, 77, 85, - 79, 80, 128, 77, 85, 79, 128, 77, 85, 78, 83, 85, 66, 128, 77, 85, 78, - 65, 72, 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 77, 85, 76, 84, 73, 83, - 69, 212, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 77, - 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 206, 77, 85, 76, 84, 73, - 80, 76, 197, 77, 85, 76, 84, 73, 79, 67, 85, 76, 65, 210, 77, 85, 76, 84, - 73, 77, 65, 80, 128, 77, 85, 76, 84, 201, 77, 85, 75, 80, 72, 82, 69, 78, - 71, 128, 77, 85, 73, 78, 128, 77, 85, 71, 128, 77, 85, 199, 77, 85, 69, - 128, 77, 85, 67, 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65, 78, 128, - 77, 85, 45, 71, 65, 65, 72, 76, 65, 193, 77, 213, 77, 83, 128, 77, 80, - 65, 128, 77, 79, 88, 128, 77, 79, 86, 69, 196, 77, 79, 85, 84, 72, 128, - 77, 79, 85, 84, 200, 77, 79, 85, 78, 84, 65, 73, 78, 128, 77, 79, 85, 78, - 68, 128, 77, 79, 85, 78, 196, 77, 79, 84, 72, 69, 82, 128, 77, 79, 84, - 128, 77, 79, 82, 84, 65, 82, 128, 77, 79, 82, 80, 72, 79, 76, 79, 71, 73, - 67, 65, 204, 77, 79, 82, 78, 73, 78, 71, 128, 77, 79, 80, 128, 77, 79, - 79, 83, 69, 45, 67, 82, 69, 197, 77, 79, 79, 78, 128, 77, 79, 79, 206, - 77, 79, 79, 128, 77, 79, 78, 84, 72, 128, 77, 79, 78, 84, 200, 77, 79, - 78, 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, 79, 71, 82, 65, 80, 200, 77, - 79, 78, 79, 71, 82, 65, 77, 77, 79, 211, 77, 79, 78, 79, 71, 82, 65, 205, - 77, 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, 77, 79, 78, 79, 67, 85, 76, - 65, 210, 77, 79, 206, 77, 79, 76, 128, 77, 79, 72, 65, 77, 77, 65, 196, - 77, 79, 68, 85, 76, 207, 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, 68, 69, - 76, 83, 128, 77, 79, 68, 69, 76, 128, 77, 79, 65, 128, 77, 207, 77, 78, - 89, 65, 205, 77, 78, 65, 83, 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, - 77, 76, 128, 77, 73, 88, 128, 77, 73, 84, 128, 77, 73, 212, 77, 73, 83, - 82, 65, 128, 77, 73, 82, 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, - 128, 77, 73, 82, 69, 68, 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, - 73, 78, 85, 83, 45, 79, 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, - 77, 73, 78, 73, 83, 84, 69, 82, 128, 77, 73, 78, 73, 77, 65, 128, 77, 73, - 77, 69, 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, - 76, 76, 69, 84, 128, 77, 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, - 128, 77, 73, 75, 85, 82, 79, 78, 128, 77, 73, 75, 82, 79, 206, 77, 73, - 75, 82, 73, 128, 77, 73, 73, 78, 128, 77, 73, 73, 128, 77, 73, 199, 77, - 73, 69, 88, 128, 77, 73, 69, 85, 77, 45, 84, 73, 75, 69, 85, 84, 128, 77, - 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 77, 73, 69, - 85, 77, 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, - 77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, - 128, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 77, 73, 69, - 85, 77, 45, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 67, 73, 69, - 85, 67, 128, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, 128, 77, - 73, 69, 85, 205, 77, 73, 69, 80, 128, 77, 73, 69, 128, 77, 73, 68, 76, - 73, 78, 197, 77, 73, 68, 68, 76, 69, 45, 87, 69, 76, 83, 200, 77, 73, 68, - 68, 76, 197, 77, 73, 196, 77, 73, 67, 82, 207, 77, 73, 128, 77, 72, 90, - 128, 77, 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, - 82, 88, 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, - 88, 128, 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, - 77, 71, 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, - 79, 128, 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, - 71, 69, 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, - 128, 77, 71, 66, 79, 79, 128, 77, 71, 66, 79, 128, 77, 71, 66, 73, 128, - 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, 66, 65, 128, 77, - 71, 65, 88, 128, 77, 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, - 128, 77, 71, 128, 77, 69, 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 84, - 82, 73, 67, 65, 204, 77, 69, 84, 82, 73, 65, 128, 77, 69, 84, 82, 69, 84, - 69, 211, 77, 69, 84, 79, 66, 69, 76, 85, 83, 128, 77, 69, 84, 69, 71, - 128, 77, 69, 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, - 73, 65, 206, 77, 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, - 128, 77, 69, 82, 75, 72, 65, 128, 77, 69, 82, 75, 72, 193, 77, 69, 82, - 73, 128, 77, 69, 82, 71, 69, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, - 69, 78, 68, 85, 84, 128, 77, 69, 78, 128, 77, 69, 206, 77, 69, 77, 66, - 69, 82, 83, 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, 77, 69, 77, 66, - 69, 210, 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, 128, 77, 69, - 205, 77, 69, 76, 79, 78, 128, 77, 69, 76, 79, 68, 73, 195, 77, 69, 76, - 73, 75, 128, 77, 69, 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, 128, - 77, 69, 71, 65, 76, 73, 128, 77, 69, 69, 84, 79, 82, 85, 128, 77, 69, 69, - 84, 69, 201, 77, 69, 69, 84, 128, 77, 69, 69, 77, 85, 128, 77, 69, 69, - 77, 128, 77, 69, 69, 69, 69, 128, 77, 69, 69, 128, 77, 69, 68, 73, 85, - 77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, 73, 67, 73, 78, 69, 128, - 77, 69, 65, 84, 128, 77, 69, 65, 83, 85, 82, 69, 196, 77, 69, 65, 83, 85, - 82, 69, 128, 77, 69, 65, 83, 85, 82, 197, 77, 68, 85, 206, 77, 67, 72, - 213, 77, 66, 85, 128, 77, 66, 79, 79, 128, 77, 66, 79, 128, 77, 66, 73, - 128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 128, 77, 66, 69, 128, 77, 66, - 65, 65, 128, 77, 66, 52, 128, 77, 66, 51, 128, 77, 66, 50, 128, 77, 66, - 128, 77, 194, 77, 65, 89, 69, 203, 77, 65, 89, 65, 78, 78, 65, 128, 77, - 65, 89, 128, 77, 65, 88, 73, 77, 65, 128, 77, 65, 88, 128, 77, 65, 84, - 84, 79, 67, 75, 128, 77, 65, 84, 82, 73, 88, 128, 77, 65, 84, 69, 82, 73, - 65, 76, 83, 128, 77, 65, 84, 128, 77, 65, 83, 213, 77, 65, 83, 83, 73, - 78, 71, 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 72, 70, 65, 65, 84, - 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, 85, 76, 73, 78, 197, 77, - 65, 82, 85, 75, 85, 128, 77, 65, 82, 84, 89, 82, 73, 193, 77, 65, 82, 82, - 89, 73, 78, 199, 77, 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 75, 69, 82, - 128, 77, 65, 82, 75, 45, 52, 128, 77, 65, 82, 75, 45, 51, 128, 77, 65, - 82, 75, 45, 50, 128, 77, 65, 82, 75, 45, 49, 128, 77, 65, 82, 69, 128, - 77, 65, 82, 67, 72, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, - 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, 82, 66, 85, - 84, 65, 128, 77, 65, 82, 66, 85, 84, 193, 77, 65, 82, 128, 77, 65, 81, - 65, 70, 128, 77, 65, 80, 73, 81, 128, 77, 65, 208, 77, 65, 78, 83, 89, - 79, 78, 128, 77, 65, 78, 78, 65, 218, 77, 65, 78, 78, 65, 128, 77, 65, - 78, 71, 65, 76, 65, 77, 128, 77, 65, 78, 67, 72, 213, 77, 65, 78, 65, 67, - 76, 69, 83, 128, 77, 65, 76, 84, 69, 83, 197, 77, 65, 76, 69, 128, 77, - 65, 76, 197, 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, - 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, 73, 75, 72, - 85, 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, 128, 77, - 65, 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, - 73, 68, 69, 78, 128, 77, 65, 72, 74, 79, 78, 199, 77, 65, 72, 72, 65, - 128, 77, 65, 72, 65, 80, 82, 65, 78, 65, 128, 77, 65, 72, 65, 80, 65, 75, - 72, 128, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, 65, 72, 128, + 89, 65, 128, 77, 89, 193, 77, 89, 128, 77, 217, 77, 87, 79, 79, 128, 77, + 87, 79, 128, 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, 87, 69, 69, 128, + 77, 87, 69, 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, 77, 87, 128, 77, + 215, 77, 86, 79, 80, 128, 77, 86, 73, 128, 77, 86, 69, 85, 65, 69, 78, + 71, 65, 77, 128, 77, 86, 128, 77, 214, 77, 85, 88, 128, 77, 85, 85, 83, + 73, 75, 65, 84, 79, 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, 193, 77, + 85, 84, 128, 77, 85, 83, 73, 67, 128, 77, 85, 83, 73, 195, 77, 85, 83, + 72, 82, 79, 79, 77, 128, 77, 85, 83, 72, 51, 128, 77, 85, 83, 72, 179, + 77, 85, 83, 72, 128, 77, 85, 83, 200, 77, 85, 82, 88, 128, 77, 85, 82, + 71, 85, 50, 128, 77, 85, 82, 69, 128, 77, 85, 82, 68, 65, 128, 77, 85, + 82, 68, 193, 77, 85, 82, 128, 77, 85, 81, 68, 65, 77, 128, 77, 85, 80, + 128, 77, 85, 79, 88, 128, 77, 85, 79, 84, 128, 77, 85, 79, 80, 128, 77, + 85, 79, 77, 65, 69, 128, 77, 85, 79, 128, 77, 85, 78, 83, 85, 66, 128, + 77, 85, 78, 65, 72, 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 77, 85, 76, + 84, 73, 83, 69, 212, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, + 78, 128, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 206, 77, 85, + 76, 84, 73, 80, 76, 197, 77, 85, 76, 84, 73, 79, 67, 85, 76, 65, 210, 77, + 85, 76, 84, 73, 77, 65, 80, 128, 77, 85, 76, 84, 201, 77, 85, 75, 80, 72, + 82, 69, 78, 71, 128, 77, 85, 73, 78, 128, 77, 85, 71, 83, 128, 77, 85, + 71, 128, 77, 85, 199, 77, 85, 69, 128, 77, 85, 67, 72, 128, 77, 85, 67, + 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65, 78, 128, 77, 85, 65, 69, + 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, 193, 77, 213, 77, 83, 128, 77, + 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79, 88, 128, 77, 79, 86, 73, + 197, 77, 79, 86, 69, 196, 77, 79, 85, 84, 72, 128, 77, 79, 85, 84, 200, + 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, 197, 77, 79, 85, 78, 84, 65, 73, + 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, 78, 128, 77, 79, 85, 78, 84, 65, + 73, 206, 77, 79, 85, 78, 212, 77, 79, 85, 78, 68, 128, 77, 79, 85, 78, + 196, 77, 79, 84, 72, 69, 82, 128, 77, 79, 84, 128, 77, 79, 82, 84, 85, + 85, 77, 128, 77, 79, 82, 84, 65, 82, 128, 77, 79, 82, 80, 72, 79, 76, 79, + 71, 73, 67, 65, 204, 77, 79, 82, 78, 73, 78, 71, 128, 77, 79, 80, 128, + 77, 79, 79, 83, 69, 45, 67, 82, 69, 197, 77, 79, 79, 78, 128, 77, 79, 79, + 206, 77, 79, 79, 77, 80, 85, 81, 128, 77, 79, 79, 77, 69, 85, 84, 128, + 77, 79, 79, 128, 77, 79, 78, 84, 73, 69, 69, 78, 128, 77, 79, 78, 84, 72, + 128, 77, 79, 78, 84, 200, 77, 79, 78, 83, 84, 69, 82, 128, 77, 79, 78, + 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, 79, 83, 80, 65, 67, 197, 77, 79, + 78, 79, 82, 65, 73, 76, 128, 77, 79, 78, 79, 71, 82, 65, 80, 200, 77, 79, + 78, 79, 71, 82, 65, 77, 77, 79, 211, 77, 79, 78, 79, 71, 82, 65, 205, 77, + 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, 77, 79, 78, 79, 67, 85, 76, 65, + 210, 77, 79, 78, 75, 69, 89, 128, 77, 79, 78, 75, 69, 217, 77, 79, 78, + 73, 128, 77, 79, 78, 71, 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, 69, + 217, 77, 79, 78, 128, 77, 79, 206, 77, 79, 76, 128, 77, 79, 72, 65, 77, + 77, 65, 196, 77, 79, 68, 85, 76, 207, 77, 79, 68, 69, 83, 84, 89, 128, + 77, 79, 68, 69, 76, 83, 128, 77, 79, 68, 69, 76, 128, 77, 79, 68, 69, + 128, 77, 79, 66, 73, 76, 197, 77, 79, 65, 128, 77, 207, 77, 78, 89, 65, + 205, 77, 78, 65, 83, 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, 77, 76, + 128, 77, 75, 80, 65, 82, 65, 209, 77, 73, 88, 128, 77, 73, 84, 128, 77, + 73, 212, 77, 73, 83, 82, 65, 128, 77, 73, 82, 73, 66, 65, 65, 82, 85, + 128, 77, 73, 82, 73, 128, 77, 73, 82, 69, 68, 128, 77, 73, 80, 128, 77, + 73, 78, 89, 128, 77, 73, 78, 85, 83, 45, 79, 82, 45, 80, 76, 85, 211, 77, + 73, 78, 85, 83, 128, 77, 73, 78, 73, 83, 84, 69, 82, 128, 77, 73, 78, 73, + 77, 65, 128, 77, 73, 78, 73, 68, 73, 83, 67, 128, 77, 73, 78, 73, 66, 85, + 83, 128, 77, 73, 77, 69, 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79, + 78, 211, 77, 73, 76, 76, 69, 84, 128, 77, 73, 76, 76, 197, 77, 73, 76, + 204, 77, 73, 76, 75, 217, 77, 73, 76, 128, 77, 73, 75, 85, 82, 79, 78, + 128, 77, 73, 75, 82, 79, 206, 77, 73, 75, 82, 73, 128, 77, 73, 73, 78, + 128, 77, 73, 73, 128, 77, 73, 199, 77, 73, 69, 88, 128, 77, 73, 69, 85, + 77, 45, 84, 73, 75, 69, 85, 84, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, + 78, 71, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, + 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 82, 73, 69, 85, 76, 128, + 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 77, + 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 128, 77, 73, 69, 85, 77, 45, 80, + 65, 78, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 78, 73, 69, 85, 78, + 128, 77, 73, 69, 85, 77, 45, 67, 73, 69, 85, 67, 128, 77, 73, 69, 85, 77, + 45, 67, 72, 73, 69, 85, 67, 72, 128, 77, 73, 69, 85, 205, 77, 73, 69, 80, + 128, 77, 73, 69, 69, 128, 77, 73, 69, 128, 77, 73, 68, 76, 73, 78, 197, + 77, 73, 68, 68, 76, 69, 45, 87, 69, 76, 83, 200, 77, 73, 68, 68, 76, 197, + 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, 80, 69, 128, 77, 73, 67, 82, + 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82, 207, 77, 72, 90, 128, 77, + 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, 82, 88, + 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, 88, 128, + 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, 77, 71, + 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, 79, 128, + 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, 71, 69, + 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, 128, 77, + 71, 66, 79, 79, 128, 77, 71, 66, 79, 70, 85, 77, 128, 77, 71, 66, 79, + 128, 77, 71, 66, 73, 128, 77, 71, 66, 69, 85, 78, 128, 77, 71, 66, 69, + 78, 128, 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, 66, 65, + 83, 65, 81, 128, 77, 71, 66, 65, 83, 65, 128, 77, 71, 65, 88, 128, 77, + 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, 128, 77, + 70, 79, 78, 128, 77, 70, 79, 206, 77, 70, 79, 128, 77, 70, 73, 89, 65, + 81, 128, 77, 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, 128, 77, 70, 69, + 85, 81, 128, 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, 65, 128, 77, 69, + 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, 69, 85, 81, 128, + 77, 69, 85, 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, 69, 85, 78, 128, + 77, 69, 84, 82, 79, 128, 77, 69, 84, 82, 73, 67, 65, 204, 77, 69, 84, 82, + 73, 65, 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, 69, 84, 79, 66, 69, 76, + 85, 83, 128, 77, 69, 84, 69, 75, 128, 77, 69, 84, 69, 71, 128, 77, 69, + 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, 73, 65, 206, + 77, 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, 69, + 82, 75, 72, 65, 128, 77, 69, 82, 75, 72, 193, 77, 69, 82, 73, 68, 73, 65, + 78, 83, 128, 77, 69, 82, 73, 128, 77, 69, 82, 71, 69, 128, 77, 69, 82, + 67, 85, 82, 89, 128, 77, 69, 82, 67, 85, 82, 217, 77, 69, 78, 68, 85, 84, + 128, 77, 69, 78, 128, 77, 69, 77, 79, 128, 77, 69, 77, 66, 69, 82, 83, + 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, 77, 69, 77, 66, 69, 210, + 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, 128, 77, 69, 205, 77, + 69, 76, 79, 68, 73, 195, 77, 69, 76, 73, 75, 128, 77, 69, 73, 90, 73, + 128, 77, 69, 71, 65, 84, 79, 78, 128, 77, 69, 71, 65, 80, 72, 79, 78, 69, + 128, 77, 69, 71, 65, 76, 73, 128, 77, 69, 69, 84, 79, 82, 85, 128, 77, + 69, 69, 84, 69, 201, 77, 69, 69, 84, 128, 77, 69, 69, 77, 85, 128, 77, + 69, 69, 77, 128, 77, 69, 69, 69, 69, 128, 77, 69, 69, 128, 77, 69, 68, + 73, 85, 77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, 73, 67, 73, 78, 69, + 128, 77, 69, 68, 73, 67, 65, 204, 77, 69, 65, 84, 128, 77, 69, 65, 212, + 77, 69, 65, 83, 85, 82, 69, 196, 77, 69, 65, 83, 85, 82, 69, 128, 77, 69, + 65, 83, 85, 82, 197, 77, 68, 85, 206, 77, 67, 72, 213, 77, 67, 72, 65, + 206, 77, 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, 85, 69, 128, + 77, 66, 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, 66, 79, 79, + 128, 77, 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, 77, 66, 73, + 82, 73, 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, 128, 77, + 66, 69, 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, 66, 69, 82, 65, 69, + 128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, 84, 128, 77, 66, + 69, 69, 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, 66, 65, 78, 89, + 73, 128, 77, 66, 65, 65, 82, 65, 69, 128, 77, 66, 65, 65, 75, 69, 84, + 128, 77, 66, 65, 65, 128, 77, 66, 65, 193, 77, 66, 193, 77, 66, 52, 128, + 77, 66, 51, 128, 77, 66, 50, 128, 77, 66, 128, 77, 194, 77, 65, 89, 69, + 203, 77, 65, 89, 65, 78, 78, 65, 128, 77, 65, 89, 128, 77, 65, 88, 73, + 77, 65, 128, 77, 65, 88, 128, 77, 65, 84, 84, 79, 67, 75, 128, 77, 65, + 84, 82, 73, 88, 128, 77, 65, 84, 69, 82, 73, 65, 76, 83, 128, 77, 65, 84, + 128, 77, 65, 83, 213, 77, 65, 83, 83, 73, 78, 71, 128, 77, 65, 83, 83, + 65, 71, 69, 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 75, 128, 77, 65, + 83, 72, 70, 65, 65, 84, 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, 85, + 76, 73, 78, 197, 77, 65, 82, 89, 128, 77, 65, 82, 85, 75, 85, 128, 77, + 65, 82, 84, 89, 82, 73, 193, 77, 65, 82, 82, 89, 73, 78, 199, 77, 65, 82, + 82, 73, 65, 71, 197, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, 75, 45, 52, + 128, 77, 65, 82, 75, 45, 51, 128, 77, 65, 82, 75, 45, 50, 128, 77, 65, + 82, 75, 45, 49, 128, 77, 65, 82, 69, 128, 77, 65, 82, 67, 72, 128, 77, + 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, 67, 65, 84, 79, 128, 77, 65, + 82, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 83, 73, 84, 69, 128, 77, 65, + 82, 66, 85, 84, 65, 128, 77, 65, 82, 66, 85, 84, 193, 77, 65, 82, 128, + 77, 65, 81, 65, 70, 128, 77, 65, 81, 128, 77, 65, 80, 76, 197, 77, 65, + 80, 73, 81, 128, 77, 65, 208, 77, 65, 79, 128, 77, 65, 78, 83, 89, 79, + 78, 128, 77, 65, 78, 83, 85, 65, 69, 128, 77, 65, 78, 78, 65, 218, 77, + 65, 78, 78, 65, 128, 77, 65, 78, 71, 65, 76, 65, 77, 128, 77, 65, 78, 68, + 65, 73, 76, 73, 78, 199, 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, + 213, 77, 65, 78, 65, 67, 76, 69, 83, 128, 77, 65, 76, 84, 69, 83, 197, + 77, 65, 76, 69, 69, 82, 73, 128, 77, 65, 76, 69, 128, 77, 65, 76, 197, + 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, 128, 77, 65, 73, + 90, 69, 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, 73, + 75, 72, 85, 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, + 128, 77, 65, 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 76, 66, 79, 216, + 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, 128, 77, 65, 72, + 74, 79, 78, 199, 77, 65, 72, 72, 65, 128, 77, 65, 72, 65, 80, 82, 65, 78, + 65, 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, 72, 65, 65, 80, 82, + 65, 65, 78, 193, 77, 65, 72, 128, 77, 65, 71, 78, 73, 70, 89, 73, 78, + 199, 77, 65, 69, 83, 73, 128, 77, 65, 69, 78, 89, 73, 128, 77, 65, 69, + 78, 74, 69, 84, 128, 77, 65, 69, 77, 86, 69, 85, 88, 128, 77, 65, 69, 77, + 75, 80, 69, 78, 128, 77, 65, 69, 77, 71, 66, 73, 69, 69, 128, 77, 65, 69, + 77, 66, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 65, 128, 77, 65, 69, + 77, 128, 77, 65, 69, 76, 69, 69, 128, 77, 65, 69, 75, 69, 85, 80, 128, 77, 65, 68, 89, 65, 128, 77, 65, 68, 85, 128, 77, 65, 68, 68, 65, 200, 77, 65, 68, 68, 65, 128, 77, 65, 68, 68, 193, 77, 65, 67, 82, 79, 78, 45, 71, 82, 65, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 66, 82, 69, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 65, 67, 85, 84, 69, 128, 77, 65, 67, 82, - 79, 78, 128, 77, 65, 67, 82, 79, 206, 77, 65, 65, 73, 128, 77, 65, 65, - 128, 77, 65, 50, 128, 77, 48, 52, 52, 128, 77, 48, 52, 51, 128, 77, 48, - 52, 50, 128, 77, 48, 52, 49, 128, 77, 48, 52, 48, 65, 128, 77, 48, 52, - 48, 128, 77, 48, 51, 57, 128, 77, 48, 51, 56, 128, 77, 48, 51, 55, 128, - 77, 48, 51, 54, 128, 77, 48, 51, 53, 128, 77, 48, 51, 52, 128, 77, 48, - 51, 51, 66, 128, 77, 48, 51, 51, 65, 128, 77, 48, 51, 51, 128, 77, 48, - 51, 50, 128, 77, 48, 51, 49, 65, 128, 77, 48, 51, 49, 128, 77, 48, 51, - 48, 128, 77, 48, 50, 57, 128, 77, 48, 50, 56, 65, 128, 77, 48, 50, 56, - 128, 77, 48, 50, 55, 128, 77, 48, 50, 54, 128, 77, 48, 50, 53, 128, 77, - 48, 50, 52, 65, 128, 77, 48, 50, 52, 128, 77, 48, 50, 51, 128, 77, 48, - 50, 50, 65, 128, 77, 48, 50, 50, 128, 77, 48, 50, 49, 128, 77, 48, 50, - 48, 128, 77, 48, 49, 57, 128, 77, 48, 49, 56, 128, 77, 48, 49, 55, 65, - 128, 77, 48, 49, 55, 128, 77, 48, 49, 54, 65, 128, 77, 48, 49, 54, 128, - 77, 48, 49, 53, 65, 128, 77, 48, 49, 53, 128, 77, 48, 49, 52, 128, 77, - 48, 49, 51, 128, 77, 48, 49, 50, 72, 128, 77, 48, 49, 50, 71, 128, 77, - 48, 49, 50, 70, 128, 77, 48, 49, 50, 69, 128, 77, 48, 49, 50, 68, 128, - 77, 48, 49, 50, 67, 128, 77, 48, 49, 50, 66, 128, 77, 48, 49, 50, 65, - 128, 77, 48, 49, 50, 128, 77, 48, 49, 49, 128, 77, 48, 49, 48, 65, 128, - 77, 48, 49, 48, 128, 77, 48, 48, 57, 128, 77, 48, 48, 56, 128, 77, 48, - 48, 55, 128, 77, 48, 48, 54, 128, 77, 48, 48, 53, 128, 77, 48, 48, 52, - 128, 77, 48, 48, 51, 65, 128, 77, 48, 48, 51, 128, 77, 48, 48, 50, 128, - 77, 48, 48, 49, 66, 128, 77, 48, 48, 49, 65, 128, 77, 48, 48, 49, 128, - 76, 218, 76, 89, 89, 128, 76, 89, 88, 128, 76, 89, 84, 128, 76, 89, 82, - 88, 128, 76, 89, 82, 128, 76, 89, 80, 128, 76, 89, 68, 73, 65, 206, 76, - 89, 67, 73, 65, 206, 76, 88, 128, 76, 87, 79, 79, 128, 76, 87, 79, 128, - 76, 87, 73, 73, 128, 76, 87, 73, 128, 76, 87, 69, 128, 76, 87, 65, 65, - 128, 76, 87, 65, 128, 76, 85, 88, 128, 76, 85, 84, 128, 76, 85, 82, 88, - 128, 76, 85, 80, 128, 76, 85, 79, 88, 128, 76, 85, 79, 84, 128, 76, 85, - 79, 80, 128, 76, 85, 79, 128, 76, 85, 78, 71, 83, 73, 128, 76, 85, 78, - 65, 84, 197, 76, 85, 205, 76, 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, - 72, 85, 82, 128, 76, 85, 72, 128, 76, 85, 71, 65, 76, 128, 76, 85, 71, - 65, 204, 76, 85, 69, 128, 76, 85, 51, 128, 76, 85, 50, 128, 76, 85, 178, - 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197, 76, 79, 88, - 128, 76, 79, 87, 69, 210, 76, 79, 87, 45, 185, 76, 79, 85, 82, 69, 128, - 76, 79, 84, 85, 83, 128, 76, 79, 84, 128, 76, 79, 82, 82, 65, 73, 78, 69, - 128, 76, 79, 81, 128, 76, 79, 80, 128, 76, 79, 79, 84, 128, 76, 79, 79, - 80, 128, 76, 79, 79, 128, 76, 79, 78, 83, 85, 77, 128, 76, 79, 78, 71, - 65, 128, 76, 79, 78, 71, 193, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, - 45, 89, 82, 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, - 204, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, - 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, 78, 71, - 45, 66, 82, 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, 78, 71, - 45, 66, 82, 65, 78, 67, 72, 45, 65, 210, 76, 79, 76, 76, 128, 76, 79, 71, - 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, 71, 79, 71, 82, 65, 205, - 76, 79, 71, 128, 76, 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 67, 65, 84, - 73, 79, 206, 76, 79, 65, 128, 76, 78, 128, 76, 77, 128, 76, 76, 76, 65, - 128, 76, 74, 85, 68, 73, 74, 69, 128, 76, 74, 69, 128, 76, 74, 128, 76, - 73, 88, 128, 76, 73, 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, 84, - 76, 197, 76, 73, 84, 82, 193, 76, 73, 84, 128, 76, 73, 83, 213, 76, 73, - 83, 72, 128, 76, 73, 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, 80, 128, - 76, 73, 78, 75, 73, 78, 199, 76, 73, 78, 203, 76, 73, 78, 71, 83, 65, - 128, 76, 73, 78, 69, 83, 128, 76, 73, 78, 69, 211, 76, 73, 78, 69, 45, - 57, 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 51, 128, 76, - 73, 78, 69, 45, 49, 128, 76, 73, 77, 77, 85, 52, 128, 76, 73, 77, 77, 85, - 50, 128, 76, 73, 77, 77, 85, 128, 76, 73, 77, 77, 213, 76, 73, 77, 73, - 84, 69, 196, 76, 73, 77, 73, 84, 65, 84, 73, 79, 78, 128, 76, 73, 77, 73, - 84, 128, 76, 73, 76, 89, 128, 76, 73, 76, 73, 84, 72, 128, 76, 73, 76, - 128, 76, 73, 73, 128, 76, 73, 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, - 71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, 71, 72, 84, 128, 76, 73, 70, - 69, 128, 76, 73, 69, 88, 128, 76, 73, 69, 84, 128, 76, 73, 69, 80, 128, - 76, 73, 69, 128, 76, 73, 68, 128, 76, 73, 66, 82, 65, 128, 76, 73, 65, - 66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128, 76, 72, 65, 86, 73, 89, 65, - 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, 128, 76, 72, 128, 76, 69, - 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 69, 204, 76, 69, 84, 84, 69, - 82, 128, 76, 69, 83, 83, 69, 210, 76, 69, 83, 83, 45, 84, 72, 65, 78, - 128, 76, 69, 83, 83, 45, 84, 72, 65, 206, 76, 69, 80, 128, 76, 69, 79, - 128, 76, 69, 78, 84, 73, 67, 85, 76, 65, 210, 76, 69, 78, 73, 83, 128, - 76, 69, 78, 71, 84, 72, 69, 78, 69, 82, 128, 76, 69, 78, 71, 84, 200, 76, - 69, 78, 71, 65, 128, 76, 69, 78, 71, 193, 76, 69, 77, 79, 73, 128, 76, - 69, 76, 69, 84, 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, - 77, 65, 128, 76, 69, 73, 77, 77, 193, 76, 69, 71, 83, 128, 76, 69, 71, - 73, 79, 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, 71, 128, 76, 69, - 70, 84, 87, 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, 79, 45, 82, 73, - 71, 72, 212, 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, 70, 84, 45, 83, - 73, 68, 197, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, 69, 70, 84, - 45, 80, 79, 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 45, 72, 65, 78, 196, - 76, 69, 70, 84, 45, 70, 65, 67, 73, 78, 199, 76, 69, 70, 84, 128, 76, 69, - 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 65, 84, 72, 69, 82, 128, - 76, 69, 65, 70, 128, 76, 69, 65, 68, 69, 82, 128, 76, 68, 65, 78, 128, - 76, 68, 50, 128, 76, 67, 201, 76, 67, 197, 76, 65, 90, 217, 76, 65, 89, - 65, 78, 78, 65, 128, 76, 65, 88, 128, 76, 65, 215, 76, 65, 85, 76, 65, - 128, 76, 65, 85, 75, 65, 218, 76, 65, 84, 73, 78, 65, 84, 197, 76, 65, - 84, 73, 75, 128, 76, 65, 84, 69, 82, 65, 204, 76, 65, 84, 197, 76, 65, - 84, 128, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, 69, 65, 204, 76, 65, - 82, 71, 69, 210, 76, 65, 82, 71, 197, 76, 65, 80, 128, 76, 65, 78, 71, - 85, 65, 71, 197, 76, 65, 78, 69, 83, 128, 76, 65, 77, 69, 68, 72, 128, - 76, 65, 77, 69, 68, 128, 76, 65, 77, 69, 196, 76, 65, 77, 69, 128, 76, - 65, 77, 197, 76, 65, 77, 68, 65, 128, 76, 65, 77, 68, 128, 76, 65, 77, - 66, 68, 193, 76, 65, 77, 65, 68, 72, 128, 76, 65, 76, 128, 76, 65, 204, - 76, 65, 75, 75, 72, 65, 78, 71, 89, 65, 79, 128, 76, 65, 74, 65, 78, 89, - 65, 76, 65, 78, 128, 76, 65, 201, 76, 65, 72, 83, 72, 85, 128, 76, 65, - 71, 85, 83, 128, 76, 65, 71, 213, 76, 65, 71, 65, 82, 128, 76, 65, 71, - 65, 210, 76, 65, 71, 65, 66, 128, 76, 65, 71, 65, 194, 76, 65, 69, 86, - 128, 76, 65, 69, 128, 76, 65, 67, 75, 128, 76, 65, 67, 65, 128, 76, 65, - 66, 79, 85, 82, 73, 78, 71, 128, 76, 65, 66, 79, 82, 128, 76, 65, 66, 73, - 65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, 65, 84, 128, 76, 65, 65, - 78, 128, 76, 65, 65, 77, 85, 128, 76, 65, 65, 73, 128, 76, 48, 48, 54, - 65, 128, 76, 48, 48, 50, 65, 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, - 72, 65, 80, 69, 196, 75, 89, 85, 82, 73, 73, 128, 75, 89, 85, 128, 75, - 89, 79, 128, 75, 89, 76, 73, 83, 77, 65, 128, 75, 89, 73, 128, 75, 89, - 69, 69, 128, 75, 89, 69, 128, 75, 89, 65, 84, 72, 79, 211, 75, 89, 65, - 65, 128, 75, 89, 65, 128, 75, 88, 87, 73, 128, 75, 88, 87, 69, 69, 128, - 75, 88, 87, 69, 128, 75, 88, 87, 65, 65, 128, 75, 88, 87, 65, 128, 75, - 88, 85, 128, 75, 88, 79, 128, 75, 88, 73, 128, 75, 88, 69, 69, 128, 75, - 88, 69, 128, 75, 88, 65, 65, 128, 75, 88, 65, 128, 75, 87, 85, 51, 49, - 56, 128, 75, 87, 79, 79, 128, 75, 87, 79, 128, 75, 87, 73, 73, 128, 75, - 87, 73, 128, 75, 87, 69, 69, 128, 75, 87, 69, 128, 75, 87, 65, 89, 128, - 75, 87, 65, 65, 128, 75, 86, 65, 128, 75, 86, 128, 75, 85, 88, 128, 75, - 85, 85, 72, 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, - 72, 85, 50, 128, 75, 85, 82, 88, 128, 75, 85, 82, 85, 90, 69, 73, 82, 79, - 128, 75, 85, 82, 84, 128, 75, 85, 82, 79, 79, 78, 69, 128, 75, 85, 82, - 128, 75, 85, 210, 75, 85, 80, 128, 75, 85, 79, 88, 128, 75, 85, 79, 80, - 128, 75, 85, 79, 128, 75, 85, 78, 71, 128, 75, 85, 78, 68, 68, 65, 76, - 73, 89, 65, 128, 75, 85, 76, 128, 75, 85, 204, 75, 85, 55, 128, 75, 85, - 52, 128, 75, 85, 180, 75, 85, 51, 128, 75, 85, 179, 75, 84, 128, 75, 83, - 83, 65, 128, 75, 83, 73, 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 75, - 82, 65, 84, 73, 77, 79, 89, 80, 79, 82, 82, 79, 79, 78, 128, 75, 82, 65, - 84, 73, 77, 79, 75, 79, 85, 70, 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, - 77, 65, 84, 65, 128, 75, 82, 65, 84, 73, 77, 193, 75, 80, 85, 128, 75, - 80, 79, 79, 128, 75, 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 78, 128, - 75, 80, 69, 69, 128, 75, 80, 69, 128, 75, 80, 65, 78, 128, 75, 80, 65, - 128, 75, 79, 88, 128, 75, 79, 86, 85, 85, 128, 75, 79, 84, 79, 128, 75, - 79, 82, 85, 78, 65, 128, 75, 79, 82, 79, 78, 73, 83, 128, 75, 79, 82, 69, - 65, 206, 75, 79, 82, 65, 78, 73, 195, 75, 79, 81, 78, 68, 79, 78, 128, - 75, 79, 80, 80, 65, 128, 75, 79, 80, 128, 75, 79, 79, 80, 79, 128, 75, - 79, 79, 77, 85, 85, 84, 128, 75, 79, 79, 128, 75, 79, 78, 84, 69, 86, 77, - 65, 128, 75, 79, 78, 84, 69, 86, 77, 193, 75, 79, 77, 201, 75, 79, 77, - 66, 85, 86, 65, 128, 75, 79, 77, 66, 85, 86, 193, 75, 79, 77, 66, 213, - 75, 79, 75, 128, 75, 79, 203, 75, 79, 73, 128, 75, 79, 201, 75, 79, 72, - 128, 75, 79, 71, 72, 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, 65, 128, - 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 70, 69, 128, 75, 78, 73, 70, - 197, 75, 77, 128, 75, 205, 75, 76, 73, 84, 79, 78, 128, 75, 76, 65, 83, - 77, 65, 128, 75, 76, 65, 83, 77, 193, 75, 76, 65, 128, 75, 76, 128, 75, - 75, 85, 128, 75, 75, 79, 128, 75, 75, 73, 128, 75, 75, 69, 69, 128, 75, - 75, 69, 128, 75, 75, 65, 128, 75, 75, 128, 75, 74, 69, 128, 75, 73, 89, - 69, 79, 75, 45, 84, 73, 75, 69, 85, 84, 128, 75, 73, 89, 69, 79, 75, 45, - 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 75, 73, 89, 69, 79, 75, - 45, 82, 73, 69, 85, 76, 128, 75, 73, 89, 69, 79, 75, 45, 80, 73, 69, 85, - 80, 128, 75, 73, 89, 69, 79, 75, 45, 78, 73, 69, 85, 78, 128, 75, 73, 89, - 69, 79, 75, 45, 75, 72, 73, 69, 85, 75, 72, 128, 75, 73, 89, 69, 79, 75, - 45, 67, 72, 73, 69, 85, 67, 72, 128, 75, 73, 89, 69, 79, 203, 75, 73, 88, - 128, 75, 73, 84, 128, 75, 73, 83, 73, 77, 53, 128, 75, 73, 83, 73, 77, - 181, 75, 73, 83, 72, 128, 75, 73, 83, 65, 76, 128, 75, 73, 82, 79, 87, - 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69, 69, 84, 79, 82, 85, 128, 75, - 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, 73, 82, 79, 128, 75, 73, 82, - 71, 72, 73, 218, 75, 73, 80, 128, 75, 73, 208, 75, 73, 78, 83, 72, 73, - 80, 128, 75, 73, 78, 68, 69, 82, 71, 65, 82, 84, 69, 78, 128, 75, 73, 73, - 128, 75, 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 80, 128, 75, 73, - 69, 128, 75, 73, 68, 128, 75, 73, 196, 75, 73, 67, 75, 128, 75, 72, 90, - 128, 75, 72, 87, 65, 73, 128, 75, 72, 85, 69, 78, 45, 76, 85, 197, 75, - 72, 85, 69, 206, 75, 72, 85, 65, 84, 128, 75, 72, 79, 85, 128, 75, 72, - 79, 212, 75, 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, 128, 75, 72, 79, - 128, 75, 72, 207, 75, 72, 73, 84, 128, 75, 72, 73, 69, 85, 75, 200, 75, - 72, 73, 128, 75, 72, 72, 79, 128, 75, 72, 72, 65, 128, 75, 72, 69, 84, - 72, 128, 75, 72, 69, 73, 128, 75, 72, 69, 69, 128, 75, 72, 69, 128, 75, + 79, 78, 128, 77, 65, 67, 82, 79, 206, 77, 65, 67, 72, 73, 78, 69, 128, + 77, 65, 65, 73, 128, 77, 65, 65, 128, 77, 65, 50, 128, 77, 48, 52, 52, + 128, 77, 48, 52, 51, 128, 77, 48, 52, 50, 128, 77, 48, 52, 49, 128, 77, + 48, 52, 48, 65, 128, 77, 48, 52, 48, 128, 77, 48, 51, 57, 128, 77, 48, + 51, 56, 128, 77, 48, 51, 55, 128, 77, 48, 51, 54, 128, 77, 48, 51, 53, + 128, 77, 48, 51, 52, 128, 77, 48, 51, 51, 66, 128, 77, 48, 51, 51, 65, + 128, 77, 48, 51, 51, 128, 77, 48, 51, 50, 128, 77, 48, 51, 49, 65, 128, + 77, 48, 51, 49, 128, 77, 48, 51, 48, 128, 77, 48, 50, 57, 128, 77, 48, + 50, 56, 65, 128, 77, 48, 50, 56, 128, 77, 48, 50, 55, 128, 77, 48, 50, + 54, 128, 77, 48, 50, 53, 128, 77, 48, 50, 52, 65, 128, 77, 48, 50, 52, + 128, 77, 48, 50, 51, 128, 77, 48, 50, 50, 65, 128, 77, 48, 50, 50, 128, + 77, 48, 50, 49, 128, 77, 48, 50, 48, 128, 77, 48, 49, 57, 128, 77, 48, + 49, 56, 128, 77, 48, 49, 55, 65, 128, 77, 48, 49, 55, 128, 77, 48, 49, + 54, 65, 128, 77, 48, 49, 54, 128, 77, 48, 49, 53, 65, 128, 77, 48, 49, + 53, 128, 77, 48, 49, 52, 128, 77, 48, 49, 51, 128, 77, 48, 49, 50, 72, + 128, 77, 48, 49, 50, 71, 128, 77, 48, 49, 50, 70, 128, 77, 48, 49, 50, + 69, 128, 77, 48, 49, 50, 68, 128, 77, 48, 49, 50, 67, 128, 77, 48, 49, + 50, 66, 128, 77, 48, 49, 50, 65, 128, 77, 48, 49, 50, 128, 77, 48, 49, + 49, 128, 77, 48, 49, 48, 65, 128, 77, 48, 49, 48, 128, 77, 48, 48, 57, + 128, 77, 48, 48, 56, 128, 77, 48, 48, 55, 128, 77, 48, 48, 54, 128, 77, + 48, 48, 53, 128, 77, 48, 48, 52, 128, 77, 48, 48, 51, 65, 128, 77, 48, + 48, 51, 128, 77, 48, 48, 50, 128, 77, 48, 48, 49, 66, 128, 77, 48, 48, + 49, 65, 128, 77, 48, 48, 49, 128, 76, 218, 76, 89, 89, 128, 76, 89, 88, + 128, 76, 89, 84, 128, 76, 89, 82, 88, 128, 76, 89, 82, 128, 76, 89, 80, + 128, 76, 89, 68, 73, 65, 206, 76, 89, 67, 73, 65, 206, 76, 88, 128, 76, + 87, 79, 79, 128, 76, 87, 79, 128, 76, 87, 73, 73, 128, 76, 87, 73, 128, + 76, 87, 69, 128, 76, 87, 65, 65, 128, 76, 87, 65, 128, 76, 85, 88, 128, + 76, 85, 84, 128, 76, 85, 82, 88, 128, 76, 85, 80, 128, 76, 85, 79, 88, + 128, 76, 85, 79, 84, 128, 76, 85, 79, 80, 128, 76, 85, 79, 128, 76, 85, + 78, 71, 83, 73, 128, 76, 85, 78, 65, 84, 197, 76, 85, 205, 76, 85, 76, + 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, 128, 76, 85, 72, 128, 76, + 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, 65, 76, 128, 76, 85, 71, 65, + 204, 76, 85, 69, 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85, + 50, 128, 76, 85, 178, 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, + 78, 71, 197, 76, 79, 88, 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, + 69, 210, 76, 79, 87, 45, 185, 76, 79, 86, 197, 76, 79, 85, 82, 69, 128, + 76, 79, 85, 68, 83, 80, 69, 65, 75, 69, 82, 128, 76, 79, 85, 68, 76, 217, + 76, 79, 84, 85, 83, 128, 76, 79, 84, 128, 76, 79, 82, 82, 89, 128, 76, + 79, 82, 82, 65, 73, 78, 69, 128, 76, 79, 81, 128, 76, 79, 80, 128, 76, + 79, 79, 84, 128, 76, 79, 79, 80, 128, 76, 79, 79, 78, 128, 76, 79, 79, + 203, 76, 79, 79, 128, 76, 79, 78, 83, 85, 77, 128, 76, 79, 78, 71, 65, + 128, 76, 79, 78, 71, 193, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, + 89, 82, 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, 204, + 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, 78, + 71, 45, 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, 78, 71, 45, + 66, 82, 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, 78, 71, 45, + 66, 82, 65, 78, 67, 72, 45, 65, 210, 76, 79, 77, 77, 65, 69, 128, 76, 79, + 77, 128, 76, 79, 205, 76, 79, 76, 76, 73, 80, 79, 80, 128, 76, 79, 76, + 76, 128, 76, 79, 71, 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, 71, + 79, 71, 82, 65, 205, 76, 79, 71, 128, 76, 79, 68, 69, 83, 84, 79, 78, 69, + 128, 76, 79, 67, 79, 77, 79, 84, 73, 86, 69, 128, 76, 79, 67, 203, 76, + 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 67, 65, 84, 73, 79, 206, 76, 79, + 65, 128, 76, 78, 128, 76, 77, 128, 76, 76, 76, 65, 128, 76, 74, 85, 68, + 73, 74, 69, 128, 76, 74, 69, 128, 76, 74, 128, 76, 73, 88, 128, 76, 73, + 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, 84, 76, 197, 76, 73, 84, + 84, 69, 210, 76, 73, 84, 82, 193, 76, 73, 84, 128, 76, 73, 83, 213, 76, + 73, 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, 81, 128, 76, 73, 80, 83, + 84, 73, 67, 75, 128, 76, 73, 78, 75, 73, 78, 199, 76, 73, 78, 203, 76, + 73, 78, 71, 83, 65, 128, 76, 73, 78, 69, 83, 128, 76, 73, 78, 69, 211, + 76, 73, 78, 69, 45, 57, 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69, + 45, 51, 128, 76, 73, 78, 69, 45, 49, 128, 76, 73, 77, 77, 85, 52, 128, + 76, 73, 77, 77, 85, 50, 128, 76, 73, 77, 77, 85, 128, 76, 73, 77, 77, + 213, 76, 73, 77, 73, 84, 69, 196, 76, 73, 77, 73, 84, 65, 84, 73, 79, 78, + 128, 76, 73, 77, 73, 84, 128, 76, 73, 77, 69, 128, 76, 73, 76, 89, 128, + 76, 73, 76, 73, 84, 72, 128, 76, 73, 76, 128, 76, 73, 73, 128, 76, 73, + 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, + 128, 76, 73, 71, 72, 84, 128, 76, 73, 70, 69, 128, 76, 73, 69, 88, 128, + 76, 73, 69, 84, 128, 76, 73, 69, 80, 128, 76, 73, 69, 69, 128, 76, 73, + 69, 128, 76, 73, 68, 128, 76, 73, 66, 82, 65, 128, 76, 73, 66, 69, 82, + 84, 89, 128, 76, 73, 65, 66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128, + 76, 72, 65, 86, 73, 89, 65, 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, + 128, 76, 72, 128, 76, 69, 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 69, + 204, 76, 69, 85, 77, 128, 76, 69, 85, 65, 69, 80, 128, 76, 69, 85, 65, + 69, 77, 128, 76, 69, 84, 84, 69, 82, 83, 128, 76, 69, 84, 84, 69, 82, + 128, 76, 69, 212, 76, 69, 83, 83, 69, 210, 76, 69, 83, 83, 45, 84, 72, + 65, 78, 128, 76, 69, 83, 83, 45, 84, 72, 65, 206, 76, 69, 80, 128, 76, + 69, 79, 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, 69, 78, 84, 73, 67, 85, + 76, 65, 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, 71, 84, 72, 69, 78, 69, + 82, 128, 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, 69, 78, + 71, 193, 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, 69, 76, + 69, 84, 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, 77, 65, + 128, 76, 69, 73, 77, 77, 193, 76, 69, 71, 83, 128, 76, 69, 71, 73, 79, + 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, 71, 128, 76, 69, 70, 84, + 87, 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, 79, 45, 82, 73, 71, 72, + 212, 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, 70, 84, 45, 83, 73, 68, + 197, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, 69, 70, 84, 45, 80, + 79, 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 45, 72, 65, 78, 68, 69, 196, + 76, 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, 70, 65, 67, 73, + 78, 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, 65, 128, 76, + 69, 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, 69, 82, 128, + 76, 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, 128, 76, 69, 65, 198, + 76, 69, 65, 68, 73, 78, 199, 76, 69, 65, 68, 69, 82, 128, 76, 69, 65, + 196, 76, 68, 65, 78, 128, 76, 68, 50, 128, 76, 67, 201, 76, 67, 197, 76, + 65, 90, 217, 76, 65, 89, 65, 78, 78, 65, 128, 76, 65, 88, 128, 76, 65, + 87, 128, 76, 65, 215, 76, 65, 85, 76, 65, 128, 76, 65, 85, 75, 65, 218, + 76, 65, 84, 73, 78, 65, 84, 197, 76, 65, 84, 73, 75, 128, 76, 65, 84, 69, + 82, 65, 204, 76, 65, 84, 197, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, + 69, 65, 204, 76, 65, 82, 71, 69, 210, 76, 65, 82, 71, 69, 128, 76, 65, + 82, 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, 81, 128, 76, 65, 80, 128, + 76, 65, 207, 76, 65, 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, 85, 65, 71, + 197, 76, 65, 78, 69, 83, 128, 76, 65, 77, 69, 68, 72, 128, 76, 65, 77, + 69, 68, 128, 76, 65, 77, 69, 196, 76, 65, 77, 69, 128, 76, 65, 77, 197, + 76, 65, 77, 68, 65, 128, 76, 65, 77, 68, 128, 76, 65, 77, 66, 68, 193, + 76, 65, 77, 65, 68, 72, 128, 76, 65, 76, 128, 76, 65, 204, 76, 65, 75, + 75, 72, 65, 78, 71, 89, 65, 79, 128, 76, 65, 74, 65, 78, 89, 65, 76, 65, + 78, 128, 76, 65, 201, 76, 65, 72, 83, 72, 85, 128, 76, 65, 71, 85, 83, + 128, 76, 65, 71, 213, 76, 65, 71, 65, 82, 128, 76, 65, 71, 65, 210, 76, + 65, 71, 65, 66, 128, 76, 65, 71, 65, 194, 76, 65, 69, 86, 128, 76, 65, + 69, 128, 76, 65, 68, 217, 76, 65, 67, 75, 128, 76, 65, 67, 65, 128, 76, + 65, 66, 79, 85, 82, 73, 78, 71, 128, 76, 65, 66, 79, 82, 128, 76, 65, 66, + 73, 65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, 65, 84, 128, 76, 65, + 65, 78, 65, 69, 128, 76, 65, 65, 78, 128, 76, 65, 65, 77, 85, 128, 76, + 65, 65, 77, 128, 76, 65, 65, 73, 128, 76, 48, 48, 54, 65, 128, 76, 48, + 48, 50, 65, 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, 72, 65, 80, 69, + 196, 75, 89, 85, 82, 73, 73, 128, 75, 89, 85, 128, 75, 89, 79, 128, 75, + 89, 76, 73, 83, 77, 65, 128, 75, 89, 73, 128, 75, 89, 69, 128, 75, 89, + 65, 84, 72, 79, 211, 75, 89, 65, 65, 128, 75, 89, 65, 128, 75, 88, 87, + 73, 128, 75, 88, 87, 69, 69, 128, 75, 88, 87, 69, 128, 75, 88, 87, 65, + 65, 128, 75, 88, 87, 65, 128, 75, 88, 85, 128, 75, 88, 79, 128, 75, 88, + 73, 128, 75, 88, 69, 69, 128, 75, 88, 69, 128, 75, 88, 65, 65, 128, 75, + 88, 65, 128, 75, 87, 85, 51, 49, 56, 128, 75, 87, 79, 79, 128, 75, 87, + 79, 128, 75, 87, 73, 73, 128, 75, 87, 73, 128, 75, 87, 69, 69, 128, 75, + 87, 69, 128, 75, 87, 65, 89, 128, 75, 87, 65, 69, 84, 128, 75, 87, 65, + 65, 128, 75, 86, 65, 128, 75, 86, 128, 75, 85, 88, 128, 75, 85, 85, 72, + 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, 72, 85, 50, + 128, 75, 85, 82, 88, 128, 75, 85, 82, 85, 90, 69, 73, 82, 79, 128, 75, + 85, 82, 84, 128, 75, 85, 82, 79, 79, 78, 69, 128, 75, 85, 82, 128, 75, + 85, 210, 75, 85, 81, 128, 75, 85, 79, 88, 128, 75, 85, 79, 80, 128, 75, + 85, 79, 208, 75, 85, 79, 77, 128, 75, 85, 79, 128, 75, 85, 78, 71, 128, + 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, 128, 75, 85, 76, 128, 75, 85, + 204, 75, 85, 69, 84, 128, 75, 85, 55, 128, 75, 85, 52, 128, 75, 85, 180, + 75, 85, 51, 128, 75, 85, 179, 75, 84, 128, 75, 83, 83, 65, 128, 75, 83, + 73, 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 75, 82, 65, 84, 73, 77, 79, + 89, 80, 79, 82, 82, 79, 79, 78, 128, 75, 82, 65, 84, 73, 77, 79, 75, 79, + 85, 70, 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, 77, 65, 84, 65, 128, 75, + 82, 65, 84, 73, 77, 193, 75, 80, 85, 128, 75, 80, 79, 81, 128, 75, 80, + 79, 79, 128, 75, 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 85, 88, 128, + 75, 80, 69, 69, 128, 75, 80, 69, 128, 75, 80, 65, 82, 65, 81, 128, 75, + 80, 65, 78, 128, 75, 80, 65, 128, 75, 79, 88, 128, 75, 79, 86, 85, 85, + 128, 75, 79, 84, 79, 128, 75, 79, 82, 85, 78, 65, 128, 75, 79, 82, 79, + 78, 73, 83, 128, 75, 79, 82, 69, 65, 206, 75, 79, 82, 65, 78, 73, 195, + 75, 79, 81, 78, 68, 79, 78, 128, 75, 79, 80, 80, 65, 128, 75, 79, 80, + 128, 75, 79, 79, 80, 79, 128, 75, 79, 79, 77, 85, 85, 84, 128, 75, 79, + 79, 128, 75, 79, 78, 84, 69, 86, 77, 65, 128, 75, 79, 78, 84, 69, 86, 77, + 193, 75, 79, 77, 201, 75, 79, 77, 66, 85, 86, 65, 128, 75, 79, 77, 66, + 85, 86, 193, 75, 79, 77, 66, 213, 75, 79, 75, 79, 128, 75, 79, 75, 128, + 75, 79, 203, 75, 79, 73, 128, 75, 79, 201, 75, 79, 72, 128, 75, 79, 71, + 72, 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, 65, 76, 65, 128, 75, 79, + 65, 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, 75, 78, + 73, 70, 69, 128, 75, 78, 73, 70, 197, 75, 77, 128, 75, 205, 75, 76, 73, + 84, 79, 78, 128, 75, 76, 65, 83, 77, 65, 128, 75, 76, 65, 83, 77, 193, + 75, 76, 65, 128, 75, 76, 128, 75, 75, 85, 128, 75, 75, 79, 128, 75, 75, + 73, 128, 75, 75, 69, 69, 128, 75, 75, 69, 128, 75, 75, 65, 128, 75, 75, + 128, 75, 74, 69, 128, 75, 73, 89, 69, 79, 75, 45, 84, 73, 75, 69, 85, 84, + 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, + 75, 128, 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, 128, 75, 73, 89, + 69, 79, 75, 45, 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, 79, 75, 45, 78, + 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, 73, 69, 85, 75, + 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, 67, 72, 128, 75, + 73, 89, 69, 79, 203, 75, 73, 88, 128, 75, 73, 84, 128, 75, 73, 83, 83, + 73, 78, 199, 75, 73, 83, 83, 128, 75, 73, 83, 211, 75, 73, 83, 73, 77, + 53, 128, 75, 73, 83, 73, 77, 181, 75, 73, 83, 72, 128, 75, 73, 83, 65, + 76, 128, 75, 73, 82, 79, 87, 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69, + 69, 84, 79, 82, 85, 128, 75, 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, + 73, 82, 79, 128, 75, 73, 82, 71, 72, 73, 218, 75, 73, 81, 128, 75, 73, + 80, 128, 75, 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, 73, 78, 68, + 69, 82, 71, 65, 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, 75, 73, + 73, 128, 75, 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 80, 128, 75, + 73, 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, 196, 75, + 73, 67, 75, 128, 75, 72, 90, 128, 75, 72, 87, 65, 73, 128, 75, 72, 85, + 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, 206, 75, 72, 85, 65, 84, 128, + 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, 72, 79, 78, 128, 75, 72, 79, + 77, 85, 84, 128, 75, 72, 79, 128, 75, 72, 207, 75, 72, 73, 84, 128, 75, + 72, 73, 69, 85, 75, 200, 75, 72, 73, 128, 75, 72, 72, 79, 128, 75, 72, + 72, 65, 128, 75, 72, 69, 84, 72, 128, 75, 72, 69, 73, 128, 75, 72, 69, + 69, 128, 75, 72, 69, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, 201, 75, 72, 65, 82, 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, 75, 72, 65, 78, 68, 193, 75, 72, 65, 78, 128, 75, 72, 65, 77, 84, 201, 75, 72, 65, 75, 65, 83, 83, 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72, 128, 75, 72, 65, 200, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67, - 65, 80, 128, 75, 69, 89, 66, 79, 65, 82, 68, 128, 75, 69, 89, 128, 75, - 69, 217, 75, 69, 88, 128, 75, 69, 85, 88, 128, 75, 69, 84, 84, 201, 75, - 69, 83, 72, 50, 128, 75, 69, 82, 69, 84, 128, 75, 69, 79, 87, 128, 75, - 69, 78, 84, 73, 77, 65, 84, 65, 128, 75, 69, 78, 84, 73, 77, 65, 84, 193, - 75, 69, 78, 84, 73, 77, 193, 75, 69, 78, 65, 84, 128, 75, 69, 78, 128, - 75, 69, 77, 80, 85, 76, 128, 75, 69, 77, 80, 85, 204, 75, 69, 77, 80, 76, - 73, 128, 75, 69, 77, 80, 76, 201, 75, 69, 77, 80, 72, 82, 69, 78, 71, - 128, 75, 69, 77, 66, 65, 78, 71, 128, 75, 69, 76, 86, 73, 206, 75, 69, - 72, 69, 72, 128, 75, 69, 72, 69, 200, 75, 69, 72, 128, 75, 69, 70, 85, - 76, 65, 128, 75, 69, 69, 83, 85, 128, 75, 69, 69, 80, 73, 78, 199, 75, - 69, 69, 78, 71, 128, 75, 67, 65, 76, 128, 75, 66, 128, 75, 65, 90, 65, - 75, 200, 75, 65, 89, 65, 78, 78, 65, 128, 75, 65, 89, 65, 200, 75, 65, - 88, 128, 75, 65, 87, 73, 128, 75, 65, 86, 89, 75, 65, 128, 75, 65, 85, - 78, 65, 128, 75, 65, 85, 206, 75, 65, 84, 79, 128, 75, 65, 84, 72, 73, - 83, 84, 73, 128, 75, 65, 84, 72, 65, 75, 193, 75, 65, 84, 65, 86, 65, 83, - 77, 65, 128, 75, 65, 84, 65, 86, 193, 75, 65, 84, 65, 75, 65, 78, 65, 45, - 72, 73, 82, 65, 71, 65, 78, 193, 75, 65, 83, 82, 65, 84, 65, 78, 128, 75, - 65, 83, 82, 65, 84, 65, 206, 75, 65, 83, 82, 65, 128, 75, 65, 83, 82, - 193, 75, 65, 83, 75, 65, 76, 128, 75, 65, 83, 75, 65, 204, 75, 65, 83, - 72, 77, 73, 82, 201, 75, 65, 82, 83, 72, 65, 78, 65, 128, 75, 65, 82, 79, - 82, 73, 73, 128, 75, 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, - 75, 65, 82, 65, 78, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, - 71, 80, 73, 69, 85, 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, 69, - 85, 76, 128, 75, 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, - 128, 75, 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, 80, - 80, 65, 128, 75, 65, 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, 72, - 128, 75, 65, 80, 65, 76, 128, 75, 65, 80, 65, 128, 75, 65, 80, 128, 75, - 65, 78, 84, 65, 74, 193, 75, 65, 78, 71, 128, 75, 65, 78, 199, 75, 65, - 78, 65, 75, 79, 128, 75, 65, 77, 52, 128, 75, 65, 77, 50, 128, 75, 65, - 75, 79, 128, 75, 65, 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, - 203, 75, 65, 73, 82, 73, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, 70, + 65, 80, 128, 75, 69, 89, 67, 65, 208, 75, 69, 89, 66, 79, 65, 82, 68, + 128, 75, 69, 88, 128, 75, 69, 85, 89, 69, 85, 88, 128, 75, 69, 85, 83, + 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, 83, 69, 85, 88, 128, 75, 69, 85, + 80, 85, 81, 128, 75, 69, 85, 79, 212, 75, 69, 85, 77, 128, 75, 69, 85, + 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, 85, 75, 65, 81, 128, 75, 69, 85, + 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, 85, 65, 69, 82, 73, 128, 75, 69, + 84, 84, 201, 75, 69, 83, 72, 50, 128, 75, 69, 82, 69, 84, 128, 75, 69, + 79, 87, 128, 75, 69, 78, 84, 73, 77, 65, 84, 65, 128, 75, 69, 78, 84, 73, + 77, 65, 84, 193, 75, 69, 78, 84, 73, 77, 193, 75, 69, 78, 65, 84, 128, + 75, 69, 78, 128, 75, 69, 206, 75, 69, 77, 80, 85, 76, 128, 75, 69, 77, + 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, 75, 69, 77, 80, 76, 201, 75, + 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, 77, 66, 65, 78, 71, 128, 75, + 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, 128, 75, 69, 72, 69, 200, 75, + 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, 75, 69, 69, 83, 85, 128, 75, + 69, 69, 80, 73, 78, 199, 75, 69, 69, 78, 71, 128, 75, 67, 65, 76, 128, + 75, 66, 128, 75, 65, 90, 65, 75, 200, 75, 65, 89, 65, 78, 78, 65, 128, + 75, 65, 89, 65, 200, 75, 65, 88, 128, 75, 65, 87, 73, 128, 75, 65, 86, + 89, 75, 65, 128, 75, 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, 84, + 79, 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, 75, 65, 84, 72, 65, 75, + 193, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, 65, 84, 65, 86, 193, + 75, 65, 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, 71, 65, 78, 193, 75, + 65, 83, 82, 65, 84, 65, 78, 128, 75, 65, 83, 82, 65, 84, 65, 206, 75, 65, + 83, 82, 65, 128, 75, 65, 83, 82, 193, 75, 65, 83, 75, 65, 76, 128, 75, + 65, 83, 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, 201, 75, 65, 82, 83, 72, + 65, 78, 65, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 65, 82, 207, 75, + 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, 82, 65, 78, + 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, 71, 80, 73, 69, 85, + 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, 69, 85, 76, 128, 75, 65, + 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, 128, 75, 65, 80, 89, + 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, 80, 80, 65, 128, 75, 65, + 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, 72, 128, 75, 65, 80, 65, + 76, 128, 75, 65, 80, 65, 128, 75, 65, 78, 84, 65, 74, 193, 75, 65, 78, + 71, 128, 75, 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, 75, 65, 77, 52, + 128, 75, 65, 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, 79, 128, 75, 65, + 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, 75, 65, 73, 82, + 73, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, 70, 65, 128, 75, 65, 70, 128, 75, 65, 198, 75, 65, 68, 53, 128, 75, 65, 68, 181, 75, 65, 68, 52, 128, 75, 65, 68, 51, 128, 75, 65, 68, 179, 75, 65, 68, 50, 128, 75, 65, - 66, 193, 75, 65, 66, 128, 75, 65, 65, 73, 128, 75, 65, 65, 70, 85, 128, - 75, 65, 65, 70, 128, 75, 65, 50, 128, 75, 65, 178, 75, 48, 48, 56, 128, - 75, 48, 48, 55, 128, 75, 48, 48, 54, 128, 75, 48, 48, 53, 128, 75, 48, - 48, 52, 128, 75, 48, 48, 51, 128, 75, 48, 48, 50, 128, 75, 48, 48, 49, - 128, 74, 87, 65, 128, 74, 85, 85, 128, 74, 85, 84, 128, 74, 85, 80, 73, - 84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80, 128, 74, 85, 78, - 79, 128, 74, 85, 78, 69, 128, 74, 85, 76, 89, 128, 74, 85, 69, 85, 73, - 128, 74, 85, 68, 71, 69, 128, 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, - 83, 200, 74, 79, 89, 79, 85, 211, 74, 79, 89, 128, 74, 79, 212, 74, 79, - 78, 71, 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 74, 79, 73, 78, - 69, 68, 128, 74, 79, 73, 78, 128, 74, 79, 65, 128, 74, 74, 89, 88, 128, - 74, 74, 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128, 74, 74, 85, - 88, 128, 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74, 74, 85, 82, - 128, 74, 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 79, 80, - 128, 74, 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88, 128, 74, 74, - 79, 84, 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74, 73, 88, 128, - 74, 74, 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69, 88, 128, 74, - 74, 73, 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, 128, 74, - 74, 73, 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74, 65, 128, 74, - 73, 76, 128, 74, 73, 72, 86, 65, 77, 85, 76, 73, 89, 65, 128, 74, 73, 65, - 128, 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 78, 128, 74, 72, - 65, 77, 128, 74, 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, - 76, 69, 77, 128, 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, - 128, 74, 69, 72, 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, - 69, 69, 77, 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, 65, 86, 73, 89, 65, - 78, 73, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78, 69, 83, 197, 74, 65, - 78, 85, 65, 82, 89, 128, 74, 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, - 72, 79, 85, 128, 74, 65, 68, 69, 128, 74, 65, 65, 128, 74, 45, 83, 73, - 77, 80, 76, 73, 70, 73, 69, 196, 202, 73, 90, 72, 73, 84, 83, 65, 128, - 73, 90, 72, 73, 84, 83, 193, 73, 90, 72, 69, 128, 73, 89, 69, 75, 128, - 73, 89, 65, 78, 78, 65, 128, 73, 85, 74, 65, 128, 73, 85, 128, 73, 84, + 68, 128, 75, 65, 66, 193, 75, 65, 66, 128, 75, 65, 65, 73, 128, 75, 65, + 65, 70, 85, 128, 75, 65, 65, 70, 128, 75, 65, 50, 128, 75, 65, 178, 75, + 48, 48, 56, 128, 75, 48, 48, 55, 128, 75, 48, 48, 54, 128, 75, 48, 48, + 53, 128, 75, 48, 48, 52, 128, 75, 48, 48, 51, 128, 75, 48, 48, 50, 128, + 75, 48, 48, 49, 128, 74, 87, 65, 128, 74, 85, 85, 128, 74, 85, 84, 128, + 74, 85, 80, 73, 84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80, + 128, 74, 85, 78, 79, 128, 74, 85, 78, 69, 128, 74, 85, 76, 89, 128, 74, + 85, 69, 85, 73, 128, 74, 85, 68, 85, 76, 128, 74, 85, 68, 71, 69, 128, + 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200, 74, 79, 89, 79, 85, + 211, 74, 79, 89, 128, 74, 79, 86, 69, 128, 74, 79, 212, 74, 79, 78, 71, + 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 74, 79, 73, 78, 69, 68, + 128, 74, 79, 73, 78, 128, 74, 79, 65, 128, 74, 74, 89, 88, 128, 74, 74, + 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128, 74, 74, 85, 88, 128, + 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74, 74, 85, 82, 128, 74, + 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 79, 80, 128, 74, + 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88, 128, 74, 74, 79, 84, + 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74, 73, 88, 128, 74, 74, + 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69, 88, 128, 74, 74, 73, + 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, 128, 74, 74, 73, + 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74, 65, 128, 74, 73, 76, + 128, 74, 73, 72, 86, 65, 77, 85, 76, 73, 89, 65, 128, 74, 73, 65, 128, + 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 78, 128, 74, 72, 65, + 77, 128, 74, 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, 76, + 69, 77, 128, 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, 128, + 74, 69, 72, 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, 69, + 69, 77, 128, 74, 69, 65, 78, 83, 128, 74, 65, 89, 65, 78, 78, 65, 128, + 74, 65, 86, 73, 89, 65, 78, 73, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78, + 69, 83, 197, 74, 65, 80, 65, 78, 128, 74, 65, 78, 85, 65, 82, 89, 128, + 74, 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, 74, 65, + 68, 69, 128, 74, 65, 67, 75, 45, 79, 45, 76, 65, 78, 84, 69, 82, 78, 128, + 74, 65, 67, 203, 74, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 202, + 73, 90, 72, 73, 84, 83, 65, 128, 73, 90, 72, 73, 84, 83, 193, 73, 90, 72, + 69, 128, 73, 90, 65, 75, 65, 89, 193, 73, 89, 69, 75, 128, 73, 89, 65, + 78, 78, 65, 128, 73, 85, 74, 65, 128, 73, 85, 128, 73, 84, 211, 73, 84, 69, 82, 65, 84, 73, 79, 206, 73, 84, 69, 77, 128, 73, 83, 83, 72, 65, 82, - 128, 73, 83, 211, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, 69, 78, - 45, 73, 83, 69, 78, 128, 73, 83, 65, 75, 73, 193, 73, 83, 45, 80, 73, 76, - 76, 65, 128, 73, 82, 85, 89, 65, 78, 78, 65, 128, 73, 82, 85, 85, 89, 65, - 78, 78, 65, 128, 73, 79, 84, 73, 70, 73, 69, 196, 73, 79, 84, 65, 84, 69, - 196, 73, 79, 84, 65, 128, 73, 79, 84, 193, 73, 79, 82, 128, 73, 79, 68, - 72, 65, 68, 72, 128, 73, 78, 86, 73, 83, 73, 66, 76, 197, 73, 78, 86, 69, - 82, 84, 69, 68, 128, 73, 78, 86, 69, 82, 84, 69, 196, 73, 78, 86, 69, 82, - 83, 197, 73, 78, 84, 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, - 73, 195, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 78, 128, 73, 78, 84, - 69, 82, 83, 69, 67, 84, 73, 79, 206, 73, 78, 84, 69, 82, 83, 69, 67, 84, - 73, 78, 199, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 73, 78, 84, - 69, 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, 76, 79, 67, - 75, 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, 73, 78, 84, 69, - 82, 73, 79, 210, 73, 78, 84, 69, 82, 69, 83, 212, 73, 78, 84, 69, 82, 67, - 65, 76, 65, 84, 69, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, - 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 71, 82, 65, - 76, 128, 73, 78, 84, 69, 71, 82, 65, 204, 73, 78, 83, 85, 76, 65, 210, - 73, 78, 83, 84, 82, 85, 77, 69, 78, 84, 65, 204, 73, 78, 83, 73, 68, 69, - 128, 73, 78, 83, 69, 82, 84, 73, 79, 206, 73, 78, 83, 69, 67, 84, 128, - 73, 78, 83, 67, 82, 73, 80, 84, 73, 79, 78, 65, 204, 73, 78, 78, 79, 67, - 69, 78, 67, 69, 128, 73, 78, 78, 78, 128, 73, 78, 78, 69, 82, 128, 73, - 78, 78, 69, 210, 73, 78, 78, 128, 73, 78, 73, 78, 71, 85, 128, 73, 78, - 73, 128, 73, 78, 72, 73, 66, 73, 212, 73, 78, 72, 69, 82, 69, 78, 212, - 73, 78, 71, 87, 65, 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, - 73, 78, 70, 76, 85, 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, - 128, 73, 78, 70, 73, 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, - 204, 73, 78, 68, 73, 82, 69, 67, 212, 73, 78, 68, 73, 67, 65, 84, 79, 82, - 128, 73, 78, 68, 73, 195, 73, 78, 68, 69, 88, 128, 73, 78, 68, 69, 80, - 69, 78, 68, 69, 78, 212, 73, 78, 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, - 67, 82, 69, 65, 83, 69, 211, 73, 78, 67, 82, 69, 65, 83, 69, 128, 73, 78, - 67, 79, 77, 80, 76, 69, 84, 197, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, - 78, 67, 72, 128, 73, 78, 65, 80, 128, 73, 78, 45, 65, 76, 65, 70, 128, - 73, 77, 80, 69, 82, 73, 65, 204, 73, 77, 80, 69, 82, 70, 69, 67, 84, 85, - 205, 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, 73, 77, 80, 69, 82, 70, - 69, 67, 84, 193, 73, 77, 73, 83, 69, 79, 211, 73, 77, 73, 78, 51, 128, - 73, 77, 73, 78, 128, 73, 77, 73, 206, 73, 77, 73, 70, 84, 72, 79, 82, 79, - 78, 128, 73, 77, 73, 70, 84, 72, 79, 82, 65, 128, 73, 77, 73, 70, 79, 78, - 79, 78, 128, 73, 77, 73, 68, 73, 65, 82, 71, 79, 78, 128, 73, 77, 65, 71, - 197, 73, 76, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 89, 128, 73, 76, - 85, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 84, 128, 73, 76, 73, 77, 77, - 85, 52, 128, 73, 76, 73, 77, 77, 85, 51, 128, 73, 76, 73, 77, 77, 85, - 128, 73, 76, 73, 77, 77, 213, 73, 76, 50, 128, 73, 75, 65, 82, 65, 128, - 73, 75, 65, 82, 193, 73, 74, 128, 73, 73, 89, 65, 78, 78, 65, 128, 73, - 71, 73, 128, 73, 71, 201, 73, 71, 71, 87, 83, 128, 73, 70, 73, 78, 128, - 73, 69, 85, 78, 71, 45, 84, 73, 75, 69, 85, 84, 128, 73, 69, 85, 78, 71, - 45, 84, 72, 73, 69, 85, 84, 72, 128, 73, 69, 85, 78, 71, 45, 83, 83, 65, - 78, 71, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85, 78, 71, 45, 82, 73, 69, - 85, 76, 128, 73, 69, 85, 78, 71, 45, 80, 73, 69, 85, 80, 128, 73, 69, 85, - 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, 128, 73, 69, 85, 78, 71, 45, 75, - 73, 89, 69, 79, 75, 128, 73, 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, 75, - 72, 128, 73, 69, 85, 78, 71, 45, 67, 73, 69, 85, 67, 128, 73, 69, 85, 78, - 71, 45, 67, 72, 73, 69, 85, 67, 72, 128, 73, 69, 85, 78, 199, 73, 68, 76, - 69, 128, 73, 68, 73, 77, 128, 73, 68, 73, 205, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 57, 48, - 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 68, 55, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 67, 65, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 128, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, 69, 78, 45, 73, 83, + 69, 78, 128, 73, 83, 65, 75, 73, 193, 73, 83, 45, 80, 73, 76, 76, 65, + 128, 73, 82, 85, 89, 65, 78, 78, 65, 128, 73, 82, 85, 85, 89, 65, 78, 78, + 65, 128, 73, 82, 79, 78, 45, 67, 79, 80, 80, 69, 210, 73, 82, 79, 78, + 128, 73, 79, 84, 73, 70, 73, 69, 196, 73, 79, 84, 65, 84, 69, 196, 73, + 79, 84, 65, 128, 73, 79, 84, 193, 73, 79, 82, 128, 73, 79, 68, 72, 65, + 68, 72, 128, 73, 78, 86, 73, 83, 73, 66, 76, 197, 73, 78, 86, 69, 82, 84, + 69, 68, 128, 73, 78, 86, 69, 82, 84, 69, 196, 73, 78, 86, 69, 82, 83, + 197, 73, 78, 84, 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, 73, + 195, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 78, 128, 73, 78, 84, 69, + 82, 83, 69, 67, 84, 73, 79, 206, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, + 78, 199, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 73, 78, 84, 69, + 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, 76, 79, 67, 75, + 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, 73, 78, 84, 69, 82, + 76, 65, 67, 69, 196, 73, 78, 84, 69, 82, 73, 79, 210, 73, 78, 84, 69, 82, + 69, 83, 212, 73, 78, 84, 69, 82, 67, 65, 76, 65, 84, 69, 128, 73, 78, 84, + 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, + 79, 206, 73, 78, 84, 69, 71, 82, 65, 76, 128, 73, 78, 84, 69, 71, 82, 65, + 204, 73, 78, 83, 85, 76, 65, 210, 73, 78, 83, 84, 82, 85, 77, 69, 78, 84, + 65, 204, 73, 78, 83, 73, 68, 69, 128, 73, 78, 83, 69, 82, 84, 73, 79, + 206, 73, 78, 83, 69, 67, 84, 128, 73, 78, 83, 67, 82, 73, 80, 84, 73, 79, + 78, 65, 204, 73, 78, 80, 85, 212, 73, 78, 78, 79, 67, 69, 78, 67, 69, + 128, 73, 78, 78, 78, 128, 73, 78, 78, 69, 82, 128, 73, 78, 78, 69, 210, + 73, 78, 78, 128, 73, 78, 73, 78, 71, 85, 128, 73, 78, 73, 128, 73, 78, + 72, 73, 66, 73, 212, 73, 78, 72, 69, 82, 69, 78, 212, 73, 78, 71, 87, 65, + 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, 73, 78, 70, 76, 85, + 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, 73, 78, 70, 73, + 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, 73, 78, 68, 73, + 82, 69, 67, 212, 73, 78, 68, 73, 67, 65, 84, 79, 82, 128, 73, 78, 68, 73, + 67, 65, 84, 79, 210, 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, 206, 73, + 78, 68, 69, 88, 128, 73, 78, 68, 69, 80, 69, 78, 68, 69, 78, 212, 73, 78, + 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, 67, 82, 69, 65, 83, 69, 211, 73, + 78, 67, 82, 69, 65, 83, 69, 128, 73, 78, 67, 79, 77, 80, 76, 69, 84, 197, + 73, 78, 67, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, + 78, 67, 72, 128, 73, 78, 66, 79, 216, 73, 78, 65, 80, 128, 73, 78, 45, + 65, 76, 65, 70, 128, 73, 77, 80, 69, 82, 73, 65, 204, 73, 77, 80, 69, 82, + 70, 69, 67, 84, 85, 205, 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, 73, + 77, 80, 69, 82, 70, 69, 67, 84, 193, 73, 77, 73, 83, 69, 79, 211, 73, 77, + 73, 78, 51, 128, 73, 77, 73, 78, 128, 73, 77, 73, 206, 73, 77, 73, 70, + 84, 72, 79, 82, 79, 78, 128, 73, 77, 73, 70, 84, 72, 79, 82, 65, 128, 73, + 77, 73, 70, 79, 78, 79, 78, 128, 73, 77, 73, 68, 73, 65, 82, 71, 79, 78, + 128, 73, 77, 65, 71, 197, 73, 76, 85, 89, 65, 78, 78, 65, 128, 73, 76, + 85, 89, 128, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 84, + 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, 73, 77, 77, 85, 51, 128, + 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, 213, 73, 76, 50, 128, + 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, 74, 128, 73, 73, 89, + 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, 73, 71, 71, 87, 83, + 128, 73, 70, 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, 73, 75, 69, 85, 84, + 128, 73, 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, 72, 128, 73, 69, 85, + 78, 71, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85, + 78, 71, 45, 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, 71, 45, 80, 73, 69, + 85, 80, 128, 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, 128, 73, + 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85, 78, 71, 45, + 75, 72, 73, 69, 85, 75, 72, 128, 73, 69, 85, 78, 71, 45, 67, 73, 69, 85, + 67, 128, 73, 69, 85, 78, 71, 45, 67, 72, 73, 69, 85, 67, 72, 128, 73, 69, + 85, 78, 199, 73, 68, 76, 69, 128, 73, 68, 73, 77, 128, 73, 68, 73, 205, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 57, 48, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 56, 68, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 67, + 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, 51, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 54, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, - 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 54, 55, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, - 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 57, 57, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 53, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, 53, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, - 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 52, 66, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 70, 56, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, - 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, 49, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 56, 70, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, 68, 69, 79, 71, 82, + 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 49, 70, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 54, 69, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, + 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 57, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 54, 53, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, + 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, 53, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 54, 50, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 70, + 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 53, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 56, + 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 53, 66, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 51, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, - 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 52, 69, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, - 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 78, 84, 73, 70, - 73, 67, 65, 84, 73, 79, 78, 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, - 67, 72, 79, 85, 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, - 79, 83, 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, - 73, 67, 45, 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, - 65, 128, 73, 48, 49, 53, 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, - 73, 48, 49, 50, 128, 73, 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, - 48, 49, 48, 65, 128, 73, 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, - 48, 48, 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, - 54, 128, 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, - 128, 73, 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, - 45, 89, 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, - 89, 69, 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, - 45, 89, 65, 128, 73, 45, 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, - 85, 128, 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, - 73, 45, 65, 128, 72, 90, 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, - 90, 80, 128, 72, 90, 90, 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, - 90, 84, 128, 72, 90, 71, 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, - 72, 89, 80, 79, 68, 73, 65, 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, - 78, 65, 84, 73, 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, - 128, 72, 89, 80, 72, 69, 78, 128, 72, 89, 80, 72, 69, 206, 72, 88, 87, - 71, 128, 72, 88, 85, 79, 88, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, - 79, 80, 128, 72, 88, 85, 79, 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, - 128, 72, 88, 79, 80, 128, 72, 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, - 73, 84, 128, 72, 88, 73, 80, 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, - 69, 84, 128, 72, 88, 73, 69, 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, - 128, 72, 88, 69, 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, - 65, 88, 128, 72, 88, 65, 84, 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, - 72, 87, 85, 128, 72, 87, 65, 73, 82, 128, 72, 86, 128, 72, 85, 82, 65, - 78, 128, 72, 85, 79, 84, 128, 72, 85, 78, 68, 82, 69, 68, 128, 72, 85, - 78, 68, 82, 69, 196, 72, 85, 78, 128, 72, 85, 77, 65, 78, 128, 72, 85, - 77, 65, 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, 72, 85, - 66, 50, 128, 72, 85, 66, 178, 72, 85, 66, 128, 72, 85, 65, 82, 65, 68, - 68, 79, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, 80, - 65, 128, 72, 80, 128, 72, 79, 85, 82, 71, 76, 65, 83, 83, 128, 72, 79, - 85, 210, 72, 79, 84, 65, 128, 72, 79, 82, 83, 69, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 54, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 54, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 54, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, - 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, - 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, - 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 52, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 52, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 52, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, - 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, - 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, - 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 49, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 49, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 49, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, - 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, - 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, - 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 128, 72, 79, 82, 73, 128, 72, 79, 82, 193, 72, 79, - 79, 82, 85, 128, 72, 79, 79, 78, 128, 72, 79, 77, 79, 84, 72, 69, 84, 73, - 67, 128, 72, 79, 77, 79, 84, 72, 69, 84, 73, 195, 72, 79, 76, 69, 128, - 72, 79, 76, 68, 73, 78, 199, 72, 79, 76, 65, 77, 128, 72, 79, 76, 65, - 205, 72, 79, 75, 65, 128, 72, 79, 73, 128, 72, 79, 69, 128, 72, 78, 85, - 84, 128, 72, 78, 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 79, 88, - 128, 72, 78, 79, 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, 128, 72, - 78, 73, 84, 128, 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, 72, 78, - 73, 69, 84, 128, 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, 72, 78, - 73, 128, 72, 78, 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, 128, 72, - 78, 65, 88, 128, 72, 78, 65, 84, 128, 72, 78, 65, 80, 128, 72, 78, 65, - 128, 72, 77, 89, 88, 128, 72, 77, 89, 82, 88, 128, 72, 77, 89, 82, 128, - 72, 77, 89, 80, 128, 72, 77, 89, 128, 72, 77, 85, 88, 128, 72, 77, 85, - 84, 128, 72, 77, 85, 82, 88, 128, 72, 77, 85, 82, 128, 72, 77, 85, 80, - 128, 72, 77, 85, 79, 88, 128, 72, 77, 85, 79, 80, 128, 72, 77, 85, 79, - 128, 72, 77, 85, 128, 72, 77, 79, 88, 128, 72, 77, 79, 84, 128, 72, 77, - 79, 80, 128, 72, 77, 79, 128, 72, 77, 73, 88, 128, 72, 77, 73, 84, 128, - 72, 77, 73, 80, 128, 72, 77, 73, 69, 88, 128, 72, 77, 73, 69, 80, 128, - 72, 77, 73, 69, 128, 72, 77, 73, 128, 72, 77, 69, 128, 72, 77, 65, 88, - 128, 72, 77, 65, 84, 128, 72, 77, 65, 80, 128, 72, 77, 65, 128, 72, 76, - 89, 88, 128, 72, 76, 89, 84, 128, 72, 76, 89, 82, 88, 128, 72, 76, 89, - 82, 128, 72, 76, 89, 80, 128, 72, 76, 89, 128, 72, 76, 85, 88, 128, 72, - 76, 85, 84, 128, 72, 76, 85, 82, 88, 128, 72, 76, 85, 82, 128, 72, 76, - 85, 80, 128, 72, 76, 85, 79, 88, 128, 72, 76, 85, 79, 80, 128, 72, 76, - 85, 79, 128, 72, 76, 85, 128, 72, 76, 79, 88, 128, 72, 76, 79, 80, 128, - 72, 76, 79, 128, 72, 76, 73, 88, 128, 72, 76, 73, 84, 128, 72, 76, 73, - 80, 128, 72, 76, 73, 69, 88, 128, 72, 76, 73, 69, 80, 128, 72, 76, 73, - 69, 128, 72, 76, 73, 128, 72, 76, 69, 88, 128, 72, 76, 69, 80, 128, 72, - 76, 69, 128, 72, 76, 65, 88, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, - 128, 72, 76, 65, 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 83, 84, - 79, 82, 73, 195, 72, 73, 82, 73, 81, 128, 72, 73, 71, 72, 45, 82, 69, 86, - 69, 82, 83, 69, 68, 45, 185, 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, - 83, 73, 79, 83, 128, 72, 73, 69, 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, - 73, 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, - 73, 69, 85, 78, 128, 72, 73, 69, 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, - 73, 69, 85, 200, 72, 73, 69, 128, 72, 73, 68, 73, 78, 199, 72, 73, 68, - 69, 84, 128, 72, 73, 68, 69, 128, 72, 72, 87, 65, 128, 72, 72, 85, 128, - 72, 72, 73, 128, 72, 72, 69, 69, 128, 72, 72, 69, 128, 72, 72, 65, 65, - 128, 72, 71, 128, 72, 69, 88, 73, 70, 79, 82, 205, 72, 69, 88, 65, 71, - 79, 78, 128, 72, 69, 82, 85, 84, 85, 128, 72, 69, 82, 85, 128, 72, 69, - 82, 77, 73, 84, 73, 65, 206, 72, 69, 82, 77, 73, 79, 78, 73, 65, 206, 72, - 69, 82, 77, 69, 83, 128, 72, 69, 82, 65, 69, 85, 205, 72, 69, 78, 71, - 128, 72, 69, 78, 199, 72, 69, 77, 80, 128, 72, 69, 76, 77, 69, 84, 128, - 72, 69, 76, 77, 69, 212, 72, 69, 76, 205, 72, 69, 75, 85, 84, 65, 65, 82, - 85, 128, 72, 69, 73, 83, 69, 73, 128, 72, 69, 65, 86, 89, 128, 72, 69, - 65, 86, 69, 78, 76, 217, 72, 69, 65, 86, 69, 78, 128, 72, 69, 65, 86, 69, - 206, 72, 69, 65, 82, 84, 128, 72, 69, 65, 82, 212, 72, 69, 65, 68, 83, - 84, 82, 79, 75, 69, 128, 72, 69, 65, 68, 83, 84, 79, 78, 197, 72, 69, 65, - 68, 73, 78, 71, 128, 72, 66, 65, 83, 65, 45, 69, 83, 65, 83, 193, 72, 66, - 65, 83, 193, 72, 65, 89, 65, 78, 78, 65, 128, 72, 65, 86, 69, 128, 72, - 65, 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 65, 84, 72, 73, 128, 72, - 65, 84, 69, 128, 72, 65, 84, 65, 198, 72, 65, 83, 69, 210, 72, 65, 83, - 65, 78, 84, 65, 128, 72, 65, 82, 80, 79, 79, 78, 128, 72, 65, 82, 80, 79, - 79, 206, 72, 65, 82, 77, 79, 78, 73, 67, 128, 72, 65, 82, 75, 76, 69, 65, - 206, 72, 65, 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 196, 72, 65, 78, - 85, 78, 79, 207, 72, 65, 78, 71, 90, 72, 79, 213, 72, 65, 78, 68, 83, - 128, 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 128, 72, 65, 78, - 45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 77, 69, - 210, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 76, - 65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, 72, 65, 73, 82, 128, 72, - 65, 71, 76, 65, 218, 72, 65, 71, 76, 128, 72, 65, 70, 85, 75, 72, 65, - 128, 72, 65, 70, 85, 75, 72, 128, 72, 65, 69, 71, 204, 72, 65, 69, 128, - 72, 65, 65, 82, 85, 128, 72, 65, 65, 77, 128, 72, 65, 193, 72, 65, 45, - 72, 65, 128, 72, 48, 48, 56, 128, 72, 48, 48, 55, 128, 72, 48, 48, 54, - 65, 128, 72, 48, 48, 54, 128, 72, 48, 48, 53, 128, 72, 48, 48, 52, 128, - 72, 48, 48, 51, 128, 72, 48, 48, 50, 128, 72, 48, 48, 49, 128, 72, 45, - 84, 89, 80, 197, 71, 89, 85, 128, 71, 89, 79, 78, 128, 71, 89, 79, 128, - 71, 89, 73, 128, 71, 89, 70, 213, 71, 89, 69, 69, 128, 71, 89, 65, 83, - 128, 71, 89, 65, 65, 128, 71, 89, 65, 128, 71, 89, 128, 71, 87, 85, 128, - 71, 87, 73, 128, 71, 87, 69, 69, 128, 71, 87, 69, 128, 71, 87, 65, 65, - 128, 71, 87, 65, 128, 71, 86, 128, 71, 85, 82, 85, 83, 72, 128, 71, 85, - 82, 85, 78, 128, 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 71, 85, 82, 55, - 128, 71, 85, 78, 85, 128, 71, 85, 78, 213, 71, 85, 77, 128, 71, 85, 205, - 71, 85, 76, 128, 71, 85, 199, 71, 85, 69, 72, 128, 71, 85, 69, 200, 71, - 85, 68, 128, 71, 85, 196, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, - 128, 71, 85, 65, 82, 65, 78, 201, 71, 85, 178, 71, 84, 69, 210, 71, 83, - 85, 77, 128, 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 85, 78, 68, 128, - 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, 65, 128, 71, 82, 69, 71, 79, - 82, 73, 65, 206, 71, 82, 69, 69, 206, 71, 82, 69, 65, 84, 78, 69, 83, 83, - 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 78, 128, 71, 82, 69, 65, - 84, 69, 82, 45, 84, 72, 65, 206, 71, 82, 69, 65, 84, 69, 210, 71, 82, 69, - 65, 212, 71, 82, 65, 86, 69, 89, 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, - 65, 67, 82, 79, 78, 128, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, - 71, 82, 65, 86, 69, 128, 71, 82, 65, 86, 197, 71, 82, 65, 84, 69, 82, - 128, 71, 82, 65, 83, 83, 128, 71, 82, 65, 83, 211, 71, 82, 65, 80, 72, - 69, 77, 197, 71, 82, 65, 77, 77, 193, 71, 82, 65, 73, 78, 128, 71, 82, - 65, 67, 69, 128, 71, 82, 65, 67, 197, 71, 80, 65, 128, 71, 79, 82, 84, - 72, 77, 73, 75, 79, 206, 71, 79, 82, 84, 128, 71, 79, 82, 71, 79, 84, 69, - 82, 73, 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, - 71, 79, 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, 65, 128, - 71, 79, 78, 71, 128, 71, 79, 76, 68, 128, 71, 79, 75, 128, 71, 79, 73, - 78, 199, 71, 79, 65, 76, 128, 71, 79, 65, 204, 71, 79, 65, 128, 71, 78, - 89, 73, 83, 128, 71, 78, 65, 86, 73, 89, 65, 78, 73, 128, 71, 76, 79, 84, - 84, 65, 204, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, 67, - 200, 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, 128, - 71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, 200, - 71, 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, 82, 51, - 128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 71, 73, 80, - 128, 71, 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, 128, 71, 73, 77, 69, - 204, 71, 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, 69, 84, 128, 71, 73, - 68, 73, 77, 128, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, + 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 55, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, + 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 50, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 70, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, + 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, + 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 66, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, + 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 57, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, + 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 55, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, + 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 53, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, + 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 51, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, + 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 49, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 70, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, + 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, + 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 66, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, + 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 57, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, + 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 55, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, + 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 53, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, + 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 51, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, + 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 49, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 70, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, + 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, + 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 66, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, + 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 57, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, + 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 55, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, + 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 53, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, + 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 51, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, + 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 49, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 70, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, + 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, + 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 66, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, + 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 57, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, + 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 55, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, + 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 53, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 78, 84, 73, 70, 73, 67, 65, + 84, 73, 79, 78, 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, 67, 72, 79, + 85, 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, 83, + 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, 67, + 45, 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, + 128, 73, 48, 49, 53, 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, + 48, 49, 50, 128, 73, 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, + 49, 48, 65, 128, 73, 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, + 48, 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, + 128, 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, + 73, 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, + 89, 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, + 69, 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, + 89, 65, 128, 73, 45, 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, 85, + 128, 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, 73, + 45, 65, 128, 72, 90, 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, 90, + 80, 128, 72, 90, 90, 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, + 84, 128, 72, 90, 71, 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, + 89, 80, 79, 68, 73, 65, 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, + 65, 84, 73, 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, + 72, 89, 80, 72, 69, 78, 128, 72, 89, 80, 72, 69, 206, 72, 88, 87, 71, + 128, 72, 88, 85, 79, 88, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, + 80, 128, 72, 88, 85, 79, 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, 128, + 72, 88, 79, 80, 128, 72, 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, 73, + 84, 128, 72, 88, 73, 80, 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, 69, + 84, 128, 72, 88, 73, 69, 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, 128, + 72, 88, 69, 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, 65, + 88, 128, 72, 88, 65, 84, 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, 72, + 87, 85, 128, 72, 87, 65, 73, 82, 128, 72, 86, 128, 72, 85, 82, 65, 78, + 128, 72, 85, 79, 84, 128, 72, 85, 78, 68, 82, 69, 68, 128, 72, 85, 78, + 68, 82, 69, 196, 72, 85, 78, 128, 72, 85, 77, 65, 78, 128, 72, 85, 77, + 65, 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, 72, 85, 66, + 50, 128, 72, 85, 66, 178, 72, 85, 66, 128, 72, 85, 65, 82, 65, 68, 68, + 79, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, 80, 65, + 128, 72, 80, 128, 72, 79, 85, 83, 197, 72, 79, 85, 82, 71, 76, 65, 83, + 83, 128, 72, 79, 85, 82, 71, 76, 65, 83, 211, 72, 79, 85, 82, 128, 72, + 79, 85, 210, 72, 79, 84, 69, 76, 128, 72, 79, 84, 65, 128, 72, 79, 83, + 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69, 128, 72, 79, 82, 83, 197, + 72, 79, 82, 78, 83, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 76, 217, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 54, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 53, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 52, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 51, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 50, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, + 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, + 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, + 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 52, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 51, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 50, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 49, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 48, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 54, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 53, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, + 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, + 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, + 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 48, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 54, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 53, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 52, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 51, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 50, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 49, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 128, 72, 79, + 82, 73, 128, 72, 79, 82, 193, 72, 79, 79, 82, 85, 128, 72, 79, 79, 80, + 128, 72, 79, 79, 78, 128, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, + 78, 69, 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, + 84, 72, 69, 84, 73, 195, 72, 79, 76, 69, 128, 72, 79, 76, 68, 73, 78, + 199, 72, 79, 76, 65, 77, 128, 72, 79, 76, 65, 205, 72, 79, 75, 65, 128, + 72, 79, 73, 128, 72, 79, 67, 72, 79, 128, 72, 78, 85, 84, 128, 72, 78, + 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 79, 88, 128, 72, 78, 79, + 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, 128, 72, 78, 73, 84, 128, + 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, 72, 78, 73, 69, 84, 128, + 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, 72, 78, 73, 128, 72, 78, + 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, 128, 72, 78, 65, 88, 128, + 72, 78, 65, 84, 128, 72, 78, 65, 80, 128, 72, 78, 65, 128, 72, 77, 89, + 88, 128, 72, 77, 89, 82, 88, 128, 72, 77, 89, 82, 128, 72, 77, 89, 80, + 128, 72, 77, 89, 128, 72, 77, 85, 88, 128, 72, 77, 85, 84, 128, 72, 77, + 85, 82, 88, 128, 72, 77, 85, 82, 128, 72, 77, 85, 80, 128, 72, 77, 85, + 79, 88, 128, 72, 77, 85, 79, 80, 128, 72, 77, 85, 79, 128, 72, 77, 85, + 128, 72, 77, 79, 88, 128, 72, 77, 79, 84, 128, 72, 77, 79, 80, 128, 72, + 77, 79, 128, 72, 77, 73, 88, 128, 72, 77, 73, 84, 128, 72, 77, 73, 80, + 128, 72, 77, 73, 69, 88, 128, 72, 77, 73, 69, 80, 128, 72, 77, 73, 69, + 128, 72, 77, 73, 128, 72, 77, 69, 128, 72, 77, 65, 88, 128, 72, 77, 65, + 84, 128, 72, 77, 65, 80, 128, 72, 77, 65, 128, 72, 76, 89, 88, 128, 72, + 76, 89, 84, 128, 72, 76, 89, 82, 88, 128, 72, 76, 89, 82, 128, 72, 76, + 89, 80, 128, 72, 76, 89, 128, 72, 76, 85, 88, 128, 72, 76, 85, 84, 128, + 72, 76, 85, 82, 88, 128, 72, 76, 85, 82, 128, 72, 76, 85, 80, 128, 72, + 76, 85, 79, 88, 128, 72, 76, 85, 79, 80, 128, 72, 76, 85, 79, 128, 72, + 76, 85, 128, 72, 76, 79, 88, 128, 72, 76, 79, 80, 128, 72, 76, 79, 128, + 72, 76, 73, 88, 128, 72, 76, 73, 84, 128, 72, 76, 73, 80, 128, 72, 76, + 73, 69, 88, 128, 72, 76, 73, 69, 80, 128, 72, 76, 73, 69, 128, 72, 76, + 73, 128, 72, 76, 69, 88, 128, 72, 76, 69, 80, 128, 72, 76, 69, 128, 72, + 76, 65, 88, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, 128, 72, 76, 65, + 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 83, 84, 79, 82, 73, 195, + 72, 73, 82, 73, 81, 128, 72, 73, 71, 72, 45, 83, 80, 69, 69, 196, 72, 73, + 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 72, 73, 71, 72, 45, + 72, 69, 69, 76, 69, 196, 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83, + 73, 79, 83, 128, 72, 73, 69, 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, 73, + 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, 73, + 69, 85, 78, 128, 72, 73, 69, 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, 73, + 69, 85, 200, 72, 73, 69, 128, 72, 73, 68, 73, 78, 199, 72, 73, 68, 69, + 84, 128, 72, 73, 68, 69, 128, 72, 73, 66, 73, 83, 67, 85, 83, 128, 72, + 72, 87, 65, 128, 72, 72, 85, 128, 72, 72, 73, 128, 72, 72, 69, 69, 128, + 72, 72, 69, 128, 72, 72, 65, 65, 128, 72, 71, 128, 72, 69, 88, 73, 70, + 79, 82, 205, 72, 69, 88, 65, 71, 82, 65, 205, 72, 69, 88, 65, 71, 79, 78, + 128, 72, 69, 82, 85, 84, 85, 128, 72, 69, 82, 85, 128, 72, 69, 82, 77, + 73, 84, 73, 65, 206, 72, 69, 82, 77, 73, 79, 78, 73, 65, 206, 72, 69, 82, + 77, 69, 83, 128, 72, 69, 82, 66, 128, 72, 69, 82, 65, 69, 85, 205, 72, + 69, 78, 71, 128, 72, 69, 78, 199, 72, 69, 77, 80, 128, 72, 69, 76, 77, + 69, 84, 128, 72, 69, 76, 77, 69, 212, 72, 69, 76, 205, 72, 69, 76, 73, + 67, 79, 80, 84, 69, 82, 128, 72, 69, 75, 85, 84, 65, 65, 82, 85, 128, 72, + 69, 73, 83, 69, 73, 128, 72, 69, 65, 86, 89, 128, 72, 69, 65, 86, 69, 78, + 76, 217, 72, 69, 65, 86, 69, 78, 128, 72, 69, 65, 86, 69, 206, 72, 69, + 65, 82, 84, 83, 128, 72, 69, 65, 82, 84, 45, 83, 72, 65, 80, 69, 196, 72, + 69, 65, 82, 84, 128, 72, 69, 65, 82, 212, 72, 69, 65, 82, 45, 78, 79, 45, + 69, 86, 73, 204, 72, 69, 65, 68, 83, 84, 82, 79, 75, 69, 128, 72, 69, 65, + 68, 83, 84, 79, 78, 197, 72, 69, 65, 68, 80, 72, 79, 78, 69, 128, 72, 69, + 65, 68, 73, 78, 71, 128, 72, 66, 65, 83, 65, 45, 69, 83, 65, 83, 193, 72, + 66, 65, 83, 193, 72, 65, 89, 65, 78, 78, 65, 128, 72, 65, 86, 69, 128, + 72, 65, 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 65, 84, 72, 73, 128, + 72, 65, 84, 69, 128, 72, 65, 84, 67, 72, 73, 78, 199, 72, 65, 84, 65, + 198, 72, 65, 83, 69, 210, 72, 65, 83, 65, 78, 84, 65, 128, 72, 65, 82, + 80, 79, 79, 78, 128, 72, 65, 82, 80, 79, 79, 206, 72, 65, 82, 77, 79, 78, + 73, 67, 128, 72, 65, 82, 75, 76, 69, 65, 206, 72, 65, 82, 68, 78, 69, 83, + 83, 128, 72, 65, 82, 196, 72, 65, 80, 80, 217, 72, 65, 78, 85, 78, 79, + 207, 72, 65, 78, 71, 90, 72, 79, 213, 72, 65, 78, 68, 83, 128, 72, 65, + 78, 68, 211, 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, + 128, 72, 65, 78, 68, 66, 65, 71, 128, 72, 65, 78, 68, 128, 72, 65, 78, + 45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 83, 84, 69, + 210, 72, 65, 77, 77, 69, 82, 128, 72, 65, 77, 77, 69, 210, 72, 65, 77, + 66, 85, 82, 71, 69, 82, 128, 72, 65, 76, 81, 65, 128, 72, 65, 76, 79, + 128, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 76, + 65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, 72, 65, 73, 82, 67, 85, 84, + 128, 72, 65, 73, 82, 128, 72, 65, 71, 76, 65, 218, 72, 65, 71, 76, 128, + 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 70, 85, 75, 72, 128, 72, 65, 69, + 71, 204, 72, 65, 65, 82, 85, 128, 72, 65, 65, 77, 128, 72, 65, 193, 72, + 65, 45, 72, 65, 128, 72, 48, 48, 56, 128, 72, 48, 48, 55, 128, 72, 48, + 48, 54, 65, 128, 72, 48, 48, 54, 128, 72, 48, 48, 53, 128, 72, 48, 48, + 52, 128, 72, 48, 48, 51, 128, 72, 48, 48, 50, 128, 72, 48, 48, 49, 128, + 72, 45, 84, 89, 80, 197, 71, 89, 85, 128, 71, 89, 79, 78, 128, 71, 89, + 79, 128, 71, 89, 73, 128, 71, 89, 70, 213, 71, 89, 69, 69, 128, 71, 89, + 65, 83, 128, 71, 89, 65, 65, 128, 71, 89, 65, 128, 71, 89, 128, 71, 87, + 85, 128, 71, 87, 73, 128, 71, 87, 69, 69, 128, 71, 87, 69, 128, 71, 87, + 65, 65, 128, 71, 87, 65, 128, 71, 86, 128, 71, 85, 82, 85, 83, 72, 128, + 71, 85, 82, 85, 78, 128, 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 71, 85, + 82, 55, 128, 71, 85, 78, 85, 128, 71, 85, 78, 213, 71, 85, 205, 71, 85, + 76, 128, 71, 85, 73, 84, 65, 82, 128, 71, 85, 199, 71, 85, 69, 72, 128, + 71, 85, 69, 200, 71, 85, 68, 128, 71, 85, 196, 71, 85, 65, 82, 68, 83, + 77, 65, 78, 128, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, 71, 85, + 65, 82, 65, 78, 201, 71, 85, 193, 71, 85, 178, 71, 84, 69, 210, 71, 83, + 85, 77, 128, 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 87, 73, 78, 199, + 71, 82, 79, 85, 78, 68, 128, 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, + 65, 128, 71, 82, 73, 78, 78, 73, 78, 199, 71, 82, 69, 71, 79, 82, 73, 65, + 206, 71, 82, 69, 69, 206, 71, 82, 69, 65, 84, 78, 69, 83, 83, 128, 71, + 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 78, 128, 71, 82, 69, 65, 84, 69, + 82, 45, 84, 72, 65, 206, 71, 82, 69, 65, 84, 69, 210, 71, 82, 69, 65, + 212, 71, 82, 65, 86, 69, 89, 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, 65, + 67, 82, 79, 78, 128, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, 71, + 82, 65, 86, 69, 128, 71, 82, 65, 86, 197, 71, 82, 65, 84, 69, 82, 128, + 71, 82, 65, 83, 83, 128, 71, 82, 65, 83, 211, 71, 82, 65, 80, 72, 69, 77, + 197, 71, 82, 65, 80, 69, 83, 128, 71, 82, 65, 77, 77, 193, 71, 82, 65, + 73, 78, 128, 71, 82, 65, 68, 85, 65, 84, 73, 79, 206, 71, 82, 65, 67, 69, + 128, 71, 82, 65, 67, 197, 71, 80, 65, 128, 71, 79, 82, 84, 72, 77, 73, + 75, 79, 206, 71, 79, 82, 84, 128, 71, 79, 82, 71, 79, 84, 69, 82, 73, + 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, 71, 79, + 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, 65, 128, 71, 79, + 79, 196, 71, 79, 78, 71, 128, 71, 79, 76, 68, 128, 71, 79, 75, 128, 71, + 79, 73, 78, 199, 71, 79, 66, 76, 73, 78, 128, 71, 79, 65, 76, 128, 71, + 79, 65, 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, 128, 71, 78, 65, 86, + 73, 89, 65, 78, 73, 128, 71, 76, 79, 87, 73, 78, 199, 71, 76, 79, 84, 84, + 65, 204, 71, 76, 79, 66, 197, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, + 76, 69, 73, 67, 200, 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, + 71, 74, 69, 128, 71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, + 71, 73, 83, 200, 71, 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, + 128, 71, 73, 82, 76, 128, 71, 73, 82, 51, 128, 71, 73, 82, 179, 71, 73, + 82, 50, 128, 71, 73, 82, 178, 71, 73, 80, 128, 71, 73, 78, 73, 73, 128, + 71, 73, 77, 69, 76, 128, 71, 73, 77, 69, 204, 71, 73, 77, 128, 71, 73, + 71, 65, 128, 71, 73, 69, 84, 128, 71, 73, 68, 73, 77, 128, 71, 73, 66, + 66, 79, 85, 211, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, 72, 90, 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72, 85, 78, 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83, 84, 128, 71, 72, 79, 128, 71, 72, 73, 128, 71, 72, 72, 65, 128, 71, 72, - 69, 69, 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, 78, 128, 71, - 72, 65, 78, 128, 71, 72, 65, 77, 65, 76, 128, 71, 72, 65, 73, 78, 85, - 128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, 71, 72, 65, 68, 128, - 71, 72, 65, 128, 71, 71, 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, - 87, 69, 128, 71, 71, 87, 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, - 88, 128, 71, 71, 85, 84, 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, - 128, 71, 71, 85, 80, 128, 71, 71, 85, 79, 88, 128, 71, 71, 85, 79, 84, - 128, 71, 71, 85, 79, 80, 128, 71, 71, 85, 79, 128, 71, 71, 79, 88, 128, - 71, 71, 79, 84, 128, 71, 71, 79, 80, 128, 71, 71, 73, 88, 128, 71, 71, - 73, 84, 128, 71, 71, 73, 69, 88, 128, 71, 71, 73, 69, 80, 128, 71, 71, - 73, 69, 128, 71, 71, 69, 88, 128, 71, 71, 69, 84, 128, 71, 71, 69, 80, - 128, 71, 71, 65, 88, 128, 71, 71, 65, 84, 128, 71, 71, 65, 80, 128, 71, - 71, 65, 65, 128, 71, 69, 84, 193, 71, 69, 83, 72, 85, 128, 71, 69, 83, - 72, 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, 206, 71, 69, 83, 72, 50, - 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, 71, 69, 82, 77, 65, 206, - 71, 69, 82, 69, 83, 72, 128, 71, 69, 82, 69, 83, 200, 71, 69, 79, 77, 69, - 84, 82, 73, 67, 65, 76, 76, 217, 71, 69, 79, 77, 69, 84, 82, 73, 195, 71, - 69, 78, 84, 76, 197, 71, 69, 78, 73, 84, 73, 86, 69, 128, 71, 69, 78, 73, - 75, 201, 71, 69, 78, 69, 82, 73, 195, 71, 69, 77, 73, 78, 73, 128, 71, - 69, 77, 73, 78, 65, 84, 73, 79, 206, 71, 69, 68, 79, 76, 65, 128, 71, 69, + 69, 85, 88, 128, 71, 72, 69, 85, 78, 128, 71, 72, 69, 85, 71, 72, 69, 85, + 65, 69, 77, 128, 71, 72, 69, 85, 71, 72, 69, 78, 128, 71, 72, 69, 85, 65, + 69, 82, 65, 69, 128, 71, 72, 69, 85, 65, 69, 71, 72, 69, 85, 65, 69, 128, + 71, 72, 69, 84, 128, 71, 72, 69, 69, 128, 71, 72, 69, 128, 71, 72, 197, + 71, 72, 65, 89, 78, 128, 71, 72, 65, 82, 65, 69, 128, 71, 72, 65, 80, + 128, 71, 72, 65, 78, 128, 71, 72, 65, 77, 65, 76, 128, 71, 72, 65, 73, + 78, 85, 128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, 71, 72, 65, + 68, 128, 71, 72, 65, 65, 77, 65, 69, 128, 71, 72, 65, 65, 128, 71, 72, + 65, 128, 71, 71, 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, 87, 69, + 128, 71, 71, 87, 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, 88, 128, + 71, 71, 85, 84, 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, 128, 71, + 71, 85, 79, 88, 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 80, 128, + 71, 71, 85, 79, 128, 71, 71, 79, 88, 128, 71, 71, 79, 84, 128, 71, 71, + 79, 80, 128, 71, 71, 73, 88, 128, 71, 71, 73, 84, 128, 71, 71, 73, 69, + 88, 128, 71, 71, 73, 69, 80, 128, 71, 71, 73, 69, 128, 71, 71, 69, 88, + 128, 71, 71, 69, 84, 128, 71, 71, 69, 80, 128, 71, 71, 65, 88, 128, 71, + 71, 65, 84, 128, 71, 71, 65, 65, 128, 71, 69, 84, 193, 71, 69, 83, 84, + 85, 82, 69, 128, 71, 69, 83, 72, 85, 128, 71, 69, 83, 72, 84, 73, 78, + 128, 71, 69, 83, 72, 84, 73, 206, 71, 69, 83, 72, 50, 128, 71, 69, 82, + 83, 72, 65, 89, 73, 77, 128, 71, 69, 82, 77, 65, 206, 71, 69, 82, 69, 83, + 72, 128, 71, 69, 82, 69, 83, 200, 71, 69, 79, 77, 69, 84, 82, 73, 67, 65, + 76, 76, 217, 71, 69, 79, 77, 69, 84, 82, 73, 195, 71, 69, 78, 84, 76, + 197, 71, 69, 78, 73, 84, 73, 86, 69, 128, 71, 69, 78, 73, 75, 201, 71, + 69, 78, 69, 82, 73, 195, 71, 69, 77, 73, 78, 73, 128, 71, 69, 77, 73, 78, + 65, 84, 73, 79, 206, 71, 69, 205, 71, 69, 68, 79, 76, 65, 128, 71, 69, 68, 69, 128, 71, 69, 66, 207, 71, 69, 66, 193, 71, 69, 65, 82, 128, 71, 69, 65, 210, 71, 68, 65, 78, 128, 71, 67, 73, 71, 128, 71, 67, 65, 206, - 71, 66, 79, 78, 128, 71, 66, 69, 78, 128, 71, 66, 65, 75, 85, 82, 85, 78, + 71, 66, 79, 78, 128, 71, 66, 73, 69, 197, 71, 66, 69, 85, 88, 128, 71, + 66, 69, 84, 128, 71, 66, 65, 89, 73, 128, 71, 66, 65, 75, 85, 82, 85, 78, 69, 78, 128, 71, 66, 128, 71, 65, 89, 65, 78, 85, 75, 73, 84, 84, 65, 128, 71, 65, 89, 65, 78, 78, 65, 128, 71, 65, 89, 128, 71, 65, 85, 78, 84, 76, 69, 84, 128, 71, 65, 84, 72, 69, 82, 73, 78, 71, 128, 71, 65, 84, 72, 69, 82, 73, 78, 199, 71, 65, 84, 69, 128, 71, 65, 83, 72, 65, 78, 128, 71, 65, 82, 83, 72, 85, 78, 73, 128, 71, 65, 82, 79, 78, 128, 71, - 65, 82, 77, 69, 78, 84, 128, 71, 65, 82, 51, 128, 71, 65, 80, 80, 69, - 196, 71, 65, 208, 71, 65, 78, 77, 65, 128, 71, 65, 78, 71, 73, 65, 128, - 71, 65, 78, 68, 193, 71, 65, 78, 50, 128, 71, 65, 78, 178, 71, 65, 77, - 77, 65, 128, 71, 65, 77, 76, 65, 128, 71, 65, 77, 76, 128, 71, 65, 77, - 65, 78, 128, 71, 65, 77, 65, 76, 128, 71, 65, 77, 65, 204, 71, 65, 77, - 128, 71, 65, 71, 128, 71, 65, 70, 128, 71, 65, 198, 71, 65, 69, 84, 84, - 65, 45, 80, 73, 76, 76, 65, 128, 71, 65, 68, 79, 76, 128, 71, 65, 68, - 128, 71, 65, 196, 71, 65, 66, 65, 128, 71, 65, 66, 193, 71, 65, 65, 70, - 85, 128, 71, 65, 178, 71, 48, 53, 52, 128, 71, 48, 53, 51, 128, 71, 48, - 53, 50, 128, 71, 48, 53, 49, 128, 71, 48, 53, 48, 128, 71, 48, 52, 57, - 128, 71, 48, 52, 56, 128, 71, 48, 52, 55, 128, 71, 48, 52, 54, 128, 71, - 48, 52, 53, 65, 128, 71, 48, 52, 53, 128, 71, 48, 52, 52, 128, 71, 48, - 52, 51, 65, 128, 71, 48, 52, 51, 128, 71, 48, 52, 50, 128, 71, 48, 52, - 49, 128, 71, 48, 52, 48, 128, 71, 48, 51, 57, 128, 71, 48, 51, 56, 128, - 71, 48, 51, 55, 65, 128, 71, 48, 51, 55, 128, 71, 48, 51, 54, 65, 128, - 71, 48, 51, 54, 128, 71, 48, 51, 53, 128, 71, 48, 51, 52, 128, 71, 48, - 51, 51, 128, 71, 48, 51, 50, 128, 71, 48, 51, 49, 128, 71, 48, 51, 48, - 128, 71, 48, 50, 57, 128, 71, 48, 50, 56, 128, 71, 48, 50, 55, 128, 71, - 48, 50, 54, 65, 128, 71, 48, 50, 54, 128, 71, 48, 50, 53, 128, 71, 48, - 50, 52, 128, 71, 48, 50, 51, 128, 71, 48, 50, 50, 128, 71, 48, 50, 49, - 128, 71, 48, 50, 48, 65, 128, 71, 48, 50, 48, 128, 71, 48, 49, 57, 128, - 71, 48, 49, 56, 128, 71, 48, 49, 55, 128, 71, 48, 49, 54, 128, 71, 48, - 49, 53, 128, 71, 48, 49, 52, 128, 71, 48, 49, 51, 128, 71, 48, 49, 50, - 128, 71, 48, 49, 49, 65, 128, 71, 48, 49, 49, 128, 71, 48, 49, 48, 128, - 71, 48, 48, 57, 128, 71, 48, 48, 56, 128, 71, 48, 48, 55, 66, 128, 71, - 48, 48, 55, 65, 128, 71, 48, 48, 55, 128, 71, 48, 48, 54, 65, 128, 71, - 48, 48, 54, 128, 71, 48, 48, 53, 128, 71, 48, 48, 52, 128, 71, 48, 48, - 51, 128, 71, 48, 48, 50, 128, 71, 48, 48, 49, 128, 70, 89, 88, 128, 70, - 89, 84, 128, 70, 89, 80, 128, 70, 89, 65, 128, 70, 89, 128, 70, 87, 73, - 128, 70, 87, 69, 69, 128, 70, 87, 69, 128, 70, 87, 65, 65, 128, 70, 87, - 65, 128, 70, 85, 88, 128, 70, 85, 84, 128, 70, 85, 83, 69, 128, 70, 85, - 83, 193, 70, 85, 82, 88, 128, 70, 85, 82, 128, 70, 85, 80, 128, 70, 85, - 78, 69, 82, 65, 204, 70, 85, 78, 67, 84, 73, 79, 78, 128, 70, 85, 76, 76, - 78, 69, 83, 83, 128, 70, 85, 76, 204, 70, 85, 69, 204, 70, 84, 72, 79, - 82, 193, 70, 82, 79, 87, 78, 73, 78, 199, 70, 82, 79, 87, 78, 128, 70, - 82, 79, 78, 84, 45, 84, 73, 76, 84, 69, 196, 70, 82, 79, 205, 70, 82, 79, - 71, 128, 70, 82, 73, 84, 85, 128, 70, 82, 73, 67, 65, 84, 73, 86, 69, - 128, 70, 82, 69, 84, 66, 79, 65, 82, 68, 128, 70, 82, 69, 78, 67, 200, - 70, 82, 69, 197, 70, 82, 65, 78, 195, 70, 82, 65, 77, 69, 128, 70, 82, - 65, 71, 82, 65, 78, 84, 128, 70, 82, 65, 71, 77, 69, 78, 84, 128, 70, 82, - 65, 67, 84, 73, 79, 206, 70, 79, 88, 128, 70, 79, 85, 82, 84, 69, 69, 78, - 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, 85, 82, 45, 83, 84, 82, 73, - 78, 199, 70, 79, 85, 82, 45, 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, 45, - 76, 73, 78, 197, 70, 79, 85, 210, 70, 79, 85, 78, 84, 65, 73, 78, 128, - 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 84, 89, 128, 70, 79, - 82, 84, 217, 70, 79, 82, 84, 69, 128, 70, 79, 82, 77, 211, 70, 79, 82, - 77, 65, 84, 84, 73, 78, 71, 128, 70, 79, 82, 75, 69, 196, 70, 79, 82, 67, - 69, 83, 128, 70, 79, 82, 67, 69, 128, 70, 79, 80, 128, 70, 79, 79, 84, - 83, 84, 79, 79, 76, 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, 84, - 128, 70, 79, 79, 128, 70, 79, 78, 71, 77, 65, 78, 128, 70, 79, 77, 128, - 70, 79, 76, 76, 89, 128, 70, 79, 76, 76, 79, 87, 73, 78, 71, 128, 70, 79, - 128, 70, 77, 128, 70, 76, 89, 128, 70, 76, 85, 84, 69, 128, 70, 76, 79, - 87, 69, 82, 128, 70, 76, 79, 87, 69, 210, 70, 76, 79, 85, 82, 73, 83, 72, - 128, 70, 76, 79, 82, 69, 84, 84, 69, 128, 70, 76, 79, 82, 65, 204, 70, - 76, 79, 79, 82, 128, 70, 76, 73, 80, 128, 70, 76, 73, 71, 72, 84, 128, - 70, 76, 69, 88, 85, 83, 128, 70, 76, 69, 85, 82, 45, 68, 69, 45, 76, 73, - 83, 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, 84, 78, 69, 83, - 83, 128, 70, 76, 65, 84, 128, 70, 76, 65, 212, 70, 76, 65, 71, 45, 53, - 128, 70, 76, 65, 71, 45, 52, 128, 70, 76, 65, 71, 45, 51, 128, 70, 76, - 65, 71, 45, 50, 128, 70, 76, 65, 71, 45, 49, 128, 70, 76, 65, 71, 128, - 70, 76, 65, 199, 70, 76, 65, 128, 70, 76, 128, 70, 73, 88, 69, 68, 45, - 70, 79, 82, 205, 70, 73, 88, 128, 70, 73, 86, 69, 45, 76, 73, 78, 197, - 70, 73, 86, 197, 70, 73, 84, 65, 128, 70, 73, 84, 128, 70, 73, 83, 72, - 72, 79, 79, 75, 128, 70, 73, 83, 72, 72, 79, 79, 203, 70, 73, 83, 72, 69, - 89, 69, 128, 70, 73, 83, 72, 128, 70, 73, 83, 200, 70, 73, 82, 83, 212, - 70, 73, 82, 69, 128, 70, 73, 80, 128, 70, 73, 78, 73, 84, 197, 70, 73, - 78, 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, 69, 82, 69, 196, - 70, 73, 78, 65, 78, 67, 73, 65, 76, 128, 70, 73, 76, 76, 69, 82, 128, 70, - 73, 76, 76, 69, 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, 70, 73, 76, - 197, 70, 73, 73, 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, 73, 71, - 85, 82, 69, 45, 50, 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, - 85, 82, 197, 70, 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, 70, 73, - 70, 84, 217, 70, 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, 128, 70, - 73, 70, 84, 69, 69, 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, 73, 69, 76, - 68, 128, 70, 72, 84, 79, 82, 193, 70, 70, 76, 128, 70, 70, 73, 128, 70, - 69, 83, 84, 73, 86, 65, 76, 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 77, + 65, 82, 77, 69, 78, 84, 128, 71, 65, 82, 68, 69, 78, 128, 71, 65, 82, 51, + 128, 71, 65, 80, 80, 69, 196, 71, 65, 208, 71, 65, 78, 77, 65, 128, 71, + 65, 78, 71, 73, 65, 128, 71, 65, 78, 68, 193, 71, 65, 78, 50, 128, 71, + 65, 78, 178, 71, 65, 77, 77, 65, 128, 71, 65, 77, 76, 65, 128, 71, 65, + 77, 76, 128, 71, 65, 77, 69, 128, 71, 65, 77, 197, 71, 65, 77, 65, 78, + 128, 71, 65, 77, 65, 76, 128, 71, 65, 77, 65, 204, 71, 65, 71, 128, 71, + 65, 70, 128, 71, 65, 198, 71, 65, 69, 84, 84, 65, 45, 80, 73, 76, 76, 65, + 128, 71, 65, 68, 79, 76, 128, 71, 65, 68, 128, 71, 65, 196, 71, 65, 66, + 65, 128, 71, 65, 66, 193, 71, 65, 65, 70, 85, 128, 71, 65, 178, 71, 48, + 53, 52, 128, 71, 48, 53, 51, 128, 71, 48, 53, 50, 128, 71, 48, 53, 49, + 128, 71, 48, 53, 48, 128, 71, 48, 52, 57, 128, 71, 48, 52, 56, 128, 71, + 48, 52, 55, 128, 71, 48, 52, 54, 128, 71, 48, 52, 53, 65, 128, 71, 48, + 52, 53, 128, 71, 48, 52, 52, 128, 71, 48, 52, 51, 65, 128, 71, 48, 52, + 51, 128, 71, 48, 52, 50, 128, 71, 48, 52, 49, 128, 71, 48, 52, 48, 128, + 71, 48, 51, 57, 128, 71, 48, 51, 56, 128, 71, 48, 51, 55, 65, 128, 71, + 48, 51, 55, 128, 71, 48, 51, 54, 65, 128, 71, 48, 51, 54, 128, 71, 48, + 51, 53, 128, 71, 48, 51, 52, 128, 71, 48, 51, 51, 128, 71, 48, 51, 50, + 128, 71, 48, 51, 49, 128, 71, 48, 51, 48, 128, 71, 48, 50, 57, 128, 71, + 48, 50, 56, 128, 71, 48, 50, 55, 128, 71, 48, 50, 54, 65, 128, 71, 48, + 50, 54, 128, 71, 48, 50, 53, 128, 71, 48, 50, 52, 128, 71, 48, 50, 51, + 128, 71, 48, 50, 50, 128, 71, 48, 50, 49, 128, 71, 48, 50, 48, 65, 128, + 71, 48, 50, 48, 128, 71, 48, 49, 57, 128, 71, 48, 49, 56, 128, 71, 48, + 49, 55, 128, 71, 48, 49, 54, 128, 71, 48, 49, 53, 128, 71, 48, 49, 52, + 128, 71, 48, 49, 51, 128, 71, 48, 49, 50, 128, 71, 48, 49, 49, 65, 128, + 71, 48, 49, 49, 128, 71, 48, 49, 48, 128, 71, 48, 48, 57, 128, 71, 48, + 48, 56, 128, 71, 48, 48, 55, 66, 128, 71, 48, 48, 55, 65, 128, 71, 48, + 48, 55, 128, 71, 48, 48, 54, 65, 128, 71, 48, 48, 54, 128, 71, 48, 48, + 53, 128, 71, 48, 48, 52, 128, 71, 48, 48, 51, 128, 71, 48, 48, 50, 128, + 71, 48, 48, 49, 128, 70, 89, 88, 128, 70, 89, 84, 128, 70, 89, 80, 128, + 70, 89, 65, 128, 70, 87, 73, 128, 70, 87, 69, 69, 128, 70, 87, 69, 128, + 70, 87, 65, 65, 128, 70, 87, 65, 128, 70, 85, 88, 128, 70, 85, 84, 128, + 70, 85, 83, 69, 128, 70, 85, 83, 193, 70, 85, 82, 88, 128, 70, 85, 80, + 128, 70, 85, 78, 69, 82, 65, 204, 70, 85, 78, 67, 84, 73, 79, 78, 128, + 70, 85, 76, 76, 78, 69, 83, 83, 128, 70, 85, 76, 204, 70, 85, 74, 73, + 128, 70, 85, 69, 84, 128, 70, 85, 69, 204, 70, 85, 69, 128, 70, 84, 72, + 79, 82, 193, 70, 82, 79, 87, 78, 73, 78, 71, 128, 70, 82, 79, 87, 78, 73, + 78, 199, 70, 82, 79, 87, 78, 128, 70, 82, 79, 78, 84, 45, 84, 73, 76, 84, + 69, 196, 70, 82, 79, 78, 84, 45, 70, 65, 67, 73, 78, 199, 70, 82, 79, + 205, 70, 82, 79, 71, 128, 70, 82, 79, 199, 70, 82, 73, 84, 85, 128, 70, + 82, 73, 69, 83, 128, 70, 82, 73, 69, 196, 70, 82, 73, 67, 65, 84, 73, 86, + 69, 128, 70, 82, 69, 84, 66, 79, 65, 82, 68, 128, 70, 82, 69, 78, 67, + 200, 70, 82, 69, 69, 128, 70, 82, 69, 197, 70, 82, 65, 78, 195, 70, 82, + 65, 77, 69, 128, 70, 82, 65, 71, 82, 65, 78, 84, 128, 70, 82, 65, 71, 77, + 69, 78, 84, 128, 70, 82, 65, 67, 84, 73, 79, 206, 70, 79, 88, 128, 70, + 79, 85, 82, 84, 69, 69, 78, 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, + 85, 82, 45, 84, 72, 73, 82, 84, 89, 128, 70, 79, 85, 82, 45, 83, 84, 82, + 73, 78, 199, 70, 79, 85, 82, 45, 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, + 45, 76, 73, 78, 197, 70, 79, 85, 210, 70, 79, 85, 78, 84, 65, 73, 78, + 128, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 84, 89, 128, + 70, 79, 82, 84, 217, 70, 79, 82, 84, 69, 128, 70, 79, 82, 77, 211, 70, + 79, 82, 77, 65, 84, 84, 73, 78, 71, 128, 70, 79, 82, 75, 69, 196, 70, 79, + 82, 67, 69, 83, 128, 70, 79, 82, 67, 69, 128, 70, 79, 80, 128, 70, 79, + 79, 84, 83, 84, 79, 79, 76, 128, 70, 79, 79, 84, 80, 82, 73, 78, 84, 83, + 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, 84, 66, 65, 76, 76, + 128, 70, 79, 79, 84, 128, 70, 79, 79, 68, 128, 70, 79, 79, 128, 70, 79, + 78, 71, 77, 65, 78, 128, 70, 79, 77, 128, 70, 79, 76, 76, 89, 128, 70, + 79, 76, 76, 79, 87, 73, 78, 71, 128, 70, 79, 76, 68, 69, 82, 128, 70, 79, + 76, 68, 69, 196, 70, 79, 71, 71, 89, 128, 70, 77, 128, 70, 76, 89, 128, + 70, 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, 84, 69, 128, 70, 76, + 85, 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, 70, 76, 79, 87, 69, + 210, 70, 76, 79, 85, 82, 73, 83, 72, 128, 70, 76, 79, 82, 69, 84, 84, 69, + 128, 70, 76, 79, 82, 65, 204, 70, 76, 79, 80, 80, 217, 70, 76, 79, 79, + 82, 128, 70, 76, 73, 80, 128, 70, 76, 73, 71, 72, 84, 128, 70, 76, 69, + 88, 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, 76, 69, 85, 82, 45, 68, 69, + 45, 76, 73, 83, 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, 84, + 78, 69, 83, 83, 128, 70, 76, 65, 84, 128, 70, 76, 65, 212, 70, 76, 65, + 71, 83, 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, 65, 71, 45, 52, 128, + 70, 76, 65, 71, 45, 51, 128, 70, 76, 65, 71, 45, 50, 128, 70, 76, 65, 71, + 45, 49, 128, 70, 76, 65, 71, 128, 70, 76, 65, 199, 70, 76, 65, 128, 70, + 76, 128, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 70, 73, 88, 128, 70, + 73, 86, 69, 45, 84, 72, 73, 82, 84, 89, 128, 70, 73, 86, 69, 45, 76, 73, + 78, 197, 70, 73, 86, 197, 70, 73, 84, 65, 128, 70, 73, 84, 128, 70, 73, + 83, 84, 69, 196, 70, 73, 83, 84, 128, 70, 73, 83, 72, 73, 78, 199, 70, + 73, 83, 72, 72, 79, 79, 75, 128, 70, 73, 83, 72, 72, 79, 79, 203, 70, 73, + 83, 72, 69, 89, 69, 128, 70, 73, 83, 72, 128, 70, 73, 83, 200, 70, 73, + 82, 83, 212, 70, 73, 82, 73, 128, 70, 73, 82, 69, 87, 79, 82, 75, 83, + 128, 70, 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, 69, 128, 70, 73, 82, + 197, 70, 73, 80, 128, 70, 73, 78, 73, 84, 197, 70, 73, 78, 71, 69, 82, + 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, 69, 82, 69, 196, 70, 73, 78, 65, + 78, 67, 73, 65, 76, 128, 70, 73, 76, 76, 69, 82, 128, 70, 73, 76, 76, 69, + 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, 70, 73, 76, 197, 70, 73, 73, + 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, 73, 71, 85, 82, 69, 45, 50, + 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, 85, 82, 197, 70, + 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, 70, 73, 70, 84, 217, 70, + 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, 128, 70, 73, 70, 84, 69, 69, + 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, 73, 69, 76, 68, 128, 70, 72, + 84, 79, 82, 193, 70, 70, 76, 128, 70, 70, 73, 128, 70, 69, 85, 88, 128, + 70, 69, 85, 70, 69, 85, 65, 69, 84, 128, 70, 69, 83, 84, 73, 86, 65, 76, + 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 70, 69, 82, 77, 65, 84, 65, 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79, 200, 70, 69, 78, 199, 70, 69, 78, 67, 69, 128, 70, 69, 77, 73, 78, 73, 78, 197, 70, 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, 197, 70, 69, 76, 76, 79, 87, @@ -3169,138 +3501,152 @@ static unsigned char lexicon[] = { 70, 69, 200, 70, 69, 69, 78, 71, 128, 70, 69, 69, 68, 128, 70, 69, 69, 196, 70, 69, 69, 128, 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 65, 84, 72, 69, 82, 128, 70, 69, 65, 84, 72, 69, 210, 70, 69, 65, 82, 78, - 128, 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 88, 128, 70, 65, 84, 72, - 69, 82, 128, 70, 65, 84, 72, 65, 84, 65, 78, 128, 70, 65, 84, 72, 65, 84, - 65, 206, 70, 65, 84, 72, 65, 128, 70, 65, 84, 72, 193, 70, 65, 84, 128, - 70, 65, 82, 83, 201, 70, 65, 80, 128, 70, 65, 78, 71, 128, 70, 65, 78, - 69, 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, 77, 73, 76, 89, 128, - 70, 65, 76, 76, 73, 78, 199, 70, 65, 73, 76, 85, 82, 69, 128, 70, 65, 73, - 72, 85, 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, - 79, 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, 70, 65, 67, 69, 45, 54, - 128, 70, 65, 67, 69, 45, 53, 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, - 67, 69, 45, 51, 128, 70, 65, 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, - 128, 70, 65, 65, 77, 65, 69, 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, - 85, 128, 70, 65, 65, 128, 70, 48, 53, 51, 128, 70, 48, 53, 50, 128, 70, - 48, 53, 49, 67, 128, 70, 48, 53, 49, 66, 128, 70, 48, 53, 49, 65, 128, - 70, 48, 53, 49, 128, 70, 48, 53, 48, 128, 70, 48, 52, 57, 128, 70, 48, - 52, 56, 128, 70, 48, 52, 55, 65, 128, 70, 48, 52, 55, 128, 70, 48, 52, - 54, 65, 128, 70, 48, 52, 54, 128, 70, 48, 52, 53, 65, 128, 70, 48, 52, - 53, 128, 70, 48, 52, 52, 128, 70, 48, 52, 51, 128, 70, 48, 52, 50, 128, - 70, 48, 52, 49, 128, 70, 48, 52, 48, 128, 70, 48, 51, 57, 128, 70, 48, - 51, 56, 65, 128, 70, 48, 51, 56, 128, 70, 48, 51, 55, 65, 128, 70, 48, - 51, 55, 128, 70, 48, 51, 54, 128, 70, 48, 51, 53, 128, 70, 48, 51, 52, - 128, 70, 48, 51, 51, 128, 70, 48, 51, 50, 128, 70, 48, 51, 49, 65, 128, - 70, 48, 51, 49, 128, 70, 48, 51, 48, 128, 70, 48, 50, 57, 128, 70, 48, - 50, 56, 128, 70, 48, 50, 55, 128, 70, 48, 50, 54, 128, 70, 48, 50, 53, - 128, 70, 48, 50, 52, 128, 70, 48, 50, 51, 128, 70, 48, 50, 50, 128, 70, - 48, 50, 49, 65, 128, 70, 48, 50, 49, 128, 70, 48, 50, 48, 128, 70, 48, - 49, 57, 128, 70, 48, 49, 56, 128, 70, 48, 49, 55, 128, 70, 48, 49, 54, - 128, 70, 48, 49, 53, 128, 70, 48, 49, 52, 128, 70, 48, 49, 51, 65, 128, - 70, 48, 49, 51, 128, 70, 48, 49, 50, 128, 70, 48, 49, 49, 128, 70, 48, - 49, 48, 128, 70, 48, 48, 57, 128, 70, 48, 48, 56, 128, 70, 48, 48, 55, - 128, 70, 48, 48, 54, 128, 70, 48, 48, 53, 128, 70, 48, 48, 52, 128, 70, - 48, 48, 51, 128, 70, 48, 48, 50, 128, 70, 48, 48, 49, 65, 128, 70, 48, - 48, 49, 128, 69, 90, 200, 69, 90, 69, 78, 128, 69, 90, 69, 206, 69, 90, - 128, 69, 89, 66, 69, 89, 70, 73, 76, 73, 128, 69, 89, 65, 78, 78, 65, - 128, 69, 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, 72, 73, - 71, 200, 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, 78, 68, - 69, 196, 69, 88, 80, 79, 78, 69, 78, 212, 69, 88, 79, 128, 69, 88, 207, - 69, 88, 73, 83, 84, 83, 128, 69, 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, - 83, 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 78, 128, - 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, 67, 69, 83, 83, 128, - 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, 87, 69, 128, 69, 86, 69, 78, - 73, 78, 71, 128, 69, 85, 82, 79, 45, 67, 85, 82, 82, 69, 78, 67, 217, 69, - 85, 82, 207, 69, 85, 76, 69, 210, 69, 85, 45, 85, 128, 69, 85, 45, 79, - 128, 69, 85, 45, 69, 85, 128, 69, 85, 45, 69, 79, 128, 69, 85, 45, 69, - 128, 69, 85, 45, 65, 128, 69, 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, - 69, 204, 69, 84, 69, 82, 79, 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, - 69, 83, 85, 75, 85, 85, 68, 79, 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, - 128, 69, 83, 84, 73, 77, 65, 84, 69, 196, 69, 83, 72, 69, 51, 128, 69, - 83, 72, 50, 49, 128, 69, 83, 72, 178, 69, 83, 72, 49, 54, 128, 69, 83, - 67, 65, 80, 69, 128, 69, 83, 45, 84, 69, 128, 69, 82, 82, 79, 82, 45, 66, - 65, 82, 82, 69, 196, 69, 82, 82, 128, 69, 82, 73, 78, 50, 128, 69, 82, - 71, 128, 69, 82, 65, 83, 197, 69, 81, 85, 73, 86, 65, 76, 69, 78, 212, - 69, 81, 85, 73, 68, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, 210, 69, - 81, 85, 65, 76, 83, 128, 69, 81, 85, 65, 76, 211, 69, 81, 85, 65, 76, - 128, 69, 80, 83, 73, 76, 79, 78, 128, 69, 80, 83, 73, 76, 79, 206, 69, - 80, 73, 71, 82, 65, 80, 72, 73, 195, 69, 80, 73, 68, 65, 85, 82, 69, 65, - 206, 69, 80, 69, 78, 84, 72, 69, 84, 73, 195, 69, 80, 69, 71, 69, 82, 77, - 65, 128, 69, 79, 76, 72, 88, 128, 69, 79, 72, 128, 69, 78, 89, 128, 69, - 78, 86, 69, 76, 79, 80, 69, 128, 69, 78, 85, 77, 69, 82, 65, 84, 73, 79, - 206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, 82, 89, 45, 49, 128, - 69, 78, 84, 82, 89, 128, 69, 78, 84, 72, 85, 83, 73, 65, 83, 77, 128, 69, - 78, 84, 69, 82, 80, 82, 73, 83, 69, 128, 69, 78, 84, 69, 82, 73, 78, 199, - 69, 78, 84, 69, 82, 128, 69, 78, 84, 69, 210, 69, 78, 81, 85, 73, 82, 89, - 128, 69, 78, 79, 211, 69, 78, 78, 128, 69, 78, 76, 65, 82, 71, 69, 77, - 69, 78, 84, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 78, 68, 73, - 78, 199, 69, 78, 68, 69, 80, 128, 69, 78, 68, 69, 65, 86, 79, 85, 82, - 128, 69, 78, 196, 69, 78, 67, 79, 85, 78, 84, 69, 82, 83, 128, 69, 78, - 67, 76, 79, 83, 85, 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, 199, 69, - 78, 67, 128, 69, 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, 79, 78, 73, - 79, 211, 69, 77, 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, 195, 69, 77, - 80, 72, 65, 83, 73, 211, 69, 77, 66, 82, 79, 73, 68, 69, 82, 89, 128, 69, - 77, 66, 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, 66, 69, 68, - 68, 73, 78, 71, 128, 69, 76, 84, 128, 69, 76, 76, 73, 80, 83, 73, 83, - 128, 69, 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, - 69, 86, 69, 78, 128, 69, 76, 69, 86, 69, 206, 69, 76, 69, 77, 69, 78, - 212, 69, 76, 69, 67, 84, 82, 73, 67, 65, 204, 69, 76, 69, 67, 84, 82, 73, - 195, 69, 76, 65, 70, 82, 79, 78, 128, 69, 75, 83, 84, 82, 69, 80, 84, 79, - 78, 128, 69, 75, 83, 128, 69, 75, 70, 79, 78, 73, 84, 73, 75, 79, 78, - 128, 69, 75, 65, 82, 65, 128, 69, 74, 69, 67, 212, 69, 73, 83, 128, 69, - 73, 71, 72, 84, 89, 128, 69, 73, 71, 72, 84, 217, 69, 73, 71, 72, 84, 72, - 83, 128, 69, 73, 71, 72, 84, 72, 211, 69, 73, 71, 72, 84, 72, 128, 69, - 73, 71, 72, 84, 69, 69, 78, 128, 69, 73, 71, 72, 84, 69, 69, 206, 69, 73, + 128, 70, 69, 65, 82, 70, 85, 204, 70, 69, 65, 82, 128, 70, 65, 89, 65, + 78, 78, 65, 128, 70, 65, 88, 128, 70, 65, 216, 70, 65, 84, 73, 71, 85, + 69, 128, 70, 65, 84, 72, 69, 82, 128, 70, 65, 84, 72, 69, 210, 70, 65, + 84, 72, 65, 84, 65, 78, 128, 70, 65, 84, 72, 65, 84, 65, 206, 70, 65, 84, + 72, 65, 128, 70, 65, 84, 72, 193, 70, 65, 84, 128, 70, 65, 82, 83, 201, + 70, 65, 81, 128, 70, 65, 80, 128, 70, 65, 78, 71, 128, 70, 65, 78, 69, + 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, 77, 73, 76, 89, 128, 70, + 65, 76, 76, 73, 78, 199, 70, 65, 76, 76, 69, 206, 70, 65, 73, 76, 85, 82, + 69, 128, 70, 65, 73, 72, 85, 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, + 128, 70, 65, 67, 84, 79, 82, 89, 128, 70, 65, 67, 84, 79, 210, 70, 65, + 67, 83, 73, 77, 73, 76, 197, 70, 65, 67, 69, 45, 54, 128, 70, 65, 67, 69, + 45, 53, 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, 45, 51, 128, + 70, 65, 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, 65, 77, + 65, 69, 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, 48, 53, + 51, 128, 70, 48, 53, 50, 128, 70, 48, 53, 49, 67, 128, 70, 48, 53, 49, + 66, 128, 70, 48, 53, 49, 65, 128, 70, 48, 53, 49, 128, 70, 48, 53, 48, + 128, 70, 48, 52, 57, 128, 70, 48, 52, 56, 128, 70, 48, 52, 55, 65, 128, + 70, 48, 52, 55, 128, 70, 48, 52, 54, 65, 128, 70, 48, 52, 54, 128, 70, + 48, 52, 53, 65, 128, 70, 48, 52, 53, 128, 70, 48, 52, 52, 128, 70, 48, + 52, 51, 128, 70, 48, 52, 50, 128, 70, 48, 52, 49, 128, 70, 48, 52, 48, + 128, 70, 48, 51, 57, 128, 70, 48, 51, 56, 65, 128, 70, 48, 51, 56, 128, + 70, 48, 51, 55, 65, 128, 70, 48, 51, 55, 128, 70, 48, 51, 54, 128, 70, + 48, 51, 53, 128, 70, 48, 51, 52, 128, 70, 48, 51, 51, 128, 70, 48, 51, + 50, 128, 70, 48, 51, 49, 65, 128, 70, 48, 51, 49, 128, 70, 48, 51, 48, + 128, 70, 48, 50, 57, 128, 70, 48, 50, 56, 128, 70, 48, 50, 55, 128, 70, + 48, 50, 54, 128, 70, 48, 50, 53, 128, 70, 48, 50, 52, 128, 70, 48, 50, + 51, 128, 70, 48, 50, 50, 128, 70, 48, 50, 49, 65, 128, 70, 48, 50, 49, + 128, 70, 48, 50, 48, 128, 70, 48, 49, 57, 128, 70, 48, 49, 56, 128, 70, + 48, 49, 55, 128, 70, 48, 49, 54, 128, 70, 48, 49, 53, 128, 70, 48, 49, + 52, 128, 70, 48, 49, 51, 65, 128, 70, 48, 49, 51, 128, 70, 48, 49, 50, + 128, 70, 48, 49, 49, 128, 70, 48, 49, 48, 128, 70, 48, 48, 57, 128, 70, + 48, 48, 56, 128, 70, 48, 48, 55, 128, 70, 48, 48, 54, 128, 70, 48, 48, + 53, 128, 70, 48, 48, 52, 128, 70, 48, 48, 51, 128, 70, 48, 48, 50, 128, + 70, 48, 48, 49, 65, 128, 70, 48, 48, 49, 128, 69, 90, 200, 69, 90, 69, + 78, 128, 69, 90, 69, 206, 69, 90, 128, 69, 89, 69, 83, 128, 69, 89, 69, + 71, 76, 65, 83, 83, 69, 83, 128, 69, 89, 66, 69, 89, 70, 73, 76, 73, 128, + 69, 89, 65, 78, 78, 65, 128, 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, + 84, 82, 73, 65, 204, 69, 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, + 65, 45, 72, 73, 71, 200, 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, + 84, 69, 78, 68, 69, 196, 69, 88, 80, 79, 78, 69, 78, 212, 69, 88, 79, + 128, 69, 88, 207, 69, 88, 73, 83, 84, 83, 128, 69, 88, 73, 83, 84, 128, + 69, 88, 72, 65, 85, 83, 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, + 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, + 67, 72, 65, 78, 71, 69, 128, 69, 88, 67, 69, 83, 83, 128, 69, 88, 67, 69, + 76, 76, 69, 78, 84, 128, 69, 87, 69, 128, 69, 86, 69, 82, 71, 82, 69, 69, + 206, 69, 86, 69, 78, 73, 78, 71, 128, 69, 85, 82, 79, 80, 69, 65, 206, + 69, 85, 82, 79, 80, 69, 45, 65, 70, 82, 73, 67, 65, 128, 69, 85, 82, 79, + 45, 67, 85, 82, 82, 69, 78, 67, 217, 69, 85, 82, 207, 69, 85, 76, 69, + 210, 69, 85, 45, 85, 128, 69, 85, 45, 79, 128, 69, 85, 45, 69, 85, 128, + 69, 85, 45, 69, 79, 128, 69, 85, 45, 69, 128, 69, 85, 45, 65, 128, 69, + 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, 69, 204, 69, 84, 69, 82, 79, + 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, 69, 83, 85, 75, 85, 85, 68, 79, + 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, 84, + 69, 196, 69, 83, 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, 72, + 178, 69, 83, 72, 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 45, + 84, 69, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, 196, 69, 82, 82, + 128, 69, 82, 73, 78, 50, 128, 69, 82, 71, 128, 69, 82, 65, 83, 197, 69, + 81, 85, 73, 86, 65, 76, 69, 78, 212, 69, 81, 85, 73, 68, 128, 69, 81, 85, + 73, 65, 78, 71, 85, 76, 65, 210, 69, 81, 85, 65, 76, 83, 128, 69, 81, 85, + 65, 76, 211, 69, 81, 85, 65, 76, 128, 69, 80, 83, 73, 76, 79, 78, 128, + 69, 80, 83, 73, 76, 79, 206, 69, 80, 79, 67, 72, 128, 69, 80, 73, 71, 82, + 65, 80, 72, 73, 195, 69, 80, 73, 68, 65, 85, 82, 69, 65, 206, 69, 80, 69, + 78, 84, 72, 69, 84, 73, 195, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 79, + 76, 72, 88, 128, 69, 79, 72, 128, 69, 78, 89, 128, 69, 78, 86, 69, 76, + 79, 80, 69, 128, 69, 78, 86, 69, 76, 79, 80, 197, 69, 78, 85, 77, 69, 82, + 65, 84, 73, 79, 206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, 82, 89, + 45, 49, 128, 69, 78, 84, 82, 89, 128, 69, 78, 84, 82, 217, 69, 78, 84, + 72, 85, 83, 73, 65, 83, 77, 128, 69, 78, 84, 69, 82, 80, 82, 73, 83, 69, + 128, 69, 78, 84, 69, 82, 73, 78, 199, 69, 78, 84, 69, 82, 128, 69, 78, + 84, 69, 210, 69, 78, 81, 85, 73, 82, 89, 128, 69, 78, 79, 211, 69, 78, + 78, 128, 69, 78, 76, 65, 82, 71, 69, 77, 69, 78, 84, 128, 69, 78, 71, 73, + 78, 69, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 78, 68, 73, 78, + 199, 69, 78, 68, 69, 80, 128, 69, 78, 68, 69, 65, 86, 79, 85, 82, 128, + 69, 78, 67, 79, 85, 78, 84, 69, 82, 83, 128, 69, 78, 67, 76, 79, 83, 85, + 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, 199, 69, 78, 67, 128, 69, + 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, 79, 78, 73, 79, 211, 69, 77, + 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, 195, 69, 77, 80, 72, 65, 83, 73, + 211, 69, 77, 66, 82, 79, 73, 68, 69, 82, 89, 128, 69, 77, 66, 76, 69, 77, + 128, 69, 77, 66, 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, 66, + 69, 68, 68, 73, 78, 71, 128, 69, 76, 84, 128, 69, 76, 76, 73, 80, 83, 73, + 83, 128, 69, 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, + 76, 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, + 78, 128, 69, 76, 69, 86, 69, 206, 69, 76, 69, 80, 72, 65, 78, 84, 128, + 69, 76, 69, 77, 69, 78, 212, 69, 76, 69, 67, 84, 82, 73, 67, 65, 204, 69, + 76, 69, 67, 84, 82, 73, 195, 69, 76, 65, 70, 82, 79, 78, 128, 69, 75, 83, + 84, 82, 69, 80, 84, 79, 78, 128, 69, 75, 83, 128, 69, 75, 70, 79, 78, 73, + 84, 73, 75, 79, 78, 128, 69, 75, 65, 82, 65, 128, 69, 74, 69, 67, 212, + 69, 73, 83, 128, 69, 73, 71, 72, 84, 89, 128, 69, 73, 71, 72, 84, 217, + 69, 73, 71, 72, 84, 72, 83, 128, 69, 73, 71, 72, 84, 72, 211, 69, 73, 71, + 72, 84, 72, 128, 69, 73, 71, 72, 84, 69, 69, 78, 128, 69, 73, 71, 72, 84, + 69, 69, 206, 69, 73, 71, 72, 84, 45, 84, 72, 73, 82, 84, 89, 128, 69, 73, 69, 128, 69, 72, 87, 65, 218, 69, 71, 89, 80, 84, 79, 76, 79, 71, 73, 67, 65, 204, 69, 71, 73, 82, 128, 69, 71, 71, 128, 69, 69, 89, 65, 78, 78, 65, 128, 69, 69, 75, 65, 65, 128, 69, 69, 66, 69, 69, 70, 73, 76, 73, 128, 69, 68, 73, 84, 79, 82, 73, 65, 204, 69, 68, 73, 78, 128, 69, 68, - 68, 128, 69, 67, 200, 69, 66, 69, 70, 73, 76, 73, 128, 69, 65, 83, 84, - 69, 82, 206, 69, 65, 83, 212, 69, 65, 82, 84, 72, 76, 217, 69, 65, 82, - 84, 72, 128, 69, 65, 82, 84, 200, 69, 65, 82, 76, 217, 69, 65, 77, 72, - 65, 78, 67, 72, 79, 76, 76, 128, 69, 65, 71, 76, 69, 128, 69, 65, 68, 72, - 65, 68, 72, 128, 69, 65, 66, 72, 65, 68, 72, 128, 69, 178, 69, 48, 51, - 56, 128, 69, 48, 51, 55, 128, 69, 48, 51, 54, 128, 69, 48, 51, 52, 65, - 128, 69, 48, 51, 52, 128, 69, 48, 51, 51, 128, 69, 48, 51, 50, 128, 69, - 48, 51, 49, 128, 69, 48, 51, 48, 128, 69, 48, 50, 57, 128, 69, 48, 50, - 56, 65, 128, 69, 48, 50, 56, 128, 69, 48, 50, 55, 128, 69, 48, 50, 54, - 128, 69, 48, 50, 53, 128, 69, 48, 50, 52, 128, 69, 48, 50, 51, 128, 69, - 48, 50, 50, 128, 69, 48, 50, 49, 128, 69, 48, 50, 48, 65, 128, 69, 48, - 50, 48, 128, 69, 48, 49, 57, 128, 69, 48, 49, 56, 128, 69, 48, 49, 55, - 65, 128, 69, 48, 49, 55, 128, 69, 48, 49, 54, 65, 128, 69, 48, 49, 54, - 128, 69, 48, 49, 53, 128, 69, 48, 49, 52, 128, 69, 48, 49, 51, 128, 69, - 48, 49, 50, 128, 69, 48, 49, 49, 128, 69, 48, 49, 48, 128, 69, 48, 48, - 57, 65, 128, 69, 48, 48, 57, 128, 69, 48, 48, 56, 65, 128, 69, 48, 48, - 56, 128, 69, 48, 48, 55, 128, 69, 48, 48, 54, 128, 69, 48, 48, 53, 128, - 69, 48, 48, 52, 128, 69, 48, 48, 51, 128, 69, 48, 48, 50, 128, 69, 48, - 48, 49, 128, 68, 90, 90, 69, 128, 68, 90, 87, 69, 128, 68, 90, 85, 128, - 68, 90, 79, 128, 68, 90, 74, 69, 128, 68, 90, 73, 128, 68, 90, 72, 69, - 128, 68, 90, 72, 65, 128, 68, 90, 69, 76, 79, 128, 68, 90, 69, 69, 128, - 68, 90, 69, 128, 68, 90, 65, 128, 68, 90, 128, 68, 218, 68, 89, 79, 128, - 68, 89, 207, 68, 89, 69, 72, 128, 68, 89, 69, 200, 68, 87, 79, 128, 68, - 87, 69, 128, 68, 87, 65, 128, 68, 86, 73, 83, 86, 65, 82, 65, 128, 68, - 86, 128, 68, 85, 84, 73, 69, 83, 128, 68, 85, 82, 65, 84, 73, 79, 78, - 128, 68, 85, 82, 50, 128, 68, 85, 80, 79, 78, 68, 73, 85, 211, 68, 85, - 79, 88, 128, 68, 85, 79, 128, 68, 85, 78, 52, 128, 68, 85, 78, 51, 128, - 68, 85, 78, 179, 68, 85, 78, 128, 68, 85, 77, 128, 68, 85, 76, 128, 68, - 85, 204, 68, 85, 72, 128, 68, 85, 71, 85, 68, 128, 68, 85, 66, 50, 128, - 68, 85, 66, 128, 68, 85, 194, 68, 213, 68, 82, 89, 128, 68, 82, 217, 68, - 82, 85, 77, 128, 68, 82, 85, 205, 68, 82, 79, 80, 83, 128, 68, 82, 79, - 80, 45, 83, 72, 65, 68, 79, 87, 69, 196, 68, 82, 73, 86, 69, 128, 68, 82, - 73, 86, 197, 68, 82, 73, 204, 68, 82, 65, 85, 71, 72, 84, 211, 68, 82, - 65, 71, 79, 78, 128, 68, 82, 65, 70, 84, 73, 78, 199, 68, 82, 65, 67, 72, - 77, 65, 83, 128, 68, 82, 65, 67, 72, 77, 65, 128, 68, 82, 65, 67, 72, 77, - 193, 68, 79, 87, 78, 87, 65, 82, 68, 83, 128, 68, 79, 87, 78, 87, 65, 82, - 68, 211, 68, 79, 87, 78, 45, 80, 79, 73, 78, 84, 73, 78, 199, 68, 79, 87, - 78, 128, 68, 79, 86, 69, 128, 68, 79, 85, 66, 84, 128, 68, 79, 85, 66, - 76, 69, 196, 68, 79, 85, 66, 76, 69, 45, 76, 73, 78, 197, 68, 79, 85, 66, - 76, 69, 45, 69, 78, 68, 69, 196, 68, 79, 85, 66, 76, 69, 128, 68, 79, 84, - 84, 69, 68, 45, 80, 128, 68, 79, 84, 84, 69, 68, 45, 78, 128, 68, 79, 84, - 84, 69, 68, 45, 76, 128, 68, 79, 84, 84, 69, 68, 128, 68, 79, 84, 84, 69, - 196, 68, 79, 84, 83, 45, 56, 128, 68, 79, 84, 83, 45, 55, 56, 128, 68, - 79, 84, 83, 45, 55, 128, 68, 79, 84, 83, 45, 54, 56, 128, 68, 79, 84, 83, - 45, 54, 55, 56, 128, 68, 79, 84, 83, 45, 54, 55, 128, 68, 79, 84, 83, 45, - 54, 128, 68, 79, 84, 83, 45, 53, 56, 128, 68, 79, 84, 83, 45, 53, 55, 56, - 128, 68, 79, 84, 83, 45, 53, 55, 128, 68, 79, 84, 83, 45, 53, 54, 56, + 68, 128, 69, 66, 69, 70, 73, 76, 73, 128, 69, 65, 83, 84, 69, 82, 206, + 69, 65, 83, 212, 69, 65, 82, 84, 72, 76, 217, 69, 65, 82, 84, 72, 128, + 69, 65, 82, 84, 200, 69, 65, 82, 83, 128, 69, 65, 82, 76, 217, 69, 65, + 77, 72, 65, 78, 67, 72, 79, 76, 76, 128, 69, 65, 71, 76, 69, 128, 69, 65, + 68, 72, 65, 68, 72, 128, 69, 65, 66, 72, 65, 68, 72, 128, 69, 178, 69, + 48, 51, 56, 128, 69, 48, 51, 55, 128, 69, 48, 51, 54, 128, 69, 48, 51, + 52, 65, 128, 69, 48, 51, 52, 128, 69, 48, 51, 51, 128, 69, 48, 51, 50, + 128, 69, 48, 51, 49, 128, 69, 48, 51, 48, 128, 69, 48, 50, 57, 128, 69, + 48, 50, 56, 65, 128, 69, 48, 50, 56, 128, 69, 48, 50, 55, 128, 69, 48, + 50, 54, 128, 69, 48, 50, 53, 128, 69, 48, 50, 52, 128, 69, 48, 50, 51, + 128, 69, 48, 50, 50, 128, 69, 48, 50, 49, 128, 69, 48, 50, 48, 65, 128, + 69, 48, 50, 48, 128, 69, 48, 49, 57, 128, 69, 48, 49, 56, 128, 69, 48, + 49, 55, 65, 128, 69, 48, 49, 55, 128, 69, 48, 49, 54, 65, 128, 69, 48, + 49, 54, 128, 69, 48, 49, 53, 128, 69, 48, 49, 52, 128, 69, 48, 49, 51, + 128, 69, 48, 49, 50, 128, 69, 48, 49, 49, 128, 69, 48, 49, 48, 128, 69, + 48, 48, 57, 65, 128, 69, 48, 48, 57, 128, 69, 48, 48, 56, 65, 128, 69, + 48, 48, 56, 128, 69, 48, 48, 55, 128, 69, 48, 48, 54, 128, 69, 48, 48, + 53, 128, 69, 48, 48, 52, 128, 69, 48, 48, 51, 128, 69, 48, 48, 50, 128, + 69, 48, 48, 49, 128, 69, 45, 77, 65, 73, 204, 68, 90, 90, 69, 128, 68, + 90, 87, 69, 128, 68, 90, 85, 128, 68, 90, 79, 128, 68, 90, 74, 69, 128, + 68, 90, 73, 128, 68, 90, 72, 69, 128, 68, 90, 72, 65, 128, 68, 90, 69, + 76, 79, 128, 68, 90, 69, 69, 128, 68, 90, 69, 128, 68, 90, 65, 65, 128, + 68, 90, 65, 128, 68, 90, 128, 68, 218, 68, 89, 79, 128, 68, 89, 207, 68, + 89, 69, 72, 128, 68, 89, 69, 200, 68, 87, 79, 128, 68, 87, 69, 128, 68, + 87, 65, 128, 68, 86, 73, 83, 86, 65, 82, 65, 128, 68, 86, 68, 128, 68, + 86, 128, 68, 85, 84, 73, 69, 83, 128, 68, 85, 83, 75, 128, 68, 85, 83, + 72, 69, 78, 78, 65, 128, 68, 85, 82, 65, 84, 73, 79, 78, 128, 68, 85, 82, + 50, 128, 68, 85, 80, 79, 78, 68, 73, 85, 211, 68, 85, 79, 88, 128, 68, + 85, 79, 128, 68, 85, 78, 52, 128, 68, 85, 78, 51, 128, 68, 85, 78, 179, + 68, 85, 77, 128, 68, 85, 204, 68, 85, 72, 128, 68, 85, 71, 85, 68, 128, + 68, 85, 66, 50, 128, 68, 85, 66, 128, 68, 85, 194, 68, 82, 89, 128, 68, + 82, 217, 68, 82, 85, 77, 128, 68, 82, 85, 205, 68, 82, 79, 80, 83, 128, + 68, 82, 79, 80, 76, 69, 84, 128, 68, 82, 79, 80, 45, 83, 72, 65, 68, 79, + 87, 69, 196, 68, 82, 79, 77, 69, 68, 65, 82, 217, 68, 82, 73, 86, 69, + 128, 68, 82, 73, 86, 197, 68, 82, 73, 78, 75, 128, 68, 82, 73, 204, 68, + 82, 69, 83, 83, 128, 68, 82, 65, 85, 71, 72, 84, 211, 68, 82, 65, 77, + 128, 68, 82, 65, 71, 79, 78, 128, 68, 82, 65, 71, 79, 206, 68, 82, 65, + 70, 84, 73, 78, 199, 68, 82, 65, 67, 72, 77, 65, 83, 128, 68, 82, 65, 67, + 72, 77, 65, 128, 68, 82, 65, 67, 72, 77, 193, 68, 79, 87, 78, 87, 65, 82, + 68, 83, 128, 68, 79, 87, 78, 87, 65, 82, 68, 211, 68, 79, 87, 78, 45, 80, + 79, 73, 78, 84, 73, 78, 199, 68, 79, 87, 78, 128, 68, 79, 86, 69, 128, + 68, 79, 85, 71, 72, 78, 85, 84, 128, 68, 79, 85, 66, 84, 128, 68, 79, 85, + 66, 76, 69, 196, 68, 79, 85, 66, 76, 69, 45, 76, 73, 78, 197, 68, 79, 85, + 66, 76, 69, 45, 69, 78, 68, 69, 196, 68, 79, 85, 66, 76, 69, 128, 68, 79, + 84, 84, 69, 68, 45, 80, 128, 68, 79, 84, 84, 69, 68, 45, 78, 128, 68, 79, + 84, 84, 69, 68, 45, 76, 128, 68, 79, 84, 84, 69, 68, 128, 68, 79, 84, 84, + 69, 196, 68, 79, 84, 83, 45, 56, 128, 68, 79, 84, 83, 45, 55, 56, 128, + 68, 79, 84, 83, 45, 55, 128, 68, 79, 84, 83, 45, 54, 56, 128, 68, 79, 84, + 83, 45, 54, 55, 56, 128, 68, 79, 84, 83, 45, 54, 55, 128, 68, 79, 84, 83, + 45, 54, 128, 68, 79, 84, 83, 45, 53, 56, 128, 68, 79, 84, 83, 45, 53, 55, + 56, 128, 68, 79, 84, 83, 45, 53, 55, 128, 68, 79, 84, 83, 45, 53, 54, 56, 128, 68, 79, 84, 83, 45, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 53, 54, 55, 128, 68, 79, 84, 83, 45, 53, 54, 128, 68, 79, 84, 83, 45, 53, 128, 68, 79, 84, 83, 45, 52, 56, 128, 68, 79, 84, 83, 45, 52, 55, 56, 128, 68, @@ -3440,554 +3786,646 @@ static unsigned char lexicon[] = { 128, 68, 79, 84, 83, 45, 49, 50, 51, 128, 68, 79, 84, 83, 45, 49, 50, 128, 68, 79, 84, 83, 45, 49, 128, 68, 79, 84, 83, 128, 68, 79, 84, 76, 69, 83, 211, 68, 79, 82, 85, 128, 68, 79, 79, 82, 128, 68, 79, 79, 78, - 71, 128, 68, 79, 78, 71, 128, 68, 79, 77, 65, 73, 206, 68, 79, 76, 76, - 65, 210, 68, 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73, 128, 68, - 79, 73, 84, 128, 68, 79, 71, 128, 68, 79, 69, 211, 68, 79, 68, 69, 75, + 71, 128, 68, 79, 78, 71, 128, 68, 79, 77, 65, 73, 206, 68, 79, 76, 80, + 72, 73, 78, 128, 68, 79, 76, 76, 83, 128, 68, 79, 76, 76, 65, 210, 68, + 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73, 128, 68, 79, 73, 84, + 128, 68, 79, 71, 128, 68, 79, 199, 68, 79, 69, 211, 68, 79, 68, 69, 75, 65, 84, 65, 128, 68, 79, 66, 82, 79, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 69, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 197, 68, 79, 65, 128, 68, 79, 45, 79, 128, 68, 77, 128, 68, 205, 68, 76, 85, 128, 68, 76, 79, 128, 68, 76, 73, 128, 68, 76, 69, 69, 128, 68, 76, 65, 128, 68, 76, 128, 68, 75, 65, 82, 128, 68, 75, 65, 210, 68, 74, 69, 82, 86, 73, 128, 68, 74, 69, 82, 86, 128, 68, 74, 69, 128, 68, 74, 65, 128, 68, 74, 128, - 68, 73, 86, 79, 82, 67, 197, 68, 73, 86, 73, 83, 73, 79, 78, 128, 68, 73, - 86, 73, 83, 73, 79, 206, 68, 73, 86, 73, 78, 65, 84, 73, 79, 78, 128, 68, - 73, 86, 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, 128, 68, 73, 86, - 73, 68, 69, 196, 68, 73, 86, 73, 68, 69, 128, 68, 73, 86, 73, 68, 197, - 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 73, 84, 84, 207, 68, 73, - 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, 73, 83, 84, 73, 78, 71, 85, 73, - 83, 72, 128, 68, 73, 83, 80, 69, 82, 83, 73, 79, 78, 128, 68, 73, 83, 73, - 77, 79, 85, 128, 68, 73, 83, 72, 128, 68, 73, 83, 67, 79, 78, 84, 73, 78, - 85, 79, 85, 211, 68, 73, 83, 195, 68, 73, 83, 65, 66, 76, 69, 196, 68, - 73, 82, 71, 193, 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, 82, 69, 67, 84, - 73, 79, 78, 65, 204, 68, 73, 80, 84, 69, 128, 68, 73, 80, 80, 69, 82, - 128, 68, 73, 80, 76, 79, 85, 78, 128, 68, 73, 80, 76, 73, 128, 68, 73, - 80, 76, 201, 68, 73, 78, 71, 66, 65, 212, 68, 73, 206, 68, 73, 77, 77, - 73, 78, 71, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 51, 128, 68, - 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 50, 128, 68, 73, 77, 73, 78, 85, - 84, 73, 79, 78, 45, 49, 128, 68, 73, 77, 73, 78, 73, 83, 72, 77, 69, 78, - 84, 128, 68, 73, 77, 73, 68, 73, 193, 68, 73, 77, 69, 78, 83, 73, 79, 78, - 65, 204, 68, 73, 77, 69, 78, 83, 73, 79, 206, 68, 73, 77, 50, 128, 68, - 73, 76, 128, 68, 73, 71, 82, 65, 80, 72, 128, 68, 73, 71, 82, 65, 80, - 200, 68, 73, 71, 82, 65, 77, 77, 79, 211, 68, 73, 71, 82, 65, 77, 77, - 193, 68, 73, 71, 82, 65, 205, 68, 73, 71, 79, 82, 71, 79, 78, 128, 68, - 73, 71, 79, 82, 71, 79, 206, 68, 73, 71, 65, 77, 77, 65, 128, 68, 73, 71, - 193, 68, 73, 70, 84, 79, 71, 71, 79, 211, 68, 73, 70, 79, 78, 73, 65, 83, - 128, 68, 73, 70, 70, 73, 67, 85, 76, 84, 217, 68, 73, 70, 70, 73, 67, 85, - 76, 84, 73, 69, 83, 128, 68, 73, 70, 70, 69, 82, 69, 78, 84, 73, 65, 76, - 128, 68, 73, 70, 70, 69, 82, 69, 78, 67, 197, 68, 73, 70, 65, 84, 128, - 68, 73, 69, 83, 73, 83, 128, 68, 73, 69, 83, 73, 211, 68, 73, 69, 80, - 128, 68, 73, 197, 68, 73, 66, 128, 68, 73, 65, 84, 79, 78, 79, 206, 68, - 73, 65, 84, 79, 78, 73, 75, 201, 68, 73, 65, 83, 84, 79, 76, 201, 68, 73, - 65, 77, 79, 78, 68, 128, 68, 73, 65, 77, 79, 78, 196, 68, 73, 65, 77, 69, - 84, 69, 210, 68, 73, 65, 76, 89, 84, 73, 75, 65, 128, 68, 73, 65, 76, 89, - 84, 73, 75, 193, 68, 73, 65, 76, 69, 67, 84, 45, 208, 68, 73, 65, 71, 79, - 78, 65, 76, 128, 68, 73, 65, 71, 79, 78, 65, 204, 68, 73, 65, 69, 82, 69, - 83, 73, 90, 69, 196, 68, 73, 65, 69, 82, 69, 83, 73, 83, 128, 68, 73, 65, - 69, 82, 69, 83, 73, 211, 68, 72, 79, 85, 128, 68, 72, 79, 79, 128, 68, - 72, 79, 128, 68, 72, 73, 128, 68, 72, 72, 85, 128, 68, 72, 72, 79, 79, - 128, 68, 72, 72, 79, 128, 68, 72, 72, 73, 128, 68, 72, 72, 69, 69, 128, - 68, 72, 72, 69, 128, 68, 72, 72, 65, 128, 68, 72, 69, 69, 128, 68, 72, - 65, 82, 77, 65, 128, 68, 72, 65, 76, 69, 84, 72, 128, 68, 72, 65, 76, 65, - 84, 72, 128, 68, 72, 65, 76, 128, 68, 72, 65, 68, 72, 69, 128, 68, 72, - 65, 65, 76, 85, 128, 68, 72, 65, 128, 68, 69, 90, 200, 68, 69, 89, 84, - 69, 82, 79, 213, 68, 69, 89, 84, 69, 82, 79, 211, 68, 69, 88, 73, 65, - 128, 68, 69, 86, 73, 67, 197, 68, 69, 86, 69, 76, 79, 80, 77, 69, 78, 84, - 128, 68, 69, 85, 78, 71, 128, 68, 69, 83, 73, 128, 68, 69, 83, 67, 82, - 73, 80, 84, 73, 79, 206, 68, 69, 83, 67, 69, 78, 68, 73, 78, 199, 68, 69, - 83, 67, 69, 78, 68, 69, 82, 128, 68, 69, 82, 69, 84, 45, 72, 73, 68, 69, - 84, 128, 68, 69, 82, 69, 84, 128, 68, 69, 80, 65, 82, 84, 85, 82, 69, - 128, 68, 69, 80, 65, 82, 84, 73, 78, 199, 68, 69, 78, 84, 73, 83, 84, 82, - 217, 68, 69, 78, 84, 65, 204, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 82, - 128, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, 69, 78, 78, 69, 78, - 128, 68, 69, 78, 71, 128, 68, 69, 78, 197, 68, 69, 78, 65, 82, 73, 85, - 211, 68, 69, 76, 84, 65, 128, 68, 69, 76, 84, 193, 68, 69, 76, 84, 128, - 68, 69, 76, 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, 82, 65, 78, 67, 69, - 128, 68, 69, 76, 73, 77, 73, 84, 69, 82, 128, 68, 69, 76, 73, 77, 73, 84, - 69, 210, 68, 69, 76, 69, 84, 69, 128, 68, 69, 76, 69, 84, 197, 68, 69, - 75, 65, 128, 68, 69, 75, 128, 68, 69, 73, 128, 68, 69, 72, 73, 128, 68, - 69, 71, 82, 69, 197, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, 128, 68, 69, - 70, 69, 67, 84, 73, 86, 69, 78, 69, 83, 211, 68, 69, 69, 82, 128, 68, 69, - 69, 76, 128, 68, 69, 67, 82, 69, 83, 67, 69, 78, 68, 79, 128, 68, 69, 67, - 82, 69, 65, 83, 69, 128, 68, 69, 67, 73, 83, 73, 86, 69, 78, 69, 83, 83, - 128, 68, 69, 67, 73, 77, 65, 204, 68, 69, 67, 69, 77, 66, 69, 82, 128, - 68, 69, 67, 65, 89, 69, 68, 128, 68, 69, 66, 73, 212, 68, 69, 65, 84, 72, - 128, 68, 69, 65, 68, 128, 68, 68, 87, 65, 128, 68, 68, 85, 88, 128, 68, - 68, 85, 84, 128, 68, 68, 85, 82, 88, 128, 68, 68, 85, 82, 128, 68, 68, - 85, 80, 128, 68, 68, 85, 79, 88, 128, 68, 68, 85, 79, 80, 128, 68, 68, - 85, 79, 128, 68, 68, 85, 128, 68, 68, 79, 88, 128, 68, 68, 79, 84, 128, - 68, 68, 79, 80, 128, 68, 68, 79, 65, 128, 68, 68, 73, 88, 128, 68, 68, - 73, 84, 128, 68, 68, 73, 80, 128, 68, 68, 73, 69, 88, 128, 68, 68, 73, - 69, 80, 128, 68, 68, 73, 69, 128, 68, 68, 73, 128, 68, 68, 72, 79, 128, - 68, 68, 72, 65, 128, 68, 68, 69, 88, 128, 68, 68, 69, 80, 128, 68, 68, - 69, 69, 128, 68, 68, 69, 128, 68, 68, 68, 72, 65, 128, 68, 68, 68, 65, - 128, 68, 68, 65, 89, 65, 78, 78, 65, 128, 68, 68, 65, 88, 128, 68, 68, - 65, 84, 128, 68, 68, 65, 80, 128, 68, 68, 65, 76, 128, 68, 68, 65, 204, - 68, 68, 65, 72, 65, 76, 128, 68, 68, 65, 72, 65, 204, 68, 68, 65, 65, - 128, 68, 194, 68, 65, 217, 68, 65, 86, 73, 89, 65, 78, 73, 128, 68, 65, - 86, 73, 68, 128, 68, 65, 84, 197, 68, 65, 83, 73, 65, 128, 68, 65, 83, - 72, 69, 196, 68, 65, 83, 72, 128, 68, 65, 83, 200, 68, 65, 83, 69, 73, - 65, 128, 68, 65, 82, 84, 128, 68, 65, 82, 75, 69, 78, 73, 78, 71, 128, - 68, 65, 82, 75, 69, 78, 73, 78, 199, 68, 65, 82, 203, 68, 65, 82, 71, 65, - 128, 68, 65, 82, 65, 52, 128, 68, 65, 82, 65, 51, 128, 68, 65, 82, 128, - 68, 65, 80, 45, 80, 82, 65, 205, 68, 65, 80, 45, 80, 73, 201, 68, 65, 80, - 45, 77, 85, 79, 217, 68, 65, 80, 45, 66, 85, 79, 206, 68, 65, 80, 45, 66, - 69, 201, 68, 65, 208, 68, 65, 78, 84, 65, 74, 193, 68, 65, 78, 71, 128, - 68, 65, 78, 199, 68, 65, 78, 68, 65, 128, 68, 65, 77, 80, 128, 68, 65, - 77, 208, 68, 65, 77, 77, 65, 84, 65, 78, 128, 68, 65, 77, 77, 65, 84, 65, - 206, 68, 65, 77, 77, 65, 128, 68, 65, 77, 77, 193, 68, 65, 77, 65, 82, - 85, 128, 68, 65, 76, 69, 84, 72, 128, 68, 65, 76, 69, 84, 128, 68, 65, - 76, 69, 212, 68, 65, 76, 68, 65, 128, 68, 65, 76, 65, 84, 72, 128, 68, - 65, 76, 65, 84, 200, 68, 65, 76, 65, 84, 128, 68, 65, 73, 82, 128, 68, - 65, 73, 78, 71, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 45, 50, 128, 68, - 65, 72, 89, 65, 65, 85, 83, 72, 128, 68, 65, 71, 83, 128, 68, 65, 71, 71, - 69, 82, 128, 68, 65, 71, 69, 83, 72, 128, 68, 65, 71, 69, 83, 200, 68, - 65, 71, 66, 65, 83, 73, 78, 78, 65, 128, 68, 65, 71, 65, 218, 68, 65, 71, - 65, 76, 71, 65, 128, 68, 65, 199, 68, 65, 69, 78, 71, 128, 68, 65, 69, - 199, 68, 65, 68, 128, 68, 65, 196, 68, 65, 65, 83, 85, 128, 68, 65, 65, - 68, 72, 85, 128, 68, 48, 54, 55, 72, 128, 68, 48, 54, 55, 71, 128, 68, - 48, 54, 55, 70, 128, 68, 48, 54, 55, 69, 128, 68, 48, 54, 55, 68, 128, - 68, 48, 54, 55, 67, 128, 68, 48, 54, 55, 66, 128, 68, 48, 54, 55, 65, - 128, 68, 48, 54, 55, 128, 68, 48, 54, 54, 128, 68, 48, 54, 53, 128, 68, - 48, 54, 52, 128, 68, 48, 54, 51, 128, 68, 48, 54, 50, 128, 68, 48, 54, - 49, 128, 68, 48, 54, 48, 128, 68, 48, 53, 57, 128, 68, 48, 53, 56, 128, - 68, 48, 53, 55, 128, 68, 48, 53, 54, 128, 68, 48, 53, 53, 128, 68, 48, - 53, 52, 65, 128, 68, 48, 53, 52, 128, 68, 48, 53, 51, 128, 68, 48, 53, - 50, 65, 128, 68, 48, 53, 50, 128, 68, 48, 53, 49, 128, 68, 48, 53, 48, - 73, 128, 68, 48, 53, 48, 72, 128, 68, 48, 53, 48, 71, 128, 68, 48, 53, - 48, 70, 128, 68, 48, 53, 48, 69, 128, 68, 48, 53, 48, 68, 128, 68, 48, - 53, 48, 67, 128, 68, 48, 53, 48, 66, 128, 68, 48, 53, 48, 65, 128, 68, - 48, 53, 48, 128, 68, 48, 52, 57, 128, 68, 48, 52, 56, 65, 128, 68, 48, - 52, 56, 128, 68, 48, 52, 55, 128, 68, 48, 52, 54, 65, 128, 68, 48, 52, - 54, 128, 68, 48, 52, 53, 128, 68, 48, 52, 52, 128, 68, 48, 52, 51, 128, - 68, 48, 52, 50, 128, 68, 48, 52, 49, 128, 68, 48, 52, 48, 128, 68, 48, - 51, 57, 128, 68, 48, 51, 56, 128, 68, 48, 51, 55, 128, 68, 48, 51, 54, - 128, 68, 48, 51, 53, 128, 68, 48, 51, 52, 65, 128, 68, 48, 51, 52, 128, - 68, 48, 51, 51, 128, 68, 48, 51, 50, 128, 68, 48, 51, 49, 65, 128, 68, - 48, 51, 49, 128, 68, 48, 51, 48, 128, 68, 48, 50, 57, 128, 68, 48, 50, - 56, 128, 68, 48, 50, 55, 65, 128, 68, 48, 50, 55, 128, 68, 48, 50, 54, - 128, 68, 48, 50, 53, 128, 68, 48, 50, 52, 128, 68, 48, 50, 51, 128, 68, - 48, 50, 50, 128, 68, 48, 50, 49, 128, 68, 48, 50, 48, 128, 68, 48, 49, - 57, 128, 68, 48, 49, 56, 128, 68, 48, 49, 55, 128, 68, 48, 49, 54, 128, - 68, 48, 49, 53, 128, 68, 48, 49, 52, 128, 68, 48, 49, 51, 128, 68, 48, - 49, 50, 128, 68, 48, 49, 49, 128, 68, 48, 49, 48, 128, 68, 48, 48, 57, - 128, 68, 48, 48, 56, 65, 128, 68, 48, 48, 56, 128, 68, 48, 48, 55, 128, - 68, 48, 48, 54, 128, 68, 48, 48, 53, 128, 68, 48, 48, 52, 128, 68, 48, - 48, 51, 128, 68, 48, 48, 50, 128, 68, 48, 48, 49, 128, 67, 89, 88, 128, - 67, 89, 84, 128, 67, 89, 82, 88, 128, 67, 89, 82, 69, 78, 65, 73, 195, - 67, 89, 82, 128, 67, 89, 80, 82, 73, 79, 212, 67, 89, 80, 69, 82, 85, 83, - 128, 67, 89, 80, 128, 67, 89, 76, 73, 78, 68, 82, 73, 67, 73, 84, 89, - 128, 67, 89, 65, 128, 67, 89, 128, 67, 87, 79, 79, 128, 67, 87, 79, 128, - 67, 87, 73, 73, 128, 67, 87, 73, 128, 67, 87, 69, 79, 82, 84, 72, 128, - 67, 87, 69, 128, 67, 87, 65, 65, 128, 67, 85, 88, 128, 67, 85, 84, 128, - 67, 85, 212, 67, 85, 83, 84, 79, 77, 69, 210, 67, 85, 82, 88, 128, 67, - 85, 82, 86, 73, 78, 199, 67, 85, 82, 86, 69, 196, 67, 85, 82, 86, 69, - 128, 67, 85, 82, 86, 197, 67, 85, 82, 82, 69, 78, 84, 128, 67, 85, 82, - 82, 69, 78, 212, 67, 85, 82, 76, 217, 67, 85, 82, 76, 128, 67, 85, 82, - 128, 67, 85, 80, 128, 67, 85, 208, 67, 85, 79, 88, 128, 67, 85, 79, 80, - 128, 67, 85, 79, 128, 67, 85, 205, 67, 85, 66, 69, 68, 128, 67, 85, 66, - 197, 67, 85, 65, 84, 82, 73, 76, 76, 79, 128, 67, 85, 65, 84, 82, 73, 76, - 76, 207, 67, 85, 128, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, - 195, 67, 82, 85, 90, 69, 73, 82, 207, 67, 82, 79, 83, 83, 73, 78, 199, - 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 67, 82, 79, 83, 83, 69, 68, 45, - 84, 65, 73, 76, 128, 67, 82, 79, 83, 83, 69, 196, 67, 82, 79, 83, 83, 66, - 79, 78, 69, 83, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, 67, - 82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 69, 83, 67, 69, 78, 84, + 68, 73, 90, 90, 217, 68, 73, 86, 79, 82, 67, 197, 68, 73, 86, 73, 83, 73, + 79, 78, 128, 68, 73, 86, 73, 83, 73, 79, 206, 68, 73, 86, 73, 78, 65, 84, + 73, 79, 78, 128, 68, 73, 86, 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, + 82, 128, 68, 73, 86, 73, 68, 69, 196, 68, 73, 86, 73, 68, 69, 128, 68, + 73, 86, 73, 68, 197, 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 73, + 84, 84, 207, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, 73, 83, 84, + 73, 78, 71, 85, 73, 83, 72, 128, 68, 73, 83, 84, 73, 76, 76, 128, 68, 73, + 83, 83, 79, 76, 86, 69, 45, 50, 128, 68, 73, 83, 83, 79, 76, 86, 69, 128, + 68, 73, 83, 80, 69, 82, 83, 73, 79, 78, 128, 68, 73, 83, 75, 128, 68, 73, + 83, 73, 77, 79, 85, 128, 68, 73, 83, 72, 128, 68, 73, 83, 67, 79, 78, 84, + 73, 78, 85, 79, 85, 211, 68, 73, 83, 195, 68, 73, 83, 65, 80, 80, 79, 73, + 78, 84, 69, 196, 68, 73, 83, 65, 66, 76, 69, 196, 68, 73, 82, 71, 193, + 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, + 204, 68, 73, 80, 84, 69, 128, 68, 73, 80, 80, 69, 82, 128, 68, 73, 80, + 76, 79, 85, 78, 128, 68, 73, 80, 76, 73, 128, 68, 73, 80, 76, 201, 68, + 73, 78, 71, 66, 65, 212, 68, 73, 206, 68, 73, 77, 77, 73, 78, 71, 128, + 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 51, 128, 68, 73, 77, 73, 78, + 85, 84, 73, 79, 78, 45, 50, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, + 45, 49, 128, 68, 73, 77, 73, 78, 73, 83, 72, 77, 69, 78, 84, 128, 68, 73, + 77, 73, 68, 73, 193, 68, 73, 77, 69, 78, 83, 73, 79, 78, 65, 204, 68, 73, + 77, 69, 78, 83, 73, 79, 206, 68, 73, 77, 50, 128, 68, 73, 76, 128, 68, + 73, 71, 82, 65, 80, 72, 128, 68, 73, 71, 82, 65, 80, 200, 68, 73, 71, 82, + 65, 77, 77, 79, 211, 68, 73, 71, 82, 65, 77, 77, 193, 68, 73, 71, 82, 65, + 205, 68, 73, 71, 79, 82, 71, 79, 78, 128, 68, 73, 71, 79, 82, 71, 79, + 206, 68, 73, 71, 65, 77, 77, 65, 128, 68, 73, 71, 193, 68, 73, 70, 84, + 79, 71, 71, 79, 211, 68, 73, 70, 79, 78, 73, 65, 83, 128, 68, 73, 70, 70, + 73, 67, 85, 76, 84, 217, 68, 73, 70, 70, 73, 67, 85, 76, 84, 73, 69, 83, + 128, 68, 73, 70, 70, 69, 82, 69, 78, 84, 73, 65, 76, 128, 68, 73, 70, 70, + 69, 82, 69, 78, 67, 197, 68, 73, 70, 65, 84, 128, 68, 73, 69, 83, 73, 83, + 128, 68, 73, 69, 83, 73, 211, 68, 73, 69, 80, 128, 68, 73, 197, 68, 73, + 66, 128, 68, 73, 65, 84, 79, 78, 79, 206, 68, 73, 65, 84, 79, 78, 73, 75, + 201, 68, 73, 65, 83, 84, 79, 76, 201, 68, 73, 65, 77, 79, 78, 68, 83, + 128, 68, 73, 65, 77, 79, 78, 68, 128, 68, 73, 65, 77, 79, 78, 196, 68, + 73, 65, 77, 69, 84, 69, 210, 68, 73, 65, 76, 89, 84, 73, 75, 65, 128, 68, + 73, 65, 76, 89, 84, 73, 75, 193, 68, 73, 65, 76, 69, 67, 84, 45, 208, 68, + 73, 65, 71, 79, 78, 65, 76, 128, 68, 73, 65, 71, 79, 78, 65, 204, 68, 73, + 65, 69, 82, 69, 83, 73, 90, 69, 196, 68, 73, 65, 69, 82, 69, 83, 73, 83, + 128, 68, 73, 65, 69, 82, 69, 83, 73, 211, 68, 72, 79, 85, 128, 68, 72, + 79, 79, 128, 68, 72, 79, 128, 68, 72, 73, 128, 68, 72, 72, 85, 128, 68, + 72, 72, 79, 79, 128, 68, 72, 72, 79, 128, 68, 72, 72, 73, 128, 68, 72, + 72, 69, 69, 128, 68, 72, 72, 69, 128, 68, 72, 72, 65, 128, 68, 72, 69, + 69, 128, 68, 72, 65, 82, 77, 65, 128, 68, 72, 65, 76, 69, 84, 72, 128, + 68, 72, 65, 76, 65, 84, 72, 128, 68, 72, 65, 76, 128, 68, 72, 65, 68, 72, + 69, 128, 68, 72, 65, 65, 76, 85, 128, 68, 72, 65, 128, 68, 69, 90, 200, + 68, 69, 89, 84, 69, 82, 79, 213, 68, 69, 89, 84, 69, 82, 79, 211, 68, 69, + 88, 73, 65, 128, 68, 69, 86, 73, 67, 197, 68, 69, 86, 69, 76, 79, 80, 77, + 69, 78, 84, 128, 68, 69, 85, 78, 71, 128, 68, 69, 83, 203, 68, 69, 83, + 73, 71, 78, 128, 68, 69, 83, 73, 128, 68, 69, 83, 67, 82, 73, 80, 84, 73, + 79, 206, 68, 69, 83, 67, 69, 78, 68, 73, 78, 199, 68, 69, 83, 67, 69, 78, + 68, 69, 82, 128, 68, 69, 82, 69, 84, 45, 72, 73, 68, 69, 84, 128, 68, 69, + 82, 69, 84, 128, 68, 69, 80, 65, 82, 84, 85, 82, 69, 128, 68, 69, 80, 65, + 82, 84, 77, 69, 78, 212, 68, 69, 80, 65, 82, 84, 73, 78, 199, 68, 69, 78, + 84, 73, 83, 84, 82, 217, 68, 69, 78, 84, 65, 204, 68, 69, 78, 79, 77, 73, + 78, 65, 84, 79, 82, 128, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, + 69, 78, 78, 69, 78, 128, 68, 69, 78, 71, 128, 68, 69, 78, 197, 68, 69, + 78, 65, 82, 73, 85, 211, 68, 69, 76, 84, 65, 128, 68, 69, 76, 84, 193, + 68, 69, 76, 84, 128, 68, 69, 76, 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, + 82, 217, 68, 69, 76, 73, 86, 69, 82, 65, 78, 67, 69, 128, 68, 69, 76, 73, + 77, 73, 84, 69, 82, 128, 68, 69, 76, 73, 77, 73, 84, 69, 210, 68, 69, 76, + 73, 67, 73, 79, 85, 211, 68, 69, 76, 69, 84, 69, 128, 68, 69, 76, 69, 84, + 197, 68, 69, 75, 65, 128, 68, 69, 75, 128, 68, 69, 73, 128, 68, 69, 72, + 73, 128, 68, 69, 71, 82, 69, 197, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, + 128, 68, 69, 70, 69, 67, 84, 73, 86, 69, 78, 69, 83, 211, 68, 69, 69, 82, + 128, 68, 69, 69, 80, 76, 89, 128, 68, 69, 69, 76, 128, 68, 69, 67, 82, + 69, 83, 67, 69, 78, 68, 79, 128, 68, 69, 67, 82, 69, 65, 83, 69, 128, 68, + 69, 67, 79, 82, 65, 84, 73, 86, 197, 68, 69, 67, 79, 82, 65, 84, 73, 79, + 78, 128, 68, 69, 67, 73, 83, 73, 86, 69, 78, 69, 83, 83, 128, 68, 69, 67, + 73, 77, 65, 204, 68, 69, 67, 73, 68, 85, 79, 85, 211, 68, 69, 67, 69, 77, + 66, 69, 82, 128, 68, 69, 67, 65, 89, 69, 68, 128, 68, 69, 66, 73, 212, + 68, 69, 65, 84, 72, 128, 68, 69, 65, 68, 128, 68, 68, 87, 65, 128, 68, + 68, 85, 88, 128, 68, 68, 85, 84, 128, 68, 68, 85, 82, 88, 128, 68, 68, + 85, 82, 128, 68, 68, 85, 80, 128, 68, 68, 85, 79, 88, 128, 68, 68, 85, + 79, 80, 128, 68, 68, 85, 79, 128, 68, 68, 85, 128, 68, 68, 79, 88, 128, + 68, 68, 79, 84, 128, 68, 68, 79, 80, 128, 68, 68, 79, 65, 128, 68, 68, + 73, 88, 128, 68, 68, 73, 84, 128, 68, 68, 73, 80, 128, 68, 68, 73, 69, + 88, 128, 68, 68, 73, 69, 80, 128, 68, 68, 73, 69, 128, 68, 68, 73, 128, + 68, 68, 72, 85, 128, 68, 68, 72, 79, 128, 68, 68, 72, 73, 128, 68, 68, + 72, 69, 69, 128, 68, 68, 72, 69, 128, 68, 68, 72, 65, 65, 128, 68, 68, + 72, 65, 128, 68, 68, 69, 88, 128, 68, 68, 69, 80, 128, 68, 68, 69, 69, + 128, 68, 68, 69, 128, 68, 68, 68, 72, 65, 128, 68, 68, 68, 65, 128, 68, + 68, 65, 89, 65, 78, 78, 65, 128, 68, 68, 65, 88, 128, 68, 68, 65, 84, + 128, 68, 68, 65, 80, 128, 68, 68, 65, 76, 128, 68, 68, 65, 204, 68, 68, + 65, 72, 65, 76, 128, 68, 68, 65, 72, 65, 204, 68, 68, 65, 65, 128, 68, + 194, 68, 65, 89, 45, 78, 73, 71, 72, 84, 128, 68, 65, 217, 68, 65, 86, + 73, 89, 65, 78, 73, 128, 68, 65, 86, 73, 68, 128, 68, 65, 84, 197, 68, + 65, 83, 73, 65, 128, 68, 65, 83, 72, 69, 196, 68, 65, 83, 72, 128, 68, + 65, 83, 200, 68, 65, 83, 69, 73, 65, 128, 68, 65, 82, 84, 128, 68, 65, + 82, 75, 69, 78, 73, 78, 71, 128, 68, 65, 82, 75, 69, 78, 73, 78, 199, 68, + 65, 82, 203, 68, 65, 82, 71, 65, 128, 68, 65, 82, 65, 52, 128, 68, 65, + 82, 65, 51, 128, 68, 65, 82, 128, 68, 65, 80, 45, 80, 82, 65, 205, 68, + 65, 80, 45, 80, 73, 201, 68, 65, 80, 45, 77, 85, 79, 217, 68, 65, 80, 45, + 66, 85, 79, 206, 68, 65, 80, 45, 66, 69, 201, 68, 65, 208, 68, 65, 78, + 84, 65, 74, 193, 68, 65, 78, 71, 79, 128, 68, 65, 78, 71, 128, 68, 65, + 78, 199, 68, 65, 78, 68, 65, 128, 68, 65, 78, 67, 69, 82, 128, 68, 65, + 77, 80, 128, 68, 65, 77, 208, 68, 65, 77, 77, 65, 84, 65, 78, 128, 68, + 65, 77, 77, 65, 84, 65, 206, 68, 65, 77, 77, 65, 128, 68, 65, 77, 77, + 193, 68, 65, 77, 65, 82, 85, 128, 68, 65, 76, 69, 84, 72, 128, 68, 65, + 76, 69, 84, 128, 68, 65, 76, 69, 212, 68, 65, 76, 68, 65, 128, 68, 65, + 76, 65, 84, 72, 128, 68, 65, 76, 65, 84, 200, 68, 65, 76, 65, 84, 128, + 68, 65, 73, 82, 128, 68, 65, 73, 78, 71, 128, 68, 65, 72, 89, 65, 65, 85, + 83, 72, 45, 50, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 128, 68, 65, 71, + 83, 128, 68, 65, 71, 71, 69, 82, 128, 68, 65, 71, 69, 83, 72, 128, 68, + 65, 71, 69, 83, 200, 68, 65, 71, 66, 65, 83, 73, 78, 78, 65, 128, 68, 65, + 71, 65, 218, 68, 65, 71, 65, 76, 71, 65, 128, 68, 65, 199, 68, 65, 69, + 78, 71, 128, 68, 65, 69, 199, 68, 65, 68, 128, 68, 65, 196, 68, 65, 65, + 83, 85, 128, 68, 65, 65, 68, 72, 85, 128, 68, 48, 54, 55, 72, 128, 68, + 48, 54, 55, 71, 128, 68, 48, 54, 55, 70, 128, 68, 48, 54, 55, 69, 128, + 68, 48, 54, 55, 68, 128, 68, 48, 54, 55, 67, 128, 68, 48, 54, 55, 66, + 128, 68, 48, 54, 55, 65, 128, 68, 48, 54, 55, 128, 68, 48, 54, 54, 128, + 68, 48, 54, 53, 128, 68, 48, 54, 52, 128, 68, 48, 54, 51, 128, 68, 48, + 54, 50, 128, 68, 48, 54, 49, 128, 68, 48, 54, 48, 128, 68, 48, 53, 57, + 128, 68, 48, 53, 56, 128, 68, 48, 53, 55, 128, 68, 48, 53, 54, 128, 68, + 48, 53, 53, 128, 68, 48, 53, 52, 65, 128, 68, 48, 53, 52, 128, 68, 48, + 53, 51, 128, 68, 48, 53, 50, 65, 128, 68, 48, 53, 50, 128, 68, 48, 53, + 49, 128, 68, 48, 53, 48, 73, 128, 68, 48, 53, 48, 72, 128, 68, 48, 53, + 48, 71, 128, 68, 48, 53, 48, 70, 128, 68, 48, 53, 48, 69, 128, 68, 48, + 53, 48, 68, 128, 68, 48, 53, 48, 67, 128, 68, 48, 53, 48, 66, 128, 68, + 48, 53, 48, 65, 128, 68, 48, 53, 48, 128, 68, 48, 52, 57, 128, 68, 48, + 52, 56, 65, 128, 68, 48, 52, 56, 128, 68, 48, 52, 55, 128, 68, 48, 52, + 54, 65, 128, 68, 48, 52, 54, 128, 68, 48, 52, 53, 128, 68, 48, 52, 52, + 128, 68, 48, 52, 51, 128, 68, 48, 52, 50, 128, 68, 48, 52, 49, 128, 68, + 48, 52, 48, 128, 68, 48, 51, 57, 128, 68, 48, 51, 56, 128, 68, 48, 51, + 55, 128, 68, 48, 51, 54, 128, 68, 48, 51, 53, 128, 68, 48, 51, 52, 65, + 128, 68, 48, 51, 52, 128, 68, 48, 51, 51, 128, 68, 48, 51, 50, 128, 68, + 48, 51, 49, 65, 128, 68, 48, 51, 49, 128, 68, 48, 51, 48, 128, 68, 48, + 50, 57, 128, 68, 48, 50, 56, 128, 68, 48, 50, 55, 65, 128, 68, 48, 50, + 55, 128, 68, 48, 50, 54, 128, 68, 48, 50, 53, 128, 68, 48, 50, 52, 128, + 68, 48, 50, 51, 128, 68, 48, 50, 50, 128, 68, 48, 50, 49, 128, 68, 48, + 50, 48, 128, 68, 48, 49, 57, 128, 68, 48, 49, 56, 128, 68, 48, 49, 55, + 128, 68, 48, 49, 54, 128, 68, 48, 49, 53, 128, 68, 48, 49, 52, 128, 68, + 48, 49, 51, 128, 68, 48, 49, 50, 128, 68, 48, 49, 49, 128, 68, 48, 49, + 48, 128, 68, 48, 48, 57, 128, 68, 48, 48, 56, 65, 128, 68, 48, 48, 56, + 128, 68, 48, 48, 55, 128, 68, 48, 48, 54, 128, 68, 48, 48, 53, 128, 68, + 48, 48, 52, 128, 68, 48, 48, 51, 128, 68, 48, 48, 50, 128, 68, 48, 48, + 49, 128, 67, 89, 88, 128, 67, 89, 84, 128, 67, 89, 82, 88, 128, 67, 89, + 82, 69, 78, 65, 73, 195, 67, 89, 82, 128, 67, 89, 80, 82, 73, 79, 212, + 67, 89, 80, 69, 82, 85, 83, 128, 67, 89, 80, 128, 67, 89, 76, 73, 78, 68, + 82, 73, 67, 73, 84, 89, 128, 67, 89, 67, 76, 79, 78, 69, 128, 67, 89, 65, + 128, 67, 89, 128, 67, 87, 79, 79, 128, 67, 87, 79, 128, 67, 87, 73, 73, + 128, 67, 87, 73, 128, 67, 87, 69, 79, 82, 84, 72, 128, 67, 87, 69, 128, + 67, 87, 65, 65, 128, 67, 85, 88, 128, 67, 85, 212, 67, 85, 83, 84, 79, + 77, 83, 128, 67, 85, 83, 84, 79, 77, 69, 210, 67, 85, 83, 84, 65, 82, 68, + 128, 67, 85, 82, 88, 128, 67, 85, 82, 86, 73, 78, 199, 67, 85, 82, 86, + 69, 196, 67, 85, 82, 86, 69, 128, 67, 85, 82, 86, 197, 67, 85, 82, 82, + 217, 67, 85, 82, 82, 69, 78, 84, 128, 67, 85, 82, 82, 69, 78, 212, 67, + 85, 82, 76, 217, 67, 85, 82, 76, 128, 67, 85, 82, 128, 67, 85, 80, 128, + 67, 85, 79, 88, 128, 67, 85, 79, 80, 128, 67, 85, 79, 128, 67, 85, 205, + 67, 85, 66, 69, 68, 128, 67, 85, 66, 197, 67, 85, 65, 84, 82, 73, 76, 76, + 79, 128, 67, 85, 65, 84, 82, 73, 76, 76, 207, 67, 85, 128, 67, 82, 89, + 83, 84, 65, 204, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, 195, 67, + 82, 89, 73, 78, 199, 67, 82, 85, 90, 69, 73, 82, 207, 67, 82, 85, 67, 73, + 66, 76, 69, 45, 53, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 52, 128, 67, + 82, 85, 67, 73, 66, 76, 69, 45, 51, 128, 67, 82, 85, 67, 73, 66, 76, 69, + 45, 50, 128, 67, 82, 85, 67, 73, 66, 76, 69, 128, 67, 82, 79, 87, 78, + 128, 67, 82, 79, 83, 83, 73, 78, 71, 128, 67, 82, 79, 83, 83, 73, 78, + 199, 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 67, 82, 79, 83, 83, 69, 68, + 45, 84, 65, 73, 76, 128, 67, 82, 79, 83, 83, 69, 196, 67, 82, 79, 83, 83, + 66, 79, 78, 69, 83, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, + 67, 82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 79, 67, 85, 211, + 67, 82, 79, 67, 79, 68, 73, 76, 69, 128, 67, 82, 69, 83, 67, 69, 78, 84, 128, 67, 82, 69, 83, 67, 69, 78, 212, 67, 82, 69, 68, 73, 212, 67, 82, - 69, 65, 84, 73, 86, 197, 67, 79, 88, 128, 67, 79, 87, 128, 67, 79, 86, - 69, 82, 128, 67, 79, 85, 78, 84, 73, 78, 199, 67, 79, 85, 78, 84, 69, 82, - 83, 73, 78, 75, 128, 67, 79, 85, 78, 84, 69, 82, 66, 79, 82, 69, 128, 67, - 79, 85, 78, 67, 73, 204, 67, 79, 84, 128, 67, 79, 82, 82, 69, 83, 80, 79, - 78, 68, 211, 67, 79, 82, 82, 69, 67, 84, 128, 67, 79, 82, 80, 83, 69, - 128, 67, 79, 82, 80, 79, 82, 65, 84, 73, 79, 78, 128, 67, 79, 82, 79, 78, - 73, 83, 128, 67, 79, 82, 78, 69, 82, 83, 128, 67, 79, 82, 78, 69, 82, - 128, 67, 79, 82, 78, 69, 210, 67, 79, 80, 89, 82, 73, 71, 72, 84, 128, - 67, 79, 80, 89, 82, 73, 71, 72, 212, 67, 79, 80, 89, 128, 67, 79, 80, 82, - 79, 68, 85, 67, 84, 128, 67, 79, 80, 128, 67, 79, 79, 128, 67, 79, 78, - 86, 69, 82, 71, 73, 78, 199, 67, 79, 78, 84, 82, 79, 204, 67, 79, 78, 84, - 82, 65, 82, 73, 69, 84, 89, 128, 67, 79, 78, 84, 82, 65, 67, 84, 73, 79, - 78, 128, 67, 79, 78, 84, 79, 85, 82, 69, 196, 67, 79, 78, 84, 79, 85, - 210, 67, 79, 78, 84, 69, 78, 84, 73, 79, 78, 128, 67, 79, 78, 84, 69, 77, - 80, 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 84, 65, 73, 78, 211, 67, 79, - 78, 84, 65, 73, 78, 73, 78, 199, 67, 79, 78, 84, 65, 73, 206, 67, 79, 78, - 84, 65, 67, 84, 128, 67, 79, 78, 83, 84, 65, 78, 84, 128, 67, 79, 78, 83, - 84, 65, 78, 212, 67, 79, 78, 83, 84, 65, 78, 67, 89, 128, 67, 79, 78, 83, - 79, 78, 65, 78, 212, 67, 79, 78, 83, 69, 67, 85, 84, 73, 86, 197, 67, 79, - 78, 74, 85, 78, 67, 84, 73, 79, 78, 128, 67, 79, 78, 74, 85, 71, 65, 84, - 197, 67, 79, 78, 74, 79, 73, 78, 73, 78, 199, 67, 79, 78, 73, 67, 65, - 204, 67, 79, 78, 71, 82, 85, 69, 78, 212, 67, 79, 78, 71, 82, 65, 84, 85, - 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 70, 76, 73, 67, 84, 128, 67, 79, - 78, 67, 65, 86, 69, 45, 83, 73, 68, 69, 196, 67, 79, 78, 67, 65, 86, 69, - 45, 80, 79, 73, 78, 84, 69, 196, 67, 79, 78, 128, 67, 79, 77, 80, 79, 83, - 73, 84, 73, 79, 78, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, - 79, 77, 80, 76, 73, 65, 78, 67, 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, - 79, 78, 128, 67, 79, 77, 80, 76, 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, - 69, 77, 69, 78, 84, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, 77, 77, - 79, 206, 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, 65, - 128, 67, 79, 77, 77, 193, 67, 79, 77, 73, 78, 199, 67, 79, 77, 69, 84, - 128, 67, 79, 77, 66, 128, 67, 79, 76, 85, 77, 78, 128, 67, 79, 76, 79, - 82, 128, 67, 79, 76, 76, 128, 67, 79, 70, 70, 73, 78, 128, 67, 79, 69, - 78, 71, 128, 67, 79, 68, 65, 128, 67, 79, 65, 128, 67, 79, 128, 67, 77, - 128, 67, 205, 67, 76, 85, 83, 84, 69, 210, 67, 76, 85, 66, 45, 83, 80, - 79, 75, 69, 196, 67, 76, 85, 66, 128, 67, 76, 85, 194, 67, 76, 79, 85, - 68, 128, 67, 76, 79, 85, 196, 67, 76, 79, 84, 72, 69, 83, 128, 67, 76, - 79, 84, 72, 128, 67, 76, 79, 83, 69, 78, 69, 83, 83, 128, 67, 76, 79, 83, - 69, 68, 128, 67, 76, 79, 83, 69, 196, 67, 76, 79, 83, 197, 67, 76, 79, - 67, 75, 87, 73, 83, 197, 67, 76, 73, 86, 73, 83, 128, 67, 76, 73, 78, 71, - 73, 78, 199, 67, 76, 73, 77, 65, 67, 85, 83, 128, 67, 76, 73, 70, 70, - 128, 67, 76, 73, 67, 75, 128, 67, 76, 69, 70, 45, 50, 128, 67, 76, 69, - 70, 45, 49, 128, 67, 76, 69, 70, 128, 67, 76, 69, 198, 67, 76, 69, 65, - 210, 67, 76, 65, 87, 128, 67, 76, 65, 78, 128, 67, 73, 88, 128, 67, 73, - 86, 73, 76, 73, 65, 78, 128, 67, 73, 84, 128, 67, 73, 82, 67, 85, 77, 70, - 76, 69, 88, 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, 67, 73, 82, 67, - 85, 76, 65, 84, 73, 79, 206, 67, 73, 82, 67, 76, 69, 83, 128, 67, 73, 82, - 67, 76, 69, 128, 67, 73, 80, 128, 67, 73, 73, 128, 67, 73, 69, 88, 128, - 67, 73, 69, 85, 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, - 73, 69, 85, 67, 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, - 69, 85, 78, 71, 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, - 69, 80, 128, 67, 73, 69, 128, 67, 73, 128, 67, 72, 89, 88, 128, 67, 72, - 89, 84, 128, 67, 72, 89, 82, 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, - 80, 128, 67, 72, 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, - 67, 72, 128, 67, 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, - 88, 128, 67, 72, 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, - 79, 128, 67, 72, 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, - 65, 78, 84, 72, 69, 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, - 72, 82, 79, 78, 79, 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, - 193, 67, 72, 82, 73, 86, 73, 128, 67, 72, 79, 88, 128, 67, 72, 79, 84, - 128, 67, 72, 79, 82, 69, 86, 77, 193, 67, 72, 79, 80, 128, 67, 72, 79, - 75, 69, 128, 67, 72, 79, 69, 128, 67, 72, 79, 65, 128, 67, 72, 79, 128, - 67, 72, 207, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, - 79, 83, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, - 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, 67, - 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, - 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, 79, 78, 128, - 67, 72, 73, 82, 69, 84, 128, 67, 72, 73, 78, 71, 128, 67, 72, 73, 78, 69, - 83, 197, 67, 72, 73, 78, 128, 67, 72, 73, 76, 76, 213, 67, 72, 73, 76, - 68, 128, 67, 72, 73, 76, 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, - 67, 72, 45, 75, 72, 73, 69, 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, - 45, 72, 73, 69, 85, 72, 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, - 128, 67, 72, 201, 67, 72, 72, 65, 128, 67, 72, 69, 88, 128, 67, 72, 69, - 86, 82, 79, 206, 67, 72, 69, 84, 128, 67, 72, 69, 83, 211, 67, 72, 69, - 80, 128, 67, 72, 69, 206, 67, 72, 69, 73, 78, 65, 80, 128, 67, 72, 69, - 73, 75, 72, 69, 73, 128, 67, 72, 69, 69, 128, 67, 72, 69, 67, 75, 128, - 67, 72, 69, 67, 203, 67, 72, 197, 67, 72, 65, 88, 128, 67, 72, 65, 86, - 73, 89, 65, 78, 73, 128, 67, 72, 65, 84, 84, 65, 87, 65, 128, 67, 72, 65, - 84, 128, 67, 72, 65, 82, 73, 79, 84, 128, 67, 72, 65, 82, 73, 79, 212, - 67, 72, 65, 82, 65, 67, 84, 69, 82, 83, 128, 67, 72, 65, 82, 65, 67, 84, - 69, 82, 128, 67, 72, 65, 82, 128, 67, 72, 65, 80, 128, 67, 72, 65, 78, - 71, 69, 128, 67, 72, 65, 78, 71, 128, 67, 72, 65, 78, 128, 67, 72, 65, - 77, 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, 77, 73, - 76, 73, 128, 67, 72, 65, 73, 82, 128, 67, 72, 65, 73, 78, 83, 128, 67, - 72, 65, 68, 65, 128, 67, 72, 65, 196, 67, 72, 65, 65, 128, 67, 69, 88, - 128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 75, 128, 67, 69, 82, 45, - 87, 65, 128, 67, 69, 80, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, - 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, - 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, - 71, 67, 72, 73, 69, 85, 77, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, - 72, 73, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, - 73, 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, - 73, 65, 204, 67, 69, 78, 84, 82, 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, - 69, 196, 67, 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, - 78, 128, 67, 69, 76, 83, 73, 85, 83, 128, 67, 69, 73, 82, 84, 128, 67, - 69, 73, 76, 73, 78, 71, 128, 67, 69, 69, 128, 67, 69, 68, 73, 76, 76, 65, - 128, 67, 69, 68, 73, 76, 76, 193, 67, 69, 68, 201, 67, 69, 67, 69, 75, - 128, 67, 69, 67, 65, 75, 128, 67, 69, 67, 65, 203, 67, 69, 65, 76, 67, - 128, 67, 67, 85, 128, 67, 67, 79, 128, 67, 67, 73, 128, 67, 67, 72, 85, - 128, 67, 67, 72, 79, 128, 67, 67, 72, 73, 128, 67, 67, 72, 69, 69, 128, - 67, 67, 72, 69, 128, 67, 67, 72, 65, 65, 128, 67, 67, 72, 65, 128, 67, - 67, 69, 69, 128, 67, 67, 69, 128, 67, 67, 65, 65, 128, 67, 67, 65, 128, - 67, 65, 89, 78, 128, 67, 65, 89, 65, 78, 78, 65, 128, 67, 65, 88, 128, - 67, 65, 86, 69, 128, 67, 65, 85, 84, 73, 79, 206, 67, 65, 85, 76, 68, 82, - 79, 78, 128, 67, 65, 85, 68, 65, 128, 67, 65, 84, 65, 87, 65, 128, 67, - 65, 84, 128, 67, 65, 83, 84, 76, 69, 128, 67, 65, 82, 89, 83, 84, 73, 65, - 206, 67, 65, 82, 84, 128, 67, 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, - 80, 69, 78, 84, 82, 217, 67, 65, 82, 79, 78, 128, 67, 65, 82, 79, 206, - 67, 65, 82, 73, 203, 67, 65, 82, 73, 65, 206, 67, 65, 82, 69, 84, 128, - 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, 65, 82, 128, 67, 65, 210, 67, - 65, 80, 84, 73, 86, 69, 128, 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, - 65, 80, 79, 128, 67, 65, 80, 73, 84, 65, 76, 128, 67, 65, 78, 84, 73, 76, - 76, 65, 84, 73, 79, 206, 67, 65, 78, 199, 67, 65, 78, 68, 82, 65, 66, 73, - 78, 68, 85, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 213, 67, 65, 78, - 68, 82, 65, 128, 67, 65, 78, 68, 82, 193, 67, 65, 78, 67, 69, 82, 128, - 67, 65, 78, 67, 69, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, - 128, 67, 65, 78, 67, 69, 204, 67, 65, 78, 128, 67, 65, 77, 78, 85, 195, - 67, 65, 76, 89, 65, 128, 67, 65, 76, 89, 193, 67, 65, 76, 76, 128, 67, - 65, 76, 67, 128, 67, 65, 75, 82, 65, 128, 67, 65, 69, 83, 85, 82, 65, - 128, 67, 65, 68, 85, 67, 69, 85, 83, 128, 67, 65, 68, 193, 67, 65, 65, - 78, 71, 128, 67, 65, 65, 73, 128, 67, 193, 67, 48, 50, 52, 128, 67, 48, - 50, 51, 128, 67, 48, 50, 50, 128, 67, 48, 50, 49, 128, 67, 48, 50, 48, - 128, 67, 48, 49, 57, 128, 67, 48, 49, 56, 128, 67, 48, 49, 55, 128, 67, - 48, 49, 54, 128, 67, 48, 49, 53, 128, 67, 48, 49, 52, 128, 67, 48, 49, - 51, 128, 67, 48, 49, 50, 128, 67, 48, 49, 49, 128, 67, 48, 49, 48, 65, - 128, 67, 48, 49, 48, 128, 67, 48, 48, 57, 128, 67, 48, 48, 56, 128, 67, - 48, 48, 55, 128, 67, 48, 48, 54, 128, 67, 48, 48, 53, 128, 67, 48, 48, - 52, 128, 67, 48, 48, 51, 128, 67, 48, 48, 50, 67, 128, 67, 48, 48, 50, - 66, 128, 67, 48, 48, 50, 65, 128, 67, 48, 48, 50, 128, 67, 48, 48, 49, - 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 67, 45, 51, 57, - 128, 67, 45, 49, 56, 128, 66, 90, 85, 78, 199, 66, 90, 72, 201, 66, 89, - 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, 73, 78, 73, - 65, 206, 66, 217, 66, 88, 71, 128, 66, 87, 73, 128, 66, 87, 69, 69, 128, - 66, 87, 69, 128, 66, 87, 65, 128, 66, 85, 85, 77, 73, 83, 72, 128, 66, - 85, 212, 66, 85, 83, 83, 89, 69, 82, 85, 128, 66, 85, 82, 213, 66, 85, - 82, 50, 128, 66, 85, 210, 66, 85, 79, 88, 128, 66, 85, 79, 80, 128, 66, - 85, 79, 128, 66, 85, 77, 80, 217, 66, 85, 76, 85, 71, 128, 66, 85, 76, - 85, 199, 66, 85, 76, 76, 83, 69, 89, 69, 128, 66, 85, 76, 76, 211, 66, - 85, 76, 76, 69, 84, 128, 66, 85, 76, 76, 69, 212, 66, 85, 76, 76, 128, - 66, 85, 75, 89, 128, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, 69, 83, - 197, 66, 85, 67, 75, 76, 69, 128, 66, 83, 84, 65, 82, 128, 66, 83, 75, - 85, 210, 66, 83, 75, 65, 173, 66, 83, 68, 85, 211, 66, 82, 85, 83, 72, - 128, 66, 82, 85, 83, 200, 66, 82, 79, 78, 90, 69, 128, 66, 82, 79, 75, - 69, 206, 66, 82, 79, 65, 196, 66, 82, 73, 83, 84, 76, 69, 128, 66, 82, - 73, 68, 71, 197, 66, 82, 69, 86, 73, 83, 128, 66, 82, 69, 86, 69, 45, 77, - 65, 67, 82, 79, 78, 128, 66, 82, 69, 86, 197, 66, 82, 69, 65, 84, 200, - 66, 82, 69, 65, 75, 84, 72, 82, 79, 85, 71, 72, 128, 66, 82, 68, 193, 66, - 82, 65, 78, 67, 72, 73, 78, 199, 66, 82, 65, 78, 67, 72, 128, 66, 82, 65, - 78, 67, 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, 82, 65, 67, 75, 69, 84, - 69, 196, 66, 82, 65, 67, 75, 69, 212, 66, 82, 65, 67, 69, 128, 66, 81, - 128, 66, 79, 87, 84, 73, 69, 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, - 128, 66, 79, 215, 66, 79, 85, 78, 68, 65, 82, 217, 66, 79, 84, 84, 79, - 77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, 79, 77, 128, 66, 79, - 84, 84, 79, 205, 66, 79, 82, 85, 84, 79, 128, 66, 79, 79, 77, 69, 82, 65, - 78, 71, 128, 66, 79, 78, 69, 128, 66, 79, 76, 212, 66, 79, 68, 89, 128, - 66, 79, 65, 82, 128, 66, 79, 65, 128, 66, 76, 85, 69, 128, 66, 76, 79, - 79, 68, 128, 66, 76, 79, 67, 75, 128, 66, 76, 69, 78, 68, 69, 196, 66, - 76, 65, 78, 75, 128, 66, 76, 65, 78, 203, 66, 76, 65, 68, 197, 66, 76, - 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, 75, 45, 76, 69, 84, 84, 69, - 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 66, 76, - 65, 67, 75, 128, 66, 75, 65, 173, 66, 73, 84, 84, 69, 82, 128, 66, 73, - 84, 73, 78, 199, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 73, 83, 72, 79, - 80, 128, 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, 73, 83, 65, 72, 128, - 66, 73, 82, 85, 128, 66, 73, 82, 71, 65, 128, 66, 73, 82, 68, 128, 66, - 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 78, 79, 67, 85, 76, 65, 210, 66, - 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, 128, 66, 73, 78, 65, 82, - 217, 66, 73, 76, 65, 66, 73, 65, 204, 66, 73, 71, 128, 66, 73, 199, 66, - 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66, 73, 66, 76, 69, 45, - 67, 82, 69, 197, 66, 73, 66, 128, 66, 201, 66, 72, 85, 128, 66, 72, 79, - 79, 128, 66, 72, 79, 128, 66, 72, 73, 128, 66, 72, 69, 84, 72, 128, 66, - 72, 69, 69, 128, 66, 72, 69, 128, 66, 72, 65, 77, 128, 66, 72, 65, 128, - 66, 69, 89, 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, - 69, 128, 66, 69, 84, 87, 69, 69, 78, 128, 66, 69, 84, 87, 69, 69, 206, - 66, 69, 84, 72, 128, 66, 69, 84, 65, 128, 66, 69, 84, 193, 66, 69, 84, - 128, 66, 69, 212, 66, 69, 83, 73, 68, 197, 66, 69, 82, 75, 65, 78, 65, - 206, 66, 69, 82, 66, 69, 210, 66, 69, 80, 128, 66, 69, 79, 82, 195, 66, - 69, 78, 90, 69, 78, 197, 66, 69, 78, 68, 69, 128, 66, 69, 78, 68, 128, - 66, 69, 206, 66, 69, 76, 84, 128, 66, 69, 76, 212, 66, 69, 76, 79, 215, - 66, 69, 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, - 66, 69, 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, - 128, 66, 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, - 78, 78, 73, 78, 71, 128, 66, 69, 71, 73, 206, 66, 69, 70, 79, 82, 197, - 66, 69, 69, 84, 65, 128, 66, 69, 69, 72, 73, 86, 69, 128, 66, 69, 69, 72, - 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, 65, 86, - 69, 210, 66, 69, 65, 84, 128, 66, 69, 65, 78, 128, 66, 69, 65, 77, 69, - 196, 66, 67, 65, 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, 66, 66, - 89, 84, 128, 66, 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, 88, 128, - 66, 66, 85, 84, 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, 128, 66, - 66, 85, 80, 128, 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, 128, 66, - 66, 85, 79, 128, 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, 79, 84, - 128, 66, 66, 79, 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, 66, 66, - 73, 84, 128, 66, 66, 73, 80, 128, 66, 66, 73, 69, 88, 128, 66, 66, 73, - 69, 84, 128, 66, 66, 73, 69, 80, 128, 66, 66, 73, 69, 128, 66, 66, 73, - 128, 66, 66, 69, 88, 128, 66, 66, 69, 80, 128, 66, 66, 69, 128, 66, 66, - 65, 88, 128, 66, 66, 65, 84, 128, 66, 66, 65, 80, 128, 66, 66, 65, 128, - 66, 65, 89, 65, 78, 78, 65, 128, 66, 65, 85, 128, 66, 65, 84, 72, 84, 85, - 66, 128, 66, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 66, 65, 83, 83, 65, - 128, 66, 65, 83, 72, 75, 73, 210, 66, 65, 83, 72, 128, 66, 65, 83, 69, + 69, 65, 84, 73, 86, 197, 67, 82, 69, 65, 77, 128, 67, 82, 65, 67, 75, 69, + 82, 128, 67, 79, 88, 128, 67, 79, 87, 128, 67, 79, 215, 67, 79, 86, 69, + 82, 128, 67, 79, 85, 80, 76, 197, 67, 79, 85, 78, 84, 73, 78, 199, 67, + 79, 85, 78, 84, 69, 82, 83, 73, 78, 75, 128, 67, 79, 85, 78, 84, 69, 82, + 66, 79, 82, 69, 128, 67, 79, 85, 78, 67, 73, 204, 67, 79, 84, 128, 67, + 79, 82, 82, 69, 83, 80, 79, 78, 68, 211, 67, 79, 82, 82, 69, 67, 84, 128, + 67, 79, 82, 80, 83, 69, 128, 67, 79, 82, 80, 79, 82, 65, 84, 73, 79, 78, + 128, 67, 79, 82, 79, 78, 73, 83, 128, 67, 79, 82, 78, 69, 82, 83, 128, + 67, 79, 82, 78, 69, 82, 128, 67, 79, 82, 78, 69, 210, 67, 79, 80, 89, 82, + 73, 71, 72, 84, 128, 67, 79, 80, 89, 82, 73, 71, 72, 212, 67, 79, 80, 89, + 128, 67, 79, 80, 82, 79, 68, 85, 67, 84, 128, 67, 79, 80, 80, 69, 82, 45, + 50, 128, 67, 79, 80, 80, 69, 82, 128, 67, 79, 80, 128, 67, 79, 79, 76, + 128, 67, 79, 79, 75, 73, 78, 71, 128, 67, 79, 79, 75, 73, 69, 128, 67, + 79, 79, 75, 69, 196, 67, 79, 79, 128, 67, 79, 78, 86, 69, 82, 71, 73, 78, + 199, 67, 79, 78, 86, 69, 78, 73, 69, 78, 67, 197, 67, 79, 78, 84, 82, 79, + 76, 128, 67, 79, 78, 84, 82, 79, 204, 67, 79, 78, 84, 82, 65, 82, 73, 69, + 84, 89, 128, 67, 79, 78, 84, 82, 65, 67, 84, 73, 79, 78, 128, 67, 79, 78, + 84, 79, 85, 82, 69, 196, 67, 79, 78, 84, 79, 85, 210, 67, 79, 78, 84, 69, + 78, 84, 73, 79, 78, 128, 67, 79, 78, 84, 69, 77, 80, 76, 65, 84, 73, 79, + 78, 128, 67, 79, 78, 84, 65, 73, 78, 211, 67, 79, 78, 84, 65, 73, 78, 73, + 78, 199, 67, 79, 78, 84, 65, 73, 206, 67, 79, 78, 84, 65, 67, 84, 128, + 67, 79, 78, 83, 84, 82, 85, 67, 84, 73, 79, 206, 67, 79, 78, 83, 84, 65, + 78, 84, 128, 67, 79, 78, 83, 84, 65, 78, 212, 67, 79, 78, 83, 84, 65, 78, + 67, 89, 128, 67, 79, 78, 83, 79, 78, 65, 78, 212, 67, 79, 78, 83, 69, 67, + 85, 84, 73, 86, 197, 67, 79, 78, 74, 85, 78, 67, 84, 73, 79, 78, 128, 67, + 79, 78, 74, 85, 71, 65, 84, 197, 67, 79, 78, 74, 79, 73, 78, 73, 78, 199, + 67, 79, 78, 73, 67, 65, 204, 67, 79, 78, 71, 82, 85, 69, 78, 212, 67, 79, + 78, 71, 82, 65, 84, 85, 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 70, 79, + 85, 78, 68, 69, 196, 67, 79, 78, 70, 76, 73, 67, 84, 128, 67, 79, 78, 70, + 69, 84, 84, 201, 67, 79, 78, 67, 65, 86, 69, 45, 83, 73, 68, 69, 196, 67, + 79, 78, 67, 65, 86, 69, 45, 80, 79, 73, 78, 84, 69, 196, 67, 79, 78, 128, + 67, 79, 77, 80, 85, 84, 69, 82, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, + 79, 78, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 77, 80, + 76, 73, 65, 78, 67, 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128, + 67, 79, 77, 80, 76, 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69, + 78, 84, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, 77, 77, 79, 206, + 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, 65, 128, 67, 79, + 77, 77, 193, 67, 79, 77, 69, 84, 128, 67, 79, 77, 66, 128, 67, 79, 76, + 85, 77, 78, 128, 67, 79, 76, 79, 82, 128, 67, 79, 76, 76, 73, 83, 73, 79, + 206, 67, 79, 76, 76, 128, 67, 79, 76, 196, 67, 79, 70, 70, 73, 78, 128, + 67, 79, 69, 78, 71, 128, 67, 79, 68, 65, 128, 67, 79, 67, 75, 84, 65, 73, + 204, 67, 79, 65, 83, 84, 69, 82, 128, 67, 79, 65, 128, 67, 79, 128, 67, + 77, 128, 67, 205, 67, 76, 85, 83, 84, 69, 210, 67, 76, 85, 66, 83, 128, + 67, 76, 85, 66, 45, 83, 80, 79, 75, 69, 196, 67, 76, 85, 66, 128, 67, 76, + 85, 194, 67, 76, 79, 86, 69, 82, 128, 67, 76, 79, 85, 68, 128, 67, 76, + 79, 85, 196, 67, 76, 79, 84, 72, 69, 83, 128, 67, 76, 79, 84, 72, 128, + 67, 76, 79, 83, 69, 84, 128, 67, 76, 79, 83, 69, 78, 69, 83, 83, 128, 67, + 76, 79, 83, 69, 68, 128, 67, 76, 79, 83, 197, 67, 76, 79, 67, 75, 87, 73, + 83, 197, 67, 76, 79, 67, 203, 67, 76, 73, 86, 73, 83, 128, 67, 76, 73, + 80, 66, 79, 65, 82, 68, 128, 67, 76, 73, 78, 75, 73, 78, 199, 67, 76, 73, + 78, 71, 73, 78, 199, 67, 76, 73, 77, 65, 67, 85, 83, 128, 67, 76, 73, 70, + 70, 128, 67, 76, 73, 67, 75, 128, 67, 76, 69, 70, 45, 50, 128, 67, 76, + 69, 70, 45, 49, 128, 67, 76, 69, 70, 128, 67, 76, 69, 198, 67, 76, 69, + 65, 86, 69, 82, 128, 67, 76, 69, 65, 210, 67, 76, 65, 87, 128, 67, 76, + 65, 80, 80, 73, 78, 199, 67, 76, 65, 80, 80, 69, 210, 67, 76, 65, 78, + 128, 67, 76, 65, 73, 77, 128, 67, 76, 128, 67, 73, 88, 128, 67, 73, 86, + 73, 76, 73, 65, 78, 128, 67, 73, 84, 89, 83, 67, 65, 80, 197, 67, 73, 84, + 128, 67, 73, 82, 67, 85, 211, 67, 73, 82, 67, 85, 77, 70, 76, 69, 88, + 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, 67, 73, 82, 67, 85, 76, 65, + 84, 73, 79, 206, 67, 73, 82, 67, 76, 69, 83, 128, 67, 73, 82, 67, 76, 69, + 128, 67, 73, 80, 128, 67, 73, 78, 78, 65, 66, 65, 82, 128, 67, 73, 78, + 69, 77, 65, 128, 67, 73, 73, 128, 67, 73, 69, 88, 128, 67, 73, 69, 85, + 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, + 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, 71, + 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, 69, 80, 128, 67, + 73, 69, 128, 67, 73, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, 128, 67, + 72, 89, 82, 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, 67, 72, + 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, 67, 72, 128, 67, + 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, 88, 128, 67, 72, + 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 128, 67, 72, + 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, 65, 78, 84, 72, 69, + 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, 72, 82, 79, 78, 79, + 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, 193, 67, 72, 82, 73, + 86, 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, 83, 128, 67, 72, 82, 73, 83, + 84, 77, 65, 211, 67, 72, 79, 88, 128, 67, 72, 79, 84, 128, 67, 72, 79, + 82, 69, 86, 77, 193, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, 128, 67, + 72, 79, 69, 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, 79, 65, + 128, 67, 72, 207, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, + 73, 79, 83, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67, + 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, + 67, 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, + 85, 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, 79, 78, + 128, 67, 72, 73, 82, 69, 84, 128, 67, 72, 73, 78, 71, 128, 67, 72, 73, + 78, 69, 83, 197, 67, 72, 73, 78, 128, 67, 72, 73, 77, 69, 128, 67, 72, + 73, 76, 76, 213, 67, 72, 73, 76, 68, 82, 69, 206, 67, 72, 73, 76, 68, + 128, 67, 72, 73, 76, 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, 67, + 72, 45, 75, 72, 73, 69, 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, 45, + 72, 73, 69, 85, 72, 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, 67, 75, + 69, 78, 128, 67, 72, 73, 67, 75, 128, 67, 72, 73, 128, 67, 72, 201, 67, + 72, 72, 65, 128, 67, 72, 69, 88, 128, 67, 72, 69, 86, 82, 79, 206, 67, + 72, 69, 84, 128, 67, 72, 69, 83, 84, 78, 85, 84, 128, 67, 72, 69, 83, + 211, 67, 72, 69, 82, 82, 217, 67, 72, 69, 82, 82, 73, 69, 83, 128, 67, + 72, 69, 81, 85, 69, 82, 69, 196, 67, 72, 69, 80, 128, 67, 72, 69, 206, + 67, 72, 69, 73, 78, 65, 80, 128, 67, 72, 69, 73, 75, 72, 69, 73, 128, 67, + 72, 69, 69, 82, 73, 78, 199, 67, 72, 69, 69, 128, 67, 72, 69, 67, 75, + 128, 67, 72, 69, 67, 203, 67, 72, 197, 67, 72, 65, 88, 128, 67, 72, 65, + 86, 73, 89, 65, 78, 73, 128, 67, 72, 65, 84, 84, 65, 87, 65, 128, 67, 72, + 65, 84, 128, 67, 72, 65, 82, 84, 128, 67, 72, 65, 82, 212, 67, 72, 65, + 82, 73, 79, 84, 128, 67, 72, 65, 82, 73, 79, 212, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 83, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 128, 67, 72, 65, + 82, 128, 67, 72, 65, 80, 128, 67, 72, 65, 78, 71, 128, 67, 72, 65, 78, + 128, 67, 72, 65, 77, 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, 128, + 67, 72, 65, 77, 73, 76, 73, 128, 67, 72, 65, 73, 82, 128, 67, 72, 65, 73, + 78, 83, 128, 67, 72, 65, 68, 65, 128, 67, 72, 65, 196, 67, 72, 65, 65, + 128, 67, 69, 88, 128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 77, 79, + 78, 89, 128, 67, 69, 82, 69, 75, 128, 67, 69, 82, 45, 87, 65, 128, 67, + 69, 80, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, + 71, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, + 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, + 69, 85, 77, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, + 77, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, + 67, 72, 73, 69, 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, 73, 65, 204, 67, + 69, 78, 84, 82, 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, 69, 196, 67, 69, + 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, 78, 128, 67, 69, + 76, 83, 73, 85, 83, 128, 67, 69, 76, 69, 66, 82, 65, 84, 73, 79, 78, 128, + 67, 69, 73, 82, 84, 128, 67, 69, 73, 76, 73, 78, 71, 128, 67, 69, 69, + 128, 67, 69, 68, 73, 76, 76, 65, 128, 67, 69, 68, 73, 76, 76, 193, 67, + 69, 68, 201, 67, 69, 67, 69, 75, 128, 67, 69, 67, 65, 75, 128, 67, 69, + 67, 65, 203, 67, 69, 65, 76, 67, 128, 67, 67, 85, 128, 67, 67, 79, 128, + 67, 67, 73, 128, 67, 67, 72, 85, 128, 67, 67, 72, 79, 128, 67, 67, 72, + 73, 128, 67, 67, 72, 72, 85, 128, 67, 67, 72, 72, 79, 128, 67, 67, 72, + 72, 73, 128, 67, 67, 72, 72, 69, 69, 128, 67, 67, 72, 72, 69, 128, 67, + 67, 72, 72, 65, 65, 128, 67, 67, 72, 72, 65, 128, 67, 67, 72, 69, 69, + 128, 67, 67, 72, 69, 128, 67, 67, 72, 65, 65, 128, 67, 67, 72, 65, 128, + 67, 67, 69, 69, 128, 67, 67, 69, 128, 67, 67, 65, 65, 128, 67, 67, 65, + 128, 67, 65, 89, 78, 128, 67, 65, 89, 65, 78, 78, 65, 128, 67, 65, 88, + 128, 67, 65, 86, 69, 128, 67, 65, 85, 84, 73, 79, 206, 67, 65, 85, 76, + 68, 82, 79, 78, 128, 67, 65, 85, 68, 65, 128, 67, 65, 84, 65, 87, 65, + 128, 67, 65, 84, 128, 67, 65, 212, 67, 65, 83, 84, 76, 69, 128, 67, 65, + 82, 89, 83, 84, 73, 65, 206, 67, 65, 82, 84, 128, 67, 65, 82, 211, 67, + 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, 80, 69, 78, 84, 82, 217, 67, 65, + 82, 208, 67, 65, 82, 79, 85, 83, 69, 204, 67, 65, 82, 79, 78, 128, 67, + 65, 82, 79, 206, 67, 65, 82, 73, 203, 67, 65, 82, 73, 65, 206, 67, 65, + 82, 69, 84, 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, 65, 82, 68, + 83, 128, 67, 65, 82, 68, 128, 67, 65, 82, 196, 67, 65, 82, 128, 67, 65, + 210, 67, 65, 80, 85, 212, 67, 65, 80, 84, 73, 86, 69, 128, 67, 65, 80, + 82, 73, 67, 79, 82, 78, 128, 67, 65, 80, 79, 128, 67, 65, 80, 73, 84, 65, + 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, + 199, 67, 65, 78, 68, 89, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 85, + 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 213, 67, 65, 78, 68, 82, 65, + 128, 67, 65, 78, 68, 82, 193, 67, 65, 78, 67, 69, 82, 128, 67, 65, 78, + 67, 69, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, 128, 67, 65, + 78, 67, 69, 204, 67, 65, 78, 128, 67, 65, 77, 78, 85, 195, 67, 65, 77, + 69, 82, 65, 128, 67, 65, 77, 69, 76, 128, 67, 65, 76, 89, 65, 128, 67, + 65, 76, 89, 193, 67, 65, 76, 88, 128, 67, 65, 76, 76, 128, 67, 65, 76, + 69, 78, 68, 65, 82, 128, 67, 65, 76, 67, 128, 67, 65, 75, 82, 65, 128, + 67, 65, 75, 197, 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 68, 85, 67, 69, + 85, 83, 128, 67, 65, 68, 193, 67, 65, 67, 84, 85, 83, 128, 67, 65, 66, + 76, 69, 87, 65, 89, 128, 67, 65, 66, 66, 65, 71, 69, 45, 84, 82, 69, 69, + 128, 67, 65, 65, 78, 71, 128, 67, 65, 65, 73, 128, 67, 193, 67, 48, 50, + 52, 128, 67, 48, 50, 51, 128, 67, 48, 50, 50, 128, 67, 48, 50, 49, 128, + 67, 48, 50, 48, 128, 67, 48, 49, 57, 128, 67, 48, 49, 56, 128, 67, 48, + 49, 55, 128, 67, 48, 49, 54, 128, 67, 48, 49, 53, 128, 67, 48, 49, 52, + 128, 67, 48, 49, 51, 128, 67, 48, 49, 50, 128, 67, 48, 49, 49, 128, 67, + 48, 49, 48, 65, 128, 67, 48, 49, 48, 128, 67, 48, 48, 57, 128, 67, 48, + 48, 56, 128, 67, 48, 48, 55, 128, 67, 48, 48, 54, 128, 67, 48, 48, 53, + 128, 67, 48, 48, 52, 128, 67, 48, 48, 51, 128, 67, 48, 48, 50, 67, 128, + 67, 48, 48, 50, 66, 128, 67, 48, 48, 50, 65, 128, 67, 48, 48, 50, 128, + 67, 48, 48, 49, 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 67, + 45, 51, 57, 128, 67, 45, 49, 56, 128, 66, 90, 85, 78, 199, 66, 90, 72, + 201, 66, 89, 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, + 73, 78, 73, 65, 206, 66, 88, 71, 128, 66, 87, 73, 128, 66, 87, 69, 69, + 128, 66, 87, 69, 128, 66, 87, 65, 128, 66, 85, 85, 77, 73, 83, 72, 128, + 66, 85, 84, 84, 79, 78, 128, 66, 85, 212, 66, 85, 83, 84, 211, 66, 85, + 83, 212, 66, 85, 83, 83, 89, 69, 82, 85, 128, 66, 85, 211, 66, 85, 82, + 213, 66, 85, 82, 50, 128, 66, 85, 210, 66, 85, 79, 88, 128, 66, 85, 79, + 80, 128, 66, 85, 78, 78, 217, 66, 85, 78, 71, 128, 66, 85, 77, 80, 217, + 66, 85, 76, 85, 71, 128, 66, 85, 76, 85, 199, 66, 85, 76, 76, 83, 69, 89, + 69, 128, 66, 85, 76, 76, 211, 66, 85, 76, 76, 69, 84, 128, 66, 85, 76, + 76, 69, 212, 66, 85, 76, 76, 128, 66, 85, 76, 66, 128, 66, 85, 75, 89, + 128, 66, 85, 73, 76, 68, 73, 78, 71, 83, 128, 66, 85, 73, 76, 68, 73, 78, + 71, 128, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, 69, 83, 197, 66, 85, + 71, 128, 66, 85, 70, 70, 65, 76, 79, 128, 66, 85, 67, 75, 76, 69, 128, + 66, 83, 84, 65, 82, 128, 66, 83, 75, 85, 210, 66, 83, 75, 65, 173, 66, + 83, 68, 85, 211, 66, 82, 85, 83, 72, 128, 66, 82, 85, 83, 200, 66, 82, + 79, 78, 90, 69, 128, 66, 82, 79, 75, 69, 206, 66, 82, 79, 65, 196, 66, + 82, 73, 83, 84, 76, 69, 128, 66, 82, 73, 71, 72, 84, 78, 69, 83, 211, 66, + 82, 73, 69, 70, 67, 65, 83, 69, 128, 66, 82, 73, 68, 71, 197, 66, 82, 73, + 68, 197, 66, 82, 73, 67, 75, 128, 66, 82, 69, 86, 73, 83, 128, 66, 82, + 69, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 66, 82, 69, 86, 197, 66, 82, + 69, 65, 84, 200, 66, 82, 69, 65, 75, 84, 72, 82, 79, 85, 71, 72, 128, 66, + 82, 69, 65, 68, 128, 66, 82, 68, 193, 66, 82, 65, 78, 67, 72, 73, 78, + 199, 66, 82, 65, 78, 67, 72, 128, 66, 82, 65, 78, 67, 200, 66, 82, 65, + 75, 67, 69, 84, 128, 66, 82, 65, 67, 75, 69, 84, 69, 196, 66, 82, 65, 67, + 75, 69, 212, 66, 82, 65, 67, 69, 128, 66, 81, 128, 66, 79, 89, 128, 66, + 79, 87, 84, 73, 69, 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, 76, 73, 78, + 71, 128, 66, 79, 87, 76, 128, 66, 79, 87, 73, 78, 199, 66, 79, 215, 66, + 79, 85, 81, 85, 69, 84, 128, 66, 79, 85, 78, 68, 65, 82, 217, 66, 79, 84, + 84, 79, 77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, 79, 77, 128, + 66, 79, 84, 84, 79, 205, 66, 79, 84, 84, 76, 69, 128, 66, 79, 84, 84, 76, + 197, 66, 79, 84, 200, 66, 79, 82, 85, 84, 79, 128, 66, 79, 82, 65, 88, + 45, 51, 128, 66, 79, 82, 65, 88, 45, 50, 128, 66, 79, 82, 65, 88, 128, + 66, 79, 79, 84, 83, 128, 66, 79, 79, 84, 128, 66, 79, 79, 77, 69, 82, 65, + 78, 71, 128, 66, 79, 79, 75, 83, 128, 66, 79, 79, 75, 77, 65, 82, 75, + 128, 66, 79, 79, 75, 77, 65, 82, 203, 66, 79, 78, 69, 128, 66, 79, 77, + 66, 128, 66, 79, 76, 84, 128, 66, 79, 76, 212, 66, 79, 68, 89, 128, 66, + 79, 65, 82, 128, 66, 79, 65, 128, 66, 76, 85, 69, 128, 66, 76, 85, 197, + 66, 76, 79, 87, 70, 73, 83, 72, 128, 66, 76, 79, 83, 83, 79, 77, 128, 66, + 76, 79, 79, 68, 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, 75, 128, 66, + 76, 69, 78, 68, 69, 196, 66, 76, 65, 78, 75, 128, 66, 76, 65, 78, 203, + 66, 76, 65, 68, 197, 66, 76, 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, + 75, 45, 76, 69, 84, 84, 69, 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, + 72, 69, 82, 69, 196, 66, 76, 65, 67, 75, 128, 66, 75, 65, 173, 66, 73, + 84, 84, 69, 82, 128, 66, 73, 84, 73, 78, 199, 66, 73, 83, 77, 85, 84, + 200, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 73, 83, 72, 79, 80, 128, + 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, 73, 83, 65, 72, 128, 66, 73, 82, + 85, 128, 66, 73, 82, 84, 72, 68, 65, 217, 66, 73, 82, 71, 65, 128, 66, + 73, 82, 68, 128, 66, 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 78, 79, 67, + 85, 76, 65, 210, 66, 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, 128, + 66, 73, 78, 65, 82, 217, 66, 73, 76, 76, 73, 65, 82, 68, 83, 128, 66, 73, + 76, 65, 66, 73, 65, 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, 128, + 66, 73, 199, 66, 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66, + 73, 67, 89, 67, 76, 73, 83, 84, 128, 66, 73, 67, 89, 67, 76, 69, 83, 128, + 66, 73, 67, 89, 67, 76, 69, 128, 66, 73, 67, 69, 80, 83, 128, 66, 73, 66, + 76, 69, 45, 67, 82, 69, 197, 66, 73, 66, 128, 66, 201, 66, 72, 85, 128, + 66, 72, 79, 79, 128, 66, 72, 79, 128, 66, 72, 73, 128, 66, 72, 69, 84, + 72, 128, 66, 72, 69, 69, 128, 66, 72, 69, 128, 66, 72, 65, 84, 84, 73, + 80, 82, 79, 76, 213, 66, 72, 65, 77, 128, 66, 72, 65, 128, 66, 69, 89, + 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, 69, 128, + 66, 69, 84, 87, 69, 69, 78, 128, 66, 69, 84, 87, 69, 69, 206, 66, 69, 84, + 72, 128, 66, 69, 84, 65, 128, 66, 69, 84, 193, 66, 69, 212, 66, 69, 83, + 73, 68, 197, 66, 69, 82, 75, 65, 78, 65, 206, 66, 69, 82, 66, 69, 210, + 66, 69, 80, 128, 66, 69, 79, 82, 195, 66, 69, 78, 90, 69, 78, 197, 66, + 69, 78, 84, 207, 66, 69, 78, 68, 69, 128, 66, 69, 78, 68, 128, 66, 69, + 206, 66, 69, 76, 84, 128, 66, 69, 76, 212, 66, 69, 76, 79, 215, 66, 69, + 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, 66, 69, + 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, 128, 66, + 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, 78, 78, + 73, 78, 71, 128, 66, 69, 71, 73, 78, 78, 69, 82, 128, 66, 69, 71, 73, + 206, 66, 69, 70, 79, 82, 197, 66, 69, 69, 84, 76, 69, 128, 66, 69, 69, + 84, 65, 128, 66, 69, 69, 210, 66, 69, 69, 72, 73, 86, 69, 128, 66, 69, + 69, 72, 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, + 65, 86, 69, 210, 66, 69, 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, 66, + 69, 65, 210, 66, 69, 65, 78, 128, 66, 69, 65, 77, 69, 196, 66, 67, 65, + 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, 66, 66, 89, 84, 128, 66, + 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, 88, 128, 66, 66, 85, 84, + 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, 128, 66, 66, 85, 80, 128, + 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, 128, 66, 66, 85, 79, 128, + 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, 79, 84, 128, 66, 66, 79, + 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, 66, 66, 73, 80, 128, 66, + 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, 66, 66, 73, 69, 80, 128, + 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, 69, 88, 128, 66, 66, 69, + 80, 128, 66, 66, 69, 69, 128, 66, 66, 69, 128, 66, 66, 65, 88, 128, 66, + 66, 65, 84, 128, 66, 66, 65, 80, 128, 66, 66, 65, 65, 128, 66, 66, 65, + 128, 66, 65, 89, 65, 78, 78, 65, 128, 66, 65, 85, 128, 66, 65, 84, 84, + 69, 82, 89, 128, 66, 65, 84, 72, 84, 85, 66, 128, 66, 65, 84, 72, 65, 77, + 65, 83, 65, 84, 128, 66, 65, 84, 72, 128, 66, 65, 84, 200, 66, 65, 84, + 65, 203, 66, 65, 83, 83, 65, 128, 66, 65, 83, 75, 69, 84, 66, 65, 76, + 204, 66, 65, 83, 72, 75, 73, 210, 66, 65, 83, 72, 128, 66, 65, 83, 69, 66, 65, 76, 76, 128, 66, 65, 83, 69, 128, 66, 65, 83, 197, 66, 65, 82, 83, 128, 66, 65, 82, 82, 73, 69, 82, 128, 66, 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 69, 69, 128, 66, 65, 82, 82, 69, 197, 66, 65, 82, 76, 73, 78, 69, 128, 66, 65, 82, 76, 69, 89, 128, 66, 65, 82, 73, 89, 79, - 79, 83, 65, 78, 128, 66, 65, 82, 65, 50, 128, 66, 65, 210, 66, 65, 78, - 84, 79, 67, 128, 66, 65, 78, 203, 66, 65, 78, 68, 128, 66, 65, 78, 50, - 128, 66, 65, 78, 178, 66, 65, 77, 66, 79, 79, 83, 128, 66, 65, 77, 66, - 79, 79, 128, 66, 65, 76, 85, 68, 65, 128, 66, 65, 76, 76, 79, 212, 66, - 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196, 66, 65, 76, 65, 71, - 128, 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, 82, 75, 65, 78, 128, 66, - 65, 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, 72, 73, 82, 71, 79, - 77, 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, 50, 128, 66, 65, 71, 65, - 128, 66, 65, 71, 51, 128, 66, 65, 199, 66, 65, 68, 71, 69, 82, 128, 66, - 65, 68, 128, 66, 65, 67, 75, 83, 80, 65, 67, 69, 128, 66, 65, 67, 75, 83, - 76, 65, 83, 72, 128, 66, 65, 67, 75, 83, 76, 65, 83, 200, 66, 65, 67, 75, - 45, 84, 73, 76, 84, 69, 196, 66, 65, 67, 75, 128, 66, 65, 67, 203, 66, - 65, 65, 82, 69, 82, 85, 128, 66, 51, 48, 53, 128, 66, 50, 53, 57, 128, - 66, 50, 53, 56, 128, 66, 50, 53, 55, 128, 66, 50, 53, 54, 128, 66, 50, - 53, 53, 128, 66, 50, 53, 180, 66, 50, 53, 51, 128, 66, 50, 53, 50, 128, - 66, 50, 53, 49, 128, 66, 50, 53, 48, 128, 66, 50, 52, 57, 128, 66, 50, - 52, 56, 128, 66, 50, 52, 183, 66, 50, 52, 54, 128, 66, 50, 52, 53, 128, - 66, 50, 52, 179, 66, 50, 52, 178, 66, 50, 52, 177, 66, 50, 52, 176, 66, - 50, 51, 54, 128, 66, 50, 51, 52, 128, 66, 50, 51, 179, 66, 50, 51, 50, - 128, 66, 50, 51, 177, 66, 50, 51, 176, 66, 50, 50, 57, 128, 66, 50, 50, - 56, 128, 66, 50, 50, 55, 128, 66, 50, 50, 54, 128, 66, 50, 50, 181, 66, - 50, 50, 50, 128, 66, 50, 50, 49, 128, 66, 50, 50, 176, 66, 50, 49, 57, - 128, 66, 50, 49, 56, 128, 66, 50, 49, 55, 128, 66, 50, 49, 54, 128, 66, - 50, 49, 53, 128, 66, 50, 49, 52, 128, 66, 50, 49, 51, 128, 66, 50, 49, - 50, 128, 66, 50, 49, 49, 128, 66, 50, 49, 48, 128, 66, 50, 48, 57, 128, - 66, 50, 48, 56, 128, 66, 50, 48, 55, 128, 66, 50, 48, 54, 128, 66, 50, - 48, 53, 128, 66, 50, 48, 52, 128, 66, 50, 48, 51, 128, 66, 50, 48, 50, - 128, 66, 50, 48, 49, 128, 66, 50, 48, 48, 128, 66, 49, 57, 177, 66, 49, - 57, 48, 128, 66, 49, 56, 57, 128, 66, 49, 56, 53, 128, 66, 49, 56, 52, - 128, 66, 49, 56, 51, 128, 66, 49, 56, 50, 128, 66, 49, 56, 49, 128, 66, - 49, 56, 48, 128, 66, 49, 55, 57, 128, 66, 49, 55, 56, 128, 66, 49, 55, - 55, 128, 66, 49, 55, 182, 66, 49, 55, 52, 128, 66, 49, 55, 179, 66, 49, - 55, 50, 128, 66, 49, 55, 49, 128, 66, 49, 55, 48, 128, 66, 49, 54, 57, - 128, 66, 49, 54, 56, 128, 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, 66, - 49, 54, 53, 128, 66, 49, 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, 178, - 66, 49, 54, 49, 128, 66, 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, 53, - 56, 128, 66, 49, 53, 55, 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, 66, - 49, 53, 52, 128, 66, 49, 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, 53, - 177, 66, 49, 53, 48, 128, 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, 49, - 52, 50, 128, 66, 49, 52, 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, 49, - 51, 179, 66, 49, 51, 50, 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, 49, - 50, 184, 66, 49, 50, 183, 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, 50, - 178, 66, 49, 50, 177, 66, 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, 48, - 57, 198, 66, 49, 48, 56, 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, 205, - 66, 49, 48, 55, 198, 66, 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, 49, - 48, 53, 205, 66, 49, 48, 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, 66, - 49, 48, 178, 66, 49, 48, 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, 48, - 56, 57, 128, 66, 48, 56, 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, 66, - 48, 56, 51, 128, 66, 48, 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, 176, - 66, 48, 55, 57, 128, 66, 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, 182, - 66, 48, 55, 181, 66, 48, 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, 66, - 48, 55, 177, 66, 48, 55, 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, 48, - 54, 183, 66, 48, 54, 182, 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, 48, - 54, 51, 128, 66, 48, 54, 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, 48, - 53, 185, 66, 48, 53, 184, 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, 48, - 53, 181, 66, 48, 53, 180, 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, 53, - 177, 66, 48, 53, 176, 66, 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, 52, - 55, 128, 66, 48, 52, 182, 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, 52, - 179, 66, 48, 52, 178, 66, 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, 185, - 66, 48, 51, 184, 66, 48, 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, 128, - 66, 48, 51, 179, 66, 48, 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, 66, - 48, 50, 185, 66, 48, 50, 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, 48, - 50, 181, 66, 48, 50, 180, 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, 48, - 50, 177, 66, 48, 50, 176, 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, 66, - 48, 49, 183, 66, 48, 49, 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, 48, - 49, 179, 66, 48, 49, 178, 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, 48, - 57, 128, 66, 48, 48, 185, 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, 48, - 48, 55, 128, 66, 48, 48, 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, 66, - 48, 48, 53, 65, 128, 66, 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, 48, - 52, 128, 66, 48, 48, 180, 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, 48, - 48, 50, 128, 66, 48, 48, 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, 65, - 90, 85, 128, 65, 89, 69, 210, 65, 89, 66, 128, 65, 89, 65, 72, 128, 65, - 88, 69, 128, 65, 87, 69, 128, 65, 86, 69, 83, 84, 65, 206, 65, 86, 69, - 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, 65, 128, - 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, 65, 128, 65, - 85, 84, 85, 77, 78, 128, 65, 85, 83, 84, 82, 65, 204, 65, 85, 82, 65, 77, - 65, 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, - 45, 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, 85, 78, 78, + 79, 83, 65, 78, 128, 66, 65, 82, 66, 69, 210, 66, 65, 82, 65, 50, 128, + 66, 65, 210, 66, 65, 78, 84, 79, 67, 128, 66, 65, 78, 75, 78, 79, 84, + 197, 66, 65, 78, 75, 128, 66, 65, 78, 203, 66, 65, 78, 68, 128, 66, 65, + 78, 65, 78, 65, 128, 66, 65, 78, 50, 128, 66, 65, 78, 178, 66, 65, 77, + 66, 79, 79, 83, 128, 66, 65, 77, 66, 79, 79, 128, 66, 65, 76, 85, 68, 65, + 128, 66, 65, 76, 76, 79, 212, 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, + 75, 69, 196, 66, 65, 76, 76, 79, 79, 78, 128, 66, 65, 76, 65, 71, 128, + 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, 82, 75, 65, 78, 128, 66, 65, + 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, 72, 73, 82, 71, 79, 77, + 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, 50, 128, 66, 65, 71, 71, 65, 71, + 197, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, 65, 199, 66, 65, 68, + 71, 69, 82, 128, 66, 65, 68, 71, 69, 128, 66, 65, 68, 128, 66, 65, 67, + 84, 82, 73, 65, 206, 66, 65, 67, 75, 83, 80, 65, 67, 69, 128, 66, 65, 67, + 75, 83, 76, 65, 83, 72, 128, 66, 65, 67, 75, 83, 76, 65, 83, 200, 66, 65, + 67, 75, 72, 65, 78, 196, 66, 65, 67, 75, 45, 84, 73, 76, 84, 69, 196, 66, + 65, 67, 75, 128, 66, 65, 67, 203, 66, 65, 66, 89, 128, 66, 65, 66, 217, + 66, 65, 65, 82, 69, 82, 85, 128, 66, 51, 48, 53, 128, 66, 50, 53, 57, + 128, 66, 50, 53, 56, 128, 66, 50, 53, 55, 128, 66, 50, 53, 54, 128, 66, + 50, 53, 53, 128, 66, 50, 53, 180, 66, 50, 53, 51, 128, 66, 50, 53, 50, + 128, 66, 50, 53, 49, 128, 66, 50, 53, 48, 128, 66, 50, 52, 57, 128, 66, + 50, 52, 56, 128, 66, 50, 52, 183, 66, 50, 52, 54, 128, 66, 50, 52, 53, + 128, 66, 50, 52, 179, 66, 50, 52, 178, 66, 50, 52, 177, 66, 50, 52, 176, + 66, 50, 51, 54, 128, 66, 50, 51, 52, 128, 66, 50, 51, 179, 66, 50, 51, + 50, 128, 66, 50, 51, 177, 66, 50, 51, 176, 66, 50, 50, 57, 128, 66, 50, + 50, 56, 128, 66, 50, 50, 55, 128, 66, 50, 50, 54, 128, 66, 50, 50, 181, + 66, 50, 50, 50, 128, 66, 50, 50, 49, 128, 66, 50, 50, 176, 66, 50, 49, + 57, 128, 66, 50, 49, 56, 128, 66, 50, 49, 55, 128, 66, 50, 49, 54, 128, + 66, 50, 49, 53, 128, 66, 50, 49, 52, 128, 66, 50, 49, 51, 128, 66, 50, + 49, 50, 128, 66, 50, 49, 49, 128, 66, 50, 49, 48, 128, 66, 50, 48, 57, + 128, 66, 50, 48, 56, 128, 66, 50, 48, 55, 128, 66, 50, 48, 54, 128, 66, + 50, 48, 53, 128, 66, 50, 48, 52, 128, 66, 50, 48, 51, 128, 66, 50, 48, + 50, 128, 66, 50, 48, 49, 128, 66, 50, 48, 48, 128, 66, 49, 57, 177, 66, + 49, 57, 48, 128, 66, 49, 56, 57, 128, 66, 49, 56, 53, 128, 66, 49, 56, + 52, 128, 66, 49, 56, 51, 128, 66, 49, 56, 50, 128, 66, 49, 56, 49, 128, + 66, 49, 56, 48, 128, 66, 49, 55, 57, 128, 66, 49, 55, 56, 128, 66, 49, + 55, 55, 128, 66, 49, 55, 182, 66, 49, 55, 52, 128, 66, 49, 55, 179, 66, + 49, 55, 50, 128, 66, 49, 55, 49, 128, 66, 49, 55, 48, 128, 66, 49, 54, + 57, 128, 66, 49, 54, 56, 128, 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, + 66, 49, 54, 53, 128, 66, 49, 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, + 178, 66, 49, 54, 49, 128, 66, 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, + 53, 56, 128, 66, 49, 53, 55, 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, + 66, 49, 53, 52, 128, 66, 49, 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, + 53, 177, 66, 49, 53, 48, 128, 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, + 49, 52, 50, 128, 66, 49, 52, 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, + 49, 51, 179, 66, 49, 51, 50, 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, + 49, 50, 184, 66, 49, 50, 183, 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, + 50, 178, 66, 49, 50, 177, 66, 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, + 48, 57, 198, 66, 49, 48, 56, 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, + 205, 66, 49, 48, 55, 198, 66, 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, + 49, 48, 53, 205, 66, 49, 48, 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, + 66, 49, 48, 178, 66, 49, 48, 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, + 48, 56, 57, 128, 66, 48, 56, 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, + 66, 48, 56, 51, 128, 66, 48, 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, + 176, 66, 48, 55, 57, 128, 66, 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, + 182, 66, 48, 55, 181, 66, 48, 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, + 66, 48, 55, 177, 66, 48, 55, 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, + 48, 54, 183, 66, 48, 54, 182, 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, + 48, 54, 51, 128, 66, 48, 54, 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, + 48, 53, 185, 66, 48, 53, 184, 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, + 48, 53, 181, 66, 48, 53, 180, 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, + 53, 177, 66, 48, 53, 176, 66, 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, + 52, 55, 128, 66, 48, 52, 182, 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, + 52, 179, 66, 48, 52, 178, 66, 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, + 185, 66, 48, 51, 184, 66, 48, 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, + 128, 66, 48, 51, 179, 66, 48, 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, + 66, 48, 50, 185, 66, 48, 50, 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, + 48, 50, 181, 66, 48, 50, 180, 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, + 48, 50, 177, 66, 48, 50, 176, 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, + 66, 48, 49, 183, 66, 48, 49, 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, + 48, 49, 179, 66, 48, 49, 178, 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, + 48, 57, 128, 66, 48, 48, 185, 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, + 48, 48, 55, 128, 66, 48, 48, 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, + 66, 48, 48, 53, 65, 128, 66, 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, + 48, 52, 128, 66, 48, 48, 180, 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, + 48, 48, 50, 128, 66, 48, 48, 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, + 65, 90, 85, 128, 65, 89, 69, 210, 65, 89, 66, 128, 65, 89, 65, 72, 128, + 65, 88, 69, 128, 65, 87, 69, 128, 65, 86, 69, 83, 84, 65, 206, 65, 86, + 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, 65, + 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, 65, + 128, 65, 85, 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, 66, 73, 76, 69, + 128, 65, 85, 84, 79, 77, 65, 84, 69, 196, 65, 85, 83, 84, 82, 65, 204, + 65, 85, 82, 73, 80, 73, 71, 77, 69, 78, 84, 128, 65, 85, 82, 65, 77, 65, + 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 45, + 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, 85, 78, 78, 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, 84, 65, 84, 73, - 79, 206, 65, 85, 69, 128, 65, 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, - 65, 78, 128, 65, 84, 84, 69, 78, 84, 73, 79, 78, 128, 65, 84, 84, 65, - 203, 65, 84, 79, 205, 65, 84, 78, 65, 200, 65, 84, 77, 65, 65, 85, 128, - 65, 84, 73, 89, 65, 128, 65, 84, 72, 65, 82, 86, 65, 86, 69, 68, 73, 195, - 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 65, 83, 89, 85, 82, 193, 65, 83, - 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, 65, 83, 84, 82, 79, 76, - 79, 71, 73, 67, 65, 204, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 83, 84, - 69, 82, 73, 83, 75, 211, 65, 83, 84, 69, 82, 73, 83, 75, 128, 65, 83, 84, - 69, 82, 73, 83, 203, 65, 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 65, 83, - 83, 89, 82, 73, 65, 206, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, 83, - 80, 73, 82, 65, 84, 69, 196, 65, 83, 80, 69, 82, 128, 65, 83, 72, 71, 65, - 66, 128, 65, 83, 72, 57, 128, 65, 83, 72, 178, 65, 83, 67, 69, 78, 84, - 128, 65, 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 65, 76, 50, 128, 65, - 82, 85, 72, 85, 65, 128, 65, 82, 84, 65, 66, 197, 65, 82, 83, 69, 79, 83, - 128, 65, 82, 83, 69, 79, 211, 65, 82, 82, 79, 87, 83, 128, 65, 82, 82, - 79, 87, 72, 69, 65, 68, 128, 65, 82, 82, 79, 87, 72, 69, 65, 196, 65, 82, - 82, 79, 87, 45, 84, 65, 73, 76, 128, 65, 82, 82, 73, 86, 69, 128, 65, 82, - 82, 65, 89, 128, 65, 82, 80, 69, 71, 71, 73, 65, 84, 207, 65, 82, 79, 85, - 83, 73, 78, 199, 65, 82, 79, 85, 82, 193, 65, 82, 79, 85, 78, 68, 45, 80, - 82, 79, 70, 73, 76, 69, 128, 65, 82, 79, 85, 78, 196, 65, 82, 77, 89, - 128, 65, 82, 77, 79, 85, 82, 128, 65, 82, 205, 65, 82, 76, 65, 85, 199, - 65, 82, 75, 84, 73, 75, 207, 65, 82, 75, 65, 66, 128, 65, 82, 75, 65, 65, - 78, 85, 128, 65, 82, 73, 83, 84, 69, 82, 65, 128, 65, 82, 73, 83, 84, 69, - 82, 193, 65, 82, 73, 69, 83, 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, - 65, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, 65, 82, 71, 73, - 128, 65, 82, 69, 80, 65, 128, 65, 82, 68, 72, 65, 86, 73, 83, 65, 82, 71, - 65, 128, 65, 82, 67, 72, 65, 73, 79, 78, 128, 65, 82, 67, 72, 65, 73, 79, - 206, 65, 82, 67, 72, 65, 73, 195, 65, 82, 67, 200, 65, 82, 67, 128, 65, - 82, 195, 65, 82, 65, 77, 65, 73, 195, 65, 82, 65, 69, 65, 69, 128, 65, - 82, 65, 69, 65, 45, 85, 128, 65, 82, 65, 69, 65, 45, 73, 128, 65, 82, 65, - 69, 65, 45, 69, 79, 128, 65, 82, 65, 69, 65, 45, 69, 128, 65, 82, 65, 69, - 65, 45, 65, 128, 65, 82, 65, 68, 128, 65, 82, 65, 196, 65, 82, 65, 66, - 73, 67, 45, 73, 78, 68, 73, 195, 65, 82, 65, 66, 73, 65, 206, 65, 82, 45, - 82, 65, 72, 77, 65, 206, 65, 82, 45, 82, 65, 72, 69, 69, 77, 128, 65, 81, - 85, 65, 82, 73, 85, 83, 128, 65, 80, 85, 206, 65, 80, 82, 73, 76, 128, - 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 76, 217, 65, 80, 80, 82, 79, - 88, 73, 77, 65, 84, 69, 128, 65, 80, 80, 82, 79, 65, 67, 72, 69, 211, 65, - 80, 80, 82, 79, 65, 67, 72, 128, 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, - 78, 128, 65, 80, 79, 84, 72, 69, 83, 128, 65, 80, 79, 84, 72, 69, 77, 65, - 128, 65, 80, 79, 83, 84, 82, 79, 80, 72, 69, 128, 65, 80, 79, 83, 84, 82, - 79, 70, 79, 83, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 211, 65, 80, 79, - 83, 84, 82, 79, 70, 79, 201, 65, 80, 79, 68, 69, 88, 73, 65, 128, 65, 80, - 79, 68, 69, 82, 77, 193, 65, 80, 76, 79, 85, 78, 128, 65, 80, 76, 201, - 65, 80, 73, 78, 128, 65, 80, 69, 83, 207, 65, 80, 65, 82, 84, 128, 65, - 80, 65, 65, 84, 79, 128, 65, 78, 85, 83, 86, 65, 82, 65, 89, 65, 128, 65, - 78, 85, 83, 86, 65, 82, 65, 128, 65, 78, 85, 83, 86, 65, 82, 193, 65, 78, - 85, 68, 65, 84, 84, 65, 128, 65, 78, 85, 68, 65, 84, 84, 193, 65, 78, 84, - 73, 82, 69, 83, 84, 82, 73, 67, 84, 73, 79, 78, 128, 65, 78, 84, 73, 75, - 69, 78, 79, 77, 65, 128, 65, 78, 84, 73, 75, 69, 78, 79, 75, 89, 76, 73, - 83, 77, 65, 128, 65, 78, 84, 73, 70, 79, 78, 73, 65, 128, 65, 78, 84, 73, - 67, 76, 79, 67, 75, 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 65, - 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, 197, 65, 78, 84, 65, 82, 71, - 79, 77, 85, 75, 72, 65, 128, 65, 78, 83, 85, 218, 65, 78, 83, 72, 69, - 128, 65, 78, 80, 69, 65, 128, 65, 78, 207, 65, 78, 78, 85, 73, 84, 217, - 65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 65, 78, 78, 65, 65, 85, 128, 65, - 78, 75, 72, 128, 65, 78, 72, 85, 128, 65, 78, 71, 85, 76, 65, 82, 128, - 65, 78, 71, 83, 84, 82, 79, 205, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, - 128, 65, 78, 71, 69, 68, 128, 65, 78, 68, 65, 80, 128, 65, 78, 67, 79, - 82, 65, 128, 65, 78, 67, 72, 79, 82, 128, 65, 78, 65, 84, 82, 73, 67, 72, - 73, 83, 77, 65, 128, 65, 78, 65, 80, 128, 65, 77, 80, 83, 128, 65, 77, - 80, 69, 82, 83, 65, 78, 68, 128, 65, 77, 79, 85, 78, 212, 65, 77, 66, + 79, 206, 65, 85, 69, 128, 65, 85, 66, 69, 82, 71, 73, 78, 69, 128, 65, + 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, 84, 84, 69, 78, + 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 79, 205, 65, 84, 78, + 65, 200, 65, 84, 77, 65, 65, 85, 128, 65, 84, 73, 89, 65, 128, 65, 84, + 72, 76, 69, 84, 73, 195, 65, 84, 72, 65, 82, 86, 65, 86, 69, 68, 73, 195, + 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 65, 83, 90, 128, 65, 83, 89, 85, + 82, 193, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, 65, 83, + 84, 82, 79, 78, 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, 79, 76, 79, 71, + 73, 67, 65, 204, 65, 83, 84, 79, 78, 73, 83, 72, 69, 196, 65, 83, 84, 69, + 82, 73, 83, 77, 128, 65, 83, 84, 69, 82, 73, 83, 75, 211, 65, 83, 84, 69, + 82, 73, 83, 75, 128, 65, 83, 84, 69, 82, 73, 83, 203, 65, 83, 84, 69, 82, + 73, 83, 67, 85, 83, 128, 65, 83, 83, 89, 82, 73, 65, 206, 65, 83, 83, 69, + 82, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, 65, 84, 69, 196, 65, 83, 80, + 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83, 84, 82, 65, 76, 73, 65, 128, + 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69, 83, 128, 65, 83, 72, 57, + 128, 65, 83, 72, 178, 65, 83, 67, 69, 78, 84, 128, 65, 83, 67, 69, 78, + 68, 73, 78, 199, 65, 83, 65, 76, 50, 128, 65, 82, 85, 72, 85, 65, 128, + 65, 82, 84, 73, 83, 212, 65, 82, 84, 73, 67, 85, 76, 65, 84, 69, 196, 65, + 82, 84, 65, 66, 197, 65, 82, 83, 69, 79, 83, 128, 65, 82, 83, 69, 79, + 211, 65, 82, 83, 69, 78, 73, 67, 128, 65, 82, 82, 79, 87, 83, 128, 65, + 82, 82, 79, 87, 211, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, 65, 82, 82, + 79, 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, 65, 73, 76, 128, 65, + 82, 82, 73, 86, 69, 128, 65, 82, 82, 65, 89, 128, 65, 82, 80, 69, 71, 71, + 73, 65, 84, 207, 65, 82, 79, 85, 83, 73, 78, 199, 65, 82, 79, 85, 82, + 193, 65, 82, 79, 85, 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, 128, 65, 82, + 79, 85, 78, 196, 65, 82, 77, 89, 128, 65, 82, 77, 79, 85, 82, 128, 65, + 82, 205, 65, 82, 76, 65, 85, 199, 65, 82, 75, 84, 73, 75, 207, 65, 82, + 75, 65, 66, 128, 65, 82, 75, 65, 65, 78, 85, 128, 65, 82, 73, 83, 84, 69, + 82, 65, 128, 65, 82, 73, 83, 84, 69, 82, 193, 65, 82, 73, 69, 83, 128, + 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, 82, 71, 79, 83, 89, 78, 84, 72, + 69, 84, 79, 78, 128, 65, 82, 71, 73, 128, 65, 82, 69, 80, 65, 128, 65, + 82, 68, 72, 65, 86, 73, 83, 65, 82, 71, 65, 128, 65, 82, 67, 72, 65, 73, + 79, 78, 128, 65, 82, 67, 72, 65, 73, 79, 206, 65, 82, 67, 72, 65, 73, + 195, 65, 82, 67, 200, 65, 82, 67, 128, 65, 82, 195, 65, 82, 65, 77, 65, + 73, 195, 65, 82, 65, 69, 65, 69, 128, 65, 82, 65, 69, 65, 45, 85, 128, + 65, 82, 65, 69, 65, 45, 73, 128, 65, 82, 65, 69, 65, 45, 69, 79, 128, 65, + 82, 65, 69, 65, 45, 69, 128, 65, 82, 65, 69, 65, 45, 65, 128, 65, 82, 65, + 68, 128, 65, 82, 65, 196, 65, 82, 65, 66, 73, 67, 45, 73, 78, 68, 73, + 195, 65, 82, 65, 66, 73, 65, 206, 65, 82, 45, 82, 65, 72, 77, 65, 206, + 65, 82, 45, 82, 65, 72, 69, 69, 77, 128, 65, 81, 85, 65, 82, 73, 85, 83, + 128, 65, 81, 85, 65, 70, 79, 82, 84, 73, 83, 128, 65, 81, 85, 193, 65, + 80, 85, 206, 65, 80, 82, 73, 76, 128, 65, 80, 80, 82, 79, 88, 73, 77, 65, + 84, 69, 76, 217, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 128, 65, 80, + 80, 82, 79, 65, 67, 72, 69, 211, 65, 80, 80, 82, 79, 65, 67, 72, 128, 65, + 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 65, 80, 79, 84, 72, 69, 83, + 128, 65, 80, 79, 84, 72, 69, 77, 65, 128, 65, 80, 79, 83, 84, 82, 79, 80, + 72, 69, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 83, 128, 65, 80, 79, 83, + 84, 82, 79, 70, 79, 211, 65, 80, 79, 83, 84, 82, 79, 70, 79, 201, 65, 80, + 79, 68, 69, 88, 73, 65, 128, 65, 80, 79, 68, 69, 82, 77, 193, 65, 80, 76, + 79, 85, 78, 128, 65, 80, 76, 201, 65, 80, 73, 78, 128, 65, 80, 69, 83, + 207, 65, 80, 65, 82, 84, 128, 65, 80, 65, 65, 84, 79, 128, 65, 78, 85, + 83, 86, 65, 82, 65, 89, 65, 128, 65, 78, 85, 83, 86, 65, 82, 65, 128, 65, + 78, 85, 83, 86, 65, 82, 193, 65, 78, 85, 68, 65, 84, 84, 65, 128, 65, 78, + 85, 68, 65, 84, 84, 193, 65, 78, 84, 73, 82, 69, 83, 84, 82, 73, 67, 84, + 73, 79, 78, 128, 65, 78, 84, 73, 77, 79, 78, 89, 45, 50, 128, 65, 78, 84, + 73, 77, 79, 78, 89, 128, 65, 78, 84, 73, 77, 79, 78, 217, 65, 78, 84, 73, + 77, 79, 78, 73, 65, 84, 69, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, 65, + 128, 65, 78, 84, 73, 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, 65, + 78, 84, 73, 70, 79, 78, 73, 65, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, + 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 65, 78, 84, 73, 67, 76, + 79, 67, 75, 87, 73, 83, 197, 65, 78, 84, 69, 78, 78, 65, 128, 65, 78, 84, + 69, 78, 78, 193, 65, 78, 84, 65, 82, 71, 79, 77, 85, 75, 72, 65, 128, 65, + 78, 83, 85, 218, 65, 78, 83, 72, 69, 128, 65, 78, 80, 69, 65, 128, 65, + 78, 207, 65, 78, 78, 85, 73, 84, 217, 65, 78, 78, 79, 84, 65, 84, 73, 79, + 206, 65, 78, 78, 65, 65, 85, 128, 65, 78, 75, 72, 128, 65, 78, 72, 85, + 128, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 71, 83, 84, 82, 79, 205, + 65, 78, 71, 82, 217, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, 128, 65, 78, + 71, 69, 210, 65, 78, 71, 69, 76, 128, 65, 78, 71, 69, 68, 128, 65, 78, + 68, 65, 80, 128, 65, 78, 67, 79, 82, 65, 128, 65, 78, 67, 72, 79, 82, + 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, 65, 128, 65, 78, 65, 80, + 128, 65, 77, 80, 83, 128, 65, 77, 80, 69, 82, 83, 65, 78, 68, 128, 65, + 77, 79, 85, 78, 212, 65, 77, 69, 82, 73, 67, 65, 83, 128, 65, 77, 69, 82, + 73, 67, 65, 206, 65, 77, 66, 85, 76, 65, 78, 67, 69, 128, 65, 77, 66, 193, 65, 77, 65, 82, 128, 65, 77, 65, 210, 65, 77, 65, 76, 71, 65, 77, - 65, 84, 73, 79, 206, 65, 76, 86, 69, 79, 76, 65, 210, 65, 76, 84, 69, 82, - 78, 65, 84, 73, 86, 197, 65, 76, 84, 69, 82, 78, 65, 84, 73, 79, 206, 65, - 76, 84, 69, 82, 78, 65, 84, 197, 65, 76, 84, 65, 128, 65, 76, 80, 72, 65, - 128, 65, 76, 80, 72, 193, 65, 76, 80, 65, 80, 82, 65, 78, 65, 128, 65, - 76, 80, 65, 80, 82, 65, 65, 78, 193, 65, 76, 80, 65, 128, 65, 76, 77, 79, - 83, 212, 65, 76, 76, 79, 128, 65, 76, 76, 73, 65, 78, 67, 69, 128, 65, - 76, 76, 201, 65, 76, 76, 65, 200, 65, 76, 73, 71, 78, 69, 196, 65, 76, - 73, 70, 85, 128, 65, 76, 71, 73, 218, 65, 76, 70, 65, 128, 65, 76, 69, - 85, 212, 65, 76, 69, 80, 72, 128, 65, 76, 69, 77, 66, 73, 67, 128, 65, - 76, 69, 70, 128, 65, 76, 65, 89, 72, 69, 128, 65, 76, 65, 89, 72, 197, - 65, 76, 65, 80, 72, 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, - 84, 73, 69, 83, 69, 76, 83, 75, 65, 66, 128, 65, 75, 72, 77, 73, 77, 73, - 195, 65, 75, 66, 65, 210, 65, 75, 65, 82, 65, 128, 65, 75, 65, 82, 193, - 65, 73, 89, 65, 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, 203, 65, 73, 84, - 79, 206, 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 78, 78, 128, 65, - 73, 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, 72, 86, 85, 83, - 128, 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, 72, 65, 71, 71, - 65, 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, 71, - 201, 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, 65, - 86, 65, 84, 69, 196, 65, 71, 65, 73, 78, 128, 65, 70, 84, 69, 210, 65, - 70, 83, 65, 65, 81, 128, 65, 70, 82, 73, 67, 65, 206, 65, 70, 79, 82, 69, - 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 70, 71, 72, 65, 78, 201, 65, - 69, 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, 65, 69, 84, 128, 65, 69, - 83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, 69, 83, - 128, 65, 69, 82, 128, 65, 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, 65, - 69, 76, 128, 65, 69, 75, 128, 65, 69, 71, 69, 65, 206, 65, 69, 71, 128, - 65, 69, 69, 89, 65, 78, 78, 65, 128, 65, 69, 69, 128, 65, 69, 68, 65, 45, - 80, 73, 76, 76, 65, 128, 65, 69, 68, 128, 65, 69, 66, 128, 65, 197, 65, - 68, 86, 65, 78, 67, 69, 128, 65, 68, 69, 71, 128, 65, 68, 69, 199, 65, - 68, 68, 82, 69, 83, 83, 69, 196, 65, 68, 68, 65, 75, 128, 65, 68, 65, - 203, 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, 78, 128, 65, 67, 85, 84, - 69, 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 128, 65, 67, 85, 84, - 197, 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, 197, - 65, 67, 82, 79, 80, 72, 79, 78, 73, 195, 65, 67, 75, 78, 79, 87, 76, 69, - 68, 71, 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, 128, 65, - 67, 67, 79, 85, 78, 212, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, 67, 67, - 65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, 69, 78, 212, - 65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, 65, 66, 85, 78, - 68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, 206, 65, 66, 66, - 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, 76, 73, 128, 65, - 66, 178, 65, 65, 89, 65, 78, 78, 65, 128, 65, 65, 89, 128, 65, 65, 87, - 128, 65, 65, 79, 128, 65, 65, 74, 128, 65, 65, 66, 65, 65, 70, 73, 76, - 73, 128, 65, 65, 48, 51, 50, 128, 65, 65, 48, 51, 49, 128, 65, 65, 48, - 51, 48, 128, 65, 65, 48, 50, 57, 128, 65, 65, 48, 50, 56, 128, 65, 65, - 48, 50, 55, 128, 65, 65, 48, 50, 54, 128, 65, 65, 48, 50, 53, 128, 65, - 65, 48, 50, 52, 128, 65, 65, 48, 50, 51, 128, 65, 65, 48, 50, 50, 128, - 65, 65, 48, 50, 49, 128, 65, 65, 48, 50, 48, 128, 65, 65, 48, 49, 57, - 128, 65, 65, 48, 49, 56, 128, 65, 65, 48, 49, 55, 128, 65, 65, 48, 49, - 54, 128, 65, 65, 48, 49, 53, 128, 65, 65, 48, 49, 52, 128, 65, 65, 48, - 49, 51, 128, 65, 65, 48, 49, 50, 128, 65, 65, 48, 49, 49, 128, 65, 65, - 48, 49, 48, 128, 65, 65, 48, 48, 57, 128, 65, 65, 48, 48, 56, 128, 65, - 65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, 65, 128, 65, 65, 48, 48, 55, + 65, 84, 73, 79, 206, 65, 77, 65, 76, 71, 65, 77, 128, 65, 76, 86, 69, 79, + 76, 65, 210, 65, 76, 85, 77, 128, 65, 76, 84, 69, 82, 78, 65, 84, 73, 86, + 197, 65, 76, 84, 69, 82, 78, 65, 84, 73, 79, 206, 65, 76, 84, 69, 82, 78, + 65, 84, 197, 65, 76, 84, 65, 128, 65, 76, 80, 72, 65, 128, 65, 76, 80, + 72, 193, 65, 76, 80, 65, 80, 82, 65, 78, 65, 128, 65, 76, 80, 65, 80, 82, + 65, 65, 78, 193, 65, 76, 80, 65, 128, 65, 76, 77, 79, 83, 212, 65, 76, + 76, 79, 128, 65, 76, 76, 73, 65, 78, 67, 69, 128, 65, 76, 76, 201, 65, + 76, 76, 65, 200, 65, 76, 75, 65, 76, 73, 45, 50, 128, 65, 76, 75, 65, 76, + 73, 128, 65, 76, 73, 71, 78, 69, 196, 65, 76, 73, 70, 85, 128, 65, 76, + 73, 69, 78, 128, 65, 76, 73, 69, 206, 65, 76, 71, 73, 218, 65, 76, 70, + 65, 128, 65, 76, 69, 85, 212, 65, 76, 69, 80, 72, 128, 65, 76, 69, 77, + 66, 73, 67, 128, 65, 76, 69, 70, 128, 65, 76, 65, 89, 72, 69, 128, 65, + 76, 65, 89, 72, 197, 65, 76, 65, 82, 205, 65, 76, 65, 80, 72, 128, 65, + 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, 84, 73, 69, 83, 69, 76, 83, + 75, 65, 66, 128, 65, 75, 83, 65, 128, 65, 75, 72, 77, 73, 77, 73, 195, + 65, 75, 66, 65, 210, 65, 75, 65, 82, 65, 128, 65, 75, 65, 82, 193, 65, + 73, 89, 65, 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, 203, 65, 73, 84, 79, + 206, 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 78, 78, 128, 65, 73, + 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, 72, 86, 85, 83, 128, + 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, 72, 65, 71, 71, 65, + 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, 71, 201, + 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, 65, 86, + 65, 84, 69, 196, 65, 71, 65, 73, 78, 128, 65, 70, 84, 69, 210, 65, 70, + 83, 65, 65, 81, 128, 65, 70, 82, 73, 67, 65, 206, 65, 70, 79, 82, 69, 77, + 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 70, 71, 72, 65, 78, 201, 65, 70, + 70, 82, 73, 67, 65, 84, 73, 79, 206, 65, 69, 89, 65, 78, 78, 65, 128, 65, + 69, 89, 128, 65, 69, 83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, + 67, 128, 65, 69, 83, 128, 65, 69, 82, 73, 65, 204, 65, 69, 82, 128, 65, + 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 76, 128, 65, 69, 75, + 128, 65, 69, 71, 69, 65, 206, 65, 69, 71, 128, 65, 69, 69, 89, 65, 78, + 78, 65, 128, 65, 69, 69, 128, 65, 69, 68, 65, 45, 80, 73, 76, 76, 65, + 128, 65, 69, 68, 128, 65, 69, 66, 128, 65, 68, 86, 65, 78, 84, 65, 71, + 69, 128, 65, 68, 86, 65, 78, 67, 69, 128, 65, 68, 69, 71, 128, 65, 68, + 69, 199, 65, 68, 68, 82, 69, 83, 83, 69, 196, 65, 68, 68, 82, 69, 83, + 211, 65, 68, 68, 65, 75, 128, 65, 68, 65, 203, 65, 67, 85, 84, 69, 45, + 77, 65, 67, 82, 79, 78, 128, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, + 45, 65, 67, 85, 84, 69, 128, 65, 67, 85, 84, 197, 65, 67, 84, 85, 65, 76, + 76, 217, 65, 67, 84, 73, 86, 65, 84, 197, 65, 67, 82, 79, 80, 72, 79, 78, + 73, 195, 65, 67, 75, 78, 79, 87, 76, 69, 68, 71, 69, 128, 65, 67, 67, 85, + 77, 85, 76, 65, 84, 73, 79, 78, 128, 65, 67, 67, 79, 85, 78, 212, 65, 67, + 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, 67, 67, 65, + 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, 69, 78, 212, 65, + 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, 65, 66, 85, 78, 68, + 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, 206, 65, 66, 66, 82, + 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, 76, 73, 128, 65, 66, + 178, 65, 65, 89, 65, 78, 78, 65, 128, 65, 65, 89, 128, 65, 65, 87, 128, + 65, 65, 79, 128, 65, 65, 74, 128, 65, 65, 66, 65, 65, 70, 73, 76, 73, + 128, 65, 65, 48, 51, 50, 128, 65, 65, 48, 51, 49, 128, 65, 65, 48, 51, + 48, 128, 65, 65, 48, 50, 57, 128, 65, 65, 48, 50, 56, 128, 65, 65, 48, + 50, 55, 128, 65, 65, 48, 50, 54, 128, 65, 65, 48, 50, 53, 128, 65, 65, + 48, 50, 52, 128, 65, 65, 48, 50, 51, 128, 65, 65, 48, 50, 50, 128, 65, + 65, 48, 50, 49, 128, 65, 65, 48, 50, 48, 128, 65, 65, 48, 49, 57, 128, + 65, 65, 48, 49, 56, 128, 65, 65, 48, 49, 55, 128, 65, 65, 48, 49, 54, + 128, 65, 65, 48, 49, 53, 128, 65, 65, 48, 49, 52, 128, 65, 65, 48, 49, + 51, 128, 65, 65, 48, 49, 50, 128, 65, 65, 48, 49, 49, 128, 65, 65, 48, + 49, 48, 128, 65, 65, 48, 48, 57, 128, 65, 65, 48, 48, 56, 128, 65, 65, + 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, 65, 128, 65, 65, 48, 48, 55, 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, 48, 53, 128, 65, 65, 48, 48, 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, 48, 48, 50, 128, 65, 65, 48, 48, 49, 128, 65, 48, 55, 48, 128, 65, 48, 54, 57, 128, 65, 48, 54, 56, @@ -4012,7906 +4450,8676 @@ static unsigned char lexicon[] = { static unsigned int lexicon_offset[] = { 0, 0, 6, 10, 15, 23, 27, 34, 39, 41, 44, 52, 62, 68, 81, 93, 102, 108, - 113, 121, 130, 135, 139, 145, 150, 158, 161, 168, 173, 181, 186, 192, - 200, 207, 217, 224, 227, 236, 239, 242, 247, 253, 262, 266, 273, 280, - 285, 294, 136, 302, 303, 309, 315, 323, 329, 335, 340, 346, 352, 360, - 367, 369, 372, 376, 383, 390, 396, 403, 408, 410, 418, 421, 426, 307, - 428, 430, 436, 441, 450, 455, 460, 470, 474, 487, 491, 496, 505, 508, - 514, 518, 526, 536, 544, 551, 560, 568, 576, 581, 589, 600, 604, 611, - 614, 620, 624, 628, 629, 634, 638, 640, 643, 652, 322, 655, 659, 664, - 672, 676, 678, 681, 687, 694, 701, 710, 719, 722, 732, 741, 750, 756, - 762, 769, 772, 780, 788, 792, 796, 804, 813, 822, 827, 831, 686, 838, - 846, 850, 854, 857, 862, 867, 871, 879, 794, 609, 882, 887, 225, 890, - 895, 905, 914, 920, 927, 934, 942, 946, 954, 960, 967, 973, 979, 984, - 988, 994, 1007, 1012, 1015, 1020, 22, 1024, 1027, 1037, 1042, 1046, 1055, - 1058, 1064, 1074, 1077, 111, 1081, 1086, 1092, 1096, 1101, 1107, 1112, - 1115, 1122, 1124, 1126, 1134, 1144, 1147, 1150, 1157, 1165, 338, 1167, - 1170, 1175, 1183, 1192, 1195, 1204, 1210, 1216, 1218, 1223, 1228, 1234, - 1239, 1244, 1248, 1253, 1259, 1264, 1269, 1273, 1278, 1283, 1287, 1292, - 1297, 1302, 1308, 1314, 1320, 1325, 1329, 1334, 1339, 1344, 1348, 1353, - 1358, 1363, 1368, 1219, 1224, 1229, 1235, 1240, 1372, 1245, 1378, 1387, - 1249, 1391, 1254, 1260, 1265, 1395, 1400, 1405, 1409, 1413, 1419, 1423, - 1270, 1426, 1430, 1274, 1436, 1279, 1440, 1444, 1284, 1448, 1453, 1457, - 1460, 1464, 1288, 1293, 1469, 1298, 1475, 1481, 1487, 1493, 1303, 1315, - 1321, 1497, 1501, 1505, 1508, 1326, 1512, 1514, 1519, 1524, 1530, 1535, - 1540, 1544, 1549, 1554, 1559, 1564, 1570, 1575, 1580, 1586, 1592, 1597, - 1601, 1606, 1611, 1616, 1621, 1625, 1633, 1637, 1642, 1647, 1652, 1657, - 1661, 1664, 1669, 1674, 1679, 1684, 1690, 1695, 1699, 1330, 1702, 1707, - 1712, 1335, 1716, 1720, 1727, 1340, 1734, 1345, 1738, 1740, 1745, 1751, - 1349, 1756, 1765, 1354, 1770, 1776, 1359, 1781, 1786, 1789, 1794, 1798, - 1802, 1806, 1809, 1813, 1364, 1369, 1040, 1818, 1824, 1830, 1836, 1842, - 1848, 1854, 1860, 1866, 1871, 1877, 1883, 1889, 1895, 1901, 1907, 1913, - 1919, 1925, 1930, 1935, 1940, 1945, 1950, 1955, 1960, 1965, 1970, 1975, - 1981, 1986, 1992, 1997, 2003, 2009, 2014, 2020, 2026, 2032, 2038, 2043, - 2048, 2050, 2051, 2055, 2059, 2064, 2068, 2072, 2076, 2080, 2083, 2088, - 2092, 2097, 2101, 2105, 2110, 2114, 2117, 2121, 2135, 2139, 2143, 2146, - 2151, 2155, 2159, 2163, 2168, 2173, 2178, 2182, 2187, 2191, 2196, 2203, - 2209, 2214, 2219, 2224, 2230, 2235, 2241, 2246, 2249, 1236, 2251, 2258, - 2266, 2276, 2285, 2299, 2303, 2307, 2320, 2328, 2332, 2337, 2341, 2345, - 2349, 2354, 2359, 2364, 2368, 2371, 2375, 2382, 2389, 2395, 2400, 2405, - 2411, 2417, 2422, 2425, 1742, 2427, 2433, 2437, 2442, 2446, 2450, 1747, - 1753, 2455, 2459, 2462, 2467, 2472, 2477, 2481, 2488, 2493, 2496, 2503, - 2509, 2513, 2517, 2521, 2527, 2533, 2547, 2564, 2579, 2594, 2603, 2608, - 2612, 2617, 2622, 2626, 2638, 2645, 2651, 2199, 2657, 2664, 2670, 2673, - 2680, 2684, 2688, 2692, 2073, 2696, 2701, 2706, 2710, 2718, 2722, 2726, - 2730, 2735, 2740, 2745, 2749, 2754, 2759, 2763, 2768, 2772, 2775, 2779, - 2783, 2788, 2792, 2796, 2802, 2811, 2815, 2819, 2825, 2830, 2837, 2841, - 2851, 2855, 2860, 2864, 2869, 2875, 2880, 2884, 2385, 2888, 2893, 2899, - 2904, 2908, 2913, 2918, 2922, 2928, 2933, 2939, 2943, 2949, 2954, 2959, - 2964, 2969, 2974, 2979, 2984, 2989, 2994, 3000, 3005, 1246, 80, 3011, - 3015, 3019, 3023, 3028, 3032, 3036, 3040, 3044, 3049, 3053, 3058, 3062, - 3065, 3069, 3074, 3078, 3083, 3087, 3091, 3095, 3100, 3104, 3107, 3120, - 3124, 3128, 3132, 3136, 3140, 3143, 3147, 3151, 3156, 3160, 3165, 3170, - 3175, 3179, 3182, 3185, 3191, 3195, 3199, 3202, 3206, 3210, 3213, 3219, - 3224, 3229, 3235, 3240, 3245, 3251, 3257, 3262, 3267, 3272, 1044, 507, - 3277, 3280, 3285, 3289, 3292, 3297, 3302, 3306, 3311, 3315, 3320, 3324, - 3328, 3331, 3337, 3344, 3350, 3355, 3359, 3364, 3368, 3378, 3382, 3386, - 3391, 3396, 3406, 2084, 3411, 3415, 3418, 3424, 3431, 3435, 621, 720, - 3439, 3446, 3453, 3459, 3464, 3470, 3475, 2093, 3479, 3487, 555, 3493, - 3504, 3508, 3518, 2098, 3524, 3529, 3544, 3550, 3557, 3567, 3573, 3578, - 3584, 3587, 3591, 3598, 3603, 3607, 3611, 3615, 3619, 3624, 3630, 3070, - 3635, 3647, 1546, 3654, 3657, 3661, 3664, 3668, 3682, 3686, 3689, 3693, - 3698, 3702, 3706, 3712, 3718, 3723, 3729, 3733, 3741, 3751, 3757, 3762, - 3771, 3779, 3786, 3790, 3799, 3803, 3808, 3813, 3817, 3825, 3829, 3834, - 3838, 2106, 1388, 3844, 3849, 3855, 3860, 3865, 3870, 3875, 3880, 3885, - 3891, 3896, 3902, 3907, 3912, 3917, 3923, 3928, 3933, 3938, 3943, 3949, - 3954, 3960, 3965, 3970, 3975, 3980, 3985, 3990, 3996, 4001, 4006, 344, - 440, 4011, 4017, 4021, 4025, 4030, 4034, 4038, 4041, 4045, 4049, 4053, - 4058, 4062, 4066, 3841, 4072, 4079, 4083, 4096, 4100, 4104, 4108, 4112, - 4116, 4122, 4129, 4133, 4141, 4150, 4156, 4161, 4164, 4168, 4172, 4182, - 4192, 4200, 4207, 4214, 4220, 4226, 4233, 4237, 4242, 4246, 4254, 4259, - 4267, 4272, 4277, 4281, 4286, 4293, 4296, 4300, 4304, 4307, 4313, 4319, - 4323, 4334, 4344, 4359, 4374, 4389, 4404, 4419, 4434, 4449, 4464, 4479, - 4494, 4509, 4524, 4539, 4554, 4569, 4584, 4599, 4614, 4629, 4644, 4659, - 4674, 4689, 4704, 4719, 4734, 4749, 4764, 4779, 4794, 4809, 4824, 4839, - 4854, 4869, 4884, 4899, 4914, 4929, 4944, 4959, 4974, 4989, 5004, 5019, - 5034, 5049, 5064, 5079, 5088, 5097, 5102, 5108, 5112, 5117, 5121, 5124, - 5128, 2846, 5131, 5136, 306, 424, 5142, 5150, 5154, 5158, 5161, 5167, - 5171, 5179, 5185, 5190, 5197, 5204, 5210, 5215, 5222, 5228, 5232, 5237, - 5249, 5260, 5267, 5273, 3092, 5277, 5283, 5288, 5293, 5298, 5304, 5309, - 5314, 5319, 5324, 5330, 5335, 5340, 5346, 5351, 5357, 5362, 5368, 5373, - 5379, 5384, 5389, 5394, 5399, 5404, 5410, 5415, 5420, 5425, 5431, 5437, - 5443, 5449, 5455, 5461, 5467, 5473, 5479, 5485, 5491, 5497, 5502, 5507, - 5512, 5517, 5522, 5527, 5532, 5537, 5543, 5549, 5554, 5560, 5566, 5572, - 5577, 5582, 5587, 5592, 5598, 5604, 5609, 5614, 5619, 5624, 5629, 5635, - 5640, 5646, 5652, 5658, 5664, 5670, 5676, 5682, 5688, 5694, 5160, 5699, - 5703, 5707, 5710, 5717, 5720, 5728, 5733, 5738, 5729, 5743, 5730, 5747, - 5753, 5759, 5764, 5769, 5776, 5781, 5785, 5788, 5792, 2140, 516, 5796, - 5800, 5805, 5811, 5816, 5820, 5823, 5827, 5832, 5836, 5843, 5847, 5851, - 5855, 884, 699, 5858, 5866, 5873, 5880, 5886, 5893, 5901, 5908, 5915, - 5920, 5932, 1266, 1396, 1401, 5943, 1406, 5947, 5951, 5960, 5969, 5975, - 5980, 5984, 5990, 5995, 6002, 6006, 6015, 6024, 6033, 6042, 6047, 6052, - 6064, 6069, 3312, 6073, 6075, 6080, 6084, 6093, 6101, 1410, 825, 3316, - 3321, 6107, 6111, 6120, 6126, 6131, 6134, 6143, 2591, 6149, 6157, 6161, - 6165, 3325, 6169, 6174, 6181, 6187, 6193, 6196, 6198, 6201, 6209, 6217, - 6225, 6228, 6233, 5740, 6236, 6238, 6243, 6248, 6253, 6258, 6263, 6268, - 6273, 6278, 6283, 6288, 6294, 6299, 6304, 6309, 6315, 6320, 6325, 6330, - 6335, 6340, 6345, 6351, 6356, 6361, 6366, 6371, 6376, 6381, 6386, 6391, - 6396, 6401, 6406, 6411, 6416, 6421, 6426, 6431, 6436, 6442, 6448, 6453, - 6458, 6463, 6468, 6473, 2197, 2204, 2210, 6478, 6484, 2236, 2242, 6492, - 6496, 6501, 6505, 6509, 6513, 6518, 6522, 6527, 6531, 6534, 6537, 6543, - 6549, 6555, 6561, 6567, 6573, 6579, 6583, 6587, 6591, 6595, 6599, 6604, - 6611, 6619, 6629, 6634, 6638, 6649, 6662, 6673, 6686, 6697, 6709, 6721, - 6733, 6746, 6759, 6766, 6772, 6779, 6785, 6789, 6794, 6798, 6805, 6813, - 6817, 6823, 6833, 6837, 6842, 6847, 6854, 6860, 5888, 6870, 6874, 6881, - 698, 6885, 6889, 6894, 6899, 6904, 6908, 6914, 6922, 6926, 6936, 6940, - 6946, 6951, 6955, 2132, 6961, 6969, 6978, 6982, 6988, 6993, 6998, 7003, - 7009, 7014, 3708, 7019, 7023, 7029, 7035, 7040, 7045, 7050, 6983, 7056, - 7060, 7067, 7073, 7078, 7082, 7087, 7091, 7100, 6177, 6184, 7105, 2732, - 7109, 7114, 7119, 6989, 7123, 6994, 6999, 7128, 7135, 7142, 7148, 7154, - 7160, 7165, 7170, 7175, 7004, 7010, 7181, 7187, 7192, 7200, 7015, 7205, - 1079, 7208, 7216, 7222, 7228, 7237, 7242, 7248, 7263, 7280, 7299, 7308, - 7316, 7331, 7341, 7351, 7357, 7369, 7378, 7386, 7393, 7400, 7406, 7411, - 7419, 7429, 7436, 7446, 7456, 7466, 7475, 7485, 7499, 7514, 7523, 7531, - 7536, 7540, 7549, 7559, 7569, 7579, 7584, 7588, 7597, 7607, 7618, 7631, - 7644, 7656, 7664, 7669, 7675, 7678, 7682, 7690, 7695, 7699, 7707, 7716, - 7724, 7731, 7742, 7746, 7749, 7755, 7759, 7765, 7772, 7777, 7784, 7791, - 7798, 7805, 7812, 7819, 7824, 7276, 7829, 7836, 7845, 7849, 7861, 7865, - 7868, 7872, 7876, 7880, 7884, 7890, 7895, 7901, 7906, 7911, 7917, 7922, - 7927, 6850, 7932, 7936, 7940, 7944, 7949, 7954, 7960, 7964, 7971, 7976, - 7984, 7988, 7991, 7997, 8004, 8008, 8011, 8016, 8020, 3736, 8026, 8034, - 8040, 6865, 8045, 8051, 8056, 8060, 8063, 8078, 8097, 8109, 8122, 8135, - 8148, 8162, 8175, 8190, 8197, 8203, 8207, 8212, 8218, 8226, 8231, 6011, - 8236, 8239, 8244, 8248, 2737, 877, 8254, 8258, 8264, 8270, 8275, 8281, - 8286, 7024, 8292, 8298, 8303, 8308, 8316, 8322, 8335, 8343, 8350, 8354, - 8362, 8369, 8381, 8391, 8398, 8405, 8414, 8423, 8431, 8436, 8442, 7030, - 8447, 8453, 7036, 8458, 8461, 8468, 8474, 8487, 8498, 8505, 8511, 8520, - 8528, 8535, 8541, 8547, 8552, 8556, 8561, 8070, 8567, 7041, 8574, 8579, - 8586, 8592, 8598, 8603, 8611, 8619, 8626, 8630, 8644, 8654, 8659, 8663, - 8674, 8680, 8685, 8690, 8694, 7046, 8699, 8702, 8707, 8719, 8726, 8731, - 8735, 8740, 8744, 8751, 8757, 7051, 6984, 8764, 2742, 8, 8771, 8776, - 8780, 8786, 8797, 8807, 8816, 8828, 8833, 8837, 8845, 8859, 8863, 8866, - 8874, 8881, 8889, 8893, 8904, 8908, 8915, 8920, 8924, 8930, 8935, 8939, - 8944, 8948, 8951, 8957, 8962, 8968, 8975, 8985, 8994, 9001, 7061, 7068, - 7074, 7079, 9007, 7083, 9013, 9016, 9023, 9038, 9054, 9069, 970, 406, - 9074, 9082, 9089, 9095, 9100, 9105, 7092, 9107, 9111, 9115, 9125, 9130, - 9134, 9143, 9147, 9150, 9157, 9161, 9164, 9172, 9179, 9187, 9191, 9198, - 9202, 9208, 9212, 9216, 9220, 9226, 9230, 9234, 9241, 9245, 9250, 9254, - 9261, 9267, 9275, 9281, 9291, 9296, 9301, 9305, 9313, 3641, 9321, 9326, - 9330, 9334, 9337, 9345, 9352, 9356, 9360, 9365, 9369, 9380, 9386, 9390, - 9393, 9400, 9405, 7101, 9410, 9414, 1704, 4265, 9421, 9426, 9431, 9436, - 9442, 9447, 9453, 9458, 9463, 9468, 9473, 9478, 9483, 9488, 9493, 9498, - 9503, 9508, 9513, 9518, 9523, 9528, 9533, 9539, 9544, 9549, 9554, 9559, - 9564, 9570, 9575, 9580, 9586, 9591, 9597, 9602, 9608, 9613, 9618, 9623, - 9628, 9634, 9639, 9644, 670, 134, 9649, 9653, 9658, 9663, 9667, 9671, - 9675, 9680, 9684, 9689, 9693, 9696, 9700, 9704, 9709, 9719, 9725, 9729, - 9733, 9740, 9748, 9757, 9768, 9775, 9782, 9791, 9800, 9809, 9818, 9827, - 9836, 9846, 9856, 9866, 9876, 9886, 9895, 9905, 9915, 9925, 9935, 9945, - 9955, 9965, 9974, 9984, 9994, 10004, 10014, 10024, 10034, 10043, 10053, - 10063, 10073, 10083, 10093, 10103, 10113, 10123, 10133, 10142, 10152, - 10162, 10172, 10182, 10192, 10202, 10212, 10222, 10232, 10242, 10251, - 10257, 10261, 10264, 10268, 10273, 10280, 10286, 10291, 10295, 10300, - 10304, 10308, 7110, 10314, 10319, 10328, 7115, 10333, 10336, 10342, - 10350, 7120, 10357, 10361, 10365, 10369, 10379, 10384, 10393, 10401, - 10408, 10413, 10420, 10425, 10429, 10432, 10443, 10453, 10462, 10470, - 10481, 10493, 10503, 10507, 10512, 10517, 10521, 10526, 10535, 10539, - 10542, 10549, 10559, 10568, 10575, 10579, 10585, 10590, 10595, 10599, - 10608, 10613, 10619, 10624, 10628, 10637, 10645, 10653, 10660, 10668, - 10680, 10691, 10701, 10708, 10714, 10723, 10734, 10743, 10752, 10760, - 10767, 10776, 10784, 5761, 10788, 10790, 10795, 10801, 10809, 10816, - 10825, 10834, 10843, 10852, 10861, 10870, 10879, 10888, 10898, 10908, - 10917, 10924, 10938, 10945, 10953, 10962, 10968, 10977, 10985, 10994, - 11007, 11015, 11022, 11035, 11041, 11050, 11059, 11064, 11068, 11074, - 11080, 11087, 6864, 11092, 11097, 11104, 11109, 11114, 11118, 11124, - 11132, 11140, 11147, 11155, 11163, 11168, 11174, 11179, 11183, 11194, - 11202, 11208, 11213, 11222, 11228, 11233, 11242, 11256, 3600, 11260, - 11265, 11270, 11276, 11281, 11286, 11290, 11295, 11300, 5760, 11305, - 11310, 11315, 11320, 11324, 11329, 11334, 11339, 11345, 11351, 11356, - 11360, 11365, 11370, 11375, 7124, 11380, 11385, 11390, 11395, 11412, - 11430, 11442, 11455, 11472, 11488, 11505, 11515, 11534, 11545, 11556, - 11567, 11578, 11590, 11601, 11612, 11629, 11640, 11651, 11656, 2317, - 11660, 11663, 11669, 11677, 11685, 11690, 11698, 11706, 11713, 11718, - 11724, 11731, 11739, 11746, 11758, 11763, 9032, 11769, 11778, 11786, - 11793, 11799, 11807, 11814, 11821, 11827, 11836, 11844, 11851, 11859, - 11865, 11872, 11880, 11885, 3372, 1187, 11892, 11895, 11306, 11899, - 11905, 11909, 11921, 11926, 11933, 11939, 11944, 11951, 11311, 11316, - 11955, 11959, 11964, 11968, 11976, 11983, 11990, 12007, 12011, 12014, - 12022, 12028, 3428, 12032, 12034, 12042, 12049, 12059, 12064, 12070, - 12075, 12079, 12085, 12090, 12093, 12100, 12106, 12112, 12117, 12124, - 12130, 12135, 12142, 12146, 12152, 12159, 12165, 12171, 12179, 12185, - 12193, 12199, 12205, 12210, 12217, 12222, 12226, 12231, 12238, 12243, - 12249, 12255, 12261, 12264, 12268, 12280, 12286, 12291, 12298, 12304, - 12310, 12321, 12331, 12340, 12348, 12355, 12365, 12375, 12383, 12386, - 11330, 12391, 11335, 11460, 12399, 12412, 12427, 12438, 11477, 12456, - 12469, 12482, 12493, 8085, 12504, 12517, 12536, 12547, 12558, 12569, - 2542, 12582, 12586, 12594, 12605, 12612, 12618, 12626, 12630, 12636, - 12639, 12649, 12657, 12664, 12672, 12677, 12682, 12689, 12695, 12700, - 12705, 12709, 12713, 12719, 12725, 12730, 12735, 12740, 12744, 11340, - 11346, 11352, 12748, 12756, 12765, 12772, 7000, 12776, 12778, 12783, - 12788, 12794, 12799, 12804, 12809, 12814, 12818, 12824, 12830, 12835, - 12841, 12846, 12851, 12857, 12862, 12867, 12872, 12878, 12883, 12888, - 12894, 12900, 12905, 12912, 12919, 12924, 12928, 12932, 12935, 12943, - 12948, 12955, 12960, 12965, 12975, 12980, 12987, 12993, 13003, 13017, - 13031, 13045, 13059, 13074, 13089, 13106, 13124, 13137, 13143, 13148, - 13153, 13159, 13164, 13169, 13173, 13177, 13182, 13186, 13197, 13203, - 13208, 13213, 13217, 13222, 13228, 13235, 13240, 13244, 13250, 13255, - 13260, 13264, 13270, 13275, 13280, 13287, 13292, 13296, 13300, 13305, - 13310, 13316, 13322, 13327, 13336, 13344, 13351, 13358, 13364, 13370, - 13375, 13380, 13386, 13391, 13397, 13402, 13408, 13414, 13421, 13427, - 13432, 13437, 7166, 13446, 13449, 13455, 13460, 13465, 13475, 13482, - 13487, 13493, 13498, 13504, 13509, 13515, 13521, 13526, 13534, 13541, - 13546, 13552, 13557, 13561, 13570, 13581, 13588, 13596, 13602, 13609, - 13615, 13620, 13624, 13630, 13635, 13640, 13645, 7171, 5777, 2756, 13649, - 13653, 13657, 13661, 13665, 13668, 13675, 13683, 11366, 13690, 13700, - 13708, 13715, 13723, 13733, 13742, 13747, 10458, 10467, 13752, 13762, - 13777, 13783, 13790, 13797, 13803, 13813, 13823, 11371, 13832, 13838, - 13844, 13852, 13860, 13865, 13874, 13882, 13894, 13904, 13914, 13924, - 13933, 13945, 13955, 13965, 13976, 13981, 13993, 14005, 14017, 14029, - 14041, 14053, 14065, 14077, 14089, 14101, 14112, 14124, 14136, 14148, - 14160, 14172, 14184, 14196, 14208, 14220, 14232, 14243, 14255, 14267, - 14279, 14291, 14303, 14315, 14327, 14339, 14351, 14363, 14374, 14386, - 14398, 14410, 14422, 14434, 14446, 14458, 14470, 14482, 14494, 14505, - 14517, 14529, 14541, 14553, 14565, 14577, 14589, 14601, 14613, 14625, - 14636, 14648, 14660, 14672, 14684, 14696, 14708, 14720, 14732, 14744, - 14756, 14767, 14779, 14791, 14803, 14815, 14827, 14839, 14851, 14863, - 14875, 14887, 14898, 14910, 14922, 14934, 14946, 14959, 14972, 14985, - 14998, 15011, 15024, 15037, 15049, 15062, 15075, 15088, 15101, 15114, - 15127, 15140, 15153, 15166, 15179, 15191, 15204, 15217, 15230, 15243, - 15256, 15269, 15282, 15295, 15308, 15321, 15333, 15346, 15359, 15372, - 15385, 15398, 15411, 15424, 15437, 15450, 15463, 15475, 15488, 15501, - 15514, 15527, 15540, 15553, 15566, 15579, 15592, 15605, 15617, 15630, - 15643, 15656, 15669, 15682, 15695, 15708, 15721, 15734, 15747, 15759, - 15770, 15783, 15796, 15809, 15822, 15835, 15848, 15861, 15874, 15887, - 15900, 15912, 15925, 15938, 15951, 15964, 15977, 15990, 16003, 16016, - 16029, 16042, 16054, 16067, 16080, 16093, 16106, 16119, 16132, 16145, - 16158, 16171, 16184, 16196, 16209, 16222, 16235, 16248, 16261, 16274, - 16287, 16300, 16313, 16326, 16338, 16351, 16364, 16377, 16390, 16403, - 16416, 16429, 16442, 16455, 16468, 16480, 16493, 16506, 16519, 16532, - 16545, 16558, 16571, 16584, 16597, 16610, 16622, 16635, 16648, 16661, - 16674, 16687, 16700, 16713, 16726, 16739, 16752, 16764, 16777, 16790, - 16803, 16816, 16829, 16842, 16855, 16868, 16881, 16894, 16906, 16919, - 16932, 16945, 16958, 16971, 16984, 16997, 17010, 17023, 17036, 17048, - 17061, 17074, 17087, 17100, 17113, 17126, 17139, 17152, 17165, 17178, - 17190, 17201, 17209, 17216, 17222, 17226, 17232, 17238, 17246, 17252, - 17257, 7005, 17261, 17268, 17276, 17283, 17290, 8481, 17297, 17306, - 17311, 5793, 17318, 17323, 17326, 17331, 17339, 17346, 17353, 17359, - 17368, 17377, 17383, 17388, 17398, 17405, 17413, 17419, 17429, 17438, - 17442, 17449, 17453, 17458, 17464, 17472, 17476, 11381, 17485, 17491, - 17495, 17501, 17508, 17519, 6829, 17527, 17533, 17538, 17542, 17546, - 7415, 17551, 17559, 17566, 17575, 17582, 17589, 17595, 17599, 17605, - 17611, 17619, 17625, 17632, 17638, 17644, 17648, 17656, 17665, 17670, - 17681, 17686, 17691, 17696, 5966, 17700, 17706, 17713, 17722, 17727, - 17735, 17747, 17752, 17756, 17759, 17765, 17771, 17776, 17780, 17783, - 17794, 17799, 7201, 17806, 7016, 7206, 17811, 17816, 17821, 17826, 17831, - 17836, 17841, 17846, 17851, 17856, 17861, 17866, 17872, 17877, 17882, - 17887, 17892, 17897, 17902, 17907, 17912, 17917, 17923, 17929, 17934, - 17939, 17944, 17949, 17954, 17959, 17964, 17969, 17974, 17980, 17985, - 17990, 17995, 18001, 18007, 18012, 18017, 18022, 18027, 18032, 18037, - 18042, 18047, 18053, 18058, 18063, 18068, 18073, 18079, 18084, 18089, - 18093, 129, 18101, 18105, 18109, 18113, 18118, 18122, 18126, 9788, 18130, - 18135, 18139, 18144, 18148, 18153, 18157, 18163, 18168, 18172, 18176, - 18184, 18188, 18193, 18198, 18202, 18208, 18213, 18217, 18222, 18227, - 18231, 18238, 18242, 18246, 18251, 18255, 18258, 18271, 18276, 18285, - 7238, 18290, 18293, 2605, 2610, 18297, 18303, 18309, 18314, 18319, 18324, - 18330, 18335, 18340, 18344, 18349, 18354, 18360, 18365, 18370, 18376, - 18381, 18385, 18390, 18395, 18400, 18404, 18409, 18414, 18419, 18424, - 18428, 18432, 18437, 2765, 18386, 18441, 18448, 7494, 18460, 18468, - 18391, 18475, 18480, 18396, 18488, 18493, 18498, 18503, 18507, 18512, - 18515, 18519, 18525, 18530, 6856, 1709, 1714, 18534, 18540, 18546, 18551, - 18555, 18559, 18563, 18566, 18572, 18579, 18587, 18593, 18599, 18604, - 18609, 18613, 11741, 12361, 18618, 18630, 18633, 18640, 18644, 18652, - 18663, 18672, 18685, 18695, 18709, 18721, 18735, 18745, 18757, 18763, - 18778, 18802, 18820, 18839, 18852, 18866, 18884, 18900, 18917, 18935, - 18946, 18965, 18982, 19002, 19020, 19032, 19046, 19060, 19072, 19089, - 19108, 19126, 19138, 19156, 19175, 11520, 19188, 19208, 19220, 8116, - 19232, 19237, 19242, 19247, 19253, 19258, 2334, 19262, 19268, 19272, - 19275, 19279, 19287, 19293, 18405, 19297, 19308, 19314, 19320, 19329, - 19336, 19341, 19348, 19354, 19363, 19371, 19381, 19391, 19396, 19405, - 19414, 19425, 19436, 3677, 19446, 19450, 19460, 19468, 19478, 19489, - 19497, 19504, 19510, 19515, 18415, 19519, 19528, 19532, 19537, 19546, - 19554, 19564, 19573, 19579, 19585, 18420, 18425, 19589, 19599, 916, - 19608, 11702, 1154, 19622, 19631, 19639, 19650, 19661, 19671, 19680, - 19689, 19698, 19704, 19713, 19721, 7178, 19727, 19730, 19734, 19739, - 19744, 19752, 18433, 19756, 19762, 19768, 19773, 19778, 19782, 19790, - 19796, 19802, 3351, 19810, 19815, 19820, 19824, 19828, 19835, 19839, - 19847, 19853, 19858, 19862, 19867, 19873, 19877, 19888, 19893, 19897, - 19908, 19912, 19916, 19919, 19923, 19928, 19932, 19936, 903, 19940, - 19945, 19950, 19955, 19960, 19965, 19970, 19975, 19980, 19985, 19990, - 19995, 20000, 20005, 20011, 20016, 20021, 20026, 20031, 20036, 20041, - 20047, 20052, 20057, 20062, 20067, 20072, 20077, 20082, 20088, 20094, - 20099, 20105, 20110, 20115, 5, 20121, 20125, 20129, 20133, 20138, 20142, - 20146, 20150, 20154, 20159, 20163, 20168, 20172, 20175, 20179, 20184, - 20188, 20193, 20197, 20201, 20205, 20210, 20214, 20218, 20228, 20233, - 20237, 20241, 20246, 20251, 20260, 20265, 20270, 20274, 20278, 20290, - 20299, 20308, 20314, 20318, 20322, 20332, 20341, 20349, 20355, 20359, - 20366, 20376, 20385, 20393, 20401, 20408, 20416, 20425, 20434, 20442, - 20447, 20451, 20455, 20458, 20460, 20464, 20468, 20473, 20478, 20482, - 20486, 20489, 20493, 20496, 20500, 20503, 20506, 20510, 20516, 20520, - 20524, 20528, 20533, 20538, 20543, 20547, 20550, 20555, 20561, 20566, - 20572, 20577, 20581, 20585, 20589, 20594, 20598, 20603, 20607, 20614, - 20618, 20621, 20625, 20631, 20637, 20641, 20645, 20650, 20657, 20663, - 20667, 20676, 20680, 20684, 20687, 20693, 20698, 20704, 1471, 1773, - 20709, 20714, 20719, 20724, 20729, 20734, 20739, 2157, 20744, 20745, - 20748, 20752, 20756, 20761, 20765, 20769, 20772, 20777, 20782, 20786, - 20789, 20794, 20798, 20803, 20807, 11714, 20812, 20815, 20818, 20822, - 20826, 20835, 20842, 20847, 20854, 20858, 20862, 20867, 20872, 20876, - 20881, 20893, 20904, 20909, 20913, 20918, 20922, 20925, 20931, 5894, - 2252, 20935, 20951, 7270, 20971, 20980, 20996, 21000, 21003, 21009, - 21019, 21025, 21040, 21052, 21063, 21071, 21080, 21086, 21095, 21105, - 21116, 21127, 21136, 21145, 21153, 21160, 21168, 21181, 21187, 21192, - 21198, 21203, 21211, 21223, 21235, 21249, 21257, 21264, 21273, 21282, - 21290, 21298, 21306, 21313, 21322, 21330, 21340, 21349, 21359, 21368, - 21377, 21385, 21390, 21394, 21397, 21401, 21405, 21409, 21413, 21417, - 21423, 21429, 11759, 21434, 21446, 21452, 7623, 21463, 21473, 21482, - 21486, 21489, 21493, 21499, 21503, 21508, 21517, 21524, 5935, 21531, - 21539, 21546, 21552, 21557, 21563, 21569, 21577, 21581, 21584, 21586, - 21402, 21595, 21601, 21611, 21616, 21622, 21627, 21632, 21637, 21644, - 21653, 21662, 21668, 21673, 21679, 21684, 21691, 21702, 21707, 21711, - 21721, 21725, 21730, 21740, 21749, 21753, 21761, 21768, 21774, 21779, - 21786, 21790, 10323, 21798, 21805, 21812, 18204, 21327, 21817, 21821, - 18952, 21826, 21840, 21856, 21874, 21893, 21910, 21928, 18971, 21945, - 21965, 18988, 21977, 21989, 12443, 22001, 19008, 22015, 22027, 8129, - 22041, 22046, 22051, 22057, 22061, 22066, 22076, 22082, 7994, 22088, - 22090, 22095, 22103, 22107, 21640, 22113, 22120, 22130, 22135, 22139, - 22142, 22148, 22156, 22166, 22182, 22195, 22209, 12461, 22223, 22230, - 22234, 22237, 22242, 22246, 22256, 22261, 22266, 22271, 22279, 22287, - 22296, 22301, 12466, 22305, 22308, 22311, 22316, 22332, 22340, 22348, - 22356, 22361, 22365, 22371, 22377, 22380, 22386, 22398, 22405, 22411, - 22418, 22432, 22445, 22454, 22466, 22477, 22486, 22495, 22503, 22514, - 5917, 22521, 22527, 22532, 22538, 22548, 22557, 22563, 22568, 22575, - 22583, 22595, 22602, 22611, 22619, 22625, 22631, 22636, 22640, 22643, - 22649, 22654, 22658, 22669, 22678, 22686, 22691, 22697, 10921, 6581, - 22702, 22705, 22708, 22714, 22722, 22730, 22734, 22738, 22743, 22746, - 22755, 22763, 22774, 22778, 22784, 22790, 22794, 22800, 22822, 22846, - 22853, 22859, 22870, 22888, 22895, 22903, 22907, 22916, 22929, 22937, - 22949, 22960, 22970, 22984, 22993, 23001, 23013, 7287, 23024, 23035, - 23047, 23057, 23066, 23071, 23075, 23083, 23088, 23092, 23095, 23098, - 23106, 23114, 23123, 23133, 23142, 23148, 23162, 2556, 23184, 23193, - 23203, 23215, 23225, 23233, 23241, 23250, 23255, 23266, 23277, 23281, - 23291, 23300, 23310, 23320, 23328, 23337, 23344, 23352, 23359, 23368, - 23372, 23380, 23387, 23394, 23405, 23420, 23427, 23437, 23446, 23452, - 11054, 23459, 23464, 23468, 23472, 23480, 23486, 23495, 23500, 23510, - 19517, 23514, 23517, 23522, 23527, 23532, 23537, 23542, 23547, 23552, - 23557, 23563, 23568, 23573, 23579, 1242, 639, 23584, 23593, 2300, 23600, - 23605, 23609, 23615, 1275, 506, 343, 23620, 23629, 23637, 23646, 23654, - 23665, 23674, 23682, 23686, 23689, 23697, 23705, 11727, 23710, 23716, - 4101, 23721, 23725, 23731, 23735, 23742, 1437, 23748, 7355, 23755, 23765, - 23773, 23779, 23788, 23796, 23802, 23810, 23817, 23824, 1478, 2338, - 23831, 23837, 23848, 23859, 23867, 23874, 23883, 23891, 23898, 23905, - 23918, 23929, 23948, 1280, 23952, 23957, 23965, 3387, 23969, 23974, 1441, - 20487, 23984, 23988, 23993, 23997, 3333, 24003, 24011, 24018, 24026, - 3388, 260, 24031, 24039, 24047, 24054, 24060, 24065, 24072, 24075, 24081, - 21504, 24087, 106, 24091, 24095, 24101, 24106, 24113, 24119, 2263, 24123, - 24127, 24130, 24133, 24140, 24146, 18500, 24151, 3432, 13175, 24155, - 24158, 24166, 24169, 24179, 24191, 24196, 24200, 24208, 24215, 24221, - 24228, 24235, 24238, 24242, 24246, 1445, 24256, 24258, 24263, 24269, - 24275, 24280, 24285, 24290, 24295, 24300, 24305, 24310, 24315, 24320, - 24325, 24330, 24335, 24340, 24345, 24351, 24357, 24363, 24369, 24374, - 24379, 24384, 24390, 24395, 24400, 24405, 24411, 24416, 24422, 24427, - 24432, 24437, 24442, 24448, 24453, 24459, 24464, 24469, 24474, 24479, - 24485, 24490, 24496, 24501, 24506, 24511, 24516, 24521, 24526, 24531, - 24536, 24541, 24547, 24553, 24559, 24564, 24569, 24574, 24579, 24585, - 24591, 24597, 24603, 24609, 24615, 24620, 24626, 24631, 24636, 24641, - 24646, 24652, 2376, 24657, 2383, 2390, 2647, 24662, 2396, 2406, 24668, - 24672, 24677, 24682, 24688, 24693, 24698, 24702, 24707, 24713, 24718, - 24723, 24729, 24734, 24738, 24743, 24748, 24753, 24758, 24763, 24769, - 24775, 24780, 24784, 24789, 24793, 24798, 24803, 24808, 24812, 24817, - 24822, 24827, 24832, 24838, 24844, 24849, 24853, 24858, 24863, 24868, - 24873, 24878, 24882, 24887, 24892, 24897, 24901, 24906, 24914, 24920, - 24926, 24932, 24937, 24941, 24944, 24948, 24953, 24957, 24962, 24966, - 24969, 24974, 17578, 23752, 24979, 24984, 24988, 24993, 24997, 25001, - 25006, 25010, 25013, 25016, 25020, 25025, 25033, 25037, 25042, 25046, - 25050, 25055, 25060, 25064, 25070, 25075, 25080, 25087, 25094, 25098, - 25101, 25107, 25116, 25123, 25130, 25134, 25139, 25143, 25149, 25155, - 25159, 25165, 25170, 25175, 25182, 25188, 25194, 25200, 25206, 25213, - 25219, 25225, 25231, 25237, 25243, 25249, 25255, 25262, 25268, 25275, - 25281, 25287, 25293, 25299, 25305, 25311, 25317, 25323, 25329, 8917, - 25335, 25340, 25345, 12716, 25350, 25355, 25360, 25366, 25371, 25376, - 25380, 25385, 25390, 25396, 25401, 25406, 25410, 25415, 25420, 25424, - 25429, 25434, 25439, 25443, 25448, 25453, 25458, 25462, 25466, 12060, - 25470, 25479, 25485, 25491, 25500, 25508, 25513, 25517, 25524, 25530, - 25534, 25539, 25548, 25553, 1477, 25559, 25562, 25566, 18541, 18547, - 25572, 25576, 25587, 25598, 25610, 25617, 25624, 25629, 25633, 17235, - 685, 17577, 25641, 25645, 25650, 25656, 25661, 25667, 25672, 25678, - 25683, 8022, 2714, 3282, 25687, 25690, 25696, 25702, 25708, 25715, 25721, - 25727, 25733, 25739, 25745, 25751, 25757, 25763, 25769, 25775, 25781, - 25787, 25794, 25800, 25806, 25812, 25818, 25824, 25827, 25832, 25837, - 25843, 25848, 25853, 25857, 25862, 25868, 25873, 25878, 25884, 25889, - 25895, 25899, 25904, 25909, 25914, 25919, 25923, 25928, 25933, 25938, - 25944, 25950, 25956, 25961, 25965, 25970, 25974, 25982, 3455, 25988, - 25991, 5976, 25995, 26001, 26008, 5985, 26012, 26018, 26025, 26031, - 26040, 26048, 26052, 26059, 26065, 26069, 26072, 26081, 26089, 26093, - 26103, 26113, 26123, 26129, 26139, 26144, 26157, 26171, 26182, 26194, - 26206, 26220, 26233, 26245, 26257, 11561, 26271, 26276, 26281, 26285, - 26289, 26293, 1762, 22475, 26297, 26302, 26307, 26311, 26314, 26319, - 26324, 26330, 26336, 7767, 12395, 26341, 26346, 26351, 26355, 26360, - 25651, 26365, 26370, 26376, 25657, 26381, 26384, 26392, 25662, 26397, - 26403, 26409, 25668, 26414, 26419, 26425, 26430, 26435, 26441, 26447, - 23128, 26452, 26456, 26461, 26466, 26471, 26479, 26483, 26488, 26493, - 26497, 26502, 26507, 26512, 25673, 25679, 26518, 2452, 234, 26521, 26524, - 26528, 26532, 26540, 26547, 26554, 26558, 26561, 26567, 26575, 26583, - 26587, 26591, 26594, 26601, 26605, 26612, 26620, 26628, 26635, 26639, - 635, 292, 26651, 26656, 26661, 26667, 26672, 3466, 26677, 26682, 26687, - 26692, 26697, 18626, 26702, 26707, 26712, 26717, 26723, 26728, 26732, - 26737, 26742, 26747, 26751, 26756, 26761, 26766, 18464, 3472, 26771, - 26776, 26781, 26787, 26792, 26797, 26801, 26806, 26811, 26817, 26822, - 26827, 26831, 26836, 26841, 26846, 26850, 26855, 26860, 26865, 26871, - 26877, 26882, 26886, 26891, 26896, 26901, 26905, 26913, 26917, 26923, - 26927, 26934, 13070, 26940, 26947, 26955, 26962, 26968, 26980, 26986, - 2666, 26990, 26596, 26994, 27005, 27010, 27015, 27020, 27024, 27029, - 18552, 27033, 17591, 27038, 27043, 27049, 27054, 27058, 27062, 27065, - 27071, 27082, 27094, 27099, 27103, 27106, 321, 27110, 27115, 27120, - 27125, 27130, 27135, 27141, 27146, 27151, 27157, 27162, 27168, 27173, - 27179, 27184, 27189, 27194, 27199, 27204, 27209, 27214, 27219, 27225, - 27230, 27235, 27240, 27245, 27250, 27255, 27260, 27266, 27272, 27277, - 27282, 27287, 27292, 27297, 27302, 27307, 27312, 27317, 27322, 27327, - 27332, 27337, 27342, 27347, 27352, 27357, 27362, 27368, 26, 27373, 27377, - 27381, 27389, 27393, 27397, 27400, 27403, 27408, 27412, 27417, 27421, - 27426, 27430, 27435, 27439, 27442, 27444, 27447, 27449, 27453, 27465, - 27474, 27478, 27484, 27489, 27495, 27500, 27505, 27509, 27514, 27521, - 27526, 27532, 27537, 27541, 27548, 21335, 21345, 27552, 27557, 27562, - 27567, 27571, 27578, 6076, 27584, 27593, 27601, 27616, 27630, 27638, - 27649, 27658, 27663, 5243, 27673, 27678, 27682, 27685, 27689, 27693, - 27700, 27705, 6820, 27715, 27717, 27720, 27724, 27728, 27733, 27739, - 27744, 27753, 27759, 27764, 27771, 27775, 27782, 27795, 27803, 27807, - 27817, 27822, 27826, 27830, 27836, 27841, 27851, 27860, 27871, 27879, - 27890, 27899, 27902, 27906, 27914, 27920, 27928, 27935, 27941, 2351, - 27945, 27947, 27952, 27957, 27960, 27962, 27966, 27969, 27973, 27977, - 27980, 27986, 27996, 28001, 28007, 28011, 28016, 28029, 21606, 28035, - 28044, 13898, 26109, 28051, 28056, 28060, 28068, 28075, 28080, 28084, - 28088, 28096, 28102, 28108, 28113, 28117, 28120, 28125, 28138, 28154, - 19078, 28171, 28183, 28200, 28212, 28226, 19095, 19114, 28238, 28250, - 2573, 28264, 28269, 28274, 28278, 28285, 28297, 28303, 28306, 28311, - 18244, 28314, 28318, 28321, 28326, 28331, 28337, 28342, 28347, 28353, - 28359, 28364, 28368, 28373, 28378, 28383, 28387, 28390, 28396, 28401, - 28406, 28411, 28415, 28420, 28426, 28431, 28436, 28442, 28447, 28452, - 28457, 28462, 28467, 28471, 28474, 28480, 28484, 28492, 28499, 28507, - 28517, 28523, 28529, 28533, 28542, 28547, 28552, 8036, 28557, 28564, - 28570, 28575, 28581, 28589, 28596, 28600, 28603, 28614, 28621, 28627, - 28636, 28640, 28643, 28649, 28656, 28662, 28668, 28676, 24055, 28683, - 28691, 28697, 28702, 28708, 28713, 28719, 28723, 28730, 28736, 21619, - 28745, 28750, 28758, 28766, 7383, 4120, 28773, 28777, 28781, 28785, - 28790, 28794, 28798, 28803, 28808, 28812, 17640, 28817, 28821, 28825, - 28829, 28832, 28834, 28839, 28847, 28851, 28858, 28862, 28870, 28877, - 28887, 28891, 28895, 28903, 28909, 28918, 10570, 28924, 28933, 28940, - 28948, 28956, 28964, 28971, 28978, 28985, 28992, 28999, 29004, 29010, - 29027, 29035, 29043, 29050, 380, 29054, 29060, 27654, 29066, 29069, - 29077, 29083, 29089, 29098, 29104, 3420, 12046, 29113, 29120, 29125, - 29129, 29136, 29144, 29153, 29163, 29169, 29177, 29186, 29194, 18248, - 29201, 29208, 29214, 29224, 29233, 29244, 29248, 29254, 29259, 29265, - 29271, 29276, 29289, 29302, 29315, 29322, 29328, 29333, 29337, 1451, - 29341, 29346, 29351, 29356, 29361, 29367, 29372, 29377, 29382, 29387, - 29392, 29397, 29402, 29408, 29414, 29419, 29424, 29430, 29435, 29440, - 29445, 29451, 29456, 29461, 29466, 29471, 29477, 29482, 29487, 29493, - 29498, 29503, 29508, 29513, 29518, 29524, 29529, 29535, 29540, 29546, - 29551, 29556, 29561, 29567, 29573, 29579, 29585, 29591, 29597, 29603, - 29609, 29614, 29619, 29625, 29630, 29635, 29640, 29645, 29650, 29655, - 29660, 29666, 29671, 29676, 29682, 29688, 101, 29693, 29695, 29699, - 29703, 29707, 29712, 29716, 7323, 29720, 29726, 4331, 29732, 29735, - 29740, 29744, 29749, 29753, 29757, 29762, 7869, 29766, 29770, 29774, - 12131, 29779, 29783, 29788, 29793, 29798, 29802, 29809, 21623, 29815, - 29818, 29822, 29827, 29833, 29837, 29843, 29848, 29852, 29856, 29860, - 3317, 3322, 24194, 29863, 29871, 29878, 29882, 29887, 342, 29892, 29898, - 29904, 29908, 29917, 29921, 29925, 29930, 29935, 29939, 29946, 29952, - 29957, 29972, 29987, 30002, 30018, 30036, 7831, 30050, 30055, 30059, - 30067, 27788, 30075, 30079, 30088, 30096, 7546, 11842, 30100, 30103, - 30106, 6089, 3621, 30111, 30119, 30123, 30126, 30130, 30135, 30140, - 30146, 30151, 30155, 30159, 30164, 30168, 30174, 30178, 30185, 30189, - 9256, 30196, 30202, 30207, 30214, 30221, 30228, 23641, 6020, 30235, - 30242, 30249, 30255, 30260, 30267, 30278, 30284, 30289, 30296, 30300, - 30304, 30314, 30325, 30331, 30336, 30341, 30346, 30351, 30355, 30359, - 30365, 2255, 767, 7891, 7896, 7902, 30374, 7907, 7912, 7918, 30379, - 30389, 30393, 7923, 30398, 30401, 30406, 30410, 30415, 30422, 30428, - 30438, 4146, 30447, 30451, 30455, 30465, 30471, 30482, 30488, 30494, - 30499, 30505, 30511, 30516, 30519, 30526, 30532, 30537, 30544, 30551, - 30555, 30565, 30578, 30587, 30596, 30607, 30620, 30629, 30640, 30645, - 30650, 7928, 30656, 30664, 30669, 5094, 21, 30676, 30681, 13284, 30685, - 30688, 30691, 23219, 30695, 23650, 30703, 30707, 30710, 30716, 30722, - 30730, 30736, 30743, 30747, 30751, 23383, 30755, 30764, 30770, 30775, - 30779, 30787, 21669, 30793, 30800, 30806, 30811, 30816, 30820, 30826, - 30831, 30837, 3747, 716, 30844, 30848, 30851, 12054, 30863, 29182, 30874, - 30877, 30884, 30890, 30894, 30900, 30905, 30911, 30916, 30921, 30925, - 30930, 30935, 30945, 30951, 30964, 30970, 30975, 30981, 13193, 1454, 932, - 25770, 25776, 30986, 25782, 25795, 25801, 25807, 30992, 25813, 25819, - 30998, 31004, 14, 31012, 31019, 31023, 31027, 31035, 31039, 31044, 31048, - 31055, 31060, 31064, 31069, 31075, 31080, 31086, 31091, 31095, 31099, - 31103, 31108, 31112, 31117, 31121, 31128, 31133, 31137, 31142, 31146, - 31151, 31155, 31160, 12218, 12223, 31165, 31169, 31172, 31176, 31181, - 31185, 31191, 31198, 31203, 31213, 31218, 31226, 31230, 31233, 31237, - 31242, 31247, 31251, 31256, 10581, 31267, 31271, 31274, 31278, 31282, - 31285, 31289, 6108, 10597, 31292, 31295, 31300, 31304, 31313, 31329, - 31345, 31355, 23138, 31362, 31366, 31371, 31375, 31379, 31384, 31389, - 31393, 31398, 31402, 31406, 22323, 31412, 17702, 31417, 31424, 31432, - 31438, 31445, 31453, 31459, 31463, 31469, 31477, 31481, 31490, 7304, - 31498, 31502, 31510, 31517, 31522, 31526, 31529, 31533, 31536, 31540, - 31547, 31552, 21814, 25825, 31556, 31563, 31569, 31574, 31577, 31579, - 31586, 31593, 31599, 31603, 31606, 31610, 31614, 31618, 31623, 31627, - 31631, 31634, 31638, 31652, 19144, 31671, 31684, 31697, 31710, 19162, - 31725, 8090, 31740, 31746, 31750, 31754, 31761, 31767, 31772, 31778, - 31788, 31800, 31811, 31816, 31823, 31827, 31830, 12589, 31838, 12239, - 31851, 31855, 31859, 31864, 31869, 31873, 31877, 31880, 5750, 23022, - 31885, 31889, 31895, 31904, 31909, 29159, 31915, 31920, 31924, 31929, - 31936, 31940, 31943, 11526, 31948, 31955, 939, 31959, 31964, 31969, - 31975, 31980, 31985, 31989, 31994, 32000, 32005, 32011, 32016, 32022, - 32032, 32037, 32042, 32046, 5245, 5257, 32051, 32054, 32061, 32070, - 32074, 32077, 32081, 32086, 668, 32091, 32097, 23211, 32103, 32108, - 32118, 32127, 32134, 32140, 32144, 32151, 32157, 32164, 32170, 32180, - 32188, 32194, 32200, 32205, 32209, 32216, 32222, 32229, 31619, 548, 1208, - 32235, 32240, 32243, 32249, 32257, 1383, 32262, 32266, 32271, 32278, - 32284, 32288, 32293, 32302, 32309, 32319, 32325, 23237, 32342, 32351, - 32359, 32365, 32370, 32377, 32383, 32391, 32400, 32408, 32413, 32421, - 32427, 32446, 12522, 32460, 32476, 32490, 32496, 32501, 32506, 32511, - 32517, 32522, 32526, 32533, 32538, 32542, 319, 2807, 32549, 32554, 22579, - 32380, 32559, 32564, 32572, 32576, 32579, 32585, 32589, 23287, 32592, - 32596, 32599, 32604, 32608, 32613, 32618, 32622, 32627, 32631, 17511, - 17522, 32635, 32640, 32646, 22292, 32651, 32655, 12702, 32658, 32663, - 32668, 32673, 32678, 32683, 32688, 32693, 453, 43, 25828, 25833, 25838, - 25844, 25849, 25854, 32698, 25858, 32702, 32706, 25863, 25869, 32710, - 25874, 25879, 32718, 32723, 25885, 32728, 32733, 32738, 32743, 32749, - 32755, 25896, 32768, 32774, 25900, 25905, 32778, 25910, 25915, 32781, - 32786, 32790, 25591, 32796, 10746, 32803, 32808, 25920, 32812, 32817, - 32822, 32827, 32831, 32836, 32841, 32847, 32852, 32857, 32863, 32869, - 32874, 32878, 32883, 32888, 32893, 32897, 32902, 32907, 32912, 32918, - 32924, 32930, 32935, 32939, 32944, 32948, 25924, 25929, 25934, 32952, - 32956, 25939, 25945, 25951, 25957, 32968, 21521, 32972, 32976, 32981, - 32986, 32991, 32995, 32999, 33009, 33014, 33019, 33023, 33027, 33030, - 33038, 25966, 1461, 33043, 33051, 33060, 33064, 33072, 33080, 33096, - 33101, 1731, 9398, 33105, 2853, 33117, 33118, 33126, 33133, 33138, 33143, - 7197, 1043, 7950, 33150, 33155, 33158, 33167, 1294, 33172, 33179, 33182, - 33187, 18600, 2485, 33191, 8312, 33201, 33207, 2273, 2283, 33216, 33225, - 27997, 7985, 3565, 29063, 1299, 33235, 33243, 33250, 33255, 33259, 33263, - 19759, 8012, 33271, 33280, 33289, 33297, 33304, 33309, 33322, 33335, - 33347, 33359, 33371, 33384, 33395, 33406, 33414, 33422, 33434, 33446, - 33457, 33466, 33474, 33481, 33493, 33500, 33509, 33516, 33529, 33539, - 33544, 33550, 33555, 33559, 33566, 33570, 33577, 33585, 2451, 33592, - 33603, 33613, 33622, 33630, 33640, 33648, 33658, 33663, 33669, 33680, - 33690, 33699, 33708, 33718, 33727, 33732, 33737, 1687, 37, 33745, 33753, - 33764, 33775, 33785, 33792, 33798, 33803, 33807, 33818, 33828, 33837, - 33848, 13257, 13262, 33853, 33862, 33867, 33877, 33882, 33890, 33898, - 33905, 33911, 8057, 1018, 33915, 33921, 33926, 33929, 2094, 31856, 33937, - 33941, 33944, 1494, 33950, 11019, 1304, 33955, 33968, 33982, 2536, 34000, - 34012, 34024, 2550, 2567, 34038, 34051, 2582, 34065, 34077, 2597, 34091, - 1310, 1316, 1322, 8237, 34096, 34101, 34106, 34110, 34125, 34140, 34155, - 34170, 34185, 34200, 34215, 34230, 34245, 34260, 34275, 34290, 34305, - 34320, 34335, 34350, 34365, 34380, 34395, 34410, 34425, 34440, 34455, - 34470, 34485, 34500, 34515, 34530, 34545, 34560, 34575, 34590, 34605, - 34620, 34635, 34650, 34665, 34680, 34695, 34710, 34725, 34740, 34755, - 34770, 34785, 34800, 34815, 34830, 34845, 34860, 34875, 34890, 34905, - 34920, 34935, 34950, 34965, 34980, 34995, 35010, 35025, 35040, 35055, - 35070, 35085, 35100, 35115, 35130, 35145, 35160, 35175, 35190, 35205, - 35220, 35235, 35250, 35265, 35280, 35295, 35310, 35325, 35340, 35355, - 35370, 35385, 35400, 35415, 35430, 35445, 35460, 35475, 35490, 35505, - 35520, 35535, 35550, 35565, 35580, 35595, 35610, 35625, 35640, 35655, - 35670, 35685, 35700, 35715, 35730, 35745, 35760, 35775, 35790, 35805, - 35820, 35835, 35850, 35865, 35880, 35895, 35910, 35925, 35940, 35955, - 35970, 35985, 36000, 36015, 36030, 36045, 36060, 36075, 36090, 36105, - 36120, 36135, 36150, 36165, 36180, 36195, 36210, 36225, 36240, 36255, - 36270, 36285, 36300, 36315, 36330, 36345, 36360, 36375, 36390, 36405, - 36420, 36435, 36450, 36465, 36480, 36495, 36510, 36525, 36540, 36555, - 36570, 36585, 36600, 36615, 36630, 36645, 36660, 36675, 36690, 36705, - 36720, 36735, 36750, 36765, 36780, 36795, 36810, 36825, 36840, 36855, - 36870, 36885, 36900, 36915, 36930, 36945, 36960, 36975, 36990, 37005, - 37020, 37035, 37050, 37065, 37080, 37095, 37110, 37125, 37140, 37155, - 37170, 37185, 37200, 37215, 37230, 37245, 37260, 37275, 37290, 37305, - 37320, 37335, 37350, 37365, 37380, 37395, 37410, 37425, 37440, 37455, - 37470, 37485, 37500, 37515, 37530, 37545, 37560, 37575, 37590, 37605, - 37620, 37635, 37650, 37665, 37680, 37695, 37710, 37725, 37740, 37755, - 37770, 37785, 37800, 37815, 37830, 37845, 37860, 37875, 37890, 37905, - 37920, 37935, 37950, 37965, 37980, 37995, 38010, 38025, 38040, 38055, - 38070, 38085, 38100, 38115, 38130, 38145, 38160, 38175, 38190, 38205, - 38220, 38235, 38250, 38265, 38280, 38295, 38310, 38325, 38340, 38355, - 38370, 38385, 38400, 38415, 38430, 38445, 38460, 38475, 38490, 38505, - 38520, 38535, 38550, 38565, 38580, 38595, 38610, 38625, 38640, 38655, - 38670, 38685, 38700, 38715, 38730, 38745, 38760, 38775, 38790, 38805, - 38820, 38835, 38850, 38865, 38880, 38895, 38910, 38925, 38940, 38955, - 38970, 38985, 39000, 39015, 39030, 39045, 39060, 39075, 39090, 39105, - 39120, 39135, 39150, 39165, 39180, 39195, 39210, 39225, 39240, 39255, - 39270, 39285, 39300, 39315, 39330, 39345, 39360, 39375, 39390, 39405, - 39420, 39435, 39450, 39465, 39480, 39495, 39510, 39525, 39540, 39555, - 39570, 39585, 39600, 39615, 39630, 39645, 39660, 39675, 39690, 39705, - 39720, 39735, 39750, 39765, 39780, 39795, 39810, 39825, 39840, 39855, - 39870, 39885, 39900, 39915, 39930, 39945, 39960, 39975, 39990, 40005, - 40020, 40035, 40050, 40065, 40080, 40095, 40110, 40125, 40140, 40155, - 40170, 40185, 40200, 40215, 40230, 40245, 40260, 40275, 40290, 40305, - 40320, 40335, 40350, 40365, 40380, 40395, 40410, 40425, 40440, 40455, - 40470, 40485, 40500, 40515, 40530, 40545, 40560, 40575, 40590, 40605, - 40620, 40635, 40650, 40665, 40680, 40695, 40710, 40725, 40740, 40755, - 40770, 40785, 40800, 40815, 40830, 40845, 40860, 40875, 40890, 40905, - 40920, 40935, 40950, 40965, 40980, 40995, 41010, 41025, 41040, 41055, - 41070, 41085, 41100, 41115, 41130, 41145, 41160, 41175, 41190, 41205, - 41220, 41235, 41250, 41265, 41280, 41295, 41310, 41325, 41340, 41355, - 41370, 41385, 41400, 41415, 41430, 41445, 41460, 41475, 41490, 41505, - 41520, 41535, 41550, 41565, 41580, 41595, 41610, 41625, 41640, 41655, - 41670, 41685, 41700, 41715, 41730, 41745, 41761, 41777, 41793, 41809, - 41825, 41841, 41857, 41873, 41889, 41905, 41921, 41937, 41953, 41969, - 41985, 42001, 42017, 42033, 42049, 42065, 42081, 42097, 42113, 42129, - 42145, 42161, 42177, 42193, 42209, 42225, 42241, 42257, 42273, 42289, - 42305, 42321, 42337, 42353, 42369, 42385, 42401, 42417, 42433, 42449, - 42465, 42481, 42497, 42513, 42529, 42545, 42561, 42577, 42593, 42609, - 42625, 42641, 42657, 42673, 42689, 42705, 42721, 42737, 42753, 42769, - 42785, 42801, 42817, 42833, 42849, 42865, 42881, 42897, 42913, 42929, - 42945, 42961, 42977, 42993, 43009, 43025, 43041, 43057, 43073, 43089, - 43105, 43121, 43137, 43153, 43169, 43185, 43201, 43217, 43233, 43249, - 43265, 43281, 43297, 43313, 43329, 43345, 43361, 43377, 43393, 43409, - 43425, 43441, 43457, 43473, 43489, 43505, 43521, 43537, 43553, 43569, - 43585, 43601, 43617, 43633, 43649, 43665, 43681, 43697, 43713, 43729, - 43745, 43761, 43777, 43793, 43809, 43825, 43841, 43857, 43873, 43889, - 43905, 43921, 43937, 43953, 43969, 43985, 44001, 44017, 44033, 44049, - 44065, 44081, 44097, 44113, 44129, 44145, 44161, 44177, 44193, 44209, - 44225, 44241, 44257, 44273, 44289, 44305, 44321, 44337, 44353, 44369, - 44385, 44401, 44417, 44433, 44449, 44465, 44481, 44497, 44513, 44529, - 44545, 44561, 44577, 44593, 44609, 44625, 44641, 44657, 44673, 44689, - 44705, 44721, 44737, 44753, 44769, 44785, 44801, 44817, 44833, 44849, - 44865, 44881, 44897, 44913, 44929, 44945, 44961, 44977, 44993, 45009, - 45025, 45041, 45057, 45073, 45089, 45105, 45121, 45137, 45153, 45169, - 45185, 45201, 45217, 45233, 45249, 45265, 45281, 45297, 45313, 45329, - 45345, 45361, 45377, 45393, 45409, 45425, 45441, 45457, 45473, 45489, - 45505, 45521, 45537, 45553, 45569, 45585, 45601, 45617, 45633, 45649, - 45665, 45681, 45697, 45713, 45729, 45745, 45761, 45777, 45793, 45809, - 45825, 45841, 45857, 45873, 45889, 45905, 45921, 45937, 45953, 45969, - 45985, 46001, 46017, 46033, 46049, 46065, 46081, 46097, 46113, 46129, - 46145, 46161, 46177, 46193, 46209, 46225, 46241, 46257, 46273, 46289, - 46305, 46321, 46337, 46353, 46369, 46385, 46401, 46417, 46433, 46449, - 46465, 46481, 46497, 46513, 46529, 46545, 46561, 46577, 46593, 46609, - 46625, 46641, 46657, 46673, 46689, 46705, 46721, 46737, 46753, 46769, - 46785, 46801, 46817, 46833, 46849, 46865, 46881, 46897, 46913, 46929, - 46945, 46961, 46977, 46993, 47009, 47025, 47041, 47057, 47073, 47089, - 47105, 47121, 47137, 47153, 47169, 47185, 47201, 47217, 47233, 47249, - 47265, 47281, 47297, 47313, 47329, 47345, 47361, 47377, 47393, 47409, - 47425, 47441, 47457, 47473, 47489, 47505, 47521, 47537, 47553, 47569, - 47585, 47601, 47617, 47633, 47649, 47665, 47681, 47697, 47713, 47729, - 47745, 47761, 47777, 47793, 47809, 47825, 47841, 47857, 47873, 47889, - 47905, 47921, 47937, 47953, 47969, 47985, 48001, 48017, 48033, 48049, - 48065, 48081, 48097, 48113, 48129, 48145, 48161, 48177, 48193, 48209, - 48225, 48241, 48257, 48273, 48289, 48305, 48321, 48337, 48353, 48369, - 48385, 48401, 48417, 48433, 48449, 48465, 48481, 48497, 48513, 48529, - 48545, 48561, 48577, 48593, 48609, 48625, 48641, 48657, 48673, 48689, - 48705, 48721, 48737, 48753, 48769, 48785, 48801, 48817, 48833, 48849, - 48865, 48881, 48897, 48913, 48929, 48945, 48961, 48977, 48993, 49009, - 49025, 49041, 49057, 49073, 49089, 49105, 49121, 49137, 49153, 49169, - 49185, 49201, 49217, 49233, 49249, 49265, 49281, 49297, 49313, 49329, - 49345, 49361, 49377, 49393, 49409, 49425, 49441, 49457, 49473, 49489, - 49505, 49521, 49537, 49553, 49569, 49585, 49601, 49617, 49633, 49649, - 49665, 49681, 49697, 49713, 49729, 49745, 49761, 49777, 49793, 49809, - 49825, 49841, 49857, 49873, 49889, 49905, 49921, 49937, 49953, 49969, - 49985, 50001, 50017, 50033, 50049, 50065, 50081, 50097, 50113, 50129, - 50145, 50161, 50177, 50193, 50209, 50225, 50241, 50257, 50273, 50289, - 50305, 50321, 50337, 50353, 50369, 50385, 50401, 50417, 50432, 50441, - 50447, 50453, 50463, 50471, 11823, 13787, 7661, 50484, 1502, 50492, - 22665, 5207, 50498, 50503, 50508, 50513, 50518, 50524, 50529, 50535, - 50540, 50546, 50551, 50556, 50561, 50566, 50572, 50577, 50582, 50587, - 50592, 50597, 50602, 50607, 50613, 50618, 50624, 50631, 2489, 50636, - 50642, 6480, 50646, 50651, 50658, 50666, 40, 50670, 50676, 50681, 50686, - 50690, 50695, 50699, 50703, 8255, 50707, 50717, 50730, 50741, 50754, - 50761, 50767, 50772, 50778, 50784, 50790, 50795, 50800, 50805, 50810, - 50814, 50819, 50824, 50829, 50835, 50841, 50847, 50852, 50856, 50861, - 50866, 50870, 50875, 50880, 50885, 50889, 8271, 8282, 8287, 1545, 50893, - 1550, 50899, 50902, 1581, 50908, 1587, 1593, 8317, 50913, 50921, 50928, - 50932, 50938, 50943, 25620, 50948, 50955, 50960, 50964, 50968, 1598, - 12933, 12944, 50977, 50984, 50989, 50993, 12956, 1602, 30319, 50996, - 51006, 51010, 1607, 31921, 51015, 8437, 8443, 51021, 51033, 51050, 51067, - 51084, 51101, 51118, 51135, 51152, 51169, 51186, 51203, 51220, 51237, - 51254, 51271, 51288, 51305, 51322, 51339, 51356, 51373, 51390, 51407, - 51424, 51441, 51458, 51475, 51492, 51509, 51526, 51543, 51560, 51577, - 51594, 51611, 51628, 51645, 51662, 51679, 51696, 51713, 51730, 51747, - 51764, 51781, 51798, 51815, 51832, 51849, 51866, 51877, 51882, 1612, - 51886, 51892, 7144, 1617, 22912, 51897, 51908, 51918, 51923, 51930, - 51936, 51941, 51946, 51950, 8454, 1622, 8459, 51954, 51959, 51965, 51970, - 51975, 51980, 51985, 51990, 51995, 52000, 52006, 52012, 52018, 52023, - 52027, 52032, 52037, 52041, 52046, 52051, 52056, 52060, 52065, 52071, - 52076, 52081, 52085, 52090, 52095, 52101, 52106, 52111, 52117, 52123, - 52128, 52132, 52137, 52142, 52147, 52151, 52156, 52161, 52166, 52172, - 52178, 52183, 52187, 52191, 52196, 52201, 52206, 24124, 52210, 52215, - 52220, 52226, 52231, 52236, 52240, 52245, 52250, 52256, 52261, 52266, - 52272, 52278, 52283, 52287, 52292, 52297, 52301, 52306, 52311, 52316, - 52322, 52328, 52333, 52337, 52342, 52347, 52351, 52356, 52361, 52366, - 52370, 52373, 26077, 52378, 52386, 13218, 13236, 8557, 52392, 8562, - 52407, 52412, 52423, 52435, 52447, 52459, 2588, 52471, 52476, 52480, - 52486, 52492, 1634, 940, 52497, 52502, 31960, 52506, 52510, 52515, 52519, - 13301, 52524, 52527, 52535, 1638, 8587, 8593, 1643, 52543, 52550, 52555, - 52564, 52574, 52581, 1648, 52588, 52593, 13376, 52597, 52602, 52609, - 52615, 52619, 52629, 13398, 7063, 7070, 1653, 52636, 52642, 52650, 52657, - 52663, 52669, 52674, 52685, 52694, 3498, 25495, 25504, 13438, 1658, 1662, - 52702, 52713, 52718, 1665, 52726, 52731, 52743, 52749, 52754, 1670, - 52759, 52764, 52772, 52780, 52787, 52796, 52804, 52813, 1675, 1680, - 52817, 52824, 13547, 52832, 52838, 52846, 52851, 8727, 52860, 52866, - 52872, 52877, 52885, 8736, 8741, 52893, 52899, 3563, 32038, 52904, 52910, - 52915, 52923, 52930, 52935, 52939, 52945, 1691, 52950, 52953, 977, 52959, - 52964, 52969, 52975, 52980, 52985, 52990, 52995, 53000, 53005, 1700, 9, - 53011, 53015, 53020, 53024, 53028, 53032, 26315, 53037, 53042, 53047, - 53051, 53054, 53058, 53062, 53067, 53071, 53076, 53080, 28322, 28327, - 28332, 53083, 53090, 53096, 31804, 53106, 28338, 28343, 26325, 26331, - 28354, 26337, 53111, 53116, 53120, 53124, 53127, 53131, 53134, 53139, - 53143, 53147, 53150, 53162, 27517, 53169, 12396, 760, 53172, 53176, - 53181, 53185, 10779, 53188, 53195, 53208, 53217, 53222, 53232, 53245, - 53257, 53264, 53269, 53278, 53291, 29283, 53309, 53314, 53321, 53327, - 53332, 53340, 22979, 585, 53346, 53352, 53358, 53363, 26342, 4176, 26356, - 53367, 53377, 53382, 53392, 53407, 53413, 53419, 26361, 25652, 53424, - 53429, 53434, 53438, 53443, 53448, 53452, 4217, 26382, 53456, 53462, 337, - 53472, 53479, 53488, 53494, 53502, 53506, 53510, 53514, 53518, 53523, - 53527, 53533, 53541, 53546, 53550, 53555, 53559, 53563, 53569, 53575, - 53580, 53584, 26398, 53589, 26404, 26410, 53594, 53600, 53605, 53609, - 25669, 13167, 53612, 53616, 53621, 53628, 53634, 53638, 53643, 53649, - 53653, 53657, 53662, 53667, 53671, 53674, 53680, 53685, 53692, 53699, - 53705, 53710, 53715, 53719, 53724, 53730, 53735, 53741, 53746, 53751, - 53756, 53762, 53767, 53772, 53778, 53784, 53790, 26415, 53795, 53800, - 53805, 26426, 53810, 53815, 53820, 53826, 53832, 26431, 53837, 53842, - 53847, 26442, 26448, 53852, 53857, 53862, 53867, 23129, 26453, 26457, - 53872, 53843, 53876, 53882, 53890, 53897, 53903, 53913, 53919, 53926, - 8214, 26462, 53932, 53945, 53954, 53960, 53969, 53975, 19524, 53982, - 53989, 26443, 53999, 54006, 54011, 54015, 54019, 54024, 4251, 54028, - 54033, 54038, 28416, 28421, 54042, 28427, 28432, 54047, 28437, 28443, - 54052, 28448, 54063, 54066, 54078, 54086, 26484, 54090, 54099, 54109, - 54118, 26489, 54123, 54130, 54139, 54145, 54153, 27045, 4069, 54158, - 26498, 54164, 54167, 54173, 54180, 54185, 54190, 19456, 54194, 54200, - 54206, 54211, 54217, 54223, 54228, 765, 29092, 29839, 29845, 54232, - 54236, 54240, 54243, 54256, 54262, 54266, 54269, 54274, 27708, 54278, - 25674, 17585, 54284, 4197, 4205, 6948, 54287, 54292, 54297, 54302, 54307, - 54312, 54317, 54322, 54327, 54332, 54338, 54343, 54348, 54354, 54359, - 54364, 54369, 54374, 54379, 54384, 54390, 54395, 54401, 54406, 54411, - 54416, 54421, 54426, 54431, 54436, 54441, 54446, 54451, 54457, 54462, - 54467, 54472, 54477, 54482, 54487, 54493, 54498, 54503, 54508, 54513, - 54518, 54523, 54528, 54533, 54538, 54544, 54549, 54554, 54559, 54564, - 54570, 54576, 54581, 54587, 54592, 54597, 54602, 54607, 54612, 1495, 235, - 54617, 54621, 54625, 54629, 54633, 54636, 54640, 54645, 54649, 54654, - 54658, 54662, 54666, 54671, 54675, 54680, 54684, 54688, 54695, 11999, - 54704, 54713, 54717, 20701, 54721, 54727, 54735, 54741, 54753, 54757, - 54762, 54768, 54778, 54788, 54794, 54798, 54803, 54809, 54818, 54827, - 54835, 12274, 54839, 54848, 54856, 54867, 54878, 54887, 54891, 54900, - 54910, 54916, 54921, 54927, 54932, 98, 25579, 54943, 21735, 54949, 54956, - 54962, 54966, 54976, 54984, 54989, 54993, 55001, 55005, 55011, 55021, - 1132, 55024, 55027, 55031, 55037, 55044, 55050, 55059, 55068, 55074, - 55080, 55085, 55092, 55099, 55112, 55121, 55130, 55135, 55139, 55146, - 55153, 55160, 55167, 55174, 55179, 55183, 55187, 55190, 55200, 55204, - 55213, 55217, 55222, 55226, 55235, 55243, 55251, 55256, 55260, 55265, - 55270, 55274, 55280, 55292, 55300, 55310, 55317, 55323, 55328, 55332, - 55336, 55340, 55349, 55358, 55367, 55373, 55379, 55385, 55390, 55397, - 55403, 55411, 55418, 9779, 55424, 55430, 55434, 11225, 55438, 55447, - 55453, 55461, 55468, 55472, 55476, 55482, 55490, 55497, 55503, 55514, - 55518, 55522, 55526, 55529, 55535, 55540, 55544, 55548, 55557, 55565, - 55572, 19890, 31572, 55578, 55586, 55590, 55597, 55606, 55614, 55620, - 55625, 55629, 55634, 55638, 55643, 55652, 55656, 55663, 55670, 55678, - 55684, 55695, 55701, 55710, 55717, 55724, 55731, 55738, 55745, 34285, - 55752, 55759, 55764, 55770, 37407, 55774, 55779, 55784, 55790, 55796, - 55802, 55807, 55812, 55817, 55822, 55828, 55833, 55839, 55844, 55850, - 55855, 55860, 55865, 55870, 55875, 55880, 55885, 55891, 55896, 55902, - 55907, 55912, 55917, 55922, 55927, 55932, 55938, 55943, 55948, 55953, - 55958, 55963, 55968, 55973, 55978, 55983, 55988, 55994, 55999, 56004, - 56009, 56014, 56019, 56024, 56029, 56034, 56040, 56045, 56050, 56055, - 56060, 56065, 56070, 56075, 56080, 56085, 56090, 56095, 56100, 56106, - 1816, 216, 30402, 56111, 56114, 56119, 56123, 55247, 56126, 56136, 56143, - 56152, 56162, 56172, 56180, 56188, 56192, 56195, 56202, 56208, 56219, - 56231, 56242, 56249, 1305, 19361, 56259, 2518, 56263, 1087, 13743, 30918, - 56271, 56284, 56288, 56293, 56298, 56303, 56309, 56315, 56320, 6489, - 56325, 56333, 8588, 56338, 56344, 1703, 8600, 669, 56353, 56362, 56372, - 22357, 56381, 56387, 13353, 56393, 56397, 3678, 8890, 56403, 52708, - 56410, 6919, 171, 11159, 56416, 56428, 56432, 56438, 22932, 56442, 8878, - 2623, 4, 56447, 56457, 56463, 56474, 56481, 56487, 56493, 56501, 56508, - 56518, 56528, 56538, 1317, 56547, 56553, 2646, 2652, 6486, 2200, 56557, - 56561, 56570, 56581, 56589, 56597, 56603, 56614, 56625, 56633, 56639, - 8931, 56644, 56652, 56656, 56660, 23273, 56672, 56682, 56688, 56694, - 56704, 56707, 56718, 56728, 56737, 56741, 56748, 1089, 2511, 56758, - 56763, 56771, 56779, 56790, 56804, 11111, 374, 56814, 56818, 56827, - 56835, 56841, 56848, 56854, 56861, 56871, 56879, 3570, 184, 56887, 56898, - 56902, 56914, 23120, 148, 56920, 56925, 56929, 56936, 56942, 56950, - 56957, 6740, 56964, 56973, 3625, 56981, 13399, 56985, 2681, 419, 56990, - 57003, 57008, 1815, 602, 57012, 3631, 57020, 57026, 917, 57036, 57045, - 57050, 11847, 57054, 37617, 57057, 3580, 19507, 57065, 57072, 19549, - 57076, 57083, 57089, 57094, 11861, 57099, 57111, 57117, 57125, 2693, - 1735, 57133, 57135, 57140, 57145, 57150, 57156, 57161, 57166, 57171, - 57176, 57181, 57186, 57192, 57197, 57202, 57207, 57212, 57217, 57222, - 57227, 57232, 57238, 57243, 57248, 57253, 57259, 57264, 57270, 57275, - 57280, 57285, 57290, 57295, 57300, 57305, 57311, 57316, 57322, 57327, - 57332, 57337, 57342, 57347, 57352, 57357, 57362, 57367, 57372, 57376, - 57380, 57385, 57389, 57394, 57399, 57405, 57410, 57414, 57418, 57421, - 57423, 57427, 57430, 57435, 57439, 57443, 57447, 57451, 57460, 26652, - 57463, 26657, 26662, 57470, 57479, 26668, 57484, 26673, 57493, 57498, - 9018, 57502, 57507, 57512, 57516, 57520, 57524, 57528, 57531, 57535, - 6170, 57541, 57546, 57550, 3467, 57553, 57555, 57559, 57562, 57567, - 57571, 57577, 57590, 57596, 57601, 57605, 57613, 57620, 57628, 57637, - 57645, 26678, 57652, 57662, 57671, 57684, 57689, 57694, 57700, 57707, - 57718, 57730, 57737, 57746, 57755, 57764, 57771, 57777, 57784, 57792, - 57799, 57807, 57816, 57824, 57831, 57839, 57848, 57856, 57865, 57875, - 57884, 57892, 57899, 57907, 57916, 57924, 57933, 57943, 57952, 57960, - 57969, 57979, 57988, 57998, 58009, 58019, 58028, 58036, 58043, 58051, - 58060, 58068, 58077, 58087, 58096, 58104, 58113, 58123, 58132, 58142, - 58153, 58163, 58172, 58180, 58189, 58199, 58208, 58218, 58229, 58239, - 58248, 58258, 58269, 58279, 58290, 58302, 58313, 58323, 58332, 58340, - 58347, 58355, 58364, 58372, 58381, 58391, 58400, 58408, 58417, 58427, - 58436, 58446, 58457, 58467, 58476, 58484, 58493, 58503, 58512, 58522, - 58533, 58543, 58552, 58562, 58573, 58583, 58594, 58606, 58617, 58627, - 58636, 58644, 58653, 58663, 58672, 58682, 58693, 58703, 58712, 58722, - 58733, 58743, 58754, 58766, 58777, 58787, 58796, 58806, 58817, 58827, - 58838, 58850, 58861, 58871, 58882, 58894, 58905, 58917, 58930, 58942, - 58953, 58963, 58972, 58980, 58987, 58995, 59004, 59012, 59021, 59031, - 59040, 59048, 59057, 59067, 59076, 59086, 59097, 59107, 59116, 59124, - 59133, 59143, 59152, 59162, 59173, 59183, 59192, 59202, 59213, 59223, - 59234, 59246, 59257, 59267, 59276, 59284, 59293, 59303, 59312, 59322, - 59333, 59343, 59352, 59362, 59373, 59383, 59394, 59406, 59417, 59427, - 59436, 59446, 59457, 59467, 59478, 59490, 59501, 59511, 59522, 59534, - 59545, 59557, 59570, 59582, 59593, 59603, 59612, 59620, 59629, 59639, - 59648, 59658, 59669, 59679, 59688, 59698, 59709, 59719, 59730, 59742, - 59753, 59763, 59772, 59782, 59793, 59803, 59814, 59826, 59837, 59847, - 59858, 59870, 59881, 59893, 59906, 59918, 59929, 59939, 59948, 59958, - 59969, 59979, 59990, 60002, 60013, 60023, 60034, 60046, 60057, 60069, - 60082, 60094, 60105, 60115, 60126, 60138, 60149, 60161, 60174, 60186, - 60197, 60209, 60222, 60234, 60247, 60261, 60274, 60286, 60297, 60307, - 60316, 60324, 60331, 60336, 6029, 60343, 26688, 60348, 60353, 26693, - 60359, 17319, 31449, 60364, 60370, 60376, 60383, 60390, 60395, 60399, - 60403, 60412, 60418, 60430, 60441, 60445, 2936, 6004, 60450, 60453, - 60455, 60459, 60463, 60467, 34097, 60472, 60476, 60479, 60484, 60488, - 60495, 60501, 60505, 60509, 26703, 60512, 60519, 60528, 60536, 60547, - 60555, 60563, 60570, 60577, 60583, 60594, 26708, 60599, 60610, 60622, - 60633, 60641, 2484, 60646, 60659, 60663, 60671, 60676, 60684, 13908, - 60695, 60701, 60708, 60716, 60722, 26713, 60727, 7592, 50467, 60734, - 60737, 60745, 60758, 60771, 60784, 60797, 60804, 60815, 60824, 34102, - 34107, 60829, 60833, 60841, 60848, 60857, 60865, 60871, 60880, 60888, - 60896, 60900, 60909, 60918, 60928, 60941, 60954, 60964, 26718, 60970, - 60977, 60983, 26724, 60988, 60991, 60995, 61003, 61012, 33840, 61020, - 61028, 61035, 61043, 61053, 61062, 61071, 61080, 61088, 61099, 61109, - 7184, 17802, 61118, 61123, 61128, 61132, 61136, 61141, 61147, 61152, - 61157, 61163, 61168, 61173, 17767, 61178, 61185, 61193, 61201, 61206, - 61213, 61220, 61224, 61228, 61236, 61244, 26733, 61250, 61256, 61268, - 61274, 61279, 61290, 61300, 61310, 61322, 61328, 61338, 26738, 61347, - 61356, 61362, 61374, 61385, 61392, 61397, 61401, 61409, 61415, 61420, - 61425, 61432, 61444, 61454, 61463, 61470, 27937, 19731, 61476, 61481, - 61485, 61489, 61494, 61500, 61511, 61524, 61529, 26743, 61534, 61546, - 61555, 61568, 61575, 61584, 61592, 61597, 61603, 1484, 61608, 61613, - 61618, 61623, 61629, 61634, 61639, 61645, 61651, 61656, 61660, 61665, - 61670, 61675, 50973, 61680, 61685, 61690, 61695, 61701, 61707, 61712, - 61716, 61721, 61726, 61731, 61736, 61741, 61745, 61751, 61756, 61765, - 61770, 61775, 61780, 61785, 61789, 61796, 61802, 13605, 13612, 37872, - 61807, 61757, 61809, 26752, 61812, 61821, 61827, 4263, 26757, 61831, - 61837, 61843, 61848, 61852, 61859, 61864, 61874, 61883, 61887, 61893, - 61899, 61905, 61909, 61917, 61924, 61932, 61940, 26762, 61947, 61950, - 61957, 61962, 61966, 61972, 61977, 61981, 61990, 61998, 62004, 62009, - 27544, 62016, 62023, 62029, 62034, 62040, 62047, 62053, 26475, 22688, - 62059, 62064, 62070, 62082, 61790, 61797, 62092, 62097, 62104, 62111, - 62117, 62128, 62133, 6965, 62141, 62144, 62150, 62154, 62158, 62161, - 62167, 26571, 4283, 836, 10621, 62174, 62180, 62186, 62192, 62198, 62204, - 62210, 62216, 62222, 62227, 62232, 62237, 62242, 62247, 62252, 62257, - 62262, 62267, 62272, 62277, 62282, 62287, 62293, 62298, 62303, 62309, - 62314, 62319, 62325, 62331, 62337, 62343, 62349, 62355, 62361, 62367, - 62373, 62378, 62383, 62389, 62394, 62399, 62405, 62410, 62415, 62420, - 62425, 62430, 62435, 62440, 62445, 62450, 62455, 62460, 62465, 62471, - 62476, 62481, 62486, 62492, 62497, 62502, 62507, 62512, 62518, 62523, - 62528, 62533, 62538, 62543, 62548, 62553, 62558, 62563, 62568, 62573, - 62578, 62583, 62588, 62593, 62598, 62603, 62608, 62613, 62619, 62624, - 62629, 62634, 62639, 62644, 62649, 62654, 1846, 138, 62659, 62663, 62667, - 62672, 62680, 62684, 62691, 62699, 62703, 62716, 62720, 62723, 62728, - 62732, 62737, 62741, 62749, 62753, 17327, 62758, 62762, 62766, 62769, - 62777, 62782, 62789, 62795, 62801, 62806, 62814, 56276, 62821, 62826, - 62831, 62835, 62839, 62842, 62847, 62852, 62856, 62859, 62865, 62869, - 62879, 62888, 62891, 62904, 62912, 62920, 62930, 62943, 62950, 62961, - 62967, 62972, 62977, 62983, 62992, 61536, 63000, 63006, 63014, 63018, - 63022, 63028, 63036, 63048, 63060, 63067, 63071, 63082, 63090, 63097, - 63109, 63117, 63125, 63132, 63138, 63148, 63157, 63162, 63172, 63176, - 63180, 63190, 63197, 63209, 63221, 63230, 60649, 63237, 63248, 63262, - 63270, 63280, 63287, 63295, 63304, 63312, 63322, 63331, 63342, 63354, - 63363, 63373, 63380, 63389, 63404, 63413, 63426, 63441, 63445, 63457, - 63468, 63479, 63490, 63500, 63511, 63519, 63525, 63535, 63541, 63546, - 63552, 63558, 63563, 63570, 7469, 13928, 63576, 63581, 63588, 63594, - 63599, 63603, 63606, 63609, 63611, 63618, 63629, 63634, 63638, 63644, - 63649, 63657, 56720, 56730, 63663, 63673, 63680, 63686, 63691, 63700, - 63707, 63715, 63724, 63730, 63736, 63743, 63750, 63755, 63759, 63764, - 63769, 63774, 63778, 62711, 63787, 63791, 63802, 63812, 13937, 63823, - 63831, 13949, 63838, 22598, 63842, 63846, 63851, 63868, 63880, 8169, - 63892, 63897, 63902, 63907, 63911, 63914, 63919, 63924, 63930, 63935, - 4075, 17378, 63940, 63945, 63951, 63958, 63963, 63968, 63974, 63980, - 63986, 63991, 63997, 64001, 64015, 64023, 64031, 64037, 64042, 64049, - 64054, 64059, 64067, 64072, 64078, 64083, 64088, 64092, 64095, 64113, - 64132, 64145, 64159, 64175, 64182, 64189, 64195, 64202, 64207, 64213, - 64219, 64224, 64229, 64245, 8182, 64259, 64266, 64270, 64273, 64278, - 64283, 64290, 64295, 64300, 64305, 64309, 64317, 9090, 64326, 64331, - 64337, 9101, 64342, 64345, 64350, 64360, 64369, 64374, 64382, 64389, - 64400, 64410, 64415, 64420, 64427, 64433, 64438, 64445, 64454, 64462, - 64468, 64475, 64481, 64485, 13451, 2910, 64490, 64494, 64500, 64506, - 64513, 64517, 64538, 64560, 64576, 64593, 64612, 64621, 64631, 64638, - 64645, 22517, 64651, 64655, 64663, 64669, 64677, 64681, 64689, 64696, - 64700, 64706, 64712, 64717, 3375, 34302, 64723, 64727, 64731, 64735, - 64740, 64745, 64750, 64756, 64761, 64767, 64772, 64777, 64781, 64786, - 34317, 64790, 64795, 64803, 64807, 64812, 64819, 64828, 64834, 64841, - 64845, 64852, 64861, 64866, 64874, 64883, 64889, 64894, 64899, 64905, - 64911, 64916, 64920, 64924, 64927, 64935, 64945, 64950, 32057, 64958, - 64970, 64974, 64986, 64997, 65004, 65010, 65017, 65029, 65036, 65042, - 17439, 65046, 65052, 65058, 65063, 65068, 5084, 65073, 65079, 65087, - 65096, 65100, 65106, 64782, 24971, 65111, 65113, 65118, 65123, 65128, - 65133, 65138, 65143, 65148, 65153, 65158, 65163, 65168, 65173, 65178, - 65183, 65189, 65194, 65199, 65204, 65209, 65214, 65219, 65224, 65229, - 65235, 65241, 65247, 65252, 65257, 65269, 65274, 1852, 67, 65279, 65284, - 26772, 26777, 26782, 26788, 26793, 65288, 26798, 65310, 65312, 65316, - 65320, 65325, 65329, 26802, 65333, 26807, 65341, 65344, 26812, 18179, - 65353, 65357, 1415, 65362, 26823, 65365, 65370, 21354, 21364, 65375, - 65379, 65384, 65390, 65395, 65404, 65409, 65416, 65422, 65427, 65432, - 65437, 65445, 26828, 1110, 65452, 65458, 65463, 65468, 65473, 65479, - 65484, 65491, 65497, 65502, 65510, 65516, 13959, 65523, 29296, 65536, - 65541, 65547, 65560, 65564, 65573, 65580, 65586, 65594, 65603, 65610, - 65616, 26832, 65619, 65626, 65632, 65636, 65639, 65647, 65661, 65668, - 26837, 65674, 26842, 65681, 28422, 65691, 65696, 65700, 17717, 65705, - 65710, 26847, 54013, 65714, 65719, 65725, 65731, 65738, 65744, 65749, - 65754, 65763, 65775, 65790, 27067, 65796, 13117, 26851, 65800, 65807, - 26856, 65813, 65822, 65829, 65838, 65844, 65849, 65855, 26861, 65860, - 65869, 65878, 65885, 65891, 65897, 65905, 65909, 26866, 65912, 26872, - 26878, 65917, 65925, 65935, 26883, 65939, 65941, 65945, 65950, 65954, - 65958, 65964, 65969, 65973, 65978, 2915, 65982, 65989, 65993, 66002, - 66010, 66017, 66022, 66027, 66031, 66035, 66038, 66044, 66052, 66058, - 66062, 66067, 66074, 66080, 28799, 66085, 66088, 66093, 66097, 66102, - 66107, 66111, 66119, 21373, 21382, 66125, 66131, 66137, 66142, 66146, - 66149, 66159, 66164, 66170, 66176, 66184, 66189, 28438, 66193, 66201, - 66207, 66212, 66217, 50653, 28444, 66223, 66228, 66232, 66237, 66242, - 66247, 66251, 66256, 66261, 66267, 66272, 66277, 66283, 66289, 66294, - 66298, 66303, 66308, 66313, 66317, 66322, 66327, 66332, 66338, 66344, - 66350, 66355, 66359, 66364, 66369, 66373, 66378, 66383, 66388, 66392, - 26887, 66400, 66404, 66412, 18521, 66423, 66429, 66436, 66441, 66450, - 66455, 66459, 66464, 66472, 66480, 66487, 56422, 66493, 66501, 66508, - 66519, 66525, 26897, 66528, 66535, 32183, 66539, 66544, 66549, 6877, - 66553, 66561, 66568, 66575, 66581, 66445, 66595, 66601, 66605, 66608, - 66616, 66623, 66628, 66641, 66648, 66653, 66658, 66661, 66668, 66672, - 66682, 66692, 66701, 66712, 66717, 66721, 28813, 17641, 32629, 66729, - 66734, 66739, 66744, 66749, 66754, 66759, 66763, 66768, 66773, 66778, - 66783, 66788, 66793, 66797, 66802, 66807, 66811, 66815, 66819, 66823, - 66828, 66833, 66837, 66842, 66846, 66850, 66855, 66860, 66865, 66870, - 66874, 66879, 66884, 66888, 66893, 66898, 66903, 66908, 66913, 66918, - 66923, 66928, 66933, 66938, 66943, 66948, 66953, 66958, 66963, 66968, - 66973, 66978, 66983, 66988, 66992, 66997, 67002, 67007, 67012, 67017, - 67022, 67027, 67032, 67037, 67042, 67047, 67051, 67056, 67060, 67065, - 67070, 67075, 67080, 67085, 67090, 67095, 67100, 67105, 67109, 67113, - 67118, 67123, 67127, 67132, 67137, 67141, 67146, 67151, 67156, 67161, - 67165, 67170, 67175, 67179, 67184, 67188, 67192, 67196, 67200, 67205, - 67209, 67213, 67217, 67221, 67225, 67229, 67233, 67237, 67241, 67246, - 67251, 67256, 67261, 67266, 67271, 67276, 67281, 67286, 67291, 67295, - 67299, 67303, 67307, 67311, 67315, 67320, 67324, 67329, 67333, 67338, - 67343, 67347, 67351, 67356, 67360, 67364, 67368, 67372, 67376, 67380, - 67384, 67388, 67392, 67396, 67400, 67404, 67408, 67412, 67417, 67422, - 67426, 67430, 67434, 67438, 67442, 67446, 67451, 67455, 67459, 67463, - 67467, 67471, 67475, 67480, 67484, 67489, 67493, 67497, 67501, 67505, - 67509, 67513, 67517, 67521, 67525, 67529, 67533, 67538, 67542, 67546, - 67550, 67554, 67558, 67562, 67566, 67570, 67574, 67578, 67582, 67587, - 67591, 67595, 67600, 67605, 67609, 67613, 67617, 67621, 67625, 67629, - 67633, 67637, 67642, 67646, 67651, 67655, 67660, 67664, 67669, 67673, - 67679, 67684, 67688, 67693, 67697, 67702, 67706, 67711, 67715, 67720, - 1503, 67724, 1741, 1746, 67728, 67732, 2711, 67736, 1384, 67741, 1350, - 67745, 67749, 67756, 67763, 67777, 2727, 5159, 67786, 67794, 67801, - 67808, 67821, 67834, 67845, 67850, 67857, 67869, 3703, 9162, 67873, - 67878, 67887, 67897, 67902, 67906, 67911, 67918, 67924, 67936, 1355, - 11688, 67946, 67952, 67966, 67978, 67987, 67996, 68005, 68013, 68024, - 68032, 3742, 68042, 68051, 68057, 68064, 28919, 68069, 2755, 10316, - 68073, 68080, 6828, 68089, 2760, 26495, 68095, 68102, 68108, 68115, - 68121, 68128, 68138, 68147, 68158, 68165, 68171, 68181, 68189, 68195, - 68210, 68216, 68221, 68228, 68231, 68237, 68244, 68250, 68258, 68267, - 68275, 68281, 68290, 33842, 68304, 68309, 11709, 68315, 68328, 68337, - 68345, 68352, 68356, 68360, 68363, 68370, 68377, 68385, 68393, 68402, - 68410, 11645, 68418, 68423, 68427, 68439, 68446, 68455, 793, 68465, 2776, - 68474, 68478, 68484, 68497, 68509, 68519, 68528, 68540, 68548, 68557, - 68568, 68579, 68589, 68599, 68608, 68616, 8811, 68623, 68627, 68632, - 68637, 68643, 1360, 9217, 68650, 68661, 68670, 68678, 68687, 68695, - 68711, 68722, 68738, 68748, 68769, 68782, 68795, 68800, 68806, 22084, - 68812, 68815, 68822, 68832, 6139, 68839, 68844, 68849, 68857, 7517, 7526, - 68865, 68876, 2784, 2789, 68882, 8419, 68888, 68895, 68902, 68915, 2193, - 50, 68920, 68925, 68935, 68941, 68945, 68950, 68954, 2812, 68966, 68974, - 68985, 68996, 69005, 69010, 69016, 69021, 69031, 69041, 69046, 69052, - 69057, 69066, 17674, 69070, 3804, 12, 69075, 69082, 766, 69088, 69093, - 52873, 69098, 69103, 69109, 69117, 69122, 69129, 69135, 30869, 33740, - 69141, 2816, 32, 69151, 69164, 69172, 69177, 69183, 2838, 25639, 69188, - 69196, 69203, 69208, 50895, 53694, 69217, 1686, 1795, 69222, 69227, - 69234, 1799, 237, 69241, 69247, 69252, 69259, 1803, 69264, 69270, 69275, - 69287, 4250, 69297, 1810, 69303, 69308, 69315, 69322, 69337, 69344, - 69352, 69356, 69360, 69372, 69377, 69381, 23272, 3830, 69385, 69396, - 69400, 69404, 69410, 69414, 69423, 69427, 69438, 69442, 2238, 69446, - 69448, 2935, 7189, 69456, 69461, 69465, 69474, 69480, 2905, 13622, 69484, - 69497, 69515, 69520, 69528, 69536, 69546, 69558, 69571, 69578, 69594, - 69601, 69607, 958, 69614, 69621, 69631, 69640, 69652, 34706, 69660, 2919, - 9391, 69663, 69671, 69675, 2923, 69679, 17523, 52946, 3514, 69683, 2929, - 69687, 69697, 69703, 69709, 69715, 69721, 69727, 69733, 69739, 69745, - 69751, 69757, 69763, 69769, 69775, 69781, 69787, 69793, 69799, 69805, - 69811, 69817, 69823, 69829, 69835, 69841, 69847, 69854, 69861, 69867, - 69873, 69879, 69885, 69891, 69897, 1365, 12692, 9411, 69903, 69908, - 69913, 69918, 69923, 69928, 69933, 69938, 69943, 69948, 69953, 69958, - 69963, 69968, 69973, 69978, 69983, 69988, 69993, 69998, 70003, 70008, - 70013, 70018, 70023, 70028, 70034, 70039, 70044, 70050, 70055, 70061, - 70066, 70071, 70077, 70082, 70087, 70092, 70097, 70102, 70107, 70112, - 70117, 69698, 69704, 69710, 69716, 69722, 69728, 69734, 69740, 69746, - 69752, 69758, 69764, 69770, 69776, 69782, 70123, 69788, 69794, 69800, - 70129, 69806, 69812, 69818, 69824, 69830, 69836, 69842, 69862, 70135, - 70141, 69868, 70147, 69874, 69880, 69886, 69892, 69898, 2950, 2955, - 70153, 70158, 70161, 70167, 70173, 70180, 70185, 70190, 2243, + 113, 121, 130, 135, 140, 144, 150, 153, 158, 166, 173, 181, 186, 191, + 194, 200, 208, 215, 225, 232, 241, 244, 247, 252, 258, 262, 271, 278, + 285, 290, 299, 307, 313, 319, 325, 141, 330, 331, 337, 345, 351, 357, + 365, 372, 374, 377, 381, 388, 390, 397, 402, 408, 410, 417, 425, 427, + 311, 430, 432, 437, 442, 447, 453, 460, 469, 479, 484, 489, 493, 506, + 513, 517, 526, 533, 540, 543, 549, 553, 563, 571, 579, 588, 596, 604, + 609, 617, 624, 634, 645, 649, 654, 657, 661, 665, 666, 672, 678, 680, + 683, 687, 344, 690, 694, 703, 706, 709, 714, 718, 726, 729, 735, 742, + 749, 758, 765, 774, 779, 783, 792, 802, 811, 817, 823, 830, 838, 846, + 855, 863, 867, 875, 880, 781, 511, 889, 893, 897, 904, 908, 915, 689, + 918, 926, 929, 933, 940, 944, 949, 957, 960, 192, 966, 971, 981, 990, + 997, 1004, 1012, 1020, 1026, 1030, 1035, 1040, 1046, 1051, 1054, 111, + 1060, 1064, 1070, 1073, 1086, 1089, 1093, 22, 1097, 1102, 1105, 1108, + 1114, 1124, 1126, 1132, 1142, 1147, 1156, 1164, 328, 1167, 1170, 1174, + 1179, 1185, 1190, 1197, 1199, 1204, 1209, 1215, 1220, 1225, 1229, 1234, + 1240, 1245, 1250, 1254, 1259, 1264, 1268, 1273, 1278, 1283, 1289, 1295, + 1301, 1306, 1310, 1315, 1320, 1325, 1329, 1334, 1339, 1344, 1349, 1200, + 1205, 1210, 1216, 1221, 1353, 1226, 1359, 1368, 1230, 1372, 1235, 1241, + 1246, 1376, 1381, 1386, 1390, 1394, 1400, 1404, 1251, 1407, 1411, 1255, + 1417, 1260, 1421, 1425, 1265, 1429, 1434, 1438, 1441, 1445, 1269, 1274, + 1450, 1279, 1456, 1462, 1468, 1474, 1284, 1296, 1302, 1478, 1482, 1486, + 1489, 1307, 1493, 1495, 1500, 1505, 1511, 1516, 1521, 1525, 1530, 1535, + 1540, 1545, 1551, 1556, 1561, 1567, 1573, 1578, 1582, 1587, 1592, 1597, + 1602, 1606, 1614, 1618, 1623, 1628, 1633, 1638, 1642, 1645, 1650, 1655, + 1660, 1665, 1671, 1676, 1680, 1311, 1683, 1688, 1693, 1316, 1697, 1701, + 1708, 1321, 1715, 1326, 1719, 1721, 1726, 1732, 1330, 1737, 1746, 1335, + 1751, 1757, 1340, 1762, 1767, 1770, 1775, 1779, 1783, 1787, 1790, 1794, + 1345, 1350, 1100, 1799, 1805, 1811, 1817, 1823, 1829, 1835, 1841, 1847, + 1852, 1858, 1864, 1870, 1876, 1882, 1888, 1894, 1900, 1906, 1911, 1916, + 1921, 1926, 1931, 1936, 1941, 1946, 1951, 1956, 1962, 1967, 1973, 1978, + 1984, 1990, 1995, 2001, 2007, 2013, 2019, 2024, 2029, 2031, 2032, 2036, + 2040, 2045, 2049, 2053, 2057, 2061, 2064, 2069, 2073, 2078, 2082, 2086, + 2091, 2095, 2098, 2102, 2108, 2122, 2126, 2130, 2133, 2138, 2142, 2146, + 2149, 2153, 2158, 2163, 2168, 2173, 2177, 2181, 2185, 2190, 2194, 2199, + 2203, 2208, 2214, 2221, 2227, 2232, 2237, 2242, 2248, 2253, 2259, 2264, + 2267, 1217, 2269, 2276, 2284, 2294, 2303, 2317, 2321, 2325, 2338, 2346, + 2350, 2355, 2359, 2362, 2366, 2370, 2375, 2380, 2385, 2389, 2392, 2396, + 2403, 2410, 2416, 2421, 2426, 2432, 2438, 2443, 2446, 1723, 2448, 2454, + 2458, 2463, 2467, 2471, 1728, 1734, 2476, 2480, 2483, 2488, 2493, 2498, + 2503, 2507, 2514, 2519, 2522, 2529, 2535, 2539, 2543, 2547, 2552, 2559, + 2564, 2569, 2576, 2582, 2588, 2594, 2608, 2625, 2640, 2655, 2664, 2669, + 2673, 2678, 2683, 2687, 2699, 2706, 2712, 2217, 2718, 2725, 2731, 2735, + 2738, 2745, 2751, 2755, 2759, 2763, 2054, 2767, 2772, 2777, 2781, 2789, + 2793, 2797, 2801, 2806, 2811, 2816, 2820, 2825, 2830, 2834, 2839, 2843, + 2846, 2850, 2854, 2859, 2863, 2867, 2873, 2882, 2886, 2890, 2896, 2901, + 2908, 2912, 2922, 2926, 2931, 2935, 2940, 2946, 2951, 2955, 2959, 2963, + 2406, 2971, 2976, 2982, 2987, 2991, 2996, 3001, 3005, 3011, 3016, 3022, + 3026, 3032, 3037, 3042, 3047, 3052, 3057, 3062, 3067, 3072, 3077, 3083, + 3088, 1227, 80, 3094, 3098, 3102, 3106, 3111, 3115, 3119, 3123, 3127, + 3132, 3136, 3141, 3145, 3148, 3152, 3157, 3161, 3166, 3170, 3174, 3178, + 3183, 3187, 3190, 3203, 3207, 3211, 3215, 3219, 3223, 3226, 3230, 3234, + 3239, 3243, 3248, 3253, 3258, 3262, 3265, 3268, 3274, 3278, 3282, 3285, + 3289, 3293, 3296, 3302, 3307, 3312, 3318, 3323, 3328, 3334, 3340, 3345, + 3350, 3355, 1091, 542, 3360, 3363, 3368, 3372, 3375, 3379, 3384, 3389, + 3393, 3398, 3402, 3407, 3411, 3415, 3421, 3427, 3430, 3433, 3439, 3446, + 3453, 3459, 3466, 3471, 3475, 3482, 3487, 3491, 3501, 3505, 3509, 3514, + 3519, 3529, 2065, 3534, 3538, 3541, 3547, 3552, 3558, 3564, 3569, 3576, + 3580, 3584, 658, 688, 3588, 3595, 3602, 3609, 3615, 3621, 3626, 3630, + 3636, 3641, 3645, 2074, 3649, 3657, 583, 3663, 3674, 3678, 3688, 2079, + 3694, 3699, 3714, 3720, 3727, 3737, 3743, 3748, 3754, 3760, 3763, 3767, + 3772, 3779, 3784, 3788, 3792, 3796, 3800, 3805, 3811, 3153, 3816, 3828, + 3836, 3841, 1527, 3848, 3851, 3854, 3858, 3861, 3867, 3871, 3885, 3889, + 3892, 3896, 3902, 3908, 3913, 3917, 3921, 3927, 3938, 3944, 3949, 3955, + 3959, 3967, 3977, 3983, 3988, 3997, 4005, 4012, 4016, 4022, 4031, 4040, + 4044, 4049, 4054, 4058, 4066, 4070, 4075, 4079, 2087, 1369, 4085, 4090, + 4096, 4101, 4106, 4111, 4116, 4121, 4126, 4132, 4137, 4143, 4148, 4153, + 4158, 4164, 4169, 4174, 4179, 4184, 4190, 4195, 4201, 4206, 4211, 4216, + 4221, 4226, 4231, 4237, 4242, 4247, 335, 436, 4252, 4258, 4262, 4266, + 4271, 4275, 4279, 4282, 4286, 4290, 4294, 4299, 4303, 4307, 4313, 4082, + 4318, 4321, 4328, 4332, 4345, 4349, 4353, 4357, 4361, 4365, 4369, 4375, + 4382, 4390, 4394, 4402, 4411, 4417, 4429, 4434, 4437, 4441, 4451, 4459, + 4467, 4473, 4477, 4487, 4497, 4505, 4512, 4519, 4525, 4531, 4538, 4542, + 4549, 4559, 4569, 4577, 4584, 4589, 4593, 4601, 4606, 4613, 4621, 4626, + 4631, 4635, 4649, 4654, 4659, 4666, 4675, 4678, 4682, 4686, 4689, 4694, + 4699, 4708, 4714, 4720, 4726, 4730, 4741, 4751, 4766, 4781, 4796, 4811, + 4826, 4841, 4856, 4871, 4886, 4901, 4916, 4931, 4946, 4961, 4976, 4991, + 5006, 5021, 5036, 5051, 5066, 5081, 5096, 5111, 5126, 5141, 5156, 5171, + 5186, 5201, 5216, 5231, 5246, 5261, 5276, 5291, 5306, 5321, 5336, 5351, + 5366, 5381, 5396, 5411, 5426, 5441, 5456, 5471, 5486, 5495, 5504, 5509, + 5515, 5525, 5529, 5534, 5539, 5547, 5551, 5554, 5558, 2917, 5561, 5566, + 310, 445, 5572, 5580, 5584, 5588, 5591, 5597, 5601, 5609, 5615, 5620, + 5627, 5634, 5640, 5645, 5652, 5658, 5666, 5670, 5675, 5687, 5698, 5705, + 5711, 3175, 5715, 5721, 5726, 5731, 5736, 5742, 5747, 5752, 5757, 5762, + 5768, 5773, 5778, 5784, 5789, 5795, 5800, 5806, 5811, 5817, 5822, 5827, + 5832, 5837, 5842, 5848, 5853, 5858, 5863, 5869, 5875, 5881, 5887, 5893, + 5899, 5905, 5911, 5917, 5923, 5929, 5935, 5940, 5945, 5950, 5955, 5960, + 5965, 5970, 5975, 5981, 5987, 5992, 5998, 6004, 6010, 6015, 6020, 6025, + 6030, 6036, 6042, 6047, 6052, 6057, 6062, 6067, 6073, 6078, 6084, 6090, + 6096, 6102, 6108, 6114, 6120, 6126, 6132, 2096, 5590, 6137, 6141, 6145, + 6148, 6155, 6158, 6166, 6171, 6176, 6167, 6181, 6168, 6185, 6191, 6197, + 6202, 6207, 6214, 6222, 6227, 6231, 6234, 6238, 2127, 551, 6242, 6246, + 6251, 6257, 6262, 6266, 6269, 6273, 6279, 6284, 6288, 6295, 6299, 6303, + 6307, 946, 747, 6310, 6318, 6325, 6332, 6338, 6345, 6353, 6360, 6367, + 6372, 6384, 1247, 1377, 1382, 6395, 1387, 6399, 6403, 6412, 6420, 6429, + 6435, 6440, 6444, 6450, 6455, 6462, 6466, 6475, 6484, 6493, 6502, 6507, + 6512, 6524, 6529, 6537, 2178, 6541, 6543, 6548, 6552, 6561, 6569, 1391, + 133, 3403, 3408, 6575, 6579, 6588, 6594, 6599, 6602, 6611, 2652, 6617, + 6625, 6629, 6633, 2191, 6637, 6642, 6649, 6655, 6661, 6664, 6666, 6669, + 6677, 6685, 6693, 6696, 6701, 6178, 6704, 6706, 6711, 6716, 6721, 6726, + 6731, 6736, 6741, 6746, 6751, 6756, 6762, 6767, 6772, 6777, 6783, 6788, + 6793, 6798, 6803, 6808, 6813, 6819, 6824, 6829, 6834, 6839, 6844, 6849, + 6854, 6859, 6864, 6869, 6874, 6879, 6884, 6889, 6894, 6899, 6904, 6910, + 6916, 6921, 6926, 6931, 6936, 6941, 2215, 2222, 2228, 6946, 6952, 2254, + 2260, 6960, 6964, 6969, 6973, 6977, 6981, 6986, 6990, 6995, 6999, 7002, + 7005, 7011, 7017, 7023, 7029, 7035, 7041, 7047, 7051, 7055, 7059, 7063, + 7067, 7072, 7079, 7090, 7098, 7108, 7115, 7120, 7124, 7135, 7148, 7159, + 7172, 7183, 7195, 7207, 7219, 7232, 7245, 7252, 7258, 7272, 7279, 7285, + 7289, 7294, 7298, 7305, 7313, 7317, 7323, 7329, 7339, 7343, 7348, 7353, + 7360, 7366, 7376, 6340, 7382, 7386, 7393, 746, 7397, 7401, 7406, 7411, + 7416, 7420, 7426, 7434, 7440, 7444, 7450, 7460, 7464, 7470, 7475, 7479, + 7485, 7491, 2119, 7496, 7498, 7506, 7515, 7519, 7525, 7530, 7535, 7540, + 7545, 7551, 7556, 3923, 7561, 7565, 7571, 7576, 7582, 7587, 7592, 7598, + 7603, 7520, 7609, 7613, 7620, 7626, 7631, 7635, 4645, 7640, 7649, 6645, + 6652, 7654, 2803, 7658, 7663, 7668, 7531, 7672, 7536, 7541, 7677, 7684, + 7691, 7697, 7703, 7709, 7714, 7719, 7724, 7546, 7552, 7730, 7736, 7741, + 7749, 7557, 7754, 1028, 7757, 7765, 7771, 7777, 7786, 7794, 7799, 7805, + 7813, 7820, 7835, 7852, 7871, 7880, 7888, 7903, 7914, 7924, 7934, 7942, + 7948, 7960, 7969, 7977, 7984, 7991, 7997, 8002, 8010, 8020, 8027, 8037, + 8047, 8057, 8065, 8072, 8081, 8091, 8105, 8120, 8129, 8137, 8142, 8146, + 8155, 8161, 8166, 8176, 8186, 8196, 8201, 8205, 8214, 8219, 8229, 8240, + 8253, 8266, 8278, 8286, 8291, 8295, 8301, 8306, 8314, 8322, 8329, 8334, + 8342, 8348, 8351, 8355, 8361, 8369, 8374, 8378, 8386, 8395, 8403, 8409, + 8413, 8420, 8431, 8435, 8438, 8444, 8449, 8453, 8459, 8466, 8472, 8477, + 8484, 8491, 8498, 8505, 8512, 8519, 8524, 7848, 8529, 8535, 8542, 8549, + 8554, 8561, 8570, 8574, 8586, 8590, 8593, 8597, 8601, 8605, 8609, 8615, + 8620, 8626, 8631, 8636, 8642, 8647, 8652, 7356, 8657, 8661, 8665, 8669, + 8674, 8679, 8687, 8693, 8697, 8701, 8708, 8713, 8721, 8726, 8730, 8733, + 8739, 8746, 8750, 8753, 8758, 8762, 3962, 8768, 8777, 36, 8785, 8791, + 8796, 7371, 8801, 8807, 8812, 8816, 8819, 8834, 8853, 8865, 8878, 8891, + 8904, 8918, 8931, 8946, 8953, 8959, 8963, 8977, 8982, 8988, 8993, 9001, + 9006, 6471, 9011, 9014, 9021, 9026, 9030, 2808, 955, 9036, 9040, 9046, + 9052, 9057, 9063, 9068, 7566, 9074, 9080, 9085, 9090, 9098, 9104, 9117, + 9125, 9132, 7572, 9138, 9146, 9154, 9161, 9174, 9186, 9196, 9203, 9210, + 9219, 9228, 9236, 9243, 9248, 9254, 7577, 9259, 9265, 7583, 9270, 9273, + 9280, 9286, 9299, 7083, 9310, 9316, 9325, 9333, 9340, 9346, 9352, 9357, + 9361, 9366, 8826, 9372, 7588, 9379, 9384, 9391, 9397, 9403, 9408, 9416, + 9424, 9431, 9435, 9449, 9459, 9464, 9468, 9479, 9485, 9490, 9495, 7593, + 7599, 9499, 9502, 9507, 9519, 9526, 9531, 9535, 9540, 9544, 9551, 9557, + 7604, 7521, 9564, 2813, 8, 9571, 9576, 9580, 9586, 9594, 9604, 9609, + 9614, 9621, 9628, 9632, 9643, 9653, 9662, 9674, 9679, 9683, 9691, 9705, + 9709, 9712, 9720, 9727, 9735, 9739, 9750, 9754, 9761, 9766, 9770, 9776, + 9781, 9785, 9791, 9796, 9807, 9811, 9814, 9820, 9825, 9831, 9837, 9844, + 9855, 9865, 9875, 9884, 9891, 7614, 7621, 7627, 7632, 9897, 9903, 7636, + 9909, 9912, 9919, 9924, 9939, 9955, 9970, 9978, 9984, 1043, 400, 9989, + 9997, 10004, 10010, 10015, 10020, 7641, 10022, 10026, 10031, 10035, + 10045, 10050, 10054, 10063, 10067, 10070, 10077, 10081, 10084, 10092, + 10099, 10107, 10111, 10118, 10127, 10130, 10134, 10138, 10144, 10148, + 10152, 10156, 10162, 10172, 10176, 10184, 10188, 10195, 10199, 10204, + 10208, 10215, 10221, 10229, 10235, 10245, 10250, 10255, 10259, 10267, + 3822, 10275, 10280, 10284, 10288, 10291, 10299, 10306, 10310, 4469, + 10314, 10319, 10323, 10334, 10339, 10345, 10349, 10352, 10360, 10365, + 10370, 10377, 10382, 7650, 10387, 10391, 1685, 4619, 10398, 10403, 10408, + 10413, 10419, 10424, 10430, 10435, 10440, 10445, 10450, 10455, 10460, + 10465, 10470, 10475, 10480, 10485, 10490, 10495, 10500, 10505, 10510, + 10516, 10521, 10526, 10531, 10536, 10541, 10547, 10552, 10557, 10563, + 10568, 10574, 10579, 10585, 10590, 10595, 10600, 10605, 10611, 10616, + 10621, 10626, 724, 139, 10634, 10638, 10643, 10648, 10652, 10656, 10660, + 10665, 10669, 10674, 10678, 10681, 10685, 10689, 10694, 10704, 10710, + 10718, 10722, 10726, 10733, 10741, 10750, 10761, 10768, 10775, 10784, + 10793, 10801, 10810, 10819, 10828, 10837, 10847, 10857, 10867, 10877, + 10887, 10896, 10906, 10916, 10926, 10936, 10946, 10956, 10966, 10975, + 10985, 10995, 11005, 11015, 11025, 11035, 11044, 11054, 11064, 11074, + 11084, 11094, 11104, 11114, 11124, 11134, 11143, 11153, 11163, 11173, + 11183, 11193, 11203, 11213, 11223, 11233, 11243, 11252, 11258, 11262, + 11265, 11269, 11274, 11281, 11287, 11292, 11296, 11301, 11310, 11318, + 11323, 11327, 11331, 11337, 11342, 11348, 7659, 11353, 11358, 11367, + 7664, 11372, 11375, 11381, 11389, 7669, 11396, 11400, 11404, 11408, + 11418, 11424, 11429, 11438, 11446, 11453, 11460, 11465, 11472, 11477, + 11481, 11484, 11495, 11505, 11514, 11522, 11533, 11545, 11555, 11560, + 11564, 11569, 11574, 11578, 11584, 11592, 11599, 11610, 11615, 11625, + 11634, 11638, 11641, 11648, 11658, 11667, 11674, 11678, 11685, 11691, + 11696, 11701, 11705, 11714, 11719, 11725, 11729, 11734, 11738, 11747, + 11755, 11763, 11770, 11778, 11790, 11801, 11811, 11818, 11824, 11833, + 11844, 11853, 11865, 11877, 11889, 11899, 11908, 11917, 11925, 11932, + 11941, 11949, 11955, 11961, 11966, 6199, 11970, 11972, 11977, 11983, + 11992, 12000, 12007, 12016, 12025, 12034, 12043, 12052, 12061, 12070, + 12079, 12089, 12099, 12108, 12114, 12121, 12135, 12142, 12150, 12159, + 12165, 12174, 12183, 12194, 12204, 12212, 12219, 12227, 12236, 12249, + 12257, 12264, 12277, 12283, 12289, 12299, 12308, 12317, 12322, 12326, + 12332, 12338, 12345, 7370, 12350, 12355, 12362, 12367, 12372, 12376, + 12384, 12390, 12395, 12403, 12411, 12418, 12426, 12432, 12440, 12448, + 12453, 12459, 12466, 12472, 12477, 12481, 12492, 12500, 12506, 12511, + 12520, 12526, 12531, 12540, 12554, 3781, 12558, 12563, 12568, 12574, + 12579, 12584, 12588, 12593, 12598, 6198, 12603, 12608, 12613, 12618, + 12622, 12627, 12632, 12637, 12643, 12649, 12654, 12658, 12663, 12668, + 12673, 7673, 12678, 12683, 12688, 12693, 12710, 12728, 12740, 12753, + 12770, 12786, 12803, 12813, 12832, 12843, 12854, 12865, 12876, 12888, + 12899, 12910, 12927, 12938, 12949, 12954, 2335, 12958, 12961, 12967, + 12975, 12983, 12988, 12996, 13004, 13011, 13016, 13022, 13029, 13037, + 13044, 13056, 13064, 13069, 9933, 13075, 13084, 13093, 13101, 13108, + 13114, 13122, 13129, 13135, 13142, 13148, 13157, 13165, 13175, 13182, + 13188, 13196, 13202, 13210, 13217, 13230, 13237, 13246, 13255, 13264, + 13272, 13282, 13289, 13294, 3495, 13301, 13306, 13309, 12604, 13313, + 13319, 13323, 13331, 13343, 13348, 13355, 13361, 13366, 13373, 12609, + 13377, 13381, 12614, 13385, 13389, 13393, 13400, 13405, 13409, 13413, + 13421, 13428, 13435, 13452, 13461, 13465, 13468, 13476, 13482, 13487, + 3573, 13491, 13493, 13501, 13508, 13518, 13530, 13535, 13541, 13546, + 13550, 13556, 13561, 13567, 13570, 13577, 13585, 13592, 13598, 13604, + 13609, 13616, 13622, 13627, 13634, 13638, 13644, 13648, 13655, 13661, + 13667, 13675, 13681, 13686, 13692, 13700, 13708, 13714, 13720, 13725, + 13732, 13737, 13741, 13747, 13752, 13759, 13764, 13770, 13773, 13779, + 13785, 13788, 13792, 13804, 13810, 13815, 13822, 13828, 13834, 13845, + 13855, 13864, 13872, 13879, 13890, 13900, 13910, 13918, 13921, 12628, + 13926, 13931, 12633, 12758, 13939, 13952, 13967, 13978, 12775, 13996, + 14009, 14022, 14033, 8841, 14044, 14057, 14076, 14087, 14098, 14109, + 2603, 14122, 14126, 14134, 14145, 14152, 14158, 14166, 14170, 14176, + 14179, 14189, 14197, 14204, 14212, 14222, 14227, 14234, 14239, 14246, + 14257, 14267, 14273, 14278, 14283, 14287, 14291, 14297, 14303, 14308, + 14313, 14318, 14322, 12638, 12644, 14326, 12650, 14331, 14339, 14348, + 14355, 7542, 14359, 14361, 14366, 14371, 14377, 14382, 14387, 14392, + 14397, 14401, 14407, 14413, 14418, 14424, 14429, 14434, 14440, 14445, + 14450, 14455, 14461, 14466, 14471, 14477, 14483, 14488, 14493, 14500, + 14506, 14517, 14524, 14529, 14533, 14537, 14540, 14548, 14553, 14560, + 14567, 14572, 14577, 14584, 14594, 14599, 14606, 14612, 14622, 14632, + 14646, 14660, 14674, 14688, 14703, 14718, 14735, 14753, 14766, 14772, + 14777, 14782, 14786, 14791, 14799, 14805, 14810, 14815, 14819, 14824, + 14828, 14833, 14837, 14848, 14854, 14859, 14864, 14871, 14876, 14880, + 14885, 14890, 14896, 14903, 14909, 14914, 14918, 14924, 14929, 14934, + 14938, 14944, 14949, 14954, 14961, 14966, 11420, 14970, 14975, 14979, + 14984, 14990, 14996, 15003, 15013, 15021, 15028, 15033, 15037, 15046, + 15054, 15061, 15068, 15074, 15080, 15085, 15090, 15096, 15101, 15107, + 15112, 15118, 15124, 15131, 15137, 15142, 15147, 7715, 15156, 15159, + 15165, 15170, 15175, 15185, 15192, 15198, 15203, 15209, 15214, 15220, + 15225, 15231, 15237, 15242, 15250, 15257, 15262, 15267, 15273, 15278, + 15282, 15291, 15302, 15309, 15317, 15323, 15330, 15336, 15341, 15345, + 15351, 15356, 15361, 15366, 7720, 6223, 2827, 15370, 15374, 15378, 15382, + 15386, 15389, 15396, 15404, 12664, 15411, 15421, 15429, 15436, 15444, + 15454, 15463, 15476, 15481, 15486, 15494, 15501, 11510, 11519, 15508, + 15518, 15533, 15539, 15546, 15553, 15559, 15569, 15579, 12669, 15588, + 15594, 15600, 15608, 15616, 15621, 15630, 15638, 15650, 15660, 15670, + 15680, 15689, 15701, 15711, 15721, 15732, 15737, 15749, 15761, 15773, + 15785, 15797, 15809, 15821, 15833, 15845, 15857, 15868, 15880, 15892, + 15904, 15916, 15928, 15940, 15952, 15964, 15976, 15988, 15999, 16011, + 16023, 16035, 16047, 16059, 16071, 16083, 16095, 16107, 16119, 16130, + 16142, 16154, 16166, 16178, 16190, 16202, 16214, 16226, 16238, 16250, + 16261, 16273, 16285, 16297, 16309, 16321, 16333, 16345, 16357, 16369, + 16381, 16392, 16404, 16416, 16428, 16440, 16452, 16464, 16476, 16488, + 16500, 16512, 16523, 16535, 16547, 16559, 16571, 16583, 16595, 16607, + 16619, 16631, 16643, 16654, 16666, 16678, 16690, 16702, 16715, 16728, + 16741, 16754, 16767, 16780, 16793, 16805, 16818, 16831, 16844, 16857, + 16870, 16883, 16896, 16909, 16922, 16935, 16947, 16960, 16973, 16986, + 16999, 17012, 17025, 17038, 17051, 17064, 17077, 17089, 17102, 17115, + 17128, 17141, 17154, 17167, 17180, 17193, 17206, 17219, 17231, 17244, + 17257, 17270, 17283, 17296, 17309, 17322, 17335, 17348, 17361, 17373, + 17386, 17399, 17412, 17425, 17438, 17451, 17464, 17477, 17490, 17503, + 17515, 17526, 17539, 17552, 17565, 17578, 17591, 17604, 17617, 17630, + 17643, 17656, 17668, 17681, 17694, 17707, 17720, 17733, 17746, 17759, + 17772, 17785, 17798, 17810, 17823, 17836, 17849, 17862, 17875, 17888, + 17901, 17914, 17927, 17940, 17952, 17965, 17978, 17991, 18004, 18017, + 18030, 18043, 18056, 18069, 18082, 18094, 18107, 18120, 18133, 18146, + 18159, 18172, 18185, 18198, 18211, 18224, 18236, 18249, 18262, 18275, + 18288, 18301, 18314, 18327, 18340, 18353, 18366, 18378, 18391, 18404, + 18417, 18430, 18443, 18456, 18469, 18482, 18495, 18508, 18520, 18533, + 18546, 18559, 18572, 18585, 18598, 18611, 18624, 18637, 18650, 18662, + 18675, 18688, 18701, 18714, 18727, 18740, 18753, 18766, 18779, 18792, + 18804, 18817, 18830, 18843, 18856, 18869, 18882, 18895, 18908, 18921, + 18934, 18946, 18957, 18965, 18972, 18978, 18982, 18988, 18994, 19002, + 19008, 19013, 19017, 19026, 7547, 19037, 19044, 19052, 19059, 19066, + 9293, 19073, 19082, 19087, 19092, 6239, 19099, 19104, 19107, 19112, + 19120, 19127, 19134, 19141, 19147, 19156, 19165, 19171, 19180, 19186, + 19191, 19201, 19208, 19214, 19222, 19228, 19235, 19245, 19254, 19258, + 19265, 19269, 19274, 19280, 19288, 19292, 19302, 12679, 19311, 19317, + 19321, 19330, 19336, 19343, 19354, 19362, 19371, 7335, 19379, 19384, + 19390, 19395, 19399, 19403, 19407, 8006, 19412, 19420, 19427, 19436, + 19443, 19450, 9223, 19457, 19463, 19467, 19473, 19479, 19487, 19493, + 19500, 19506, 19512, 19521, 19525, 19533, 19542, 19549, 19554, 19558, + 19569, 19574, 19579, 19584, 19597, 6426, 19601, 19607, 19615, 19619, + 19626, 19635, 19640, 19648, 19660, 19665, 19669, 19672, 19678, 19684, + 19689, 19693, 19696, 19707, 19712, 7750, 19719, 7558, 7755, 19724, 19729, + 19734, 19739, 19744, 19749, 19754, 19759, 19764, 19769, 19774, 19779, + 19785, 19790, 19795, 19800, 19805, 19810, 19815, 19820, 19825, 19830, + 19836, 19842, 19847, 19852, 19857, 19862, 19867, 19872, 19877, 19882, + 19887, 19893, 19898, 19903, 19908, 19914, 19920, 19925, 19930, 19935, + 19940, 19945, 19950, 19955, 19960, 19966, 19971, 19976, 19981, 19986, + 19992, 19997, 20002, 20006, 129, 20014, 20018, 20022, 20026, 20031, + 20035, 20039, 10781, 20043, 20048, 20052, 20057, 20061, 20066, 20070, + 20076, 20081, 20085, 20089, 20097, 20101, 20106, 20111, 20115, 20121, + 20126, 20130, 20135, 20140, 20144, 20151, 20158, 20165, 20169, 20173, + 20178, 20182, 20185, 20191, 20204, 20209, 20218, 20223, 7795, 20228, + 20231, 2666, 2671, 20235, 20241, 20247, 20252, 20257, 20262, 20268, + 20273, 12190, 20278, 20283, 20288, 20294, 20299, 20304, 20310, 20315, + 20319, 20324, 20329, 20334, 20338, 20343, 20348, 20353, 20358, 20362, + 20366, 20371, 2836, 20320, 20375, 20383, 20390, 8100, 20402, 20410, + 20325, 20417, 20422, 20430, 20330, 20435, 20440, 20448, 20453, 20458, + 20462, 20467, 20471, 20477, 20480, 20487, 20491, 20495, 20501, 20508, + 20513, 7362, 1690, 1695, 20517, 20523, 20529, 20534, 20538, 20542, 20546, + 20549, 20555, 20562, 20570, 20576, 20582, 20587, 20592, 20596, 13039, + 13896, 20601, 20613, 20616, 20623, 20630, 20634, 20642, 20653, 20662, + 20675, 20685, 20699, 20711, 20725, 20737, 20747, 20759, 20765, 20780, + 20804, 20822, 20841, 20854, 20868, 20886, 20902, 20919, 20937, 20948, + 20967, 20984, 21004, 21022, 21034, 21048, 21062, 21074, 21091, 21110, + 21128, 21140, 21158, 21177, 12818, 21190, 21210, 21222, 8872, 21234, + 21239, 21244, 21249, 21255, 21260, 21264, 21271, 2352, 21275, 21281, + 21285, 21288, 21292, 21300, 21306, 20339, 21310, 21319, 21330, 21336, + 21342, 21351, 21359, 21366, 21371, 21378, 21384, 21393, 21401, 21408, + 21418, 21427, 21437, 21442, 21451, 21460, 21471, 21482, 3880, 21492, + 21496, 21506, 21514, 21524, 21535, 21540, 21548, 21555, 21561, 21566, + 20349, 21570, 21579, 21583, 21586, 21591, 21598, 21607, 21615, 21623, + 21633, 21642, 21648, 21654, 20354, 20359, 21658, 21668, 21678, 21688, + 21696, 21703, 21713, 21721, 21729, 21735, 962, 21744, 13000, 537, 21758, + 21767, 21775, 21786, 21797, 21807, 21816, 21828, 21837, 21846, 21852, + 21861, 21870, 21880, 21888, 21896, 7727, 21902, 21905, 21909, 21914, + 21919, 8215, 20367, 21927, 21933, 21939, 21944, 21949, 21953, 21961, + 21967, 21973, 21977, 3467, 21985, 21990, 21995, 21999, 22003, 8287, + 22010, 22018, 22025, 22031, 8296, 8302, 22039, 22047, 22054, 22059, + 22064, 22070, 22074, 22085, 22090, 2555, 22095, 22106, 22112, 22117, + 22121, 22125, 22128, 22135, 22142, 22149, 22155, 22159, 22164, 22168, + 22172, 979, 22176, 22181, 22186, 22191, 22196, 22201, 22206, 22211, + 22216, 22221, 22226, 22231, 22236, 22241, 22247, 22252, 22257, 22262, + 22267, 22272, 22277, 22283, 22288, 22293, 22298, 22303, 22308, 22313, + 22318, 22324, 22330, 22335, 22341, 22346, 22351, 5, 22357, 22361, 22365, + 22369, 22374, 22378, 22382, 22386, 22390, 22395, 22399, 22404, 22408, + 22411, 22415, 22420, 22424, 22429, 22433, 22437, 22441, 22446, 22450, + 22454, 22464, 22469, 22473, 22477, 22482, 22487, 22496, 22501, 22506, + 22510, 22514, 22527, 22539, 22548, 22557, 22563, 22568, 22572, 22576, + 22586, 22595, 22603, 22609, 22614, 22618, 22625, 22635, 22644, 22652, + 22660, 22667, 22675, 22684, 22693, 22701, 22706, 22710, 22714, 22717, + 22719, 22723, 22727, 22732, 22737, 22741, 22745, 22748, 22752, 22755, + 22759, 22762, 22765, 22769, 22775, 22779, 22783, 22787, 22792, 22797, + 22802, 22806, 22809, 22814, 22820, 22825, 22831, 22836, 22840, 22844, + 22848, 22853, 22857, 22862, 22866, 22873, 22877, 22880, 22884, 22890, + 22896, 22900, 22904, 22909, 22916, 22922, 22926, 22935, 22939, 22943, + 22946, 22952, 22957, 22963, 1452, 1754, 22968, 22973, 22978, 22983, + 22988, 22993, 22998, 2106, 2148, 23003, 23006, 23010, 23014, 23019, + 23023, 23027, 23030, 23035, 23040, 23044, 23047, 23052, 23056, 23061, + 23065, 13012, 23070, 23073, 23076, 23080, 23085, 23098, 23102, 23105, + 23113, 23122, 23129, 23134, 23140, 23146, 23153, 23160, 23164, 23168, + 23172, 23177, 23182, 23186, 23194, 23199, 23211, 23222, 23227, 23231, + 23235, 23241, 23246, 23251, 23255, 23258, 23264, 6346, 2270, 23268, + 23273, 23289, 7842, 23309, 23318, 23334, 23338, 23341, 23347, 23357, + 23363, 23378, 23390, 23401, 23409, 23418, 23424, 23433, 23443, 23454, + 23465, 23474, 23483, 23491, 23498, 23506, 23519, 23526, 23532, 23537, + 23546, 23552, 23557, 23565, 21516, 23577, 23589, 23603, 23611, 23618, + 23630, 23639, 23648, 23656, 23664, 23672, 23679, 23688, 23696, 23706, + 23715, 23725, 23734, 23743, 23751, 23756, 23760, 23763, 23767, 23771, + 23775, 23779, 23783, 23789, 23795, 23803, 13057, 23810, 23815, 23822, + 23828, 23835, 13065, 23842, 23845, 23857, 23865, 23871, 23876, 23880, + 8245, 23891, 23901, 23910, 23917, 23921, 13070, 23924, 23931, 23935, + 23941, 23944, 23951, 23957, 23961, 23966, 23970, 23979, 23986, 23992, + 6387, 23999, 24007, 24014, 24020, 24025, 24031, 24037, 24045, 24049, + 24052, 24054, 23768, 24063, 24069, 24079, 24084, 24091, 24097, 24102, + 24107, 24112, 24117, 24124, 24133, 24140, 24149, 24155, 24160, 24166, + 24171, 24178, 24189, 24194, 24198, 24208, 24214, 24218, 24223, 24233, + 24242, 24246, 24253, 24261, 24268, 24274, 24279, 24287, 24294, 24306, + 24315, 24319, 11362, 24327, 24337, 24341, 23109, 24352, 24357, 24361, + 24368, 24375, 20117, 23693, 24380, 24384, 24387, 20954, 24392, 24406, + 24422, 24440, 24459, 24476, 24494, 20973, 24511, 24531, 20990, 24543, + 24555, 13983, 24567, 21010, 24581, 24593, 8885, 24607, 24612, 24617, + 24622, 24628, 24634, 24640, 24644, 24651, 24656, 24666, 24672, 8532, + 24678, 24680, 24685, 24693, 24697, 24120, 24703, 24710, 9869, 9879, + 24717, 24727, 24732, 24736, 24739, 24745, 24753, 24765, 24775, 24791, + 24804, 24818, 14001, 24832, 24839, 24843, 24846, 24851, 24855, 24862, + 24869, 24879, 24884, 24889, 24894, 24902, 24910, 24919, 24924, 7939, + 24928, 24931, 24934, 24939, 24946, 24951, 24967, 24975, 24983, 7790, + 24991, 24996, 25000, 25006, 25012, 25015, 25021, 25033, 25041, 25048, + 25054, 25061, 25072, 25086, 25099, 25108, 25120, 25131, 25141, 25150, + 25159, 25167, 25178, 6369, 25185, 25191, 25196, 25202, 25209, 25219, + 25229, 25238, 25244, 25251, 25256, 25263, 25271, 25279, 25291, 4704, + 25298, 25307, 25315, 25321, 25327, 25332, 25336, 25339, 25345, 25352, + 25357, 25362, 25366, 25378, 25389, 25398, 25406, 13197, 25411, 25417, + 25423, 9862, 7049, 25428, 25431, 25434, 25440, 25448, 25456, 25460, + 25464, 25469, 25472, 25481, 25489, 25500, 25504, 25510, 25516, 25520, + 25526, 25534, 25556, 25580, 25587, 25594, 25600, 25606, 25611, 25622, + 25640, 25647, 25655, 25659, 25668, 25681, 25689, 25701, 25712, 25722, + 25736, 25745, 25753, 25765, 7859, 25776, 25787, 25799, 25809, 25818, + 25823, 25827, 25835, 25845, 25850, 25854, 25857, 25860, 25868, 25876, + 25885, 25895, 25904, 25910, 25924, 2617, 25946, 25957, 25966, 25976, + 25988, 25997, 26007, 26015, 26023, 26032, 26037, 26048, 26053, 26064, + 26068, 26078, 26087, 26095, 26105, 26115, 26123, 26132, 26139, 26147, + 26154, 26163, 26167, 26175, 26182, 26190, 26197, 26208, 26223, 26230, + 26236, 26246, 26255, 26261, 26268, 12312, 26274, 26278, 26283, 26287, + 26291, 26299, 26307, 26313, 26322, 26329, 26334, 26339, 26349, 21568, + 26353, 26356, 26361, 26366, 26371, 26376, 26381, 26386, 26391, 26396, + 26402, 26407, 26412, 26418, 1223, 679, 26423, 26432, 2318, 26439, 26444, + 26448, 26454, 1256, 541, 334, 26459, 26468, 26476, 26485, 26493, 26504, + 26513, 26521, 26525, 26528, 26536, 26544, 26549, 13025, 26555, 26561, + 26567, 4350, 26572, 26576, 26582, 26586, 26593, 1418, 26599, 7946, 26606, + 26616, 26624, 26630, 26639, 26647, 26653, 26661, 26668, 9455, 26674, + 26681, 26688, 1459, 2105, 26694, 26700, 26707, 26718, 26729, 26737, + 26744, 26754, 26763, 26771, 26778, 26785, 26798, 26809, 26828, 1261, + 26832, 26837, 26845, 3510, 26849, 26854, 26858, 1422, 22746, 26868, + 26872, 26877, 26881, 3435, 26887, 26895, 26902, 26913, 26921, 26929, + 3511, 269, 26934, 26942, 26950, 26957, 26963, 26968, 2170, 26975, 26981, + 23962, 24184, 26987, 106, 26991, 26995, 27001, 606, 7695, 27006, 27013, + 27019, 2281, 27023, 27027, 27030, 27033, 27038, 27045, 27051, 27056, + 27064, 27071, 27077, 20455, 27081, 3581, 14826, 27085, 27090, 27093, + 27101, 27109, 27112, 27119, 27129, 27141, 27146, 27150, 27158, 27165, + 27171, 27178, 27185, 27188, 27192, 27196, 1426, 27206, 27208, 27213, + 27219, 27225, 27230, 27235, 27240, 27245, 27250, 27255, 27260, 27265, + 27270, 27275, 27280, 27285, 27290, 27295, 27301, 27307, 27313, 27319, + 27324, 27329, 27334, 27340, 27345, 27350, 27355, 27361, 27366, 27372, + 27377, 27382, 27387, 27392, 27398, 27403, 27409, 27414, 27419, 27424, + 27429, 27435, 27440, 27446, 27451, 27456, 27461, 27466, 27471, 27476, + 27481, 27486, 27491, 27497, 27503, 27509, 27514, 27519, 27524, 27529, + 27535, 27541, 27547, 27553, 27559, 27565, 27570, 27576, 27581, 27586, + 27591, 27596, 27602, 2397, 27607, 2404, 2411, 2708, 27612, 2417, 2427, + 27618, 27622, 27627, 27632, 27638, 27643, 27648, 27652, 27657, 27663, + 27668, 27673, 27678, 27684, 27689, 27693, 27697, 27702, 27707, 27712, + 27717, 27722, 27728, 27734, 27739, 27743, 27748, 27754, 27758, 27763, + 27768, 27773, 27778, 27782, 27785, 27790, 27795, 27800, 27805, 27811, + 27817, 27822, 27827, 27831, 27836, 27841, 27846, 27851, 27856, 27860, + 27865, 27870, 27875, 27879, 27883, 27887, 27892, 27900, 27906, 27912, + 27918, 27923, 27927, 27930, 27935, 27939, 27944, 27948, 27953, 27957, + 27960, 15489, 27965, 27973, 19439, 26603, 27978, 27983, 27987, 27992, + 27996, 28000, 28005, 28009, 28012, 28015, 28019, 28024, 28032, 28036, + 28039, 28044, 28048, 28052, 28057, 28062, 28066, 28072, 28077, 28082, + 28089, 28096, 28100, 28103, 28109, 28118, 28125, 28133, 28140, 28144, + 28149, 28153, 28159, 28165, 28169, 28175, 28180, 28185, 28192, 28198, + 28204, 28210, 28216, 28223, 28229, 28235, 28241, 28247, 28253, 28259, + 28265, 28272, 28278, 28285, 28291, 28297, 28303, 28309, 28315, 28321, + 28327, 28333, 28339, 9763, 28345, 28350, 28355, 28358, 28366, 28371, + 28380, 28386, 28391, 28396, 28401, 28405, 28410, 28415, 28420, 28425, + 28430, 28437, 28444, 28450, 28456, 28461, 14510, 28468, 28474, 28481, + 28487, 28493, 28498, 28506, 28511, 14294, 28515, 28520, 28525, 28531, + 28536, 28541, 28545, 28550, 28555, 28561, 28566, 28571, 28575, 28580, + 28585, 28589, 28594, 28599, 28604, 28608, 28613, 28618, 28623, 28627, + 28631, 13531, 28635, 28644, 28650, 28656, 28665, 28673, 28682, 28690, + 28695, 28699, 28706, 28712, 28716, 28719, 28724, 28733, 28741, 28746, + 1458, 28752, 28755, 28759, 20524, 20530, 28765, 28769, 28780, 28791, + 28802, 28814, 28821, 28828, 28833, 28837, 4387, 733, 19438, 28845, 28849, + 28854, 28860, 28865, 28871, 28876, 28882, 28887, 8764, 2785, 3365, 28891, + 28894, 28900, 28906, 28912, 28919, 28925, 28931, 28937, 28943, 28949, + 28955, 28961, 28967, 28973, 28979, 28985, 28991, 28998, 29004, 29010, + 29016, 29022, 29028, 29033, 29036, 29043, 29051, 29056, 29061, 29067, + 29072, 29077, 29081, 29086, 29092, 29097, 29103, 29108, 29114, 29119, + 29125, 29131, 29135, 29140, 29145, 29150, 29155, 29159, 29164, 29169, + 29174, 29180, 29186, 29192, 29198, 29203, 29207, 29210, 29216, 29222, + 29231, 29239, 29246, 29251, 29255, 29259, 29264, 13395, 29269, 29277, + 29283, 3611, 29288, 29291, 29295, 6436, 29301, 29307, 29314, 6445, 29318, + 29324, 29331, 29337, 29346, 29354, 29366, 29370, 29377, 29383, 29387, + 29390, 29399, 29407, 29412, 29416, 29426, 29436, 29446, 29452, 29457, + 29467, 29472, 29485, 29499, 29510, 29522, 29534, 29548, 29561, 29573, + 29585, 12859, 29599, 29604, 29609, 29613, 29617, 29621, 1743, 25129, + 29625, 29630, 29635, 29639, 29642, 29647, 29652, 29658, 29664, 8461, + 29669, 29676, 13935, 29682, 29687, 29692, 29696, 29701, 29706, 28855, + 29711, 29716, 29721, 29727, 28861, 29732, 29735, 29742, 29750, 29756, + 29762, 29768, 29779, 29784, 29791, 29798, 29805, 29813, 29822, 29831, + 29837, 29843, 29851, 28866, 29856, 29862, 29868, 28872, 29873, 29881, + 29889, 29895, 29902, 29908, 29915, 29922, 29928, 29936, 29946, 29953, + 29958, 29964, 29969, 29974, 29981, 29990, 29998, 30003, 30009, 30016, + 30024, 30030, 30035, 30041, 30050, 25890, 30057, 30061, 30066, 30075, + 30080, 30085, 10714, 30093, 30098, 30103, 30107, 30112, 30117, 30124, + 30129, 30134, 28877, 28883, 30140, 2473, 239, 30143, 30146, 30150, 30154, + 30164, 30172, 30176, 30183, 30190, 30194, 30197, 30203, 30211, 30219, + 30223, 30227, 30230, 30237, 30241, 30248, 30256, 30263, 30267, 30275, + 684, 297, 30287, 30292, 30297, 30303, 30308, 30313, 3632, 30318, 30321, + 30326, 30331, 30336, 30341, 30346, 30353, 20609, 30358, 30363, 30368, + 30373, 30378, 30384, 30389, 30395, 29039, 30401, 30406, 30412, 30418, + 30428, 30433, 30438, 30442, 30447, 30452, 30457, 30462, 30475, 30480, + 20406, 14906, 3638, 30484, 30489, 30494, 30500, 30505, 30510, 30514, + 30519, 30524, 30530, 30535, 30540, 30544, 30549, 30554, 30559, 30563, + 30568, 30573, 30578, 30584, 30590, 30595, 30599, 30604, 30609, 30614, + 30618, 30626, 30630, 30636, 30640, 30647, 14699, 30653, 30660, 30668, + 30675, 30681, 30693, 30699, 30703, 2727, 30707, 30711, 30232, 30720, + 30731, 30736, 30741, 30746, 30750, 30755, 20535, 30759, 30764, 19459, + 30768, 30773, 30779, 30784, 30788, 30792, 30795, 30799, 30805, 30816, + 30828, 30833, 30837, 30840, 343, 30844, 30849, 30854, 30859, 30864, + 30869, 30875, 30880, 30885, 30891, 30896, 30902, 30907, 30913, 30918, + 30923, 30928, 30933, 30938, 30943, 30948, 30953, 30959, 30964, 30969, + 30974, 30979, 30984, 30989, 30994, 31000, 31006, 31011, 31016, 31021, + 31026, 31031, 31036, 31041, 31046, 31051, 31056, 31061, 31066, 31071, + 31076, 31081, 31086, 31091, 31096, 31102, 26, 31107, 31111, 31115, 31123, + 31127, 31131, 31134, 31137, 31139, 31144, 31148, 31153, 31157, 31162, + 31166, 31171, 31175, 31178, 31180, 31185, 31189, 31200, 31203, 31205, + 31209, 31221, 31230, 31234, 31240, 31245, 31254, 31260, 31265, 31270, + 31274, 31279, 31286, 31291, 31297, 31302, 31306, 31313, 23701, 23711, + 31317, 31322, 31327, 31332, 31339, 31343, 31350, 6544, 31356, 31365, + 31373, 31388, 31402, 31410, 31421, 31430, 31435, 5681, 31445, 31450, + 31455, 31459, 31462, 31466, 31471, 31475, 31482, 31487, 31492, 7320, + 31502, 31504, 31507, 31511, 31517, 31521, 31526, 31531, 31537, 31542, + 31548, 31553, 31563, 31572, 31580, 31585, 31591, 31596, 31603, 31607, + 31615, 31622, 31635, 31643, 31647, 31657, 31662, 31666, 31674, 31682, + 31686, 31695, 31701, 31706, 31714, 31724, 31733, 31742, 31751, 31762, + 31770, 31781, 31790, 31797, 31803, 31808, 31819, 31824, 31828, 31831, + 31835, 31843, 31849, 31857, 31864, 31870, 31875, 31881, 2372, 31885, + 31887, 31892, 31897, 31900, 31902, 31906, 31909, 31916, 31920, 31924, + 31927, 31933, 31943, 31948, 31954, 31958, 31963, 31976, 24074, 31982, + 31991, 15654, 31998, 32007, 29432, 32015, 32020, 32024, 32032, 32039, + 32044, 32048, 32053, 32057, 32065, 32071, 32077, 32082, 32086, 32089, + 32094, 32107, 32123, 21080, 32140, 32152, 32169, 32181, 32195, 21097, + 21116, 32207, 32219, 2634, 32233, 32238, 32243, 32248, 32252, 32259, + 32271, 32277, 32280, 32291, 32302, 29848, 670, 32307, 32311, 32314, + 32319, 32324, 32330, 32335, 32340, 32346, 32352, 32357, 32361, 32366, + 32371, 32376, 32380, 32383, 32389, 32394, 32399, 32404, 32408, 32413, + 32419, 32427, 24299, 32432, 32437, 32444, 32450, 32456, 32461, 32469, + 20618, 32476, 32481, 32486, 32491, 32495, 32498, 32503, 32507, 32511, + 32518, 32524, 32530, 32536, 32543, 32548, 32554, 31677, 32558, 32562, + 32567, 32580, 32585, 32591, 32599, 32606, 32614, 32624, 32630, 32636, + 32642, 32646, 32655, 32660, 32665, 8787, 32670, 32677, 32683, 32693, + 32698, 32704, 32712, 3543, 32719, 32726, 3549, 32730, 32735, 32746, + 32753, 32759, 32768, 32772, 3932, 32775, 32782, 32788, 32794, 32802, + 32812, 26958, 32819, 32827, 32833, 32838, 32844, 32849, 32855, 32859, + 32866, 32872, 32881, 24094, 32888, 32893, 32897, 32905, 32913, 7974, + 4373, 32920, 32924, 32928, 32933, 32939, 32944, 32949, 32956, 30349, + 32962, 32967, 32971, 32976, 32980, 32989, 32993, 32999, 33006, 33012, + 33019, 33024, 33033, 33038, 33042, 33047, 33054, 33062, 33070, 33075, + 19508, 33079, 33082, 33086, 33090, 33094, 33097, 33099, 33104, 33112, + 33116, 33123, 33127, 33135, 33142, 33152, 33156, 33160, 33168, 33176, + 33182, 33187, 33196, 11669, 33202, 33211, 33216, 33223, 33231, 33239, + 33247, 33254, 33261, 33268, 33275, 33282, 33287, 33293, 33310, 33318, + 33328, 33336, 33343, 385, 33347, 33353, 33357, 33362, 31426, 33368, + 33371, 33375, 33383, 3554, 33391, 33397, 33403, 33412, 33422, 33429, + 33435, 3560, 3566, 33444, 33451, 33459, 33464, 33468, 33475, 33483, + 33489, 33498, 33508, 33514, 33522, 33531, 33538, 33546, 20175, 33553, + 33560, 33566, 33576, 33585, 33596, 33600, 33610, 33616, 33623, 33631, + 33640, 33649, 33659, 33670, 33677, 33682, 33689, 2967, 33697, 33703, + 33708, 33714, 33720, 33725, 33738, 33751, 33764, 33771, 33777, 33785, + 33790, 33794, 1432, 33798, 33803, 33808, 33813, 33818, 33824, 33829, + 33834, 33839, 33844, 33849, 33854, 33859, 33865, 33871, 33876, 33881, + 33887, 33892, 33897, 33902, 33908, 33913, 33918, 33923, 33928, 33934, + 33939, 33944, 33950, 33955, 33960, 33965, 33970, 33975, 33981, 33986, + 33992, 33997, 34003, 34008, 34013, 34018, 34024, 34030, 34036, 34042, + 34048, 34054, 34060, 34066, 34071, 34076, 34082, 34087, 34092, 34097, + 34102, 34107, 34112, 34117, 34123, 34128, 34133, 34139, 34145, 101, + 34150, 34152, 34156, 34160, 34164, 34169, 34173, 7895, 34177, 34183, + 4738, 34189, 34192, 34197, 34201, 34206, 34210, 34214, 34219, 8594, + 34223, 34227, 34231, 13623, 34236, 34240, 34245, 34250, 34255, 34259, + 34266, 24098, 34272, 34275, 34279, 34284, 34290, 34294, 34302, 34308, + 34313, 34317, 34323, 34327, 34331, 3404, 3409, 27144, 34334, 34342, + 34349, 34353, 34360, 34365, 333, 34370, 34374, 34380, 34392, 34398, + 34404, 34408, 34414, 34423, 34427, 34431, 34436, 34441, 34446, 34450, + 34454, 34461, 34467, 34472, 34487, 34502, 34517, 34533, 34551, 8544, + 34565, 34572, 34576, 34579, 34588, 34593, 34597, 34605, 31628, 34613, + 34617, 34627, 27114, 34638, 34642, 34651, 34659, 8152, 13163, 34663, + 34666, 34669, 6557, 3802, 34674, 34682, 34686, 34689, 34693, 34698, + 34703, 34709, 34715, 34720, 34724, 23946, 34728, 34732, 34738, 34742, + 7446, 34751, 34758, 34762, 10210, 34769, 34775, 34780, 34787, 34794, + 34801, 26480, 6480, 34808, 34815, 34822, 34828, 34833, 34840, 34851, + 34857, 34862, 34867, 34874, 34878, 34882, 34892, 34903, 34909, 34914, + 34919, 34924, 34929, 34934, 34938, 34942, 34948, 34956, 2273, 828, 8616, + 8621, 8627, 34965, 8632, 8637, 8643, 34970, 34980, 34984, 8648, 34989, + 34992, 34997, 35001, 35006, 35011, 35018, 35025, 35033, 8557, 35040, + 35043, 35049, 35059, 4407, 35068, 35072, 35080, 35084, 35094, 35100, + 35111, 35117, 35123, 35128, 35134, 35140, 35146, 35151, 35154, 35161, + 35167, 35172, 35179, 35186, 35190, 35200, 35213, 35222, 35231, 35242, + 35255, 35266, 35275, 35286, 35291, 35300, 35305, 8653, 35311, 35318, + 35326, 35331, 35335, 35342, 35349, 3757, 21, 35353, 35358, 14958, 35362, + 35365, 35368, 26001, 35372, 26489, 35380, 35384, 35388, 35391, 35397, + 35403, 35411, 35417, 35424, 25993, 35428, 26178, 35432, 35441, 35447, + 35453, 35458, 35462, 35468, 35472, 35475, 35483, 35491, 24156, 35497, + 35504, 35510, 35515, 35520, 35524, 35530, 35535, 35541, 3973, 755, 35548, + 35552, 35555, 13513, 35567, 33527, 35578, 35581, 35588, 35594, 35598, + 35604, 35609, 35615, 35620, 35625, 35629, 35633, 35638, 35643, 35653, + 35659, 35672, 35678, 35685, 35690, 35696, 35701, 14844, 1435, 1002, + 28974, 28980, 35706, 28986, 28999, 29005, 29011, 35712, 29017, 29023, + 35718, 35724, 14, 35732, 35739, 35743, 35747, 35755, 29737, 35759, 35763, + 35770, 35775, 35779, 35784, 35790, 35795, 35801, 35806, 35810, 35814, + 35818, 35823, 35827, 35832, 35836, 35843, 35848, 35852, 35857, 35861, + 35866, 35870, 35875, 35881, 13733, 13738, 35886, 35890, 35893, 35897, + 35902, 35906, 35912, 35919, 35924, 35934, 35939, 35947, 35951, 35954, + 29752, 35958, 4026, 35963, 35968, 35972, 35977, 35981, 35986, 11687, + 35997, 36001, 36004, 36009, 36013, 36017, 36020, 36024, 6576, 11703, + 36027, 36030, 36035, 36039, 36048, 36064, 36080, 36090, 25900, 36097, + 36101, 36106, 36111, 36115, 36119, 33644, 36125, 36130, 36134, 36141, + 36146, 36150, 36154, 24958, 36160, 19603, 36165, 36172, 36180, 36186, + 36193, 36201, 36207, 36211, 36217, 36225, 36229, 36238, 7876, 36246, + 36250, 36258, 36265, 36270, 36275, 36279, 36282, 36286, 36289, 36293, + 36300, 36305, 36311, 24377, 29034, 36315, 36322, 36328, 36334, 36339, + 36342, 36344, 36351, 36358, 36364, 36368, 36371, 36375, 36379, 36383, + 36388, 36392, 36396, 36399, 36403, 36417, 21146, 36436, 36449, 36462, + 36475, 21164, 36490, 8846, 36505, 36511, 36515, 36519, 36526, 36531, + 36535, 36542, 36548, 36553, 36559, 36569, 36581, 36592, 36597, 36604, + 36608, 36612, 36615, 14129, 3605, 36623, 13760, 36636, 36643, 36647, + 36651, 36656, 36661, 36667, 36671, 36675, 36678, 6188, 13771, 36683, + 36687, 36693, 36702, 36707, 33504, 36713, 36718, 36722, 36727, 36734, + 36738, 36741, 12824, 36746, 36753, 1009, 36757, 36762, 36767, 36773, + 36778, 36783, 36787, 36797, 36802, 36808, 36813, 36819, 36824, 36830, + 36840, 36845, 36850, 36854, 5683, 5695, 36859, 36862, 36869, 36875, + 31793, 31800, 36884, 36888, 29800, 36896, 36907, 36915, 33692, 36922, + 36927, 36932, 36943, 36950, 36961, 29824, 19609, 36969, 722, 36974, + 36980, 25984, 36986, 36991, 37001, 37010, 37017, 37023, 37027, 37030, + 37037, 37043, 37050, 37056, 37066, 37074, 37080, 37086, 37091, 37095, + 37102, 37108, 37115, 36384, 530, 12112, 37121, 37126, 37129, 37135, + 37143, 1364, 37148, 37152, 37157, 37164, 37170, 37174, 37179, 37188, + 37195, 37205, 37211, 26019, 37228, 37237, 37245, 37251, 37256, 37263, + 37269, 37277, 37286, 37294, 37298, 37303, 37311, 29833, 37317, 37336, + 14062, 37350, 37366, 37380, 37386, 37391, 37396, 37401, 37407, 29839, + 37412, 37419, 37424, 37428, 341, 2878, 37435, 37440, 37445, 25275, 37266, + 37449, 37454, 37462, 37466, 37469, 37475, 37479, 26074, 37482, 37487, + 37491, 37494, 37499, 37503, 37508, 37513, 37517, 37522, 37526, 37530, + 19346, 19357, 37534, 37539, 37545, 24915, 37550, 37554, 19425, 14280, + 37557, 37562, 37567, 37572, 37577, 37582, 37587, 37592, 440, 43, 29052, + 29057, 29062, 29068, 29073, 29078, 37597, 29082, 37601, 37605, 29087, + 29093, 37609, 29104, 29109, 37617, 37622, 29115, 37627, 37632, 37637, + 37642, 37648, 37654, 37660, 29132, 37673, 37679, 29136, 37683, 29141, + 37688, 29146, 29151, 37691, 37696, 37700, 28795, 37706, 11911, 37713, + 37718, 29156, 37722, 37727, 37732, 37737, 37741, 37746, 37751, 37757, + 37762, 37767, 37773, 37779, 37784, 37788, 37793, 37798, 37803, 37807, + 37812, 37817, 37822, 37828, 37834, 37840, 37845, 37849, 37854, 37858, + 29160, 29165, 29170, 37862, 37866, 29175, 29181, 29187, 29199, 37878, + 23983, 37882, 37886, 37891, 37896, 37901, 37905, 37909, 37919, 37924, + 37929, 37933, 37937, 37940, 37948, 29247, 37953, 1442, 37959, 37967, + 37976, 37980, 37988, 37994, 38002, 38018, 38023, 38038, 29284, 1712, + 10375, 38042, 2924, 38054, 38055, 38063, 38070, 38075, 38082, 38087, + 7746, 1090, 8675, 38094, 38099, 38102, 38105, 38114, 1275, 38119, 36532, + 38126, 38131, 20583, 2511, 38135, 9094, 38145, 38151, 2291, 2301, 38160, + 38169, 38179, 38190, 3235, 31944, 8727, 3735, 14882, 1280, 38195, 38203, + 38210, 38215, 38219, 38223, 21930, 8754, 38231, 38240, 38249, 38257, + 38264, 38269, 38282, 38295, 38307, 38319, 38331, 38344, 38355, 38366, + 38376, 38384, 38392, 38404, 38416, 38427, 38436, 38444, 38451, 38463, + 38470, 38479, 38486, 38499, 38504, 38514, 38519, 38525, 38530, 34759, + 38534, 38541, 38545, 38552, 38560, 2472, 38567, 38578, 38588, 38597, + 38605, 38615, 38623, 38633, 38642, 38647, 38653, 38659, 38670, 38680, + 38689, 38698, 38708, 38716, 38725, 38730, 38735, 38740, 1668, 37, 38748, + 38756, 38767, 38778, 14563, 38788, 38795, 38801, 38806, 38810, 38821, + 38831, 38840, 38851, 14931, 14936, 38856, 38865, 38870, 38880, 38885, + 38893, 38901, 38908, 38914, 5536, 1038, 38918, 38924, 38929, 38932, 2075, + 36648, 38940, 38944, 38947, 1475, 38953, 12261, 1285, 38958, 38971, + 38985, 2597, 39003, 39015, 39027, 2611, 2628, 39041, 39054, 2643, 39068, + 39080, 2658, 39094, 1291, 1297, 1303, 9012, 39099, 39104, 39109, 39113, + 39128, 39143, 39158, 39173, 39188, 39203, 39218, 39233, 39248, 39263, + 39278, 39293, 39308, 39323, 39338, 39353, 39368, 39383, 39398, 39413, + 39428, 39443, 39458, 39473, 39488, 39503, 39518, 39533, 39548, 39563, + 39578, 39593, 39608, 39623, 39638, 39653, 39668, 39683, 39698, 39713, + 39728, 39743, 39758, 39773, 39788, 39803, 39818, 39833, 39848, 39863, + 39878, 39893, 39908, 39923, 39938, 39953, 39968, 39983, 39998, 40013, + 40028, 40043, 40058, 40073, 40088, 40103, 40118, 40133, 40148, 40163, + 40178, 40193, 40208, 40223, 40238, 40253, 40268, 40283, 40298, 40313, + 40328, 40343, 40358, 40373, 40388, 40403, 40418, 40433, 40448, 40463, + 40478, 40493, 40508, 40523, 40538, 40553, 40568, 40583, 40598, 40613, + 40628, 40643, 40658, 40673, 40688, 40703, 40718, 40733, 40748, 40763, + 40778, 40793, 40808, 40823, 40838, 40853, 40868, 40883, 40898, 40913, + 40928, 40943, 40958, 40973, 40988, 41003, 41018, 41033, 41048, 41063, + 41078, 41093, 41108, 41123, 41138, 41153, 41168, 41183, 41198, 41213, + 41228, 41243, 41258, 41273, 41288, 41303, 41318, 41333, 41348, 41363, + 41378, 41393, 41408, 41423, 41438, 41453, 41468, 41483, 41498, 41513, + 41528, 41543, 41558, 41573, 41588, 41603, 41618, 41633, 41648, 41663, + 41678, 41693, 41708, 41723, 41738, 41753, 41768, 41783, 41798, 41813, + 41828, 41843, 41858, 41873, 41888, 41903, 41918, 41933, 41948, 41963, + 41978, 41993, 42008, 42023, 42038, 42053, 42068, 42083, 42098, 42113, + 42128, 42143, 42158, 42173, 42188, 42203, 42218, 42233, 42248, 42263, + 42278, 42293, 42308, 42323, 42338, 42353, 42368, 42383, 42398, 42413, + 42428, 42443, 42458, 42473, 42488, 42503, 42518, 42533, 42548, 42563, + 42578, 42593, 42608, 42623, 42638, 42653, 42668, 42683, 42698, 42713, + 42728, 42743, 42758, 42773, 42788, 42803, 42818, 42833, 42848, 42863, + 42878, 42893, 42908, 42923, 42938, 42953, 42968, 42983, 42998, 43013, + 43028, 43043, 43058, 43073, 43088, 43103, 43118, 43133, 43148, 43163, + 43178, 43193, 43208, 43223, 43238, 43253, 43268, 43283, 43298, 43313, + 43328, 43343, 43358, 43373, 43388, 43403, 43418, 43433, 43448, 43463, + 43478, 43493, 43508, 43523, 43538, 43553, 43568, 43583, 43598, 43613, + 43628, 43643, 43658, 43673, 43688, 43703, 43718, 43733, 43748, 43763, + 43778, 43793, 43808, 43823, 43838, 43853, 43868, 43883, 43898, 43913, + 43928, 43943, 43958, 43973, 43988, 44003, 44018, 44033, 44048, 44063, + 44078, 44093, 44108, 44123, 44138, 44153, 44168, 44183, 44198, 44213, + 44228, 44243, 44258, 44273, 44288, 44303, 44318, 44333, 44348, 44363, + 44378, 44393, 44408, 44423, 44438, 44453, 44468, 44483, 44498, 44513, + 44528, 44543, 44558, 44573, 44588, 44603, 44618, 44633, 44648, 44663, + 44678, 44693, 44708, 44723, 44738, 44753, 44768, 44783, 44798, 44813, + 44828, 44843, 44858, 44873, 44888, 44903, 44918, 44933, 44948, 44963, + 44978, 44993, 45008, 45023, 45038, 45053, 45068, 45083, 45098, 45113, + 45128, 45143, 45158, 45173, 45188, 45203, 45218, 45233, 45248, 45263, + 45278, 45293, 45308, 45323, 45338, 45353, 45368, 45383, 45398, 45413, + 45428, 45443, 45458, 45473, 45488, 45503, 45518, 45533, 45548, 45563, + 45578, 45593, 45608, 45623, 45638, 45653, 45668, 45683, 45698, 45713, + 45728, 45743, 45758, 45773, 45788, 45803, 45818, 45833, 45848, 45863, + 45878, 45893, 45908, 45923, 45938, 45953, 45968, 45983, 45998, 46013, + 46028, 46043, 46058, 46073, 46088, 46103, 46118, 46133, 46148, 46163, + 46178, 46193, 46208, 46223, 46238, 46253, 46268, 46283, 46298, 46313, + 46328, 46343, 46358, 46373, 46388, 46403, 46418, 46433, 46448, 46463, + 46478, 46493, 46508, 46523, 46538, 46553, 46568, 46583, 46598, 46613, + 46628, 46643, 46658, 46673, 46688, 46703, 46718, 46733, 46748, 46763, + 46778, 46793, 46808, 46823, 46838, 46853, 46868, 46883, 46899, 46915, + 46931, 46947, 46963, 46979, 46995, 47011, 47027, 47043, 47059, 47075, + 47091, 47107, 47123, 47139, 47155, 47171, 47187, 47203, 47219, 47235, + 47251, 47267, 47283, 47299, 47315, 47331, 47347, 47363, 47379, 47395, + 47411, 47427, 47443, 47459, 47475, 47491, 47507, 47523, 47539, 47555, + 47571, 47587, 47603, 47619, 47635, 47651, 47667, 47683, 47699, 47715, + 47731, 47747, 47763, 47779, 47795, 47811, 47827, 47843, 47859, 47875, + 47891, 47907, 47923, 47939, 47955, 47971, 47987, 48003, 48019, 48035, + 48051, 48067, 48083, 48099, 48115, 48131, 48147, 48163, 48179, 48195, + 48211, 48227, 48243, 48259, 48275, 48291, 48307, 48323, 48339, 48355, + 48371, 48387, 48403, 48419, 48435, 48451, 48467, 48483, 48499, 48515, + 48531, 48547, 48563, 48579, 48595, 48611, 48627, 48643, 48659, 48675, + 48691, 48707, 48723, 48739, 48755, 48771, 48787, 48803, 48819, 48835, + 48851, 48867, 48883, 48899, 48915, 48931, 48947, 48963, 48979, 48995, + 49011, 49027, 49043, 49059, 49075, 49091, 49107, 49123, 49139, 49155, + 49171, 49187, 49203, 49219, 49235, 49251, 49267, 49283, 49299, 49315, + 49331, 49347, 49363, 49379, 49395, 49411, 49427, 49443, 49459, 49475, + 49491, 49507, 49523, 49539, 49555, 49571, 49587, 49603, 49619, 49635, + 49651, 49667, 49683, 49699, 49715, 49731, 49747, 49763, 49779, 49795, + 49811, 49827, 49843, 49859, 49875, 49891, 49907, 49923, 49939, 49955, + 49971, 49987, 50003, 50019, 50035, 50051, 50067, 50083, 50099, 50115, + 50131, 50147, 50163, 50179, 50195, 50211, 50227, 50243, 50259, 50275, + 50291, 50307, 50323, 50339, 50355, 50371, 50387, 50403, 50419, 50435, + 50451, 50467, 50483, 50499, 50515, 50531, 50547, 50563, 50579, 50595, + 50611, 50627, 50643, 50659, 50675, 50691, 50707, 50723, 50739, 50755, + 50771, 50787, 50803, 50819, 50835, 50851, 50867, 50883, 50899, 50915, + 50931, 50947, 50963, 50979, 50995, 51011, 51027, 51043, 51059, 51075, + 51091, 51107, 51123, 51139, 51155, 51171, 51187, 51203, 51219, 51235, + 51251, 51267, 51283, 51299, 51315, 51331, 51347, 51363, 51379, 51395, + 51411, 51427, 51443, 51459, 51475, 51491, 51507, 51523, 51539, 51555, + 51571, 51587, 51603, 51619, 51635, 51651, 51667, 51683, 51699, 51715, + 51731, 51747, 51763, 51779, 51795, 51811, 51827, 51843, 51859, 51875, + 51891, 51907, 51923, 51939, 51955, 51971, 51987, 52003, 52019, 52035, + 52051, 52067, 52083, 52099, 52115, 52131, 52147, 52163, 52179, 52195, + 52211, 52227, 52243, 52259, 52275, 52291, 52307, 52323, 52339, 52355, + 52371, 52387, 52403, 52419, 52435, 52451, 52467, 52483, 52499, 52515, + 52531, 52547, 52563, 52579, 52595, 52611, 52627, 52643, 52659, 52675, + 52691, 52707, 52723, 52739, 52755, 52771, 52787, 52803, 52819, 52835, + 52851, 52867, 52883, 52899, 52915, 52931, 52947, 52963, 52979, 52995, + 53011, 53027, 53043, 53059, 53075, 53091, 53107, 53123, 53139, 53155, + 53171, 53187, 53203, 53219, 53235, 53251, 53267, 53283, 53299, 53315, + 53331, 53347, 53363, 53379, 53395, 53411, 53427, 53443, 53459, 53475, + 53491, 53507, 53523, 53539, 53555, 53571, 53587, 53603, 53619, 53635, + 53651, 53667, 53683, 53699, 53715, 53731, 53747, 53763, 53779, 53795, + 53811, 53827, 53843, 53859, 53875, 53891, 53907, 53923, 53939, 53955, + 53971, 53987, 54003, 54019, 54035, 54051, 54067, 54083, 54099, 54115, + 54131, 54147, 54163, 54179, 54195, 54211, 54227, 54243, 54259, 54275, + 54291, 54307, 54323, 54339, 54355, 54371, 54387, 54403, 54419, 54435, + 54451, 54467, 54483, 54499, 54515, 54531, 54547, 54563, 54579, 54595, + 54611, 54627, 54643, 54659, 54675, 54691, 54707, 54723, 54739, 54755, + 54771, 54787, 54803, 54819, 54835, 54851, 54867, 54883, 54899, 54915, + 54931, 54947, 54963, 54979, 54995, 55011, 55027, 55043, 55059, 55075, + 55091, 55107, 55123, 55139, 55155, 55171, 55187, 55203, 55219, 55235, + 55251, 55267, 55283, 55299, 55315, 55331, 55347, 55363, 55379, 55395, + 55411, 55427, 55443, 55459, 55475, 55491, 55507, 55523, 55539, 55555, + 55570, 14963, 55579, 55585, 55591, 55601, 55609, 13144, 13683, 8319, + 55622, 1483, 55630, 25385, 5637, 55636, 55641, 55646, 55651, 55656, + 55662, 55667, 55673, 55678, 55684, 55689, 55694, 55699, 55704, 55710, + 55715, 55720, 55725, 55730, 55735, 55740, 55745, 55751, 55756, 55762, + 55769, 2515, 55774, 55780, 6948, 55784, 55789, 55796, 55804, 40, 55808, + 55814, 55819, 55824, 55828, 55833, 55837, 55841, 9037, 55845, 55855, + 55868, 55879, 55892, 55899, 55905, 55910, 55916, 55922, 55928, 55933, + 55938, 55943, 55948, 55952, 55957, 55962, 55967, 55973, 55979, 55985, + 55990, 55994, 55999, 56004, 56008, 56013, 56018, 56023, 56027, 9053, + 9064, 9069, 1526, 56031, 1531, 56037, 56040, 1562, 56046, 1568, 1574, + 9099, 56051, 56059, 56066, 56070, 56076, 56081, 28824, 56086, 56093, + 56098, 56102, 56106, 1579, 14538, 14549, 56115, 56122, 56127, 56131, + 14568, 1583, 34897, 56134, 56139, 56149, 56158, 56163, 56167, 56173, + 1588, 36719, 56178, 56187, 56193, 56198, 9249, 9255, 56204, 56216, 56233, + 56250, 56267, 56284, 56301, 56318, 56335, 56352, 56369, 56386, 56403, + 56420, 56437, 56454, 56471, 56488, 56505, 56522, 56539, 56556, 56573, + 56590, 56607, 56624, 56641, 56658, 56675, 56692, 56709, 56726, 56743, + 56760, 56777, 56794, 56811, 56828, 56845, 56862, 56879, 56896, 56913, + 56930, 56947, 56964, 56981, 56998, 57015, 57032, 57049, 57060, 57065, + 1593, 57069, 57075, 57080, 7693, 1598, 57085, 57094, 25664, 57099, 57110, + 57120, 57125, 57132, 57138, 57143, 57148, 14820, 57152, 9266, 1603, 9271, + 57158, 57163, 57169, 57174, 57179, 57184, 57189, 57194, 57199, 57204, + 57210, 57216, 57222, 57227, 57231, 57236, 57241, 57245, 57250, 57255, + 57260, 57264, 57269, 57275, 57280, 57285, 57289, 57294, 57299, 57305, + 57310, 57315, 57321, 57327, 57332, 57336, 57341, 57346, 57351, 57355, + 57360, 57365, 57370, 57376, 57382, 57387, 57391, 57395, 57400, 57405, + 57410, 27024, 57414, 57419, 57424, 57430, 57435, 57440, 57444, 57449, + 57454, 57460, 57465, 57470, 57476, 57482, 57487, 57491, 57496, 57501, + 57505, 57510, 57515, 57520, 57526, 57532, 57537, 57541, 57546, 57551, + 57555, 57560, 57565, 57570, 57574, 57577, 29395, 57582, 57590, 14886, + 14910, 9362, 57596, 57606, 57621, 9367, 57632, 57637, 57648, 57660, + 57672, 57684, 2649, 57696, 57701, 57705, 57711, 57717, 57722, 1615, 1010, + 57731, 57736, 36758, 57740, 57744, 57749, 57753, 14971, 57758, 57761, + 57769, 57777, 1619, 9392, 9398, 1624, 57785, 57792, 57797, 57806, 57816, + 57823, 57828, 1629, 57835, 57840, 15086, 57844, 57849, 57856, 57862, + 57866, 57877, 57887, 15108, 7616, 7623, 1634, 57894, 57900, 57908, 57915, + 57921, 57928, 57940, 57946, 57951, 57963, 57974, 57983, 57993, 3668, + 28660, 28669, 15148, 1639, 1643, 58001, 58012, 58017, 1646, 58025, 58030, + 58042, 58048, 58053, 58061, 1651, 58066, 58071, 58079, 58087, 58094, + 58103, 58111, 58120, 1656, 58124, 1661, 58129, 58136, 15268, 58144, + 58150, 58155, 58163, 58170, 58178, 20658, 58183, 9527, 58192, 58198, + 58205, 58212, 58218, 58228, 58234, 58239, 58244, 58252, 9536, 9541, + 58260, 58266, 58274, 3733, 36846, 58279, 58285, 58290, 58298, 58305, + 10356, 58310, 58316, 1672, 58321, 58324, 1058, 58330, 58335, 58340, + 58346, 58351, 58356, 58361, 58366, 58371, 58376, 1681, 9, 58382, 58386, + 58391, 58395, 58399, 58403, 29643, 58408, 58413, 58418, 58422, 58425, + 58429, 58433, 58438, 58442, 58447, 58451, 32315, 32320, 32325, 58454, + 58461, 58467, 36585, 58477, 32331, 29891, 29653, 29659, 32347, 29665, + 58482, 58487, 29924, 58491, 58494, 58498, 58505, 58508, 58513, 58517, + 58521, 58524, 58534, 58546, 58553, 31282, 58556, 13936, 821, 58559, + 58563, 58568, 58572, 58575, 11944, 58582, 58589, 58602, 58610, 58619, + 58624, 58634, 58647, 58659, 58666, 58671, 58680, 58693, 33732, 58711, + 58716, 58723, 58729, 58734, 58742, 58749, 25224, 613, 58755, 58761, + 58771, 58777, 58782, 29683, 4481, 29697, 58786, 58796, 58801, 58811, + 58826, 58832, 58838, 29707, 58843, 28856, 58847, 58852, 58857, 58861, + 58866, 15151, 58873, 58878, 58882, 4522, 29733, 58886, 58892, 327, 58902, + 58909, 58916, 58921, 58930, 56143, 58936, 58944, 58948, 58952, 58956, + 58960, 58965, 58969, 58975, 58983, 58988, 58993, 58997, 59002, 59006, + 59010, 59016, 59022, 59027, 59031, 29857, 59036, 29863, 29869, 59041, + 59047, 59054, 59059, 59063, 28873, 14813, 59066, 59070, 59075, 59082, + 59088, 59092, 59097, 36295, 59103, 59107, 59111, 59116, 59122, 59128, + 59140, 59149, 59159, 59165, 59172, 59177, 59182, 59186, 59189, 59195, + 59202, 59207, 59212, 59219, 59226, 59232, 59237, 59242, 59250, 59255, + 2377, 59259, 59264, 59270, 59275, 59281, 59286, 59291, 59296, 59302, + 29890, 59307, 59313, 59319, 59325, 29954, 59330, 59335, 59340, 29965, + 59345, 59350, 59355, 59361, 59367, 29970, 59372, 59377, 59382, 30025, + 30031, 59387, 59392, 30036, 59397, 25891, 30058, 30062, 59402, 59378, + 59406, 59414, 59420, 59428, 59435, 59441, 59451, 59457, 59464, 8984, + 30076, 59470, 59483, 59492, 59498, 59507, 59513, 21575, 59520, 59527, + 59537, 30026, 59540, 59547, 59552, 59556, 59560, 59565, 4598, 59569, + 59574, 59579, 32409, 32414, 59583, 32428, 59588, 32433, 59593, 59599, + 32445, 32451, 32457, 59604, 59610, 20619, 59621, 59624, 59636, 59644, + 30094, 59648, 59657, 59667, 59676, 30099, 59681, 59688, 59697, 59703, + 59711, 59718, 4573, 4310, 59723, 30037, 59729, 59732, 59738, 59745, + 59750, 59755, 21502, 59759, 59765, 59771, 59776, 59781, 59785, 59791, + 59797, 31196, 826, 33406, 34304, 34310, 59802, 59806, 59810, 59813, + 59826, 59832, 59836, 59839, 59844, 31495, 59848, 28878, 19446, 59854, + 4502, 4510, 7472, 59857, 59862, 59867, 59872, 59877, 59882, 59887, 59892, + 59897, 59902, 59908, 59913, 59918, 59924, 59929, 59934, 59939, 59944, + 59949, 59954, 59960, 59965, 59971, 59976, 59981, 59986, 59991, 59996, + 60001, 60006, 60011, 60016, 60021, 60027, 60032, 60037, 60042, 60047, + 60052, 60057, 60063, 60068, 60073, 60078, 60083, 60088, 60093, 60098, + 60103, 60108, 60114, 60119, 60124, 60129, 60134, 60140, 60146, 60151, + 60157, 60162, 60167, 60172, 60177, 60182, 1476, 240, 60187, 60191, 60195, + 60199, 23157, 60203, 60207, 60212, 60216, 60221, 60225, 60229, 60233, + 60238, 60242, 11681, 60247, 60251, 60258, 13444, 60267, 60276, 60280, + 60285, 60290, 60294, 22960, 2957, 60298, 60304, 60313, 60321, 60327, + 60339, 60351, 60355, 60360, 60364, 60370, 60376, 60381, 60391, 60401, + 60407, 60412, 60416, 60421, 60427, 60436, 60445, 60453, 13798, 60457, + 60466, 60474, 60486, 60497, 60508, 60517, 60521, 60530, 60540, 60546, + 60551, 60557, 60562, 98, 28772, 60573, 24228, 24238, 60579, 60586, 60592, + 60596, 60606, 60617, 60625, 60634, 60639, 60644, 60648, 15504, 60656, + 60660, 60666, 60676, 60683, 60689, 32508, 1162, 60695, 60698, 60702, + 60712, 60718, 60725, 11618, 60732, 60738, 60747, 60756, 60762, 60768, + 60774, 60779, 60786, 60793, 60799, 60812, 60821, 60830, 60835, 60839, + 60845, 60852, 60859, 60866, 60873, 60880, 60885, 60889, 60893, 60896, + 60906, 60910, 60922, 60931, 60935, 60940, 60944, 60950, 60955, 60962, + 60971, 60979, 60987, 60992, 60996, 61001, 61006, 61016, 61024, 61029, + 61033, 61037, 61043, 61055, 61063, 61073, 61080, 61086, 61091, 61095, + 61099, 61103, 61112, 61121, 61130, 61136, 61142, 61148, 61153, 61160, + 61166, 61174, 61181, 10772, 61187, 61193, 61197, 12523, 61201, 61206, + 61216, 61225, 61231, 61237, 61245, 61252, 61256, 61260, 61266, 61274, + 61281, 61287, 61298, 61302, 61306, 61310, 61313, 61319, 61324, 61328, + 61332, 61341, 61349, 61356, 61362, 61369, 22087, 36337, 61374, 61382, + 61386, 61389, 61397, 61404, 61410, 61419, 61427, 61433, 61438, 61442, + 61447, 61451, 61455, 61460, 61469, 61473, 61480, 61487, 61493, 61501, + 61507, 61518, 61526, 61532, 20753, 61541, 61548, 61555, 61562, 61569, + 61576, 39288, 11456, 61583, 61590, 61595, 32544, 37484, 61601, 61606, + 61611, 61617, 61623, 61629, 61634, 61639, 61644, 61649, 61655, 61660, + 61666, 61671, 61677, 61682, 61687, 61692, 61697, 61702, 61707, 61712, + 61718, 61723, 61729, 61734, 61739, 61744, 61749, 61754, 61759, 61765, + 61770, 61775, 61780, 61785, 61790, 61795, 61800, 61805, 61810, 61815, + 61821, 61826, 61831, 61836, 61841, 61846, 61851, 61856, 61861, 61867, + 61872, 61877, 61882, 61887, 61892, 61897, 61902, 61907, 61912, 61917, + 61922, 61927, 61933, 1797, 224, 34993, 61938, 61941, 61946, 61950, 61953, + 61958, 60983, 61969, 61979, 61986, 62002, 62011, 62021, 62031, 62039, + 62047, 62051, 62054, 62061, 62067, 62078, 62090, 62101, 62110, 62117, + 1286, 21391, 62127, 2544, 62131, 62140, 1127, 15477, 35622, 62148, 62156, + 62170, 62183, 62187, 62192, 62197, 62202, 62208, 62214, 62219, 6957, + 62224, 62232, 9393, 62237, 62243, 1684, 9405, 723, 62252, 62261, 62271, + 24992, 62280, 62286, 15063, 62292, 62296, 3881, 9736, 62302, 58007, + 62309, 3905, 184, 12444, 62315, 62327, 62331, 62337, 25684, 62341, 9724, + 2684, 4, 62346, 62356, 62362, 62373, 62380, 62386, 62392, 62400, 62407, + 62413, 62423, 62433, 62443, 1298, 62452, 62458, 2707, 2713, 6954, 2218, + 62462, 62466, 62475, 62483, 62494, 62502, 62510, 62516, 62521, 62532, + 62543, 62551, 62557, 8061, 62562, 62570, 62574, 62578, 62590, 26060, + 62597, 62607, 62613, 62619, 8163, 62629, 62640, 62650, 62659, 62663, + 62670, 1129, 2537, 62680, 62685, 62693, 62701, 62712, 62719, 62733, + 12369, 379, 62743, 62747, 62756, 62764, 62770, 62784, 62791, 62797, + 62806, 62813, 62823, 62831, 3740, 189, 62839, 62850, 62854, 62866, 25882, + 156, 62872, 62877, 62881, 62888, 62894, 62902, 62909, 7226, 62916, 62925, + 62933, 3806, 62946, 15109, 62950, 2752, 428, 62955, 62968, 62973, 1796, + 647, 62977, 3812, 62985, 62991, 963, 63001, 63010, 63015, 13178, 13185, + 42620, 63019, 3750, 11350, 63027, 63034, 21618, 63038, 63045, 63051, + 63056, 63061, 13198, 354, 63066, 63078, 63084, 63092, 2764, 1716, 63100, + 63102, 63107, 63112, 63117, 63123, 63128, 63133, 63138, 63143, 63148, + 63153, 63159, 63164, 63169, 63174, 63179, 63184, 63189, 63194, 63199, + 63205, 63210, 63215, 63220, 63226, 63231, 63237, 63242, 63247, 63252, + 63257, 63262, 63267, 63272, 63278, 63283, 63289, 63294, 63299, 63304, + 63309, 63314, 63319, 63324, 63329, 63335, 63340, 63345, 63349, 63353, + 63358, 63362, 63367, 63372, 63378, 63383, 63387, 63392, 63396, 63399, + 63401, 63405, 63408, 63413, 63417, 63421, 63425, 63429, 63438, 63442, + 30288, 63445, 30293, 63452, 63457, 30298, 63466, 63475, 30304, 63480, + 30309, 63489, 63494, 9914, 63498, 63503, 63508, 30314, 63512, 37650, + 63516, 63519, 63523, 6638, 63529, 63534, 63538, 3633, 30319, 63541, + 63545, 63548, 63553, 63557, 63563, 63571, 63584, 63593, 63599, 63604, + 63610, 63614, 63620, 63628, 63633, 63640, 63646, 63654, 63663, 63671, + 30322, 63678, 63688, 63697, 63710, 63715, 63720, 63729, 63735, 63742, + 63753, 63765, 63772, 63781, 63790, 63799, 63806, 63812, 63819, 63827, + 63834, 63842, 63851, 63859, 63866, 63874, 63883, 63891, 63900, 63910, + 63919, 63927, 63934, 63942, 63951, 63959, 63968, 63978, 63987, 63995, + 64004, 64014, 64023, 64033, 64044, 64054, 64063, 64071, 64078, 64086, + 64095, 64103, 64112, 64122, 64131, 64139, 64148, 64158, 64167, 64177, + 64188, 64198, 64207, 64215, 64224, 64234, 64243, 64253, 64264, 64274, + 64283, 64293, 64304, 64314, 64325, 64337, 64348, 64358, 64367, 64375, + 64382, 64390, 64399, 64407, 64416, 64426, 64435, 64443, 64452, 64462, + 64471, 64481, 64492, 64502, 64511, 64519, 64528, 64538, 64547, 64557, + 64568, 64578, 64587, 64597, 64608, 64618, 64629, 64641, 64652, 64662, + 64671, 64679, 64688, 64698, 64707, 64717, 64728, 64738, 64747, 64757, + 64768, 64778, 64789, 64801, 64812, 64822, 64831, 64841, 64852, 64862, + 64873, 64885, 64896, 64906, 64917, 64929, 64940, 64952, 64965, 64977, + 64988, 64998, 65007, 65015, 65022, 65030, 65039, 65047, 65056, 65066, + 65075, 65083, 65092, 65102, 65111, 65121, 65132, 65142, 65151, 65159, + 65168, 65178, 65187, 65197, 65208, 65218, 65227, 65237, 65248, 65258, + 65269, 65281, 65292, 65302, 65311, 65319, 65328, 65338, 65347, 65357, + 65368, 65378, 65387, 65397, 65408, 65418, 65429, 65441, 65452, 65462, + 65471, 65481, 65492, 65502, 65513, 65525, 65536, 65546, 65557, 65569, + 65580, 65592, 65605, 65617, 65628, 65638, 65647, 65655, 65664, 65674, + 65683, 65693, 65704, 65714, 65723, 65733, 65744, 65754, 65765, 65777, + 65788, 65798, 65807, 65817, 65828, 65838, 65849, 65861, 65872, 65882, + 65893, 65905, 65916, 65928, 65941, 65953, 65964, 65974, 65983, 65993, + 66004, 66014, 66025, 66037, 66048, 66058, 66069, 66081, 66092, 66104, + 66117, 66129, 66140, 66150, 66161, 66173, 66184, 66196, 66209, 66221, + 66232, 66244, 66257, 66269, 66282, 66296, 66309, 66321, 66332, 66342, + 66351, 66359, 66366, 66371, 6489, 66378, 30332, 66383, 66388, 30337, + 66394, 19100, 30342, 66399, 66405, 66413, 66419, 66425, 66432, 66439, + 66444, 66448, 66451, 66455, 66464, 66470, 66482, 66493, 66497, 3019, + 6464, 66502, 66505, 66507, 66511, 66515, 66519, 23927, 66524, 66528, + 66531, 66536, 66540, 66547, 66553, 66557, 66561, 66564, 30359, 66569, + 66576, 66585, 66593, 66604, 66612, 66620, 66627, 66634, 66640, 66651, + 30364, 66656, 66667, 66679, 66687, 66698, 66707, 66718, 66723, 66731, + 2510, 66736, 32002, 66749, 66753, 66765, 66773, 66778, 66786, 15664, + 66797, 66803, 66810, 66818, 66824, 30374, 66829, 3831, 55605, 66836, + 66839, 66847, 66860, 66873, 66886, 66899, 66906, 66917, 66926, 39105, + 39110, 66931, 66935, 66943, 66950, 66959, 66967, 66973, 66982, 66990, + 66998, 67002, 67011, 67020, 67030, 67043, 67056, 67066, 30379, 67072, + 67079, 67085, 30385, 67090, 67093, 67097, 67105, 67114, 38843, 67122, + 67131, 67139, 67146, 67154, 67164, 67173, 67182, 67191, 67199, 67210, + 67220, 7733, 19715, 67229, 67234, 67239, 67243, 67247, 67252, 67258, + 67263, 67268, 67274, 67279, 67284, 19680, 67289, 67296, 67304, 67312, + 67317, 67324, 67331, 67335, 67339, 67347, 67355, 30402, 67361, 67367, + 67379, 67385, 67389, 67396, 67401, 67412, 67422, 67432, 67444, 67450, + 67460, 67470, 30429, 67479, 67488, 67494, 67506, 67517, 67524, 67529, + 67533, 67541, 67547, 67552, 67557, 67564, 67572, 67584, 67594, 67603, + 67612, 67619, 31866, 21906, 67625, 67630, 67634, 67638, 67643, 67649, + 67660, 67673, 67678, 67685, 30434, 67690, 67702, 67711, 67721, 67732, + 67745, 67752, 67761, 67770, 67778, 67783, 67789, 1465, 67794, 67799, + 67804, 67809, 67815, 67820, 67825, 67831, 67837, 67842, 67846, 67851, + 67856, 67861, 56111, 67866, 67871, 67876, 67881, 67887, 67893, 67898, + 67902, 67907, 67912, 67917, 67923, 67928, 67934, 67939, 67944, 67949, + 67954, 67958, 67964, 67969, 67978, 67983, 67988, 67993, 67998, 68002, + 68009, 68015, 15326, 15333, 42875, 68020, 67970, 68022, 68032, 30443, + 68035, 68044, 68050, 4617, 30448, 68054, 68060, 68066, 68071, 68075, + 68082, 68087, 68097, 68106, 68110, 68116, 68122, 68128, 68132, 68140, + 68147, 68155, 68163, 30453, 68170, 68173, 68180, 68186, 68191, 68195, + 68201, 68208, 68213, 68217, 68226, 68234, 68240, 68245, 30458, 68252, + 68259, 68265, 68270, 68276, 68283, 68289, 19453, 25408, 68295, 68300, + 68306, 68318, 68003, 68010, 68328, 68333, 68340, 68347, 68353, 68364, + 68369, 7502, 68377, 68380, 68386, 68390, 68394, 68397, 68403, 30207, + 4656, 913, 11731, 68410, 68416, 68422, 68428, 68434, 68440, 68446, 68452, + 68458, 68463, 68468, 68473, 68478, 68483, 68488, 68493, 68498, 68503, + 68508, 68513, 68518, 68523, 68529, 68534, 68539, 68545, 68550, 68555, + 68561, 68567, 68573, 68579, 68585, 68591, 68597, 68603, 68609, 68614, + 68619, 68625, 68630, 68635, 68641, 68646, 68651, 68656, 68661, 68666, + 68671, 68676, 68681, 68686, 68691, 68696, 68701, 68707, 68712, 68717, + 68722, 68728, 68733, 68738, 68743, 68748, 68754, 68759, 68764, 68769, + 68774, 68779, 68784, 68789, 68794, 68799, 68804, 68809, 68814, 68819, + 68824, 68829, 68834, 68839, 68844, 68849, 68855, 68860, 68865, 68870, + 68875, 68880, 68885, 68890, 1827, 143, 68895, 68899, 68903, 68908, 68916, + 68920, 68927, 68935, 68939, 68952, 68960, 68964, 68967, 68972, 68976, + 68981, 68985, 68993, 68997, 19108, 69002, 58270, 69006, 69009, 69017, + 69025, 69033, 69038, 69045, 69051, 69057, 69062, 69067, 69075, 62175, + 69082, 69087, 69092, 69096, 9981, 69100, 69105, 69110, 69114, 69117, + 69123, 69127, 69137, 69146, 69149, 69156, 69169, 69175, 69183, 69194, + 69205, 69216, 69227, 69236, 69242, 69251, 69259, 69269, 69282, 69289, + 69300, 69306, 69311, 69316, 69322, 69328, 69338, 69347, 67692, 69355, + 69361, 69369, 69375, 69383, 69387, 69391, 69394, 69400, 69406, 69414, + 69426, 69438, 69445, 69449, 69460, 69468, 69475, 69487, 69495, 69503, + 69510, 69516, 69526, 69535, 69540, 69550, 69559, 38184, 69566, 69570, + 69575, 69583, 69590, 69596, 69600, 69610, 69621, 69629, 69636, 69648, + 69660, 69669, 66739, 69676, 69687, 69701, 69709, 69719, 69726, 69734, + 69746, 69755, 69763, 69773, 69782, 69793, 69805, 69814, 69824, 69831, + 69840, 69855, 69865, 69874, 69882, 69895, 69910, 69914, 69923, 69935, + 69946, 69957, 69968, 69978, 69989, 69997, 70003, 70013, 70019, 26923, + 70024, 70030, 70035, 70042, 8075, 15684, 70048, 70057, 70062, 70066, + 70073, 70079, 70084, 70092, 70100, 70104, 70107, 70110, 70112, 70119, + 70125, 70136, 70141, 70145, 70152, 70158, 70163, 70171, 62642, 62652, + 70177, 70184, 70194, 8971, 70201, 70206, 27113, 70215, 70220, 70227, + 70237, 70245, 70253, 70262, 70268, 70274, 70281, 70288, 70293, 70297, + 70305, 70310, 70315, 70323, 70330, 70335, 70341, 70344, 70348, 70357, + 68947, 70366, 70370, 70376, 70387, 70397, 15693, 70408, 70416, 15705, + 70423, 70427, 70436, 25294, 70443, 70447, 70452, 70469, 70481, 8925, + 70493, 70498, 70503, 70508, 70512, 70515, 70520, 70525, 70531, 70536, + 4324, 19181, 70541, 70546, 70552, 70559, 70564, 70569, 70575, 70581, + 70587, 70592, 70598, 70602, 70616, 70624, 70632, 70638, 70643, 70650, + 70660, 70669, 70674, 70679, 70687, 70692, 70698, 70703, 70712, 57154, + 70717, 70720, 70738, 70757, 70770, 70784, 70800, 70807, 70814, 70820, + 70827, 70832, 70838, 70844, 70852, 70858, 70863, 70868, 70884, 8938, + 70898, 70905, 70913, 70919, 70923, 70926, 70931, 70936, 70943, 70948, + 70957, 70962, 70968, 70977, 70986, 70991, 70995, 71003, 10005, 71012, + 71020, 71025, 71031, 10016, 71036, 71039, 71044, 71054, 71063, 71068, + 71074, 71079, 71087, 71094, 71105, 71115, 71120, 62103, 71125, 71131, + 71136, 71143, 71152, 71160, 71166, 71173, 71179, 71183, 15161, 2993, + 71188, 71192, 71198, 71207, 71213, 71220, 71224, 71245, 71267, 71283, + 71300, 71319, 71328, 71338, 71345, 71352, 25181, 71358, 71362, 71370, + 71382, 71388, 71396, 71400, 71408, 71415, 71419, 71425, 71431, 71436, + 3498, 39305, 71442, 71446, 71450, 71454, 71459, 71464, 71469, 71475, + 71481, 71487, 71494, 71500, 71507, 71513, 71519, 71524, 71530, 71535, + 71540, 71544, 71549, 39320, 71553, 71558, 71566, 71570, 71575, 71582, + 71591, 71597, 71604, 71608, 71611, 71618, 71627, 71632, 71636, 71644, + 71653, 71657, 71665, 71671, 71676, 71681, 71687, 71693, 71698, 71702, + 71708, 71713, 71717, 71721, 71724, 71729, 71737, 71747, 71752, 36865, + 71760, 71772, 71776, 71782, 71794, 71805, 71812, 71818, 71825, 71837, + 71844, 71850, 19255, 71854, 71860, 71867, 71873, 71879, 71884, 71889, + 71894, 71903, 5491, 71908, 14627, 71914, 71918, 71926, 71935, 71939, + 71946, 71955, 71968, 71974, 71545, 27962, 71979, 71981, 71986, 71991, + 71996, 72001, 72006, 72011, 72016, 72021, 72026, 72031, 72036, 72041, + 72046, 72051, 72057, 72062, 72067, 72072, 72077, 72082, 72087, 72092, + 72097, 72103, 72109, 72115, 72120, 72125, 72137, 72142, 1833, 67, 72147, + 72152, 30485, 30490, 30495, 30501, 30506, 72156, 30511, 20226, 72178, + 72182, 72186, 72191, 72195, 30515, 72199, 72207, 30520, 72214, 72217, + 72222, 72226, 7910, 72235, 30525, 20092, 72238, 72242, 1396, 72247, + 30536, 72250, 72255, 23720, 23730, 32940, 72260, 72265, 72270, 72275, + 72281, 72286, 72295, 72300, 72307, 72313, 72318, 72323, 72328, 72338, + 72347, 72352, 72360, 72364, 72372, 30350, 1188, 72379, 72385, 72390, + 72395, 72400, 72406, 72411, 72418, 72424, 72429, 72437, 72447, 72457, + 72463, 72468, 72474, 15715, 72481, 33745, 72494, 72499, 72505, 72518, + 72524, 72528, 72537, 72544, 72550, 72558, 72567, 72574, 72580, 72583, + 23861, 72587, 72594, 72600, 72608, 72613, 22035, 72619, 72622, 72630, + 72638, 72652, 72659, 72665, 72672, 72678, 30550, 72682, 72689, 72697, + 72705, 30555, 72711, 72717, 72722, 72732, 72738, 72747, 28677, 32415, + 72755, 72760, 72765, 72770, 72774, 13170, 36878, 72779, 72784, 30560, + 59554, 72788, 72793, 72797, 72806, 72814, 72820, 72825, 72831, 72838, + 72844, 72849, 72854, 72863, 72875, 72890, 30801, 72896, 14746, 30564, + 72900, 72907, 22145, 72913, 72920, 72929, 72936, 72945, 72951, 72956, + 72964, 72970, 30574, 72975, 72984, 71800, 72993, 73000, 73006, 73012, + 73022, 73030, 73037, 73041, 30579, 73044, 30585, 30591, 73049, 73057, + 73067, 73076, 73084, 73091, 73101, 30596, 73105, 73107, 73111, 73116, + 73120, 73124, 73130, 73135, 73139, 73150, 73155, 2998, 73159, 73166, + 73170, 73179, 73187, 73194, 73199, 73204, 59600, 73208, 73211, 73217, + 73225, 73231, 73235, 73240, 73247, 73252, 73258, 32446, 73263, 73266, + 73271, 73275, 73280, 73285, 73289, 73297, 23739, 23748, 73303, 73309, + 73315, 73320, 73324, 73327, 73337, 73346, 73351, 73357, 73364, 73370, + 73374, 73382, 73387, 32452, 73391, 73399, 73405, 73412, 73417, 73421, + 73426, 55791, 32458, 73432, 73437, 73441, 73446, 73451, 73456, 73460, + 73465, 73470, 73476, 73481, 73486, 73492, 73498, 73503, 73507, 73512, + 73517, 73522, 73526, 22144, 73531, 73536, 73542, 73548, 73554, 73559, + 73563, 73568, 73573, 73578, 73582, 73587, 73592, 73597, 73602, 73606, + 30600, 73614, 73618, 73626, 73634, 73645, 73650, 73654, 20497, 73659, + 73665, 73675, 73682, 73687, 73696, 73701, 73705, 73710, 73718, 73726, + 73733, 62321, 73739, 73747, 73754, 73765, 73771, 73777, 30610, 73780, + 73787, 73795, 73800, 37069, 73804, 73809, 73816, 73821, 7389, 73825, + 73833, 73840, 73847, 73853, 73867, 60629, 73875, 73881, 73885, 73888, + 73896, 73903, 73908, 73921, 73928, 73935, 73940, 58174, 73945, 73948, + 73955, 73961, 73965, 73973, 73983, 73993, 74002, 74010, 74021, 74026, + 74030, 74035, 74039, 33071, 19509, 33080, 74047, 74052, 74057, 74062, + 74067, 74072, 74077, 74081, 74086, 74091, 74096, 74101, 74106, 74111, + 74115, 74120, 74125, 74129, 74133, 74137, 74141, 74146, 74151, 74155, + 74160, 74164, 74168, 74173, 74178, 74183, 74188, 74192, 74197, 74202, + 74206, 74211, 74216, 74221, 74226, 74231, 74236, 74241, 74246, 74251, + 74256, 74261, 74266, 74271, 74276, 74281, 74286, 74291, 74296, 74301, + 74306, 74310, 74315, 74320, 74325, 74330, 74335, 74340, 74345, 74350, + 74355, 74360, 74365, 74369, 74374, 74378, 74383, 74388, 74393, 74398, + 74403, 74408, 74413, 74418, 74423, 74427, 74431, 74436, 74441, 74445, + 74450, 74455, 74459, 74464, 74469, 74474, 74479, 74483, 74488, 74493, + 74497, 74502, 74506, 74510, 74514, 74518, 74523, 74527, 74531, 74535, + 74539, 74543, 74547, 74551, 74555, 74559, 74564, 74569, 74574, 74579, + 74584, 74589, 74594, 74599, 74604, 74609, 74613, 74617, 74621, 74625, + 74629, 74633, 74638, 74642, 74647, 74651, 74656, 74661, 74665, 74669, + 74674, 74678, 74682, 74686, 74690, 74694, 74698, 74702, 74706, 74710, + 74714, 74718, 74722, 74726, 74730, 74735, 74740, 74744, 74748, 74752, + 74756, 74760, 74764, 74769, 74773, 74777, 74781, 74785, 74789, 74793, + 74798, 74802, 74807, 74811, 74815, 74819, 74823, 74827, 74831, 74835, + 74839, 74843, 74847, 74851, 74856, 74860, 74864, 74868, 74872, 74876, + 74880, 74884, 74888, 74892, 74896, 74900, 74905, 74909, 74913, 74918, + 74923, 74927, 74931, 74935, 74939, 74943, 74947, 74951, 74955, 74960, + 74964, 74969, 74973, 74978, 74982, 74987, 74991, 74997, 75002, 75006, + 75011, 75015, 75020, 75024, 75029, 75033, 75038, 1484, 75042, 2778, 1722, + 1727, 75046, 75050, 2782, 75054, 1365, 75059, 1331, 75063, 2794, 75067, + 75074, 75081, 75095, 2798, 5589, 75104, 75112, 75119, 75130, 75139, + 75146, 75158, 75171, 75184, 75195, 75200, 75207, 75219, 75223, 3918, + 10082, 75233, 75238, 75247, 75257, 2802, 75262, 75266, 75271, 75278, + 75284, 75292, 75304, 1336, 11351, 75314, 75318, 75324, 75338, 75350, + 75362, 75372, 75381, 75390, 75399, 75407, 75418, 75426, 3968, 75436, + 75445, 75451, 75466, 75473, 75479, 33197, 75484, 2826, 11355, 75488, + 75495, 7334, 75504, 2831, 30105, 75510, 57923, 75517, 75523, 75534, + 75540, 75547, 75553, 75561, 75568, 75574, 75584, 75593, 75604, 75611, + 75617, 75627, 75635, 75641, 75656, 75662, 75667, 75674, 75677, 75683, + 75690, 75696, 75704, 75713, 75721, 75727, 75736, 38845, 75750, 75755, + 13007, 75761, 75774, 75783, 75791, 75798, 75802, 75806, 75809, 75816, + 75823, 75831, 75839, 75848, 75856, 12943, 75864, 75869, 75873, 75885, + 75892, 75901, 780, 75911, 75920, 75931, 2847, 75935, 75939, 75945, 75958, + 75970, 75980, 75989, 24331, 76001, 76009, 76018, 76029, 76040, 76050, + 76060, 76069, 76077, 9657, 76084, 76088, 76093, 76098, 76104, 1341, + 10153, 76111, 76122, 76131, 76139, 76148, 76156, 76172, 76183, 76192, + 76200, 76212, 76223, 76239, 76249, 76270, 76283, 76291, 76298, 13118, + 76311, 76316, 76322, 4386, 76328, 76331, 76338, 76348, 6607, 76355, + 76360, 76365, 76373, 76381, 8123, 8132, 76386, 76397, 76402, 76408, 2855, + 2860, 76414, 9224, 76420, 76427, 76434, 76447, 2205, 50, 76452, 76457, + 76467, 76473, 76482, 76490, 76500, 76504, 76509, 76513, 76525, 2883, + 76533, 76541, 76546, 76557, 76568, 76577, 76582, 76588, 76593, 76603, + 76613, 76618, 76624, 76629, 76638, 19562, 76642, 4045, 12, 76647, 76656, + 76663, 76670, 76676, 76682, 827, 76687, 76692, 58240, 76697, 76702, + 76708, 76716, 76721, 76728, 76734, 76739, 35573, 38743, 76745, 2887, 32, + 76755, 76768, 76773, 76781, 76786, 76792, 2909, 26234, 76797, 76805, + 76812, 76817, 56033, 59221, 76826, 1667, 1776, 76831, 76836, 76843, 1780, + 242, 76850, 76856, 76861, 76868, 1784, 76873, 76879, 76884, 76896, 4597, + 76906, 1791, 76912, 76917, 76924, 76931, 76946, 76953, 76964, 76972, + 2572, 76976, 76988, 76993, 76997, 77003, 26059, 2210, 77007, 77018, + 77022, 77026, 77032, 77036, 77045, 77049, 77060, 77064, 2256, 29944, + 77068, 77078, 3018, 7738, 77086, 77091, 77095, 77104, 77111, 77117, 2988, + 15343, 77121, 77134, 77152, 77157, 77165, 77173, 77183, 11457, 77195, + 77208, 77215, 77222, 77238, 77245, 77251, 1024, 77258, 77265, 77275, + 77284, 77296, 39709, 77304, 3002, 10350, 77307, 77315, 77319, 3006, + 77323, 19358, 10366, 3684, 77327, 3012, 77331, 77341, 77347, 77353, + 77359, 77365, 77371, 77377, 77383, 77389, 77395, 77401, 77407, 77413, + 77419, 77425, 77431, 77437, 77443, 77449, 77455, 77461, 77467, 77473, + 77479, 77485, 77491, 77498, 77505, 77511, 77517, 77523, 77529, 77535, + 77541, 1346, 14270, 10388, 77547, 77552, 77557, 77562, 77567, 77572, + 77577, 77582, 77587, 77592, 77597, 77602, 77607, 77612, 77617, 77622, + 77627, 77632, 77637, 77642, 77647, 77652, 77657, 77662, 77667, 77672, + 77678, 77683, 77688, 77694, 77699, 77705, 77710, 77715, 77721, 77726, + 77731, 77736, 77741, 77746, 77751, 77756, 77761, 77342, 77348, 77354, + 77360, 77366, 77372, 77378, 77384, 77390, 77396, 77402, 77408, 77414, + 77420, 77426, 77767, 77432, 77438, 77444, 77773, 77450, 77456, 77462, + 77468, 77474, 77480, 77486, 77506, 77779, 77785, 77512, 77791, 77518, + 77524, 77530, 77536, 77542, 3033, 3038, 77797, 77802, 77805, 77811, + 77817, 77824, 77829, 77834, 2261, }; /* code->name phrasebook */ #define phrasebook_shift 7 -#define phrasebook_short 216 +#define phrasebook_short 211 static unsigned char phrasebook[] = { - 0, 223, 254, 246, 95, 78, 228, 69, 78, 54, 55, 248, 155, 55, 229, 169, - 55, 254, 134, 254, 79, 42, 229, 229, 45, 229, 229, 253, 251, 88, 55, 250, - 168, 242, 120, 245, 90, 223, 136, 224, 17, 20, 217, 84, 20, 107, 20, 103, - 20, 160, 20, 154, 20, 174, 20, 182, 20, 191, 20, 185, 20, 190, 250, 175, - 225, 67, 235, 87, 55, 246, 154, 55, 244, 30, 55, 228, 82, 78, 250, 167, - 253, 244, 7, 6, 1, 60, 7, 6, 1, 253, 204, 7, 6, 1, 251, 202, 7, 6, 1, - 250, 46, 7, 6, 1, 73, 7, 6, 1, 246, 74, 7, 6, 1, 245, 67, 7, 6, 1, 243, - 225, 7, 6, 1, 72, 7, 6, 1, 237, 126, 7, 6, 1, 237, 17, 7, 6, 1, 153, 7, - 6, 1, 189, 7, 6, 1, 207, 7, 6, 1, 74, 7, 6, 1, 230, 59, 7, 6, 1, 228, - 163, 7, 6, 1, 152, 7, 6, 1, 198, 7, 6, 1, 222, 201, 7, 6, 1, 68, 7, 6, 1, - 216, 216, 7, 6, 1, 219, 40, 7, 6, 1, 218, 151, 7, 6, 1, 218, 90, 7, 6, 1, - 217, 157, 42, 40, 115, 227, 160, 224, 17, 45, 40, 115, 250, 217, 255, 0, - 109, 235, 43, 244, 37, 255, 0, 7, 3, 1, 60, 7, 3, 1, 253, 204, 7, 3, 1, - 251, 202, 7, 3, 1, 250, 46, 7, 3, 1, 73, 7, 3, 1, 246, 74, 7, 3, 1, 245, - 67, 7, 3, 1, 243, 225, 7, 3, 1, 72, 7, 3, 1, 237, 126, 7, 3, 1, 237, 17, - 7, 3, 1, 153, 7, 3, 1, 189, 7, 3, 1, 207, 7, 3, 1, 74, 7, 3, 1, 230, 59, - 7, 3, 1, 228, 163, 7, 3, 1, 152, 7, 3, 1, 198, 7, 3, 1, 222, 201, 7, 3, - 1, 68, 7, 3, 1, 216, 216, 7, 3, 1, 219, 40, 7, 3, 1, 218, 151, 7, 3, 1, - 218, 90, 7, 3, 1, 217, 157, 42, 250, 79, 115, 69, 235, 43, 45, 250, 79, - 115, 221, 179, 231, 203, 223, 254, 237, 170, 246, 95, 78, 251, 86, 55, - 229, 11, 55, 250, 78, 55, 218, 19, 55, 252, 1, 135, 226, 87, 55, 249, 13, - 250, 126, 55, 245, 215, 230, 103, 237, 211, 235, 112, 51, 254, 120, 228, - 69, 78, 212, 55, 224, 21, 242, 121, 227, 198, 55, 234, 115, 249, 77, 55, - 229, 42, 55, 223, 59, 103, 223, 59, 160, 254, 248, 255, 0, 233, 195, 55, - 229, 73, 55, 233, 193, 248, 145, 251, 92, 223, 59, 107, 234, 58, 230, - 103, 237, 211, 227, 106, 51, 254, 120, 228, 69, 78, 219, 55, 245, 108, - 131, 228, 89, 219, 55, 245, 108, 131, 243, 194, 219, 55, 245, 108, 148, - 228, 87, 237, 170, 228, 82, 78, 7, 6, 1, 112, 2, 244, 36, 7, 6, 1, 112, - 2, 168, 7, 6, 1, 112, 2, 250, 216, 7, 6, 1, 112, 2, 221, 179, 7, 6, 1, - 112, 2, 249, 13, 7, 6, 1, 112, 2, 227, 94, 50, 7, 6, 1, 254, 234, 7, 6, - 1, 251, 203, 2, 251, 92, 7, 6, 1, 178, 2, 244, 36, 7, 6, 1, 178, 2, 168, - 7, 6, 1, 178, 2, 250, 216, 7, 6, 1, 178, 2, 249, 13, 7, 6, 1, 242, 107, - 2, 244, 36, 7, 6, 1, 242, 107, 2, 168, 7, 6, 1, 242, 107, 2, 250, 216, 7, - 6, 1, 242, 107, 2, 249, 13, 7, 6, 1, 246, 118, 7, 6, 1, 233, 34, 2, 221, - 179, 7, 6, 1, 142, 2, 244, 36, 7, 6, 1, 142, 2, 168, 7, 6, 1, 142, 2, - 250, 216, 7, 6, 1, 142, 2, 221, 179, 7, 6, 1, 142, 2, 249, 13, 233, 84, - 55, 7, 6, 1, 142, 2, 92, 7, 6, 1, 105, 2, 244, 36, 7, 6, 1, 105, 2, 168, - 7, 6, 1, 105, 2, 250, 216, 7, 6, 1, 105, 2, 249, 13, 7, 6, 1, 218, 91, 2, - 168, 7, 6, 1, 221, 234, 7, 3, 1, 225, 1, 198, 7, 3, 1, 112, 2, 244, 36, - 7, 3, 1, 112, 2, 168, 7, 3, 1, 112, 2, 250, 216, 7, 3, 1, 112, 2, 221, - 179, 7, 3, 1, 112, 2, 249, 13, 7, 3, 1, 112, 2, 227, 94, 50, 7, 3, 1, - 254, 234, 7, 3, 1, 251, 203, 2, 251, 92, 7, 3, 1, 178, 2, 244, 36, 7, 3, - 1, 178, 2, 168, 7, 3, 1, 178, 2, 250, 216, 7, 3, 1, 178, 2, 249, 13, 7, - 3, 1, 242, 107, 2, 244, 36, 7, 3, 1, 242, 107, 2, 168, 7, 3, 1, 242, 107, - 2, 250, 216, 7, 3, 1, 242, 107, 2, 249, 13, 7, 3, 1, 246, 118, 7, 3, 1, - 233, 34, 2, 221, 179, 7, 3, 1, 142, 2, 244, 36, 7, 3, 1, 142, 2, 168, 7, - 3, 1, 142, 2, 250, 216, 7, 3, 1, 142, 2, 221, 179, 7, 3, 1, 142, 2, 249, - 13, 248, 188, 55, 7, 3, 1, 142, 2, 92, 7, 3, 1, 105, 2, 244, 36, 7, 3, 1, - 105, 2, 168, 7, 3, 1, 105, 2, 250, 216, 7, 3, 1, 105, 2, 249, 13, 7, 3, - 1, 218, 91, 2, 168, 7, 3, 1, 221, 234, 7, 3, 1, 218, 91, 2, 249, 13, 7, - 6, 1, 112, 2, 234, 115, 7, 3, 1, 112, 2, 234, 115, 7, 6, 1, 112, 2, 252, - 8, 7, 3, 1, 112, 2, 252, 8, 7, 6, 1, 112, 2, 230, 162, 7, 3, 1, 112, 2, - 230, 162, 7, 6, 1, 251, 203, 2, 168, 7, 3, 1, 251, 203, 2, 168, 7, 6, 1, - 251, 203, 2, 250, 216, 7, 3, 1, 251, 203, 2, 250, 216, 7, 6, 1, 251, 203, - 2, 61, 50, 7, 3, 1, 251, 203, 2, 61, 50, 7, 6, 1, 251, 203, 2, 251, 130, - 7, 3, 1, 251, 203, 2, 251, 130, 7, 6, 1, 250, 47, 2, 251, 130, 7, 3, 1, - 250, 47, 2, 251, 130, 7, 6, 1, 250, 47, 2, 92, 7, 3, 1, 250, 47, 2, 92, - 7, 6, 1, 178, 2, 234, 115, 7, 3, 1, 178, 2, 234, 115, 7, 6, 1, 178, 2, - 252, 8, 7, 3, 1, 178, 2, 252, 8, 7, 6, 1, 178, 2, 61, 50, 7, 3, 1, 178, - 2, 61, 50, 7, 6, 1, 178, 2, 230, 162, 7, 3, 1, 178, 2, 230, 162, 7, 6, 1, - 178, 2, 251, 130, 7, 3, 1, 178, 2, 251, 130, 7, 6, 1, 245, 68, 2, 250, - 216, 7, 3, 1, 245, 68, 2, 250, 216, 7, 6, 1, 245, 68, 2, 252, 8, 7, 3, 1, - 245, 68, 2, 252, 8, 7, 6, 1, 245, 68, 2, 61, 50, 7, 3, 1, 245, 68, 2, 61, - 50, 7, 6, 1, 245, 68, 2, 251, 92, 7, 3, 1, 245, 68, 2, 251, 92, 7, 6, 1, - 243, 226, 2, 250, 216, 7, 3, 1, 243, 226, 2, 250, 216, 7, 6, 1, 243, 226, - 2, 92, 7, 3, 1, 243, 226, 2, 92, 7, 6, 1, 242, 107, 2, 221, 179, 7, 3, 1, - 242, 107, 2, 221, 179, 7, 6, 1, 242, 107, 2, 234, 115, 7, 3, 1, 242, 107, - 2, 234, 115, 7, 6, 1, 242, 107, 2, 252, 8, 7, 3, 1, 242, 107, 2, 252, 8, - 7, 6, 1, 242, 107, 2, 230, 162, 7, 3, 1, 242, 107, 2, 230, 162, 7, 6, 1, - 242, 107, 2, 61, 50, 7, 3, 1, 248, 144, 72, 7, 6, 24, 237, 253, 7, 3, 24, - 237, 253, 7, 6, 1, 237, 127, 2, 250, 216, 7, 3, 1, 237, 127, 2, 250, 216, - 7, 6, 1, 237, 18, 2, 251, 92, 7, 3, 1, 237, 18, 2, 251, 92, 7, 3, 1, 236, - 17, 7, 6, 1, 235, 202, 2, 168, 7, 3, 1, 235, 202, 2, 168, 7, 6, 1, 235, - 202, 2, 251, 92, 7, 3, 1, 235, 202, 2, 251, 92, 7, 6, 1, 235, 202, 2, - 251, 130, 7, 3, 1, 235, 202, 2, 251, 130, 7, 6, 1, 235, 202, 2, 233, 193, - 248, 145, 7, 3, 1, 235, 202, 2, 233, 193, 248, 145, 7, 6, 1, 235, 202, 2, - 92, 7, 3, 1, 235, 202, 2, 92, 7, 6, 1, 233, 34, 2, 168, 7, 3, 1, 233, 34, - 2, 168, 7, 6, 1, 233, 34, 2, 251, 92, 7, 3, 1, 233, 34, 2, 251, 92, 7, 6, - 1, 233, 34, 2, 251, 130, 7, 3, 1, 233, 34, 2, 251, 130, 7, 3, 1, 233, 34, - 228, 246, 251, 213, 254, 79, 7, 6, 1, 246, 185, 7, 3, 1, 246, 185, 7, 6, - 1, 142, 2, 234, 115, 7, 3, 1, 142, 2, 234, 115, 7, 6, 1, 142, 2, 252, 8, - 7, 3, 1, 142, 2, 252, 8, 7, 6, 1, 142, 2, 51, 168, 7, 3, 1, 142, 2, 51, - 168, 7, 6, 24, 230, 167, 7, 3, 24, 230, 167, 7, 6, 1, 228, 39, 2, 168, 7, - 3, 1, 228, 39, 2, 168, 7, 6, 1, 228, 39, 2, 251, 92, 7, 3, 1, 228, 39, 2, - 251, 92, 7, 6, 1, 228, 39, 2, 251, 130, 7, 3, 1, 228, 39, 2, 251, 130, 7, - 6, 1, 226, 235, 2, 168, 7, 3, 1, 226, 235, 2, 168, 7, 6, 1, 226, 235, 2, - 250, 216, 7, 3, 1, 226, 235, 2, 250, 216, 7, 6, 1, 226, 235, 2, 251, 92, - 7, 3, 1, 226, 235, 2, 251, 92, 7, 6, 1, 226, 235, 2, 251, 130, 7, 3, 1, - 226, 235, 2, 251, 130, 7, 6, 1, 222, 202, 2, 251, 92, 7, 3, 1, 222, 202, - 2, 251, 92, 7, 6, 1, 222, 202, 2, 251, 130, 7, 3, 1, 222, 202, 2, 251, - 130, 7, 6, 1, 222, 202, 2, 92, 7, 3, 1, 222, 202, 2, 92, 7, 6, 1, 105, 2, - 221, 179, 7, 3, 1, 105, 2, 221, 179, 7, 6, 1, 105, 2, 234, 115, 7, 3, 1, - 105, 2, 234, 115, 7, 6, 1, 105, 2, 252, 8, 7, 3, 1, 105, 2, 252, 8, 7, 6, - 1, 105, 2, 227, 94, 50, 7, 3, 1, 105, 2, 227, 94, 50, 7, 6, 1, 105, 2, - 51, 168, 7, 3, 1, 105, 2, 51, 168, 7, 6, 1, 105, 2, 230, 162, 7, 3, 1, - 105, 2, 230, 162, 7, 6, 1, 219, 41, 2, 250, 216, 7, 3, 1, 219, 41, 2, - 250, 216, 7, 6, 1, 218, 91, 2, 250, 216, 7, 3, 1, 218, 91, 2, 250, 216, - 7, 6, 1, 218, 91, 2, 249, 13, 7, 6, 1, 217, 158, 2, 168, 7, 3, 1, 217, - 158, 2, 168, 7, 6, 1, 217, 158, 2, 61, 50, 7, 3, 1, 217, 158, 2, 61, 50, - 7, 6, 1, 217, 158, 2, 251, 130, 7, 3, 1, 217, 158, 2, 251, 130, 7, 3, 1, - 171, 198, 7, 3, 1, 49, 2, 92, 7, 6, 1, 49, 2, 96, 7, 6, 1, 49, 2, 221, - 117, 7, 3, 1, 49, 2, 221, 117, 7, 6, 1, 145, 182, 7, 3, 1, 145, 182, 7, - 6, 1, 230, 119, 74, 7, 6, 1, 251, 203, 2, 96, 7, 3, 1, 251, 203, 2, 96, - 7, 6, 1, 254, 212, 250, 46, 7, 6, 1, 250, 47, 2, 96, 7, 6, 1, 250, 47, 2, - 221, 117, 7, 3, 1, 250, 47, 2, 221, 117, 7, 3, 1, 215, 249, 62, 7, 6, 1, - 210, 73, 7, 6, 1, 226, 104, 7, 6, 1, 230, 119, 73, 7, 6, 1, 246, 75, 2, - 96, 7, 3, 1, 246, 75, 2, 96, 7, 6, 1, 245, 68, 2, 96, 7, 6, 1, 244, 231, - 7, 3, 1, 242, 154, 7, 6, 1, 237, 162, 7, 6, 1, 242, 107, 2, 92, 7, 6, 1, - 237, 18, 2, 96, 7, 3, 1, 237, 18, 2, 96, 7, 3, 1, 235, 202, 2, 135, 7, 3, - 1, 235, 158, 2, 92, 7, 6, 1, 215, 189, 7, 6, 1, 233, 34, 2, 42, 96, 7, 3, - 1, 233, 34, 2, 171, 45, 235, 106, 7, 6, 1, 142, 2, 233, 193, 221, 179, 7, - 6, 1, 142, 2, 242, 189, 7, 3, 1, 142, 2, 242, 189, 7, 6, 1, 230, 158, 7, - 3, 1, 230, 158, 7, 6, 1, 230, 60, 2, 96, 7, 3, 1, 230, 60, 2, 96, 7, 1, - 217, 202, 7, 6, 1, 145, 103, 7, 3, 1, 145, 103, 7, 6, 1, 246, 133, 7, 1, - 210, 246, 134, 234, 247, 7, 3, 1, 222, 202, 2, 230, 29, 96, 7, 6, 1, 222, - 202, 2, 96, 7, 3, 1, 222, 202, 2, 96, 7, 6, 1, 222, 202, 2, 227, 164, 96, - 7, 6, 1, 105, 2, 242, 189, 7, 3, 1, 105, 2, 242, 189, 7, 6, 1, 220, 57, - 7, 6, 1, 220, 11, 2, 96, 7, 6, 1, 218, 91, 2, 96, 7, 3, 1, 218, 91, 2, - 96, 7, 6, 1, 217, 158, 2, 92, 7, 3, 1, 217, 158, 2, 92, 7, 6, 1, 246, 76, - 7, 6, 1, 246, 77, 227, 159, 7, 3, 1, 246, 77, 227, 159, 7, 3, 1, 246, 77, - 2, 222, 135, 7, 1, 124, 2, 92, 7, 6, 1, 145, 174, 7, 3, 1, 145, 174, 7, - 1, 237, 170, 244, 73, 223, 137, 2, 92, 7, 1, 218, 154, 7, 1, 249, 55, - 250, 204, 7, 1, 235, 139, 250, 204, 7, 1, 254, 141, 250, 204, 7, 1, 227, - 164, 250, 204, 7, 6, 1, 247, 76, 2, 251, 130, 7, 6, 1, 250, 47, 2, 3, 1, - 217, 158, 2, 251, 130, 7, 3, 1, 247, 76, 2, 251, 130, 7, 6, 1, 235, 21, - 7, 6, 1, 235, 202, 2, 3, 1, 237, 126, 7, 3, 1, 235, 21, 7, 6, 1, 232, 19, - 7, 6, 1, 233, 34, 2, 3, 1, 237, 126, 7, 3, 1, 232, 19, 7, 6, 1, 112, 2, - 251, 130, 7, 3, 1, 112, 2, 251, 130, 7, 6, 1, 242, 107, 2, 251, 130, 7, - 3, 1, 242, 107, 2, 251, 130, 7, 6, 1, 142, 2, 251, 130, 7, 3, 1, 142, 2, - 251, 130, 7, 6, 1, 105, 2, 251, 130, 7, 3, 1, 105, 2, 251, 130, 7, 6, 1, - 105, 2, 249, 14, 25, 234, 115, 7, 3, 1, 105, 2, 249, 14, 25, 234, 115, 7, - 6, 1, 105, 2, 249, 14, 25, 168, 7, 3, 1, 105, 2, 249, 14, 25, 168, 7, 6, - 1, 105, 2, 249, 14, 25, 251, 130, 7, 3, 1, 105, 2, 249, 14, 25, 251, 130, - 7, 6, 1, 105, 2, 249, 14, 25, 244, 36, 7, 3, 1, 105, 2, 249, 14, 25, 244, - 36, 7, 3, 1, 215, 73, 7, 6, 1, 112, 2, 249, 14, 25, 234, 115, 7, 3, 1, - 112, 2, 249, 14, 25, 234, 115, 7, 6, 1, 112, 2, 61, 71, 25, 234, 115, 7, - 3, 1, 112, 2, 61, 71, 25, 234, 115, 7, 6, 1, 254, 235, 2, 234, 115, 7, 3, - 1, 254, 235, 2, 234, 115, 7, 6, 1, 245, 68, 2, 92, 7, 3, 1, 245, 68, 2, - 92, 7, 6, 1, 245, 68, 2, 251, 130, 7, 3, 1, 245, 68, 2, 251, 130, 7, 6, - 1, 237, 18, 2, 251, 130, 7, 3, 1, 237, 18, 2, 251, 130, 7, 6, 1, 142, 2, - 230, 162, 7, 3, 1, 142, 2, 230, 162, 7, 6, 1, 142, 2, 230, 163, 25, 234, - 115, 7, 3, 1, 142, 2, 230, 163, 25, 234, 115, 7, 6, 1, 246, 77, 2, 251, - 130, 7, 3, 1, 246, 77, 2, 251, 130, 7, 3, 1, 237, 127, 2, 251, 130, 7, 6, - 1, 247, 75, 7, 6, 1, 250, 47, 2, 3, 1, 217, 157, 7, 3, 1, 247, 75, 7, 6, - 1, 245, 68, 2, 168, 7, 3, 1, 245, 68, 2, 168, 7, 6, 1, 242, 152, 7, 6, 1, - 218, 154, 7, 6, 1, 233, 34, 2, 244, 36, 7, 3, 1, 233, 34, 2, 244, 36, 7, - 6, 1, 112, 2, 227, 94, 71, 25, 168, 7, 3, 1, 112, 2, 227, 94, 71, 25, - 168, 7, 6, 1, 254, 235, 2, 168, 7, 3, 1, 254, 235, 2, 168, 7, 6, 1, 142, - 2, 214, 25, 168, 7, 3, 1, 142, 2, 214, 25, 168, 7, 6, 1, 112, 2, 51, 244, - 36, 7, 3, 1, 112, 2, 51, 244, 36, 7, 6, 1, 112, 2, 237, 170, 252, 8, 7, - 3, 1, 112, 2, 237, 170, 252, 8, 7, 6, 1, 178, 2, 51, 244, 36, 7, 3, 1, - 178, 2, 51, 244, 36, 7, 6, 1, 178, 2, 237, 170, 252, 8, 7, 3, 1, 178, 2, - 237, 170, 252, 8, 7, 6, 1, 242, 107, 2, 51, 244, 36, 7, 3, 1, 242, 107, - 2, 51, 244, 36, 7, 6, 1, 242, 107, 2, 237, 170, 252, 8, 7, 3, 1, 242, - 107, 2, 237, 170, 252, 8, 7, 6, 1, 142, 2, 51, 244, 36, 7, 3, 1, 142, 2, - 51, 244, 36, 7, 6, 1, 142, 2, 237, 170, 252, 8, 7, 3, 1, 142, 2, 237, - 170, 252, 8, 7, 6, 1, 228, 39, 2, 51, 244, 36, 7, 3, 1, 228, 39, 2, 51, - 244, 36, 7, 6, 1, 228, 39, 2, 237, 170, 252, 8, 7, 3, 1, 228, 39, 2, 237, - 170, 252, 8, 7, 6, 1, 105, 2, 51, 244, 36, 7, 3, 1, 105, 2, 51, 244, 36, - 7, 6, 1, 105, 2, 237, 170, 252, 8, 7, 3, 1, 105, 2, 237, 170, 252, 8, 7, - 6, 1, 226, 235, 2, 250, 169, 56, 7, 3, 1, 226, 235, 2, 250, 169, 56, 7, - 6, 1, 222, 202, 2, 250, 169, 56, 7, 3, 1, 222, 202, 2, 250, 169, 56, 7, - 6, 1, 217, 218, 7, 3, 1, 217, 218, 7, 6, 1, 243, 226, 2, 251, 130, 7, 3, - 1, 243, 226, 2, 251, 130, 7, 6, 1, 233, 34, 2, 171, 45, 235, 106, 7, 3, - 1, 250, 47, 2, 250, 80, 7, 6, 1, 230, 86, 7, 3, 1, 230, 86, 7, 6, 1, 217, - 158, 2, 96, 7, 3, 1, 217, 158, 2, 96, 7, 6, 1, 112, 2, 61, 50, 7, 3, 1, - 112, 2, 61, 50, 7, 6, 1, 178, 2, 251, 92, 7, 3, 1, 178, 2, 251, 92, 7, 6, - 1, 142, 2, 249, 14, 25, 234, 115, 7, 3, 1, 142, 2, 249, 14, 25, 234, 115, - 7, 6, 1, 142, 2, 221, 180, 25, 234, 115, 7, 3, 1, 142, 2, 221, 180, 25, - 234, 115, 7, 6, 1, 142, 2, 61, 50, 7, 3, 1, 142, 2, 61, 50, 7, 6, 1, 142, - 2, 61, 71, 25, 234, 115, 7, 3, 1, 142, 2, 61, 71, 25, 234, 115, 7, 6, 1, - 218, 91, 2, 234, 115, 7, 3, 1, 218, 91, 2, 234, 115, 7, 3, 1, 235, 202, - 2, 250, 80, 7, 3, 1, 233, 34, 2, 250, 80, 7, 3, 1, 222, 202, 2, 250, 80, - 7, 3, 1, 248, 144, 237, 126, 7, 3, 1, 249, 135, 248, 233, 7, 3, 1, 228, - 99, 248, 233, 7, 6, 1, 112, 2, 92, 7, 6, 1, 251, 203, 2, 92, 7, 3, 1, - 251, 203, 2, 92, 7, 6, 1, 235, 202, 2, 135, 7, 6, 1, 222, 202, 2, 249, - 11, 92, 7, 3, 1, 226, 235, 2, 223, 33, 222, 135, 7, 3, 1, 217, 158, 2, - 223, 33, 222, 135, 7, 6, 1, 244, 73, 223, 136, 7, 3, 1, 244, 73, 223, - 136, 7, 6, 1, 49, 2, 92, 7, 6, 1, 105, 135, 7, 6, 1, 215, 216, 216, 7, 6, - 1, 178, 2, 92, 7, 3, 1, 178, 2, 92, 7, 6, 1, 237, 127, 2, 92, 7, 3, 1, - 237, 127, 2, 92, 7, 6, 1, 3, 228, 164, 2, 242, 247, 222, 135, 7, 3, 1, - 228, 164, 2, 242, 247, 222, 135, 7, 6, 1, 228, 39, 2, 92, 7, 3, 1, 228, - 39, 2, 92, 7, 6, 1, 218, 91, 2, 92, 7, 3, 1, 218, 91, 2, 92, 7, 3, 1, - 215, 60, 7, 3, 1, 254, 146, 7, 3, 1, 215, 254, 146, 7, 3, 1, 49, 2, 96, - 7, 3, 1, 230, 119, 74, 7, 3, 1, 251, 203, 2, 250, 80, 7, 3, 1, 250, 47, - 2, 222, 135, 7, 3, 1, 250, 47, 2, 96, 7, 3, 1, 210, 73, 7, 3, 1, 226, - 104, 7, 3, 1, 226, 105, 2, 96, 7, 3, 1, 230, 119, 73, 7, 3, 1, 210, 230, - 119, 73, 7, 3, 1, 210, 230, 119, 178, 2, 96, 7, 3, 1, 250, 197, 210, 230, - 119, 73, 7, 3, 1, 248, 144, 237, 127, 2, 92, 7, 3, 1, 245, 68, 2, 96, 7, - 3, 1, 102, 245, 67, 7, 1, 3, 6, 245, 67, 7, 3, 1, 244, 231, 7, 3, 1, 227, - 237, 242, 189, 7, 3, 1, 215, 243, 225, 7, 3, 1, 243, 226, 2, 96, 7, 3, 1, - 243, 137, 2, 96, 7, 3, 1, 242, 107, 2, 92, 7, 3, 1, 237, 162, 7, 1, 3, 6, - 72, 7, 3, 1, 235, 202, 2, 233, 193, 221, 179, 7, 3, 1, 235, 202, 2, 252, - 116, 7, 3, 1, 235, 202, 2, 227, 164, 96, 7, 3, 1, 235, 81, 7, 3, 1, 215, - 189, 7, 3, 1, 215, 234, 187, 2, 171, 235, 106, 7, 3, 1, 234, 187, 2, 96, - 7, 3, 1, 233, 34, 2, 42, 96, 7, 3, 1, 233, 34, 2, 227, 164, 96, 7, 1, 3, - 6, 207, 7, 3, 1, 252, 196, 74, 7, 1, 3, 6, 230, 167, 7, 3, 1, 250, 197, - 230, 143, 7, 3, 1, 229, 129, 7, 3, 1, 215, 152, 7, 3, 1, 215, 228, 39, 2, - 171, 235, 106, 7, 3, 1, 215, 228, 39, 2, 96, 7, 3, 1, 228, 39, 2, 171, - 235, 106, 7, 3, 1, 228, 39, 2, 222, 135, 7, 3, 1, 228, 39, 2, 245, 173, - 7, 3, 1, 210, 228, 39, 2, 245, 173, 7, 1, 3, 6, 152, 7, 1, 3, 6, 237, - 170, 152, 7, 3, 1, 226, 235, 2, 96, 7, 3, 1, 246, 133, 7, 3, 1, 248, 144, - 237, 127, 2, 214, 25, 96, 7, 3, 1, 223, 224, 210, 246, 133, 7, 3, 1, 246, - 134, 2, 250, 80, 7, 3, 1, 215, 222, 201, 7, 3, 1, 222, 202, 2, 227, 164, - 96, 7, 3, 1, 105, 135, 7, 3, 1, 220, 57, 7, 3, 1, 220, 11, 2, 96, 7, 3, - 1, 215, 216, 216, 7, 3, 1, 215, 219, 40, 7, 3, 1, 215, 218, 90, 7, 1, 3, - 6, 218, 90, 7, 3, 1, 217, 158, 2, 227, 164, 96, 7, 3, 1, 217, 158, 2, - 250, 80, 7, 3, 1, 246, 76, 7, 3, 1, 246, 77, 2, 250, 80, 7, 1, 244, 73, - 223, 136, 7, 1, 229, 133, 219, 70, 245, 100, 7, 1, 237, 170, 244, 73, - 223, 136, 7, 1, 223, 124, 251, 202, 7, 1, 252, 74, 250, 204, 7, 1, 3, 6, - 253, 204, 7, 3, 1, 250, 197, 230, 119, 73, 7, 1, 3, 6, 245, 68, 2, 96, 7, - 1, 3, 6, 243, 225, 7, 3, 1, 237, 127, 2, 250, 97, 7, 3, 1, 215, 237, 17, - 7, 1, 3, 6, 153, 7, 3, 1, 228, 164, 2, 96, 7, 1, 244, 73, 223, 137, 2, - 92, 7, 1, 210, 244, 73, 223, 137, 2, 92, 7, 3, 1, 247, 76, 248, 233, 7, - 3, 1, 249, 37, 248, 233, 7, 3, 1, 247, 76, 248, 234, 2, 250, 80, 7, 3, 1, - 221, 57, 248, 233, 7, 3, 1, 222, 55, 248, 233, 7, 3, 1, 222, 94, 248, - 234, 2, 250, 80, 7, 3, 1, 245, 213, 248, 233, 7, 3, 1, 234, 233, 248, - 233, 7, 3, 1, 234, 188, 248, 233, 7, 1, 252, 74, 229, 168, 7, 1, 252, 81, - 229, 168, 7, 3, 1, 215, 243, 226, 2, 245, 173, 7, 3, 1, 215, 243, 226, 2, - 245, 174, 25, 222, 135, 58, 1, 3, 243, 225, 58, 1, 3, 243, 226, 2, 96, - 58, 1, 3, 237, 126, 58, 1, 3, 152, 58, 1, 3, 215, 152, 58, 1, 3, 215, - 228, 39, 2, 96, 58, 1, 3, 6, 237, 170, 152, 58, 1, 3, 219, 40, 58, 1, 3, - 218, 90, 58, 1, 228, 235, 58, 1, 51, 228, 235, 58, 1, 215, 250, 168, 58, - 1, 254, 79, 58, 1, 210, 250, 168, 58, 1, 45, 144, 227, 93, 58, 1, 42, - 144, 227, 93, 58, 1, 244, 73, 223, 136, 58, 1, 210, 244, 73, 223, 136, - 58, 1, 42, 254, 20, 58, 1, 45, 254, 20, 58, 1, 108, 254, 20, 58, 1, 113, - 254, 20, 58, 1, 250, 217, 255, 0, 251, 130, 58, 1, 69, 235, 43, 58, 1, - 234, 115, 58, 1, 254, 248, 255, 0, 58, 1, 244, 37, 255, 0, 58, 1, 109, - 69, 235, 43, 58, 1, 109, 234, 115, 58, 1, 109, 244, 37, 255, 0, 58, 1, - 109, 254, 248, 255, 0, 58, 1, 221, 87, 250, 175, 58, 1, 144, 221, 87, - 250, 175, 58, 1, 251, 83, 45, 144, 227, 93, 58, 1, 251, 83, 42, 144, 227, - 93, 58, 1, 108, 222, 143, 58, 1, 113, 222, 143, 58, 1, 88, 55, 58, 1, - 233, 155, 55, 252, 8, 61, 50, 227, 94, 50, 230, 162, 3, 221, 179, 51, - 254, 248, 255, 0, 58, 1, 227, 148, 96, 58, 1, 250, 101, 255, 0, 58, 1, 3, - 244, 231, 58, 1, 3, 153, 58, 1, 3, 198, 58, 1, 3, 218, 151, 58, 1, 3, - 210, 244, 73, 223, 136, 58, 1, 246, 85, 145, 135, 58, 1, 116, 145, 135, - 58, 1, 233, 194, 145, 135, 58, 1, 109, 145, 135, 58, 1, 246, 84, 145, - 135, 58, 1, 217, 241, 249, 52, 145, 78, 58, 1, 218, 46, 249, 52, 145, 78, - 58, 1, 219, 68, 58, 1, 220, 84, 58, 1, 51, 254, 79, 58, 1, 109, 113, 254, - 20, 58, 1, 109, 108, 254, 20, 58, 1, 109, 42, 254, 20, 58, 1, 109, 45, - 254, 20, 58, 1, 109, 227, 93, 58, 1, 233, 193, 244, 37, 255, 0, 58, 1, - 233, 193, 51, 244, 37, 255, 0, 58, 1, 233, 193, 51, 254, 248, 255, 0, 58, - 1, 109, 221, 179, 58, 1, 227, 241, 250, 175, 58, 1, 252, 131, 116, 221, - 132, 58, 1, 246, 190, 116, 221, 132, 58, 1, 252, 131, 109, 221, 132, 58, - 1, 246, 190, 109, 221, 132, 58, 1, 224, 237, 58, 1, 230, 119, 224, 237, - 58, 1, 109, 42, 65, 36, 244, 37, 255, 0, 36, 254, 248, 255, 0, 36, 250, - 217, 255, 0, 36, 221, 179, 36, 234, 115, 36, 230, 73, 36, 252, 8, 36, 61, - 50, 36, 249, 13, 36, 242, 247, 50, 36, 227, 94, 50, 36, 51, 254, 248, - 255, 0, 36, 251, 130, 36, 69, 235, 44, 50, 36, 51, 69, 235, 44, 50, 36, - 51, 244, 37, 255, 0, 36, 251, 146, 36, 237, 170, 252, 8, 36, 215, 250, - 169, 50, 36, 250, 169, 50, 36, 210, 250, 169, 50, 36, 250, 169, 71, 227, - 109, 36, 244, 37, 255, 1, 56, 36, 254, 248, 255, 1, 56, 36, 42, 222, 144, - 56, 36, 45, 222, 144, 56, 36, 42, 254, 120, 50, 36, 242, 189, 36, 42, - 144, 227, 94, 56, 36, 108, 222, 144, 56, 36, 113, 222, 144, 56, 36, 88, - 5, 56, 36, 233, 155, 5, 56, 36, 230, 27, 242, 247, 56, 36, 227, 164, 242, - 247, 56, 36, 61, 56, 36, 249, 14, 56, 36, 227, 94, 56, 36, 250, 169, 56, - 36, 251, 92, 36, 230, 162, 36, 69, 235, 44, 56, 36, 252, 4, 56, 36, 237, - 170, 51, 254, 50, 56, 36, 251, 131, 56, 36, 250, 217, 255, 1, 56, 36, - 252, 9, 56, 36, 237, 170, 252, 9, 56, 36, 221, 180, 56, 36, 234, 116, 56, - 36, 109, 235, 43, 36, 51, 109, 235, 43, 36, 221, 180, 230, 74, 36, 224, - 192, 214, 230, 74, 36, 171, 214, 230, 74, 36, 224, 192, 224, 18, 230, 74, - 36, 171, 224, 18, 230, 74, 36, 45, 144, 227, 94, 56, 36, 237, 170, 252, - 4, 56, 36, 40, 56, 36, 226, 93, 56, 36, 218, 152, 50, 36, 69, 221, 179, - 36, 51, 230, 73, 36, 244, 37, 145, 78, 36, 254, 248, 145, 78, 36, 23, - 229, 163, 36, 23, 236, 33, 36, 23, 249, 8, 221, 123, 36, 23, 217, 207, - 36, 252, 4, 50, 36, 246, 154, 5, 56, 36, 51, 69, 235, 44, 56, 36, 42, - 254, 120, 56, 36, 212, 221, 180, 50, 36, 242, 251, 50, 36, 254, 151, 114, - 199, 50, 36, 42, 45, 76, 56, 36, 220, 53, 76, 56, 36, 244, 41, 237, 54, - 36, 45, 254, 21, 50, 36, 42, 144, 227, 94, 50, 36, 245, 210, 36, 218, - 152, 56, 36, 42, 254, 21, 56, 36, 45, 254, 21, 56, 36, 45, 254, 21, 25, - 108, 254, 21, 56, 36, 45, 144, 227, 94, 50, 36, 61, 71, 227, 109, 36, - 253, 252, 56, 36, 51, 227, 94, 56, 36, 217, 33, 50, 36, 51, 252, 9, 56, - 36, 51, 252, 8, 36, 51, 234, 115, 36, 51, 234, 116, 56, 36, 51, 221, 179, - 36, 51, 237, 170, 252, 8, 36, 51, 90, 76, 56, 36, 7, 3, 1, 60, 36, 7, 3, - 1, 73, 36, 7, 3, 1, 72, 36, 7, 3, 1, 74, 36, 7, 3, 1, 68, 36, 7, 3, 1, - 251, 202, 36, 7, 3, 1, 250, 46, 36, 7, 3, 1, 243, 225, 36, 7, 3, 1, 189, - 36, 7, 3, 1, 152, 36, 7, 3, 1, 222, 201, 36, 7, 3, 1, 216, 216, 36, 7, 3, - 1, 218, 151, 23, 6, 1, 243, 127, 23, 3, 1, 243, 127, 23, 6, 1, 254, 49, - 226, 142, 23, 3, 1, 254, 49, 226, 142, 23, 231, 107, 55, 23, 234, 237, - 231, 107, 55, 23, 6, 1, 230, 15, 248, 240, 23, 3, 1, 230, 15, 248, 240, - 23, 217, 207, 23, 3, 210, 234, 218, 224, 128, 100, 23, 3, 247, 143, 234, - 218, 224, 128, 100, 23, 3, 210, 247, 143, 234, 218, 224, 128, 100, 23, - 228, 82, 78, 23, 221, 123, 23, 249, 8, 221, 123, 23, 6, 1, 254, 147, 2, - 221, 123, 23, 254, 110, 222, 73, 23, 6, 1, 246, 157, 2, 221, 123, 23, 6, - 1, 246, 122, 2, 221, 123, 23, 6, 1, 237, 163, 2, 221, 123, 23, 6, 1, 230, - 142, 2, 221, 123, 23, 6, 1, 220, 58, 2, 221, 123, 23, 6, 1, 230, 144, 2, - 221, 123, 23, 3, 1, 237, 163, 2, 249, 8, 25, 221, 123, 23, 6, 1, 254, - 146, 23, 6, 1, 252, 102, 23, 6, 1, 244, 231, 23, 6, 1, 249, 62, 23, 6, 1, - 246, 156, 23, 6, 1, 217, 83, 23, 6, 1, 246, 121, 23, 6, 1, 222, 6, 23, 6, - 1, 237, 162, 23, 6, 1, 236, 221, 23, 6, 1, 235, 156, 23, 6, 1, 233, 99, - 23, 6, 1, 231, 144, 23, 6, 1, 218, 130, 23, 6, 1, 230, 141, 23, 6, 1, - 229, 108, 23, 6, 1, 227, 149, 23, 6, 1, 224, 127, 23, 6, 1, 222, 105, 23, - 6, 1, 220, 57, 23, 6, 1, 229, 129, 23, 6, 1, 251, 31, 23, 6, 1, 228, 212, - 23, 6, 1, 230, 143, 23, 6, 1, 237, 163, 2, 249, 7, 23, 6, 1, 220, 58, 2, - 249, 7, 23, 3, 1, 254, 147, 2, 221, 123, 23, 3, 1, 246, 157, 2, 221, 123, - 23, 3, 1, 246, 122, 2, 221, 123, 23, 3, 1, 237, 163, 2, 221, 123, 23, 3, - 1, 220, 58, 2, 249, 8, 25, 221, 123, 23, 3, 1, 254, 146, 23, 3, 1, 252, - 102, 23, 3, 1, 244, 231, 23, 3, 1, 249, 62, 23, 3, 1, 246, 156, 23, 3, 1, - 217, 83, 23, 3, 1, 246, 121, 23, 3, 1, 222, 6, 23, 3, 1, 237, 162, 23, 3, - 1, 236, 221, 23, 3, 1, 235, 156, 23, 3, 1, 233, 99, 23, 3, 1, 231, 144, - 23, 3, 1, 218, 130, 23, 3, 1, 230, 141, 23, 3, 1, 229, 108, 23, 3, 1, - 227, 149, 23, 3, 1, 39, 224, 127, 23, 3, 1, 224, 127, 23, 3, 1, 222, 105, - 23, 3, 1, 220, 57, 23, 3, 1, 229, 129, 23, 3, 1, 251, 31, 23, 3, 1, 228, - 212, 23, 3, 1, 230, 143, 23, 3, 1, 237, 163, 2, 249, 7, 23, 3, 1, 220, - 58, 2, 249, 7, 23, 3, 1, 230, 142, 2, 221, 123, 23, 3, 1, 220, 58, 2, - 221, 123, 23, 3, 1, 230, 144, 2, 221, 123, 23, 6, 236, 244, 100, 23, 252, - 103, 100, 23, 222, 7, 100, 23, 220, 58, 2, 242, 247, 100, 23, 220, 58, 2, - 254, 248, 25, 242, 247, 100, 23, 220, 58, 2, 249, 14, 25, 242, 247, 100, - 23, 229, 130, 100, 23, 229, 109, 100, 23, 236, 244, 100, 23, 1, 254, 49, - 236, 37, 23, 3, 1, 254, 49, 236, 37, 23, 1, 223, 144, 23, 3, 1, 223, 144, - 23, 1, 248, 240, 23, 3, 1, 248, 240, 23, 1, 236, 37, 23, 3, 1, 236, 37, - 23, 1, 226, 142, 23, 3, 1, 226, 142, 75, 6, 1, 224, 238, 75, 3, 1, 224, - 238, 75, 6, 1, 245, 219, 75, 3, 1, 245, 219, 75, 6, 1, 236, 135, 75, 3, - 1, 236, 135, 75, 6, 1, 242, 242, 75, 3, 1, 242, 242, 75, 6, 1, 244, 226, - 75, 3, 1, 244, 226, 75, 6, 1, 224, 211, 75, 3, 1, 224, 211, 75, 6, 1, - 249, 75, 75, 3, 1, 249, 75, 23, 236, 222, 100, 23, 227, 150, 100, 23, - 234, 218, 224, 128, 100, 23, 1, 217, 212, 23, 6, 222, 7, 100, 23, 234, - 218, 246, 157, 100, 23, 210, 234, 218, 246, 157, 100, 23, 6, 1, 224, 200, - 23, 3, 1, 224, 200, 23, 6, 234, 218, 224, 128, 100, 23, 6, 1, 226, 140, - 23, 3, 1, 226, 140, 23, 227, 150, 2, 214, 100, 23, 6, 210, 234, 218, 224, - 128, 100, 23, 6, 247, 143, 234, 218, 224, 128, 100, 23, 6, 210, 247, 143, - 234, 218, 224, 128, 100, 31, 6, 1, 238, 27, 2, 244, 36, 31, 6, 1, 237, - 166, 31, 6, 1, 248, 182, 31, 6, 1, 244, 78, 31, 6, 1, 220, 99, 238, 26, - 31, 6, 1, 247, 73, 31, 6, 1, 251, 211, 72, 31, 6, 1, 217, 250, 31, 6, 1, - 237, 114, 31, 6, 1, 235, 20, 31, 6, 1, 232, 15, 31, 6, 1, 221, 46, 31, 6, - 1, 236, 76, 31, 6, 1, 242, 107, 2, 244, 36, 31, 6, 1, 224, 192, 68, 31, - 6, 1, 247, 69, 31, 6, 1, 60, 31, 6, 1, 252, 144, 31, 6, 1, 219, 165, 31, - 6, 1, 244, 116, 31, 6, 1, 249, 92, 31, 6, 1, 238, 26, 31, 6, 1, 217, 72, - 31, 6, 1, 217, 92, 31, 6, 1, 72, 31, 6, 1, 224, 192, 72, 31, 6, 1, 175, - 31, 6, 1, 246, 217, 31, 6, 1, 246, 205, 31, 6, 1, 246, 197, 31, 6, 1, 74, - 31, 6, 1, 229, 198, 31, 6, 1, 246, 148, 31, 6, 1, 246, 138, 31, 6, 1, - 222, 87, 31, 6, 1, 68, 31, 6, 1, 246, 244, 31, 6, 1, 155, 31, 6, 1, 221, - 50, 31, 6, 1, 251, 46, 31, 6, 1, 225, 25, 31, 6, 1, 224, 248, 31, 6, 1, - 243, 181, 55, 31, 6, 1, 218, 7, 31, 6, 1, 224, 21, 55, 31, 6, 1, 73, 31, - 6, 1, 217, 200, 31, 6, 1, 184, 31, 3, 1, 60, 31, 3, 1, 252, 144, 31, 3, - 1, 219, 165, 31, 3, 1, 244, 116, 31, 3, 1, 249, 92, 31, 3, 1, 238, 26, - 31, 3, 1, 217, 72, 31, 3, 1, 217, 92, 31, 3, 1, 72, 31, 3, 1, 224, 192, - 72, 31, 3, 1, 175, 31, 3, 1, 246, 217, 31, 3, 1, 246, 205, 31, 3, 1, 246, - 197, 31, 3, 1, 74, 31, 3, 1, 229, 198, 31, 3, 1, 246, 148, 31, 3, 1, 246, - 138, 31, 3, 1, 222, 87, 31, 3, 1, 68, 31, 3, 1, 246, 244, 31, 3, 1, 155, - 31, 3, 1, 221, 50, 31, 3, 1, 251, 46, 31, 3, 1, 225, 25, 31, 3, 1, 224, - 248, 31, 3, 1, 243, 181, 55, 31, 3, 1, 218, 7, 31, 3, 1, 224, 21, 55, 31, - 3, 1, 73, 31, 3, 1, 217, 200, 31, 3, 1, 184, 31, 3, 1, 238, 27, 2, 244, - 36, 31, 3, 1, 237, 166, 31, 3, 1, 248, 182, 31, 3, 1, 244, 78, 31, 3, 1, - 220, 99, 238, 26, 31, 3, 1, 247, 73, 31, 3, 1, 251, 211, 72, 31, 3, 1, - 217, 250, 31, 3, 1, 237, 114, 31, 3, 1, 235, 20, 31, 3, 1, 232, 15, 31, - 3, 1, 221, 46, 31, 3, 1, 236, 76, 31, 3, 1, 242, 107, 2, 244, 36, 31, 3, - 1, 224, 192, 68, 31, 3, 1, 247, 69, 31, 6, 1, 230, 143, 31, 3, 1, 230, - 143, 31, 6, 1, 218, 36, 31, 3, 1, 218, 36, 31, 6, 1, 237, 160, 73, 31, 3, - 1, 237, 160, 73, 31, 6, 1, 235, 25, 217, 178, 31, 3, 1, 235, 25, 217, - 178, 31, 6, 1, 237, 160, 235, 25, 217, 178, 31, 3, 1, 237, 160, 235, 25, - 217, 178, 31, 6, 1, 252, 76, 217, 178, 31, 3, 1, 252, 76, 217, 178, 31, - 6, 1, 237, 160, 252, 76, 217, 178, 31, 3, 1, 237, 160, 252, 76, 217, 178, - 31, 6, 1, 236, 11, 31, 3, 1, 236, 11, 31, 6, 1, 228, 212, 31, 3, 1, 228, - 212, 31, 6, 1, 245, 171, 31, 3, 1, 245, 171, 31, 6, 1, 237, 128, 31, 3, - 1, 237, 128, 31, 6, 1, 237, 129, 2, 51, 244, 37, 255, 0, 31, 3, 1, 237, - 129, 2, 51, 244, 37, 255, 0, 31, 6, 1, 220, 102, 31, 3, 1, 220, 102, 31, - 6, 1, 227, 57, 230, 143, 31, 3, 1, 227, 57, 230, 143, 31, 6, 1, 230, 144, - 2, 221, 160, 31, 3, 1, 230, 144, 2, 221, 160, 31, 6, 1, 230, 92, 31, 3, - 1, 230, 92, 31, 6, 1, 236, 37, 31, 3, 1, 236, 37, 31, 221, 230, 55, 36, - 31, 221, 160, 36, 31, 230, 28, 36, 31, 193, 229, 39, 36, 31, 209, 229, - 39, 36, 31, 229, 25, 36, 31, 242, 162, 221, 230, 55, 36, 31, 233, 162, - 55, 31, 6, 1, 224, 192, 242, 107, 2, 222, 135, 31, 3, 1, 224, 192, 242, - 107, 2, 222, 135, 31, 6, 1, 225, 63, 55, 31, 3, 1, 225, 63, 55, 31, 6, 1, - 246, 149, 2, 221, 202, 31, 3, 1, 246, 149, 2, 221, 202, 31, 6, 1, 244, - 117, 2, 220, 56, 31, 3, 1, 244, 117, 2, 220, 56, 31, 6, 1, 244, 117, 2, - 92, 31, 3, 1, 244, 117, 2, 92, 31, 6, 1, 244, 117, 2, 233, 193, 96, 31, - 3, 1, 244, 117, 2, 233, 193, 96, 31, 6, 1, 217, 73, 2, 249, 48, 31, 3, 1, - 217, 73, 2, 249, 48, 31, 6, 1, 217, 93, 2, 249, 48, 31, 3, 1, 217, 93, 2, - 249, 48, 31, 6, 1, 206, 2, 249, 48, 31, 3, 1, 206, 2, 249, 48, 31, 6, 1, - 206, 2, 69, 92, 31, 3, 1, 206, 2, 69, 92, 31, 6, 1, 206, 2, 92, 31, 3, 1, - 206, 2, 92, 31, 6, 1, 252, 186, 175, 31, 3, 1, 252, 186, 175, 31, 6, 1, - 246, 198, 2, 249, 48, 31, 3, 1, 246, 198, 2, 249, 48, 31, 6, 24, 246, - 198, 244, 116, 31, 3, 24, 246, 198, 244, 116, 31, 6, 1, 229, 199, 2, 233, - 193, 96, 31, 3, 1, 229, 199, 2, 233, 193, 96, 31, 6, 1, 255, 6, 155, 31, - 3, 1, 255, 6, 155, 31, 6, 1, 246, 139, 2, 249, 48, 31, 3, 1, 246, 139, 2, - 249, 48, 31, 6, 1, 222, 88, 2, 249, 48, 31, 3, 1, 222, 88, 2, 249, 48, - 31, 6, 1, 223, 130, 68, 31, 3, 1, 223, 130, 68, 31, 6, 1, 223, 130, 105, - 2, 92, 31, 3, 1, 223, 130, 105, 2, 92, 31, 6, 1, 243, 214, 2, 249, 48, - 31, 3, 1, 243, 214, 2, 249, 48, 31, 6, 24, 222, 88, 221, 50, 31, 3, 24, - 222, 88, 221, 50, 31, 6, 1, 251, 47, 2, 249, 48, 31, 3, 1, 251, 47, 2, - 249, 48, 31, 6, 1, 251, 47, 2, 69, 92, 31, 3, 1, 251, 47, 2, 69, 92, 31, - 6, 1, 224, 222, 31, 3, 1, 224, 222, 31, 6, 1, 255, 6, 251, 46, 31, 3, 1, - 255, 6, 251, 46, 31, 6, 1, 255, 6, 251, 47, 2, 249, 48, 31, 3, 1, 255, 6, - 251, 47, 2, 249, 48, 31, 1, 230, 22, 31, 6, 1, 217, 73, 2, 252, 8, 31, 3, - 1, 217, 73, 2, 252, 8, 31, 6, 1, 206, 2, 96, 31, 3, 1, 206, 2, 96, 31, 6, - 1, 246, 218, 2, 222, 135, 31, 3, 1, 246, 218, 2, 222, 135, 31, 6, 1, 246, - 198, 2, 96, 31, 3, 1, 246, 198, 2, 96, 31, 6, 1, 246, 198, 2, 222, 135, - 31, 3, 1, 246, 198, 2, 222, 135, 31, 6, 1, 236, 144, 251, 46, 31, 3, 1, - 236, 144, 251, 46, 31, 6, 1, 246, 206, 2, 222, 135, 31, 3, 1, 246, 206, - 2, 222, 135, 31, 3, 1, 230, 22, 31, 6, 1, 112, 2, 252, 8, 31, 3, 1, 112, - 2, 252, 8, 31, 6, 1, 112, 2, 249, 13, 31, 3, 1, 112, 2, 249, 13, 31, 6, - 24, 112, 238, 26, 31, 3, 24, 112, 238, 26, 31, 6, 1, 238, 27, 2, 252, 8, - 31, 3, 1, 238, 27, 2, 252, 8, 31, 6, 1, 226, 104, 31, 3, 1, 226, 104, 31, - 6, 1, 226, 105, 2, 249, 13, 31, 3, 1, 226, 105, 2, 249, 13, 31, 6, 1, - 217, 73, 2, 249, 13, 31, 3, 1, 217, 73, 2, 249, 13, 31, 6, 1, 217, 93, 2, - 249, 13, 31, 3, 1, 217, 93, 2, 249, 13, 31, 6, 1, 255, 6, 247, 73, 31, 3, - 1, 255, 6, 247, 73, 31, 6, 1, 242, 107, 2, 234, 115, 31, 3, 1, 242, 107, - 2, 234, 115, 31, 6, 1, 242, 107, 2, 249, 13, 31, 3, 1, 242, 107, 2, 249, - 13, 31, 6, 1, 142, 2, 249, 13, 31, 3, 1, 142, 2, 249, 13, 31, 6, 1, 252, - 196, 74, 31, 3, 1, 252, 196, 74, 31, 6, 1, 252, 196, 142, 2, 249, 13, 31, - 3, 1, 252, 196, 142, 2, 249, 13, 31, 6, 1, 178, 2, 249, 13, 31, 3, 1, - 178, 2, 249, 13, 31, 6, 1, 105, 2, 234, 115, 31, 3, 1, 105, 2, 234, 115, - 31, 6, 1, 105, 2, 249, 13, 31, 3, 1, 105, 2, 249, 13, 31, 6, 1, 105, 2, - 51, 168, 31, 3, 1, 105, 2, 51, 168, 31, 6, 1, 251, 47, 2, 249, 13, 31, 3, - 1, 251, 47, 2, 249, 13, 31, 6, 1, 244, 117, 2, 249, 48, 31, 3, 1, 244, - 117, 2, 249, 48, 31, 6, 1, 218, 8, 2, 249, 13, 31, 3, 1, 218, 8, 2, 249, - 13, 31, 6, 1, 244, 117, 2, 214, 25, 96, 31, 3, 1, 244, 117, 2, 214, 25, - 96, 31, 6, 1, 243, 214, 2, 96, 31, 3, 1, 243, 214, 2, 96, 31, 6, 1, 243, - 214, 2, 92, 31, 3, 1, 243, 214, 2, 92, 31, 6, 1, 236, 45, 249, 92, 31, 3, - 1, 236, 45, 249, 92, 31, 6, 1, 236, 45, 248, 182, 31, 3, 1, 236, 45, 248, - 182, 31, 6, 1, 236, 45, 217, 25, 31, 3, 1, 236, 45, 217, 25, 31, 6, 1, - 236, 45, 247, 67, 31, 3, 1, 236, 45, 247, 67, 31, 6, 1, 236, 45, 235, 20, - 31, 3, 1, 236, 45, 235, 20, 31, 6, 1, 236, 45, 232, 15, 31, 3, 1, 236, - 45, 232, 15, 31, 6, 1, 236, 45, 224, 67, 31, 3, 1, 236, 45, 224, 67, 31, - 6, 1, 236, 45, 221, 156, 31, 3, 1, 236, 45, 221, 156, 31, 6, 1, 210, 217, - 92, 31, 3, 1, 210, 217, 92, 31, 6, 1, 246, 218, 2, 96, 31, 3, 1, 246, - 218, 2, 96, 31, 6, 1, 235, 79, 31, 3, 1, 235, 79, 31, 6, 1, 227, 151, 31, - 3, 1, 227, 151, 31, 6, 1, 218, 65, 31, 3, 1, 218, 65, 31, 6, 1, 228, 155, - 31, 3, 1, 228, 155, 31, 6, 1, 218, 227, 31, 3, 1, 218, 227, 31, 6, 1, - 254, 165, 175, 31, 3, 1, 254, 165, 175, 31, 6, 1, 246, 218, 2, 233, 193, - 96, 31, 3, 1, 246, 218, 2, 233, 193, 96, 31, 6, 1, 246, 198, 2, 233, 193, - 96, 31, 3, 1, 246, 198, 2, 233, 193, 96, 31, 6, 1, 229, 199, 2, 249, 48, - 31, 3, 1, 229, 199, 2, 249, 48, 132, 6, 1, 253, 209, 132, 6, 1, 252, 114, - 132, 6, 1, 244, 93, 132, 6, 1, 249, 207, 132, 6, 1, 246, 254, 132, 6, 1, - 217, 114, 132, 6, 1, 246, 239, 132, 6, 1, 246, 123, 132, 6, 1, 101, 132, - 6, 1, 217, 72, 132, 6, 1, 237, 200, 132, 6, 1, 235, 23, 132, 6, 1, 218, - 133, 132, 6, 1, 251, 169, 132, 6, 1, 236, 168, 132, 6, 1, 243, 4, 132, 6, - 1, 237, 123, 132, 6, 1, 244, 124, 132, 6, 1, 251, 42, 132, 6, 1, 233, - 251, 132, 6, 1, 217, 250, 132, 6, 1, 231, 174, 132, 6, 1, 225, 25, 132, - 6, 1, 219, 72, 132, 6, 1, 251, 69, 132, 6, 1, 229, 187, 132, 6, 1, 237, - 100, 132, 6, 1, 203, 132, 6, 1, 226, 77, 132, 6, 1, 219, 96, 132, 6, 1, - 221, 158, 132, 6, 1, 227, 196, 132, 6, 1, 250, 182, 132, 6, 1, 217, 236, - 132, 6, 1, 229, 61, 132, 6, 1, 236, 178, 132, 6, 1, 230, 161, 132, 6, 1, - 245, 221, 132, 58, 1, 42, 144, 227, 93, 132, 254, 79, 132, 246, 201, 78, - 132, 246, 95, 78, 132, 250, 168, 132, 228, 82, 78, 132, 255, 7, 78, 132, - 3, 1, 253, 209, 132, 3, 1, 252, 114, 132, 3, 1, 244, 93, 132, 3, 1, 249, - 207, 132, 3, 1, 246, 254, 132, 3, 1, 217, 114, 132, 3, 1, 246, 239, 132, - 3, 1, 246, 123, 132, 3, 1, 101, 132, 3, 1, 217, 72, 132, 3, 1, 237, 200, - 132, 3, 1, 235, 23, 132, 3, 1, 218, 133, 132, 3, 1, 251, 169, 132, 3, 1, - 236, 168, 132, 3, 1, 243, 4, 132, 3, 1, 237, 123, 132, 3, 1, 244, 124, - 132, 3, 1, 251, 42, 132, 3, 1, 233, 251, 132, 3, 1, 217, 250, 132, 3, 1, - 231, 174, 132, 3, 1, 225, 25, 132, 3, 1, 219, 72, 132, 3, 1, 251, 69, - 132, 3, 1, 229, 187, 132, 3, 1, 237, 100, 132, 3, 1, 203, 132, 3, 1, 226, - 77, 132, 3, 1, 219, 96, 132, 3, 1, 221, 158, 132, 3, 1, 227, 196, 132, 3, - 1, 250, 182, 132, 3, 1, 217, 236, 132, 3, 1, 229, 61, 132, 3, 1, 236, - 178, 132, 3, 1, 230, 161, 132, 3, 1, 245, 221, 132, 3, 24, 246, 255, 217, - 236, 132, 245, 90, 223, 136, 132, 242, 121, 87, 255, 1, 246, 116, 87, - 255, 1, 226, 78, 87, 255, 1, 225, 12, 87, 255, 1, 217, 102, 228, 138, 87, - 255, 1, 217, 102, 244, 246, 87, 255, 1, 221, 168, 87, 255, 1, 227, 158, - 87, 255, 1, 217, 101, 87, 255, 1, 229, 219, 87, 255, 1, 218, 0, 87, 255, - 1, 222, 41, 87, 255, 1, 244, 171, 87, 255, 1, 244, 172, 233, 70, 87, 255, - 1, 244, 169, 87, 255, 1, 228, 139, 229, 242, 87, 255, 1, 222, 70, 244, - 185, 87, 255, 1, 229, 202, 87, 255, 1, 253, 239, 243, 206, 87, 255, 1, - 233, 79, 87, 255, 1, 234, 104, 87, 255, 1, 233, 245, 87, 255, 1, 233, - 246, 236, 179, 87, 255, 1, 249, 153, 87, 255, 1, 228, 150, 87, 255, 1, - 222, 70, 228, 134, 87, 255, 1, 218, 10, 252, 115, 217, 217, 87, 255, 1, - 230, 149, 87, 255, 1, 237, 241, 87, 255, 1, 249, 76, 87, 255, 1, 217, 31, - 87, 164, 234, 54, 250, 221, 87, 229, 32, 224, 224, 87, 229, 32, 243, 172, - 226, 78, 87, 229, 32, 243, 172, 229, 214, 87, 229, 32, 243, 172, 228, - 143, 87, 229, 32, 243, 94, 87, 229, 32, 221, 48, 87, 229, 32, 226, 78, - 87, 229, 32, 229, 214, 87, 229, 32, 228, 143, 87, 229, 32, 242, 254, 87, - 229, 32, 242, 255, 243, 174, 35, 219, 169, 87, 229, 32, 228, 85, 87, 229, - 32, 249, 194, 156, 234, 77, 87, 229, 32, 233, 237, 87, 228, 197, 234, 76, - 87, 229, 32, 227, 248, 87, 228, 197, 229, 220, 87, 229, 32, 224, 210, - 248, 145, 87, 229, 32, 224, 113, 248, 145, 87, 228, 197, 224, 22, 229, - 216, 87, 164, 220, 60, 248, 145, 87, 164, 234, 237, 248, 145, 87, 228, - 197, 231, 104, 243, 205, 87, 229, 32, 228, 144, 228, 138, 87, 1, 254, - 168, 87, 1, 252, 104, 87, 1, 244, 91, 87, 1, 249, 177, 87, 1, 243, 162, - 87, 1, 219, 169, 87, 1, 217, 95, 87, 1, 243, 128, 87, 1, 222, 50, 87, 1, - 217, 220, 87, 1, 39, 236, 246, 87, 1, 236, 246, 87, 1, 235, 152, 87, 1, - 39, 234, 1, 87, 1, 234, 1, 87, 1, 39, 231, 103, 87, 1, 231, 103, 87, 1, - 226, 145, 87, 1, 253, 207, 87, 1, 39, 229, 198, 87, 1, 229, 198, 87, 1, - 39, 221, 51, 87, 1, 221, 51, 87, 1, 228, 107, 87, 1, 227, 174, 87, 1, - 224, 209, 87, 1, 222, 102, 87, 24, 217, 248, 51, 219, 169, 87, 24, 217, - 248, 219, 170, 217, 220, 87, 24, 217, 248, 51, 217, 220, 87, 228, 197, - 244, 171, 87, 228, 197, 244, 169, 12, 54, 55, 12, 5, 226, 139, 12, 245, - 132, 234, 63, 12, 5, 226, 167, 254, 63, 250, 89, 227, 64, 254, 63, 245, - 110, 227, 64, 12, 227, 222, 254, 63, 229, 170, 233, 164, 55, 254, 63, - 229, 170, 222, 66, 221, 232, 55, 254, 214, 55, 12, 250, 168, 12, 249, - 141, 225, 54, 12, 229, 34, 219, 154, 55, 12, 5, 233, 147, 12, 5, 226, - 152, 254, 170, 218, 245, 12, 5, 254, 170, 254, 0, 12, 5, 227, 247, 254, - 169, 12, 5, 227, 251, 254, 155, 254, 116, 12, 5, 222, 128, 12, 3, 116, - 222, 137, 12, 3, 116, 24, 99, 2, 235, 161, 2, 218, 21, 12, 3, 116, 217, - 106, 12, 3, 245, 238, 12, 3, 249, 172, 12, 3, 236, 206, 12, 225, 67, 12, - 221, 78, 61, 228, 197, 78, 12, 228, 82, 78, 12, 1, 243, 192, 12, 1, 99, - 2, 234, 111, 50, 12, 1, 99, 2, 181, 50, 12, 1, 218, 234, 2, 181, 50, 12, - 1, 99, 2, 181, 56, 12, 1, 70, 2, 181, 50, 12, 1, 254, 168, 12, 1, 252, - 128, 12, 1, 222, 78, 234, 72, 12, 1, 222, 77, 12, 1, 222, 19, 12, 1, 237, - 112, 12, 1, 243, 202, 12, 1, 236, 146, 12, 1, 249, 183, 12, 1, 222, 29, - 12, 1, 227, 196, 12, 1, 217, 106, 12, 1, 226, 82, 12, 1, 224, 242, 12, 1, - 226, 170, 12, 1, 249, 202, 12, 1, 222, 137, 12, 1, 217, 109, 12, 1, 254, - 191, 12, 1, 244, 122, 12, 1, 236, 177, 2, 124, 188, 50, 12, 1, 236, 177, - 2, 148, 188, 56, 12, 1, 245, 241, 70, 2, 237, 170, 216, 216, 12, 1, 245, - 241, 70, 2, 124, 188, 50, 12, 1, 245, 241, 70, 2, 148, 188, 50, 12, 222, - 107, 12, 1, 245, 221, 12, 1, 228, 148, 12, 1, 236, 246, 12, 1, 235, 160, - 12, 1, 234, 14, 12, 1, 231, 193, 12, 1, 243, 146, 12, 1, 218, 233, 12, 1, - 99, 234, 92, 12, 1, 218, 21, 12, 245, 236, 12, 249, 170, 12, 236, 204, - 12, 245, 238, 12, 249, 172, 12, 236, 206, 12, 225, 16, 12, 223, 75, 12, - 234, 109, 50, 12, 181, 50, 12, 181, 56, 12, 223, 94, 254, 168, 12, 237, - 170, 249, 172, 12, 164, 231, 194, 244, 107, 12, 216, 255, 12, 29, 5, 3, - 220, 11, 50, 12, 29, 5, 237, 170, 3, 220, 11, 50, 12, 29, 5, 61, 56, 12, - 210, 249, 172, 12, 245, 239, 2, 124, 248, 143, 254, 63, 20, 217, 84, 254, - 63, 20, 107, 254, 63, 20, 103, 254, 63, 20, 160, 254, 63, 20, 154, 254, - 63, 20, 174, 254, 63, 20, 182, 254, 63, 20, 191, 254, 63, 20, 185, 254, - 63, 20, 190, 12, 229, 169, 55, 12, 249, 86, 225, 54, 12, 221, 230, 225, - 54, 12, 245, 170, 229, 30, 223, 156, 12, 1, 248, 144, 252, 128, 12, 1, - 248, 144, 228, 148, 12, 1, 223, 59, 254, 168, 12, 1, 99, 218, 246, 12, 1, - 99, 2, 218, 235, 181, 50, 12, 1, 99, 2, 218, 235, 181, 56, 12, 1, 116, - 243, 192, 12, 1, 116, 181, 254, 168, 12, 1, 116, 181, 218, 233, 12, 1, - 105, 2, 181, 50, 12, 1, 116, 181, 218, 21, 12, 1, 221, 23, 12, 1, 221, - 21, 12, 1, 252, 135, 12, 1, 222, 78, 2, 227, 93, 12, 1, 222, 78, 2, 148, - 188, 71, 247, 129, 12, 1, 229, 187, 12, 1, 222, 75, 12, 1, 252, 126, 12, - 1, 111, 2, 181, 50, 12, 1, 111, 2, 124, 188, 69, 50, 12, 1, 231, 70, 12, - 1, 247, 79, 12, 1, 111, 2, 148, 188, 50, 12, 1, 222, 91, 12, 1, 222, 89, - 12, 1, 249, 127, 12, 1, 249, 184, 2, 227, 93, 12, 1, 249, 184, 2, 61, 56, - 12, 1, 249, 184, 2, 61, 252, 118, 25, 3, 222, 137, 12, 1, 249, 189, 12, - 1, 249, 129, 12, 1, 247, 103, 12, 1, 249, 184, 2, 148, 188, 71, 247, 129, - 12, 1, 249, 184, 2, 245, 116, 188, 50, 12, 1, 227, 48, 12, 1, 227, 197, - 2, 3, 216, 216, 12, 1, 227, 197, 2, 227, 93, 12, 1, 227, 197, 2, 61, 56, - 12, 1, 227, 197, 2, 3, 220, 11, 56, 12, 1, 227, 197, 2, 61, 252, 118, 25, - 61, 50, 12, 1, 227, 197, 2, 124, 188, 50, 12, 1, 237, 109, 12, 1, 227, - 197, 2, 245, 116, 188, 50, 12, 1, 226, 83, 2, 61, 252, 118, 25, 61, 50, - 12, 1, 226, 83, 2, 148, 188, 56, 12, 1, 226, 83, 2, 148, 188, 252, 118, - 25, 148, 188, 50, 12, 1, 226, 171, 2, 124, 188, 56, 12, 1, 226, 171, 2, - 148, 188, 50, 12, 1, 222, 138, 2, 148, 188, 50, 12, 1, 254, 192, 2, 148, - 188, 50, 12, 1, 248, 144, 245, 221, 12, 1, 245, 222, 2, 61, 233, 104, 56, - 12, 1, 245, 222, 2, 61, 56, 12, 1, 219, 158, 12, 1, 245, 222, 2, 148, - 188, 56, 12, 1, 229, 185, 12, 1, 228, 149, 2, 61, 50, 12, 1, 228, 149, 2, - 148, 188, 50, 12, 1, 236, 176, 12, 1, 223, 33, 236, 246, 12, 1, 236, 247, - 2, 227, 93, 12, 1, 236, 247, 2, 61, 50, 12, 1, 232, 117, 12, 1, 236, 247, - 2, 148, 188, 56, 12, 1, 244, 243, 12, 1, 244, 244, 2, 227, 93, 12, 1, - 232, 82, 12, 1, 244, 244, 2, 124, 188, 56, 12, 1, 244, 9, 12, 1, 244, - 244, 2, 148, 188, 50, 12, 1, 235, 161, 2, 3, 216, 216, 12, 1, 235, 161, - 2, 61, 50, 12, 1, 235, 161, 2, 148, 188, 50, 12, 1, 235, 161, 2, 148, - 188, 56, 12, 1, 231, 194, 2, 61, 56, 12, 1, 231, 194, 244, 107, 12, 1, - 227, 78, 12, 1, 231, 194, 2, 227, 93, 12, 1, 231, 194, 2, 148, 188, 50, - 12, 1, 243, 147, 248, 163, 12, 1, 222, 92, 2, 61, 50, 12, 1, 243, 147, 2, - 70, 50, 12, 1, 243, 147, 244, 65, 12, 1, 243, 147, 244, 66, 2, 181, 50, - 12, 1, 222, 78, 234, 73, 244, 65, 12, 1, 218, 234, 2, 227, 93, 12, 1, - 236, 98, 230, 167, 12, 1, 230, 167, 12, 1, 68, 12, 1, 217, 200, 12, 1, - 236, 98, 217, 200, 12, 1, 218, 234, 2, 124, 188, 50, 12, 1, 219, 165, 12, - 1, 245, 241, 218, 21, 12, 1, 70, 2, 222, 135, 12, 1, 70, 2, 3, 216, 216, - 12, 1, 218, 234, 2, 61, 50, 12, 1, 73, 12, 1, 70, 2, 148, 188, 56, 12, 1, - 70, 252, 194, 12, 1, 70, 252, 195, 2, 181, 50, 12, 245, 90, 223, 136, 12, - 1, 254, 234, 12, 3, 116, 24, 226, 171, 2, 235, 161, 2, 99, 234, 92, 12, - 3, 116, 24, 228, 149, 2, 235, 161, 2, 99, 234, 92, 12, 3, 116, 62, 66, - 17, 12, 3, 116, 235, 161, 254, 168, 12, 3, 116, 237, 112, 12, 3, 116, - 148, 248, 143, 12, 3, 116, 226, 82, 12, 246, 190, 117, 253, 211, 12, 223, - 154, 117, 227, 20, 246, 218, 243, 91, 12, 3, 116, 227, 55, 217, 84, 12, - 3, 116, 220, 59, 227, 207, 217, 84, 12, 3, 116, 248, 144, 243, 160, 117, - 236, 146, 12, 3, 116, 62, 47, 17, 12, 3, 109, 226, 82, 12, 3, 116, 234, - 110, 12, 3, 218, 233, 12, 3, 218, 21, 12, 3, 116, 218, 21, 12, 3, 116, - 231, 193, 12, 229, 57, 117, 226, 159, 12, 246, 199, 251, 85, 109, 223, - 136, 12, 246, 199, 251, 85, 116, 223, 136, 12, 227, 55, 116, 223, 137, 2, - 245, 186, 251, 84, 12, 3, 109, 234, 14, 12, 1, 249, 184, 2, 237, 170, - 216, 216, 12, 1, 227, 197, 2, 237, 170, 216, 216, 246, 87, 254, 63, 20, - 217, 84, 246, 87, 254, 63, 20, 107, 246, 87, 254, 63, 20, 103, 246, 87, - 254, 63, 20, 160, 246, 87, 254, 63, 20, 154, 246, 87, 254, 63, 20, 174, - 246, 87, 254, 63, 20, 182, 246, 87, 254, 63, 20, 191, 246, 87, 254, 63, - 20, 185, 246, 87, 254, 63, 20, 190, 12, 1, 224, 243, 2, 61, 56, 12, 1, - 249, 203, 2, 61, 56, 12, 1, 244, 123, 2, 61, 56, 12, 5, 224, 112, 254, - 134, 12, 5, 224, 112, 229, 13, 233, 251, 12, 1, 243, 147, 2, 237, 170, - 216, 216, 166, 246, 190, 117, 229, 240, 166, 223, 55, 245, 90, 223, 136, - 166, 223, 96, 245, 90, 223, 136, 166, 223, 55, 250, 175, 166, 223, 96, - 250, 175, 166, 186, 250, 175, 166, 250, 176, 224, 64, 235, 115, 166, 250, - 176, 224, 64, 227, 109, 166, 223, 55, 250, 176, 224, 64, 235, 115, 166, - 223, 96, 250, 176, 224, 64, 227, 109, 166, 250, 134, 166, 243, 179, 230, - 179, 166, 243, 179, 233, 236, 166, 243, 179, 253, 253, 166, 255, 7, 78, - 166, 1, 254, 171, 166, 1, 223, 59, 254, 171, 166, 1, 252, 101, 166, 1, - 244, 235, 166, 1, 244, 236, 244, 216, 166, 1, 249, 180, 166, 1, 248, 144, - 249, 181, 227, 89, 166, 1, 243, 162, 166, 1, 218, 233, 166, 1, 217, 106, - 166, 1, 243, 126, 166, 1, 222, 46, 166, 1, 222, 47, 244, 216, 166, 1, - 217, 188, 166, 1, 217, 189, 243, 162, 166, 1, 236, 224, 166, 1, 235, 159, - 166, 1, 233, 161, 166, 1, 231, 103, 166, 1, 225, 60, 166, 1, 39, 225, 60, - 166, 1, 73, 166, 1, 229, 198, 166, 1, 210, 229, 198, 166, 1, 226, 168, - 166, 1, 228, 142, 166, 1, 227, 89, 166, 1, 224, 209, 166, 1, 222, 100, - 166, 1, 229, 159, 252, 90, 166, 1, 229, 159, 244, 120, 166, 1, 229, 159, - 249, 32, 166, 228, 203, 50, 166, 228, 203, 56, 166, 228, 203, 247, 142, - 166, 217, 15, 50, 166, 217, 15, 56, 166, 217, 15, 247, 142, 166, 227, - 219, 50, 166, 227, 219, 56, 166, 247, 143, 217, 22, 242, 241, 166, 247, - 143, 217, 22, 254, 117, 166, 243, 165, 50, 166, 243, 165, 56, 166, 243, - 164, 247, 142, 166, 246, 136, 50, 166, 246, 136, 56, 166, 226, 250, 166, - 245, 215, 248, 145, 166, 228, 63, 166, 227, 17, 166, 124, 69, 188, 50, - 166, 124, 69, 188, 56, 166, 148, 188, 50, 166, 148, 188, 56, 166, 230, - 177, 235, 44, 50, 166, 230, 177, 235, 44, 56, 166, 233, 58, 166, 252, - 193, 166, 1, 224, 19, 217, 78, 166, 1, 224, 19, 236, 139, 166, 1, 224, - 19, 245, 231, 12, 1, 252, 129, 2, 148, 188, 242, 191, 56, 12, 1, 252, - 129, 2, 61, 252, 118, 25, 148, 188, 50, 12, 1, 252, 129, 2, 148, 188, - 229, 28, 220, 53, 56, 12, 1, 252, 129, 2, 148, 188, 229, 28, 220, 53, - 252, 118, 25, 124, 188, 50, 12, 1, 252, 129, 2, 124, 188, 252, 118, 25, - 61, 50, 12, 1, 252, 129, 2, 237, 170, 3, 220, 11, 56, 12, 1, 252, 129, 2, - 3, 216, 216, 12, 1, 111, 2, 124, 188, 50, 12, 1, 111, 2, 148, 188, 229, - 28, 220, 53, 56, 12, 1, 249, 184, 2, 124, 188, 219, 102, 252, 118, 25, 3, - 222, 137, 12, 1, 249, 184, 2, 237, 170, 3, 220, 11, 56, 12, 1, 227, 197, - 2, 92, 12, 1, 226, 83, 2, 245, 116, 188, 50, 12, 1, 254, 192, 2, 124, - 188, 50, 12, 1, 254, 192, 2, 148, 188, 229, 28, 247, 130, 50, 12, 1, 254, - 192, 2, 124, 188, 219, 102, 50, 12, 1, 245, 222, 2, 124, 188, 56, 12, 1, - 245, 222, 2, 148, 188, 229, 28, 220, 53, 56, 12, 1, 236, 177, 2, 61, 50, - 12, 1, 236, 177, 2, 148, 188, 50, 12, 1, 236, 177, 2, 148, 188, 229, 28, - 220, 53, 56, 12, 1, 62, 2, 61, 50, 12, 1, 62, 2, 61, 56, 12, 1, 231, 194, - 2, 124, 188, 56, 12, 1, 231, 194, 2, 3, 222, 137, 12, 1, 231, 194, 2, 3, - 216, 216, 12, 1, 235, 161, 2, 135, 12, 1, 227, 197, 2, 124, 188, 219, - 102, 50, 12, 1, 227, 197, 2, 181, 50, 12, 1, 226, 83, 2, 124, 188, 219, - 102, 50, 12, 1, 111, 2, 3, 12, 1, 222, 138, 56, 12, 1, 111, 2, 3, 12, 1, - 222, 138, 25, 124, 248, 143, 12, 1, 226, 83, 2, 3, 12, 1, 222, 138, 25, - 124, 248, 143, 12, 1, 227, 197, 2, 3, 12, 1, 222, 138, 25, 124, 248, 143, - 12, 1, 111, 2, 3, 12, 1, 222, 138, 50, 12, 1, 99, 2, 246, 87, 254, 63, - 20, 124, 50, 12, 1, 99, 2, 246, 87, 254, 63, 20, 148, 50, 12, 1, 245, - 241, 70, 2, 246, 87, 254, 63, 20, 124, 50, 12, 1, 245, 241, 70, 2, 246, - 87, 254, 63, 20, 148, 50, 12, 1, 245, 241, 70, 2, 246, 87, 254, 63, 20, - 245, 116, 56, 12, 1, 218, 234, 2, 246, 87, 254, 63, 20, 124, 50, 12, 1, - 218, 234, 2, 246, 87, 254, 63, 20, 148, 50, 12, 1, 70, 252, 195, 2, 246, - 87, 254, 63, 20, 124, 50, 12, 1, 70, 252, 195, 2, 246, 87, 254, 63, 20, - 148, 50, 12, 1, 111, 2, 246, 87, 254, 63, 20, 245, 116, 56, 12, 1, 226, - 83, 2, 246, 87, 254, 63, 20, 245, 116, 50, 12, 1, 226, 83, 2, 237, 170, - 216, 216, 12, 1, 236, 247, 2, 124, 188, 50, 222, 32, 1, 243, 211, 222, - 32, 1, 224, 251, 222, 32, 1, 231, 192, 222, 32, 1, 228, 0, 222, 32, 1, - 252, 236, 222, 32, 1, 235, 76, 222, 32, 1, 237, 3, 222, 32, 1, 254, 160, - 222, 32, 1, 219, 187, 222, 32, 1, 234, 13, 222, 32, 1, 246, 6, 222, 32, - 1, 249, 35, 222, 32, 1, 222, 34, 222, 32, 1, 235, 185, 222, 32, 1, 244, - 252, 222, 32, 1, 244, 71, 222, 32, 1, 226, 81, 222, 32, 1, 249, 139, 222, - 32, 1, 217, 98, 222, 32, 1, 222, 101, 222, 32, 1, 218, 76, 222, 32, 1, - 229, 209, 222, 32, 1, 237, 116, 222, 32, 1, 251, 49, 222, 32, 1, 221, 28, - 222, 32, 1, 243, 120, 222, 32, 1, 236, 148, 222, 32, 1, 222, 33, 222, 32, - 1, 217, 113, 222, 32, 1, 224, 241, 222, 32, 1, 226, 174, 222, 32, 1, 249, - 205, 222, 32, 1, 101, 222, 32, 1, 217, 21, 222, 32, 1, 254, 189, 222, 32, - 1, 244, 121, 222, 32, 1, 228, 152, 222, 32, 1, 219, 5, 222, 32, 255, 8, - 222, 32, 255, 23, 222, 32, 242, 68, 222, 32, 246, 249, 222, 32, 220, 118, - 222, 32, 230, 126, 222, 32, 247, 1, 222, 32, 246, 82, 222, 32, 230, 176, - 222, 32, 230, 184, 222, 32, 223, 75, 222, 32, 1, 232, 235, 231, 242, 20, - 217, 84, 231, 242, 20, 107, 231, 242, 20, 103, 231, 242, 20, 160, 231, - 242, 20, 154, 231, 242, 20, 174, 231, 242, 20, 182, 231, 242, 20, 191, - 231, 242, 20, 185, 231, 242, 20, 190, 231, 242, 1, 60, 231, 242, 1, 246, - 250, 231, 242, 1, 72, 231, 242, 1, 73, 231, 242, 1, 68, 231, 242, 1, 230, - 127, 231, 242, 1, 74, 231, 242, 1, 249, 195, 231, 242, 1, 207, 231, 242, - 1, 252, 237, 231, 242, 1, 187, 231, 242, 1, 222, 155, 231, 242, 1, 237, - 123, 231, 242, 1, 251, 69, 231, 242, 1, 249, 207, 231, 242, 1, 203, 231, - 242, 1, 227, 52, 231, 242, 1, 226, 177, 231, 242, 1, 244, 204, 231, 242, - 1, 246, 8, 231, 242, 1, 175, 231, 242, 1, 235, 188, 231, 242, 1, 232, - 238, 218, 184, 231, 242, 1, 196, 231, 242, 1, 231, 77, 231, 242, 1, 208, - 231, 242, 1, 155, 231, 242, 1, 219, 7, 231, 242, 1, 184, 231, 242, 1, - 231, 78, 218, 184, 231, 242, 1, 237, 52, 237, 123, 231, 242, 1, 237, 52, - 251, 69, 231, 242, 1, 237, 52, 203, 231, 242, 36, 224, 192, 116, 221, - 132, 231, 242, 36, 224, 192, 109, 221, 132, 231, 242, 36, 224, 192, 227, - 88, 221, 132, 231, 242, 36, 171, 249, 47, 221, 132, 231, 242, 36, 171, - 116, 221, 132, 231, 242, 36, 171, 109, 221, 132, 231, 242, 36, 171, 227, - 88, 221, 132, 231, 242, 36, 232, 209, 78, 231, 242, 36, 51, 61, 50, 231, - 242, 116, 145, 254, 79, 231, 242, 109, 145, 254, 79, 231, 242, 16, 230, - 128, 249, 58, 231, 242, 16, 244, 203, 231, 242, 250, 168, 231, 242, 246, - 95, 78, 231, 242, 235, 166, 213, 1, 254, 173, 213, 1, 252, 60, 213, 1, - 244, 234, 213, 1, 249, 182, 213, 1, 237, 133, 213, 1, 252, 236, 213, 1, - 217, 87, 213, 1, 237, 140, 213, 1, 221, 161, 213, 1, 217, 177, 213, 1, - 237, 4, 213, 1, 235, 183, 213, 1, 233, 161, 213, 1, 231, 103, 213, 1, - 224, 110, 213, 1, 237, 223, 213, 1, 245, 203, 213, 1, 221, 53, 213, 1, - 228, 79, 213, 1, 227, 89, 213, 1, 225, 9, 213, 1, 222, 151, 213, 164, - 237, 223, 213, 164, 237, 222, 213, 164, 230, 172, 213, 164, 249, 193, - 213, 58, 1, 246, 160, 217, 177, 213, 164, 246, 160, 217, 177, 213, 29, 5, - 171, 73, 213, 29, 5, 73, 213, 29, 5, 230, 72, 255, 58, 213, 29, 5, 171, - 255, 58, 213, 29, 5, 255, 58, 213, 29, 5, 230, 72, 60, 213, 29, 5, 171, - 60, 213, 29, 5, 60, 213, 58, 1, 224, 192, 60, 213, 29, 5, 224, 192, 60, - 213, 29, 5, 171, 68, 213, 29, 5, 68, 213, 58, 1, 72, 213, 29, 5, 171, 72, - 213, 29, 5, 72, 213, 29, 5, 74, 213, 29, 5, 223, 75, 213, 164, 232, 128, - 213, 228, 197, 232, 128, 213, 228, 197, 254, 211, 213, 228, 197, 254, - 122, 213, 228, 197, 252, 181, 213, 228, 197, 253, 240, 213, 228, 197, - 224, 201, 213, 255, 7, 78, 213, 228, 197, 234, 4, 228, 113, 213, 228, - 197, 217, 29, 213, 228, 197, 228, 113, 213, 228, 197, 217, 112, 213, 228, - 197, 220, 233, 213, 228, 197, 254, 36, 213, 228, 197, 224, 22, 234, 55, - 213, 228, 197, 254, 113, 80, 5, 237, 170, 251, 146, 80, 5, 251, 146, 80, - 5, 254, 95, 80, 5, 219, 77, 80, 1, 224, 192, 60, 80, 1, 60, 80, 1, 255, - 58, 80, 1, 72, 80, 1, 237, 255, 80, 1, 68, 80, 1, 220, 23, 80, 1, 167, - 152, 80, 1, 167, 153, 80, 1, 251, 149, 73, 80, 1, 224, 192, 73, 80, 1, - 73, 80, 1, 254, 196, 80, 1, 251, 149, 74, 80, 1, 224, 192, 74, 80, 1, 74, - 80, 1, 253, 232, 80, 1, 175, 80, 1, 236, 149, 80, 1, 245, 0, 80, 1, 244, - 125, 80, 1, 232, 115, 80, 1, 251, 169, 80, 1, 251, 69, 80, 1, 237, 123, - 80, 1, 237, 103, 80, 1, 231, 77, 80, 1, 221, 29, 80, 1, 221, 19, 80, 1, - 249, 132, 80, 1, 249, 116, 80, 1, 231, 217, 80, 1, 222, 155, 80, 1, 222, - 35, 80, 1, 249, 207, 80, 1, 249, 36, 80, 1, 208, 80, 1, 231, 208, 80, 1, - 187, 80, 1, 229, 141, 80, 1, 252, 237, 80, 1, 252, 94, 80, 1, 196, 80, 1, - 184, 80, 1, 203, 80, 1, 227, 52, 80, 1, 235, 188, 80, 1, 235, 17, 80, 1, - 235, 16, 80, 1, 219, 189, 80, 1, 225, 25, 80, 1, 223, 218, 80, 1, 226, - 177, 80, 1, 155, 80, 5, 231, 112, 80, 5, 253, 219, 80, 29, 5, 255, 58, - 80, 29, 5, 72, 80, 29, 5, 237, 255, 80, 29, 5, 68, 80, 29, 5, 220, 23, - 80, 29, 5, 167, 152, 80, 29, 5, 167, 227, 53, 80, 29, 5, 251, 149, 73, - 80, 29, 5, 224, 192, 73, 80, 29, 5, 73, 80, 29, 5, 254, 196, 80, 29, 5, - 251, 149, 74, 80, 29, 5, 224, 192, 74, 80, 29, 5, 74, 80, 29, 5, 253, - 232, 80, 5, 219, 82, 80, 29, 5, 228, 232, 73, 80, 230, 146, 80, 223, 125, - 5, 220, 112, 80, 223, 125, 5, 254, 97, 80, 244, 37, 255, 0, 80, 254, 248, - 255, 0, 80, 29, 5, 251, 149, 171, 73, 80, 1, 228, 155, 80, 1, 236, 133, - 80, 1, 244, 114, 80, 1, 217, 114, 80, 1, 249, 121, 80, 1, 227, 151, 80, - 1, 246, 8, 80, 1, 217, 165, 80, 1, 167, 227, 53, 80, 1, 167, 235, 18, 80, - 29, 5, 167, 153, 80, 29, 5, 167, 235, 18, 80, 249, 167, 80, 51, 249, 167, - 80, 20, 217, 84, 80, 20, 107, 80, 20, 103, 80, 20, 160, 80, 20, 154, 80, - 20, 174, 80, 20, 182, 80, 20, 191, 80, 20, 185, 80, 20, 190, 80, 255, 7, - 55, 80, 5, 116, 223, 253, 248, 145, 80, 1, 251, 149, 60, 80, 1, 217, 80, - 80, 1, 106, 184, 80, 1, 244, 160, 80, 1, 237, 87, 80, 1, 244, 73, 223, - 136, 80, 1, 249, 122, 80, 1, 252, 178, 130, 5, 251, 146, 130, 5, 254, 95, - 130, 5, 219, 77, 130, 1, 60, 130, 1, 255, 58, 130, 1, 72, 130, 1, 237, - 255, 130, 1, 68, 130, 1, 220, 23, 130, 1, 167, 152, 130, 1, 167, 153, - 130, 1, 73, 130, 1, 254, 196, 130, 1, 74, 130, 1, 253, 232, 130, 1, 175, - 130, 1, 236, 149, 130, 1, 245, 0, 130, 1, 244, 125, 130, 1, 232, 115, - 130, 1, 251, 169, 130, 1, 251, 69, 130, 1, 237, 123, 130, 1, 237, 103, - 130, 1, 231, 77, 130, 1, 221, 29, 130, 1, 221, 19, 130, 1, 249, 132, 130, - 1, 249, 116, 130, 1, 231, 217, 130, 1, 222, 155, 130, 1, 222, 35, 130, 1, - 249, 207, 130, 1, 249, 36, 130, 1, 208, 130, 1, 187, 130, 1, 229, 141, - 130, 1, 252, 237, 130, 1, 252, 94, 130, 1, 196, 130, 1, 184, 130, 1, 203, - 130, 1, 235, 188, 130, 1, 225, 25, 130, 1, 223, 218, 130, 1, 226, 177, - 130, 1, 155, 130, 5, 231, 112, 130, 5, 253, 219, 130, 29, 5, 255, 58, - 130, 29, 5, 72, 130, 29, 5, 237, 255, 130, 29, 5, 68, 130, 29, 5, 220, - 23, 130, 29, 5, 167, 152, 130, 29, 5, 167, 227, 53, 130, 29, 5, 73, 130, - 29, 5, 254, 196, 130, 29, 5, 74, 130, 29, 5, 253, 232, 130, 5, 219, 82, - 130, 1, 236, 141, 222, 155, 130, 253, 233, 235, 94, 78, 130, 1, 227, 52, - 130, 1, 227, 151, 130, 1, 217, 165, 130, 1, 167, 227, 53, 130, 1, 167, - 235, 18, 130, 29, 5, 167, 153, 130, 29, 5, 167, 235, 18, 130, 20, 217, - 84, 130, 20, 107, 130, 20, 103, 130, 20, 160, 130, 20, 154, 130, 20, 174, - 130, 20, 182, 130, 20, 191, 130, 20, 185, 130, 20, 190, 130, 1, 228, 3, - 2, 233, 193, 249, 10, 130, 1, 228, 3, 2, 234, 237, 249, 10, 130, 227, 4, - 78, 130, 227, 4, 55, 130, 250, 78, 231, 106, 107, 130, 250, 78, 231, 106, - 103, 130, 250, 78, 231, 106, 160, 130, 250, 78, 231, 106, 154, 130, 250, - 78, 231, 106, 131, 235, 88, 222, 28, 222, 23, 249, 56, 130, 250, 78, 249, - 57, 224, 77, 130, 237, 141, 130, 244, 227, 78, 163, 5, 254, 243, 252, 72, - 163, 5, 252, 72, 163, 5, 219, 77, 163, 1, 60, 163, 1, 255, 58, 163, 1, - 72, 163, 1, 237, 255, 163, 1, 68, 163, 1, 220, 23, 163, 1, 246, 250, 163, - 1, 254, 196, 163, 1, 230, 127, 163, 1, 253, 232, 163, 1, 175, 163, 1, - 236, 149, 163, 1, 245, 0, 163, 1, 244, 125, 163, 1, 232, 115, 163, 1, - 251, 169, 163, 1, 251, 69, 163, 1, 237, 123, 163, 1, 237, 103, 163, 1, - 231, 77, 163, 1, 221, 29, 163, 1, 221, 19, 163, 1, 249, 132, 163, 1, 249, - 116, 163, 1, 231, 217, 163, 1, 222, 155, 163, 1, 222, 35, 163, 1, 249, - 207, 163, 1, 249, 36, 163, 1, 208, 163, 1, 187, 163, 1, 229, 141, 163, 1, - 252, 237, 163, 1, 252, 94, 163, 1, 196, 163, 1, 184, 163, 1, 203, 163, 1, - 235, 188, 163, 1, 235, 17, 163, 1, 219, 189, 163, 1, 225, 25, 163, 1, - 226, 177, 163, 1, 155, 163, 5, 231, 112, 163, 29, 5, 255, 58, 163, 29, 5, - 72, 163, 29, 5, 237, 255, 163, 29, 5, 68, 163, 29, 5, 220, 23, 163, 29, - 5, 246, 250, 163, 29, 5, 254, 196, 163, 29, 5, 230, 127, 163, 29, 5, 253, - 232, 163, 5, 219, 82, 163, 5, 220, 114, 163, 1, 236, 133, 163, 1, 244, - 114, 163, 1, 217, 114, 163, 1, 227, 52, 163, 1, 246, 8, 163, 20, 217, 84, - 163, 20, 107, 163, 20, 103, 163, 20, 160, 163, 20, 154, 163, 20, 174, - 163, 20, 182, 163, 20, 191, 163, 20, 185, 163, 20, 190, 163, 221, 167, - 163, 254, 242, 163, 237, 155, 163, 220, 46, 163, 246, 224, 230, 132, 163, - 5, 218, 54, 150, 5, 251, 146, 150, 5, 254, 95, 150, 5, 219, 77, 150, 1, - 60, 150, 1, 255, 58, 150, 1, 72, 150, 1, 237, 255, 150, 1, 68, 150, 1, - 220, 23, 150, 1, 167, 152, 150, 1, 167, 153, 150, 29, 251, 149, 73, 150, - 1, 73, 150, 1, 254, 196, 150, 29, 251, 149, 74, 150, 1, 74, 150, 1, 253, - 232, 150, 1, 175, 150, 1, 236, 149, 150, 1, 245, 0, 150, 1, 244, 125, - 150, 1, 232, 115, 150, 1, 251, 169, 150, 1, 251, 69, 150, 1, 237, 123, - 150, 1, 237, 103, 150, 1, 231, 77, 150, 1, 221, 29, 150, 1, 221, 19, 150, - 1, 249, 132, 150, 1, 249, 116, 150, 1, 231, 217, 150, 1, 222, 155, 150, - 1, 222, 35, 150, 1, 249, 207, 150, 1, 249, 36, 150, 1, 208, 150, 1, 187, - 150, 1, 229, 141, 150, 1, 252, 237, 150, 1, 252, 94, 150, 1, 196, 150, 1, - 184, 150, 1, 203, 150, 1, 235, 188, 150, 1, 235, 17, 150, 1, 219, 189, - 150, 1, 225, 25, 150, 1, 223, 218, 150, 1, 226, 177, 150, 1, 155, 150, 5, - 231, 112, 150, 5, 253, 219, 150, 29, 5, 255, 58, 150, 29, 5, 72, 150, 29, - 5, 237, 255, 150, 29, 5, 68, 150, 29, 5, 220, 23, 150, 29, 5, 167, 152, - 150, 29, 5, 167, 227, 53, 150, 29, 5, 251, 149, 73, 150, 29, 5, 73, 150, - 29, 5, 254, 196, 150, 29, 5, 251, 149, 74, 150, 29, 5, 74, 150, 29, 5, - 253, 232, 150, 5, 219, 82, 150, 230, 146, 150, 1, 167, 227, 53, 150, 1, - 167, 235, 18, 150, 29, 5, 167, 153, 150, 29, 5, 167, 235, 18, 150, 20, - 217, 84, 150, 20, 107, 150, 20, 103, 150, 20, 160, 150, 20, 154, 150, 20, - 174, 150, 20, 182, 150, 20, 191, 150, 20, 185, 150, 20, 190, 150, 227, 4, - 55, 147, 5, 251, 146, 147, 5, 254, 95, 147, 5, 219, 77, 147, 1, 60, 147, - 1, 255, 58, 147, 1, 72, 147, 1, 237, 255, 147, 1, 68, 147, 1, 220, 23, - 147, 1, 167, 152, 147, 1, 167, 153, 147, 1, 73, 147, 1, 254, 196, 147, 1, - 74, 147, 1, 253, 232, 147, 1, 175, 147, 1, 236, 149, 147, 1, 245, 0, 147, - 1, 244, 125, 147, 1, 232, 115, 147, 1, 251, 169, 147, 1, 251, 69, 147, 1, - 237, 123, 147, 1, 237, 103, 147, 1, 231, 77, 147, 1, 221, 29, 147, 1, - 221, 19, 147, 1, 249, 132, 147, 1, 249, 116, 147, 1, 231, 217, 147, 1, - 222, 155, 147, 1, 222, 35, 147, 1, 249, 207, 147, 1, 249, 36, 147, 1, - 208, 147, 1, 187, 147, 1, 229, 141, 147, 1, 252, 237, 147, 1, 252, 94, - 147, 1, 196, 147, 1, 184, 147, 1, 203, 147, 1, 235, 188, 147, 1, 235, 17, - 147, 1, 219, 189, 147, 1, 225, 25, 147, 1, 223, 218, 147, 1, 226, 177, - 147, 1, 155, 147, 5, 231, 112, 147, 5, 253, 219, 147, 29, 5, 255, 58, - 147, 29, 5, 72, 147, 29, 5, 237, 255, 147, 29, 5, 68, 147, 29, 5, 220, - 23, 147, 29, 5, 167, 152, 147, 29, 5, 167, 227, 53, 147, 29, 5, 73, 147, - 29, 5, 254, 196, 147, 29, 5, 74, 147, 29, 5, 253, 232, 147, 5, 219, 82, - 147, 254, 197, 235, 94, 78, 147, 253, 233, 235, 94, 78, 147, 1, 227, 52, - 147, 1, 227, 151, 147, 1, 217, 165, 147, 1, 167, 227, 53, 147, 1, 167, - 235, 18, 147, 29, 5, 167, 153, 147, 29, 5, 167, 235, 18, 147, 20, 217, - 84, 147, 20, 107, 147, 20, 103, 147, 20, 160, 147, 20, 154, 147, 20, 174, - 147, 20, 182, 147, 20, 191, 147, 20, 185, 147, 20, 190, 147, 237, 141, - 147, 1, 219, 7, 176, 5, 254, 95, 176, 5, 219, 77, 176, 1, 60, 176, 1, - 255, 58, 176, 1, 72, 176, 1, 237, 255, 176, 1, 68, 176, 1, 220, 23, 176, - 1, 73, 176, 1, 246, 250, 176, 1, 254, 196, 176, 1, 74, 176, 1, 230, 127, - 176, 1, 253, 232, 176, 1, 175, 176, 1, 232, 115, 176, 1, 251, 169, 176, - 1, 237, 123, 176, 1, 231, 77, 176, 1, 221, 29, 176, 1, 231, 217, 176, 1, - 222, 155, 176, 1, 208, 176, 1, 231, 208, 176, 1, 187, 176, 1, 196, 176, - 1, 184, 176, 1, 203, 176, 1, 227, 52, 176, 1, 235, 188, 176, 1, 235, 17, - 176, 1, 235, 16, 176, 1, 219, 189, 176, 1, 225, 25, 176, 1, 223, 218, - 176, 1, 226, 177, 176, 1, 155, 176, 29, 5, 255, 58, 176, 29, 5, 72, 176, - 29, 5, 237, 255, 176, 29, 5, 68, 176, 29, 5, 220, 23, 176, 29, 5, 73, - 176, 29, 5, 246, 250, 176, 29, 5, 254, 196, 176, 29, 5, 74, 176, 29, 5, - 230, 127, 176, 29, 5, 253, 232, 176, 5, 219, 82, 176, 230, 146, 176, 253, - 233, 235, 94, 78, 176, 20, 217, 84, 176, 20, 107, 176, 20, 103, 176, 20, - 160, 176, 20, 154, 176, 20, 174, 176, 20, 182, 176, 20, 191, 176, 20, - 185, 176, 20, 190, 176, 54, 222, 65, 176, 54, 131, 242, 161, 176, 54, - 131, 221, 231, 176, 249, 137, 55, 176, 233, 121, 55, 176, 218, 23, 55, - 176, 249, 89, 55, 176, 250, 107, 55, 176, 254, 14, 71, 55, 176, 227, 4, - 55, 176, 54, 55, 129, 5, 251, 146, 129, 5, 254, 95, 129, 5, 219, 77, 129, - 1, 60, 129, 1, 255, 58, 129, 1, 72, 129, 1, 237, 255, 129, 1, 68, 129, 1, - 220, 23, 129, 1, 167, 152, 129, 1, 167, 153, 129, 1, 73, 129, 1, 246, - 250, 129, 1, 254, 196, 129, 1, 74, 129, 1, 230, 127, 129, 1, 253, 232, - 129, 1, 175, 129, 1, 236, 149, 129, 1, 245, 0, 129, 1, 244, 125, 129, 1, - 232, 115, 129, 1, 251, 169, 129, 1, 251, 69, 129, 1, 237, 123, 129, 1, - 237, 103, 129, 1, 231, 77, 129, 1, 221, 29, 129, 1, 221, 19, 129, 1, 249, - 132, 129, 1, 249, 116, 129, 1, 231, 217, 129, 1, 222, 155, 129, 1, 222, - 35, 129, 1, 249, 207, 129, 1, 249, 36, 129, 1, 208, 129, 1, 187, 129, 1, - 229, 141, 129, 1, 252, 237, 129, 1, 252, 94, 129, 1, 196, 129, 1, 184, - 129, 1, 203, 129, 1, 227, 52, 129, 1, 235, 188, 129, 1, 235, 17, 129, 1, - 219, 189, 129, 1, 225, 25, 129, 1, 223, 218, 129, 1, 226, 177, 129, 1, - 155, 129, 5, 253, 219, 129, 29, 5, 255, 58, 129, 29, 5, 72, 129, 29, 5, - 237, 255, 129, 29, 5, 68, 129, 29, 5, 220, 23, 129, 29, 5, 167, 152, 129, - 29, 5, 167, 227, 53, 129, 29, 5, 73, 129, 29, 5, 246, 250, 129, 29, 5, - 254, 196, 129, 29, 5, 74, 129, 29, 5, 230, 127, 129, 29, 5, 253, 232, - 129, 5, 219, 82, 129, 235, 94, 78, 129, 254, 197, 235, 94, 78, 129, 1, - 221, 55, 129, 1, 247, 74, 129, 1, 167, 227, 53, 129, 1, 167, 235, 18, - 129, 29, 5, 167, 153, 129, 29, 5, 167, 235, 18, 129, 20, 217, 84, 129, - 20, 107, 129, 20, 103, 129, 20, 160, 129, 20, 154, 129, 20, 174, 129, 20, - 182, 129, 20, 191, 129, 20, 185, 129, 20, 190, 129, 245, 108, 20, 217, - 85, 35, 230, 169, 229, 9, 117, 154, 129, 245, 108, 20, 131, 35, 230, 169, - 229, 9, 117, 154, 129, 245, 108, 20, 124, 35, 230, 169, 229, 9, 117, 154, - 129, 245, 108, 20, 148, 35, 230, 169, 229, 9, 117, 154, 129, 245, 108, - 20, 131, 35, 246, 104, 229, 9, 117, 154, 129, 245, 108, 20, 124, 35, 246, - 104, 229, 9, 117, 154, 129, 245, 108, 20, 148, 35, 246, 104, 229, 9, 117, - 154, 129, 5, 220, 229, 141, 5, 254, 95, 141, 5, 219, 77, 141, 1, 60, 141, - 1, 255, 58, 141, 1, 72, 141, 1, 237, 255, 141, 1, 68, 141, 1, 220, 23, - 141, 1, 167, 152, 141, 1, 167, 153, 141, 1, 73, 141, 1, 246, 250, 141, 1, - 254, 196, 141, 1, 74, 141, 1, 230, 127, 141, 1, 253, 232, 141, 1, 175, - 141, 1, 236, 149, 141, 1, 245, 0, 141, 1, 244, 125, 141, 1, 232, 115, - 141, 1, 251, 169, 141, 1, 251, 69, 141, 1, 237, 123, 141, 1, 237, 103, - 141, 1, 231, 77, 141, 1, 221, 29, 141, 1, 221, 19, 141, 1, 249, 132, 141, - 1, 249, 116, 141, 1, 231, 217, 141, 1, 222, 155, 141, 1, 222, 35, 141, 1, - 249, 207, 141, 1, 249, 36, 141, 1, 208, 141, 1, 187, 141, 1, 229, 141, - 141, 1, 252, 237, 141, 1, 252, 94, 141, 1, 196, 141, 1, 184, 141, 1, 203, - 141, 1, 227, 52, 141, 1, 235, 188, 141, 1, 235, 17, 141, 1, 219, 189, - 141, 1, 225, 25, 141, 1, 223, 218, 141, 1, 226, 177, 141, 1, 155, 141, 5, - 231, 112, 141, 5, 253, 219, 141, 29, 5, 255, 58, 141, 29, 5, 72, 141, 29, - 5, 237, 255, 141, 29, 5, 68, 141, 29, 5, 220, 23, 141, 29, 5, 167, 152, - 141, 29, 5, 167, 227, 53, 141, 29, 5, 73, 141, 29, 5, 246, 250, 141, 29, - 5, 254, 196, 141, 29, 5, 74, 141, 29, 5, 230, 127, 141, 29, 5, 253, 232, - 141, 5, 219, 82, 141, 235, 94, 78, 141, 254, 197, 235, 94, 78, 141, 1, - 246, 8, 141, 1, 167, 227, 53, 141, 1, 167, 235, 18, 141, 29, 5, 167, 153, - 141, 29, 5, 167, 235, 18, 141, 20, 217, 84, 141, 20, 107, 141, 20, 103, - 141, 20, 160, 141, 20, 154, 141, 20, 174, 141, 20, 182, 141, 20, 191, - 141, 20, 185, 141, 20, 190, 141, 5, 237, 92, 141, 5, 220, 61, 123, 5, - 254, 95, 123, 5, 219, 77, 123, 1, 60, 123, 1, 255, 58, 123, 1, 72, 123, - 1, 237, 255, 123, 1, 68, 123, 1, 220, 23, 123, 1, 167, 152, 123, 1, 167, - 153, 123, 1, 73, 123, 1, 246, 250, 123, 1, 254, 196, 123, 1, 74, 123, 1, - 230, 127, 123, 1, 253, 232, 123, 1, 175, 123, 1, 236, 149, 123, 1, 245, - 0, 123, 1, 244, 125, 123, 1, 232, 115, 123, 1, 251, 169, 123, 1, 251, 69, - 123, 1, 237, 123, 123, 1, 237, 103, 123, 1, 231, 77, 123, 1, 221, 29, - 123, 1, 221, 19, 123, 1, 249, 132, 123, 1, 249, 116, 123, 1, 231, 217, - 123, 1, 222, 155, 123, 1, 222, 35, 123, 1, 249, 207, 123, 1, 249, 36, - 123, 1, 208, 123, 1, 187, 123, 1, 229, 141, 123, 1, 252, 237, 123, 1, - 252, 94, 123, 1, 196, 123, 1, 184, 123, 1, 203, 123, 1, 227, 52, 123, 1, - 235, 188, 123, 1, 235, 17, 123, 1, 235, 16, 123, 1, 219, 189, 123, 1, - 225, 25, 123, 1, 223, 218, 123, 1, 226, 177, 123, 1, 155, 123, 5, 253, - 219, 123, 29, 5, 255, 58, 123, 29, 5, 72, 123, 29, 5, 237, 255, 123, 29, - 5, 68, 123, 29, 5, 220, 23, 123, 29, 5, 167, 152, 123, 29, 5, 167, 227, - 53, 123, 29, 5, 73, 123, 29, 5, 246, 250, 123, 29, 5, 254, 196, 123, 29, - 5, 74, 123, 29, 5, 230, 127, 123, 29, 5, 253, 232, 123, 5, 219, 82, 123, - 253, 233, 235, 94, 78, 123, 1, 167, 227, 53, 123, 1, 167, 235, 18, 123, - 29, 5, 167, 153, 123, 29, 5, 167, 235, 18, 123, 20, 217, 84, 123, 20, - 107, 123, 20, 103, 123, 20, 160, 123, 20, 154, 123, 20, 174, 123, 20, - 182, 123, 20, 191, 123, 20, 185, 123, 20, 190, 123, 54, 222, 65, 123, 54, - 131, 242, 161, 123, 54, 131, 221, 231, 123, 245, 108, 131, 228, 89, 123, - 245, 108, 131, 243, 194, 123, 245, 108, 148, 228, 87, 123, 249, 141, 78, - 123, 1, 251, 23, 231, 218, 123, 1, 251, 23, 207, 123, 1, 251, 23, 227, - 53, 123, 1, 251, 23, 153, 123, 1, 251, 23, 235, 18, 123, 1, 251, 23, 237, - 17, 162, 5, 254, 94, 162, 5, 219, 76, 162, 1, 253, 210, 162, 1, 255, 13, - 162, 1, 254, 215, 162, 1, 254, 229, 162, 1, 237, 132, 162, 1, 237, 254, - 162, 1, 220, 15, 162, 1, 220, 17, 162, 1, 237, 153, 162, 1, 237, 154, - 162, 1, 237, 240, 162, 1, 237, 242, 162, 1, 246, 83, 162, 1, 246, 246, - 162, 1, 254, 184, 162, 1, 230, 62, 162, 1, 230, 122, 162, 1, 253, 222, - 162, 1, 254, 149, 236, 189, 162, 1, 234, 105, 236, 189, 162, 1, 254, 149, - 244, 207, 162, 1, 234, 105, 244, 207, 162, 1, 236, 228, 232, 232, 162, 1, - 226, 135, 244, 207, 162, 1, 254, 149, 251, 117, 162, 1, 234, 105, 251, - 117, 162, 1, 254, 149, 237, 115, 162, 1, 234, 105, 237, 115, 162, 1, 222, - 149, 232, 232, 162, 1, 222, 149, 226, 134, 232, 233, 162, 1, 226, 135, - 237, 115, 162, 1, 254, 149, 221, 27, 162, 1, 234, 105, 221, 27, 162, 1, - 254, 149, 249, 123, 162, 1, 234, 105, 249, 123, 162, 1, 233, 56, 232, - 198, 162, 1, 226, 135, 249, 123, 162, 1, 254, 149, 222, 95, 162, 1, 234, - 105, 222, 95, 162, 1, 254, 149, 249, 136, 162, 1, 234, 105, 249, 136, - 162, 1, 249, 164, 232, 198, 162, 1, 226, 135, 249, 136, 162, 1, 254, 149, - 229, 204, 162, 1, 234, 105, 229, 204, 162, 1, 254, 149, 252, 179, 162, 1, - 234, 105, 252, 179, 162, 1, 234, 44, 162, 1, 254, 136, 252, 179, 162, 1, - 218, 29, 162, 1, 227, 221, 162, 1, 249, 164, 235, 131, 162, 1, 219, 167, - 162, 1, 222, 149, 226, 117, 162, 1, 233, 56, 226, 117, 162, 1, 249, 164, - 226, 117, 162, 1, 243, 166, 162, 1, 233, 56, 235, 131, 162, 1, 245, 233, - 162, 5, 254, 174, 162, 29, 5, 254, 224, 162, 29, 5, 236, 158, 254, 231, - 162, 29, 5, 248, 241, 254, 231, 162, 29, 5, 236, 158, 237, 150, 162, 29, - 5, 248, 241, 237, 150, 162, 29, 5, 236, 158, 230, 42, 162, 29, 5, 248, - 241, 230, 42, 162, 29, 5, 244, 245, 162, 29, 5, 236, 46, 162, 29, 5, 248, - 241, 236, 46, 162, 29, 5, 236, 48, 249, 73, 162, 29, 5, 236, 47, 243, - 212, 254, 224, 162, 29, 5, 236, 47, 243, 212, 248, 241, 254, 224, 162, - 29, 5, 236, 47, 243, 212, 244, 206, 162, 29, 5, 244, 206, 162, 29, 5, - 248, 241, 244, 245, 162, 29, 5, 248, 241, 244, 206, 162, 228, 197, 235, - 254, 140, 126, 236, 58, 236, 243, 140, 126, 236, 126, 236, 145, 140, 126, - 236, 126, 236, 119, 140, 126, 236, 126, 236, 116, 140, 126, 236, 126, - 236, 123, 140, 126, 236, 126, 227, 240, 140, 126, 232, 85, 232, 74, 140, - 126, 251, 12, 251, 60, 140, 126, 251, 12, 251, 20, 140, 126, 251, 12, - 251, 59, 140, 126, 224, 27, 224, 26, 140, 126, 251, 12, 251, 9, 140, 126, - 217, 232, 217, 239, 140, 126, 248, 168, 251, 66, 140, 126, 199, 229, 213, - 140, 126, 221, 240, 222, 27, 140, 126, 221, 240, 232, 215, 140, 126, 221, - 240, 229, 111, 140, 126, 231, 205, 232, 134, 140, 126, 248, 168, 249, 74, - 140, 126, 199, 222, 116, 140, 126, 221, 240, 221, 219, 140, 126, 221, - 240, 222, 31, 140, 126, 221, 240, 221, 237, 140, 126, 231, 205, 231, 144, - 140, 126, 252, 42, 252, 220, 140, 126, 229, 38, 229, 58, 140, 126, 229, - 119, 229, 113, 140, 126, 245, 140, 246, 8, 140, 126, 229, 119, 229, 135, - 140, 126, 245, 140, 245, 245, 140, 126, 229, 119, 226, 143, 140, 126, - 233, 137, 196, 140, 126, 217, 232, 218, 55, 140, 126, 227, 76, 227, 21, - 140, 126, 227, 22, 140, 126, 235, 13, 235, 36, 140, 126, 234, 231, 140, - 126, 218, 188, 219, 3, 140, 126, 224, 27, 226, 155, 140, 126, 224, 27, - 227, 0, 140, 126, 224, 27, 223, 102, 140, 126, 243, 5, 243, 95, 140, 126, - 235, 13, 250, 252, 140, 126, 142, 254, 123, 140, 126, 243, 5, 231, 200, - 140, 126, 230, 30, 140, 126, 226, 130, 60, 140, 126, 234, 100, 243, 190, - 140, 126, 226, 130, 255, 58, 140, 126, 226, 130, 254, 140, 140, 126, 226, - 130, 72, 140, 126, 226, 130, 237, 255, 140, 126, 226, 130, 220, 110, 140, - 126, 226, 130, 220, 108, 140, 126, 226, 130, 68, 140, 126, 226, 130, 220, - 23, 140, 126, 229, 121, 140, 250, 78, 16, 252, 221, 140, 126, 226, 130, - 73, 140, 126, 226, 130, 254, 234, 140, 126, 226, 130, 74, 140, 126, 226, - 130, 254, 197, 234, 96, 140, 126, 226, 130, 254, 197, 234, 97, 140, 126, - 235, 164, 140, 126, 234, 93, 140, 126, 234, 94, 140, 126, 234, 100, 246, - 223, 140, 126, 234, 100, 221, 239, 140, 126, 234, 100, 221, 93, 140, 126, - 234, 100, 251, 50, 140, 126, 222, 25, 140, 126, 232, 36, 140, 126, 218, - 49, 140, 126, 245, 135, 140, 20, 217, 84, 140, 20, 107, 140, 20, 103, - 140, 20, 160, 140, 20, 154, 140, 20, 174, 140, 20, 182, 140, 20, 191, - 140, 20, 185, 140, 20, 190, 140, 126, 254, 121, 140, 126, 236, 124, 202, - 1, 236, 57, 202, 1, 236, 126, 223, 66, 202, 1, 236, 126, 222, 121, 202, - 1, 232, 84, 202, 1, 250, 182, 202, 1, 224, 27, 222, 121, 202, 1, 231, 56, - 202, 1, 248, 167, 202, 1, 101, 202, 1, 221, 240, 223, 66, 202, 1, 221, - 240, 222, 121, 202, 1, 231, 204, 202, 1, 252, 41, 202, 1, 229, 37, 202, - 1, 229, 119, 223, 66, 202, 1, 245, 140, 222, 121, 202, 1, 229, 119, 222, - 121, 202, 1, 245, 140, 223, 66, 202, 1, 233, 136, 202, 1, 217, 231, 202, - 1, 235, 13, 235, 36, 202, 1, 235, 13, 234, 246, 202, 1, 218, 187, 202, 1, - 224, 27, 223, 66, 202, 1, 243, 5, 223, 66, 202, 1, 74, 202, 1, 243, 5, - 222, 121, 202, 246, 208, 202, 29, 5, 60, 202, 29, 5, 234, 100, 236, 233, - 202, 29, 5, 255, 58, 202, 29, 5, 254, 140, 202, 29, 5, 72, 202, 29, 5, - 237, 255, 202, 29, 5, 218, 90, 202, 29, 5, 217, 166, 202, 29, 5, 68, 202, - 29, 5, 220, 23, 202, 29, 5, 234, 100, 236, 44, 202, 225, 62, 5, 235, 12, - 202, 225, 62, 5, 231, 56, 202, 29, 5, 73, 202, 29, 5, 246, 237, 202, 29, - 5, 74, 202, 29, 5, 253, 212, 202, 29, 5, 254, 196, 202, 236, 58, 235, - 188, 202, 145, 234, 100, 246, 223, 202, 145, 234, 100, 221, 239, 202, - 145, 234, 100, 221, 205, 202, 145, 234, 100, 251, 123, 202, 251, 151, 78, - 202, 232, 43, 202, 20, 217, 84, 202, 20, 107, 202, 20, 103, 202, 20, 160, - 202, 20, 154, 202, 20, 174, 202, 20, 182, 202, 20, 191, 202, 20, 185, - 202, 20, 190, 202, 243, 5, 231, 204, 202, 243, 5, 233, 136, 59, 4, 230, - 146, 59, 164, 244, 19, 217, 243, 233, 213, 221, 61, 60, 59, 164, 244, 19, - 217, 243, 233, 213, 255, 144, 227, 80, 252, 146, 196, 59, 164, 244, 19, - 217, 243, 233, 213, 255, 144, 244, 19, 221, 45, 196, 59, 164, 66, 217, - 243, 233, 213, 234, 27, 196, 59, 164, 250, 194, 217, 243, 233, 213, 225, - 31, 196, 59, 164, 251, 135, 217, 243, 233, 213, 229, 112, 225, 19, 196, - 59, 164, 217, 243, 233, 213, 221, 45, 225, 19, 196, 59, 164, 226, 115, - 225, 18, 59, 164, 251, 251, 217, 243, 233, 212, 59, 164, 252, 55, 224, - 197, 217, 243, 233, 212, 59, 164, 237, 173, 221, 44, 59, 164, 249, 68, - 221, 45, 251, 250, 59, 164, 225, 18, 59, 164, 231, 60, 225, 18, 59, 164, - 221, 45, 225, 18, 59, 164, 231, 60, 221, 45, 225, 18, 59, 164, 227, 96, - 251, 39, 223, 229, 225, 18, 59, 164, 227, 154, 244, 44, 225, 18, 59, 164, - 251, 135, 255, 148, 227, 26, 234, 26, 171, 251, 154, 59, 164, 244, 19, - 221, 44, 59, 235, 5, 5, 251, 67, 227, 25, 59, 235, 5, 5, 235, 77, 227, - 25, 59, 253, 248, 5, 225, 28, 244, 194, 255, 149, 227, 25, 59, 253, 248, - 5, 255, 146, 187, 59, 253, 248, 5, 226, 95, 221, 40, 59, 5, 227, 218, - 248, 179, 244, 193, 59, 5, 227, 218, 248, 179, 244, 70, 59, 5, 227, 218, - 248, 179, 244, 20, 59, 5, 227, 218, 232, 230, 244, 193, 59, 5, 227, 218, - 232, 230, 244, 70, 59, 5, 227, 218, 248, 179, 227, 218, 232, 229, 59, 20, - 217, 84, 59, 20, 107, 59, 20, 103, 59, 20, 160, 59, 20, 154, 59, 20, 174, - 59, 20, 182, 59, 20, 191, 59, 20, 185, 59, 20, 190, 59, 20, 144, 107, 59, - 20, 144, 103, 59, 20, 144, 160, 59, 20, 144, 154, 59, 20, 144, 174, 59, - 20, 144, 182, 59, 20, 144, 191, 59, 20, 144, 185, 59, 20, 144, 190, 59, - 20, 144, 217, 84, 59, 164, 251, 253, 227, 25, 59, 164, 232, 109, 251, - 204, 231, 68, 217, 23, 59, 164, 251, 135, 255, 148, 227, 26, 251, 205, - 233, 172, 251, 154, 59, 164, 232, 109, 251, 204, 225, 29, 227, 25, 59, - 164, 251, 47, 233, 212, 59, 164, 221, 56, 255, 145, 59, 164, 244, 8, 227, - 26, 243, 228, 59, 164, 244, 8, 227, 26, 243, 234, 59, 164, 254, 124, 236, - 140, 243, 228, 59, 164, 254, 124, 236, 140, 243, 234, 59, 5, 218, 42, - 221, 43, 59, 5, 234, 75, 221, 43, 59, 1, 175, 59, 1, 236, 149, 59, 1, - 245, 0, 59, 1, 244, 125, 59, 1, 232, 115, 59, 1, 251, 169, 59, 1, 251, - 69, 59, 1, 237, 123, 59, 1, 231, 77, 59, 1, 221, 29, 59, 1, 221, 19, 59, - 1, 249, 132, 59, 1, 249, 116, 59, 1, 231, 217, 59, 1, 222, 155, 59, 1, - 222, 35, 59, 1, 249, 207, 59, 1, 249, 36, 59, 1, 208, 59, 1, 187, 59, 1, - 229, 141, 59, 1, 252, 237, 59, 1, 252, 94, 59, 1, 196, 59, 1, 221, 55, - 59, 1, 221, 47, 59, 1, 247, 74, 59, 1, 247, 70, 59, 1, 219, 7, 59, 1, - 217, 80, 59, 1, 217, 114, 59, 1, 255, 151, 59, 1, 184, 59, 1, 203, 59, 1, - 235, 188, 59, 1, 225, 25, 59, 1, 223, 218, 59, 1, 226, 177, 59, 1, 155, - 59, 1, 60, 59, 1, 236, 10, 59, 1, 245, 167, 203, 59, 1, 236, 74, 59, 1, - 227, 52, 59, 29, 5, 255, 58, 59, 29, 5, 72, 59, 29, 5, 237, 255, 59, 29, - 5, 68, 59, 29, 5, 220, 23, 59, 29, 5, 167, 152, 59, 29, 5, 167, 227, 53, - 59, 29, 5, 167, 153, 59, 29, 5, 167, 235, 18, 59, 29, 5, 73, 59, 29, 5, - 246, 250, 59, 29, 5, 74, 59, 29, 5, 230, 127, 59, 5, 227, 81, 223, 104, - 232, 116, 227, 75, 59, 5, 227, 80, 252, 145, 59, 29, 5, 210, 72, 59, 29, - 5, 210, 237, 255, 59, 5, 231, 68, 217, 24, 232, 236, 249, 207, 59, 5, - 224, 37, 235, 124, 59, 164, 243, 196, 59, 164, 230, 21, 59, 5, 235, 127, - 227, 25, 59, 5, 218, 46, 227, 25, 59, 5, 235, 128, 221, 56, 251, 154, 59, - 5, 234, 28, 251, 154, 59, 5, 244, 22, 251, 155, 227, 152, 59, 5, 244, 22, - 234, 20, 227, 152, 59, 223, 97, 1, 175, 59, 223, 97, 1, 236, 149, 59, - 223, 97, 1, 245, 0, 59, 223, 97, 1, 244, 125, 59, 223, 97, 1, 232, 115, - 59, 223, 97, 1, 251, 169, 59, 223, 97, 1, 251, 69, 59, 223, 97, 1, 237, - 123, 59, 223, 97, 1, 231, 77, 59, 223, 97, 1, 221, 29, 59, 223, 97, 1, - 221, 19, 59, 223, 97, 1, 249, 132, 59, 223, 97, 1, 249, 116, 59, 223, 97, - 1, 231, 217, 59, 223, 97, 1, 222, 155, 59, 223, 97, 1, 222, 35, 59, 223, - 97, 1, 249, 207, 59, 223, 97, 1, 249, 36, 59, 223, 97, 1, 208, 59, 223, - 97, 1, 187, 59, 223, 97, 1, 229, 141, 59, 223, 97, 1, 252, 237, 59, 223, - 97, 1, 252, 94, 59, 223, 97, 1, 196, 59, 223, 97, 1, 221, 55, 59, 223, - 97, 1, 221, 47, 59, 223, 97, 1, 247, 74, 59, 223, 97, 1, 247, 70, 59, - 223, 97, 1, 219, 7, 59, 223, 97, 1, 217, 80, 59, 223, 97, 1, 217, 114, - 59, 223, 97, 1, 255, 151, 59, 223, 97, 1, 184, 59, 223, 97, 1, 203, 59, - 223, 97, 1, 235, 188, 59, 223, 97, 1, 225, 25, 59, 223, 97, 1, 223, 218, - 59, 223, 97, 1, 226, 177, 59, 223, 97, 1, 155, 59, 223, 97, 1, 60, 59, - 223, 97, 1, 236, 10, 59, 223, 97, 1, 245, 167, 219, 7, 59, 223, 97, 1, - 245, 167, 184, 59, 223, 97, 1, 245, 167, 203, 59, 236, 8, 227, 23, 236, - 149, 59, 236, 8, 227, 23, 236, 150, 251, 205, 233, 172, 251, 154, 59, - 251, 144, 5, 106, 252, 140, 59, 251, 144, 5, 170, 252, 140, 59, 251, 144, - 5, 251, 145, 222, 86, 59, 251, 144, 5, 226, 114, 255, 150, 59, 16, 247, - 121, 251, 248, 59, 16, 227, 217, 227, 82, 59, 16, 230, 35, 244, 192, 59, - 16, 227, 217, 227, 83, 227, 154, 244, 43, 59, 16, 229, 112, 187, 59, 16, - 231, 190, 251, 248, 59, 16, 231, 190, 251, 249, 231, 60, 255, 147, 59, - 16, 231, 190, 251, 249, 244, 21, 255, 147, 59, 16, 231, 190, 251, 249, - 251, 205, 255, 147, 59, 5, 227, 218, 232, 230, 227, 218, 248, 178, 59, 5, - 227, 218, 232, 230, 244, 20, 59, 164, 251, 252, 224, 197, 244, 104, 233, - 213, 227, 153, 59, 164, 233, 138, 217, 243, 244, 104, 233, 213, 227, 153, - 59, 164, 231, 60, 221, 44, 59, 164, 66, 252, 12, 227, 77, 217, 243, 233, - 213, 234, 27, 196, 59, 164, 250, 194, 252, 12, 227, 77, 217, 243, 233, - 213, 225, 31, 196, 227, 108, 223, 38, 55, 235, 114, 223, 38, 55, 227, - 108, 223, 38, 5, 2, 248, 143, 235, 114, 223, 38, 5, 2, 248, 143, 63, 1, - 175, 63, 1, 236, 149, 63, 1, 245, 0, 63, 1, 244, 125, 63, 1, 232, 115, - 63, 1, 251, 169, 63, 1, 251, 69, 63, 1, 237, 123, 63, 1, 237, 103, 63, 1, - 231, 77, 63, 1, 231, 206, 63, 1, 221, 29, 63, 1, 221, 19, 63, 1, 249, - 132, 63, 1, 249, 116, 63, 1, 231, 217, 63, 1, 222, 155, 63, 1, 222, 35, - 63, 1, 249, 207, 63, 1, 249, 36, 63, 1, 208, 63, 1, 187, 63, 1, 229, 141, - 63, 1, 252, 237, 63, 1, 252, 94, 63, 1, 196, 63, 1, 184, 63, 1, 203, 63, - 1, 235, 188, 63, 1, 219, 7, 63, 1, 226, 177, 63, 1, 155, 63, 1, 235, 17, - 63, 1, 60, 63, 1, 225, 10, 60, 63, 1, 72, 63, 1, 237, 255, 63, 1, 68, 63, - 1, 220, 23, 63, 1, 73, 63, 1, 233, 128, 73, 63, 1, 74, 63, 1, 253, 232, - 63, 29, 5, 222, 123, 255, 58, 63, 29, 5, 255, 58, 63, 29, 5, 72, 63, 29, - 5, 237, 255, 63, 29, 5, 68, 63, 29, 5, 220, 23, 63, 29, 5, 73, 63, 29, 5, - 254, 196, 63, 29, 5, 233, 128, 237, 255, 63, 29, 5, 233, 128, 74, 63, 29, - 5, 178, 50, 63, 5, 254, 95, 63, 5, 61, 56, 63, 5, 219, 77, 63, 5, 219, - 82, 63, 5, 254, 11, 63, 250, 147, 5, 128, 184, 63, 250, 147, 5, 128, 203, - 63, 250, 147, 5, 128, 219, 7, 63, 250, 147, 5, 128, 155, 63, 1, 244, 32, - 226, 177, 63, 20, 217, 84, 63, 20, 107, 63, 20, 103, 63, 20, 160, 63, 20, - 154, 63, 20, 174, 63, 20, 182, 63, 20, 191, 63, 20, 185, 63, 20, 190, 63, - 5, 235, 25, 226, 86, 63, 5, 226, 86, 63, 16, 235, 9, 63, 16, 250, 163, - 63, 16, 254, 213, 63, 16, 244, 178, 63, 1, 225, 25, 63, 1, 223, 218, 63, - 1, 167, 152, 63, 1, 167, 227, 53, 63, 1, 167, 153, 63, 1, 167, 235, 18, - 63, 29, 5, 167, 152, 63, 29, 5, 167, 227, 53, 63, 29, 5, 167, 153, 63, - 29, 5, 167, 235, 18, 63, 1, 233, 128, 232, 115, 63, 1, 233, 128, 237, - 103, 63, 1, 233, 128, 252, 178, 63, 1, 233, 128, 252, 174, 63, 250, 147, - 5, 233, 128, 128, 208, 63, 250, 147, 5, 233, 128, 128, 196, 63, 250, 147, - 5, 233, 128, 128, 235, 188, 63, 1, 225, 30, 236, 213, 225, 25, 63, 29, 5, - 225, 30, 236, 213, 246, 115, 63, 145, 164, 225, 30, 236, 213, 243, 170, - 63, 145, 164, 225, 30, 236, 213, 236, 185, 229, 118, 63, 1, 218, 215, - 228, 175, 236, 213, 222, 35, 63, 1, 218, 215, 228, 175, 236, 213, 228, - 181, 63, 29, 5, 218, 215, 228, 175, 236, 213, 246, 115, 63, 29, 5, 218, - 215, 228, 175, 236, 213, 220, 110, 63, 5, 218, 215, 228, 175, 236, 213, - 221, 131, 63, 5, 218, 215, 228, 175, 236, 213, 221, 130, 63, 5, 218, 215, - 228, 175, 236, 213, 221, 129, 63, 5, 218, 215, 228, 175, 236, 213, 221, - 128, 63, 5, 218, 215, 228, 175, 236, 213, 221, 127, 63, 1, 247, 4, 228, - 175, 236, 213, 231, 217, 63, 1, 247, 4, 228, 175, 236, 213, 217, 173, 63, - 1, 247, 4, 228, 175, 236, 213, 244, 106, 63, 29, 5, 244, 188, 236, 213, - 72, 63, 29, 5, 236, 190, 230, 167, 63, 29, 5, 236, 190, 68, 63, 29, 5, - 236, 190, 246, 250, 63, 1, 225, 10, 175, 63, 1, 225, 10, 236, 149, 63, 1, - 225, 10, 245, 0, 63, 1, 225, 10, 251, 169, 63, 1, 225, 10, 217, 114, 63, - 1, 225, 10, 231, 77, 63, 1, 225, 10, 249, 207, 63, 1, 225, 10, 208, 63, - 1, 225, 10, 229, 141, 63, 1, 225, 10, 246, 8, 63, 1, 225, 10, 252, 237, - 63, 1, 225, 10, 222, 35, 63, 1, 225, 10, 155, 63, 250, 147, 5, 225, 10, - 128, 219, 7, 63, 29, 5, 225, 10, 255, 58, 63, 29, 5, 225, 10, 73, 63, 29, - 5, 225, 10, 178, 50, 63, 29, 5, 225, 10, 39, 218, 90, 63, 5, 225, 10, - 221, 130, 63, 5, 225, 10, 221, 129, 63, 5, 225, 10, 221, 127, 63, 5, 225, - 10, 221, 126, 63, 5, 225, 10, 250, 115, 221, 130, 63, 5, 225, 10, 250, - 115, 221, 129, 63, 5, 225, 10, 250, 115, 246, 200, 221, 132, 63, 1, 227, - 12, 230, 26, 246, 8, 63, 5, 227, 12, 230, 26, 221, 127, 63, 225, 10, 20, - 217, 84, 63, 225, 10, 20, 107, 63, 225, 10, 20, 103, 63, 225, 10, 20, - 160, 63, 225, 10, 20, 154, 63, 225, 10, 20, 174, 63, 225, 10, 20, 182, - 63, 225, 10, 20, 191, 63, 225, 10, 20, 185, 63, 225, 10, 20, 190, 63, 5, - 236, 143, 221, 131, 63, 5, 236, 143, 221, 129, 63, 29, 5, 254, 186, 60, - 63, 29, 5, 254, 186, 254, 196, 63, 16, 225, 10, 107, 63, 16, 225, 10, - 246, 94, 95, 6, 1, 254, 131, 95, 6, 1, 252, 209, 95, 6, 1, 244, 230, 95, - 6, 1, 248, 153, 95, 6, 1, 246, 197, 95, 6, 1, 219, 85, 95, 6, 1, 217, 87, - 95, 6, 1, 222, 119, 95, 6, 1, 237, 223, 95, 6, 1, 236, 233, 95, 6, 1, - 235, 143, 95, 6, 1, 234, 86, 95, 6, 1, 232, 211, 95, 6, 1, 230, 138, 95, - 6, 1, 229, 243, 95, 6, 1, 217, 76, 95, 6, 1, 227, 249, 95, 6, 1, 226, - 140, 95, 6, 1, 222, 112, 95, 6, 1, 220, 87, 95, 6, 1, 229, 134, 95, 6, 1, - 236, 138, 95, 6, 1, 244, 119, 95, 6, 1, 228, 140, 95, 6, 1, 224, 209, 95, - 6, 1, 251, 22, 95, 6, 1, 251, 154, 95, 6, 1, 237, 91, 95, 6, 1, 250, 224, - 95, 6, 1, 251, 56, 95, 6, 1, 218, 136, 95, 6, 1, 237, 101, 95, 6, 1, 243, - 208, 95, 6, 1, 243, 162, 95, 6, 1, 243, 108, 95, 6, 1, 218, 227, 95, 6, - 1, 243, 182, 95, 6, 1, 243, 2, 95, 1, 254, 131, 95, 1, 252, 209, 95, 1, - 244, 230, 95, 1, 248, 153, 95, 1, 246, 197, 95, 1, 219, 85, 95, 1, 217, - 87, 95, 1, 222, 119, 95, 1, 237, 223, 95, 1, 236, 233, 95, 1, 235, 143, - 95, 1, 234, 86, 95, 1, 232, 211, 95, 1, 230, 138, 95, 1, 229, 243, 95, 1, - 217, 76, 95, 1, 227, 249, 95, 1, 226, 140, 95, 1, 222, 112, 95, 1, 220, - 87, 95, 1, 229, 134, 95, 1, 236, 138, 95, 1, 244, 119, 95, 1, 228, 140, - 95, 1, 224, 209, 95, 1, 251, 22, 95, 1, 251, 154, 95, 1, 237, 91, 95, 1, - 250, 224, 95, 1, 251, 56, 95, 1, 218, 136, 95, 1, 237, 101, 95, 1, 243, - 208, 95, 1, 243, 162, 95, 1, 243, 108, 95, 1, 218, 227, 95, 1, 243, 182, - 95, 1, 243, 2, 95, 1, 245, 203, 95, 1, 217, 233, 95, 1, 246, 210, 95, 1, - 215, 244, 230, 95, 1, 254, 191, 95, 229, 241, 225, 54, 58, 1, 95, 232, - 211, 22, 91, 236, 86, 22, 91, 223, 211, 22, 91, 232, 55, 22, 91, 221, - 192, 22, 91, 223, 200, 22, 91, 227, 140, 22, 91, 233, 187, 22, 91, 229, - 99, 22, 91, 223, 208, 22, 91, 224, 104, 22, 91, 223, 205, 22, 91, 238, - 22, 22, 91, 250, 230, 22, 91, 223, 215, 22, 91, 251, 29, 22, 91, 236, - 128, 22, 91, 222, 0, 22, 91, 229, 127, 22, 91, 243, 106, 22, 91, 232, 51, - 22, 91, 223, 209, 22, 91, 232, 45, 22, 91, 232, 49, 22, 91, 221, 189, 22, - 91, 227, 128, 22, 91, 223, 207, 22, 91, 227, 138, 22, 91, 236, 217, 22, - 91, 233, 180, 22, 91, 236, 220, 22, 91, 229, 94, 22, 91, 229, 92, 22, 91, - 229, 80, 22, 91, 229, 88, 22, 91, 229, 86, 22, 91, 229, 83, 22, 91, 229, - 85, 22, 91, 229, 82, 22, 91, 229, 87, 22, 91, 229, 97, 22, 91, 229, 98, - 22, 91, 229, 81, 22, 91, 229, 91, 22, 91, 236, 218, 22, 91, 236, 216, 22, - 91, 224, 97, 22, 91, 224, 95, 22, 91, 224, 87, 22, 91, 224, 90, 22, 91, - 224, 96, 22, 91, 224, 92, 22, 91, 224, 91, 22, 91, 224, 89, 22, 91, 224, - 100, 22, 91, 224, 102, 22, 91, 224, 103, 22, 91, 224, 98, 22, 91, 224, - 88, 22, 91, 224, 93, 22, 91, 224, 101, 22, 91, 251, 15, 22, 91, 251, 13, - 22, 91, 251, 78, 22, 91, 251, 76, 22, 91, 230, 1, 22, 91, 238, 17, 22, - 91, 238, 8, 22, 91, 238, 16, 22, 91, 238, 13, 22, 91, 238, 11, 22, 91, - 238, 15, 22, 91, 223, 212, 22, 91, 238, 20, 22, 91, 238, 21, 22, 91, 238, - 9, 22, 91, 238, 14, 22, 91, 218, 6, 22, 91, 250, 229, 22, 91, 251, 16, - 22, 91, 251, 14, 22, 91, 251, 79, 22, 91, 251, 77, 22, 91, 251, 27, 22, - 91, 251, 28, 22, 91, 251, 17, 22, 91, 251, 80, 22, 91, 229, 125, 22, 91, - 236, 219, 22, 91, 223, 213, 22, 91, 218, 12, 22, 91, 236, 77, 22, 91, - 232, 47, 22, 91, 232, 53, 22, 91, 232, 52, 22, 91, 221, 186, 22, 91, 245, - 185, 22, 122, 245, 185, 22, 122, 60, 22, 122, 254, 234, 22, 122, 184, 22, - 122, 218, 65, 22, 122, 246, 168, 22, 122, 73, 22, 122, 218, 16, 22, 122, - 218, 25, 22, 122, 74, 22, 122, 219, 7, 22, 122, 219, 4, 22, 122, 230, - 167, 22, 122, 217, 231, 22, 122, 68, 22, 122, 218, 219, 22, 122, 218, - 227, 22, 122, 218, 204, 22, 122, 217, 200, 22, 122, 246, 115, 22, 122, - 217, 250, 22, 122, 72, 22, 122, 255, 142, 22, 122, 255, 141, 22, 122, - 218, 79, 22, 122, 218, 77, 22, 122, 246, 166, 22, 122, 246, 165, 22, 122, - 246, 167, 22, 122, 218, 15, 22, 122, 218, 14, 22, 122, 231, 13, 22, 122, - 231, 14, 22, 122, 231, 7, 22, 122, 231, 12, 22, 122, 231, 10, 22, 122, - 217, 225, 22, 122, 217, 224, 22, 122, 217, 223, 22, 122, 217, 226, 22, - 122, 217, 227, 22, 122, 220, 179, 22, 122, 220, 178, 22, 122, 220, 177, - 22, 122, 220, 174, 22, 122, 220, 175, 22, 122, 217, 199, 22, 122, 217, - 196, 22, 122, 217, 197, 22, 122, 217, 191, 22, 122, 217, 192, 22, 122, - 217, 193, 22, 122, 217, 195, 22, 122, 246, 109, 22, 122, 246, 111, 22, - 122, 217, 249, 22, 122, 242, 106, 22, 122, 242, 98, 22, 122, 242, 101, - 22, 122, 242, 99, 22, 122, 242, 103, 22, 122, 242, 105, 22, 122, 254, 60, - 22, 122, 254, 57, 22, 122, 254, 55, 22, 122, 254, 56, 22, 122, 223, 216, - 22, 122, 255, 143, 22, 122, 218, 78, 22, 122, 218, 13, 22, 122, 231, 9, - 22, 122, 231, 8, 22, 85, 236, 86, 22, 85, 223, 211, 22, 85, 236, 79, 22, - 85, 232, 55, 22, 85, 232, 53, 22, 85, 232, 52, 22, 85, 221, 192, 22, 85, - 227, 140, 22, 85, 227, 135, 22, 85, 227, 132, 22, 85, 227, 125, 22, 85, - 227, 120, 22, 85, 227, 115, 22, 85, 227, 126, 22, 85, 227, 138, 22, 85, - 233, 187, 22, 85, 229, 99, 22, 85, 229, 88, 22, 85, 224, 104, 22, 85, - 223, 205, 22, 85, 238, 22, 22, 85, 250, 230, 22, 85, 251, 29, 22, 85, - 236, 128, 22, 85, 222, 0, 22, 85, 229, 127, 22, 85, 243, 106, 22, 85, - 236, 80, 22, 85, 236, 78, 22, 85, 232, 51, 22, 85, 232, 45, 22, 85, 232, - 47, 22, 85, 232, 50, 22, 85, 232, 46, 22, 85, 221, 189, 22, 85, 221, 186, - 22, 85, 227, 133, 22, 85, 227, 128, 22, 85, 227, 114, 22, 85, 227, 113, - 22, 85, 223, 207, 22, 85, 227, 130, 22, 85, 227, 129, 22, 85, 227, 122, - 22, 85, 227, 124, 22, 85, 227, 137, 22, 85, 227, 117, 22, 85, 227, 127, - 22, 85, 227, 136, 22, 85, 227, 112, 22, 85, 233, 183, 22, 85, 233, 178, - 22, 85, 233, 180, 22, 85, 233, 177, 22, 85, 233, 175, 22, 85, 233, 181, - 22, 85, 233, 186, 22, 85, 233, 184, 22, 85, 236, 220, 22, 85, 229, 90, - 22, 85, 229, 91, 22, 85, 229, 96, 22, 85, 236, 218, 22, 85, 224, 97, 22, - 85, 224, 87, 22, 85, 224, 90, 22, 85, 224, 92, 22, 85, 230, 1, 22, 85, - 238, 17, 22, 85, 238, 10, 22, 85, 223, 212, 22, 85, 238, 18, 22, 85, 218, - 6, 22, 85, 218, 2, 22, 85, 218, 3, 22, 85, 229, 125, 22, 85, 236, 219, - 22, 85, 243, 104, 22, 85, 243, 102, 22, 85, 243, 105, 22, 85, 243, 103, - 22, 85, 218, 12, 22, 85, 236, 82, 22, 85, 236, 81, 22, 85, 236, 85, 22, - 85, 236, 83, 22, 85, 236, 84, 22, 85, 223, 209, 28, 4, 155, 28, 4, 242, - 173, 28, 4, 243, 112, 28, 4, 243, 211, 28, 4, 243, 148, 28, 4, 243, 162, - 28, 4, 243, 4, 28, 4, 243, 3, 28, 4, 235, 188, 28, 4, 234, 231, 28, 4, - 235, 67, 28, 4, 235, 187, 28, 4, 235, 118, 28, 4, 235, 122, 28, 4, 235, - 12, 28, 4, 234, 206, 28, 4, 243, 121, 28, 4, 243, 115, 28, 4, 243, 117, - 28, 4, 243, 120, 28, 4, 243, 118, 28, 4, 243, 119, 28, 4, 243, 116, 28, - 4, 243, 114, 28, 4, 196, 28, 4, 233, 99, 28, 4, 233, 196, 28, 4, 234, - 118, 28, 4, 234, 16, 28, 4, 234, 25, 28, 4, 233, 136, 28, 4, 233, 49, 28, - 4, 222, 212, 28, 4, 222, 206, 28, 4, 222, 208, 28, 4, 222, 211, 28, 4, - 222, 209, 28, 4, 222, 210, 28, 4, 222, 207, 28, 4, 222, 205, 28, 4, 203, - 28, 4, 227, 22, 28, 4, 227, 147, 28, 4, 228, 0, 28, 4, 227, 200, 28, 4, - 227, 216, 28, 4, 227, 75, 28, 4, 226, 252, 28, 4, 226, 177, 28, 4, 223, - 103, 28, 4, 224, 140, 28, 4, 226, 175, 28, 4, 226, 84, 28, 4, 226, 94, - 28, 4, 224, 26, 28, 4, 223, 36, 28, 4, 225, 25, 28, 4, 224, 170, 28, 4, - 224, 221, 28, 4, 225, 21, 28, 4, 224, 244, 28, 4, 224, 246, 28, 4, 224, - 200, 28, 4, 224, 157, 28, 4, 228, 155, 28, 4, 228, 98, 28, 4, 228, 121, - 28, 4, 228, 154, 28, 4, 228, 135, 28, 4, 228, 136, 28, 4, 228, 110, 28, - 4, 228, 109, 28, 4, 228, 57, 28, 4, 228, 53, 28, 4, 228, 56, 28, 4, 228, - 54, 28, 4, 228, 55, 28, 4, 228, 133, 28, 4, 228, 127, 28, 4, 228, 129, - 28, 4, 228, 132, 28, 4, 228, 130, 28, 4, 228, 131, 28, 4, 228, 128, 28, - 4, 228, 126, 28, 4, 228, 122, 28, 4, 228, 125, 28, 4, 228, 123, 28, 4, - 228, 124, 28, 4, 252, 237, 28, 4, 251, 248, 28, 4, 252, 84, 28, 4, 252, - 236, 28, 4, 252, 137, 28, 4, 252, 144, 28, 4, 252, 41, 28, 4, 251, 218, - 28, 4, 219, 189, 28, 4, 219, 56, 28, 4, 219, 94, 28, 4, 219, 188, 28, 4, - 219, 160, 28, 4, 219, 165, 28, 4, 219, 72, 28, 4, 219, 49, 28, 4, 222, - 155, 28, 4, 221, 0, 28, 4, 221, 205, 28, 4, 222, 152, 28, 4, 222, 80, 28, - 4, 222, 87, 28, 4, 101, 28, 4, 220, 225, 28, 4, 251, 169, 28, 4, 250, 92, - 28, 4, 250, 235, 28, 4, 251, 168, 28, 4, 251, 91, 28, 4, 251, 99, 28, 4, - 250, 182, 28, 4, 250, 66, 28, 4, 218, 138, 28, 4, 218, 114, 28, 4, 218, - 130, 28, 4, 218, 137, 28, 4, 218, 134, 28, 4, 218, 135, 28, 4, 218, 121, - 28, 4, 218, 120, 28, 4, 218, 109, 28, 4, 218, 105, 28, 4, 218, 108, 28, - 4, 218, 106, 28, 4, 218, 107, 28, 4, 208, 28, 4, 231, 144, 28, 4, 232, - 62, 28, 4, 232, 235, 28, 4, 232, 139, 28, 4, 232, 141, 28, 4, 231, 204, - 28, 4, 231, 85, 28, 4, 231, 77, 28, 4, 231, 50, 28, 4, 231, 67, 28, 4, - 231, 76, 28, 4, 231, 72, 28, 4, 231, 73, 28, 4, 231, 56, 28, 4, 231, 43, - 28, 4, 244, 73, 60, 28, 4, 244, 73, 68, 28, 4, 244, 73, 72, 28, 4, 244, - 73, 255, 58, 28, 4, 244, 73, 246, 250, 28, 4, 244, 73, 73, 28, 4, 244, - 73, 74, 28, 4, 244, 73, 219, 7, 28, 4, 175, 28, 4, 236, 7, 28, 4, 236, - 113, 28, 4, 237, 5, 28, 4, 236, 183, 28, 4, 236, 184, 28, 4, 236, 57, 28, - 4, 236, 56, 28, 4, 235, 234, 28, 4, 235, 229, 28, 4, 235, 233, 28, 4, - 235, 230, 28, 4, 235, 231, 28, 4, 235, 224, 28, 4, 235, 218, 28, 4, 235, - 220, 28, 4, 235, 223, 28, 4, 235, 221, 28, 4, 235, 222, 28, 4, 235, 219, - 28, 4, 235, 217, 28, 4, 235, 213, 28, 4, 235, 216, 28, 4, 235, 214, 28, - 4, 235, 215, 28, 4, 219, 7, 28, 4, 218, 165, 28, 4, 218, 204, 28, 4, 219, - 6, 28, 4, 218, 224, 28, 4, 218, 227, 28, 4, 218, 187, 28, 4, 218, 186, - 28, 4, 229, 133, 60, 28, 4, 229, 133, 68, 28, 4, 229, 133, 72, 28, 4, - 229, 133, 255, 58, 28, 4, 229, 133, 246, 250, 28, 4, 229, 133, 73, 28, 4, - 229, 133, 74, 28, 4, 217, 114, 28, 4, 217, 13, 28, 4, 217, 42, 28, 4, - 217, 113, 28, 4, 217, 90, 28, 4, 217, 92, 28, 4, 217, 21, 28, 4, 217, 0, - 28, 4, 217, 80, 28, 4, 217, 60, 28, 4, 217, 67, 28, 4, 217, 79, 28, 4, - 217, 71, 28, 4, 217, 72, 28, 4, 217, 65, 28, 4, 217, 51, 28, 4, 184, 28, - 4, 217, 200, 28, 4, 217, 250, 28, 4, 218, 76, 28, 4, 218, 22, 28, 4, 218, - 25, 28, 4, 217, 231, 28, 4, 217, 222, 28, 4, 249, 207, 28, 4, 247, 111, - 28, 4, 249, 15, 28, 4, 249, 206, 28, 4, 249, 82, 28, 4, 249, 92, 28, 4, - 248, 167, 28, 4, 247, 83, 28, 4, 249, 132, 28, 4, 249, 102, 28, 4, 249, - 114, 28, 4, 249, 131, 28, 4, 249, 119, 28, 4, 249, 120, 28, 4, 249, 107, - 28, 4, 249, 93, 28, 4, 237, 123, 28, 4, 237, 43, 28, 4, 237, 98, 28, 4, - 237, 122, 28, 4, 237, 113, 28, 4, 237, 114, 28, 4, 237, 59, 28, 4, 237, - 25, 28, 4, 245, 0, 28, 4, 244, 17, 28, 4, 244, 103, 28, 4, 244, 253, 28, - 4, 244, 184, 28, 4, 244, 191, 28, 4, 244, 68, 28, 4, 244, 67, 28, 4, 243, - 243, 28, 4, 243, 239, 28, 4, 243, 242, 28, 4, 243, 240, 28, 4, 243, 241, - 28, 4, 244, 160, 28, 4, 244, 140, 28, 4, 244, 150, 28, 4, 244, 159, 28, - 4, 244, 154, 28, 4, 244, 155, 28, 4, 244, 144, 28, 4, 244, 129, 28, 4, - 222, 35, 28, 4, 221, 223, 28, 4, 222, 2, 28, 4, 222, 34, 28, 4, 222, 21, - 28, 4, 222, 22, 28, 4, 221, 239, 28, 4, 221, 216, 28, 4, 251, 69, 28, 4, - 250, 253, 28, 4, 251, 31, 28, 4, 251, 68, 28, 4, 251, 43, 28, 4, 251, 46, - 28, 4, 251, 11, 28, 4, 250, 242, 28, 4, 229, 141, 28, 4, 229, 114, 28, 4, - 229, 129, 28, 4, 229, 140, 28, 4, 229, 131, 28, 4, 229, 132, 28, 4, 229, - 118, 28, 4, 229, 110, 28, 4, 221, 55, 28, 4, 221, 36, 28, 4, 221, 39, 28, - 4, 221, 54, 28, 4, 221, 49, 28, 4, 221, 50, 28, 4, 221, 38, 28, 4, 221, - 34, 28, 4, 220, 188, 28, 4, 220, 180, 28, 4, 220, 184, 28, 4, 220, 187, - 28, 4, 220, 185, 28, 4, 220, 186, 28, 4, 220, 182, 28, 4, 220, 181, 28, - 4, 246, 8, 28, 4, 245, 92, 28, 4, 245, 203, 28, 4, 246, 7, 28, 4, 245, - 226, 28, 4, 245, 231, 28, 4, 245, 139, 28, 4, 245, 78, 28, 4, 187, 28, 4, - 228, 202, 28, 4, 229, 108, 28, 4, 230, 43, 28, 4, 229, 191, 28, 4, 229, - 198, 28, 4, 229, 37, 28, 4, 228, 181, 28, 4, 226, 242, 28, 4, 233, 39, - 28, 4, 245, 72, 28, 36, 244, 183, 78, 28, 226, 87, 78, 28, 218, 173, 28, - 245, 90, 223, 136, 28, 250, 168, 28, 225, 67, 28, 250, 175, 28, 228, 242, - 250, 175, 28, 228, 82, 78, 28, 229, 241, 225, 54, 28, 20, 107, 28, 20, - 103, 28, 20, 160, 28, 20, 154, 28, 20, 174, 28, 20, 182, 28, 20, 191, 28, - 20, 185, 28, 20, 190, 28, 54, 222, 65, 28, 54, 220, 219, 28, 54, 221, - 245, 28, 54, 245, 119, 28, 54, 245, 196, 28, 54, 224, 69, 28, 54, 225, - 38, 28, 54, 246, 227, 28, 54, 232, 27, 28, 54, 242, 161, 28, 54, 222, 66, - 221, 231, 28, 4, 226, 91, 233, 49, 28, 4, 233, 45, 28, 4, 233, 46, 28, 4, - 233, 47, 28, 4, 226, 91, 251, 218, 28, 4, 251, 215, 28, 4, 251, 216, 28, - 4, 251, 217, 28, 4, 226, 91, 245, 78, 28, 4, 245, 74, 28, 4, 245, 75, 28, - 4, 245, 76, 28, 4, 226, 91, 228, 181, 28, 4, 228, 177, 28, 4, 228, 178, - 28, 4, 228, 179, 28, 221, 133, 164, 217, 234, 28, 221, 133, 164, 249, 50, - 28, 221, 133, 164, 227, 97, 28, 221, 133, 164, 224, 192, 227, 97, 28, - 221, 133, 164, 248, 248, 28, 221, 133, 164, 236, 167, 28, 221, 133, 164, - 251, 19, 28, 221, 133, 164, 243, 110, 28, 221, 133, 164, 249, 49, 28, - 221, 133, 164, 235, 245, 143, 1, 60, 143, 1, 73, 143, 1, 72, 143, 1, 74, - 143, 1, 68, 143, 1, 216, 216, 143, 1, 245, 0, 143, 1, 175, 143, 1, 244, - 191, 143, 1, 244, 103, 143, 1, 244, 68, 143, 1, 244, 17, 143, 1, 243, - 244, 143, 1, 155, 143, 1, 243, 162, 143, 1, 243, 112, 143, 1, 243, 4, - 143, 1, 242, 173, 143, 1, 242, 154, 143, 1, 235, 188, 143, 1, 235, 122, - 143, 1, 235, 67, 143, 1, 235, 12, 143, 1, 234, 231, 143, 1, 234, 207, - 143, 1, 196, 143, 1, 234, 25, 143, 1, 233, 196, 143, 1, 233, 136, 143, 1, - 233, 99, 143, 1, 208, 143, 1, 243, 26, 143, 1, 232, 224, 143, 1, 232, - 141, 143, 1, 232, 62, 143, 1, 231, 204, 143, 1, 231, 144, 143, 1, 231, - 87, 143, 1, 228, 97, 143, 1, 228, 84, 143, 1, 228, 78, 143, 1, 228, 72, - 143, 1, 228, 61, 143, 1, 228, 59, 143, 1, 226, 177, 143, 1, 198, 143, 1, - 226, 94, 143, 1, 224, 140, 143, 1, 224, 26, 143, 1, 223, 103, 143, 1, - 223, 41, 143, 1, 249, 207, 143, 1, 222, 155, 143, 1, 249, 92, 143, 1, - 222, 87, 143, 1, 249, 15, 143, 1, 221, 205, 143, 1, 248, 167, 143, 1, - 247, 111, 143, 1, 247, 85, 143, 1, 248, 176, 143, 1, 221, 155, 143, 1, - 221, 154, 143, 1, 221, 144, 143, 1, 221, 143, 143, 1, 221, 142, 143, 1, - 221, 141, 143, 1, 221, 55, 143, 1, 221, 50, 143, 1, 221, 39, 143, 1, 221, - 38, 143, 1, 221, 36, 143, 1, 221, 35, 143, 1, 219, 7, 143, 1, 218, 227, - 143, 1, 218, 204, 143, 1, 218, 187, 143, 1, 218, 165, 143, 1, 218, 156, - 143, 1, 184, 143, 1, 218, 25, 143, 1, 217, 250, 143, 1, 217, 231, 143, 1, - 217, 200, 143, 1, 217, 174, 18, 19, 242, 121, 18, 19, 73, 18, 19, 255, - 22, 18, 19, 72, 18, 19, 237, 255, 18, 19, 74, 18, 19, 230, 127, 18, 19, - 218, 89, 230, 127, 18, 19, 64, 246, 250, 18, 19, 64, 72, 18, 19, 60, 18, - 19, 255, 58, 18, 19, 218, 227, 18, 19, 137, 218, 227, 18, 19, 218, 204, - 18, 19, 137, 218, 204, 18, 19, 218, 196, 18, 19, 137, 218, 196, 18, 19, - 218, 187, 18, 19, 137, 218, 187, 18, 19, 218, 180, 18, 19, 137, 218, 180, - 18, 19, 232, 207, 218, 180, 18, 19, 219, 7, 18, 19, 137, 219, 7, 18, 19, - 219, 6, 18, 19, 137, 219, 6, 18, 19, 232, 207, 219, 6, 18, 19, 254, 196, - 18, 19, 218, 89, 219, 40, 18, 19, 244, 73, 223, 136, 18, 19, 39, 168, 18, - 19, 39, 244, 36, 18, 19, 39, 252, 29, 144, 227, 93, 18, 19, 39, 221, 120, - 144, 227, 93, 18, 19, 39, 45, 144, 227, 93, 18, 19, 39, 227, 93, 18, 19, - 39, 51, 168, 18, 19, 39, 51, 224, 192, 69, 223, 107, 18, 19, 39, 233, - 193, 248, 145, 18, 19, 39, 224, 192, 186, 92, 18, 19, 39, 229, 43, 18, - 19, 39, 113, 222, 143, 18, 19, 246, 197, 18, 19, 237, 223, 18, 19, 230, - 138, 18, 19, 254, 131, 18, 19, 229, 198, 18, 19, 230, 41, 18, 19, 229, - 108, 18, 19, 229, 76, 18, 19, 229, 37, 18, 19, 229, 21, 18, 19, 218, 89, - 229, 21, 18, 19, 64, 243, 148, 18, 19, 64, 243, 112, 18, 19, 187, 18, 19, - 230, 43, 18, 19, 228, 179, 18, 19, 137, 228, 179, 18, 19, 228, 177, 18, - 19, 137, 228, 177, 18, 19, 228, 176, 18, 19, 137, 228, 176, 18, 19, 228, - 174, 18, 19, 137, 228, 174, 18, 19, 228, 173, 18, 19, 137, 228, 173, 18, - 19, 228, 181, 18, 19, 137, 228, 181, 18, 19, 228, 180, 18, 19, 137, 228, - 180, 18, 19, 218, 89, 228, 180, 18, 19, 230, 59, 18, 19, 137, 230, 59, - 18, 19, 64, 243, 225, 18, 19, 222, 87, 18, 19, 222, 150, 18, 19, 221, - 205, 18, 19, 221, 194, 18, 19, 101, 18, 19, 221, 122, 18, 19, 218, 89, - 221, 122, 18, 19, 64, 249, 82, 18, 19, 64, 249, 15, 18, 19, 222, 155, 18, - 19, 222, 152, 18, 19, 220, 223, 18, 19, 137, 220, 223, 18, 19, 220, 208, - 18, 19, 137, 220, 208, 18, 19, 220, 207, 18, 19, 137, 220, 207, 18, 19, - 103, 18, 19, 137, 103, 18, 19, 220, 203, 18, 19, 137, 220, 203, 18, 19, - 220, 225, 18, 19, 137, 220, 225, 18, 19, 220, 224, 18, 19, 137, 220, 224, - 18, 19, 232, 207, 220, 224, 18, 19, 222, 201, 18, 19, 221, 26, 18, 19, - 221, 12, 18, 19, 221, 11, 18, 19, 221, 29, 18, 19, 236, 184, 18, 19, 237, - 2, 18, 19, 236, 113, 18, 19, 236, 105, 18, 19, 236, 57, 18, 19, 236, 41, - 18, 19, 218, 89, 236, 41, 18, 19, 175, 18, 19, 237, 5, 18, 19, 235, 231, - 18, 19, 137, 235, 231, 18, 19, 235, 229, 18, 19, 137, 235, 229, 18, 19, - 235, 228, 18, 19, 137, 235, 228, 18, 19, 235, 227, 18, 19, 137, 235, 227, - 18, 19, 235, 226, 18, 19, 137, 235, 226, 18, 19, 235, 234, 18, 19, 137, - 235, 234, 18, 19, 235, 233, 18, 19, 137, 235, 233, 18, 19, 232, 207, 235, - 233, 18, 19, 237, 17, 18, 19, 235, 235, 18, 19, 224, 5, 236, 178, 18, 19, - 224, 5, 236, 106, 18, 19, 224, 5, 236, 53, 18, 19, 224, 5, 236, 245, 18, - 19, 251, 99, 18, 19, 251, 167, 18, 19, 250, 235, 18, 19, 250, 225, 18, - 19, 250, 182, 18, 19, 250, 130, 18, 19, 218, 89, 250, 130, 18, 19, 251, - 169, 18, 19, 251, 168, 18, 19, 250, 64, 18, 19, 137, 250, 64, 18, 19, - 250, 62, 18, 19, 137, 250, 62, 18, 19, 250, 61, 18, 19, 137, 250, 61, 18, - 19, 250, 60, 18, 19, 137, 250, 60, 18, 19, 250, 59, 18, 19, 137, 250, 59, - 18, 19, 250, 66, 18, 19, 137, 250, 66, 18, 19, 250, 65, 18, 19, 137, 250, - 65, 18, 19, 232, 207, 250, 65, 18, 19, 251, 202, 18, 19, 226, 116, 222, - 37, 18, 19, 234, 25, 18, 19, 234, 117, 18, 19, 233, 196, 18, 19, 233, - 171, 18, 19, 233, 136, 18, 19, 233, 119, 18, 19, 218, 89, 233, 119, 18, - 19, 196, 18, 19, 234, 118, 18, 19, 233, 47, 18, 19, 137, 233, 47, 18, 19, - 233, 45, 18, 19, 137, 233, 45, 18, 19, 233, 44, 18, 19, 137, 233, 44, 18, - 19, 233, 43, 18, 19, 137, 233, 43, 18, 19, 233, 42, 18, 19, 137, 233, 42, - 18, 19, 233, 49, 18, 19, 137, 233, 49, 18, 19, 233, 48, 18, 19, 137, 233, - 48, 18, 19, 232, 207, 233, 48, 18, 19, 189, 18, 19, 137, 189, 18, 19, - 233, 199, 18, 19, 253, 243, 189, 18, 19, 226, 116, 189, 18, 19, 232, 141, - 18, 19, 232, 234, 18, 19, 232, 62, 18, 19, 232, 38, 18, 19, 231, 204, 18, - 19, 231, 195, 18, 19, 218, 89, 231, 195, 18, 19, 208, 18, 19, 232, 235, - 18, 19, 231, 83, 18, 19, 137, 231, 83, 18, 19, 231, 85, 18, 19, 137, 231, - 85, 18, 19, 231, 84, 18, 19, 137, 231, 84, 18, 19, 232, 207, 231, 84, 18, - 19, 207, 18, 19, 64, 232, 117, 18, 19, 232, 67, 18, 19, 235, 122, 18, 19, - 235, 186, 18, 19, 235, 67, 18, 19, 235, 55, 18, 19, 235, 12, 18, 19, 234, - 248, 18, 19, 218, 89, 234, 248, 18, 19, 235, 188, 18, 19, 235, 187, 18, - 19, 234, 204, 18, 19, 137, 234, 204, 18, 19, 234, 203, 18, 19, 137, 234, - 203, 18, 19, 234, 202, 18, 19, 137, 234, 202, 18, 19, 234, 201, 18, 19, - 137, 234, 201, 18, 19, 234, 200, 18, 19, 137, 234, 200, 18, 19, 234, 206, - 18, 19, 137, 234, 206, 18, 19, 234, 205, 18, 19, 137, 234, 205, 18, 19, - 153, 18, 19, 137, 153, 18, 19, 128, 153, 18, 19, 226, 94, 18, 19, 226, - 173, 18, 19, 224, 140, 18, 19, 224, 125, 18, 19, 224, 26, 18, 19, 224, - 14, 18, 19, 218, 89, 224, 14, 18, 19, 226, 177, 18, 19, 226, 175, 18, 19, - 223, 32, 18, 19, 137, 223, 32, 18, 19, 223, 29, 18, 19, 137, 223, 29, 18, - 19, 223, 28, 18, 19, 137, 223, 28, 18, 19, 223, 27, 18, 19, 137, 223, 27, - 18, 19, 223, 26, 18, 19, 137, 223, 26, 18, 19, 223, 36, 18, 19, 137, 223, - 36, 18, 19, 223, 35, 18, 19, 137, 223, 35, 18, 19, 232, 207, 223, 35, 18, - 19, 198, 18, 19, 253, 243, 198, 18, 19, 223, 37, 18, 19, 252, 50, 198, - 18, 19, 233, 116, 224, 66, 18, 19, 232, 207, 224, 59, 18, 19, 232, 207, - 226, 233, 18, 19, 232, 207, 223, 228, 18, 19, 232, 207, 223, 105, 18, 19, - 232, 207, 224, 58, 18, 19, 232, 207, 226, 97, 18, 19, 224, 246, 18, 19, - 224, 221, 18, 19, 224, 216, 18, 19, 224, 200, 18, 19, 224, 195, 18, 19, - 225, 25, 18, 19, 225, 21, 18, 19, 224, 155, 18, 19, 137, 224, 155, 18, - 19, 224, 154, 18, 19, 137, 224, 154, 18, 19, 224, 153, 18, 19, 137, 224, - 153, 18, 19, 224, 152, 18, 19, 137, 224, 152, 18, 19, 224, 151, 18, 19, - 137, 224, 151, 18, 19, 224, 157, 18, 19, 137, 224, 157, 18, 19, 224, 156, - 18, 19, 137, 224, 156, 18, 19, 225, 27, 18, 19, 218, 25, 18, 19, 218, 74, - 18, 19, 217, 250, 18, 19, 217, 242, 18, 19, 217, 231, 18, 19, 217, 216, - 18, 19, 218, 89, 217, 216, 18, 19, 184, 18, 19, 218, 76, 18, 19, 217, - 171, 18, 19, 137, 217, 171, 18, 19, 217, 170, 18, 19, 137, 217, 170, 18, - 19, 217, 169, 18, 19, 137, 217, 169, 18, 19, 217, 168, 18, 19, 137, 217, - 168, 18, 19, 217, 167, 18, 19, 137, 217, 167, 18, 19, 217, 173, 18, 19, - 137, 217, 173, 18, 19, 217, 172, 18, 19, 137, 217, 172, 18, 19, 232, 207, - 217, 172, 18, 19, 218, 90, 18, 19, 252, 82, 218, 90, 18, 19, 137, 218, - 90, 18, 19, 226, 116, 217, 250, 18, 19, 227, 216, 18, 19, 228, 38, 227, - 216, 18, 19, 137, 235, 122, 18, 19, 227, 255, 18, 19, 227, 147, 18, 19, - 227, 98, 18, 19, 227, 75, 18, 19, 227, 67, 18, 19, 137, 235, 12, 18, 19, - 203, 18, 19, 228, 0, 18, 19, 137, 235, 188, 18, 19, 226, 251, 18, 19, - 137, 226, 251, 18, 19, 152, 18, 19, 137, 152, 18, 19, 128, 152, 18, 19, - 245, 231, 18, 19, 246, 5, 18, 19, 245, 203, 18, 19, 245, 190, 18, 19, - 245, 139, 18, 19, 245, 134, 18, 19, 246, 8, 18, 19, 246, 7, 18, 19, 245, - 77, 18, 19, 137, 245, 77, 18, 19, 246, 74, 18, 19, 222, 22, 18, 19, 233, - 32, 222, 22, 18, 19, 222, 2, 18, 19, 233, 32, 222, 2, 18, 19, 221, 254, - 18, 19, 233, 32, 221, 254, 18, 19, 221, 239, 18, 19, 221, 236, 18, 19, - 222, 35, 18, 19, 222, 34, 18, 19, 221, 215, 18, 19, 137, 221, 215, 18, - 19, 222, 37, 18, 19, 221, 17, 18, 19, 221, 16, 18, 19, 221, 15, 18, 19, - 221, 19, 18, 19, 221, 20, 18, 19, 220, 201, 18, 19, 220, 200, 18, 19, - 220, 199, 18, 19, 220, 202, 18, 19, 231, 102, 243, 162, 18, 19, 231, 102, - 243, 112, 18, 19, 231, 102, 243, 97, 18, 19, 231, 102, 243, 4, 18, 19, - 231, 102, 242, 248, 18, 19, 231, 102, 155, 18, 19, 231, 102, 243, 211, - 18, 19, 231, 102, 243, 225, 18, 19, 231, 101, 243, 225, 18, 19, 243, 90, - 18, 19, 228, 151, 18, 19, 228, 121, 18, 19, 228, 116, 18, 19, 228, 110, - 18, 19, 228, 105, 18, 19, 228, 155, 18, 19, 228, 154, 18, 19, 228, 163, - 18, 19, 221, 151, 18, 19, 221, 149, 18, 19, 221, 148, 18, 19, 221, 152, - 18, 19, 137, 227, 216, 18, 19, 137, 227, 147, 18, 19, 137, 227, 75, 18, - 19, 137, 203, 18, 19, 232, 113, 18, 19, 232, 92, 18, 19, 232, 88, 18, 19, - 232, 84, 18, 19, 232, 80, 18, 19, 232, 115, 18, 19, 232, 114, 18, 19, - 232, 117, 18, 19, 231, 215, 18, 19, 226, 116, 224, 246, 18, 19, 226, 116, - 224, 221, 18, 19, 226, 116, 224, 200, 18, 19, 226, 116, 225, 25, 18, 19, - 218, 178, 222, 22, 18, 19, 218, 178, 222, 2, 18, 19, 218, 178, 221, 239, - 18, 19, 218, 178, 222, 35, 18, 19, 218, 178, 222, 37, 18, 19, 235, 73, - 18, 19, 235, 72, 18, 19, 235, 71, 18, 19, 235, 70, 18, 19, 235, 79, 18, - 19, 235, 78, 18, 19, 235, 80, 18, 19, 222, 36, 222, 22, 18, 19, 222, 36, - 222, 2, 18, 19, 222, 36, 221, 254, 18, 19, 222, 36, 221, 239, 18, 19, - 222, 36, 221, 236, 18, 19, 222, 36, 222, 35, 18, 19, 222, 36, 222, 34, - 18, 19, 222, 36, 222, 37, 18, 19, 254, 185, 253, 204, 18, 19, 252, 50, - 73, 18, 19, 252, 50, 72, 18, 19, 252, 50, 74, 18, 19, 252, 50, 60, 18, - 19, 252, 50, 218, 227, 18, 19, 252, 50, 218, 204, 18, 19, 252, 50, 218, - 187, 18, 19, 252, 50, 219, 7, 18, 19, 252, 50, 232, 141, 18, 19, 252, 50, - 232, 62, 18, 19, 252, 50, 231, 204, 18, 19, 252, 50, 208, 18, 19, 252, - 50, 236, 184, 18, 19, 252, 50, 236, 113, 18, 19, 252, 50, 236, 57, 18, - 19, 252, 50, 175, 18, 19, 226, 116, 243, 162, 18, 19, 226, 116, 243, 112, - 18, 19, 226, 116, 243, 4, 18, 19, 226, 116, 155, 18, 19, 64, 244, 109, - 18, 19, 64, 244, 112, 18, 19, 64, 244, 116, 18, 19, 64, 244, 115, 18, 19, - 64, 244, 113, 18, 19, 64, 244, 125, 18, 19, 64, 227, 22, 18, 19, 64, 227, - 75, 18, 19, 64, 227, 216, 18, 19, 64, 227, 200, 18, 19, 64, 227, 147, 18, - 19, 64, 203, 18, 19, 64, 218, 165, 18, 19, 64, 218, 187, 18, 19, 64, 218, - 227, 18, 19, 64, 218, 224, 18, 19, 64, 218, 204, 18, 19, 64, 219, 7, 18, - 19, 64, 242, 147, 18, 19, 64, 242, 148, 18, 19, 64, 242, 151, 18, 19, 64, - 242, 150, 18, 19, 64, 242, 149, 18, 19, 64, 242, 153, 18, 19, 64, 221, - 223, 18, 19, 64, 221, 239, 18, 19, 64, 222, 22, 18, 19, 64, 222, 21, 18, - 19, 64, 222, 2, 18, 19, 64, 222, 35, 18, 19, 64, 221, 3, 18, 19, 64, 221, - 11, 18, 19, 64, 221, 26, 18, 19, 64, 221, 25, 18, 19, 64, 221, 12, 18, - 19, 64, 221, 29, 18, 19, 64, 228, 202, 18, 19, 64, 229, 37, 18, 19, 64, - 229, 198, 18, 19, 64, 229, 191, 18, 19, 64, 229, 108, 18, 19, 64, 187, - 18, 19, 64, 230, 59, 18, 19, 64, 244, 17, 18, 19, 64, 244, 68, 18, 19, - 64, 244, 191, 18, 19, 64, 244, 184, 18, 19, 64, 244, 103, 18, 19, 64, - 245, 0, 18, 19, 64, 236, 120, 18, 19, 64, 236, 125, 18, 19, 64, 236, 137, - 18, 19, 64, 236, 136, 18, 19, 64, 236, 130, 18, 19, 64, 236, 149, 18, 19, - 64, 236, 69, 18, 19, 64, 236, 70, 18, 19, 64, 236, 73, 18, 19, 64, 236, - 72, 18, 19, 64, 236, 71, 18, 19, 64, 236, 74, 18, 19, 64, 236, 75, 18, - 19, 64, 231, 144, 18, 19, 64, 231, 204, 18, 19, 64, 232, 141, 18, 19, 64, - 232, 139, 18, 19, 64, 232, 62, 18, 19, 64, 208, 18, 19, 64, 233, 99, 18, - 19, 64, 233, 136, 18, 19, 64, 234, 25, 18, 19, 64, 234, 16, 18, 19, 64, - 233, 196, 18, 19, 64, 196, 18, 19, 64, 217, 200, 18, 19, 64, 217, 231, - 18, 19, 64, 218, 25, 18, 19, 64, 218, 22, 18, 19, 64, 217, 250, 18, 19, - 64, 184, 18, 19, 64, 237, 43, 18, 19, 226, 116, 237, 43, 18, 19, 64, 237, - 59, 18, 19, 64, 237, 114, 18, 19, 64, 237, 113, 18, 19, 64, 237, 98, 18, - 19, 226, 116, 237, 98, 18, 19, 64, 237, 123, 18, 19, 64, 237, 72, 18, 19, - 64, 237, 76, 18, 19, 64, 237, 86, 18, 19, 64, 237, 85, 18, 19, 64, 237, - 84, 18, 19, 64, 237, 87, 18, 19, 64, 234, 231, 18, 19, 64, 235, 12, 18, - 19, 64, 235, 122, 18, 19, 64, 235, 118, 18, 19, 64, 235, 67, 18, 19, 64, - 235, 188, 18, 19, 64, 248, 171, 18, 19, 64, 248, 172, 18, 19, 64, 248, - 175, 18, 19, 64, 248, 174, 18, 19, 64, 248, 173, 18, 19, 64, 248, 176, - 18, 19, 64, 235, 69, 18, 19, 64, 235, 71, 18, 19, 64, 235, 75, 18, 19, - 64, 235, 74, 18, 19, 64, 235, 73, 18, 19, 64, 235, 79, 18, 19, 64, 221, - 146, 18, 19, 64, 221, 148, 18, 19, 64, 221, 151, 18, 19, 64, 221, 150, - 18, 19, 64, 221, 149, 18, 19, 64, 221, 152, 18, 19, 64, 221, 142, 18, 19, - 64, 221, 143, 18, 19, 64, 221, 154, 18, 19, 64, 221, 153, 18, 19, 64, - 221, 144, 18, 19, 64, 221, 155, 18, 19, 64, 217, 13, 18, 19, 64, 217, 21, - 18, 19, 64, 217, 92, 18, 19, 64, 217, 90, 18, 19, 64, 217, 42, 18, 19, - 64, 217, 114, 18, 19, 64, 217, 157, 18, 19, 64, 66, 217, 157, 18, 19, 64, - 247, 65, 18, 19, 64, 247, 66, 18, 19, 64, 247, 73, 18, 19, 64, 247, 72, - 18, 19, 64, 247, 68, 18, 19, 64, 247, 74, 18, 19, 64, 223, 103, 18, 19, - 64, 224, 26, 18, 19, 64, 226, 94, 18, 19, 64, 226, 84, 18, 19, 64, 224, - 140, 18, 19, 64, 226, 177, 18, 19, 64, 224, 170, 18, 19, 64, 224, 200, - 18, 19, 64, 224, 246, 18, 19, 64, 224, 244, 18, 19, 64, 224, 221, 18, 19, - 64, 225, 25, 18, 19, 64, 225, 27, 18, 19, 64, 221, 36, 18, 19, 64, 221, - 38, 18, 19, 64, 221, 50, 18, 19, 64, 221, 49, 18, 19, 64, 221, 39, 18, - 19, 64, 221, 55, 18, 19, 64, 250, 253, 18, 19, 64, 251, 11, 18, 19, 64, - 251, 46, 18, 19, 64, 251, 43, 18, 19, 64, 251, 31, 18, 19, 64, 251, 69, - 18, 19, 64, 221, 5, 18, 19, 64, 221, 6, 18, 19, 64, 221, 9, 18, 19, 64, - 221, 8, 18, 19, 64, 221, 7, 18, 19, 64, 221, 10, 18, 19, 251, 32, 55, 18, - 19, 245, 90, 223, 136, 18, 19, 228, 147, 18, 19, 232, 112, 18, 19, 231, - 212, 18, 19, 231, 211, 18, 19, 231, 210, 18, 19, 231, 209, 18, 19, 231, - 214, 18, 19, 231, 213, 18, 19, 218, 178, 221, 213, 18, 19, 218, 178, 221, - 212, 18, 19, 218, 178, 221, 211, 18, 19, 218, 178, 221, 210, 18, 19, 218, - 178, 221, 209, 18, 19, 218, 178, 221, 216, 18, 19, 218, 178, 221, 215, - 18, 19, 218, 178, 39, 222, 37, 18, 19, 252, 50, 219, 40, 230, 164, 223, - 255, 78, 230, 164, 1, 252, 122, 230, 164, 1, 234, 222, 230, 164, 1, 245, - 230, 230, 164, 1, 226, 161, 230, 164, 1, 232, 25, 230, 164, 1, 220, 122, - 230, 164, 1, 249, 185, 230, 164, 1, 221, 173, 230, 164, 1, 250, 177, 230, - 164, 1, 251, 89, 230, 164, 1, 233, 91, 230, 164, 1, 244, 53, 230, 164, 1, - 232, 105, 230, 164, 1, 223, 131, 230, 164, 1, 227, 18, 230, 164, 1, 254, - 193, 230, 164, 1, 230, 131, 230, 164, 1, 220, 50, 230, 164, 1, 247, 14, - 230, 164, 1, 237, 165, 230, 164, 1, 247, 15, 230, 164, 1, 230, 105, 230, - 164, 1, 220, 103, 230, 164, 1, 238, 5, 230, 164, 1, 247, 12, 230, 164, 1, - 229, 184, 230, 164, 245, 229, 78, 230, 164, 210, 245, 229, 78, 157, 1, - 245, 220, 245, 212, 245, 232, 246, 74, 157, 1, 216, 216, 157, 1, 220, 36, - 220, 51, 68, 157, 1, 217, 202, 157, 1, 218, 90, 157, 1, 219, 40, 157, 1, - 221, 218, 221, 217, 221, 234, 157, 1, 246, 118, 157, 1, 254, 106, 60, - 157, 1, 230, 94, 74, 157, 1, 255, 3, 60, 157, 1, 254, 219, 157, 1, 234, - 254, 74, 157, 1, 224, 185, 74, 157, 1, 74, 157, 1, 230, 167, 157, 1, 230, - 138, 157, 1, 227, 244, 227, 253, 227, 195, 152, 157, 1, 236, 195, 157, 1, - 251, 87, 157, 1, 236, 196, 237, 17, 157, 1, 245, 67, 157, 1, 246, 185, - 157, 1, 244, 187, 243, 231, 245, 67, 157, 1, 244, 220, 157, 1, 218, 160, - 218, 155, 219, 40, 157, 1, 243, 203, 243, 225, 157, 1, 243, 207, 243, - 225, 157, 1, 235, 0, 243, 225, 157, 1, 224, 188, 243, 225, 157, 1, 232, - 203, 231, 74, 232, 204, 207, 157, 1, 224, 186, 207, 157, 1, 247, 140, - 157, 1, 237, 148, 237, 152, 237, 142, 72, 157, 1, 73, 157, 1, 237, 106, - 237, 126, 157, 1, 244, 173, 157, 1, 235, 1, 254, 234, 157, 1, 224, 190, - 60, 157, 1, 237, 135, 246, 164, 157, 1, 229, 155, 229, 173, 230, 59, 157, - 1, 254, 162, 246, 163, 157, 1, 224, 3, 198, 157, 1, 224, 129, 234, 253, - 198, 157, 1, 224, 184, 198, 157, 1, 251, 202, 157, 1, 217, 157, 157, 1, - 221, 159, 221, 166, 220, 190, 222, 201, 157, 1, 224, 183, 222, 201, 157, - 1, 250, 46, 157, 1, 252, 107, 252, 110, 252, 56, 253, 204, 157, 1, 224, - 189, 253, 204, 157, 1, 247, 139, 157, 1, 230, 115, 157, 1, 246, 238, 246, - 240, 73, 157, 1, 234, 81, 234, 87, 189, 157, 1, 234, 255, 189, 157, 1, - 224, 187, 189, 157, 1, 235, 136, 235, 171, 235, 4, 153, 157, 1, 247, 141, - 157, 1, 237, 203, 157, 1, 237, 204, 157, 1, 249, 196, 249, 201, 250, 46, - 157, 1, 230, 90, 246, 117, 74, 157, 1, 247, 11, 157, 1, 237, 164, 157, 1, - 250, 63, 157, 1, 251, 160, 157, 1, 251, 98, 157, 1, 223, 161, 157, 1, - 234, 252, 157, 1, 224, 182, 157, 1, 242, 64, 157, 1, 228, 163, 157, 1, - 218, 151, 157, 224, 109, 228, 196, 157, 233, 85, 228, 196, 157, 250, 101, - 228, 196, 157, 254, 33, 100, 157, 220, 227, 100, 157, 252, 121, 100, 222, - 140, 1, 60, 222, 140, 1, 72, 222, 140, 1, 68, 222, 140, 1, 175, 222, 140, - 1, 245, 0, 222, 140, 1, 232, 115, 222, 140, 1, 222, 155, 222, 140, 1, - 249, 207, 222, 140, 1, 208, 222, 140, 1, 187, 222, 140, 1, 252, 237, 222, - 140, 1, 196, 222, 140, 1, 184, 222, 140, 1, 235, 188, 222, 140, 1, 219, - 7, 222, 140, 1, 226, 177, 222, 140, 1, 155, 222, 140, 29, 5, 72, 222, - 140, 29, 5, 68, 222, 140, 5, 219, 82, 243, 184, 1, 60, 243, 184, 1, 72, - 243, 184, 1, 68, 243, 184, 1, 175, 243, 184, 1, 245, 0, 243, 184, 1, 232, - 115, 243, 184, 1, 222, 155, 243, 184, 1, 249, 207, 243, 184, 1, 208, 243, - 184, 1, 187, 243, 184, 1, 252, 237, 243, 184, 1, 196, 243, 184, 1, 184, - 243, 184, 1, 203, 243, 184, 1, 235, 188, 243, 184, 1, 219, 7, 243, 184, - 1, 226, 177, 243, 184, 1, 155, 243, 184, 29, 5, 72, 243, 184, 29, 5, 68, - 243, 184, 5, 230, 14, 229, 122, 224, 109, 228, 196, 229, 122, 51, 228, - 196, 251, 245, 1, 60, 251, 245, 1, 72, 251, 245, 1, 68, 251, 245, 1, 175, - 251, 245, 1, 245, 0, 251, 245, 1, 232, 115, 251, 245, 1, 222, 155, 251, - 245, 1, 249, 207, 251, 245, 1, 208, 251, 245, 1, 187, 251, 245, 1, 252, - 237, 251, 245, 1, 196, 251, 245, 1, 184, 251, 245, 1, 203, 251, 245, 1, - 235, 188, 251, 245, 1, 219, 7, 251, 245, 1, 226, 177, 251, 245, 1, 155, - 251, 245, 29, 5, 72, 251, 245, 29, 5, 68, 222, 139, 1, 60, 222, 139, 1, - 72, 222, 139, 1, 68, 222, 139, 1, 175, 222, 139, 1, 245, 0, 222, 139, 1, - 232, 115, 222, 139, 1, 222, 155, 222, 139, 1, 249, 207, 222, 139, 1, 208, - 222, 139, 1, 187, 222, 139, 1, 252, 237, 222, 139, 1, 196, 222, 139, 1, - 184, 222, 139, 1, 235, 188, 222, 139, 1, 219, 7, 222, 139, 1, 226, 177, - 222, 139, 29, 5, 72, 222, 139, 29, 5, 68, 79, 1, 175, 79, 1, 236, 149, - 79, 1, 236, 57, 79, 1, 236, 125, 79, 1, 232, 84, 79, 1, 251, 169, 79, 1, - 251, 69, 79, 1, 250, 182, 79, 1, 251, 11, 79, 1, 231, 56, 79, 1, 249, - 207, 79, 1, 221, 19, 79, 1, 248, 167, 79, 1, 221, 15, 79, 1, 231, 207, - 79, 1, 222, 155, 79, 1, 222, 35, 79, 1, 101, 79, 1, 221, 239, 79, 1, 231, - 204, 79, 1, 252, 237, 79, 1, 229, 141, 79, 1, 229, 37, 79, 1, 229, 118, - 79, 1, 233, 136, 79, 1, 217, 231, 79, 1, 227, 75, 79, 1, 235, 12, 79, 1, - 219, 72, 79, 1, 225, 25, 79, 1, 223, 182, 79, 1, 226, 177, 79, 1, 155, - 79, 1, 235, 188, 79, 1, 228, 155, 79, 237, 214, 29, 228, 141, 79, 237, - 214, 29, 228, 154, 79, 237, 214, 29, 228, 121, 79, 237, 214, 29, 228, - 116, 79, 237, 214, 29, 228, 98, 79, 237, 214, 29, 228, 73, 79, 237, 214, - 29, 228, 61, 79, 237, 214, 29, 228, 60, 79, 237, 214, 29, 226, 243, 79, - 237, 214, 29, 226, 236, 79, 237, 214, 29, 234, 198, 79, 237, 214, 29, - 234, 189, 79, 237, 214, 29, 228, 136, 79, 237, 214, 29, 228, 147, 79, - 237, 214, 29, 228, 106, 220, 198, 107, 79, 237, 214, 29, 228, 106, 220, - 198, 103, 79, 237, 214, 29, 228, 137, 79, 29, 237, 202, 254, 69, 79, 29, - 237, 202, 255, 58, 79, 29, 5, 255, 58, 79, 29, 5, 72, 79, 29, 5, 237, - 255, 79, 29, 5, 218, 90, 79, 29, 5, 217, 166, 79, 29, 5, 68, 79, 29, 5, - 220, 23, 79, 29, 5, 220, 123, 79, 29, 5, 230, 167, 79, 29, 5, 184, 79, - 29, 5, 238, 26, 79, 29, 5, 73, 79, 29, 5, 254, 234, 79, 29, 5, 254, 196, - 79, 29, 5, 230, 127, 79, 29, 5, 253, 232, 79, 5, 232, 37, 79, 5, 227, - 214, 79, 5, 217, 176, 79, 5, 233, 55, 79, 5, 221, 80, 79, 5, 252, 203, - 79, 5, 227, 71, 79, 5, 221, 138, 79, 5, 236, 239, 79, 5, 254, 198, 79, 5, - 226, 141, 226, 137, 79, 5, 219, 79, 79, 5, 250, 179, 79, 5, 252, 183, 79, - 5, 236, 142, 79, 5, 252, 199, 79, 5, 251, 156, 229, 77, 235, 239, 79, 5, - 235, 100, 221, 122, 79, 5, 252, 96, 79, 5, 229, 120, 233, 97, 79, 5, 236, - 40, 79, 250, 78, 16, 227, 142, 79, 5, 253, 218, 79, 5, 253, 235, 79, 20, - 217, 84, 79, 20, 107, 79, 20, 103, 79, 20, 160, 79, 20, 154, 79, 20, 174, - 79, 20, 182, 79, 20, 191, 79, 20, 185, 79, 20, 190, 79, 16, 235, 100, - 253, 237, 224, 16, 79, 16, 235, 100, 253, 237, 233, 72, 79, 16, 235, 100, - 253, 237, 229, 76, 79, 16, 235, 100, 253, 237, 252, 123, 79, 16, 235, - 100, 253, 237, 251, 233, 79, 16, 235, 100, 253, 237, 229, 1, 79, 16, 235, - 100, 253, 237, 228, 251, 79, 16, 235, 100, 253, 237, 228, 249, 79, 16, - 235, 100, 253, 237, 228, 255, 79, 16, 235, 100, 253, 237, 228, 253, 77, - 252, 66, 77, 246, 208, 77, 250, 168, 77, 245, 90, 223, 136, 77, 250, 175, - 77, 245, 116, 248, 143, 77, 221, 137, 224, 21, 242, 121, 77, 224, 139, 4, - 252, 26, 234, 63, 77, 234, 84, 250, 168, 77, 234, 84, 245, 90, 223, 136, - 77, 232, 23, 77, 245, 103, 41, 226, 74, 107, 77, 245, 103, 41, 226, 74, - 103, 77, 245, 103, 41, 226, 74, 160, 77, 29, 225, 54, 77, 20, 217, 84, - 77, 20, 107, 77, 20, 103, 77, 20, 160, 77, 20, 154, 77, 20, 174, 77, 20, - 182, 77, 20, 191, 77, 20, 185, 77, 20, 190, 77, 1, 60, 77, 1, 73, 77, 1, - 72, 77, 1, 74, 77, 1, 68, 77, 1, 230, 167, 77, 1, 220, 110, 77, 1, 246, - 250, 77, 1, 208, 77, 1, 254, 123, 77, 1, 252, 237, 77, 1, 187, 77, 1, - 228, 155, 77, 1, 245, 0, 77, 1, 196, 77, 1, 235, 188, 77, 1, 226, 177, - 77, 1, 225, 25, 77, 1, 222, 155, 77, 1, 249, 207, 77, 1, 251, 69, 77, 1, - 237, 123, 77, 1, 184, 77, 1, 203, 77, 1, 219, 7, 77, 1, 246, 8, 77, 1, - 175, 77, 1, 236, 149, 77, 1, 221, 55, 77, 1, 217, 114, 77, 1, 243, 211, - 77, 1, 217, 14, 77, 1, 235, 79, 77, 1, 217, 67, 77, 1, 251, 31, 77, 1, - 221, 137, 171, 29, 55, 77, 1, 221, 137, 73, 77, 1, 221, 137, 72, 77, 1, - 221, 137, 74, 77, 1, 221, 137, 68, 77, 1, 221, 137, 230, 167, 77, 1, 221, - 137, 220, 110, 77, 1, 221, 137, 254, 123, 77, 1, 221, 137, 252, 237, 77, - 1, 221, 137, 187, 77, 1, 221, 137, 228, 155, 77, 1, 221, 137, 245, 0, 77, - 1, 221, 137, 196, 77, 1, 221, 137, 222, 155, 77, 1, 221, 137, 249, 207, - 77, 1, 221, 137, 251, 69, 77, 1, 221, 137, 237, 123, 77, 1, 221, 137, - 221, 55, 77, 1, 221, 137, 184, 77, 1, 221, 137, 219, 7, 77, 1, 221, 137, - 175, 77, 1, 221, 137, 244, 253, 77, 1, 221, 137, 243, 211, 77, 1, 221, - 137, 237, 97, 77, 1, 221, 137, 232, 60, 77, 1, 221, 137, 247, 74, 77, 1, - 224, 139, 73, 77, 1, 224, 139, 72, 77, 1, 224, 139, 237, 133, 77, 1, 224, - 139, 220, 110, 77, 1, 224, 139, 68, 77, 1, 224, 139, 254, 123, 77, 1, - 224, 139, 175, 77, 1, 224, 139, 245, 0, 77, 1, 224, 139, 155, 77, 1, 224, - 139, 187, 77, 1, 224, 139, 225, 25, 77, 1, 224, 139, 222, 155, 77, 1, - 224, 139, 249, 207, 77, 1, 224, 139, 237, 123, 77, 1, 224, 139, 246, 8, - 77, 1, 224, 139, 244, 253, 77, 1, 224, 139, 243, 211, 77, 1, 224, 139, - 221, 55, 77, 1, 224, 139, 217, 114, 77, 1, 224, 139, 228, 0, 77, 1, 224, - 139, 251, 69, 77, 1, 224, 139, 217, 80, 77, 1, 234, 84, 72, 77, 1, 234, - 84, 175, 77, 1, 234, 84, 203, 77, 1, 234, 84, 246, 8, 77, 1, 234, 84, - 217, 80, 77, 1, 254, 161, 244, 238, 254, 96, 107, 77, 1, 254, 161, 244, - 238, 219, 78, 107, 77, 1, 254, 161, 244, 238, 249, 174, 77, 1, 254, 161, - 244, 238, 220, 120, 77, 1, 254, 161, 244, 238, 237, 170, 220, 120, 77, 1, - 254, 161, 244, 238, 252, 212, 77, 1, 254, 161, 244, 238, 148, 252, 212, - 77, 1, 254, 161, 244, 238, 60, 77, 1, 254, 161, 244, 238, 72, 77, 1, 254, - 161, 244, 238, 175, 77, 1, 254, 161, 244, 238, 232, 115, 77, 1, 254, 161, - 244, 238, 251, 169, 77, 1, 254, 161, 244, 238, 221, 29, 77, 1, 254, 161, - 244, 238, 221, 19, 77, 1, 254, 161, 244, 238, 249, 132, 77, 1, 254, 161, - 244, 238, 231, 217, 77, 1, 254, 161, 244, 238, 222, 155, 77, 1, 254, 161, - 244, 238, 249, 207, 77, 1, 254, 161, 244, 238, 187, 77, 1, 254, 161, 244, - 238, 229, 141, 77, 1, 254, 161, 244, 238, 223, 218, 77, 1, 254, 161, 244, - 238, 217, 80, 77, 1, 254, 161, 244, 238, 217, 114, 77, 1, 254, 161, 244, - 238, 254, 202, 77, 1, 221, 137, 254, 161, 244, 238, 222, 155, 77, 1, 221, - 137, 254, 161, 244, 238, 217, 80, 77, 1, 234, 84, 254, 161, 244, 238, - 244, 125, 77, 1, 234, 84, 254, 161, 244, 238, 232, 115, 77, 1, 234, 84, - 254, 161, 244, 238, 251, 169, 77, 1, 234, 84, 254, 161, 244, 238, 237, - 103, 77, 1, 234, 84, 254, 161, 244, 238, 221, 29, 77, 1, 234, 84, 254, - 161, 244, 238, 249, 116, 77, 1, 234, 84, 254, 161, 244, 238, 222, 155, - 77, 1, 234, 84, 254, 161, 244, 238, 249, 36, 77, 1, 234, 84, 254, 161, - 244, 238, 223, 218, 77, 1, 234, 84, 254, 161, 244, 238, 250, 57, 77, 1, - 234, 84, 254, 161, 244, 238, 217, 80, 77, 1, 234, 84, 254, 161, 244, 238, - 217, 114, 77, 1, 254, 161, 244, 238, 144, 68, 77, 1, 254, 161, 244, 238, - 144, 184, 77, 1, 234, 84, 254, 161, 244, 238, 252, 94, 77, 1, 254, 161, - 244, 238, 249, 197, 77, 1, 234, 84, 254, 161, 244, 238, 235, 79, 18, 19, - 230, 63, 18, 19, 253, 212, 18, 19, 255, 14, 18, 19, 218, 229, 18, 19, - 229, 7, 18, 19, 229, 205, 18, 19, 228, 172, 18, 19, 222, 96, 18, 19, 236, - 191, 18, 19, 235, 232, 18, 19, 234, 45, 18, 19, 231, 172, 18, 19, 232, - 199, 18, 19, 235, 132, 18, 19, 224, 1, 18, 19, 226, 118, 18, 19, 224, - 175, 18, 19, 224, 249, 18, 19, 224, 150, 18, 19, 217, 208, 18, 19, 218, - 30, 18, 19, 227, 222, 18, 19, 231, 82, 18, 19, 230, 155, 231, 82, 18, 19, - 231, 81, 18, 19, 230, 155, 231, 81, 18, 19, 231, 80, 18, 19, 230, 155, - 231, 80, 18, 19, 231, 79, 18, 19, 230, 155, 231, 79, 18, 19, 226, 248, - 18, 19, 226, 247, 18, 19, 226, 246, 18, 19, 226, 245, 18, 19, 226, 244, - 18, 19, 226, 252, 18, 19, 230, 155, 230, 59, 18, 19, 230, 155, 222, 201, - 18, 19, 230, 155, 237, 17, 18, 19, 230, 155, 251, 202, 18, 19, 230, 155, - 189, 18, 19, 230, 155, 207, 18, 19, 230, 155, 198, 18, 19, 230, 155, 225, - 27, 18, 19, 247, 4, 219, 40, 18, 19, 218, 215, 219, 40, 18, 19, 39, 3, - 227, 93, 18, 19, 39, 227, 241, 248, 145, 18, 19, 228, 38, 226, 249, 18, - 19, 137, 234, 248, 18, 19, 137, 235, 187, 18, 19, 221, 214, 18, 19, 221, - 216, 18, 19, 221, 13, 18, 19, 221, 14, 18, 19, 221, 18, 18, 19, 221, 145, - 18, 19, 221, 147, 18, 19, 226, 116, 224, 155, 18, 19, 226, 116, 224, 195, - 18, 19, 226, 116, 242, 248, 18, 19, 64, 243, 238, 18, 19, 64, 249, 60, - 244, 184, 18, 19, 64, 244, 253, 18, 19, 64, 243, 243, 18, 19, 226, 116, - 237, 27, 18, 19, 64, 237, 25, 18, 19, 252, 139, 249, 60, 153, 18, 19, - 252, 139, 249, 60, 152, 18, 19, 64, 249, 55, 198, 195, 219, 59, 235, 84, - 195, 1, 175, 195, 1, 236, 149, 195, 1, 245, 0, 195, 1, 244, 125, 195, 1, - 232, 115, 195, 1, 251, 169, 195, 1, 251, 69, 195, 1, 237, 123, 195, 1, - 237, 103, 195, 1, 218, 47, 195, 1, 222, 155, 195, 1, 222, 35, 195, 1, - 249, 207, 195, 1, 249, 36, 195, 1, 208, 195, 1, 187, 195, 1, 229, 141, - 195, 1, 252, 237, 195, 1, 252, 94, 195, 1, 196, 195, 1, 184, 195, 1, 203, - 195, 1, 235, 188, 195, 1, 219, 7, 195, 1, 225, 25, 195, 1, 223, 218, 195, - 1, 226, 177, 195, 1, 155, 195, 29, 5, 60, 195, 29, 5, 72, 195, 29, 5, 68, - 195, 29, 5, 246, 250, 195, 29, 5, 254, 196, 195, 29, 5, 230, 127, 195, - 29, 5, 253, 232, 195, 29, 5, 73, 195, 29, 5, 74, 195, 223, 97, 1, 184, - 195, 223, 97, 1, 203, 195, 223, 97, 1, 219, 7, 195, 3, 1, 175, 195, 3, 1, - 232, 115, 195, 3, 1, 254, 95, 195, 3, 1, 222, 155, 195, 3, 1, 208, 195, - 3, 1, 187, 195, 3, 1, 196, 195, 3, 1, 203, 195, 3, 1, 235, 188, 195, 5, - 233, 89, 195, 5, 236, 173, 195, 5, 226, 176, 195, 5, 234, 248, 195, 246, - 95, 78, 195, 228, 82, 78, 195, 20, 217, 84, 195, 20, 107, 195, 20, 103, - 195, 20, 160, 195, 20, 154, 195, 20, 174, 195, 20, 182, 195, 20, 191, - 195, 20, 185, 195, 20, 190, 37, 235, 123, 1, 175, 37, 235, 123, 1, 218, - 138, 37, 235, 123, 1, 232, 115, 37, 235, 123, 1, 221, 55, 37, 235, 123, - 1, 226, 177, 37, 235, 123, 1, 184, 37, 235, 123, 1, 222, 155, 37, 235, - 123, 1, 222, 35, 37, 235, 123, 1, 235, 188, 37, 235, 123, 1, 187, 37, - 235, 123, 1, 229, 141, 37, 235, 123, 1, 196, 37, 235, 123, 1, 246, 8, 37, - 235, 123, 1, 219, 189, 37, 235, 123, 1, 155, 37, 235, 123, 1, 228, 155, - 37, 235, 123, 1, 236, 149, 37, 235, 123, 1, 221, 47, 37, 235, 123, 1, - 208, 37, 235, 123, 1, 60, 37, 235, 123, 1, 72, 37, 235, 123, 1, 246, 250, - 37, 235, 123, 1, 246, 239, 37, 235, 123, 1, 68, 37, 235, 123, 1, 230, - 127, 37, 235, 123, 1, 74, 37, 235, 123, 1, 220, 110, 37, 235, 123, 1, 73, - 37, 235, 123, 1, 253, 231, 37, 235, 123, 1, 254, 196, 37, 235, 123, 1, - 221, 130, 37, 235, 123, 1, 221, 129, 37, 235, 123, 1, 221, 128, 37, 235, - 123, 1, 221, 127, 37, 235, 123, 1, 221, 126, 146, 37, 151, 1, 116, 228, - 155, 146, 37, 151, 1, 109, 228, 155, 146, 37, 151, 1, 116, 175, 146, 37, - 151, 1, 116, 218, 138, 146, 37, 151, 1, 116, 232, 115, 146, 37, 151, 1, - 109, 175, 146, 37, 151, 1, 109, 218, 138, 146, 37, 151, 1, 109, 232, 115, - 146, 37, 151, 1, 116, 221, 55, 146, 37, 151, 1, 116, 226, 177, 146, 37, - 151, 1, 116, 184, 146, 37, 151, 1, 109, 221, 55, 146, 37, 151, 1, 109, - 226, 177, 146, 37, 151, 1, 109, 184, 146, 37, 151, 1, 116, 222, 155, 146, - 37, 151, 1, 116, 222, 35, 146, 37, 151, 1, 116, 208, 146, 37, 151, 1, - 109, 222, 155, 146, 37, 151, 1, 109, 222, 35, 146, 37, 151, 1, 109, 208, - 146, 37, 151, 1, 116, 187, 146, 37, 151, 1, 116, 229, 141, 146, 37, 151, - 1, 116, 196, 146, 37, 151, 1, 109, 187, 146, 37, 151, 1, 109, 229, 141, - 146, 37, 151, 1, 109, 196, 146, 37, 151, 1, 116, 246, 8, 146, 37, 151, 1, - 116, 219, 189, 146, 37, 151, 1, 116, 235, 188, 146, 37, 151, 1, 109, 246, - 8, 146, 37, 151, 1, 109, 219, 189, 146, 37, 151, 1, 109, 235, 188, 146, - 37, 151, 1, 116, 155, 146, 37, 151, 1, 116, 249, 207, 146, 37, 151, 1, - 116, 252, 237, 146, 37, 151, 1, 109, 155, 146, 37, 151, 1, 109, 249, 207, - 146, 37, 151, 1, 109, 252, 237, 146, 37, 151, 1, 116, 235, 236, 146, 37, - 151, 1, 116, 218, 111, 146, 37, 151, 1, 109, 235, 236, 146, 37, 151, 1, - 109, 218, 111, 146, 37, 151, 1, 116, 223, 102, 146, 37, 151, 1, 109, 223, - 102, 146, 37, 151, 29, 5, 29, 224, 181, 146, 37, 151, 29, 5, 255, 58, - 146, 37, 151, 29, 5, 237, 255, 146, 37, 151, 29, 5, 68, 146, 37, 151, 29, - 5, 220, 23, 146, 37, 151, 29, 5, 73, 146, 37, 151, 29, 5, 254, 234, 146, - 37, 151, 29, 5, 74, 146, 37, 151, 29, 5, 230, 185, 146, 37, 151, 29, 5, - 220, 110, 146, 37, 151, 29, 5, 253, 212, 146, 37, 151, 29, 5, 255, 14, - 146, 37, 151, 29, 5, 220, 16, 146, 37, 151, 29, 5, 230, 63, 146, 37, 151, - 29, 5, 230, 182, 146, 37, 151, 29, 5, 220, 107, 146, 37, 151, 29, 5, 237, - 133, 146, 37, 151, 1, 39, 216, 216, 146, 37, 151, 1, 39, 232, 117, 146, - 37, 151, 1, 39, 207, 146, 37, 151, 1, 39, 189, 146, 37, 151, 1, 39, 237, - 17, 146, 37, 151, 1, 39, 250, 46, 146, 37, 151, 1, 39, 253, 204, 146, 37, - 151, 145, 234, 67, 146, 37, 151, 145, 234, 66, 146, 37, 151, 20, 217, 84, - 146, 37, 151, 20, 107, 146, 37, 151, 20, 103, 146, 37, 151, 20, 160, 146, - 37, 151, 20, 154, 146, 37, 151, 20, 174, 146, 37, 151, 20, 182, 146, 37, - 151, 20, 191, 146, 37, 151, 20, 185, 146, 37, 151, 20, 190, 146, 37, 151, - 83, 20, 107, 146, 37, 151, 5, 235, 177, 146, 37, 151, 5, 235, 176, 79, - 16, 229, 211, 79, 16, 233, 73, 236, 55, 79, 16, 229, 77, 236, 55, 79, 16, - 252, 124, 236, 55, 79, 16, 251, 234, 236, 55, 79, 16, 229, 2, 236, 55, - 79, 16, 228, 252, 236, 55, 79, 16, 228, 250, 236, 55, 79, 16, 229, 0, - 236, 55, 79, 16, 228, 254, 236, 55, 79, 16, 249, 163, 236, 55, 79, 16, - 249, 159, 236, 55, 79, 16, 249, 158, 236, 55, 79, 16, 249, 161, 236, 55, - 79, 16, 249, 160, 236, 55, 79, 16, 249, 157, 236, 55, 79, 16, 220, 230, - 79, 16, 233, 73, 227, 70, 79, 16, 229, 77, 227, 70, 79, 16, 252, 124, - 227, 70, 79, 16, 251, 234, 227, 70, 79, 16, 229, 2, 227, 70, 79, 16, 228, - 252, 227, 70, 79, 16, 228, 250, 227, 70, 79, 16, 229, 0, 227, 70, 79, 16, - 228, 254, 227, 70, 79, 16, 249, 163, 227, 70, 79, 16, 249, 159, 227, 70, - 79, 16, 249, 158, 227, 70, 79, 16, 249, 161, 227, 70, 79, 16, 249, 160, - 227, 70, 79, 16, 249, 157, 227, 70, 251, 246, 1, 175, 251, 246, 1, 245, - 0, 251, 246, 1, 232, 115, 251, 246, 1, 232, 87, 251, 246, 1, 187, 251, - 246, 1, 252, 237, 251, 246, 1, 196, 251, 246, 1, 233, 102, 251, 246, 1, - 222, 155, 251, 246, 1, 249, 207, 251, 246, 1, 208, 251, 246, 1, 231, 171, - 251, 246, 1, 251, 169, 251, 246, 1, 237, 123, 251, 246, 1, 231, 77, 251, - 246, 1, 231, 75, 251, 246, 1, 184, 251, 246, 1, 203, 251, 246, 1, 235, - 188, 251, 246, 1, 219, 189, 251, 246, 1, 226, 177, 251, 246, 1, 60, 251, - 246, 1, 155, 251, 246, 29, 5, 72, 251, 246, 29, 5, 68, 251, 246, 29, 5, - 73, 251, 246, 29, 5, 74, 251, 246, 29, 5, 254, 234, 251, 246, 230, 24, - 251, 246, 246, 190, 117, 226, 86, 37, 83, 1, 116, 175, 37, 83, 1, 116, - 236, 149, 37, 83, 1, 116, 235, 224, 37, 83, 1, 109, 175, 37, 83, 1, 109, - 235, 224, 37, 83, 1, 109, 236, 149, 37, 83, 1, 232, 115, 37, 83, 1, 116, - 251, 169, 37, 83, 1, 116, 251, 69, 37, 83, 1, 109, 251, 169, 37, 83, 1, - 109, 226, 177, 37, 83, 1, 109, 251, 69, 37, 83, 1, 231, 77, 37, 83, 1, - 227, 227, 37, 83, 1, 116, 227, 225, 37, 83, 1, 249, 207, 37, 83, 1, 109, - 227, 225, 37, 83, 1, 227, 235, 37, 83, 1, 116, 222, 155, 37, 83, 1, 116, - 222, 35, 37, 83, 1, 109, 222, 155, 37, 83, 1, 109, 222, 35, 37, 83, 1, - 208, 37, 83, 1, 252, 237, 37, 83, 1, 116, 187, 37, 83, 1, 116, 229, 141, - 37, 83, 1, 116, 246, 8, 37, 83, 1, 109, 187, 37, 83, 1, 109, 246, 8, 37, - 83, 1, 109, 229, 141, 37, 83, 1, 196, 37, 83, 1, 109, 184, 37, 83, 1, - 116, 184, 37, 83, 1, 203, 37, 83, 1, 227, 19, 37, 83, 1, 235, 188, 37, - 83, 1, 234, 227, 37, 83, 1, 219, 7, 37, 83, 1, 116, 225, 25, 37, 83, 1, - 116, 223, 218, 37, 83, 1, 116, 226, 177, 37, 83, 1, 116, 155, 37, 83, 1, - 235, 17, 37, 83, 1, 60, 37, 83, 1, 109, 155, 37, 83, 1, 72, 37, 83, 1, - 237, 255, 37, 83, 1, 68, 37, 83, 1, 220, 23, 37, 83, 1, 246, 250, 37, 83, - 1, 230, 127, 37, 83, 1, 235, 177, 37, 83, 1, 244, 32, 226, 177, 37, 83, - 250, 147, 5, 128, 203, 37, 83, 250, 147, 5, 128, 235, 188, 37, 83, 250, - 147, 5, 235, 189, 222, 118, 235, 167, 37, 83, 5, 234, 100, 236, 230, 235, - 167, 37, 83, 250, 147, 5, 39, 232, 115, 37, 83, 250, 147, 5, 109, 187, - 37, 83, 250, 147, 5, 116, 227, 226, 156, 109, 187, 37, 83, 250, 147, 5, - 196, 37, 83, 250, 147, 5, 252, 237, 37, 83, 250, 147, 5, 226, 177, 37, - 83, 5, 226, 158, 37, 83, 29, 5, 60, 37, 83, 29, 5, 234, 100, 226, 127, - 37, 83, 29, 5, 255, 58, 37, 83, 29, 5, 222, 123, 255, 58, 37, 83, 29, 5, - 72, 37, 83, 29, 5, 237, 255, 37, 83, 29, 5, 220, 110, 37, 83, 29, 5, 220, - 22, 37, 83, 29, 5, 68, 37, 83, 29, 5, 220, 23, 37, 83, 29, 5, 74, 37, 83, - 29, 5, 230, 186, 56, 37, 83, 29, 5, 230, 63, 37, 83, 29, 5, 73, 37, 83, - 29, 5, 254, 234, 37, 83, 29, 5, 230, 127, 37, 83, 29, 5, 254, 196, 37, - 83, 29, 5, 83, 254, 196, 37, 83, 29, 5, 230, 186, 50, 37, 83, 5, 234, - 100, 236, 229, 37, 83, 5, 221, 131, 37, 83, 5, 221, 130, 37, 83, 5, 236, - 118, 221, 129, 37, 83, 5, 236, 118, 221, 128, 37, 83, 5, 236, 118, 221, - 127, 37, 83, 5, 228, 3, 243, 210, 37, 83, 5, 234, 100, 226, 148, 37, 83, - 5, 236, 117, 236, 215, 37, 83, 36, 250, 93, 248, 145, 37, 83, 242, 243, - 20, 217, 84, 37, 83, 242, 243, 20, 107, 37, 83, 242, 243, 20, 103, 37, - 83, 242, 243, 20, 160, 37, 83, 242, 243, 20, 154, 37, 83, 242, 243, 20, - 174, 37, 83, 242, 243, 20, 182, 37, 83, 242, 243, 20, 191, 37, 83, 242, - 243, 20, 185, 37, 83, 242, 243, 20, 190, 37, 83, 83, 20, 217, 84, 37, 83, - 83, 20, 107, 37, 83, 83, 20, 103, 37, 83, 83, 20, 160, 37, 83, 83, 20, - 154, 37, 83, 83, 20, 174, 37, 83, 83, 20, 182, 37, 83, 83, 20, 191, 37, - 83, 83, 20, 185, 37, 83, 83, 20, 190, 37, 83, 5, 218, 203, 37, 83, 5, - 218, 202, 37, 83, 5, 226, 121, 37, 83, 5, 236, 163, 37, 83, 5, 242, 180, - 37, 83, 5, 248, 157, 37, 83, 5, 210, 227, 59, 227, 235, 37, 83, 5, 234, - 100, 218, 48, 37, 83, 5, 237, 1, 37, 83, 5, 237, 0, 37, 83, 5, 226, 126, - 37, 83, 5, 226, 125, 37, 83, 5, 243, 186, 37, 83, 5, 251, 166, 94, 5, - 220, 97, 227, 144, 94, 5, 220, 97, 251, 148, 94, 5, 251, 95, 94, 5, 223, - 51, 94, 5, 252, 64, 94, 1, 254, 180, 94, 1, 254, 181, 222, 82, 94, 1, - 237, 251, 94, 1, 237, 252, 222, 82, 94, 1, 220, 100, 94, 1, 220, 101, - 222, 82, 94, 1, 228, 3, 227, 183, 94, 1, 228, 3, 227, 184, 222, 82, 94, - 1, 235, 189, 235, 95, 94, 1, 235, 189, 235, 96, 222, 82, 94, 1, 246, 222, - 94, 1, 254, 194, 94, 1, 230, 153, 94, 1, 230, 154, 222, 82, 94, 1, 175, - 94, 1, 206, 234, 103, 94, 1, 245, 0, 94, 1, 245, 1, 244, 58, 94, 1, 232, - 115, 94, 1, 251, 169, 94, 1, 251, 170, 235, 179, 94, 1, 237, 123, 94, 1, - 237, 124, 237, 107, 94, 1, 231, 77, 94, 1, 222, 156, 235, 138, 94, 1, - 222, 156, 233, 68, 234, 103, 94, 1, 249, 208, 233, 68, 254, 148, 94, 1, - 249, 208, 233, 68, 234, 103, 94, 1, 232, 238, 227, 238, 94, 1, 222, 155, - 94, 1, 222, 156, 222, 99, 94, 1, 249, 207, 94, 1, 249, 208, 234, 108, 94, - 1, 208, 94, 1, 187, 94, 1, 230, 44, 236, 225, 94, 1, 252, 237, 94, 1, - 252, 238, 236, 174, 94, 1, 196, 94, 1, 184, 94, 1, 203, 94, 1, 235, 188, - 94, 1, 219, 7, 94, 1, 226, 178, 226, 164, 94, 1, 226, 178, 226, 132, 94, - 1, 226, 177, 94, 1, 155, 94, 5, 227, 177, 94, 29, 5, 222, 82, 94, 29, 5, - 220, 96, 94, 29, 5, 220, 97, 226, 129, 94, 29, 5, 223, 77, 94, 29, 5, - 223, 78, 237, 243, 94, 29, 5, 228, 3, 227, 183, 94, 29, 5, 228, 3, 227, - 184, 222, 82, 94, 29, 5, 235, 189, 235, 95, 94, 29, 5, 235, 189, 235, 96, - 222, 82, 94, 29, 5, 222, 124, 94, 29, 5, 222, 125, 227, 183, 94, 29, 5, - 222, 125, 222, 82, 94, 29, 5, 222, 125, 227, 184, 222, 82, 94, 29, 5, - 229, 171, 94, 29, 5, 229, 172, 222, 82, 94, 254, 240, 254, 239, 94, 1, - 236, 247, 226, 128, 94, 1, 236, 122, 226, 128, 94, 1, 220, 183, 226, 128, - 94, 1, 246, 245, 226, 128, 94, 1, 219, 166, 226, 128, 94, 1, 217, 105, - 226, 128, 94, 1, 253, 246, 226, 128, 94, 20, 217, 84, 94, 20, 107, 94, - 20, 103, 94, 20, 160, 94, 20, 154, 94, 20, 174, 94, 20, 182, 94, 20, 191, - 94, 20, 185, 94, 20, 190, 94, 229, 254, 94, 230, 19, 94, 218, 193, 94, - 251, 132, 230, 13, 94, 251, 132, 224, 122, 94, 251, 132, 229, 228, 94, - 230, 18, 94, 26, 16, 248, 151, 94, 26, 16, 249, 59, 94, 26, 16, 247, 97, - 94, 26, 16, 249, 165, 94, 26, 16, 249, 166, 223, 51, 94, 26, 16, 248, - 218, 94, 26, 16, 249, 200, 94, 26, 16, 249, 44, 94, 26, 16, 249, 186, 94, - 26, 16, 249, 166, 244, 186, 94, 26, 16, 36, 222, 79, 94, 26, 16, 36, 246, - 188, 94, 26, 16, 36, 236, 169, 94, 26, 16, 36, 236, 171, 94, 26, 16, 36, - 237, 111, 94, 26, 16, 36, 236, 170, 2, 237, 111, 94, 26, 16, 36, 236, - 172, 2, 237, 111, 94, 26, 16, 36, 252, 112, 94, 26, 16, 36, 244, 61, 94, - 26, 16, 227, 107, 230, 119, 247, 107, 94, 26, 16, 227, 107, 230, 119, - 249, 198, 94, 26, 16, 227, 107, 250, 197, 220, 251, 94, 26, 16, 227, 107, - 250, 197, 222, 131, 94, 26, 16, 235, 113, 230, 119, 230, 9, 94, 26, 16, - 235, 113, 230, 119, 228, 195, 94, 26, 16, 235, 113, 250, 197, 229, 54, - 94, 26, 16, 235, 113, 250, 197, 229, 46, 94, 26, 16, 235, 113, 230, 119, - 229, 72, 223, 67, 5, 229, 251, 223, 67, 5, 230, 5, 223, 67, 5, 230, 3, - 223, 67, 1, 60, 223, 67, 1, 72, 223, 67, 1, 68, 223, 67, 1, 254, 234, - 223, 67, 1, 74, 223, 67, 1, 73, 223, 67, 1, 246, 115, 223, 67, 1, 175, - 223, 67, 1, 228, 155, 223, 67, 1, 245, 0, 223, 67, 1, 232, 115, 223, 67, - 1, 251, 169, 223, 67, 1, 237, 123, 223, 67, 1, 217, 114, 223, 67, 1, 231, - 77, 223, 67, 1, 222, 155, 223, 67, 1, 249, 207, 223, 67, 1, 208, 223, 67, - 1, 187, 223, 67, 1, 246, 8, 223, 67, 1, 219, 189, 223, 67, 1, 252, 237, - 223, 67, 1, 196, 223, 67, 1, 184, 223, 67, 1, 203, 223, 67, 1, 235, 188, - 223, 67, 1, 219, 7, 223, 67, 1, 226, 177, 223, 67, 1, 218, 138, 223, 67, - 1, 155, 223, 67, 250, 147, 5, 230, 16, 223, 67, 250, 147, 5, 229, 253, - 223, 67, 250, 147, 5, 229, 250, 223, 67, 29, 5, 230, 8, 223, 67, 29, 5, - 229, 249, 223, 67, 29, 5, 230, 11, 223, 67, 29, 5, 230, 2, 223, 67, 29, - 5, 230, 17, 223, 67, 29, 5, 230, 10, 223, 67, 5, 230, 20, 223, 67, 1, - 236, 149, 223, 67, 1, 223, 20, 223, 67, 20, 217, 84, 223, 67, 20, 107, - 223, 67, 20, 103, 223, 67, 20, 160, 223, 67, 20, 154, 223, 67, 20, 174, - 223, 67, 20, 182, 223, 67, 20, 191, 223, 67, 20, 185, 223, 67, 20, 190, - 169, 1, 175, 169, 1, 236, 67, 169, 1, 236, 149, 169, 1, 245, 0, 169, 1, - 244, 77, 169, 1, 232, 115, 169, 1, 251, 169, 169, 1, 251, 69, 169, 1, - 237, 123, 169, 1, 231, 77, 169, 1, 222, 155, 169, 1, 222, 35, 169, 1, - 249, 207, 169, 1, 208, 169, 1, 187, 169, 1, 229, 58, 169, 1, 229, 141, - 169, 1, 246, 8, 169, 1, 245, 165, 169, 1, 252, 237, 169, 1, 252, 54, 169, - 1, 196, 169, 1, 233, 142, 169, 1, 221, 55, 169, 1, 221, 47, 169, 1, 247, - 74, 169, 1, 184, 169, 1, 203, 169, 1, 235, 188, 169, 1, 155, 169, 1, 243, - 89, 169, 1, 219, 189, 169, 1, 226, 177, 169, 1, 225, 25, 169, 1, 219, 7, - 169, 1, 60, 169, 223, 97, 1, 184, 169, 223, 97, 1, 203, 169, 29, 5, 255, - 58, 169, 29, 5, 72, 169, 29, 5, 74, 169, 29, 5, 230, 127, 169, 29, 5, 68, - 169, 29, 5, 220, 23, 169, 29, 5, 73, 169, 250, 147, 5, 237, 17, 169, 250, - 147, 5, 189, 169, 250, 147, 5, 153, 169, 250, 147, 5, 207, 169, 250, 147, - 5, 230, 59, 169, 250, 147, 5, 152, 169, 250, 147, 5, 222, 201, 169, 250, - 147, 5, 231, 62, 169, 250, 147, 5, 236, 229, 169, 5, 227, 236, 169, 5, - 231, 112, 169, 228, 197, 222, 154, 169, 228, 197, 231, 69, 221, 208, 222, - 154, 169, 228, 197, 251, 74, 169, 228, 197, 221, 42, 251, 74, 169, 228, - 197, 221, 41, 169, 20, 217, 84, 169, 20, 107, 169, 20, 103, 169, 20, 160, - 169, 20, 154, 169, 20, 174, 169, 20, 182, 169, 20, 191, 169, 20, 185, - 169, 20, 190, 169, 1, 221, 29, 169, 1, 221, 19, 169, 1, 249, 132, 230, - 151, 251, 26, 20, 217, 84, 230, 151, 251, 26, 20, 107, 230, 151, 251, 26, - 20, 103, 230, 151, 251, 26, 20, 160, 230, 151, 251, 26, 20, 154, 230, - 151, 251, 26, 20, 174, 230, 151, 251, 26, 20, 182, 230, 151, 251, 26, 20, - 191, 230, 151, 251, 26, 20, 185, 230, 151, 251, 26, 20, 190, 230, 151, - 251, 26, 1, 235, 188, 230, 151, 251, 26, 1, 253, 244, 230, 151, 251, 26, - 1, 254, 209, 230, 151, 251, 26, 1, 254, 123, 230, 151, 251, 26, 1, 254, - 175, 230, 151, 251, 26, 1, 235, 187, 230, 151, 251, 26, 1, 255, 20, 230, - 151, 251, 26, 1, 255, 21, 230, 151, 251, 26, 1, 255, 19, 230, 151, 251, - 26, 1, 255, 15, 230, 151, 251, 26, 1, 235, 67, 230, 151, 251, 26, 1, 237, - 151, 230, 151, 251, 26, 1, 238, 0, 230, 151, 251, 26, 1, 237, 167, 230, - 151, 251, 26, 1, 237, 156, 230, 151, 251, 26, 1, 234, 231, 230, 151, 251, - 26, 1, 220, 117, 230, 151, 251, 26, 1, 220, 115, 230, 151, 251, 26, 1, - 220, 68, 230, 151, 251, 26, 1, 220, 16, 230, 151, 251, 26, 1, 235, 122, - 230, 151, 251, 26, 1, 246, 162, 230, 151, 251, 26, 1, 246, 253, 230, 151, - 251, 26, 1, 246, 197, 230, 151, 251, 26, 1, 246, 142, 230, 151, 251, 26, - 1, 235, 12, 230, 151, 251, 26, 1, 230, 89, 230, 151, 251, 26, 1, 230, - 181, 230, 151, 251, 26, 1, 230, 79, 230, 151, 251, 26, 1, 230, 161, 230, - 151, 251, 26, 233, 100, 221, 1, 230, 151, 251, 26, 244, 251, 221, 2, 230, - 151, 251, 26, 233, 98, 221, 2, 230, 151, 251, 26, 227, 193, 230, 151, - 251, 26, 229, 139, 230, 151, 251, 26, 254, 201, 230, 151, 251, 26, 228, - 197, 233, 96, 230, 151, 251, 26, 228, 197, 51, 233, 96, 219, 162, 145, - 236, 211, 219, 162, 145, 225, 2, 219, 162, 145, 228, 241, 219, 162, 5, - 232, 39, 219, 162, 5, 218, 56, 233, 191, 223, 39, 219, 162, 145, 218, 56, - 254, 206, 237, 214, 223, 39, 219, 162, 145, 218, 56, 237, 214, 223, 39, - 219, 162, 145, 218, 56, 236, 199, 237, 214, 223, 39, 219, 162, 145, 251, - 149, 56, 219, 162, 145, 218, 56, 236, 199, 237, 214, 223, 40, 226, 106, - 219, 162, 145, 51, 223, 39, 219, 162, 145, 221, 78, 223, 39, 219, 162, - 145, 236, 199, 254, 97, 219, 162, 145, 61, 56, 219, 162, 145, 124, 188, - 56, 219, 162, 145, 148, 188, 56, 219, 162, 145, 227, 99, 236, 210, 237, - 214, 223, 39, 219, 162, 145, 253, 242, 237, 214, 223, 39, 219, 162, 5, - 219, 78, 223, 39, 219, 162, 5, 219, 78, 220, 112, 219, 162, 5, 210, 219, - 78, 220, 112, 219, 162, 5, 219, 78, 254, 97, 219, 162, 5, 210, 219, 78, - 254, 97, 219, 162, 5, 219, 78, 220, 113, 2, 222, 135, 219, 162, 5, 219, - 78, 254, 98, 2, 222, 135, 219, 162, 5, 254, 96, 254, 105, 219, 162, 5, - 254, 96, 252, 222, 219, 162, 5, 254, 96, 219, 184, 219, 162, 5, 254, 96, - 219, 185, 2, 222, 135, 219, 162, 5, 221, 162, 219, 162, 5, 243, 123, 171, - 254, 95, 219, 162, 5, 171, 254, 95, 219, 162, 5, 227, 24, 171, 254, 95, - 219, 162, 5, 254, 96, 220, 119, 233, 90, 219, 162, 5, 254, 46, 7, 1, 3, - 6, 60, 7, 1, 3, 6, 254, 234, 7, 3, 1, 215, 254, 234, 7, 1, 3, 6, 252, - 196, 253, 204, 7, 1, 3, 6, 251, 202, 7, 1, 3, 6, 250, 46, 7, 1, 3, 6, - 246, 118, 7, 1, 3, 6, 73, 7, 3, 1, 215, 230, 119, 73, 7, 3, 1, 215, 72, - 7, 1, 3, 6, 237, 126, 7, 1, 3, 6, 237, 17, 7, 1, 3, 6, 235, 202, 2, 92, - 7, 1, 3, 6, 189, 7, 1, 3, 6, 210, 207, 7, 1, 3, 6, 74, 7, 1, 3, 6, 230, - 119, 74, 7, 3, 1, 224, 136, 74, 7, 3, 1, 224, 136, 230, 119, 74, 7, 3, 1, - 224, 136, 142, 2, 92, 7, 3, 1, 215, 230, 167, 7, 1, 3, 6, 230, 86, 7, 3, - 1, 221, 120, 144, 74, 7, 3, 1, 252, 29, 144, 74, 7, 1, 3, 6, 230, 59, 7, - 1, 3, 6, 210, 152, 7, 1, 3, 6, 215, 152, 7, 1, 3, 6, 222, 201, 7, 1, 3, - 6, 68, 7, 3, 1, 224, 136, 68, 7, 3, 1, 224, 136, 249, 12, 68, 7, 3, 1, - 224, 136, 215, 189, 7, 1, 3, 6, 216, 216, 7, 1, 3, 6, 219, 40, 7, 1, 3, - 6, 217, 157, 7, 1, 3, 6, 246, 76, 7, 1, 219, 70, 235, 144, 223, 241, 7, - 1, 254, 191, 23, 1, 3, 6, 244, 231, 23, 1, 3, 6, 235, 156, 23, 1, 3, 6, - 229, 108, 23, 1, 3, 6, 227, 149, 23, 1, 3, 6, 228, 212, 31, 1, 3, 6, 246, - 217, 58, 1, 6, 60, 58, 1, 6, 254, 234, 58, 1, 6, 253, 204, 58, 1, 6, 252, - 196, 253, 204, 58, 1, 6, 250, 46, 58, 1, 6, 73, 58, 1, 6, 210, 73, 58, 1, - 6, 245, 67, 58, 1, 6, 243, 225, 58, 1, 6, 72, 58, 1, 6, 237, 126, 58, 1, - 6, 237, 17, 58, 1, 6, 153, 58, 1, 6, 189, 58, 1, 6, 207, 58, 1, 6, 210, - 207, 58, 1, 6, 74, 58, 1, 6, 230, 86, 58, 1, 6, 230, 59, 58, 1, 6, 152, - 58, 1, 6, 222, 201, 58, 1, 6, 68, 58, 1, 6, 219, 40, 58, 1, 3, 60, 58, 1, - 3, 215, 60, 58, 1, 3, 254, 146, 58, 1, 3, 215, 254, 234, 58, 1, 3, 253, - 204, 58, 1, 3, 250, 46, 58, 1, 3, 73, 58, 1, 3, 226, 104, 58, 1, 3, 230, - 119, 73, 58, 1, 3, 215, 230, 119, 73, 58, 1, 3, 245, 67, 58, 1, 3, 215, - 72, 58, 1, 3, 237, 17, 58, 1, 3, 189, 58, 1, 3, 246, 185, 58, 1, 3, 74, - 58, 1, 3, 230, 119, 74, 58, 1, 3, 221, 120, 144, 74, 58, 1, 3, 252, 29, - 144, 74, 58, 1, 3, 230, 59, 58, 1, 3, 222, 201, 58, 1, 3, 68, 58, 1, 3, - 224, 136, 68, 58, 1, 3, 215, 189, 58, 1, 3, 216, 216, 58, 1, 3, 254, 191, - 58, 1, 3, 252, 102, 58, 1, 3, 23, 244, 231, 58, 1, 3, 249, 62, 58, 1, 3, - 23, 229, 129, 58, 1, 3, 251, 31, 7, 223, 94, 3, 1, 72, 7, 223, 94, 3, 1, - 152, 7, 223, 94, 3, 1, 68, 7, 223, 94, 3, 1, 216, 216, 23, 223, 94, 3, 1, - 252, 102, 23, 223, 94, 3, 1, 244, 231, 23, 223, 94, 3, 1, 227, 149, 23, - 223, 94, 3, 1, 229, 129, 23, 223, 94, 3, 1, 251, 31, 7, 3, 1, 220, 110, - 7, 3, 1, 49, 2, 233, 193, 221, 179, 7, 3, 1, 250, 47, 2, 233, 193, 221, - 179, 7, 3, 1, 246, 75, 2, 233, 193, 221, 179, 7, 3, 1, 234, 187, 2, 233, - 193, 221, 179, 7, 3, 1, 233, 34, 2, 233, 193, 221, 179, 7, 3, 1, 230, 60, - 2, 233, 193, 221, 179, 7, 3, 1, 228, 39, 2, 233, 193, 221, 179, 7, 3, 1, - 228, 39, 2, 245, 174, 25, 233, 193, 221, 179, 7, 3, 1, 226, 235, 2, 233, - 193, 221, 179, 7, 3, 1, 222, 202, 2, 233, 193, 221, 179, 7, 3, 1, 217, - 158, 2, 233, 193, 221, 179, 7, 3, 1, 215, 245, 67, 58, 1, 31, 246, 197, - 7, 3, 1, 237, 188, 245, 67, 7, 3, 1, 222, 38, 2, 223, 121, 7, 3, 6, 1, - 242, 107, 2, 92, 7, 3, 1, 237, 163, 2, 92, 7, 3, 1, 230, 60, 2, 92, 7, 3, - 6, 1, 105, 2, 92, 7, 3, 1, 220, 58, 2, 92, 7, 3, 1, 49, 2, 230, 29, 96, - 7, 3, 1, 250, 47, 2, 230, 29, 96, 7, 3, 1, 246, 75, 2, 230, 29, 96, 7, 3, - 1, 245, 68, 2, 230, 29, 96, 7, 3, 1, 237, 18, 2, 230, 29, 96, 7, 3, 1, - 235, 202, 2, 230, 29, 96, 7, 3, 1, 234, 187, 2, 230, 29, 96, 7, 3, 1, - 233, 34, 2, 230, 29, 96, 7, 3, 1, 230, 60, 2, 230, 29, 96, 7, 3, 1, 228, - 39, 2, 230, 29, 96, 7, 3, 1, 226, 235, 2, 230, 29, 96, 7, 3, 1, 246, 134, - 2, 230, 29, 96, 7, 3, 1, 220, 11, 2, 230, 29, 96, 7, 3, 1, 218, 152, 2, - 230, 29, 96, 7, 3, 1, 217, 158, 2, 230, 29, 96, 7, 3, 1, 112, 2, 227, - 164, 96, 7, 3, 1, 254, 147, 2, 227, 164, 96, 7, 3, 1, 250, 47, 2, 242, - 247, 25, 222, 135, 7, 3, 1, 178, 2, 227, 164, 96, 7, 3, 1, 230, 119, 178, - 2, 227, 164, 96, 7, 3, 1, 210, 230, 119, 178, 2, 227, 164, 96, 7, 3, 1, - 226, 105, 2, 227, 164, 96, 7, 3, 1, 242, 107, 2, 227, 164, 96, 7, 3, 1, - 230, 119, 142, 2, 227, 164, 96, 7, 3, 1, 246, 134, 2, 227, 164, 96, 7, 3, - 1, 105, 2, 227, 164, 96, 7, 3, 1, 246, 77, 2, 227, 164, 96, 58, 1, 3, - 215, 254, 146, 58, 1, 3, 251, 202, 58, 1, 3, 251, 203, 2, 250, 80, 58, 1, - 3, 246, 118, 58, 1, 3, 210, 230, 119, 73, 58, 1, 3, 246, 74, 58, 1, 3, - 248, 144, 237, 127, 2, 92, 58, 1, 3, 102, 245, 67, 58, 1, 3, 215, 243, - 225, 58, 1, 3, 242, 107, 2, 92, 58, 1, 3, 237, 162, 58, 1, 3, 6, 72, 58, - 1, 3, 6, 242, 107, 2, 92, 58, 1, 3, 237, 127, 2, 250, 97, 58, 1, 3, 235, - 202, 2, 227, 164, 96, 58, 1, 3, 235, 202, 2, 230, 29, 96, 58, 1, 3, 6, - 153, 58, 1, 3, 234, 187, 2, 96, 58, 1, 3, 215, 234, 187, 2, 171, 235, - 106, 58, 1, 3, 233, 34, 2, 42, 96, 58, 1, 3, 233, 34, 2, 227, 164, 96, - 58, 1, 3, 6, 207, 58, 1, 3, 252, 196, 74, 58, 1, 3, 229, 129, 58, 1, 3, - 226, 235, 2, 96, 58, 1, 3, 246, 133, 58, 1, 3, 222, 202, 2, 230, 29, 96, - 58, 1, 3, 105, 135, 58, 1, 3, 220, 57, 58, 1, 3, 6, 68, 58, 1, 3, 220, - 11, 2, 96, 58, 1, 3, 215, 216, 216, 58, 1, 3, 217, 157, 58, 1, 3, 217, - 158, 2, 227, 164, 96, 58, 1, 3, 217, 158, 2, 250, 80, 58, 1, 3, 246, 76, - 58, 1, 3, 222, 6, 36, 247, 143, 244, 37, 255, 0, 36, 247, 143, 254, 248, - 255, 0, 36, 224, 36, 56, 36, 223, 45, 78, 36, 234, 114, 36, 244, 34, 36, - 234, 112, 36, 254, 246, 36, 244, 35, 36, 254, 247, 36, 7, 3, 1, 228, 39, - 56, 36, 252, 7, 36, 234, 113, 36, 51, 250, 217, 50, 36, 230, 163, 50, 36, - 217, 33, 56, 36, 237, 152, 56, 36, 220, 51, 50, 36, 220, 35, 50, 36, 7, - 3, 1, 245, 154, 230, 119, 112, 50, 36, 7, 3, 1, 254, 234, 36, 7, 3, 1, - 254, 93, 36, 7, 3, 1, 253, 220, 36, 7, 3, 1, 251, 203, 251, 92, 36, 7, 3, - 1, 237, 188, 250, 46, 36, 7, 3, 1, 246, 118, 36, 7, 3, 1, 245, 67, 36, 7, - 1, 3, 6, 245, 67, 36, 7, 3, 1, 237, 17, 36, 7, 3, 1, 153, 36, 7, 1, 3, 6, - 153, 36, 7, 1, 3, 6, 189, 36, 7, 3, 1, 207, 36, 7, 1, 3, 6, 207, 36, 7, - 1, 3, 6, 152, 36, 7, 3, 1, 228, 39, 227, 58, 36, 7, 3, 1, 198, 36, 7, 3, - 1, 171, 198, 36, 7, 3, 1, 217, 157, 36, 254, 151, 114, 199, 56, 36, 42, - 254, 21, 50, 36, 45, 254, 21, 25, 113, 254, 21, 56, 7, 6, 1, 112, 2, 227, - 94, 56, 7, 3, 1, 112, 2, 227, 94, 56, 7, 6, 1, 49, 2, 61, 50, 7, 3, 1, - 49, 2, 61, 50, 7, 6, 1, 49, 2, 61, 56, 7, 3, 1, 49, 2, 61, 56, 7, 6, 1, - 49, 2, 235, 44, 56, 7, 3, 1, 49, 2, 235, 44, 56, 7, 6, 1, 251, 203, 2, - 251, 93, 25, 168, 7, 3, 1, 251, 203, 2, 251, 93, 25, 168, 7, 6, 1, 250, - 47, 2, 61, 50, 7, 3, 1, 250, 47, 2, 61, 50, 7, 6, 1, 250, 47, 2, 61, 56, - 7, 3, 1, 250, 47, 2, 61, 56, 7, 6, 1, 250, 47, 2, 235, 44, 56, 7, 3, 1, - 250, 47, 2, 235, 44, 56, 7, 6, 1, 250, 47, 2, 251, 92, 7, 3, 1, 250, 47, - 2, 251, 92, 7, 6, 1, 250, 47, 2, 250, 217, 56, 7, 3, 1, 250, 47, 2, 250, - 217, 56, 7, 6, 1, 178, 2, 234, 116, 25, 244, 36, 7, 3, 1, 178, 2, 234, - 116, 25, 244, 36, 7, 6, 1, 178, 2, 234, 116, 25, 168, 7, 3, 1, 178, 2, - 234, 116, 25, 168, 7, 6, 1, 178, 2, 250, 217, 56, 7, 3, 1, 178, 2, 250, - 217, 56, 7, 6, 1, 178, 2, 221, 180, 56, 7, 3, 1, 178, 2, 221, 180, 56, 7, - 6, 1, 178, 2, 251, 93, 25, 252, 8, 7, 3, 1, 178, 2, 251, 93, 25, 252, 8, - 7, 6, 1, 246, 75, 2, 61, 50, 7, 3, 1, 246, 75, 2, 61, 50, 7, 6, 1, 245, - 68, 2, 234, 115, 7, 3, 1, 245, 68, 2, 234, 115, 7, 6, 1, 243, 226, 2, 61, - 50, 7, 3, 1, 243, 226, 2, 61, 50, 7, 6, 1, 243, 226, 2, 61, 56, 7, 3, 1, - 243, 226, 2, 61, 56, 7, 6, 1, 243, 226, 2, 249, 13, 7, 3, 1, 243, 226, 2, - 249, 13, 7, 6, 1, 243, 226, 2, 251, 92, 7, 3, 1, 243, 226, 2, 251, 92, 7, - 6, 1, 243, 226, 2, 252, 9, 56, 7, 3, 1, 243, 226, 2, 252, 9, 56, 7, 6, 1, - 242, 107, 2, 221, 180, 56, 7, 3, 1, 242, 107, 2, 221, 180, 56, 7, 6, 1, - 242, 107, 2, 249, 14, 25, 168, 7, 3, 1, 242, 107, 2, 249, 14, 25, 168, 7, - 6, 1, 237, 18, 2, 168, 7, 3, 1, 237, 18, 2, 168, 7, 6, 1, 237, 18, 2, 61, - 56, 7, 3, 1, 237, 18, 2, 61, 56, 7, 6, 1, 237, 18, 2, 235, 44, 56, 7, 3, - 1, 237, 18, 2, 235, 44, 56, 7, 6, 1, 235, 202, 2, 61, 56, 7, 3, 1, 235, - 202, 2, 61, 56, 7, 6, 1, 235, 202, 2, 61, 252, 118, 25, 234, 115, 7, 3, - 1, 235, 202, 2, 61, 252, 118, 25, 234, 115, 7, 6, 1, 235, 202, 2, 235, - 44, 56, 7, 3, 1, 235, 202, 2, 235, 44, 56, 7, 6, 1, 235, 202, 2, 250, - 217, 56, 7, 3, 1, 235, 202, 2, 250, 217, 56, 7, 6, 1, 234, 187, 2, 168, - 7, 3, 1, 234, 187, 2, 168, 7, 6, 1, 234, 187, 2, 61, 50, 7, 3, 1, 234, - 187, 2, 61, 50, 7, 6, 1, 234, 187, 2, 61, 56, 7, 3, 1, 234, 187, 2, 61, - 56, 7, 6, 1, 233, 34, 2, 61, 50, 7, 3, 1, 233, 34, 2, 61, 50, 7, 6, 1, - 233, 34, 2, 61, 56, 7, 3, 1, 233, 34, 2, 61, 56, 7, 6, 1, 233, 34, 2, - 235, 44, 56, 7, 3, 1, 233, 34, 2, 235, 44, 56, 7, 6, 1, 233, 34, 2, 250, - 217, 56, 7, 3, 1, 233, 34, 2, 250, 217, 56, 7, 6, 1, 142, 2, 221, 180, - 25, 168, 7, 3, 1, 142, 2, 221, 180, 25, 168, 7, 6, 1, 142, 2, 221, 180, - 25, 249, 13, 7, 3, 1, 142, 2, 221, 180, 25, 249, 13, 7, 6, 1, 142, 2, - 234, 116, 25, 244, 36, 7, 3, 1, 142, 2, 234, 116, 25, 244, 36, 7, 6, 1, - 142, 2, 234, 116, 25, 168, 7, 3, 1, 142, 2, 234, 116, 25, 168, 7, 6, 1, - 230, 60, 2, 168, 7, 3, 1, 230, 60, 2, 168, 7, 6, 1, 230, 60, 2, 61, 50, - 7, 3, 1, 230, 60, 2, 61, 50, 7, 6, 1, 228, 39, 2, 61, 50, 7, 3, 1, 228, - 39, 2, 61, 50, 7, 6, 1, 228, 39, 2, 61, 56, 7, 3, 1, 228, 39, 2, 61, 56, - 7, 6, 1, 228, 39, 2, 61, 252, 118, 25, 234, 115, 7, 3, 1, 228, 39, 2, 61, - 252, 118, 25, 234, 115, 7, 6, 1, 228, 39, 2, 235, 44, 56, 7, 3, 1, 228, - 39, 2, 235, 44, 56, 7, 6, 1, 226, 235, 2, 61, 50, 7, 3, 1, 226, 235, 2, - 61, 50, 7, 6, 1, 226, 235, 2, 61, 56, 7, 3, 1, 226, 235, 2, 61, 56, 7, 6, - 1, 226, 235, 2, 254, 248, 25, 61, 50, 7, 3, 1, 226, 235, 2, 254, 248, 25, - 61, 50, 7, 6, 1, 226, 235, 2, 251, 131, 25, 61, 50, 7, 3, 1, 226, 235, 2, - 251, 131, 25, 61, 50, 7, 6, 1, 226, 235, 2, 61, 252, 118, 25, 61, 50, 7, - 3, 1, 226, 235, 2, 61, 252, 118, 25, 61, 50, 7, 6, 1, 222, 202, 2, 61, - 50, 7, 3, 1, 222, 202, 2, 61, 50, 7, 6, 1, 222, 202, 2, 61, 56, 7, 3, 1, - 222, 202, 2, 61, 56, 7, 6, 1, 222, 202, 2, 235, 44, 56, 7, 3, 1, 222, - 202, 2, 235, 44, 56, 7, 6, 1, 222, 202, 2, 250, 217, 56, 7, 3, 1, 222, - 202, 2, 250, 217, 56, 7, 6, 1, 105, 2, 249, 14, 56, 7, 3, 1, 105, 2, 249, - 14, 56, 7, 6, 1, 105, 2, 221, 180, 56, 7, 3, 1, 105, 2, 221, 180, 56, 7, - 6, 1, 105, 2, 250, 217, 56, 7, 3, 1, 105, 2, 250, 217, 56, 7, 6, 1, 105, - 2, 221, 180, 25, 168, 7, 3, 1, 105, 2, 221, 180, 25, 168, 7, 6, 1, 105, - 2, 234, 116, 25, 249, 13, 7, 3, 1, 105, 2, 234, 116, 25, 249, 13, 7, 6, - 1, 220, 11, 2, 221, 179, 7, 3, 1, 220, 11, 2, 221, 179, 7, 6, 1, 220, 11, - 2, 61, 56, 7, 3, 1, 220, 11, 2, 61, 56, 7, 6, 1, 219, 41, 2, 244, 36, 7, - 3, 1, 219, 41, 2, 244, 36, 7, 6, 1, 219, 41, 2, 168, 7, 3, 1, 219, 41, 2, - 168, 7, 6, 1, 219, 41, 2, 249, 13, 7, 3, 1, 219, 41, 2, 249, 13, 7, 6, 1, - 219, 41, 2, 61, 50, 7, 3, 1, 219, 41, 2, 61, 50, 7, 6, 1, 219, 41, 2, 61, - 56, 7, 3, 1, 219, 41, 2, 61, 56, 7, 6, 1, 218, 152, 2, 61, 50, 7, 3, 1, - 218, 152, 2, 61, 50, 7, 6, 1, 218, 152, 2, 249, 13, 7, 3, 1, 218, 152, 2, - 249, 13, 7, 6, 1, 218, 91, 2, 61, 50, 7, 3, 1, 218, 91, 2, 61, 50, 7, 6, - 1, 217, 158, 2, 250, 216, 7, 3, 1, 217, 158, 2, 250, 216, 7, 6, 1, 217, - 158, 2, 61, 56, 7, 3, 1, 217, 158, 2, 61, 56, 7, 6, 1, 217, 158, 2, 235, - 44, 56, 7, 3, 1, 217, 158, 2, 235, 44, 56, 7, 3, 1, 243, 226, 2, 235, 44, - 56, 7, 3, 1, 222, 202, 2, 249, 13, 7, 3, 1, 219, 41, 2, 227, 94, 50, 7, - 3, 1, 218, 91, 2, 227, 94, 50, 7, 3, 1, 112, 2, 45, 144, 227, 93, 7, 3, - 1, 171, 226, 235, 2, 61, 50, 7, 3, 1, 171, 226, 235, 2, 249, 11, 92, 7, - 3, 1, 171, 226, 235, 2, 116, 92, 7, 6, 1, 225, 1, 198, 7, 3, 1, 249, 62, - 7, 6, 1, 112, 2, 61, 56, 7, 3, 1, 112, 2, 61, 56, 7, 6, 1, 112, 2, 242, - 247, 50, 7, 3, 1, 112, 2, 242, 247, 50, 7, 6, 1, 112, 2, 250, 217, 25, - 168, 7, 3, 1, 112, 2, 250, 217, 25, 168, 7, 6, 1, 112, 2, 250, 217, 25, - 244, 36, 7, 3, 1, 112, 2, 250, 217, 25, 244, 36, 7, 6, 1, 112, 2, 250, - 217, 25, 242, 247, 50, 7, 3, 1, 112, 2, 250, 217, 25, 242, 247, 50, 7, 6, - 1, 112, 2, 250, 217, 25, 221, 179, 7, 3, 1, 112, 2, 250, 217, 25, 221, - 179, 7, 6, 1, 112, 2, 250, 217, 25, 61, 56, 7, 3, 1, 112, 2, 250, 217, - 25, 61, 56, 7, 6, 1, 112, 2, 252, 9, 25, 168, 7, 3, 1, 112, 2, 252, 9, - 25, 168, 7, 6, 1, 112, 2, 252, 9, 25, 244, 36, 7, 3, 1, 112, 2, 252, 9, - 25, 244, 36, 7, 6, 1, 112, 2, 252, 9, 25, 242, 247, 50, 7, 3, 1, 112, 2, - 252, 9, 25, 242, 247, 50, 7, 6, 1, 112, 2, 252, 9, 25, 221, 179, 7, 3, 1, - 112, 2, 252, 9, 25, 221, 179, 7, 6, 1, 112, 2, 252, 9, 25, 61, 56, 7, 3, - 1, 112, 2, 252, 9, 25, 61, 56, 7, 6, 1, 178, 2, 61, 56, 7, 3, 1, 178, 2, - 61, 56, 7, 6, 1, 178, 2, 242, 247, 50, 7, 3, 1, 178, 2, 242, 247, 50, 7, - 6, 1, 178, 2, 221, 179, 7, 3, 1, 178, 2, 221, 179, 7, 6, 1, 178, 2, 250, - 217, 25, 168, 7, 3, 1, 178, 2, 250, 217, 25, 168, 7, 6, 1, 178, 2, 250, - 217, 25, 244, 36, 7, 3, 1, 178, 2, 250, 217, 25, 244, 36, 7, 6, 1, 178, - 2, 250, 217, 25, 242, 247, 50, 7, 3, 1, 178, 2, 250, 217, 25, 242, 247, - 50, 7, 6, 1, 178, 2, 250, 217, 25, 221, 179, 7, 3, 1, 178, 2, 250, 217, - 25, 221, 179, 7, 6, 1, 178, 2, 250, 217, 25, 61, 56, 7, 3, 1, 178, 2, - 250, 217, 25, 61, 56, 7, 6, 1, 242, 107, 2, 242, 247, 50, 7, 3, 1, 242, - 107, 2, 242, 247, 50, 7, 6, 1, 242, 107, 2, 61, 56, 7, 3, 1, 242, 107, 2, - 61, 56, 7, 6, 1, 142, 2, 61, 56, 7, 3, 1, 142, 2, 61, 56, 7, 6, 1, 142, - 2, 242, 247, 50, 7, 3, 1, 142, 2, 242, 247, 50, 7, 6, 1, 142, 2, 250, - 217, 25, 168, 7, 3, 1, 142, 2, 250, 217, 25, 168, 7, 6, 1, 142, 2, 250, - 217, 25, 244, 36, 7, 3, 1, 142, 2, 250, 217, 25, 244, 36, 7, 6, 1, 142, - 2, 250, 217, 25, 242, 247, 50, 7, 3, 1, 142, 2, 250, 217, 25, 242, 247, - 50, 7, 6, 1, 142, 2, 250, 217, 25, 221, 179, 7, 3, 1, 142, 2, 250, 217, - 25, 221, 179, 7, 6, 1, 142, 2, 250, 217, 25, 61, 56, 7, 3, 1, 142, 2, - 250, 217, 25, 61, 56, 7, 6, 1, 142, 2, 242, 190, 25, 168, 7, 3, 1, 142, - 2, 242, 190, 25, 168, 7, 6, 1, 142, 2, 242, 190, 25, 244, 36, 7, 3, 1, - 142, 2, 242, 190, 25, 244, 36, 7, 6, 1, 142, 2, 242, 190, 25, 242, 247, - 50, 7, 3, 1, 142, 2, 242, 190, 25, 242, 247, 50, 7, 6, 1, 142, 2, 242, - 190, 25, 221, 179, 7, 3, 1, 142, 2, 242, 190, 25, 221, 179, 7, 6, 1, 142, - 2, 242, 190, 25, 61, 56, 7, 3, 1, 142, 2, 242, 190, 25, 61, 56, 7, 6, 1, - 105, 2, 61, 56, 7, 3, 1, 105, 2, 61, 56, 7, 6, 1, 105, 2, 242, 247, 50, - 7, 3, 1, 105, 2, 242, 247, 50, 7, 6, 1, 105, 2, 242, 190, 25, 168, 7, 3, - 1, 105, 2, 242, 190, 25, 168, 7, 6, 1, 105, 2, 242, 190, 25, 244, 36, 7, - 3, 1, 105, 2, 242, 190, 25, 244, 36, 7, 6, 1, 105, 2, 242, 190, 25, 242, - 247, 50, 7, 3, 1, 105, 2, 242, 190, 25, 242, 247, 50, 7, 6, 1, 105, 2, - 242, 190, 25, 221, 179, 7, 3, 1, 105, 2, 242, 190, 25, 221, 179, 7, 6, 1, - 105, 2, 242, 190, 25, 61, 56, 7, 3, 1, 105, 2, 242, 190, 25, 61, 56, 7, - 6, 1, 218, 91, 2, 244, 36, 7, 3, 1, 218, 91, 2, 244, 36, 7, 6, 1, 218, - 91, 2, 61, 56, 7, 3, 1, 218, 91, 2, 61, 56, 7, 6, 1, 218, 91, 2, 242, - 247, 50, 7, 3, 1, 218, 91, 2, 242, 247, 50, 7, 6, 1, 218, 91, 2, 221, - 179, 7, 3, 1, 218, 91, 2, 221, 179, 7, 6, 1, 233, 192, 235, 18, 7, 3, 1, - 233, 192, 235, 18, 7, 6, 1, 233, 192, 216, 216, 7, 3, 1, 233, 192, 216, - 216, 7, 6, 1, 218, 91, 2, 234, 247, 7, 3, 1, 218, 91, 2, 234, 247, 23, 3, - 1, 254, 147, 2, 228, 206, 23, 3, 1, 254, 147, 2, 249, 144, 23, 3, 1, 254, - 147, 2, 209, 25, 219, 178, 23, 3, 1, 254, 147, 2, 193, 25, 219, 178, 23, - 3, 1, 254, 147, 2, 209, 25, 230, 64, 23, 3, 1, 254, 147, 2, 193, 25, 230, - 64, 23, 3, 1, 254, 147, 2, 209, 25, 229, 163, 23, 3, 1, 254, 147, 2, 193, - 25, 229, 163, 23, 6, 1, 254, 147, 2, 228, 206, 23, 6, 1, 254, 147, 2, - 249, 144, 23, 6, 1, 254, 147, 2, 209, 25, 219, 178, 23, 6, 1, 254, 147, - 2, 193, 25, 219, 178, 23, 6, 1, 254, 147, 2, 209, 25, 230, 64, 23, 6, 1, - 254, 147, 2, 193, 25, 230, 64, 23, 6, 1, 254, 147, 2, 209, 25, 229, 163, - 23, 6, 1, 254, 147, 2, 193, 25, 229, 163, 23, 3, 1, 246, 157, 2, 228, - 206, 23, 3, 1, 246, 157, 2, 249, 144, 23, 3, 1, 246, 157, 2, 209, 25, - 219, 178, 23, 3, 1, 246, 157, 2, 193, 25, 219, 178, 23, 3, 1, 246, 157, - 2, 209, 25, 230, 64, 23, 3, 1, 246, 157, 2, 193, 25, 230, 64, 23, 6, 1, - 246, 157, 2, 228, 206, 23, 6, 1, 246, 157, 2, 249, 144, 23, 6, 1, 246, - 157, 2, 209, 25, 219, 178, 23, 6, 1, 246, 157, 2, 193, 25, 219, 178, 23, - 6, 1, 246, 157, 2, 209, 25, 230, 64, 23, 6, 1, 246, 157, 2, 193, 25, 230, - 64, 23, 3, 1, 246, 122, 2, 228, 206, 23, 3, 1, 246, 122, 2, 249, 144, 23, - 3, 1, 246, 122, 2, 209, 25, 219, 178, 23, 3, 1, 246, 122, 2, 193, 25, - 219, 178, 23, 3, 1, 246, 122, 2, 209, 25, 230, 64, 23, 3, 1, 246, 122, 2, - 193, 25, 230, 64, 23, 3, 1, 246, 122, 2, 209, 25, 229, 163, 23, 3, 1, - 246, 122, 2, 193, 25, 229, 163, 23, 6, 1, 246, 122, 2, 228, 206, 23, 6, - 1, 246, 122, 2, 249, 144, 23, 6, 1, 246, 122, 2, 209, 25, 219, 178, 23, - 6, 1, 246, 122, 2, 193, 25, 219, 178, 23, 6, 1, 246, 122, 2, 209, 25, - 230, 64, 23, 6, 1, 246, 122, 2, 193, 25, 230, 64, 23, 6, 1, 246, 122, 2, - 209, 25, 229, 163, 23, 6, 1, 246, 122, 2, 193, 25, 229, 163, 23, 3, 1, - 237, 163, 2, 228, 206, 23, 3, 1, 237, 163, 2, 249, 144, 23, 3, 1, 237, - 163, 2, 209, 25, 219, 178, 23, 3, 1, 237, 163, 2, 193, 25, 219, 178, 23, - 3, 1, 237, 163, 2, 209, 25, 230, 64, 23, 3, 1, 237, 163, 2, 193, 25, 230, - 64, 23, 3, 1, 237, 163, 2, 209, 25, 229, 163, 23, 3, 1, 237, 163, 2, 193, - 25, 229, 163, 23, 6, 1, 237, 163, 2, 228, 206, 23, 6, 1, 237, 163, 2, - 249, 144, 23, 6, 1, 237, 163, 2, 209, 25, 219, 178, 23, 6, 1, 237, 163, - 2, 193, 25, 219, 178, 23, 6, 1, 237, 163, 2, 209, 25, 230, 64, 23, 6, 1, - 237, 163, 2, 193, 25, 230, 64, 23, 6, 1, 237, 163, 2, 209, 25, 229, 163, - 23, 6, 1, 237, 163, 2, 193, 25, 229, 163, 23, 3, 1, 230, 142, 2, 228, - 206, 23, 3, 1, 230, 142, 2, 249, 144, 23, 3, 1, 230, 142, 2, 209, 25, - 219, 178, 23, 3, 1, 230, 142, 2, 193, 25, 219, 178, 23, 3, 1, 230, 142, - 2, 209, 25, 230, 64, 23, 3, 1, 230, 142, 2, 193, 25, 230, 64, 23, 6, 1, - 230, 142, 2, 228, 206, 23, 6, 1, 230, 142, 2, 249, 144, 23, 6, 1, 230, - 142, 2, 209, 25, 219, 178, 23, 6, 1, 230, 142, 2, 193, 25, 219, 178, 23, - 6, 1, 230, 142, 2, 209, 25, 230, 64, 23, 6, 1, 230, 142, 2, 193, 25, 230, - 64, 23, 3, 1, 220, 58, 2, 228, 206, 23, 3, 1, 220, 58, 2, 249, 144, 23, - 3, 1, 220, 58, 2, 209, 25, 219, 178, 23, 3, 1, 220, 58, 2, 193, 25, 219, - 178, 23, 3, 1, 220, 58, 2, 209, 25, 230, 64, 23, 3, 1, 220, 58, 2, 193, - 25, 230, 64, 23, 3, 1, 220, 58, 2, 209, 25, 229, 163, 23, 3, 1, 220, 58, - 2, 193, 25, 229, 163, 23, 6, 1, 220, 58, 2, 249, 144, 23, 6, 1, 220, 58, - 2, 193, 25, 219, 178, 23, 6, 1, 220, 58, 2, 193, 25, 230, 64, 23, 6, 1, - 220, 58, 2, 193, 25, 229, 163, 23, 3, 1, 230, 144, 2, 228, 206, 23, 3, 1, - 230, 144, 2, 249, 144, 23, 3, 1, 230, 144, 2, 209, 25, 219, 178, 23, 3, - 1, 230, 144, 2, 193, 25, 219, 178, 23, 3, 1, 230, 144, 2, 209, 25, 230, - 64, 23, 3, 1, 230, 144, 2, 193, 25, 230, 64, 23, 3, 1, 230, 144, 2, 209, - 25, 229, 163, 23, 3, 1, 230, 144, 2, 193, 25, 229, 163, 23, 6, 1, 230, - 144, 2, 228, 206, 23, 6, 1, 230, 144, 2, 249, 144, 23, 6, 1, 230, 144, 2, - 209, 25, 219, 178, 23, 6, 1, 230, 144, 2, 193, 25, 219, 178, 23, 6, 1, - 230, 144, 2, 209, 25, 230, 64, 23, 6, 1, 230, 144, 2, 193, 25, 230, 64, - 23, 6, 1, 230, 144, 2, 209, 25, 229, 163, 23, 6, 1, 230, 144, 2, 193, 25, - 229, 163, 23, 3, 1, 254, 147, 2, 219, 178, 23, 3, 1, 254, 147, 2, 230, - 64, 23, 3, 1, 246, 157, 2, 219, 178, 23, 3, 1, 246, 157, 2, 230, 64, 23, - 3, 1, 246, 122, 2, 219, 178, 23, 3, 1, 246, 122, 2, 230, 64, 23, 3, 1, - 237, 163, 2, 219, 178, 23, 3, 1, 237, 163, 2, 230, 64, 23, 3, 1, 230, - 142, 2, 219, 178, 23, 3, 1, 230, 142, 2, 230, 64, 23, 3, 1, 220, 58, 2, - 219, 178, 23, 3, 1, 220, 58, 2, 230, 64, 23, 3, 1, 230, 144, 2, 219, 178, - 23, 3, 1, 230, 144, 2, 230, 64, 23, 3, 1, 254, 147, 2, 209, 25, 217, 207, - 23, 3, 1, 254, 147, 2, 193, 25, 217, 207, 23, 3, 1, 254, 147, 2, 209, 25, - 219, 179, 25, 217, 207, 23, 3, 1, 254, 147, 2, 193, 25, 219, 179, 25, - 217, 207, 23, 3, 1, 254, 147, 2, 209, 25, 230, 65, 25, 217, 207, 23, 3, - 1, 254, 147, 2, 193, 25, 230, 65, 25, 217, 207, 23, 3, 1, 254, 147, 2, - 209, 25, 229, 164, 25, 217, 207, 23, 3, 1, 254, 147, 2, 193, 25, 229, - 164, 25, 217, 207, 23, 6, 1, 254, 147, 2, 209, 25, 228, 217, 23, 6, 1, - 254, 147, 2, 193, 25, 228, 217, 23, 6, 1, 254, 147, 2, 209, 25, 219, 179, - 25, 228, 217, 23, 6, 1, 254, 147, 2, 193, 25, 219, 179, 25, 228, 217, 23, - 6, 1, 254, 147, 2, 209, 25, 230, 65, 25, 228, 217, 23, 6, 1, 254, 147, 2, - 193, 25, 230, 65, 25, 228, 217, 23, 6, 1, 254, 147, 2, 209, 25, 229, 164, - 25, 228, 217, 23, 6, 1, 254, 147, 2, 193, 25, 229, 164, 25, 228, 217, 23, - 3, 1, 246, 122, 2, 209, 25, 217, 207, 23, 3, 1, 246, 122, 2, 193, 25, - 217, 207, 23, 3, 1, 246, 122, 2, 209, 25, 219, 179, 25, 217, 207, 23, 3, - 1, 246, 122, 2, 193, 25, 219, 179, 25, 217, 207, 23, 3, 1, 246, 122, 2, - 209, 25, 230, 65, 25, 217, 207, 23, 3, 1, 246, 122, 2, 193, 25, 230, 65, - 25, 217, 207, 23, 3, 1, 246, 122, 2, 209, 25, 229, 164, 25, 217, 207, 23, - 3, 1, 246, 122, 2, 193, 25, 229, 164, 25, 217, 207, 23, 6, 1, 246, 122, - 2, 209, 25, 228, 217, 23, 6, 1, 246, 122, 2, 193, 25, 228, 217, 23, 6, 1, - 246, 122, 2, 209, 25, 219, 179, 25, 228, 217, 23, 6, 1, 246, 122, 2, 193, - 25, 219, 179, 25, 228, 217, 23, 6, 1, 246, 122, 2, 209, 25, 230, 65, 25, - 228, 217, 23, 6, 1, 246, 122, 2, 193, 25, 230, 65, 25, 228, 217, 23, 6, - 1, 246, 122, 2, 209, 25, 229, 164, 25, 228, 217, 23, 6, 1, 246, 122, 2, - 193, 25, 229, 164, 25, 228, 217, 23, 3, 1, 230, 144, 2, 209, 25, 217, - 207, 23, 3, 1, 230, 144, 2, 193, 25, 217, 207, 23, 3, 1, 230, 144, 2, - 209, 25, 219, 179, 25, 217, 207, 23, 3, 1, 230, 144, 2, 193, 25, 219, - 179, 25, 217, 207, 23, 3, 1, 230, 144, 2, 209, 25, 230, 65, 25, 217, 207, - 23, 3, 1, 230, 144, 2, 193, 25, 230, 65, 25, 217, 207, 23, 3, 1, 230, - 144, 2, 209, 25, 229, 164, 25, 217, 207, 23, 3, 1, 230, 144, 2, 193, 25, - 229, 164, 25, 217, 207, 23, 6, 1, 230, 144, 2, 209, 25, 228, 217, 23, 6, - 1, 230, 144, 2, 193, 25, 228, 217, 23, 6, 1, 230, 144, 2, 209, 25, 219, - 179, 25, 228, 217, 23, 6, 1, 230, 144, 2, 193, 25, 219, 179, 25, 228, - 217, 23, 6, 1, 230, 144, 2, 209, 25, 230, 65, 25, 228, 217, 23, 6, 1, - 230, 144, 2, 193, 25, 230, 65, 25, 228, 217, 23, 6, 1, 230, 144, 2, 209, - 25, 229, 164, 25, 228, 217, 23, 6, 1, 230, 144, 2, 193, 25, 229, 164, 25, - 228, 217, 23, 3, 1, 254, 147, 2, 219, 57, 23, 3, 1, 254, 147, 2, 234, - 115, 23, 3, 1, 254, 147, 2, 219, 179, 25, 217, 207, 23, 3, 1, 254, 147, - 2, 217, 207, 23, 3, 1, 254, 147, 2, 230, 65, 25, 217, 207, 23, 3, 1, 254, - 147, 2, 229, 163, 23, 3, 1, 254, 147, 2, 229, 164, 25, 217, 207, 23, 6, - 1, 254, 147, 2, 219, 57, 23, 6, 1, 254, 147, 2, 234, 115, 23, 6, 1, 254, - 147, 2, 219, 178, 23, 6, 1, 254, 147, 2, 230, 64, 23, 6, 1, 254, 147, 2, - 228, 217, 23, 236, 33, 23, 228, 217, 23, 228, 206, 23, 229, 163, 23, 249, - 8, 25, 229, 163, 23, 3, 1, 246, 122, 2, 219, 179, 25, 217, 207, 23, 3, 1, - 246, 122, 2, 217, 207, 23, 3, 1, 246, 122, 2, 230, 65, 25, 217, 207, 23, - 3, 1, 246, 122, 2, 229, 163, 23, 3, 1, 246, 122, 2, 229, 164, 25, 217, - 207, 23, 6, 1, 246, 157, 2, 219, 178, 23, 6, 1, 246, 157, 2, 230, 64, 23, - 6, 1, 246, 122, 2, 219, 178, 23, 6, 1, 246, 122, 2, 230, 64, 23, 6, 1, - 246, 122, 2, 228, 217, 23, 209, 25, 219, 178, 23, 209, 25, 230, 64, 23, - 209, 25, 229, 163, 23, 3, 1, 237, 163, 2, 219, 57, 23, 3, 1, 237, 163, 2, - 234, 115, 23, 3, 1, 237, 163, 2, 249, 8, 25, 219, 178, 23, 3, 1, 237, - 163, 2, 249, 8, 25, 230, 64, 23, 3, 1, 237, 163, 2, 229, 163, 23, 3, 1, - 237, 163, 2, 249, 8, 25, 229, 163, 23, 6, 1, 237, 163, 2, 219, 57, 23, 6, - 1, 237, 163, 2, 234, 115, 23, 6, 1, 237, 163, 2, 219, 178, 23, 6, 1, 237, - 163, 2, 230, 64, 23, 193, 25, 219, 178, 23, 193, 25, 230, 64, 23, 193, - 25, 229, 163, 23, 3, 1, 220, 58, 2, 219, 57, 23, 3, 1, 220, 58, 2, 234, - 115, 23, 3, 1, 220, 58, 2, 249, 8, 25, 219, 178, 23, 3, 1, 220, 58, 2, - 249, 8, 25, 230, 64, 23, 3, 1, 227, 150, 2, 228, 206, 23, 3, 1, 227, 150, - 2, 249, 144, 23, 3, 1, 220, 58, 2, 229, 163, 23, 3, 1, 220, 58, 2, 249, - 8, 25, 229, 163, 23, 6, 1, 220, 58, 2, 219, 57, 23, 6, 1, 220, 58, 2, - 234, 115, 23, 6, 1, 220, 58, 2, 219, 178, 23, 6, 1, 220, 58, 2, 230, 64, - 23, 6, 1, 227, 150, 2, 249, 144, 23, 249, 8, 25, 219, 178, 23, 249, 8, - 25, 230, 64, 23, 219, 178, 23, 3, 1, 230, 144, 2, 219, 179, 25, 217, 207, - 23, 3, 1, 230, 144, 2, 217, 207, 23, 3, 1, 230, 144, 2, 230, 65, 25, 217, - 207, 23, 3, 1, 230, 144, 2, 229, 163, 23, 3, 1, 230, 144, 2, 229, 164, - 25, 217, 207, 23, 6, 1, 230, 142, 2, 219, 178, 23, 6, 1, 230, 142, 2, - 230, 64, 23, 6, 1, 230, 144, 2, 219, 178, 23, 6, 1, 230, 144, 2, 230, 64, - 23, 6, 1, 230, 144, 2, 228, 217, 23, 230, 64, 23, 249, 144, 246, 198, - 228, 95, 246, 206, 228, 95, 246, 198, 223, 254, 246, 206, 223, 254, 221, - 226, 223, 254, 245, 114, 223, 254, 224, 80, 223, 254, 245, 194, 223, 254, - 228, 197, 223, 254, 221, 253, 223, 254, 243, 201, 223, 254, 217, 85, 218, - 199, 223, 254, 217, 85, 218, 199, 231, 197, 217, 85, 218, 199, 237, 54, - 235, 108, 78, 227, 102, 78, 242, 121, 231, 198, 242, 121, 245, 194, 249, - 146, 246, 198, 249, 146, 246, 206, 249, 146, 186, 135, 51, 69, 235, 43, - 51, 109, 235, 43, 42, 224, 109, 228, 69, 78, 45, 224, 109, 228, 69, 78, - 224, 109, 234, 238, 228, 69, 78, 224, 109, 243, 98, 228, 69, 78, 42, 51, - 228, 69, 78, 45, 51, 228, 69, 78, 51, 234, 238, 228, 69, 78, 51, 243, 98, - 228, 69, 78, 249, 192, 51, 249, 192, 251, 241, 221, 87, 251, 241, 131, - 61, 235, 121, 124, 61, 235, 121, 186, 246, 208, 242, 119, 229, 31, 235, - 44, 225, 54, 229, 241, 225, 54, 235, 108, 246, 204, 227, 102, 246, 204, - 229, 20, 248, 209, 245, 123, 235, 108, 230, 71, 227, 102, 230, 71, 232, - 210, 231, 203, 223, 254, 229, 170, 233, 164, 55, 229, 170, 222, 66, 221, - 232, 55, 228, 235, 51, 228, 235, 221, 78, 228, 235, 210, 228, 235, 210, - 51, 228, 235, 210, 221, 78, 228, 235, 251, 134, 224, 109, 235, 112, 254, - 120, 228, 69, 78, 224, 109, 227, 106, 254, 120, 228, 69, 78, 227, 199, - 78, 51, 246, 95, 78, 237, 177, 230, 73, 220, 78, 126, 221, 200, 251, 135, - 237, 191, 229, 31, 253, 249, 242, 122, 251, 241, 245, 108, 224, 55, 42, - 40, 252, 18, 2, 228, 77, 45, 40, 252, 18, 2, 228, 77, 51, 228, 82, 78, - 228, 82, 246, 95, 78, 246, 95, 228, 82, 78, 221, 164, 5, 246, 123, 210, - 229, 73, 55, 84, 127, 251, 241, 84, 90, 251, 241, 109, 253, 251, 210, - 225, 67, 250, 198, 220, 63, 124, 253, 250, 254, 159, 219, 101, 250, 167, - 233, 155, 55, 223, 23, 249, 146, 237, 170, 220, 78, 245, 145, 228, 197, - 78, 148, 61, 228, 196, 228, 92, 228, 235, 245, 116, 61, 228, 196, 245, - 170, 61, 228, 196, 124, 61, 228, 196, 245, 116, 61, 78, 247, 143, 250, - 100, 221, 86, 69, 245, 116, 248, 143, 234, 18, 14, 223, 254, 218, 174, - 237, 54, 245, 88, 254, 76, 237, 168, 221, 176, 237, 168, 225, 54, 237, - 168, 229, 43, 237, 201, 222, 228, 223, 34, 254, 250, 222, 228, 223, 34, - 237, 201, 12, 245, 124, 225, 5, 254, 250, 12, 245, 124, 225, 5, 232, 206, - 20, 225, 6, 231, 199, 20, 225, 6, 223, 59, 217, 84, 223, 59, 7, 3, 1, 72, - 223, 59, 154, 223, 59, 174, 223, 59, 182, 223, 59, 191, 223, 59, 185, - 223, 59, 190, 223, 59, 88, 55, 223, 59, 233, 154, 223, 59, 246, 154, 55, - 223, 59, 42, 229, 229, 223, 59, 45, 229, 229, 223, 59, 7, 3, 1, 207, 223, - 94, 217, 84, 223, 94, 107, 223, 94, 103, 223, 94, 160, 223, 94, 154, 223, - 94, 174, 223, 94, 182, 223, 94, 191, 223, 94, 185, 223, 94, 190, 223, 94, - 88, 55, 223, 94, 233, 154, 223, 94, 246, 154, 55, 223, 94, 42, 229, 229, - 223, 94, 45, 229, 229, 7, 223, 94, 3, 1, 60, 7, 223, 94, 3, 1, 73, 7, - 223, 94, 3, 1, 74, 7, 223, 94, 3, 1, 218, 151, 7, 223, 94, 3, 1, 226, - 104, 246, 106, 55, 250, 176, 55, 250, 94, 55, 245, 102, 245, 104, 55, - 235, 30, 55, 233, 165, 55, 232, 223, 55, 229, 153, 55, 227, 4, 55, 218, - 182, 55, 146, 224, 232, 55, 248, 152, 55, 246, 107, 55, 236, 100, 55, - 220, 252, 55, 247, 127, 55, 244, 170, 229, 177, 55, 229, 151, 55, 244, - 14, 55, 253, 224, 55, 242, 176, 55, 251, 94, 55, 235, 24, 221, 111, 55, - 223, 246, 55, 222, 64, 55, 36, 42, 243, 177, 50, 36, 45, 243, 177, 50, - 36, 171, 69, 235, 44, 230, 74, 36, 224, 192, 69, 235, 44, 230, 74, 36, - 254, 104, 76, 50, 36, 250, 199, 76, 50, 36, 42, 76, 50, 36, 45, 76, 50, - 36, 227, 94, 230, 74, 36, 250, 199, 227, 94, 230, 74, 36, 254, 104, 227, - 94, 230, 74, 36, 148, 188, 50, 36, 245, 116, 188, 50, 36, 246, 193, 250, - 221, 36, 246, 193, 223, 227, 36, 246, 193, 249, 4, 36, 246, 193, 250, - 222, 252, 230, 36, 42, 45, 76, 50, 36, 246, 193, 226, 100, 36, 246, 193, - 236, 152, 36, 246, 193, 220, 55, 229, 28, 221, 90, 36, 227, 160, 224, 18, - 230, 74, 36, 51, 69, 214, 230, 74, 36, 254, 111, 100, 36, 221, 78, 220, - 80, 36, 218, 201, 252, 4, 50, 36, 127, 76, 230, 74, 36, 171, 51, 224, 18, - 230, 74, 36, 90, 243, 177, 2, 192, 247, 129, 36, 127, 243, 177, 2, 192, - 247, 129, 36, 42, 76, 56, 36, 45, 76, 56, 36, 253, 252, 50, 254, 254, - 230, 165, 254, 241, 199, 222, 23, 223, 98, 173, 6, 251, 202, 249, 77, - 251, 88, 251, 85, 235, 44, 100, 251, 136, 230, 165, 251, 165, 220, 86, - 246, 108, 250, 144, 226, 98, 249, 77, 245, 250, 102, 3, 245, 67, 102, 6, - 243, 225, 252, 51, 6, 243, 225, 173, 6, 243, 225, 229, 53, 250, 144, 229, - 53, 250, 145, 104, 124, 229, 108, 102, 6, 72, 252, 51, 6, 72, 102, 6, - 153, 102, 3, 153, 235, 202, 49, 252, 201, 100, 173, 6, 207, 231, 105, 55, - 224, 9, 227, 210, 250, 125, 102, 6, 230, 59, 173, 6, 230, 59, 173, 6, - 228, 163, 102, 6, 152, 252, 51, 6, 152, 173, 6, 152, 228, 239, 222, 129, - 227, 169, 225, 50, 78, 222, 72, 55, 221, 107, 164, 55, 219, 153, 173, 6, - 217, 157, 230, 85, 55, 230, 160, 55, 237, 170, 230, 160, 55, 252, 51, 6, - 217, 157, 215, 23, 3, 1, 237, 162, 236, 175, 55, 254, 118, 55, 102, 6, - 253, 204, 252, 51, 6, 251, 202, 246, 126, 100, 102, 3, 73, 102, 6, 73, - 102, 6, 246, 74, 215, 6, 246, 74, 102, 6, 189, 102, 3, 74, 99, 100, 252, - 105, 100, 244, 92, 100, 249, 178, 100, 237, 205, 224, 7, 227, 59, 6, 228, - 163, 245, 252, 55, 173, 3, 229, 108, 173, 3, 244, 231, 173, 6, 244, 231, - 173, 6, 229, 108, 173, 233, 33, 223, 71, 215, 33, 6, 245, 67, 215, 33, 6, - 153, 210, 33, 6, 153, 215, 33, 6, 218, 90, 173, 30, 6, 250, 46, 173, 30, - 3, 250, 46, 173, 30, 3, 73, 173, 30, 3, 72, 173, 30, 3, 237, 126, 228, - 220, 235, 43, 215, 254, 134, 229, 170, 55, 254, 177, 215, 3, 246, 74, 16, - 35, 213, 224, 7, 219, 55, 245, 108, 131, 225, 40, 219, 55, 245, 108, 131, - 232, 26, 219, 55, 245, 108, 131, 222, 61, 219, 55, 245, 108, 131, 221, - 251, 219, 55, 245, 108, 124, 221, 249, 219, 55, 245, 108, 131, 245, 199, - 219, 55, 245, 108, 124, 245, 198, 219, 55, 245, 108, 148, 245, 198, 219, - 55, 245, 108, 245, 116, 245, 198, 219, 55, 245, 108, 131, 224, 73, 219, - 55, 245, 108, 245, 170, 224, 71, 219, 55, 245, 108, 131, 246, 231, 219, - 55, 245, 108, 148, 246, 229, 219, 55, 245, 108, 245, 170, 246, 229, 219, - 55, 245, 108, 225, 43, 246, 229, 245, 108, 231, 106, 107, 227, 68, 231, - 107, 107, 227, 68, 231, 107, 103, 227, 68, 231, 107, 160, 227, 68, 231, - 107, 154, 227, 68, 231, 107, 174, 227, 68, 231, 107, 182, 227, 68, 231, - 107, 191, 227, 68, 231, 107, 185, 227, 68, 231, 107, 190, 227, 68, 231, - 107, 222, 65, 227, 68, 231, 107, 246, 211, 227, 68, 231, 107, 220, 221, - 227, 68, 231, 107, 245, 196, 227, 68, 231, 107, 131, 242, 161, 227, 68, - 231, 107, 245, 170, 242, 161, 227, 68, 231, 107, 131, 221, 231, 3, 227, - 68, 231, 107, 107, 3, 227, 68, 231, 107, 103, 3, 227, 68, 231, 107, 160, - 3, 227, 68, 231, 107, 154, 3, 227, 68, 231, 107, 174, 3, 227, 68, 231, - 107, 182, 3, 227, 68, 231, 107, 191, 3, 227, 68, 231, 107, 185, 3, 227, - 68, 231, 107, 190, 3, 227, 68, 231, 107, 222, 65, 3, 227, 68, 231, 107, - 246, 211, 3, 227, 68, 231, 107, 220, 221, 3, 227, 68, 231, 107, 245, 196, - 3, 227, 68, 231, 107, 131, 242, 161, 3, 227, 68, 231, 107, 245, 170, 242, - 161, 3, 227, 68, 231, 107, 131, 221, 231, 227, 68, 231, 107, 131, 221, - 232, 251, 203, 250, 46, 227, 68, 231, 107, 245, 170, 221, 231, 227, 68, - 231, 107, 222, 66, 221, 231, 227, 68, 231, 107, 210, 131, 242, 161, 7, 3, - 1, 210, 251, 202, 227, 68, 231, 107, 224, 82, 235, 140, 17, 227, 68, 231, - 107, 245, 197, 247, 10, 17, 227, 68, 231, 107, 245, 197, 221, 231, 227, - 68, 231, 107, 131, 242, 162, 221, 231, 219, 55, 245, 108, 217, 85, 221, - 249, 127, 65, 220, 53, 65, 90, 65, 247, 130, 65, 42, 45, 65, 108, 113, - 65, 231, 187, 218, 217, 65, 231, 187, 247, 5, 65, 224, 6, 247, 5, 65, - 224, 6, 218, 217, 65, 127, 76, 2, 92, 90, 76, 2, 92, 127, 218, 237, 65, - 90, 218, 237, 65, 127, 124, 243, 158, 65, 220, 53, 124, 243, 158, 65, 90, - 124, 243, 158, 65, 247, 130, 124, 243, 158, 65, 127, 76, 2, 222, 135, 90, - 76, 2, 222, 135, 127, 76, 245, 97, 135, 220, 53, 76, 245, 97, 135, 90, - 76, 245, 97, 135, 247, 130, 76, 245, 97, 135, 108, 113, 76, 2, 252, 189, - 127, 76, 2, 96, 90, 76, 2, 96, 127, 76, 2, 234, 247, 90, 76, 2, 234, 247, - 42, 45, 218, 237, 65, 42, 45, 76, 2, 92, 247, 130, 217, 33, 65, 220, 53, - 76, 2, 221, 170, 235, 107, 220, 53, 76, 2, 221, 170, 227, 100, 247, 130, - 76, 2, 221, 170, 235, 107, 247, 130, 76, 2, 221, 170, 227, 100, 90, 76, - 2, 250, 124, 247, 129, 247, 130, 76, 2, 250, 124, 235, 107, 254, 104, - 221, 120, 225, 70, 65, 250, 199, 221, 120, 225, 70, 65, 231, 187, 218, - 217, 76, 199, 171, 135, 127, 76, 199, 252, 201, 104, 90, 76, 199, 135, - 254, 104, 230, 119, 250, 222, 65, 250, 199, 230, 119, 250, 222, 65, 127, - 243, 177, 2, 192, 220, 52, 127, 243, 177, 2, 192, 247, 129, 220, 53, 243, - 177, 2, 192, 227, 100, 220, 53, 243, 177, 2, 192, 235, 107, 90, 243, 177, - 2, 192, 220, 52, 90, 243, 177, 2, 192, 247, 129, 247, 130, 243, 177, 2, - 192, 227, 100, 247, 130, 243, 177, 2, 192, 235, 107, 90, 76, 104, 127, - 65, 220, 53, 76, 127, 117, 247, 130, 65, 127, 76, 104, 90, 65, 127, 230, - 32, 254, 19, 220, 53, 230, 32, 254, 19, 90, 230, 32, 254, 19, 247, 130, - 230, 32, 254, 19, 127, 243, 177, 104, 90, 243, 176, 90, 243, 177, 104, - 127, 243, 176, 127, 51, 76, 2, 92, 42, 45, 51, 76, 2, 92, 90, 51, 76, 2, - 92, 127, 51, 65, 220, 53, 51, 65, 90, 51, 65, 247, 130, 51, 65, 42, 45, - 51, 65, 108, 113, 51, 65, 231, 187, 218, 217, 51, 65, 231, 187, 247, 5, - 51, 65, 224, 6, 247, 5, 51, 65, 224, 6, 218, 217, 51, 65, 127, 221, 78, - 65, 90, 221, 78, 65, 127, 223, 223, 65, 90, 223, 223, 65, 220, 53, 76, 2, - 51, 92, 247, 130, 76, 2, 51, 92, 127, 249, 145, 65, 220, 53, 249, 145, - 65, 90, 249, 145, 65, 247, 130, 249, 145, 65, 127, 76, 199, 135, 90, 76, - 199, 135, 127, 67, 65, 220, 53, 67, 65, 90, 67, 65, 247, 130, 67, 65, - 220, 53, 67, 76, 245, 97, 135, 220, 53, 67, 76, 230, 139, 229, 193, 220, - 53, 67, 76, 230, 139, 229, 194, 2, 186, 135, 220, 53, 67, 76, 230, 139, - 229, 194, 2, 69, 135, 220, 53, 67, 51, 65, 220, 53, 67, 51, 76, 230, 139, - 229, 193, 90, 67, 76, 245, 97, 218, 254, 231, 187, 218, 217, 76, 199, - 250, 123, 224, 6, 247, 5, 76, 199, 250, 123, 108, 113, 67, 65, 45, 76, 2, - 3, 250, 221, 247, 130, 76, 127, 117, 220, 53, 65, 148, 90, 254, 19, 127, - 76, 2, 69, 92, 90, 76, 2, 69, 92, 42, 45, 76, 2, 69, 92, 127, 76, 2, 51, - 69, 92, 90, 76, 2, 51, 69, 92, 42, 45, 76, 2, 51, 69, 92, 127, 230, 117, - 65, 90, 230, 117, 65, 42, 45, 230, 117, 65, 35, 254, 157, 250, 164, 229, - 223, 248, 246, 222, 14, 246, 91, 222, 14, 248, 160, 212, 246, 92, 246, - 199, 225, 45, 237, 215, 232, 231, 246, 213, 230, 165, 212, 254, 132, 246, - 213, 230, 165, 3, 246, 213, 230, 165, 250, 140, 254, 14, 233, 254, 248, - 160, 212, 250, 142, 254, 14, 233, 254, 3, 250, 140, 254, 14, 233, 254, - 246, 190, 117, 228, 222, 233, 33, 228, 229, 233, 33, 250, 128, 233, 33, - 223, 71, 233, 155, 55, 233, 153, 55, 61, 229, 43, 248, 188, 224, 55, 225, - 46, 233, 154, 253, 252, 230, 112, 227, 94, 230, 112, 251, 242, 230, 112, - 40, 227, 64, 250, 89, 227, 64, 245, 110, 227, 64, 228, 218, 101, 237, - 207, 45, 254, 119, 254, 119, 234, 22, 254, 119, 223, 245, 254, 119, 248, - 190, 248, 160, 212, 248, 193, 229, 234, 101, 212, 229, 234, 101, 235, 7, - 254, 126, 235, 7, 230, 105, 237, 174, 220, 74, 237, 186, 51, 237, 186, - 221, 78, 237, 186, 250, 136, 237, 186, 223, 49, 237, 186, 219, 65, 237, - 186, 250, 199, 237, 186, 250, 199, 250, 136, 237, 186, 254, 104, 250, - 136, 237, 186, 222, 13, 252, 138, 227, 224, 228, 219, 61, 233, 154, 246, - 96, 244, 176, 228, 219, 242, 250, 221, 180, 230, 112, 210, 221, 179, 237, - 170, 235, 129, 198, 224, 111, 218, 236, 218, 168, 228, 229, 212, 221, - 179, 233, 155, 221, 179, 253, 247, 114, 101, 212, 253, 247, 114, 101, - 254, 72, 114, 101, 254, 72, 251, 222, 212, 254, 249, 114, 101, 232, 135, - 254, 72, 231, 190, 254, 249, 114, 101, 254, 151, 114, 101, 212, 254, 151, - 114, 101, 254, 151, 114, 156, 114, 101, 221, 78, 221, 179, 254, 158, 114, - 101, 246, 150, 101, 244, 175, 246, 150, 101, 248, 247, 252, 99, 254, 74, - 222, 23, 235, 51, 244, 175, 114, 101, 254, 72, 114, 199, 156, 222, 23, - 237, 237, 230, 165, 237, 237, 117, 156, 254, 72, 114, 101, 250, 176, 246, - 153, 246, 154, 250, 175, 227, 94, 237, 224, 114, 101, 227, 94, 114, 101, - 250, 117, 101, 246, 125, 246, 152, 101, 223, 157, 246, 153, 249, 63, 114, - 101, 114, 199, 251, 213, 249, 78, 234, 22, 251, 212, 228, 80, 114, 101, - 212, 114, 101, 242, 59, 101, 212, 242, 59, 101, 223, 123, 246, 150, 101, - 235, 87, 156, 114, 101, 244, 30, 156, 114, 101, 235, 87, 104, 114, 101, - 244, 30, 104, 114, 101, 235, 87, 251, 222, 212, 114, 101, 244, 30, 251, - 222, 212, 114, 101, 233, 95, 235, 86, 233, 95, 244, 29, 252, 99, 212, - 246, 150, 101, 212, 235, 86, 212, 244, 29, 232, 135, 235, 87, 231, 190, - 114, 101, 232, 135, 244, 30, 231, 190, 114, 101, 235, 87, 156, 246, 150, - 101, 244, 30, 156, 246, 150, 101, 232, 135, 235, 87, 231, 190, 246, 150, - 101, 232, 135, 244, 30, 231, 190, 246, 150, 101, 235, 87, 156, 244, 29, - 244, 30, 156, 235, 86, 232, 135, 235, 87, 231, 190, 244, 29, 232, 135, - 244, 30, 231, 190, 235, 86, 228, 244, 223, 84, 228, 245, 156, 114, 101, - 223, 85, 156, 114, 101, 228, 245, 156, 246, 150, 101, 223, 85, 156, 246, - 150, 101, 248, 160, 212, 228, 247, 248, 160, 212, 223, 86, 223, 93, 230, - 165, 223, 58, 230, 165, 212, 112, 223, 93, 230, 165, 212, 112, 223, 58, - 230, 165, 223, 93, 117, 156, 114, 101, 223, 58, 117, 156, 114, 101, 232, - 135, 112, 223, 93, 117, 231, 190, 114, 101, 232, 135, 112, 223, 58, 117, - 231, 190, 114, 101, 223, 93, 117, 2, 212, 114, 101, 223, 58, 117, 2, 212, - 114, 101, 233, 81, 233, 82, 233, 83, 233, 82, 220, 74, 40, 237, 237, 230, - 165, 40, 230, 101, 230, 165, 40, 237, 237, 117, 156, 114, 101, 40, 230, - 101, 117, 156, 114, 101, 40, 251, 143, 40, 250, 82, 34, 229, 43, 34, 233, - 154, 34, 221, 176, 34, 248, 188, 224, 55, 34, 61, 230, 112, 34, 227, 94, - 230, 112, 34, 253, 252, 230, 112, 34, 246, 153, 34, 249, 146, 204, 229, - 43, 204, 233, 154, 204, 221, 176, 204, 61, 230, 112, 45, 222, 143, 42, - 222, 143, 113, 222, 143, 108, 222, 143, 253, 255, 233, 133, 221, 62, 245, - 128, 221, 78, 69, 252, 201, 45, 220, 236, 51, 69, 252, 201, 51, 45, 220, - 236, 248, 160, 212, 228, 214, 212, 221, 62, 248, 160, 212, 245, 129, 232, - 138, 51, 69, 252, 201, 51, 45, 220, 236, 228, 245, 220, 82, 227, 192, - 223, 85, 220, 82, 227, 192, 231, 188, 223, 101, 230, 165, 250, 140, 254, - 14, 231, 188, 223, 100, 231, 188, 223, 101, 117, 156, 114, 101, 250, 140, - 254, 14, 231, 188, 223, 101, 156, 114, 101, 230, 101, 230, 165, 237, 237, - 230, 165, 233, 87, 243, 131, 250, 150, 234, 49, 237, 183, 218, 118, 232, - 216, 231, 189, 45, 254, 120, 2, 254, 51, 45, 221, 90, 233, 33, 235, 7, - 254, 126, 233, 33, 235, 7, 230, 105, 233, 33, 237, 174, 233, 33, 220, 74, - 249, 5, 230, 112, 61, 230, 112, 223, 157, 230, 112, 248, 188, 221, 176, - 252, 22, 42, 231, 188, 245, 251, 225, 66, 228, 229, 45, 231, 188, 245, - 251, 225, 66, 228, 229, 42, 225, 66, 228, 229, 45, 225, 66, 228, 229, - 210, 221, 180, 246, 153, 250, 79, 235, 7, 230, 105, 250, 79, 235, 7, 254, - 126, 51, 223, 92, 51, 223, 57, 51, 237, 174, 51, 220, 74, 229, 62, 114, - 25, 229, 234, 101, 235, 87, 2, 248, 145, 244, 30, 2, 248, 145, 219, 100, - 233, 95, 235, 86, 219, 100, 233, 95, 244, 29, 235, 87, 114, 199, 156, - 244, 29, 244, 30, 114, 199, 156, 235, 86, 114, 199, 156, 235, 86, 114, - 199, 156, 244, 29, 114, 199, 156, 228, 244, 114, 199, 156, 223, 84, 248, - 160, 212, 228, 248, 156, 246, 155, 248, 160, 212, 223, 87, 156, 246, 155, - 212, 40, 237, 237, 117, 156, 114, 101, 212, 40, 230, 101, 117, 156, 114, - 101, 40, 237, 237, 117, 156, 212, 114, 101, 40, 230, 101, 117, 156, 212, - 114, 101, 235, 87, 251, 222, 212, 246, 150, 101, 244, 30, 251, 222, 212, - 246, 150, 101, 228, 245, 251, 222, 212, 246, 150, 101, 223, 85, 251, 222, - 212, 246, 150, 101, 212, 231, 188, 223, 101, 230, 165, 248, 160, 212, - 250, 142, 254, 14, 231, 188, 223, 100, 212, 231, 188, 223, 101, 117, 156, - 114, 101, 248, 160, 212, 250, 142, 254, 14, 231, 188, 223, 101, 156, 246, - 155, 69, 246, 208, 233, 191, 186, 246, 208, 108, 45, 249, 11, 246, 208, - 113, 45, 249, 11, 246, 208, 246, 213, 117, 2, 171, 186, 92, 246, 213, - 117, 2, 69, 252, 201, 253, 245, 246, 190, 117, 186, 92, 3, 246, 213, 117, - 2, 69, 252, 201, 253, 245, 246, 190, 117, 186, 92, 246, 213, 117, 2, 61, - 50, 246, 213, 117, 2, 230, 77, 3, 246, 213, 117, 2, 230, 77, 246, 213, - 117, 2, 220, 81, 246, 213, 117, 2, 124, 186, 223, 107, 250, 140, 2, 171, - 186, 92, 250, 140, 2, 69, 252, 201, 253, 245, 246, 190, 117, 186, 92, 3, - 250, 140, 2, 69, 252, 201, 253, 245, 246, 190, 117, 186, 92, 250, 140, 2, - 230, 77, 3, 250, 140, 2, 230, 77, 217, 158, 165, 252, 226, 233, 253, 249, - 6, 55, 246, 215, 65, 242, 182, 108, 254, 20, 113, 254, 20, 228, 225, 229, - 156, 218, 235, 235, 43, 42, 251, 90, 45, 251, 90, 42, 245, 149, 45, 245, - 149, 252, 29, 45, 250, 102, 252, 29, 42, 250, 102, 221, 120, 45, 250, - 102, 221, 120, 42, 250, 102, 210, 212, 55, 40, 234, 234, 254, 51, 226, - 80, 226, 85, 222, 72, 227, 211, 229, 16, 237, 211, 219, 88, 223, 227, - 229, 57, 117, 237, 182, 55, 215, 212, 55, 218, 242, 242, 183, 221, 120, - 42, 250, 123, 221, 120, 45, 250, 123, 252, 29, 42, 250, 123, 252, 29, 45, - 250, 123, 221, 120, 144, 237, 186, 252, 29, 144, 237, 186, 245, 95, 224, - 39, 108, 254, 21, 252, 100, 124, 186, 252, 191, 230, 107, 236, 154, 246, - 146, 199, 222, 23, 227, 109, 218, 152, 237, 224, 112, 227, 209, 252, 21, - 236, 153, 235, 112, 254, 120, 115, 227, 106, 254, 120, 115, 246, 146, - 199, 222, 23, 235, 115, 252, 111, 227, 93, 250, 56, 254, 158, 254, 28, - 222, 227, 221, 112, 227, 9, 248, 228, 230, 102, 250, 152, 222, 113, 224, - 49, 250, 114, 250, 113, 179, 180, 16, 242, 104, 179, 180, 16, 223, 221, - 228, 95, 179, 180, 16, 228, 96, 246, 155, 179, 180, 16, 228, 96, 248, - 193, 179, 180, 16, 228, 96, 249, 4, 179, 180, 16, 228, 96, 237, 47, 179, - 180, 16, 228, 96, 250, 221, 179, 180, 16, 250, 222, 223, 142, 179, 180, - 16, 250, 222, 237, 47, 179, 180, 16, 224, 56, 135, 179, 180, 16, 252, - 231, 135, 179, 180, 16, 228, 96, 224, 55, 179, 180, 16, 228, 96, 252, - 230, 179, 180, 16, 228, 96, 235, 86, 179, 180, 16, 228, 96, 244, 29, 179, - 180, 16, 127, 219, 183, 179, 180, 16, 90, 219, 183, 179, 180, 16, 228, - 96, 127, 65, 179, 180, 16, 228, 96, 90, 65, 179, 180, 16, 250, 222, 252, - 230, 179, 180, 16, 113, 222, 144, 220, 81, 179, 180, 16, 249, 63, 223, - 142, 179, 180, 16, 228, 96, 113, 251, 134, 179, 180, 16, 228, 96, 249, - 62, 179, 180, 16, 113, 222, 144, 237, 47, 179, 180, 16, 220, 53, 219, - 183, 179, 180, 16, 228, 96, 220, 53, 65, 179, 180, 16, 108, 222, 144, - 230, 77, 179, 180, 16, 249, 72, 223, 142, 179, 180, 16, 228, 96, 108, - 251, 134, 179, 180, 16, 228, 96, 249, 71, 179, 180, 16, 108, 222, 144, - 237, 47, 179, 180, 16, 247, 130, 219, 183, 179, 180, 16, 228, 96, 247, - 130, 65, 179, 180, 16, 228, 68, 220, 81, 179, 180, 16, 249, 63, 220, 81, - 179, 180, 16, 249, 5, 220, 81, 179, 180, 16, 237, 48, 220, 81, 179, 180, - 16, 250, 222, 220, 81, 179, 180, 16, 108, 224, 198, 237, 47, 179, 180, - 16, 228, 68, 228, 95, 179, 180, 16, 250, 222, 223, 156, 179, 180, 16, - 228, 96, 250, 175, 179, 180, 16, 108, 222, 144, 249, 13, 179, 180, 16, - 249, 72, 249, 13, 179, 180, 16, 223, 157, 249, 13, 179, 180, 16, 237, 48, - 249, 13, 179, 180, 16, 250, 222, 249, 13, 179, 180, 16, 113, 224, 198, - 223, 142, 179, 180, 16, 42, 224, 198, 223, 142, 179, 180, 16, 221, 180, - 249, 13, 179, 180, 16, 244, 30, 249, 13, 179, 180, 16, 250, 169, 135, - 179, 180, 16, 249, 72, 221, 179, 179, 180, 16, 217, 32, 179, 180, 16, - 223, 143, 221, 179, 179, 180, 16, 225, 68, 220, 81, 179, 180, 16, 228, - 96, 212, 246, 155, 179, 180, 16, 228, 96, 228, 81, 179, 180, 16, 113, - 251, 135, 221, 179, 179, 180, 16, 108, 251, 135, 221, 179, 179, 180, 16, - 237, 162, 179, 180, 16, 227, 149, 179, 180, 16, 230, 143, 179, 180, 16, - 254, 147, 220, 81, 179, 180, 16, 246, 157, 220, 81, 179, 180, 16, 237, - 163, 220, 81, 179, 180, 16, 230, 144, 220, 81, 179, 180, 16, 254, 146, - 212, 251, 45, 78, 45, 254, 120, 2, 247, 130, 217, 33, 65, 224, 177, 230, - 119, 252, 21, 252, 120, 100, 69, 235, 44, 2, 233, 193, 248, 145, 237, - 191, 100, 250, 137, 220, 79, 100, 248, 204, 220, 79, 100, 246, 201, 100, - 250, 160, 100, 67, 40, 2, 251, 85, 69, 235, 43, 246, 179, 100, 254, 142, - 236, 155, 100, 243, 142, 100, 34, 186, 252, 201, 2, 231, 183, 34, 221, - 91, 247, 132, 252, 1, 250, 222, 2, 231, 186, 65, 220, 77, 100, 233, 122, - 100, 242, 117, 100, 230, 118, 243, 224, 100, 230, 118, 235, 200, 100, - 229, 218, 100, 229, 217, 100, 248, 210, 250, 77, 16, 245, 124, 103, 224, - 20, 100, 179, 180, 16, 228, 95, 249, 86, 225, 55, 236, 155, 100, 228, - 237, 230, 34, 232, 120, 230, 34, 228, 234, 226, 101, 100, 250, 209, 226, - 101, 100, 42, 229, 230, 220, 60, 96, 42, 229, 230, 246, 86, 42, 229, 230, - 234, 237, 96, 45, 229, 230, 220, 60, 96, 45, 229, 230, 246, 86, 45, 229, - 230, 234, 237, 96, 42, 40, 252, 18, 220, 60, 250, 123, 42, 40, 252, 18, - 246, 86, 42, 40, 252, 18, 234, 237, 250, 123, 45, 40, 252, 18, 220, 60, - 250, 123, 45, 40, 252, 18, 246, 86, 45, 40, 252, 18, 234, 237, 250, 123, - 42, 250, 79, 252, 18, 220, 60, 96, 42, 250, 79, 252, 18, 233, 193, 229, - 102, 42, 250, 79, 252, 18, 234, 237, 96, 250, 79, 252, 18, 246, 86, 45, - 250, 79, 252, 18, 220, 60, 96, 45, 250, 79, 252, 18, 233, 193, 229, 102, - 45, 250, 79, 252, 18, 234, 237, 96, 237, 187, 246, 86, 186, 235, 44, 246, - 86, 220, 60, 42, 156, 234, 237, 45, 250, 79, 252, 18, 226, 86, 220, 60, - 45, 156, 234, 237, 42, 250, 79, 252, 18, 226, 86, 223, 72, 221, 119, 223, - 72, 252, 28, 221, 120, 40, 115, 252, 29, 40, 115, 252, 29, 40, 252, 18, - 104, 221, 120, 40, 115, 32, 16, 252, 28, 42, 69, 86, 235, 43, 45, 69, 86, - 235, 43, 186, 226, 112, 235, 42, 186, 226, 112, 235, 41, 186, 226, 112, - 235, 40, 186, 226, 112, 235, 39, 249, 54, 16, 170, 69, 25, 221, 120, 227, - 109, 249, 54, 16, 170, 69, 25, 252, 29, 227, 109, 249, 54, 16, 170, 69, - 2, 250, 221, 249, 54, 16, 170, 113, 25, 186, 2, 250, 221, 249, 54, 16, - 170, 108, 25, 186, 2, 250, 221, 249, 54, 16, 170, 69, 2, 221, 90, 249, - 54, 16, 170, 113, 25, 186, 2, 221, 90, 249, 54, 16, 170, 108, 25, 186, 2, - 221, 90, 249, 54, 16, 170, 69, 25, 218, 236, 249, 54, 16, 170, 113, 25, - 186, 2, 218, 236, 249, 54, 16, 170, 108, 25, 186, 2, 218, 236, 249, 54, - 16, 170, 113, 25, 242, 241, 249, 54, 16, 170, 108, 25, 242, 241, 249, 54, - 16, 170, 69, 25, 221, 120, 235, 115, 249, 54, 16, 170, 69, 25, 252, 29, - 235, 115, 40, 245, 133, 227, 163, 100, 246, 225, 100, 69, 235, 44, 246, - 86, 233, 233, 252, 8, 233, 233, 171, 104, 224, 191, 233, 233, 224, 192, - 104, 235, 2, 233, 233, 171, 104, 124, 224, 179, 233, 233, 124, 224, 180, - 104, 235, 2, 233, 233, 124, 224, 180, 237, 55, 233, 233, 221, 75, 233, - 233, 222, 43, 233, 233, 229, 174, 247, 9, 244, 24, 245, 81, 221, 120, - 229, 229, 252, 29, 229, 229, 221, 120, 250, 79, 115, 252, 29, 250, 79, - 115, 221, 120, 221, 114, 224, 236, 115, 252, 29, 221, 114, 224, 236, 115, - 67, 221, 101, 252, 111, 227, 94, 2, 250, 221, 223, 129, 245, 155, 255, 3, - 250, 76, 246, 214, 237, 174, 249, 86, 246, 88, 100, 16, 35, 231, 110, 16, - 35, 223, 154, 117, 243, 157, 16, 35, 223, 154, 117, 222, 39, 16, 35, 246, - 190, 117, 222, 39, 16, 35, 246, 190, 117, 221, 104, 16, 35, 246, 181, 16, - 35, 254, 252, 16, 35, 252, 119, 16, 35, 252, 229, 16, 35, 186, 222, 145, - 16, 35, 235, 44, 245, 224, 16, 35, 69, 222, 145, 16, 35, 245, 124, 245, - 224, 16, 35, 251, 128, 227, 162, 16, 35, 224, 217, 230, 83, 16, 35, 224, - 217, 237, 223, 16, 35, 249, 142, 235, 34, 246, 135, 16, 35, 249, 42, 250, - 132, 107, 16, 35, 249, 42, 250, 132, 103, 16, 35, 249, 42, 250, 132, 160, - 16, 35, 249, 42, 250, 132, 154, 16, 35, 232, 136, 254, 252, 16, 35, 222, - 224, 238, 28, 16, 35, 246, 190, 117, 221, 105, 252, 45, 16, 35, 251, 152, - 16, 35, 246, 190, 117, 234, 17, 16, 35, 223, 90, 16, 35, 246, 135, 16, - 35, 245, 189, 225, 54, 16, 35, 244, 23, 225, 54, 16, 35, 227, 212, 225, - 54, 16, 35, 220, 73, 225, 54, 16, 35, 223, 254, 16, 35, 249, 69, 252, 48, - 100, 230, 119, 252, 21, 16, 35, 232, 122, 16, 35, 249, 70, 245, 124, 103, - 16, 35, 223, 91, 245, 124, 103, 230, 171, 96, 230, 171, 251, 64, 230, - 171, 245, 127, 230, 171, 237, 170, 245, 127, 230, 171, 252, 117, 251, - 247, 230, 171, 252, 25, 221, 200, 230, 171, 252, 15, 252, 204, 242, 58, - 230, 171, 254, 135, 117, 251, 44, 230, 171, 249, 146, 230, 171, 250, 70, - 254, 254, 231, 108, 230, 171, 51, 252, 230, 34, 20, 107, 34, 20, 103, 34, - 20, 160, 34, 20, 154, 34, 20, 174, 34, 20, 182, 34, 20, 191, 34, 20, 185, - 34, 20, 190, 34, 54, 222, 65, 34, 54, 246, 211, 34, 54, 220, 221, 34, 54, - 221, 247, 34, 54, 245, 111, 34, 54, 245, 200, 34, 54, 224, 77, 34, 54, - 225, 41, 34, 54, 246, 233, 34, 54, 232, 29, 34, 54, 220, 219, 82, 20, - 107, 82, 20, 103, 82, 20, 160, 82, 20, 154, 82, 20, 174, 82, 20, 182, 82, - 20, 191, 82, 20, 185, 82, 20, 190, 82, 54, 222, 65, 82, 54, 246, 211, 82, - 54, 220, 221, 82, 54, 221, 247, 82, 54, 245, 111, 82, 54, 245, 200, 82, - 54, 224, 77, 82, 54, 225, 41, 82, 54, 246, 233, 82, 54, 232, 29, 82, 54, - 220, 219, 20, 131, 245, 90, 223, 136, 20, 124, 245, 90, 223, 136, 20, - 148, 245, 90, 223, 136, 20, 245, 116, 245, 90, 223, 136, 20, 245, 170, - 245, 90, 223, 136, 20, 224, 82, 245, 90, 223, 136, 20, 225, 43, 245, 90, - 223, 136, 20, 246, 235, 245, 90, 223, 136, 20, 232, 31, 245, 90, 223, - 136, 54, 222, 66, 245, 90, 223, 136, 54, 246, 212, 245, 90, 223, 136, 54, - 220, 222, 245, 90, 223, 136, 54, 221, 248, 245, 90, 223, 136, 54, 245, - 112, 245, 90, 223, 136, 54, 245, 201, 245, 90, 223, 136, 54, 224, 78, - 245, 90, 223, 136, 54, 225, 42, 245, 90, 223, 136, 54, 246, 234, 245, 90, - 223, 136, 54, 232, 30, 245, 90, 223, 136, 54, 220, 220, 245, 90, 223, - 136, 82, 7, 3, 1, 60, 82, 7, 3, 1, 253, 204, 82, 7, 3, 1, 251, 202, 82, - 7, 3, 1, 250, 46, 82, 7, 3, 1, 73, 82, 7, 3, 1, 246, 74, 82, 7, 3, 1, - 245, 67, 82, 7, 3, 1, 243, 225, 82, 7, 3, 1, 72, 82, 7, 3, 1, 237, 126, - 82, 7, 3, 1, 237, 17, 82, 7, 3, 1, 153, 82, 7, 3, 1, 189, 82, 7, 3, 1, - 207, 82, 7, 3, 1, 74, 82, 7, 3, 1, 230, 59, 82, 7, 3, 1, 228, 163, 82, 7, - 3, 1, 152, 82, 7, 3, 1, 198, 82, 7, 3, 1, 222, 201, 82, 7, 3, 1, 68, 82, - 7, 3, 1, 216, 216, 82, 7, 3, 1, 219, 40, 82, 7, 3, 1, 218, 151, 82, 7, 3, - 1, 218, 90, 82, 7, 3, 1, 217, 157, 34, 7, 6, 1, 60, 34, 7, 6, 1, 253, - 204, 34, 7, 6, 1, 251, 202, 34, 7, 6, 1, 250, 46, 34, 7, 6, 1, 73, 34, 7, - 6, 1, 246, 74, 34, 7, 6, 1, 245, 67, 34, 7, 6, 1, 243, 225, 34, 7, 6, 1, - 72, 34, 7, 6, 1, 237, 126, 34, 7, 6, 1, 237, 17, 34, 7, 6, 1, 153, 34, 7, - 6, 1, 189, 34, 7, 6, 1, 207, 34, 7, 6, 1, 74, 34, 7, 6, 1, 230, 59, 34, - 7, 6, 1, 228, 163, 34, 7, 6, 1, 152, 34, 7, 6, 1, 198, 34, 7, 6, 1, 222, - 201, 34, 7, 6, 1, 68, 34, 7, 6, 1, 216, 216, 34, 7, 6, 1, 219, 40, 34, 7, - 6, 1, 218, 151, 34, 7, 6, 1, 218, 90, 34, 7, 6, 1, 217, 157, 34, 7, 3, 1, - 60, 34, 7, 3, 1, 253, 204, 34, 7, 3, 1, 251, 202, 34, 7, 3, 1, 250, 46, - 34, 7, 3, 1, 73, 34, 7, 3, 1, 246, 74, 34, 7, 3, 1, 245, 67, 34, 7, 3, 1, - 243, 225, 34, 7, 3, 1, 72, 34, 7, 3, 1, 237, 126, 34, 7, 3, 1, 237, 17, - 34, 7, 3, 1, 153, 34, 7, 3, 1, 189, 34, 7, 3, 1, 207, 34, 7, 3, 1, 74, - 34, 7, 3, 1, 230, 59, 34, 7, 3, 1, 228, 163, 34, 7, 3, 1, 152, 34, 7, 3, - 1, 198, 34, 7, 3, 1, 222, 201, 34, 7, 3, 1, 68, 34, 7, 3, 1, 216, 216, - 34, 7, 3, 1, 219, 40, 34, 7, 3, 1, 218, 151, 34, 7, 3, 1, 218, 90, 34, 7, - 3, 1, 217, 157, 34, 20, 217, 84, 232, 136, 34, 54, 246, 211, 232, 136, - 34, 54, 220, 221, 232, 136, 34, 54, 221, 247, 232, 136, 34, 54, 245, 111, - 232, 136, 34, 54, 245, 200, 232, 136, 34, 54, 224, 77, 232, 136, 34, 54, - 225, 41, 232, 136, 34, 54, 246, 233, 232, 136, 34, 54, 232, 29, 232, 136, - 34, 54, 220, 219, 51, 34, 20, 107, 51, 34, 20, 103, 51, 34, 20, 160, 51, - 34, 20, 154, 51, 34, 20, 174, 51, 34, 20, 182, 51, 34, 20, 191, 51, 34, - 20, 185, 51, 34, 20, 190, 51, 34, 54, 222, 65, 232, 136, 34, 20, 217, 84, - 86, 89, 170, 242, 241, 86, 89, 106, 242, 241, 86, 89, 170, 219, 152, 86, - 89, 106, 219, 152, 86, 89, 170, 221, 78, 249, 147, 242, 241, 86, 89, 106, - 221, 78, 249, 147, 242, 241, 86, 89, 170, 221, 78, 249, 147, 219, 152, - 86, 89, 106, 221, 78, 249, 147, 219, 152, 86, 89, 170, 228, 92, 249, 147, - 242, 241, 86, 89, 106, 228, 92, 249, 147, 242, 241, 86, 89, 170, 228, 92, - 249, 147, 219, 152, 86, 89, 106, 228, 92, 249, 147, 219, 152, 86, 89, - 170, 113, 25, 227, 109, 86, 89, 113, 170, 25, 45, 243, 149, 86, 89, 113, - 106, 25, 45, 235, 58, 86, 89, 106, 113, 25, 227, 109, 86, 89, 170, 113, - 25, 235, 115, 86, 89, 113, 170, 25, 42, 243, 149, 86, 89, 113, 106, 25, - 42, 235, 58, 86, 89, 106, 113, 25, 235, 115, 86, 89, 170, 108, 25, 227, - 109, 86, 89, 108, 170, 25, 45, 243, 149, 86, 89, 108, 106, 25, 45, 235, - 58, 86, 89, 106, 108, 25, 227, 109, 86, 89, 170, 108, 25, 235, 115, 86, - 89, 108, 170, 25, 42, 243, 149, 86, 89, 108, 106, 25, 42, 235, 58, 86, - 89, 106, 108, 25, 235, 115, 86, 89, 170, 69, 25, 227, 109, 86, 89, 69, - 170, 25, 45, 243, 149, 86, 89, 108, 106, 25, 45, 113, 235, 58, 86, 89, - 113, 106, 25, 45, 108, 235, 58, 86, 89, 69, 106, 25, 45, 235, 58, 86, 89, - 113, 170, 25, 45, 108, 243, 149, 86, 89, 108, 170, 25, 45, 113, 243, 149, - 86, 89, 106, 69, 25, 227, 109, 86, 89, 170, 69, 25, 235, 115, 86, 89, 69, - 170, 25, 42, 243, 149, 86, 89, 108, 106, 25, 42, 113, 235, 58, 86, 89, - 113, 106, 25, 42, 108, 235, 58, 86, 89, 69, 106, 25, 42, 235, 58, 86, 89, - 113, 170, 25, 42, 108, 243, 149, 86, 89, 108, 170, 25, 42, 113, 243, 149, - 86, 89, 106, 69, 25, 235, 115, 86, 89, 170, 113, 25, 242, 241, 86, 89, - 42, 106, 25, 45, 113, 235, 58, 86, 89, 45, 106, 25, 42, 113, 235, 58, 86, - 89, 113, 170, 25, 186, 243, 149, 86, 89, 113, 106, 25, 186, 235, 58, 86, - 89, 45, 170, 25, 42, 113, 243, 149, 86, 89, 42, 170, 25, 45, 113, 243, - 149, 86, 89, 106, 113, 25, 242, 241, 86, 89, 170, 108, 25, 242, 241, 86, - 89, 42, 106, 25, 45, 108, 235, 58, 86, 89, 45, 106, 25, 42, 108, 235, 58, - 86, 89, 108, 170, 25, 186, 243, 149, 86, 89, 108, 106, 25, 186, 235, 58, - 86, 89, 45, 170, 25, 42, 108, 243, 149, 86, 89, 42, 170, 25, 45, 108, - 243, 149, 86, 89, 106, 108, 25, 242, 241, 86, 89, 170, 69, 25, 242, 241, - 86, 89, 42, 106, 25, 45, 69, 235, 58, 86, 89, 45, 106, 25, 42, 69, 235, - 58, 86, 89, 69, 170, 25, 186, 243, 149, 86, 89, 108, 106, 25, 113, 186, - 235, 58, 86, 89, 113, 106, 25, 108, 186, 235, 58, 86, 89, 69, 106, 25, - 186, 235, 58, 86, 89, 42, 108, 106, 25, 45, 113, 235, 58, 86, 89, 45, - 108, 106, 25, 42, 113, 235, 58, 86, 89, 42, 113, 106, 25, 45, 108, 235, - 58, 86, 89, 45, 113, 106, 25, 42, 108, 235, 58, 86, 89, 113, 170, 25, - 108, 186, 243, 149, 86, 89, 108, 170, 25, 113, 186, 243, 149, 86, 89, 45, - 170, 25, 42, 69, 243, 149, 86, 89, 42, 170, 25, 45, 69, 243, 149, 86, 89, - 106, 69, 25, 242, 241, 86, 89, 170, 51, 249, 147, 242, 241, 86, 89, 106, - 51, 249, 147, 242, 241, 86, 89, 170, 51, 249, 147, 219, 152, 86, 89, 106, - 51, 249, 147, 219, 152, 86, 89, 51, 242, 241, 86, 89, 51, 219, 152, 86, - 89, 113, 224, 109, 25, 45, 247, 138, 86, 89, 113, 51, 25, 45, 224, 108, - 86, 89, 51, 113, 25, 227, 109, 86, 89, 113, 224, 109, 25, 42, 247, 138, - 86, 89, 113, 51, 25, 42, 224, 108, 86, 89, 51, 113, 25, 235, 115, 86, 89, - 108, 224, 109, 25, 45, 247, 138, 86, 89, 108, 51, 25, 45, 224, 108, 86, - 89, 51, 108, 25, 227, 109, 86, 89, 108, 224, 109, 25, 42, 247, 138, 86, - 89, 108, 51, 25, 42, 224, 108, 86, 89, 51, 108, 25, 235, 115, 86, 89, 69, - 224, 109, 25, 45, 247, 138, 86, 89, 69, 51, 25, 45, 224, 108, 86, 89, 51, - 69, 25, 227, 109, 86, 89, 69, 224, 109, 25, 42, 247, 138, 86, 89, 69, 51, - 25, 42, 224, 108, 86, 89, 51, 69, 25, 235, 115, 86, 89, 113, 224, 109, - 25, 186, 247, 138, 86, 89, 113, 51, 25, 186, 224, 108, 86, 89, 51, 113, - 25, 242, 241, 86, 89, 108, 224, 109, 25, 186, 247, 138, 86, 89, 108, 51, - 25, 186, 224, 108, 86, 89, 51, 108, 25, 242, 241, 86, 89, 69, 224, 109, - 25, 186, 247, 138, 86, 89, 69, 51, 25, 186, 224, 108, 86, 89, 51, 69, 25, - 242, 241, 86, 89, 170, 254, 52, 113, 25, 227, 109, 86, 89, 170, 254, 52, - 113, 25, 235, 115, 86, 89, 170, 254, 52, 108, 25, 235, 115, 86, 89, 170, - 254, 52, 108, 25, 227, 109, 86, 89, 170, 249, 11, 220, 60, 45, 199, 234, - 237, 235, 115, 86, 89, 170, 249, 11, 220, 60, 42, 199, 234, 237, 227, - 109, 86, 89, 170, 249, 11, 250, 100, 86, 89, 170, 235, 115, 86, 89, 170, - 220, 63, 86, 89, 170, 227, 109, 86, 89, 170, 247, 132, 86, 89, 106, 235, - 115, 86, 89, 106, 220, 63, 86, 89, 106, 227, 109, 86, 89, 106, 247, 132, - 86, 89, 170, 42, 25, 106, 227, 109, 86, 89, 170, 108, 25, 106, 247, 132, - 86, 89, 106, 42, 25, 170, 227, 109, 86, 89, 106, 108, 25, 170, 247, 132, - 220, 60, 144, 252, 45, 234, 237, 131, 246, 232, 252, 45, 234, 237, 131, - 228, 90, 252, 45, 234, 237, 148, 246, 230, 252, 45, 234, 237, 144, 252, - 45, 234, 237, 245, 170, 246, 230, 252, 45, 234, 237, 148, 228, 88, 252, - 45, 234, 237, 225, 43, 246, 230, 252, 45, 245, 90, 252, 45, 42, 225, 43, - 246, 230, 252, 45, 42, 148, 228, 88, 252, 45, 42, 245, 170, 246, 230, - 252, 45, 42, 144, 252, 45, 42, 148, 246, 230, 252, 45, 42, 131, 228, 90, - 252, 45, 42, 131, 246, 232, 252, 45, 45, 144, 252, 45, 170, 225, 15, 234, - 18, 225, 15, 249, 152, 225, 15, 220, 60, 131, 246, 232, 252, 45, 45, 131, - 246, 232, 252, 45, 228, 94, 234, 237, 235, 115, 228, 94, 234, 237, 227, - 109, 228, 94, 220, 60, 235, 115, 228, 94, 220, 60, 42, 25, 234, 237, 42, - 25, 234, 237, 227, 109, 228, 94, 220, 60, 42, 25, 234, 237, 227, 109, - 228, 94, 220, 60, 42, 25, 220, 60, 45, 25, 234, 237, 235, 115, 228, 94, - 220, 60, 42, 25, 220, 60, 45, 25, 234, 237, 227, 109, 228, 94, 220, 60, - 227, 109, 228, 94, 220, 60, 45, 25, 234, 237, 235, 115, 228, 94, 220, 60, - 45, 25, 234, 237, 42, 25, 234, 237, 227, 109, 84, 223, 227, 67, 223, 227, - 67, 40, 2, 227, 55, 250, 122, 67, 40, 250, 141, 84, 3, 223, 227, 40, 2, - 186, 245, 187, 40, 2, 69, 245, 187, 40, 2, 230, 95, 250, 96, 245, 187, - 40, 2, 220, 60, 42, 199, 234, 237, 45, 245, 187, 40, 2, 220, 60, 45, 199, - 234, 237, 42, 245, 187, 40, 2, 249, 11, 250, 96, 245, 187, 84, 3, 223, - 227, 67, 3, 223, 227, 84, 227, 208, 67, 227, 208, 84, 69, 227, 208, 67, - 69, 227, 208, 84, 229, 232, 67, 229, 232, 84, 220, 62, 221, 90, 67, 220, - 62, 221, 90, 84, 220, 62, 3, 221, 90, 67, 220, 62, 3, 221, 90, 84, 227, - 106, 221, 90, 67, 227, 106, 221, 90, 84, 227, 106, 3, 221, 90, 67, 227, - 106, 3, 221, 90, 84, 227, 106, 229, 29, 67, 227, 106, 229, 29, 84, 247, - 131, 221, 90, 67, 247, 131, 221, 90, 84, 247, 131, 3, 221, 90, 67, 247, - 131, 3, 221, 90, 84, 235, 112, 221, 90, 67, 235, 112, 221, 90, 84, 235, - 112, 3, 221, 90, 67, 235, 112, 3, 221, 90, 84, 235, 112, 229, 29, 67, - 235, 112, 229, 29, 84, 249, 4, 67, 249, 4, 67, 249, 5, 250, 141, 84, 3, - 249, 4, 245, 175, 234, 234, 67, 250, 221, 247, 143, 250, 221, 250, 222, - 2, 69, 245, 187, 251, 239, 84, 250, 221, 250, 222, 2, 42, 144, 252, 53, - 250, 222, 2, 45, 144, 252, 53, 250, 222, 2, 234, 237, 144, 252, 53, 250, - 222, 2, 220, 60, 144, 252, 53, 250, 222, 2, 220, 60, 45, 228, 94, 252, - 53, 250, 222, 2, 254, 158, 251, 222, 220, 60, 42, 228, 94, 252, 53, 42, - 144, 84, 250, 221, 45, 144, 84, 250, 221, 237, 171, 251, 241, 237, 171, - 67, 250, 221, 220, 60, 144, 237, 171, 67, 250, 221, 234, 237, 144, 237, - 171, 67, 250, 221, 220, 60, 42, 228, 94, 250, 219, 254, 51, 220, 60, 45, - 228, 94, 250, 219, 254, 51, 234, 237, 45, 228, 94, 250, 219, 254, 51, - 234, 237, 42, 228, 94, 250, 219, 254, 51, 220, 60, 144, 250, 221, 234, - 237, 144, 250, 221, 84, 234, 237, 45, 221, 90, 84, 234, 237, 42, 221, 90, - 84, 220, 60, 42, 221, 90, 84, 220, 60, 45, 221, 90, 67, 251, 241, 40, 2, - 42, 144, 252, 53, 40, 2, 45, 144, 252, 53, 40, 2, 220, 60, 42, 249, 11, - 144, 252, 53, 40, 2, 234, 237, 45, 249, 11, 144, 252, 53, 67, 40, 2, 69, - 252, 63, 235, 43, 67, 220, 62, 221, 91, 2, 248, 145, 220, 62, 221, 91, 2, - 42, 144, 252, 53, 220, 62, 221, 91, 2, 45, 144, 252, 53, 235, 146, 250, - 221, 67, 40, 2, 220, 60, 42, 228, 93, 67, 40, 2, 234, 237, 42, 228, 93, - 67, 40, 2, 234, 237, 45, 228, 93, 67, 40, 2, 220, 60, 45, 228, 93, 67, - 250, 222, 2, 220, 60, 42, 228, 93, 67, 250, 222, 2, 234, 237, 42, 228, - 93, 67, 250, 222, 2, 234, 237, 45, 228, 93, 67, 250, 222, 2, 220, 60, 45, - 228, 93, 220, 60, 42, 221, 90, 220, 60, 45, 221, 90, 234, 237, 42, 221, - 90, 67, 234, 18, 223, 227, 84, 234, 18, 223, 227, 67, 234, 18, 3, 223, - 227, 84, 234, 18, 3, 223, 227, 234, 237, 45, 221, 90, 84, 223, 69, 2, - 227, 220, 250, 189, 220, 91, 224, 28, 250, 171, 84, 223, 156, 67, 223, - 156, 235, 56, 221, 220, 223, 68, 254, 10, 231, 201, 249, 47, 231, 201, - 250, 149, 230, 109, 84, 222, 71, 67, 222, 71, 252, 213, 252, 21, 252, - 213, 86, 2, 251, 44, 252, 213, 86, 2, 218, 151, 226, 149, 220, 92, 2, - 227, 243, 247, 117, 242, 187, 252, 98, 67, 224, 196, 229, 102, 84, 224, - 196, 229, 102, 225, 11, 210, 227, 59, 245, 148, 243, 154, 251, 241, 84, - 42, 229, 28, 237, 213, 84, 45, 229, 28, 237, 213, 67, 42, 229, 28, 237, - 213, 67, 108, 229, 28, 237, 213, 67, 45, 229, 28, 237, 213, 67, 113, 229, - 28, 237, 213, 224, 60, 25, 250, 99, 251, 120, 55, 227, 250, 55, 252, 69, - 55, 251, 164, 254, 115, 230, 96, 250, 100, 251, 32, 227, 149, 250, 101, - 117, 234, 243, 250, 101, 117, 237, 105, 223, 157, 25, 250, 104, 245, 241, - 100, 254, 238, 225, 13, 243, 193, 25, 224, 138, 229, 197, 100, 217, 241, - 218, 45, 221, 82, 35, 243, 151, 221, 82, 35, 235, 165, 221, 82, 35, 245, - 179, 221, 82, 35, 221, 221, 221, 82, 35, 218, 194, 221, 82, 35, 218, 240, - 221, 82, 35, 233, 107, 221, 82, 35, 247, 8, 218, 211, 117, 249, 30, 67, - 245, 94, 246, 3, 67, 224, 38, 246, 3, 84, 224, 38, 246, 3, 67, 223, 69, - 2, 227, 220, 245, 178, 228, 90, 233, 117, 235, 142, 228, 90, 233, 117, - 233, 249, 245, 217, 55, 247, 8, 234, 90, 55, 237, 31, 226, 124, 220, 45, - 232, 129, 229, 41, 254, 39, 222, 104, 244, 182, 251, 150, 235, 90, 219, - 80, 235, 65, 226, 102, 226, 163, 251, 140, 254, 68, 229, 66, 67, 251, 37, - 236, 102, 67, 251, 37, 228, 83, 67, 251, 37, 227, 65, 67, 251, 37, 252, - 62, 67, 251, 37, 236, 59, 67, 251, 37, 229, 207, 84, 251, 37, 236, 102, - 84, 251, 37, 228, 83, 84, 251, 37, 227, 65, 84, 251, 37, 252, 62, 84, - 251, 37, 236, 59, 84, 251, 37, 229, 207, 84, 223, 252, 223, 80, 67, 243, - 154, 223, 80, 67, 249, 5, 223, 80, 84, 250, 188, 223, 80, 67, 223, 252, - 223, 80, 84, 243, 154, 223, 80, 84, 249, 5, 223, 80, 67, 250, 188, 223, - 80, 242, 187, 223, 231, 228, 90, 231, 180, 246, 232, 231, 180, 252, 142, - 246, 232, 231, 177, 252, 142, 224, 76, 231, 177, 233, 59, 245, 157, 55, - 233, 59, 232, 205, 55, 233, 59, 225, 1, 55, 218, 217, 166, 250, 100, 247, - 5, 166, 250, 100, 220, 70, 227, 204, 100, 227, 204, 16, 35, 220, 197, - 229, 50, 227, 204, 16, 35, 220, 196, 229, 50, 227, 204, 16, 35, 220, 195, - 229, 50, 227, 204, 16, 35, 220, 194, 229, 50, 227, 204, 16, 35, 220, 193, - 229, 50, 227, 204, 16, 35, 220, 192, 229, 50, 227, 204, 16, 35, 220, 191, - 229, 50, 227, 204, 16, 35, 244, 180, 234, 50, 84, 220, 70, 227, 204, 100, - 227, 205, 229, 245, 100, 229, 222, 229, 245, 100, 229, 162, 229, 245, 55, - 218, 209, 100, 248, 254, 246, 2, 248, 254, 246, 1, 248, 254, 246, 0, 248, - 254, 245, 255, 248, 254, 245, 254, 248, 254, 245, 253, 67, 250, 222, 2, - 61, 227, 109, 67, 250, 222, 2, 124, 248, 143, 84, 250, 222, 2, 67, 61, - 227, 109, 84, 250, 222, 2, 124, 67, 248, 143, 233, 125, 35, 218, 45, 233, - 125, 35, 217, 240, 248, 237, 35, 244, 31, 218, 45, 248, 237, 35, 235, 85, - 217, 240, 248, 237, 35, 235, 85, 218, 45, 248, 237, 35, 244, 31, 217, - 240, 67, 245, 163, 84, 245, 163, 243, 193, 25, 229, 104, 254, 128, 250, - 98, 223, 24, 223, 164, 117, 254, 218, 226, 113, 254, 167, 245, 144, 244, - 189, 223, 164, 117, 243, 133, 253, 238, 100, 245, 153, 230, 80, 67, 223, - 156, 148, 235, 38, 250, 131, 227, 109, 148, 235, 38, 250, 131, 235, 115, - 218, 250, 55, 116, 219, 66, 55, 247, 135, 245, 217, 55, 247, 135, 234, - 90, 55, 237, 179, 245, 217, 25, 234, 90, 55, 234, 90, 25, 245, 217, 55, - 234, 90, 2, 214, 55, 234, 90, 2, 214, 25, 234, 90, 25, 245, 217, 55, 69, - 234, 90, 2, 214, 55, 186, 234, 90, 2, 214, 55, 234, 18, 67, 250, 221, - 234, 18, 84, 250, 221, 234, 18, 3, 67, 250, 221, 234, 62, 100, 248, 186, - 100, 220, 69, 229, 221, 100, 250, 178, 245, 86, 220, 42, 232, 124, 251, - 72, 230, 25, 237, 37, 219, 98, 251, 18, 84, 233, 118, 235, 53, 225, 34, - 225, 64, 228, 75, 225, 48, 224, 24, 252, 215, 252, 188, 204, 236, 154, - 67, 247, 122, 234, 86, 67, 247, 122, 236, 102, 84, 247, 122, 234, 86, 84, - 247, 122, 236, 102, 224, 29, 218, 189, 224, 31, 223, 69, 252, 125, 250, - 189, 227, 242, 84, 224, 28, 221, 222, 250, 190, 25, 227, 242, 215, 67, - 224, 196, 229, 102, 215, 84, 224, 196, 229, 102, 67, 249, 5, 237, 224, - 223, 227, 250, 95, 235, 149, 248, 206, 251, 137, 229, 104, 251, 138, 224, - 51, 243, 141, 2, 67, 250, 100, 34, 250, 95, 235, 149, 251, 65, 231, 205, - 246, 174, 254, 144, 230, 135, 42, 218, 230, 221, 106, 84, 220, 204, 42, - 218, 230, 221, 106, 67, 220, 204, 42, 218, 230, 221, 106, 84, 42, 235, - 150, 233, 248, 67, 42, 235, 150, 233, 248, 247, 120, 224, 46, 55, 106, - 67, 247, 131, 221, 90, 42, 250, 197, 246, 174, 204, 226, 149, 245, 247, - 249, 11, 237, 224, 67, 250, 222, 237, 224, 84, 223, 227, 84, 221, 63, - 227, 167, 42, 246, 173, 227, 167, 42, 246, 172, 106, 250, 222, 2, 214, - 25, 124, 188, 50, 84, 250, 101, 230, 139, 224, 218, 224, 207, 224, 174, - 250, 245, 251, 125, 243, 93, 224, 83, 244, 190, 218, 189, 242, 171, 244, - 190, 2, 243, 188, 234, 79, 16, 35, 235, 57, 233, 107, 220, 92, 230, 139, - 244, 24, 245, 117, 245, 164, 237, 224, 242, 252, 245, 209, 226, 160, 40, - 245, 116, 250, 122, 224, 63, 242, 66, 224, 65, 229, 158, 2, 252, 215, - 222, 62, 237, 118, 252, 204, 100, 243, 156, 244, 33, 100, 245, 91, 228, - 198, 250, 83, 230, 139, 84, 223, 227, 67, 245, 164, 2, 186, 233, 193, 84, - 223, 120, 220, 60, 252, 49, 226, 103, 84, 226, 103, 234, 237, 252, 49, - 226, 103, 67, 226, 103, 222, 72, 235, 10, 55, 222, 114, 247, 119, 254, - 187, 246, 170, 219, 93, 243, 189, 218, 167, 243, 189, 234, 237, 45, 229, - 181, 229, 181, 220, 60, 45, 229, 181, 67, 232, 59, 84, 232, 59, 251, 45, - 78, 106, 251, 45, 78, 233, 84, 218, 151, 106, 233, 84, 218, 151, 252, - 213, 218, 151, 106, 252, 213, 218, 151, 230, 80, 23, 250, 100, 106, 23, - 250, 100, 230, 119, 251, 85, 250, 100, 106, 230, 119, 251, 85, 250, 100, - 7, 250, 100, 225, 14, 67, 7, 250, 100, 230, 80, 7, 250, 100, 234, 88, - 250, 100, 223, 157, 117, 249, 140, 245, 116, 222, 83, 253, 251, 245, 116, - 252, 214, 253, 251, 106, 245, 116, 252, 214, 253, 251, 245, 116, 250, - 186, 253, 251, 84, 245, 116, 229, 30, 223, 156, 67, 245, 116, 229, 30, - 223, 156, 223, 125, 230, 80, 67, 223, 156, 34, 67, 223, 156, 230, 119, - 251, 85, 84, 223, 156, 84, 251, 85, 67, 223, 156, 230, 80, 84, 223, 156, - 106, 230, 80, 84, 223, 156, 229, 71, 223, 156, 225, 14, 67, 223, 156, - 106, 253, 251, 230, 119, 251, 85, 253, 251, 246, 235, 223, 236, 253, 251, - 246, 235, 229, 30, 84, 223, 156, 246, 235, 229, 30, 229, 71, 223, 156, - 224, 82, 229, 30, 84, 223, 156, 246, 235, 229, 30, 227, 206, 84, 223, - 156, 106, 246, 235, 229, 30, 227, 206, 84, 223, 156, 220, 222, 229, 30, - 84, 223, 156, 224, 78, 229, 30, 253, 251, 222, 83, 253, 251, 230, 119, - 251, 85, 222, 83, 253, 251, 106, 222, 83, 253, 251, 224, 82, 229, 149, - 84, 25, 67, 245, 147, 84, 245, 147, 67, 245, 147, 246, 235, 229, 149, - 230, 80, 84, 245, 147, 34, 230, 119, 251, 85, 246, 235, 229, 30, 223, - 156, 106, 222, 83, 229, 71, 253, 251, 224, 30, 221, 195, 221, 85, 224, - 30, 106, 251, 35, 224, 30, 223, 251, 106, 223, 251, 252, 214, 253, 251, - 246, 235, 222, 83, 228, 221, 253, 251, 106, 246, 235, 222, 83, 228, 221, - 253, 251, 225, 14, 67, 250, 221, 234, 237, 45, 247, 118, 67, 223, 227, - 220, 60, 45, 247, 118, 67, 223, 227, 234, 237, 45, 225, 14, 67, 223, 227, - 220, 60, 45, 225, 14, 67, 223, 227, 84, 249, 5, 233, 155, 67, 218, 151, - 106, 246, 95, 164, 100, 170, 69, 135, 234, 18, 69, 135, 106, 69, 135, - 106, 224, 109, 215, 250, 169, 228, 69, 164, 230, 98, 106, 224, 109, 250, - 169, 228, 69, 164, 230, 98, 106, 51, 215, 250, 169, 228, 69, 164, 230, - 98, 106, 51, 250, 169, 228, 69, 164, 230, 98, 250, 73, 223, 147, 229, - 241, 5, 230, 98, 106, 246, 95, 164, 230, 98, 106, 243, 154, 246, 95, 164, - 230, 98, 106, 84, 243, 153, 227, 59, 106, 84, 243, 154, 251, 241, 245, - 148, 243, 153, 227, 59, 245, 148, 243, 154, 251, 241, 234, 18, 42, 229, - 230, 230, 98, 234, 18, 45, 229, 230, 230, 98, 234, 18, 245, 154, 42, 229, - 230, 230, 98, 234, 18, 245, 154, 45, 229, 230, 230, 98, 234, 18, 235, - 112, 254, 120, 252, 18, 230, 98, 234, 18, 227, 106, 254, 120, 252, 18, - 230, 98, 106, 235, 112, 254, 120, 228, 69, 164, 230, 98, 106, 227, 106, - 254, 120, 228, 69, 164, 230, 98, 106, 235, 112, 254, 120, 252, 18, 230, - 98, 106, 227, 106, 254, 120, 252, 18, 230, 98, 170, 42, 221, 114, 224, - 236, 252, 18, 230, 98, 170, 45, 221, 114, 224, 236, 252, 18, 230, 98, - 234, 18, 42, 250, 79, 252, 18, 230, 98, 234, 18, 45, 250, 79, 252, 18, - 230, 98, 248, 217, 232, 136, 34, 20, 107, 248, 217, 232, 136, 34, 20, - 103, 248, 217, 232, 136, 34, 20, 160, 248, 217, 232, 136, 34, 20, 154, - 248, 217, 232, 136, 34, 20, 174, 248, 217, 232, 136, 34, 20, 182, 248, - 217, 232, 136, 34, 20, 191, 248, 217, 232, 136, 34, 20, 185, 248, 217, - 232, 136, 34, 20, 190, 248, 217, 232, 136, 34, 54, 222, 65, 248, 217, 34, - 33, 20, 107, 248, 217, 34, 33, 20, 103, 248, 217, 34, 33, 20, 160, 248, - 217, 34, 33, 20, 154, 248, 217, 34, 33, 20, 174, 248, 217, 34, 33, 20, - 182, 248, 217, 34, 33, 20, 191, 248, 217, 34, 33, 20, 185, 248, 217, 34, - 33, 20, 190, 248, 217, 34, 33, 54, 222, 65, 248, 217, 232, 136, 34, 33, - 20, 107, 248, 217, 232, 136, 34, 33, 20, 103, 248, 217, 232, 136, 34, 33, - 20, 160, 248, 217, 232, 136, 34, 33, 20, 154, 248, 217, 232, 136, 34, 33, - 20, 174, 248, 217, 232, 136, 34, 33, 20, 182, 248, 217, 232, 136, 34, 33, - 20, 191, 248, 217, 232, 136, 34, 33, 20, 185, 248, 217, 232, 136, 34, 33, - 20, 190, 248, 217, 232, 136, 34, 33, 54, 222, 65, 106, 218, 200, 90, 65, - 106, 224, 6, 247, 5, 65, 106, 90, 65, 106, 231, 187, 247, 5, 65, 247, - 124, 229, 32, 90, 65, 106, 227, 56, 90, 65, 221, 89, 90, 65, 106, 221, - 89, 90, 65, 249, 145, 221, 89, 90, 65, 106, 249, 145, 221, 89, 90, 65, - 84, 90, 65, 221, 228, 221, 118, 90, 254, 20, 221, 228, 252, 27, 90, 254, - 20, 84, 90, 254, 20, 106, 84, 250, 73, 247, 130, 25, 90, 65, 106, 84, - 250, 73, 220, 53, 25, 90, 65, 223, 224, 84, 90, 65, 106, 250, 157, 84, - 90, 65, 227, 105, 67, 90, 65, 235, 111, 67, 90, 65, 252, 232, 225, 14, - 67, 90, 65, 245, 96, 225, 14, 67, 90, 65, 106, 234, 237, 227, 104, 67, - 90, 65, 106, 220, 60, 227, 104, 67, 90, 65, 231, 182, 234, 237, 227, 104, - 67, 90, 65, 231, 182, 220, 60, 227, 104, 67, 90, 65, 34, 106, 67, 90, 65, - 218, 206, 90, 65, 252, 52, 224, 6, 247, 5, 65, 252, 52, 90, 65, 252, 52, - 231, 187, 247, 5, 65, 106, 252, 52, 224, 6, 247, 5, 65, 106, 252, 52, 90, - 65, 106, 252, 52, 231, 187, 247, 5, 65, 222, 85, 90, 65, 106, 222, 84, - 90, 65, 218, 225, 90, 65, 106, 218, 225, 90, 65, 230, 116, 90, 65, 148, - 248, 227, 254, 119, 67, 221, 91, 250, 141, 3, 67, 221, 90, 229, 160, 230, - 119, 223, 92, 230, 119, 223, 57, 42, 226, 234, 252, 226, 249, 67, 45, - 226, 234, 252, 226, 249, 67, 156, 2, 61, 237, 190, 227, 160, 224, 18, - 228, 243, 223, 92, 223, 58, 228, 243, 224, 17, 69, 252, 201, 2, 186, 92, - 171, 248, 187, 67, 249, 5, 2, 251, 83, 248, 145, 25, 2, 248, 145, 246, - 213, 117, 230, 114, 220, 52, 234, 237, 45, 250, 124, 2, 248, 145, 220, - 60, 42, 250, 124, 2, 248, 145, 42, 230, 82, 237, 57, 45, 230, 82, 237, - 57, 245, 90, 230, 82, 237, 57, 235, 146, 108, 222, 143, 235, 146, 113, - 222, 143, 42, 25, 45, 51, 220, 236, 42, 25, 45, 222, 143, 42, 233, 87, - 171, 45, 222, 143, 171, 42, 222, 143, 108, 222, 144, 2, 250, 222, 50, - 234, 235, 248, 192, 251, 213, 186, 227, 16, 67, 250, 156, 249, 4, 67, - 250, 156, 249, 5, 2, 127, 221, 202, 67, 250, 156, 249, 5, 2, 90, 221, - 202, 67, 40, 2, 127, 221, 202, 67, 40, 2, 90, 221, 202, 14, 42, 67, 40, - 115, 14, 45, 67, 40, 115, 14, 42, 254, 120, 115, 14, 45, 254, 120, 115, - 14, 42, 51, 254, 120, 115, 14, 45, 51, 254, 120, 115, 14, 42, 67, 221, - 114, 224, 236, 115, 14, 45, 67, 221, 114, 224, 236, 115, 14, 42, 245, - 154, 229, 229, 14, 45, 245, 154, 229, 229, 220, 53, 228, 92, 65, 247, - 130, 228, 92, 65, 254, 104, 244, 222, 250, 222, 65, 250, 199, 244, 222, - 250, 222, 65, 45, 76, 2, 34, 229, 43, 171, 127, 65, 171, 90, 65, 171, 42, - 45, 65, 171, 127, 51, 65, 171, 90, 51, 65, 171, 42, 45, 51, 65, 171, 127, - 76, 245, 97, 135, 171, 90, 76, 245, 97, 135, 171, 127, 51, 76, 245, 97, - 135, 171, 90, 51, 76, 245, 97, 135, 171, 90, 223, 223, 65, 43, 44, 252, - 47, 43, 44, 248, 142, 43, 44, 248, 14, 43, 44, 248, 141, 43, 44, 247, - 206, 43, 44, 248, 77, 43, 44, 248, 13, 43, 44, 248, 140, 43, 44, 247, - 174, 43, 44, 248, 45, 43, 44, 247, 237, 43, 44, 248, 108, 43, 44, 247, - 205, 43, 44, 248, 76, 43, 44, 248, 12, 43, 44, 248, 139, 43, 44, 247, - 158, 43, 44, 248, 29, 43, 44, 247, 221, 43, 44, 248, 92, 43, 44, 247, - 189, 43, 44, 248, 60, 43, 44, 247, 252, 43, 44, 248, 123, 43, 44, 247, - 173, 43, 44, 248, 44, 43, 44, 247, 236, 43, 44, 248, 107, 43, 44, 247, - 204, 43, 44, 248, 75, 43, 44, 248, 11, 43, 44, 248, 138, 43, 44, 247, - 150, 43, 44, 248, 21, 43, 44, 247, 213, 43, 44, 248, 84, 43, 44, 247, - 181, 43, 44, 248, 52, 43, 44, 247, 244, 43, 44, 248, 115, 43, 44, 247, - 165, 43, 44, 248, 36, 43, 44, 247, 228, 43, 44, 248, 99, 43, 44, 247, - 196, 43, 44, 248, 67, 43, 44, 248, 3, 43, 44, 248, 130, 43, 44, 247, 157, - 43, 44, 248, 28, 43, 44, 247, 220, 43, 44, 248, 91, 43, 44, 247, 188, 43, - 44, 248, 59, 43, 44, 247, 251, 43, 44, 248, 122, 43, 44, 247, 172, 43, - 44, 248, 43, 43, 44, 247, 235, 43, 44, 248, 106, 43, 44, 247, 203, 43, - 44, 248, 74, 43, 44, 248, 10, 43, 44, 248, 137, 43, 44, 247, 146, 43, 44, - 248, 17, 43, 44, 247, 209, 43, 44, 248, 80, 43, 44, 247, 177, 43, 44, - 248, 48, 43, 44, 247, 240, 43, 44, 248, 111, 43, 44, 247, 161, 43, 44, - 248, 32, 43, 44, 247, 224, 43, 44, 248, 95, 43, 44, 247, 192, 43, 44, - 248, 63, 43, 44, 247, 255, 43, 44, 248, 126, 43, 44, 247, 153, 43, 44, - 248, 24, 43, 44, 247, 216, 43, 44, 248, 87, 43, 44, 247, 184, 43, 44, - 248, 55, 43, 44, 247, 247, 43, 44, 248, 118, 43, 44, 247, 168, 43, 44, - 248, 39, 43, 44, 247, 231, 43, 44, 248, 102, 43, 44, 247, 199, 43, 44, - 248, 70, 43, 44, 248, 6, 43, 44, 248, 133, 43, 44, 247, 149, 43, 44, 248, - 20, 43, 44, 247, 212, 43, 44, 248, 83, 43, 44, 247, 180, 43, 44, 248, 51, - 43, 44, 247, 243, 43, 44, 248, 114, 43, 44, 247, 164, 43, 44, 248, 35, - 43, 44, 247, 227, 43, 44, 248, 98, 43, 44, 247, 195, 43, 44, 248, 66, 43, - 44, 248, 2, 43, 44, 248, 129, 43, 44, 247, 156, 43, 44, 248, 27, 43, 44, - 247, 219, 43, 44, 248, 90, 43, 44, 247, 187, 43, 44, 248, 58, 43, 44, - 247, 250, 43, 44, 248, 121, 43, 44, 247, 171, 43, 44, 248, 42, 43, 44, - 247, 234, 43, 44, 248, 105, 43, 44, 247, 202, 43, 44, 248, 73, 43, 44, - 248, 9, 43, 44, 248, 136, 43, 44, 247, 144, 43, 44, 248, 15, 43, 44, 247, - 207, 43, 44, 248, 78, 43, 44, 247, 175, 43, 44, 248, 46, 43, 44, 247, - 238, 43, 44, 248, 109, 43, 44, 247, 159, 43, 44, 248, 30, 43, 44, 247, - 222, 43, 44, 248, 93, 43, 44, 247, 190, 43, 44, 248, 61, 43, 44, 247, - 253, 43, 44, 248, 124, 43, 44, 247, 151, 43, 44, 248, 22, 43, 44, 247, - 214, 43, 44, 248, 85, 43, 44, 247, 182, 43, 44, 248, 53, 43, 44, 247, - 245, 43, 44, 248, 116, 43, 44, 247, 166, 43, 44, 248, 37, 43, 44, 247, - 229, 43, 44, 248, 100, 43, 44, 247, 197, 43, 44, 248, 68, 43, 44, 248, 4, - 43, 44, 248, 131, 43, 44, 247, 147, 43, 44, 248, 18, 43, 44, 247, 210, - 43, 44, 248, 81, 43, 44, 247, 178, 43, 44, 248, 49, 43, 44, 247, 241, 43, - 44, 248, 112, 43, 44, 247, 162, 43, 44, 248, 33, 43, 44, 247, 225, 43, - 44, 248, 96, 43, 44, 247, 193, 43, 44, 248, 64, 43, 44, 248, 0, 43, 44, - 248, 127, 43, 44, 247, 154, 43, 44, 248, 25, 43, 44, 247, 217, 43, 44, - 248, 88, 43, 44, 247, 185, 43, 44, 248, 56, 43, 44, 247, 248, 43, 44, - 248, 119, 43, 44, 247, 169, 43, 44, 248, 40, 43, 44, 247, 232, 43, 44, - 248, 103, 43, 44, 247, 200, 43, 44, 248, 71, 43, 44, 248, 7, 43, 44, 248, - 134, 43, 44, 247, 145, 43, 44, 248, 16, 43, 44, 247, 208, 43, 44, 248, - 79, 43, 44, 247, 176, 43, 44, 248, 47, 43, 44, 247, 239, 43, 44, 248, - 110, 43, 44, 247, 160, 43, 44, 248, 31, 43, 44, 247, 223, 43, 44, 248, - 94, 43, 44, 247, 191, 43, 44, 248, 62, 43, 44, 247, 254, 43, 44, 248, - 125, 43, 44, 247, 152, 43, 44, 248, 23, 43, 44, 247, 215, 43, 44, 248, - 86, 43, 44, 247, 183, 43, 44, 248, 54, 43, 44, 247, 246, 43, 44, 248, - 117, 43, 44, 247, 167, 43, 44, 248, 38, 43, 44, 247, 230, 43, 44, 248, - 101, 43, 44, 247, 198, 43, 44, 248, 69, 43, 44, 248, 5, 43, 44, 248, 132, - 43, 44, 247, 148, 43, 44, 248, 19, 43, 44, 247, 211, 43, 44, 248, 82, 43, - 44, 247, 179, 43, 44, 248, 50, 43, 44, 247, 242, 43, 44, 248, 113, 43, - 44, 247, 163, 43, 44, 248, 34, 43, 44, 247, 226, 43, 44, 248, 97, 43, 44, - 247, 194, 43, 44, 248, 65, 43, 44, 248, 1, 43, 44, 248, 128, 43, 44, 247, - 155, 43, 44, 248, 26, 43, 44, 247, 218, 43, 44, 248, 89, 43, 44, 247, - 186, 43, 44, 248, 57, 43, 44, 247, 249, 43, 44, 248, 120, 43, 44, 247, - 170, 43, 44, 248, 41, 43, 44, 247, 233, 43, 44, 248, 104, 43, 44, 247, - 201, 43, 44, 248, 72, 43, 44, 248, 8, 43, 44, 248, 135, 90, 220, 206, 76, - 2, 69, 92, 90, 220, 206, 76, 2, 51, 69, 92, 127, 51, 76, 2, 69, 92, 90, - 51, 76, 2, 69, 92, 42, 45, 51, 76, 2, 69, 92, 90, 220, 206, 76, 245, 97, - 135, 127, 51, 76, 245, 97, 135, 90, 51, 76, 245, 97, 135, 247, 130, 76, - 2, 186, 92, 220, 53, 76, 2, 186, 92, 220, 53, 221, 78, 65, 247, 130, 221, - 78, 65, 127, 51, 249, 147, 65, 90, 51, 249, 147, 65, 127, 221, 78, 249, - 147, 65, 90, 221, 78, 249, 147, 65, 90, 220, 206, 221, 78, 249, 147, 65, - 90, 76, 2, 247, 143, 223, 146, 220, 53, 76, 199, 135, 247, 130, 76, 199, - 135, 90, 76, 2, 222, 136, 2, 69, 92, 90, 76, 2, 222, 136, 2, 51, 69, 92, - 90, 220, 206, 76, 2, 222, 135, 90, 220, 206, 76, 2, 222, 136, 2, 69, 92, - 90, 220, 206, 76, 2, 222, 136, 2, 51, 69, 92, 127, 254, 22, 90, 254, 22, - 127, 51, 254, 22, 90, 51, 254, 22, 127, 76, 199, 84, 249, 4, 90, 76, 199, - 84, 249, 4, 127, 76, 245, 97, 252, 201, 199, 84, 249, 4, 90, 76, 245, 97, - 252, 201, 199, 84, 249, 4, 231, 187, 218, 217, 25, 224, 6, 247, 5, 65, - 231, 187, 247, 5, 25, 224, 6, 218, 217, 65, 231, 187, 218, 217, 76, 2, - 96, 231, 187, 247, 5, 76, 2, 96, 224, 6, 247, 5, 76, 2, 96, 224, 6, 218, - 217, 76, 2, 96, 231, 187, 218, 217, 76, 25, 231, 187, 247, 5, 65, 231, - 187, 247, 5, 76, 25, 224, 6, 247, 5, 65, 224, 6, 247, 5, 76, 25, 224, 6, - 218, 217, 65, 224, 6, 218, 217, 76, 25, 231, 187, 218, 217, 65, 227, 88, - 249, 11, 250, 95, 245, 247, 249, 10, 245, 247, 249, 11, 250, 95, 227, 88, - 249, 10, 224, 6, 247, 5, 76, 250, 95, 231, 187, 247, 5, 65, 231, 187, - 247, 5, 76, 250, 95, 224, 6, 247, 5, 65, 245, 247, 249, 11, 250, 95, 231, - 187, 247, 5, 65, 227, 88, 249, 11, 250, 95, 224, 6, 247, 5, 65, 231, 187, - 247, 5, 76, 250, 95, 231, 187, 218, 217, 65, 231, 187, 218, 217, 76, 250, - 95, 231, 187, 247, 5, 65, 218, 237, 76, 229, 28, 248, 208, 227, 109, 76, - 229, 28, 90, 222, 15, 250, 72, 220, 52, 76, 229, 28, 90, 222, 15, 250, - 72, 247, 129, 76, 229, 28, 247, 130, 222, 15, 250, 72, 235, 107, 76, 229, - 28, 247, 130, 222, 15, 250, 72, 227, 100, 227, 103, 254, 52, 250, 199, - 65, 235, 110, 254, 52, 254, 104, 65, 221, 120, 254, 52, 254, 104, 65, - 252, 29, 254, 52, 254, 104, 65, 221, 120, 254, 52, 250, 199, 76, 2, 233, - 154, 221, 120, 254, 52, 254, 104, 76, 2, 229, 43, 234, 237, 45, 225, 69, - 250, 199, 65, 234, 237, 42, 225, 69, 254, 104, 65, 254, 104, 250, 197, - 250, 222, 65, 250, 199, 250, 197, 250, 222, 65, 90, 76, 71, 224, 192, - 127, 65, 127, 76, 71, 224, 192, 90, 65, 224, 192, 90, 76, 71, 127, 65, - 90, 76, 2, 88, 56, 127, 76, 2, 88, 56, 90, 76, 221, 225, 218, 151, 42, - 45, 76, 221, 225, 3, 250, 221, 220, 53, 220, 206, 76, 245, 97, 3, 250, - 221, 42, 192, 108, 45, 192, 113, 243, 176, 42, 192, 113, 45, 192, 108, - 243, 176, 108, 192, 45, 113, 192, 42, 243, 176, 108, 192, 42, 113, 192, - 45, 243, 176, 42, 192, 108, 45, 192, 108, 243, 176, 108, 192, 45, 113, - 192, 45, 243, 176, 42, 192, 113, 45, 192, 113, 243, 176, 108, 192, 42, - 113, 192, 42, 243, 176, 127, 243, 177, 2, 192, 108, 199, 135, 90, 243, - 177, 2, 192, 108, 199, 135, 220, 53, 243, 177, 2, 192, 45, 199, 135, 247, - 130, 243, 177, 2, 192, 45, 199, 135, 127, 243, 177, 2, 192, 113, 199, - 135, 90, 243, 177, 2, 192, 113, 199, 135, 220, 53, 243, 177, 2, 192, 42, - 199, 135, 247, 130, 243, 177, 2, 192, 42, 199, 135, 127, 243, 177, 2, - 192, 108, 245, 97, 135, 90, 243, 177, 2, 192, 108, 245, 97, 135, 220, 53, - 243, 177, 2, 192, 45, 245, 97, 135, 247, 130, 243, 177, 2, 192, 45, 245, - 97, 135, 127, 243, 177, 2, 192, 113, 245, 97, 135, 90, 243, 177, 2, 192, - 113, 245, 97, 135, 220, 53, 243, 177, 2, 192, 42, 245, 97, 135, 247, 130, - 243, 177, 2, 192, 42, 245, 97, 135, 127, 243, 177, 2, 192, 108, 71, 127, - 243, 177, 2, 192, 247, 132, 220, 53, 243, 177, 2, 192, 42, 252, 106, 220, - 53, 243, 177, 2, 192, 227, 109, 90, 243, 177, 2, 192, 108, 71, 90, 243, - 177, 2, 192, 247, 132, 247, 130, 243, 177, 2, 192, 42, 252, 106, 247, - 130, 243, 177, 2, 192, 227, 109, 127, 243, 177, 2, 192, 108, 71, 90, 243, - 177, 2, 192, 220, 63, 127, 243, 177, 2, 192, 113, 71, 90, 243, 177, 2, - 192, 247, 132, 90, 243, 177, 2, 192, 108, 71, 127, 243, 177, 2, 192, 220, - 63, 90, 243, 177, 2, 192, 113, 71, 127, 243, 177, 2, 192, 247, 132, 127, - 243, 177, 2, 192, 108, 71, 171, 249, 146, 127, 243, 177, 2, 192, 113, - 252, 118, 171, 249, 146, 90, 243, 177, 2, 192, 108, 71, 171, 249, 146, - 90, 243, 177, 2, 192, 113, 252, 118, 171, 249, 146, 220, 53, 243, 177, 2, - 192, 42, 252, 106, 247, 130, 243, 177, 2, 192, 227, 109, 247, 130, 243, - 177, 2, 192, 42, 252, 106, 220, 53, 243, 177, 2, 192, 227, 109, 45, 51, - 76, 2, 227, 55, 243, 159, 246, 154, 5, 71, 90, 65, 221, 180, 230, 113, - 71, 90, 65, 127, 76, 71, 221, 180, 230, 112, 90, 76, 71, 221, 180, 230, - 112, 90, 76, 71, 254, 151, 114, 101, 235, 87, 71, 127, 65, 127, 76, 221, - 225, 235, 86, 244, 30, 71, 90, 65, 223, 93, 71, 90, 65, 127, 76, 221, - 225, 223, 92, 223, 58, 71, 127, 65, 42, 245, 177, 222, 135, 45, 245, 177, - 222, 135, 108, 245, 177, 222, 135, 113, 245, 177, 222, 135, 221, 78, 69, - 252, 201, 249, 67, 217, 158, 165, 223, 234, 217, 158, 165, 220, 198, 250, - 175, 42, 67, 250, 79, 115, 45, 67, 250, 79, 115, 42, 67, 229, 229, 45, - 67, 229, 229, 217, 158, 165, 42, 237, 237, 115, 217, 158, 165, 45, 237, - 237, 115, 217, 158, 165, 42, 252, 71, 115, 217, 158, 165, 45, 252, 71, - 115, 42, 40, 252, 18, 2, 220, 81, 45, 40, 252, 18, 2, 220, 81, 42, 40, - 252, 18, 2, 221, 203, 237, 224, 221, 120, 250, 123, 45, 40, 252, 18, 2, - 221, 203, 237, 224, 252, 29, 250, 123, 42, 40, 252, 18, 2, 221, 203, 237, - 224, 252, 29, 250, 123, 45, 40, 252, 18, 2, 221, 203, 237, 224, 221, 120, - 250, 123, 42, 254, 120, 252, 18, 2, 248, 145, 45, 254, 120, 252, 18, 2, - 248, 145, 42, 254, 52, 235, 87, 115, 45, 254, 52, 244, 30, 115, 51, 42, - 254, 52, 244, 30, 115, 51, 45, 254, 52, 235, 87, 115, 42, 84, 221, 114, - 224, 236, 115, 45, 84, 221, 114, 224, 236, 115, 247, 143, 245, 214, 69, - 217, 33, 235, 43, 234, 22, 254, 120, 230, 114, 235, 115, 45, 254, 120, - 219, 177, 2, 223, 227, 234, 22, 45, 254, 120, 2, 248, 145, 254, 120, 2, - 226, 235, 237, 190, 254, 248, 254, 119, 223, 245, 254, 120, 230, 114, - 235, 115, 223, 245, 254, 120, 230, 114, 220, 63, 215, 254, 119, 210, 254, - 119, 254, 120, 2, 220, 81, 210, 254, 120, 2, 220, 81, 230, 177, 254, 120, - 230, 114, 220, 63, 230, 177, 254, 120, 230, 114, 247, 132, 234, 22, 254, - 120, 2, 230, 119, 254, 32, 246, 187, 237, 224, 76, 229, 28, 108, 25, 227, - 109, 234, 22, 254, 120, 2, 230, 119, 254, 32, 246, 187, 237, 224, 76, - 229, 28, 108, 25, 235, 115, 234, 22, 254, 120, 2, 230, 119, 254, 32, 246, - 187, 237, 224, 76, 229, 28, 113, 25, 227, 109, 234, 22, 254, 120, 2, 230, - 119, 254, 32, 246, 187, 237, 224, 76, 229, 28, 113, 25, 235, 115, 234, - 22, 254, 120, 2, 230, 119, 254, 32, 246, 187, 237, 224, 76, 229, 28, 45, - 25, 220, 63, 234, 22, 254, 120, 2, 230, 119, 254, 32, 246, 187, 237, 224, - 76, 229, 28, 42, 25, 220, 63, 234, 22, 254, 120, 2, 230, 119, 254, 32, - 246, 187, 237, 224, 76, 229, 28, 45, 25, 247, 132, 234, 22, 254, 120, 2, - 230, 119, 254, 32, 246, 187, 237, 224, 76, 229, 28, 42, 25, 247, 132, - 210, 246, 199, 225, 45, 246, 199, 225, 46, 2, 230, 77, 246, 199, 225, 46, - 2, 3, 250, 222, 50, 246, 199, 225, 46, 2, 45, 76, 50, 246, 199, 225, 46, - 2, 42, 76, 50, 250, 222, 2, 186, 135, 34, 69, 135, 34, 229, 233, 34, 227, - 160, 224, 17, 34, 229, 160, 250, 222, 248, 192, 251, 213, 186, 252, 201, - 25, 221, 120, 144, 248, 192, 251, 213, 69, 135, 250, 222, 2, 223, 60, - 218, 151, 34, 254, 103, 248, 188, 55, 108, 76, 221, 225, 250, 221, 34, - 67, 251, 241, 34, 251, 241, 34, 235, 86, 34, 244, 29, 250, 222, 2, 3, - 250, 222, 199, 222, 23, 227, 109, 250, 222, 2, 124, 186, 223, 108, 199, - 222, 23, 227, 109, 204, 227, 88, 249, 11, 224, 55, 204, 245, 247, 249, - 11, 224, 55, 204, 253, 251, 204, 3, 250, 221, 204, 223, 227, 124, 237, - 56, 223, 225, 221, 91, 2, 61, 50, 221, 91, 2, 220, 81, 226, 235, 237, - 224, 221, 90, 221, 91, 2, 225, 52, 253, 245, 252, 28, 45, 221, 91, 71, - 42, 221, 90, 42, 221, 91, 252, 106, 69, 135, 69, 252, 201, 252, 106, 45, - 221, 90, 252, 23, 2, 42, 144, 252, 53, 252, 23, 2, 45, 144, 252, 53, 84, - 252, 22, 27, 2, 42, 144, 252, 53, 27, 2, 45, 144, 252, 53, 67, 242, 183, - 84, 242, 183, 42, 218, 198, 245, 214, 45, 218, 198, 245, 214, 42, 51, - 218, 198, 245, 214, 45, 51, 218, 198, 245, 214, 237, 218, 237, 207, 221, - 201, 104, 237, 207, 237, 208, 232, 138, 2, 69, 135, 247, 137, 233, 87, - 40, 2, 250, 135, 230, 81, 237, 216, 254, 13, 224, 166, 228, 229, 246, - 154, 5, 25, 224, 57, 229, 233, 246, 154, 5, 25, 224, 57, 229, 234, 2, - 221, 180, 50, 242, 59, 199, 25, 224, 57, 229, 233, 244, 75, 223, 155, - 222, 12, 247, 131, 221, 91, 2, 42, 144, 252, 53, 247, 131, 221, 91, 2, - 45, 144, 252, 53, 84, 249, 5, 2, 113, 65, 84, 234, 234, 67, 250, 222, 2, - 113, 65, 84, 250, 222, 2, 113, 65, 246, 141, 67, 223, 227, 246, 141, 84, - 223, 227, 246, 141, 67, 249, 4, 246, 141, 84, 249, 4, 246, 141, 67, 250, - 221, 246, 141, 84, 250, 221, 227, 15, 227, 160, 224, 18, 230, 112, 224, - 18, 2, 230, 77, 227, 160, 224, 18, 2, 186, 92, 252, 76, 224, 17, 252, 76, - 227, 160, 224, 17, 51, 229, 43, 221, 78, 229, 43, 235, 112, 250, 73, 254, - 120, 115, 227, 106, 250, 73, 254, 120, 115, 221, 171, 233, 152, 233, 33, - 34, 61, 230, 112, 233, 33, 34, 88, 230, 112, 233, 33, 34, 27, 230, 112, - 233, 33, 220, 75, 230, 113, 2, 248, 145, 233, 33, 220, 75, 230, 113, 2, - 229, 43, 233, 33, 40, 237, 175, 230, 112, 233, 33, 40, 220, 75, 230, 112, - 124, 235, 7, 25, 230, 112, 124, 235, 7, 156, 230, 112, 233, 33, 27, 230, - 112, 233, 131, 124, 223, 74, 223, 72, 2, 237, 186, 228, 92, 237, 187, - 230, 112, 245, 181, 229, 225, 237, 186, 237, 187, 2, 51, 92, 237, 187, - 253, 217, 2, 224, 55, 250, 218, 245, 87, 254, 104, 237, 184, 235, 44, - 237, 185, 2, 227, 207, 229, 212, 254, 29, 229, 24, 235, 44, 237, 185, 2, - 225, 69, 229, 212, 254, 29, 229, 24, 235, 44, 237, 185, 212, 237, 219, - 222, 23, 229, 24, 237, 187, 254, 29, 112, 229, 32, 230, 112, 228, 86, - 237, 187, 230, 112, 237, 187, 2, 127, 76, 2, 96, 237, 187, 2, 27, 55, - 237, 187, 2, 237, 174, 237, 187, 2, 220, 74, 237, 187, 2, 230, 77, 237, - 187, 2, 220, 81, 237, 57, 235, 146, 42, 221, 91, 230, 112, 217, 158, 165, - 226, 109, 250, 159, 217, 158, 165, 226, 109, 229, 69, 217, 158, 165, 226, - 109, 228, 226, 88, 5, 2, 3, 250, 222, 50, 88, 5, 2, 250, 217, 255, 1, 50, - 88, 5, 2, 221, 180, 50, 88, 5, 2, 61, 56, 88, 5, 2, 221, 180, 56, 88, 5, - 2, 223, 94, 103, 88, 5, 2, 84, 221, 90, 233, 155, 5, 2, 250, 169, 50, - 233, 155, 5, 2, 61, 56, 233, 155, 5, 2, 245, 247, 248, 143, 233, 155, 5, - 2, 227, 88, 248, 143, 88, 5, 237, 224, 42, 144, 250, 221, 88, 5, 237, - 224, 45, 144, 250, 221, 219, 164, 156, 250, 101, 228, 229, 233, 84, 5, 2, - 61, 50, 233, 84, 5, 2, 220, 81, 225, 66, 228, 230, 2, 252, 29, 250, 196, - 224, 41, 228, 229, 233, 84, 5, 237, 224, 42, 144, 250, 221, 233, 84, 5, - 237, 224, 45, 144, 250, 221, 34, 233, 84, 5, 2, 250, 217, 255, 0, 233, - 84, 5, 237, 224, 51, 250, 221, 34, 248, 188, 55, 88, 5, 237, 224, 221, - 90, 233, 155, 5, 237, 224, 221, 90, 233, 84, 5, 237, 224, 221, 90, 237, - 181, 228, 229, 227, 101, 237, 181, 228, 229, 217, 158, 165, 227, 191, - 250, 159, 254, 139, 156, 250, 128, 237, 175, 2, 248, 145, 220, 75, 2, - 233, 155, 55, 220, 75, 2, 230, 77, 237, 175, 2, 230, 77, 237, 175, 2, - 235, 7, 254, 126, 220, 75, 2, 235, 7, 230, 105, 220, 75, 71, 237, 174, - 237, 175, 71, 220, 74, 220, 75, 71, 252, 201, 71, 237, 174, 237, 175, 71, - 252, 201, 71, 220, 74, 220, 75, 252, 106, 25, 237, 56, 2, 220, 74, 237, - 175, 252, 106, 25, 237, 56, 2, 237, 174, 250, 197, 220, 75, 2, 225, 51, - 250, 197, 237, 175, 2, 225, 51, 51, 40, 237, 174, 51, 40, 220, 74, 250, - 197, 220, 75, 2, 225, 52, 25, 224, 41, 228, 229, 235, 7, 25, 2, 61, 50, - 235, 7, 156, 2, 61, 50, 51, 235, 7, 254, 126, 51, 235, 7, 230, 105, 124, - 237, 176, 235, 7, 254, 126, 124, 237, 176, 235, 7, 230, 105, 224, 48, - 235, 146, 230, 105, 224, 48, 235, 146, 254, 126, 235, 7, 156, 230, 75, - 235, 7, 254, 126, 235, 7, 25, 2, 233, 193, 223, 146, 235, 7, 156, 2, 233, - 193, 223, 146, 235, 7, 25, 2, 186, 249, 146, 235, 7, 156, 2, 186, 249, - 146, 235, 7, 25, 2, 51, 230, 77, 235, 7, 25, 2, 220, 81, 235, 7, 25, 2, - 51, 220, 81, 3, 219, 161, 2, 220, 81, 235, 7, 156, 2, 51, 230, 77, 235, - 7, 156, 2, 51, 220, 81, 217, 158, 165, 248, 154, 254, 99, 217, 158, 165, - 227, 234, 254, 99, 246, 154, 5, 2, 61, 56, 242, 59, 2, 61, 50, 221, 78, - 186, 252, 201, 2, 51, 69, 92, 221, 78, 186, 252, 201, 2, 221, 78, 69, 92, - 221, 180, 230, 113, 2, 61, 50, 221, 180, 230, 113, 2, 227, 88, 248, 143, - 224, 116, 233, 155, 224, 115, 250, 153, 2, 61, 50, 246, 154, 2, 253, 251, - 254, 151, 114, 199, 2, 250, 217, 255, 0, 254, 72, 114, 156, 114, 101, - 246, 154, 5, 71, 88, 55, 88, 5, 71, 246, 154, 55, 246, 154, 5, 71, 221, - 180, 230, 112, 51, 250, 176, 246, 155, 124, 250, 148, 246, 154, 224, 126, - 148, 250, 148, 246, 154, 224, 126, 246, 154, 5, 2, 124, 188, 71, 25, 124, - 188, 56, 246, 150, 2, 245, 116, 188, 50, 235, 87, 2, 250, 222, 237, 190, - 244, 30, 2, 250, 222, 237, 190, 235, 87, 2, 228, 82, 164, 50, 244, 30, 2, - 228, 82, 164, 50, 235, 87, 156, 224, 57, 114, 101, 244, 30, 156, 224, 57, - 114, 101, 235, 87, 156, 224, 57, 114, 199, 2, 61, 237, 190, 244, 30, 156, - 224, 57, 114, 199, 2, 61, 237, 190, 235, 87, 156, 224, 57, 114, 199, 2, - 61, 50, 244, 30, 156, 224, 57, 114, 199, 2, 61, 50, 235, 87, 156, 224, - 57, 114, 199, 2, 61, 71, 227, 109, 244, 30, 156, 224, 57, 114, 199, 2, - 61, 71, 235, 115, 235, 87, 156, 254, 73, 244, 30, 156, 254, 73, 235, 87, - 25, 224, 107, 212, 114, 101, 244, 30, 25, 224, 107, 212, 114, 101, 235, - 87, 25, 212, 254, 73, 244, 30, 25, 212, 254, 73, 235, 87, 71, 247, 136, - 114, 71, 244, 29, 244, 30, 71, 247, 136, 114, 71, 235, 86, 235, 87, 71, - 224, 116, 156, 246, 155, 244, 30, 71, 224, 116, 156, 246, 155, 235, 87, - 71, 224, 116, 71, 244, 29, 244, 30, 71, 224, 116, 71, 235, 86, 235, 87, - 71, 244, 30, 71, 247, 136, 246, 155, 244, 30, 71, 235, 87, 71, 247, 136, - 246, 155, 235, 87, 71, 224, 57, 114, 71, 244, 30, 71, 224, 57, 246, 155, - 244, 30, 71, 224, 57, 114, 71, 235, 87, 71, 224, 57, 246, 155, 224, 57, - 114, 199, 156, 235, 86, 224, 57, 114, 199, 156, 244, 29, 224, 57, 114, - 199, 156, 235, 87, 2, 61, 237, 190, 224, 57, 114, 199, 156, 244, 30, 2, - 61, 237, 190, 247, 136, 114, 199, 156, 235, 86, 247, 136, 114, 199, 156, - 244, 29, 247, 136, 224, 57, 114, 199, 156, 235, 86, 247, 136, 224, 57, - 114, 199, 156, 244, 29, 224, 116, 156, 235, 86, 224, 116, 156, 244, 29, - 224, 116, 71, 235, 87, 71, 246, 154, 55, 224, 116, 71, 244, 30, 71, 246, - 154, 55, 51, 232, 127, 235, 86, 51, 232, 127, 244, 29, 51, 232, 127, 235, - 87, 2, 220, 81, 244, 30, 230, 75, 235, 86, 244, 30, 252, 106, 235, 86, - 235, 87, 250, 197, 251, 213, 250, 74, 244, 30, 250, 197, 251, 213, 250, - 74, 235, 87, 250, 197, 251, 213, 250, 75, 71, 224, 57, 246, 155, 244, 30, - 250, 197, 251, 213, 250, 75, 71, 224, 57, 246, 155, 224, 42, 222, 27, - 235, 145, 222, 27, 224, 42, 222, 28, 156, 114, 101, 235, 145, 222, 28, - 156, 114, 101, 246, 154, 5, 2, 251, 236, 50, 228, 245, 71, 224, 107, 246, - 154, 55, 223, 85, 71, 224, 107, 246, 154, 55, 228, 245, 71, 224, 107, - 212, 114, 101, 223, 85, 71, 224, 107, 212, 114, 101, 228, 245, 71, 246, - 154, 55, 223, 85, 71, 246, 154, 55, 228, 245, 71, 212, 114, 101, 223, 85, - 71, 212, 114, 101, 228, 245, 71, 254, 151, 114, 101, 223, 85, 71, 254, - 151, 114, 101, 228, 245, 71, 212, 254, 151, 114, 101, 223, 85, 71, 212, - 254, 151, 114, 101, 51, 228, 244, 51, 223, 84, 223, 93, 2, 248, 145, 223, - 58, 2, 248, 145, 223, 93, 2, 88, 5, 56, 223, 58, 2, 88, 5, 56, 223, 93, - 2, 233, 84, 5, 56, 223, 58, 2, 233, 84, 5, 56, 223, 93, 117, 156, 114, - 199, 2, 61, 50, 223, 58, 117, 156, 114, 199, 2, 61, 50, 223, 93, 117, 71, - 246, 154, 55, 223, 58, 117, 71, 246, 154, 55, 223, 93, 117, 71, 221, 180, - 230, 112, 223, 58, 117, 71, 221, 180, 230, 112, 223, 93, 117, 71, 254, - 151, 114, 101, 223, 58, 117, 71, 254, 151, 114, 101, 223, 93, 117, 71, - 212, 114, 101, 223, 58, 117, 71, 212, 114, 101, 40, 42, 230, 119, 86, - 230, 112, 40, 45, 230, 119, 86, 230, 112, 250, 197, 223, 92, 250, 197, - 223, 57, 250, 197, 223, 93, 156, 114, 101, 250, 197, 223, 58, 156, 114, - 101, 223, 93, 71, 223, 57, 223, 58, 71, 223, 92, 223, 93, 71, 223, 92, - 223, 58, 71, 223, 57, 223, 58, 252, 106, 223, 92, 223, 58, 252, 106, 25, - 237, 56, 251, 213, 249, 147, 2, 223, 92, 246, 213, 117, 230, 114, 247, - 129, 229, 63, 2, 222, 81, 221, 119, 221, 102, 237, 174, 245, 125, 231, - 196, 224, 192, 42, 222, 143, 224, 192, 113, 222, 143, 224, 192, 108, 222, - 143, 229, 161, 2, 198, 69, 252, 201, 221, 78, 45, 220, 236, 51, 69, 252, - 201, 42, 220, 236, 69, 252, 201, 51, 42, 220, 236, 51, 69, 252, 201, 51, - 42, 220, 236, 171, 249, 147, 245, 97, 42, 233, 255, 117, 51, 219, 152, - 224, 192, 113, 222, 144, 2, 230, 77, 224, 192, 108, 222, 144, 2, 220, 81, - 224, 192, 108, 222, 144, 71, 224, 192, 113, 222, 143, 51, 113, 222, 143, - 51, 108, 222, 143, 51, 214, 212, 55, 210, 51, 214, 212, 55, 248, 160, - 212, 248, 194, 2, 210, 232, 137, 224, 55, 69, 235, 44, 2, 250, 222, 50, - 69, 235, 44, 2, 250, 222, 56, 113, 222, 144, 2, 250, 222, 56, 229, 234, - 2, 186, 92, 229, 234, 2, 221, 180, 230, 112, 221, 78, 69, 252, 201, 252, - 73, 227, 192, 221, 78, 69, 252, 201, 2, 186, 92, 221, 78, 250, 176, 230, - 112, 221, 78, 232, 127, 235, 86, 221, 78, 232, 127, 244, 29, 247, 136, - 224, 57, 235, 87, 156, 114, 101, 247, 136, 224, 57, 244, 30, 156, 114, - 101, 221, 78, 224, 18, 252, 73, 227, 192, 235, 146, 221, 78, 69, 252, - 201, 230, 112, 51, 224, 18, 230, 112, 67, 69, 135, 233, 33, 67, 69, 135, - 231, 187, 247, 5, 67, 65, 231, 187, 218, 217, 67, 65, 224, 6, 247, 5, 67, - 65, 224, 6, 218, 217, 67, 65, 42, 45, 67, 65, 127, 84, 65, 220, 53, 84, - 65, 247, 130, 84, 65, 231, 187, 247, 5, 84, 65, 231, 187, 218, 217, 84, - 65, 224, 6, 247, 5, 84, 65, 224, 6, 218, 217, 84, 65, 42, 45, 84, 65, - 108, 113, 84, 65, 90, 76, 2, 221, 170, 247, 129, 90, 76, 2, 221, 170, - 220, 52, 127, 76, 2, 221, 170, 247, 129, 127, 76, 2, 221, 170, 220, 52, - 40, 2, 221, 120, 144, 252, 53, 40, 2, 252, 29, 144, 252, 53, 40, 2, 220, - 60, 45, 249, 11, 144, 252, 53, 40, 2, 234, 237, 42, 249, 11, 144, 252, - 53, 249, 5, 2, 42, 144, 252, 53, 249, 5, 2, 45, 144, 252, 53, 249, 5, 2, - 221, 120, 144, 252, 53, 249, 5, 2, 252, 29, 144, 252, 53, 247, 143, 223, - 227, 84, 235, 146, 223, 227, 67, 235, 146, 223, 227, 84, 219, 100, 3, - 223, 227, 67, 219, 100, 3, 223, 227, 84, 229, 175, 67, 229, 175, 67, 243, - 124, 84, 243, 124, 186, 84, 243, 124, 84, 235, 146, 250, 221, 84, 234, - 18, 249, 4, 67, 234, 18, 249, 4, 84, 234, 18, 234, 234, 67, 234, 18, 234, - 234, 84, 3, 249, 4, 84, 3, 234, 234, 67, 3, 234, 234, 84, 186, 246, 209, - 67, 186, 246, 209, 84, 69, 246, 209, 67, 69, 246, 209, 42, 76, 2, 3, 250, - 221, 148, 127, 254, 19, 42, 76, 2, 34, 229, 43, 171, 127, 223, 223, 65, - 127, 220, 206, 76, 2, 69, 92, 127, 220, 206, 76, 2, 51, 69, 92, 127, 220, - 206, 76, 245, 97, 135, 127, 220, 206, 221, 78, 249, 147, 65, 127, 76, 2, - 247, 143, 223, 146, 127, 76, 2, 222, 136, 2, 69, 92, 127, 76, 2, 222, - 136, 2, 51, 69, 92, 127, 220, 206, 76, 2, 222, 135, 127, 220, 206, 76, 2, - 222, 136, 2, 69, 92, 127, 220, 206, 76, 2, 222, 136, 2, 51, 69, 92, 127, - 76, 221, 225, 218, 151, 218, 237, 76, 229, 28, 248, 208, 235, 115, 246, - 154, 5, 71, 127, 65, 227, 160, 221, 180, 230, 113, 71, 127, 65, 127, 76, - 71, 227, 160, 254, 151, 114, 101, 90, 76, 221, 225, 244, 29, 90, 76, 221, - 225, 223, 57, 127, 228, 92, 65, 90, 228, 92, 65, 227, 160, 221, 180, 230, - 113, 71, 90, 65, 90, 76, 71, 227, 160, 254, 151, 114, 101, 221, 180, 230, - 113, 71, 127, 65, 127, 76, 71, 254, 151, 114, 101, 127, 76, 71, 227, 160, - 221, 180, 230, 112, 90, 76, 71, 227, 160, 221, 180, 230, 112, 67, 234, - 18, 223, 156, 84, 3, 223, 156, 67, 3, 223, 156, 84, 227, 106, 229, 175, - 67, 227, 106, 229, 175, 106, 235, 146, 250, 221, 106, 230, 78, 2, 230, - 78, 237, 190, 106, 250, 222, 2, 250, 222, 237, 190, 106, 250, 221, 106, - 34, 226, 149, 125, 6, 1, 253, 205, 125, 6, 1, 251, 244, 125, 6, 1, 219, - 163, 125, 6, 1, 244, 76, 125, 6, 1, 248, 162, 125, 6, 1, 218, 1, 125, 6, - 1, 217, 66, 125, 6, 1, 247, 71, 125, 6, 1, 217, 89, 125, 6, 1, 237, 130, - 125, 6, 1, 66, 237, 130, 125, 6, 1, 72, 125, 6, 1, 248, 180, 125, 6, 1, - 236, 238, 125, 6, 1, 235, 19, 125, 6, 1, 233, 37, 125, 6, 1, 232, 208, - 125, 6, 1, 230, 129, 125, 6, 1, 229, 26, 125, 6, 1, 227, 87, 125, 6, 1, - 224, 47, 125, 6, 1, 220, 226, 125, 6, 1, 220, 98, 125, 6, 1, 245, 99, - 125, 6, 1, 243, 130, 125, 6, 1, 230, 87, 125, 6, 1, 229, 198, 125, 6, 1, - 224, 173, 125, 6, 1, 221, 39, 125, 6, 1, 251, 3, 125, 6, 1, 225, 25, 125, - 6, 1, 218, 7, 125, 6, 1, 218, 9, 125, 6, 1, 218, 34, 125, 6, 1, 223, 243, - 155, 125, 6, 1, 217, 200, 125, 6, 1, 3, 217, 178, 125, 6, 1, 3, 217, 179, - 2, 222, 135, 125, 6, 1, 217, 231, 125, 6, 1, 237, 161, 3, 217, 178, 125, - 6, 1, 252, 76, 217, 178, 125, 6, 1, 237, 161, 252, 76, 217, 178, 125, 6, - 1, 245, 171, 125, 6, 1, 237, 128, 125, 6, 1, 224, 172, 125, 6, 1, 221, - 70, 60, 125, 6, 1, 235, 137, 233, 37, 125, 3, 1, 253, 205, 125, 3, 1, - 251, 244, 125, 3, 1, 219, 163, 125, 3, 1, 244, 76, 125, 3, 1, 248, 162, - 125, 3, 1, 218, 1, 125, 3, 1, 217, 66, 125, 3, 1, 247, 71, 125, 3, 1, - 217, 89, 125, 3, 1, 237, 130, 125, 3, 1, 66, 237, 130, 125, 3, 1, 72, - 125, 3, 1, 248, 180, 125, 3, 1, 236, 238, 125, 3, 1, 235, 19, 125, 3, 1, - 233, 37, 125, 3, 1, 232, 208, 125, 3, 1, 230, 129, 125, 3, 1, 229, 26, - 125, 3, 1, 227, 87, 125, 3, 1, 224, 47, 125, 3, 1, 220, 226, 125, 3, 1, - 220, 98, 125, 3, 1, 245, 99, 125, 3, 1, 243, 130, 125, 3, 1, 230, 87, - 125, 3, 1, 229, 198, 125, 3, 1, 224, 173, 125, 3, 1, 221, 39, 125, 3, 1, - 251, 3, 125, 3, 1, 225, 25, 125, 3, 1, 218, 7, 125, 3, 1, 218, 9, 125, 3, - 1, 218, 34, 125, 3, 1, 223, 243, 155, 125, 3, 1, 217, 200, 125, 3, 1, 3, - 217, 178, 125, 3, 1, 3, 217, 179, 2, 222, 135, 125, 3, 1, 217, 231, 125, - 3, 1, 237, 161, 3, 217, 178, 125, 3, 1, 252, 76, 217, 178, 125, 3, 1, - 237, 161, 252, 76, 217, 178, 125, 3, 1, 245, 171, 125, 3, 1, 237, 128, - 125, 3, 1, 224, 172, 125, 3, 1, 221, 70, 60, 125, 3, 1, 235, 137, 233, - 37, 7, 6, 1, 235, 202, 2, 51, 135, 7, 3, 1, 235, 202, 2, 51, 135, 7, 6, - 1, 235, 202, 2, 233, 193, 221, 179, 7, 6, 1, 230, 60, 2, 92, 7, 6, 1, - 228, 39, 2, 222, 135, 7, 3, 1, 112, 2, 92, 7, 3, 1, 222, 202, 2, 249, 11, - 92, 7, 6, 1, 243, 226, 2, 249, 48, 7, 3, 1, 243, 226, 2, 249, 48, 7, 6, - 1, 237, 18, 2, 249, 48, 7, 3, 1, 237, 18, 2, 249, 48, 7, 6, 1, 217, 158, - 2, 249, 48, 7, 3, 1, 217, 158, 2, 249, 48, 7, 6, 1, 254, 146, 7, 6, 1, - 234, 187, 2, 96, 7, 6, 1, 215, 60, 7, 6, 1, 215, 254, 146, 7, 3, 1, 220, - 11, 2, 45, 96, 7, 6, 1, 219, 41, 2, 96, 7, 3, 1, 219, 41, 2, 96, 7, 3, 1, - 220, 11, 2, 250, 80, 7, 6, 1, 144, 243, 225, 7, 3, 1, 144, 243, 225, 7, - 3, 1, 222, 133, 229, 129, 7, 3, 1, 178, 2, 231, 183, 7, 3, 1, 215, 228, - 39, 2, 222, 135, 7, 3, 1, 142, 2, 109, 227, 94, 237, 190, 7, 1, 3, 6, - 215, 73, 7, 223, 94, 3, 1, 237, 126, 58, 1, 6, 216, 216, 7, 6, 1, 226, - 235, 2, 223, 33, 222, 135, 7, 6, 1, 217, 158, 2, 223, 33, 222, 135, 75, - 6, 1, 254, 163, 75, 3, 1, 254, 163, 75, 6, 1, 219, 92, 75, 3, 1, 219, 92, - 75, 6, 1, 244, 231, 75, 3, 1, 244, 231, 75, 6, 1, 249, 179, 75, 3, 1, - 249, 179, 75, 6, 1, 246, 236, 75, 3, 1, 246, 236, 75, 6, 1, 224, 11, 75, - 3, 1, 224, 11, 75, 6, 1, 217, 99, 75, 3, 1, 217, 99, 75, 6, 1, 243, 171, - 75, 3, 1, 243, 171, 75, 6, 1, 222, 4, 75, 3, 1, 222, 4, 75, 6, 1, 242, - 70, 75, 3, 1, 242, 70, 75, 6, 1, 236, 226, 75, 3, 1, 236, 226, 75, 6, 1, - 235, 135, 75, 3, 1, 235, 135, 75, 6, 1, 233, 196, 75, 3, 1, 233, 196, 75, - 6, 1, 232, 62, 75, 3, 1, 232, 62, 75, 6, 1, 236, 11, 75, 3, 1, 236, 11, - 75, 6, 1, 74, 75, 3, 1, 74, 75, 6, 1, 229, 108, 75, 3, 1, 229, 108, 75, - 6, 1, 227, 75, 75, 3, 1, 227, 75, 75, 6, 1, 224, 118, 75, 3, 1, 224, 118, - 75, 6, 1, 222, 105, 75, 3, 1, 222, 105, 75, 6, 1, 220, 123, 75, 3, 1, - 220, 123, 75, 6, 1, 245, 203, 75, 3, 1, 245, 203, 75, 6, 1, 236, 130, 75, - 3, 1, 236, 130, 75, 6, 1, 228, 212, 75, 3, 1, 228, 212, 75, 6, 1, 230, - 123, 75, 3, 1, 230, 123, 75, 6, 1, 249, 9, 254, 168, 75, 3, 1, 249, 9, - 254, 168, 75, 6, 1, 48, 75, 254, 191, 75, 3, 1, 48, 75, 254, 191, 75, 6, - 1, 250, 93, 246, 236, 75, 3, 1, 250, 93, 246, 236, 75, 6, 1, 249, 9, 236, - 226, 75, 3, 1, 249, 9, 236, 226, 75, 6, 1, 249, 9, 232, 62, 75, 3, 1, - 249, 9, 232, 62, 75, 6, 1, 250, 93, 232, 62, 75, 3, 1, 250, 93, 232, 62, - 75, 6, 1, 48, 75, 230, 123, 75, 3, 1, 48, 75, 230, 123, 75, 6, 1, 226, - 142, 75, 3, 1, 226, 142, 75, 6, 1, 250, 98, 224, 238, 75, 3, 1, 250, 98, - 224, 238, 75, 6, 1, 48, 75, 224, 238, 75, 3, 1, 48, 75, 224, 238, 75, 6, - 1, 48, 75, 246, 133, 75, 3, 1, 48, 75, 246, 133, 75, 6, 1, 254, 178, 236, - 135, 75, 3, 1, 254, 178, 236, 135, 75, 6, 1, 249, 9, 242, 242, 75, 3, 1, - 249, 9, 242, 242, 75, 6, 1, 48, 75, 242, 242, 75, 3, 1, 48, 75, 242, 242, - 75, 6, 1, 48, 75, 155, 75, 3, 1, 48, 75, 155, 75, 6, 1, 235, 201, 155, - 75, 3, 1, 235, 201, 155, 75, 6, 1, 48, 75, 243, 145, 75, 3, 1, 48, 75, - 243, 145, 75, 6, 1, 48, 75, 243, 173, 75, 3, 1, 48, 75, 243, 173, 75, 6, - 1, 48, 75, 244, 226, 75, 3, 1, 48, 75, 244, 226, 75, 6, 1, 48, 75, 248, - 183, 75, 3, 1, 48, 75, 248, 183, 75, 6, 1, 48, 75, 224, 211, 75, 3, 1, - 48, 75, 224, 211, 75, 6, 1, 48, 231, 115, 224, 211, 75, 3, 1, 48, 231, - 115, 224, 211, 75, 6, 1, 48, 231, 115, 232, 92, 75, 3, 1, 48, 231, 115, - 232, 92, 75, 6, 1, 48, 231, 115, 231, 67, 75, 3, 1, 48, 231, 115, 231, - 67, 75, 6, 1, 48, 231, 115, 218, 238, 75, 3, 1, 48, 231, 115, 218, 238, - 75, 16, 236, 243, 75, 16, 233, 197, 227, 75, 75, 16, 229, 109, 227, 75, - 75, 16, 223, 152, 75, 16, 222, 106, 227, 75, 75, 16, 236, 131, 227, 75, - 75, 16, 224, 212, 224, 118, 75, 6, 1, 250, 93, 224, 238, 75, 3, 1, 250, - 93, 224, 238, 75, 6, 1, 250, 93, 244, 226, 75, 3, 1, 250, 93, 244, 226, - 75, 36, 232, 63, 50, 75, 36, 223, 238, 254, 2, 75, 36, 223, 238, 235, 92, - 75, 48, 231, 115, 245, 90, 223, 136, 75, 48, 231, 115, 248, 210, 228, 82, - 78, 75, 48, 231, 115, 237, 210, 228, 82, 78, 75, 48, 231, 115, 219, 154, - 248, 191, 75, 245, 108, 131, 243, 194, 75, 245, 90, 223, 136, 75, 233, - 113, 248, 191, 95, 3, 1, 254, 131, 95, 3, 1, 252, 209, 95, 3, 1, 244, - 230, 95, 3, 1, 248, 153, 95, 3, 1, 246, 197, 95, 3, 1, 219, 85, 95, 3, 1, - 217, 87, 95, 3, 1, 222, 119, 95, 3, 1, 237, 223, 95, 3, 1, 236, 233, 95, - 3, 1, 235, 143, 95, 3, 1, 234, 86, 95, 3, 1, 232, 211, 95, 3, 1, 230, - 138, 95, 3, 1, 229, 243, 95, 3, 1, 217, 76, 95, 3, 1, 227, 249, 95, 3, 1, - 226, 140, 95, 3, 1, 222, 112, 95, 3, 1, 220, 87, 95, 3, 1, 229, 134, 95, - 3, 1, 236, 138, 95, 3, 1, 244, 119, 95, 3, 1, 228, 140, 95, 3, 1, 224, - 209, 95, 3, 1, 251, 22, 95, 3, 1, 251, 154, 95, 3, 1, 237, 91, 95, 3, 1, - 250, 224, 95, 3, 1, 251, 56, 95, 3, 1, 218, 136, 95, 3, 1, 237, 101, 95, - 3, 1, 243, 208, 95, 3, 1, 243, 162, 95, 3, 1, 243, 108, 95, 3, 1, 218, - 227, 95, 3, 1, 243, 182, 95, 3, 1, 243, 2, 221, 197, 1, 184, 221, 197, 1, - 218, 72, 221, 197, 1, 218, 71, 221, 197, 1, 218, 63, 221, 197, 1, 218, - 61, 221, 197, 1, 252, 108, 255, 2, 218, 57, 221, 197, 1, 218, 57, 221, - 197, 1, 218, 69, 221, 197, 1, 218, 66, 221, 197, 1, 218, 68, 221, 197, 1, - 218, 67, 221, 197, 1, 217, 254, 221, 197, 1, 218, 64, 221, 197, 1, 218, - 55, 221, 197, 1, 220, 255, 218, 55, 221, 197, 1, 218, 52, 221, 197, 1, - 218, 59, 221, 197, 1, 252, 108, 255, 2, 218, 59, 221, 197, 1, 220, 255, - 218, 59, 221, 197, 1, 218, 58, 221, 197, 1, 218, 76, 221, 197, 1, 218, - 53, 221, 197, 1, 220, 255, 218, 53, 221, 197, 1, 218, 43, 221, 197, 1, - 220, 255, 218, 43, 221, 197, 1, 217, 250, 221, 197, 1, 218, 27, 221, 197, - 1, 254, 200, 218, 27, 221, 197, 1, 220, 255, 218, 27, 221, 197, 1, 218, - 51, 221, 197, 1, 218, 50, 221, 197, 1, 218, 47, 221, 197, 1, 220, 255, - 218, 60, 221, 197, 1, 220, 255, 218, 45, 221, 197, 1, 218, 44, 221, 197, - 1, 217, 200, 221, 197, 1, 218, 41, 221, 197, 1, 218, 40, 221, 197, 1, - 218, 62, 221, 197, 1, 220, 255, 218, 62, 221, 197, 1, 253, 208, 218, 62, - 221, 197, 1, 218, 39, 221, 197, 1, 218, 37, 221, 197, 1, 218, 38, 221, - 197, 1, 218, 36, 221, 197, 1, 218, 35, 221, 197, 1, 218, 70, 221, 197, 1, - 218, 33, 221, 197, 1, 218, 32, 221, 197, 1, 218, 31, 221, 197, 1, 218, - 30, 221, 197, 1, 218, 28, 221, 197, 1, 222, 98, 218, 28, 221, 197, 1, - 218, 26, 221, 197, 58, 1, 235, 182, 78, 28, 4, 235, 11, 28, 4, 233, 135, - 28, 4, 227, 73, 28, 4, 224, 25, 28, 4, 224, 199, 28, 4, 252, 40, 28, 4, - 221, 139, 28, 4, 250, 181, 28, 4, 231, 202, 28, 4, 231, 55, 28, 4, 244, - 73, 230, 185, 28, 4, 217, 20, 28, 4, 248, 165, 28, 4, 249, 106, 28, 4, - 237, 58, 28, 4, 221, 238, 28, 4, 251, 10, 28, 4, 229, 117, 28, 4, 229, - 36, 28, 4, 244, 130, 28, 4, 244, 126, 28, 4, 244, 127, 28, 4, 244, 128, - 28, 4, 223, 218, 28, 4, 223, 178, 28, 4, 223, 189, 28, 4, 223, 217, 28, - 4, 223, 193, 28, 4, 223, 194, 28, 4, 223, 182, 28, 4, 251, 114, 28, 4, - 251, 101, 28, 4, 251, 103, 28, 4, 251, 113, 28, 4, 251, 111, 28, 4, 251, - 112, 28, 4, 251, 102, 28, 4, 216, 247, 28, 4, 216, 227, 28, 4, 216, 238, - 28, 4, 216, 246, 28, 4, 216, 241, 28, 4, 216, 242, 28, 4, 216, 230, 28, - 4, 251, 110, 28, 4, 251, 104, 28, 4, 251, 106, 28, 4, 251, 109, 28, 4, - 251, 107, 28, 4, 251, 108, 28, 4, 251, 105, 28, 4, 228, 51, 28, 4, 228, - 41, 28, 4, 228, 47, 28, 4, 228, 50, 28, 4, 228, 48, 28, 4, 228, 49, 28, - 4, 228, 46, 28, 4, 235, 212, 28, 4, 235, 204, 28, 4, 235, 207, 28, 4, - 235, 211, 28, 4, 235, 208, 28, 4, 235, 209, 28, 4, 235, 205, 28, 4, 218, - 103, 28, 4, 218, 93, 28, 4, 218, 99, 28, 4, 218, 102, 28, 4, 218, 100, - 28, 4, 218, 101, 28, 4, 218, 98, 28, 4, 243, 236, 28, 4, 243, 227, 28, 4, - 243, 230, 28, 4, 243, 235, 28, 4, 243, 232, 28, 4, 243, 233, 28, 4, 243, - 229, 36, 31, 1, 252, 144, 36, 31, 1, 219, 165, 36, 31, 1, 244, 116, 36, - 31, 1, 249, 92, 36, 31, 1, 217, 72, 36, 31, 1, 217, 92, 36, 31, 1, 175, - 36, 31, 1, 246, 217, 36, 31, 1, 246, 205, 36, 31, 1, 246, 197, 36, 31, 1, - 74, 36, 31, 1, 229, 198, 36, 31, 1, 246, 148, 36, 31, 1, 246, 138, 36, - 31, 1, 222, 87, 36, 31, 1, 155, 36, 31, 1, 221, 50, 36, 31, 1, 251, 46, - 36, 31, 1, 225, 25, 36, 31, 1, 224, 248, 36, 31, 1, 245, 171, 36, 31, 1, - 246, 137, 36, 31, 1, 60, 36, 31, 1, 238, 26, 36, 31, 1, 248, 181, 36, 31, - 1, 233, 123, 220, 102, 36, 31, 1, 218, 36, 36, 31, 1, 217, 200, 36, 31, - 1, 237, 160, 60, 36, 31, 1, 235, 25, 217, 178, 36, 31, 1, 252, 76, 217, - 178, 36, 31, 1, 237, 160, 252, 76, 217, 178, 45, 254, 120, 223, 89, 234, - 63, 45, 254, 120, 247, 143, 223, 89, 234, 63, 42, 223, 89, 115, 45, 223, - 89, 115, 42, 247, 143, 223, 89, 115, 45, 247, 143, 223, 89, 115, 227, - 241, 237, 178, 234, 63, 227, 241, 247, 143, 237, 178, 234, 63, 247, 143, - 221, 103, 234, 63, 42, 221, 103, 115, 45, 221, 103, 115, 227, 241, 223, - 227, 42, 227, 241, 230, 140, 115, 45, 227, 241, 230, 140, 115, 246, 251, - 250, 121, 229, 239, 245, 126, 229, 239, 210, 245, 126, 229, 239, 242, - 118, 247, 143, 230, 180, 247, 130, 254, 127, 220, 53, 254, 127, 247, 143, - 227, 106, 254, 119, 51, 230, 177, 242, 121, 237, 170, 237, 177, 230, 23, - 252, 14, 242, 122, 2, 249, 13, 221, 180, 2, 227, 94, 50, 42, 109, 229, - 231, 115, 45, 109, 229, 231, 115, 221, 180, 2, 61, 50, 221, 180, 2, 61, - 56, 42, 69, 252, 201, 2, 228, 77, 45, 69, 252, 201, 2, 228, 77, 221, 120, - 42, 144, 115, 221, 120, 45, 144, 115, 252, 29, 42, 144, 115, 252, 29, 45, - 144, 115, 42, 224, 136, 105, 115, 45, 224, 136, 105, 115, 42, 51, 229, - 229, 45, 51, 229, 229, 124, 188, 104, 131, 61, 228, 196, 131, 61, 104, - 124, 188, 228, 196, 204, 245, 116, 61, 228, 196, 245, 170, 61, 78, 210, - 228, 82, 78, 69, 221, 179, 227, 94, 229, 31, 218, 174, 225, 55, 233, 193, - 248, 145, 9, 32, 227, 181, 9, 32, 250, 203, 9, 32, 226, 90, 107, 9, 32, - 226, 90, 103, 9, 32, 226, 90, 160, 9, 32, 229, 157, 9, 32, 252, 21, 9, - 32, 222, 146, 9, 32, 236, 61, 107, 9, 32, 236, 61, 103, 9, 32, 248, 189, - 9, 32, 226, 92, 9, 32, 3, 107, 9, 32, 3, 103, 9, 32, 235, 155, 107, 9, - 32, 235, 155, 103, 9, 32, 235, 155, 160, 9, 32, 235, 155, 154, 9, 32, - 224, 35, 9, 32, 221, 229, 9, 32, 224, 33, 107, 9, 32, 224, 33, 103, 9, - 32, 243, 154, 107, 9, 32, 243, 154, 103, 9, 32, 243, 189, 9, 32, 227, - 233, 9, 32, 251, 8, 9, 32, 223, 68, 9, 32, 233, 117, 9, 32, 249, 90, 9, - 32, 233, 110, 9, 32, 250, 213, 9, 32, 218, 241, 107, 9, 32, 218, 241, - 103, 9, 32, 245, 179, 9, 32, 229, 208, 107, 9, 32, 229, 208, 103, 9, 32, - 224, 114, 144, 221, 99, 221, 60, 9, 32, 250, 110, 9, 32, 248, 159, 9, 32, - 237, 121, 9, 32, 252, 36, 117, 250, 192, 9, 32, 246, 81, 9, 32, 223, 240, - 107, 9, 32, 223, 240, 103, 9, 32, 252, 211, 9, 32, 224, 119, 9, 32, 251, - 199, 224, 119, 9, 32, 232, 126, 107, 9, 32, 232, 126, 103, 9, 32, 232, - 126, 160, 9, 32, 232, 126, 154, 9, 32, 233, 243, 9, 32, 224, 240, 9, 32, - 227, 239, 9, 32, 246, 100, 9, 32, 230, 150, 9, 32, 251, 255, 107, 9, 32, - 251, 255, 103, 9, 32, 234, 21, 9, 32, 233, 112, 9, 32, 244, 40, 107, 9, - 32, 244, 40, 103, 9, 32, 244, 40, 160, 9, 32, 221, 196, 9, 32, 250, 191, - 9, 32, 218, 217, 107, 9, 32, 218, 217, 103, 9, 32, 251, 199, 226, 84, 9, - 32, 224, 114, 242, 189, 9, 32, 242, 189, 9, 32, 251, 199, 223, 247, 9, - 32, 251, 199, 224, 235, 9, 32, 245, 133, 9, 32, 251, 199, 251, 127, 9, - 32, 224, 114, 218, 255, 9, 32, 219, 0, 107, 9, 32, 219, 0, 103, 9, 32, - 250, 214, 9, 32, 251, 199, 244, 62, 9, 32, 171, 107, 9, 32, 171, 103, 9, - 32, 251, 199, 235, 2, 9, 32, 251, 199, 244, 213, 9, 32, 233, 109, 107, 9, - 32, 233, 109, 103, 9, 32, 227, 242, 9, 32, 252, 43, 9, 32, 251, 199, 222, - 117, 235, 119, 9, 32, 251, 199, 235, 120, 9, 32, 251, 199, 218, 194, 9, - 32, 251, 199, 245, 142, 9, 32, 247, 3, 107, 9, 32, 247, 3, 103, 9, 32, - 247, 3, 160, 9, 32, 251, 199, 247, 2, 9, 32, 243, 159, 9, 32, 251, 199, - 242, 188, 9, 32, 252, 35, 9, 32, 244, 111, 9, 32, 251, 199, 245, 176, 9, - 32, 251, 199, 252, 67, 9, 32, 251, 199, 226, 151, 9, 32, 224, 114, 218, - 212, 9, 32, 224, 114, 218, 20, 9, 32, 251, 199, 245, 98, 9, 32, 237, 125, - 246, 103, 9, 32, 251, 199, 246, 103, 9, 32, 237, 125, 221, 121, 9, 32, - 251, 199, 221, 121, 9, 32, 237, 125, 247, 123, 9, 32, 251, 199, 247, 123, - 9, 32, 220, 234, 9, 32, 237, 125, 220, 234, 9, 32, 251, 199, 220, 234, - 53, 32, 107, 53, 32, 235, 43, 53, 32, 248, 145, 53, 32, 224, 55, 53, 32, - 226, 89, 53, 32, 96, 53, 32, 103, 53, 32, 235, 64, 53, 32, 234, 86, 53, - 32, 235, 103, 53, 32, 246, 178, 53, 32, 185, 53, 32, 113, 252, 21, 53, - 32, 250, 111, 53, 32, 242, 65, 53, 32, 222, 146, 53, 32, 230, 119, 252, - 21, 53, 32, 236, 60, 53, 32, 229, 10, 53, 32, 218, 169, 53, 32, 223, 235, - 53, 32, 45, 230, 119, 252, 21, 53, 32, 243, 109, 246, 192, 53, 32, 222, - 65, 53, 32, 248, 189, 53, 32, 226, 92, 53, 32, 250, 203, 53, 32, 228, - 231, 53, 32, 254, 208, 53, 32, 233, 105, 53, 32, 246, 192, 53, 32, 247, - 8, 53, 32, 226, 108, 53, 32, 244, 68, 53, 32, 244, 69, 224, 45, 53, 32, - 246, 102, 53, 32, 252, 75, 53, 32, 218, 183, 53, 32, 251, 24, 53, 32, - 227, 66, 53, 32, 237, 220, 53, 32, 224, 43, 53, 32, 235, 154, 53, 32, - 250, 119, 53, 32, 223, 230, 53, 32, 233, 107, 53, 32, 227, 84, 53, 32, - 218, 171, 53, 32, 230, 134, 53, 32, 220, 239, 53, 32, 247, 113, 53, 32, - 224, 192, 221, 229, 53, 32, 247, 143, 250, 203, 53, 32, 171, 223, 122, - 53, 32, 124, 243, 187, 53, 32, 224, 194, 53, 32, 252, 24, 53, 32, 224, - 32, 53, 32, 252, 3, 53, 32, 223, 145, 53, 32, 243, 153, 53, 32, 243, 195, - 53, 32, 248, 148, 53, 32, 243, 189, 53, 32, 252, 14, 53, 32, 227, 233, - 53, 32, 226, 99, 53, 32, 248, 212, 53, 32, 253, 213, 53, 32, 223, 227, - 53, 32, 231, 184, 53, 32, 223, 68, 53, 32, 226, 118, 53, 32, 233, 117, - 53, 32, 221, 98, 53, 32, 235, 178, 53, 32, 223, 136, 53, 32, 249, 90, 53, - 32, 218, 226, 53, 32, 248, 168, 231, 184, 53, 32, 250, 165, 53, 32, 245, - 84, 53, 32, 250, 211, 53, 32, 223, 148, 53, 32, 218, 240, 53, 32, 245, - 179, 53, 32, 250, 210, 53, 32, 245, 235, 53, 32, 51, 218, 151, 53, 32, - 144, 221, 99, 221, 60, 53, 32, 224, 52, 53, 32, 245, 243, 53, 32, 250, - 110, 53, 32, 248, 159, 53, 32, 228, 228, 53, 32, 237, 121, 53, 32, 234, - 3, 53, 32, 221, 178, 53, 32, 223, 31, 53, 32, 235, 59, 53, 32, 220, 33, - 53, 32, 245, 202, 53, 32, 252, 36, 117, 250, 192, 53, 32, 224, 137, 53, - 32, 247, 143, 222, 62, 53, 32, 218, 207, 53, 32, 224, 62, 53, 32, 248, - 202, 53, 32, 246, 81, 53, 32, 223, 249, 53, 32, 65, 53, 32, 223, 138, 53, - 32, 223, 239, 53, 32, 221, 108, 53, 32, 244, 45, 53, 32, 251, 119, 53, - 32, 223, 160, 53, 32, 252, 211, 53, 32, 227, 145, 53, 32, 224, 119, 53, - 32, 237, 117, 53, 32, 232, 125, 53, 32, 224, 240, 53, 32, 245, 228, 53, - 32, 230, 150, 53, 32, 254, 126, 53, 32, 229, 47, 53, 32, 247, 11, 53, 32, - 251, 254, 53, 32, 234, 21, 53, 32, 233, 156, 53, 32, 225, 73, 53, 32, - 254, 23, 53, 32, 233, 112, 53, 32, 221, 124, 53, 32, 230, 111, 53, 32, - 252, 38, 53, 32, 223, 134, 53, 32, 250, 174, 53, 32, 244, 39, 53, 32, - 221, 196, 53, 32, 237, 192, 53, 32, 252, 44, 53, 32, 219, 0, 246, 192, - 53, 32, 250, 191, 53, 32, 218, 216, 53, 32, 226, 84, 53, 32, 242, 189, - 53, 32, 223, 247, 53, 32, 219, 186, 53, 32, 252, 141, 53, 32, 229, 78, - 53, 32, 252, 227, 53, 32, 224, 235, 53, 32, 227, 202, 53, 32, 227, 10, - 53, 32, 245, 133, 53, 32, 252, 37, 53, 32, 251, 127, 53, 32, 252, 58, 53, - 32, 233, 114, 53, 32, 218, 255, 53, 32, 250, 214, 53, 32, 218, 192, 53, - 32, 248, 199, 53, 32, 219, 86, 53, 32, 244, 62, 53, 32, 235, 2, 53, 32, - 244, 213, 53, 32, 233, 108, 53, 32, 224, 54, 53, 32, 224, 192, 222, 134, - 252, 67, 53, 32, 227, 242, 53, 32, 252, 43, 53, 32, 218, 166, 53, 32, - 246, 3, 53, 32, 235, 119, 53, 32, 222, 117, 235, 119, 53, 32, 235, 116, - 53, 32, 224, 8, 53, 32, 235, 120, 53, 32, 218, 194, 53, 32, 245, 142, 53, - 32, 247, 2, 53, 32, 243, 159, 53, 32, 245, 106, 53, 32, 242, 188, 53, 32, - 252, 35, 53, 32, 222, 122, 53, 32, 243, 200, 53, 32, 245, 195, 53, 32, - 226, 172, 218, 192, 53, 32, 251, 121, 53, 32, 244, 111, 53, 32, 245, 176, - 53, 32, 252, 67, 53, 32, 226, 151, 53, 32, 249, 80, 53, 32, 218, 212, 53, - 32, 243, 139, 53, 32, 218, 20, 53, 32, 233, 163, 53, 32, 252, 53, 53, 32, - 246, 202, 53, 32, 245, 98, 53, 32, 221, 76, 53, 32, 247, 115, 53, 32, - 227, 228, 53, 32, 231, 185, 53, 32, 246, 103, 53, 32, 221, 121, 53, 32, - 247, 123, 53, 32, 220, 234, 53, 32, 245, 143, 98, 249, 46, 126, 42, 199, - 227, 109, 98, 249, 46, 126, 71, 199, 56, 98, 249, 46, 126, 42, 199, 233, - 193, 25, 227, 109, 98, 249, 46, 126, 71, 199, 233, 193, 25, 56, 98, 249, - 46, 126, 245, 90, 223, 47, 98, 249, 46, 126, 223, 48, 245, 97, 50, 98, - 249, 46, 126, 223, 48, 245, 97, 56, 98, 249, 46, 126, 223, 48, 245, 97, - 235, 115, 98, 249, 46, 126, 223, 48, 245, 97, 220, 60, 235, 115, 98, 249, - 46, 126, 223, 48, 245, 97, 220, 60, 227, 109, 98, 249, 46, 126, 223, 48, - 245, 97, 234, 237, 235, 115, 98, 249, 46, 126, 230, 76, 98, 223, 254, 98, - 250, 168, 98, 245, 90, 223, 136, 248, 196, 78, 237, 118, 237, 209, 223, - 159, 100, 98, 237, 138, 78, 98, 250, 194, 78, 98, 54, 217, 84, 42, 254, - 120, 115, 45, 254, 120, 115, 42, 51, 254, 120, 115, 45, 51, 254, 120, - 115, 42, 250, 124, 115, 45, 250, 124, 115, 42, 67, 250, 124, 115, 45, 67, - 250, 124, 115, 42, 84, 235, 91, 115, 45, 84, 235, 91, 115, 229, 14, 78, - 244, 163, 78, 42, 221, 114, 224, 236, 115, 45, 221, 114, 224, 236, 115, - 42, 67, 235, 91, 115, 45, 67, 235, 91, 115, 42, 67, 221, 114, 224, 236, - 115, 45, 67, 221, 114, 224, 236, 115, 42, 67, 40, 115, 45, 67, 40, 115, - 218, 237, 249, 146, 210, 51, 228, 236, 228, 69, 78, 51, 228, 236, 228, - 69, 78, 109, 51, 228, 236, 228, 69, 78, 229, 14, 164, 246, 3, 243, 185, - 231, 107, 107, 243, 185, 231, 107, 103, 243, 185, 231, 107, 160, 243, - 185, 231, 107, 154, 243, 185, 231, 107, 174, 243, 185, 231, 107, 182, - 243, 185, 231, 107, 191, 243, 185, 231, 107, 185, 243, 185, 231, 107, - 190, 98, 235, 83, 145, 78, 98, 227, 88, 145, 78, 98, 249, 52, 145, 78, - 98, 246, 177, 145, 78, 22, 224, 109, 61, 145, 78, 22, 51, 61, 145, 78, - 218, 235, 249, 146, 69, 236, 232, 227, 182, 78, 69, 236, 232, 227, 182, - 2, 219, 70, 224, 9, 78, 69, 236, 232, 227, 182, 164, 220, 60, 243, 194, - 69, 236, 232, 227, 182, 2, 219, 70, 224, 9, 164, 220, 60, 243, 194, 69, - 236, 232, 227, 182, 164, 234, 237, 243, 194, 34, 229, 14, 78, 98, 183, - 235, 44, 245, 225, 225, 55, 100, 243, 185, 231, 107, 222, 65, 243, 185, - 231, 107, 220, 219, 243, 185, 231, 107, 221, 245, 69, 98, 237, 138, 78, - 234, 52, 78, 229, 225, 254, 143, 78, 98, 41, 237, 211, 98, 144, 245, 188, - 223, 254, 136, 1, 3, 60, 136, 1, 60, 136, 1, 3, 72, 136, 1, 72, 136, 1, - 3, 68, 136, 1, 68, 136, 1, 3, 73, 136, 1, 73, 136, 1, 3, 74, 136, 1, 74, - 136, 1, 175, 136, 1, 245, 0, 136, 1, 236, 113, 136, 1, 244, 103, 136, 1, - 236, 7, 136, 1, 244, 17, 136, 1, 236, 184, 136, 1, 244, 191, 136, 1, 236, - 57, 136, 1, 244, 68, 136, 1, 226, 177, 136, 1, 217, 114, 136, 1, 224, - 140, 136, 1, 217, 42, 136, 1, 223, 103, 136, 1, 217, 13, 136, 1, 226, 94, - 136, 1, 217, 92, 136, 1, 224, 26, 136, 1, 217, 21, 136, 1, 222, 155, 136, - 1, 249, 207, 136, 1, 221, 205, 136, 1, 249, 15, 136, 1, 3, 221, 0, 136, - 1, 221, 0, 136, 1, 247, 111, 136, 1, 222, 87, 136, 1, 249, 92, 136, 1, - 101, 136, 1, 248, 167, 136, 1, 208, 136, 1, 232, 62, 136, 1, 231, 144, - 136, 1, 232, 141, 136, 1, 231, 204, 136, 1, 155, 136, 1, 252, 237, 136, - 1, 187, 136, 1, 243, 112, 136, 1, 252, 84, 136, 1, 229, 108, 136, 1, 242, - 173, 136, 1, 251, 248, 136, 1, 228, 202, 136, 1, 243, 162, 136, 1, 252, - 144, 136, 1, 229, 198, 136, 1, 243, 4, 136, 1, 252, 41, 136, 1, 229, 37, - 136, 1, 196, 136, 1, 233, 196, 136, 1, 233, 99, 136, 1, 234, 25, 136, 1, - 233, 136, 136, 1, 3, 184, 136, 1, 184, 136, 1, 3, 217, 200, 136, 1, 217, - 200, 136, 1, 3, 217, 231, 136, 1, 217, 231, 136, 1, 203, 136, 1, 227, - 147, 136, 1, 227, 22, 136, 1, 227, 216, 136, 1, 227, 75, 136, 1, 3, 219, - 7, 136, 1, 219, 7, 136, 1, 218, 204, 136, 1, 218, 227, 136, 1, 218, 187, - 136, 1, 207, 136, 1, 219, 56, 136, 1, 3, 175, 136, 1, 3, 236, 184, 36, - 236, 202, 219, 70, 224, 9, 78, 36, 236, 202, 225, 72, 224, 9, 78, 236, - 202, 219, 70, 224, 9, 78, 236, 202, 225, 72, 224, 9, 78, 136, 237, 138, - 78, 136, 219, 70, 237, 138, 78, 136, 248, 234, 217, 213, 236, 202, 51, - 242, 121, 52, 1, 3, 60, 52, 1, 60, 52, 1, 3, 72, 52, 1, 72, 52, 1, 3, 68, - 52, 1, 68, 52, 1, 3, 73, 52, 1, 73, 52, 1, 3, 74, 52, 1, 74, 52, 1, 175, - 52, 1, 245, 0, 52, 1, 236, 113, 52, 1, 244, 103, 52, 1, 236, 7, 52, 1, - 244, 17, 52, 1, 236, 184, 52, 1, 244, 191, 52, 1, 236, 57, 52, 1, 244, - 68, 52, 1, 226, 177, 52, 1, 217, 114, 52, 1, 224, 140, 52, 1, 217, 42, - 52, 1, 223, 103, 52, 1, 217, 13, 52, 1, 226, 94, 52, 1, 217, 92, 52, 1, - 224, 26, 52, 1, 217, 21, 52, 1, 222, 155, 52, 1, 249, 207, 52, 1, 221, - 205, 52, 1, 249, 15, 52, 1, 3, 221, 0, 52, 1, 221, 0, 52, 1, 247, 111, - 52, 1, 222, 87, 52, 1, 249, 92, 52, 1, 101, 52, 1, 248, 167, 52, 1, 208, - 52, 1, 232, 62, 52, 1, 231, 144, 52, 1, 232, 141, 52, 1, 231, 204, 52, 1, - 155, 52, 1, 252, 237, 52, 1, 187, 52, 1, 243, 112, 52, 1, 252, 84, 52, 1, - 229, 108, 52, 1, 242, 173, 52, 1, 251, 248, 52, 1, 228, 202, 52, 1, 243, - 162, 52, 1, 252, 144, 52, 1, 229, 198, 52, 1, 243, 4, 52, 1, 252, 41, 52, - 1, 229, 37, 52, 1, 196, 52, 1, 233, 196, 52, 1, 233, 99, 52, 1, 234, 25, - 52, 1, 233, 136, 52, 1, 3, 184, 52, 1, 184, 52, 1, 3, 217, 200, 52, 1, - 217, 200, 52, 1, 3, 217, 231, 52, 1, 217, 231, 52, 1, 203, 52, 1, 227, - 147, 52, 1, 227, 22, 52, 1, 227, 216, 52, 1, 227, 75, 52, 1, 3, 219, 7, - 52, 1, 219, 7, 52, 1, 218, 204, 52, 1, 218, 227, 52, 1, 218, 187, 52, 1, - 207, 52, 1, 219, 56, 52, 1, 3, 175, 52, 1, 3, 236, 184, 52, 1, 219, 189, - 52, 1, 219, 94, 52, 1, 219, 165, 52, 1, 219, 72, 52, 233, 193, 248, 145, - 236, 202, 228, 223, 224, 9, 78, 52, 237, 138, 78, 52, 219, 70, 237, 138, - 78, 52, 248, 234, 236, 30, 200, 1, 253, 204, 200, 1, 230, 59, 200, 1, - 189, 200, 1, 246, 74, 200, 1, 250, 46, 200, 1, 222, 201, 200, 1, 207, - 200, 1, 153, 200, 1, 245, 67, 200, 1, 237, 17, 200, 1, 243, 225, 200, 1, - 237, 126, 200, 1, 228, 163, 200, 1, 218, 151, 200, 1, 217, 81, 200, 1, - 251, 70, 200, 1, 225, 27, 200, 1, 152, 200, 1, 217, 157, 200, 1, 251, - 202, 200, 1, 198, 200, 1, 60, 200, 1, 74, 200, 1, 73, 200, 1, 246, 239, - 200, 1, 254, 196, 200, 1, 246, 237, 200, 1, 253, 232, 200, 1, 230, 86, - 200, 1, 254, 131, 200, 1, 246, 197, 200, 1, 254, 123, 200, 1, 246, 185, - 200, 1, 246, 148, 200, 1, 72, 200, 1, 68, 200, 1, 237, 137, 200, 1, 216, - 216, 200, 1, 232, 117, 200, 1, 244, 72, 200, 1, 238, 0, 22, 1, 236, 86, - 22, 1, 223, 211, 22, 1, 236, 79, 22, 1, 232, 55, 22, 1, 232, 53, 22, 1, - 232, 52, 22, 1, 221, 192, 22, 1, 223, 200, 22, 1, 227, 140, 22, 1, 227, - 135, 22, 1, 227, 132, 22, 1, 227, 125, 22, 1, 227, 120, 22, 1, 227, 115, - 22, 1, 227, 126, 22, 1, 227, 138, 22, 1, 233, 187, 22, 1, 229, 99, 22, 1, - 223, 208, 22, 1, 229, 88, 22, 1, 224, 104, 22, 1, 223, 205, 22, 1, 238, - 22, 22, 1, 250, 230, 22, 1, 223, 215, 22, 1, 251, 29, 22, 1, 236, 128, - 22, 1, 222, 0, 22, 1, 229, 127, 22, 1, 243, 106, 22, 1, 60, 22, 1, 254, - 234, 22, 1, 184, 22, 1, 218, 65, 22, 1, 246, 168, 22, 1, 73, 22, 1, 218, - 16, 22, 1, 218, 25, 22, 1, 74, 22, 1, 219, 7, 22, 1, 219, 4, 22, 1, 230, - 167, 22, 1, 217, 231, 22, 1, 68, 22, 1, 218, 219, 22, 1, 218, 227, 22, 1, - 218, 204, 22, 1, 217, 200, 22, 1, 246, 115, 22, 1, 217, 250, 22, 1, 72, - 22, 245, 185, 22, 1, 223, 209, 22, 1, 232, 45, 22, 1, 232, 47, 22, 1, - 232, 50, 22, 1, 227, 133, 22, 1, 227, 114, 22, 1, 227, 122, 22, 1, 227, - 127, 22, 1, 227, 112, 22, 1, 233, 180, 22, 1, 233, 177, 22, 1, 233, 181, - 22, 1, 236, 220, 22, 1, 229, 94, 22, 1, 229, 80, 22, 1, 229, 86, 22, 1, - 229, 83, 22, 1, 229, 97, 22, 1, 229, 81, 22, 1, 236, 218, 22, 1, 236, - 216, 22, 1, 224, 97, 22, 1, 224, 95, 22, 1, 224, 87, 22, 1, 224, 92, 22, - 1, 224, 102, 22, 1, 230, 1, 22, 1, 223, 212, 22, 1, 218, 6, 22, 1, 218, - 2, 22, 1, 218, 3, 22, 1, 236, 219, 22, 1, 223, 213, 22, 1, 218, 12, 22, - 1, 217, 225, 22, 1, 217, 224, 22, 1, 217, 227, 22, 1, 217, 191, 22, 1, - 217, 192, 22, 1, 217, 195, 22, 1, 254, 60, 22, 1, 254, 54, 98, 254, 112, - 235, 33, 78, 98, 254, 112, 227, 160, 78, 98, 254, 112, 131, 78, 98, 254, - 112, 124, 78, 98, 254, 112, 148, 78, 98, 254, 112, 245, 116, 78, 98, 254, - 112, 221, 120, 78, 98, 254, 112, 233, 193, 78, 98, 254, 112, 252, 29, 78, - 98, 254, 112, 245, 178, 78, 98, 254, 112, 226, 90, 78, 98, 254, 112, 221, - 252, 78, 98, 254, 112, 245, 110, 78, 98, 254, 112, 243, 152, 78, 98, 254, - 112, 247, 9, 78, 98, 254, 112, 234, 87, 78, 200, 1, 251, 248, 200, 1, - 217, 42, 200, 1, 237, 98, 200, 1, 244, 17, 200, 1, 246, 250, 200, 1, 246, - 183, 200, 1, 230, 127, 200, 1, 230, 131, 200, 1, 237, 156, 200, 1, 254, - 114, 200, 1, 237, 198, 200, 1, 220, 68, 200, 1, 237, 238, 200, 1, 232, - 101, 200, 1, 254, 190, 200, 1, 253, 228, 200, 1, 254, 140, 200, 1, 230, - 146, 200, 1, 230, 133, 200, 1, 237, 195, 200, 39, 1, 230, 59, 200, 39, 1, - 222, 201, 200, 39, 1, 237, 17, 200, 39, 1, 243, 225, 9, 214, 222, 201, 9, - 214, 218, 213, 9, 214, 218, 131, 9, 214, 251, 214, 9, 214, 223, 37, 9, - 214, 242, 111, 9, 214, 242, 115, 9, 214, 242, 179, 9, 214, 242, 112, 9, - 214, 222, 204, 9, 214, 242, 114, 9, 214, 242, 110, 9, 214, 242, 177, 9, - 214, 242, 113, 9, 214, 242, 109, 9, 214, 207, 9, 214, 243, 225, 9, 214, - 198, 9, 214, 230, 59, 9, 214, 224, 0, 9, 214, 250, 46, 9, 214, 242, 116, - 9, 214, 243, 122, 9, 214, 222, 213, 9, 214, 223, 22, 9, 214, 223, 168, 9, - 214, 225, 32, 9, 214, 229, 200, 9, 214, 228, 165, 9, 214, 221, 140, 9, - 214, 222, 203, 9, 214, 223, 30, 9, 214, 242, 123, 9, 214, 242, 108, 9, - 214, 229, 143, 9, 214, 228, 163, 52, 1, 3, 236, 7, 52, 1, 3, 224, 140, - 52, 1, 3, 223, 103, 52, 1, 3, 101, 52, 1, 3, 231, 144, 52, 1, 3, 155, 52, - 1, 3, 243, 112, 52, 1, 3, 242, 173, 52, 1, 3, 243, 162, 52, 1, 3, 243, 4, - 52, 1, 3, 233, 99, 52, 1, 3, 203, 52, 1, 3, 227, 147, 52, 1, 3, 227, 22, - 52, 1, 3, 227, 216, 52, 1, 3, 227, 75, 82, 22, 236, 86, 82, 22, 232, 55, - 82, 22, 221, 192, 82, 22, 227, 140, 82, 22, 233, 187, 82, 22, 229, 99, - 82, 22, 224, 104, 82, 22, 238, 22, 82, 22, 250, 230, 82, 22, 251, 29, 82, - 22, 236, 128, 82, 22, 222, 0, 82, 22, 229, 127, 82, 22, 243, 106, 82, 22, - 236, 87, 60, 82, 22, 232, 56, 60, 82, 22, 221, 193, 60, 82, 22, 227, 141, - 60, 82, 22, 233, 188, 60, 82, 22, 229, 100, 60, 82, 22, 224, 105, 60, 82, - 22, 238, 23, 60, 82, 22, 250, 231, 60, 82, 22, 251, 30, 60, 82, 22, 236, - 129, 60, 82, 22, 222, 1, 60, 82, 22, 229, 128, 60, 82, 22, 243, 107, 60, - 82, 22, 250, 231, 68, 82, 236, 34, 126, 230, 156, 82, 236, 34, 126, 142, - 242, 173, 82, 138, 107, 82, 138, 103, 82, 138, 160, 82, 138, 154, 82, - 138, 174, 82, 138, 182, 82, 138, 191, 82, 138, 185, 82, 138, 190, 82, - 138, 222, 65, 82, 138, 233, 117, 82, 138, 245, 179, 82, 138, 218, 240, - 82, 138, 218, 179, 82, 138, 233, 238, 82, 138, 247, 8, 82, 138, 223, 68, - 82, 138, 223, 139, 82, 138, 243, 168, 82, 138, 224, 23, 82, 138, 232, - 218, 82, 138, 223, 248, 82, 138, 245, 184, 82, 138, 250, 154, 82, 138, - 235, 181, 82, 138, 227, 178, 82, 138, 251, 159, 82, 138, 223, 106, 82, - 138, 223, 56, 82, 138, 246, 176, 82, 138, 227, 170, 82, 138, 254, 153, - 82, 138, 245, 208, 82, 138, 227, 168, 82, 138, 225, 73, 82, 138, 227, - 215, 34, 138, 228, 81, 34, 138, 236, 103, 34, 138, 226, 107, 34, 138, - 236, 30, 34, 54, 222, 66, 230, 139, 84, 223, 227, 34, 54, 220, 220, 230, - 139, 84, 223, 227, 34, 54, 221, 246, 230, 139, 84, 223, 227, 34, 54, 245, - 120, 230, 139, 84, 223, 227, 34, 54, 245, 197, 230, 139, 84, 223, 227, - 34, 54, 224, 70, 230, 139, 84, 223, 227, 34, 54, 225, 39, 230, 139, 84, - 223, 227, 34, 54, 246, 228, 230, 139, 84, 223, 227, 229, 221, 55, 34, 54, - 220, 220, 107, 34, 54, 220, 220, 103, 34, 54, 220, 220, 160, 34, 54, 220, - 220, 154, 34, 54, 220, 220, 174, 34, 54, 220, 220, 182, 34, 54, 220, 220, - 191, 34, 54, 220, 220, 185, 34, 54, 220, 220, 190, 34, 54, 221, 245, 34, - 54, 221, 246, 107, 34, 54, 221, 246, 103, 34, 54, 221, 246, 160, 34, 54, - 221, 246, 154, 34, 54, 221, 246, 174, 34, 22, 236, 86, 34, 22, 232, 55, - 34, 22, 221, 192, 34, 22, 227, 140, 34, 22, 233, 187, 34, 22, 229, 99, - 34, 22, 224, 104, 34, 22, 238, 22, 34, 22, 250, 230, 34, 22, 251, 29, 34, - 22, 236, 128, 34, 22, 222, 0, 34, 22, 229, 127, 34, 22, 243, 106, 34, 22, - 236, 87, 60, 34, 22, 232, 56, 60, 34, 22, 221, 193, 60, 34, 22, 227, 141, - 60, 34, 22, 233, 188, 60, 34, 22, 229, 100, 60, 34, 22, 224, 105, 60, 34, - 22, 238, 23, 60, 34, 22, 250, 231, 60, 34, 22, 251, 30, 60, 34, 22, 236, - 129, 60, 34, 22, 222, 1, 60, 34, 22, 229, 128, 60, 34, 22, 243, 107, 60, - 34, 236, 34, 126, 251, 61, 34, 236, 34, 126, 237, 40, 34, 22, 238, 23, - 68, 236, 34, 223, 159, 100, 34, 138, 107, 34, 138, 103, 34, 138, 160, 34, - 138, 154, 34, 138, 174, 34, 138, 182, 34, 138, 191, 34, 138, 185, 34, - 138, 190, 34, 138, 222, 65, 34, 138, 233, 117, 34, 138, 245, 179, 34, - 138, 218, 240, 34, 138, 218, 179, 34, 138, 233, 238, 34, 138, 247, 8, 34, - 138, 223, 68, 34, 138, 223, 139, 34, 138, 243, 168, 34, 138, 224, 23, 34, - 138, 232, 218, 34, 138, 223, 248, 34, 138, 245, 184, 34, 138, 250, 154, - 34, 138, 235, 181, 34, 138, 226, 88, 34, 138, 234, 89, 34, 138, 245, 216, - 34, 138, 223, 79, 34, 138, 246, 97, 34, 138, 228, 233, 34, 138, 253, 236, - 34, 138, 237, 139, 34, 138, 227, 168, 34, 138, 250, 127, 34, 138, 250, - 118, 34, 138, 243, 99, 34, 138, 251, 84, 34, 138, 234, 239, 34, 138, 235, - 115, 34, 138, 227, 109, 34, 138, 234, 19, 34, 138, 227, 189, 34, 138, - 223, 106, 34, 138, 223, 56, 34, 138, 246, 176, 34, 138, 227, 170, 34, - 138, 254, 153, 34, 138, 232, 42, 34, 54, 221, 246, 182, 34, 54, 221, 246, - 191, 34, 54, 221, 246, 185, 34, 54, 221, 246, 190, 34, 54, 245, 119, 34, - 54, 245, 120, 107, 34, 54, 245, 120, 103, 34, 54, 245, 120, 160, 34, 54, - 245, 120, 154, 34, 54, 245, 120, 174, 34, 54, 245, 120, 182, 34, 54, 245, - 120, 191, 34, 54, 245, 120, 185, 34, 54, 245, 120, 190, 34, 54, 245, 196, - 98, 183, 16, 35, 237, 119, 98, 183, 16, 35, 245, 227, 98, 183, 16, 35, - 234, 69, 98, 183, 16, 35, 254, 71, 98, 183, 16, 35, 234, 45, 98, 183, 16, - 35, 237, 38, 98, 183, 16, 35, 237, 39, 98, 183, 16, 35, 253, 229, 98, - 183, 16, 35, 225, 53, 98, 183, 16, 35, 230, 170, 98, 183, 16, 35, 231, - 175, 98, 183, 16, 35, 249, 87, 40, 243, 122, 40, 246, 144, 40, 246, 105, - 235, 49, 235, 66, 55, 34, 52, 60, 34, 52, 72, 34, 52, 68, 34, 52, 73, 34, - 52, 74, 34, 52, 175, 34, 52, 236, 113, 34, 52, 236, 7, 34, 52, 236, 184, - 34, 52, 236, 57, 34, 52, 226, 177, 34, 52, 224, 140, 34, 52, 223, 103, - 34, 52, 226, 94, 34, 52, 224, 26, 34, 52, 222, 155, 34, 52, 221, 205, 34, - 52, 221, 0, 34, 52, 222, 87, 34, 52, 101, 34, 52, 208, 34, 52, 232, 62, - 34, 52, 231, 144, 34, 52, 232, 141, 34, 52, 231, 204, 34, 52, 155, 34, - 52, 243, 112, 34, 52, 242, 173, 34, 52, 243, 162, 34, 52, 243, 4, 34, 52, - 196, 34, 52, 233, 196, 34, 52, 233, 99, 34, 52, 234, 25, 34, 52, 233, - 136, 34, 52, 184, 34, 52, 217, 200, 34, 52, 217, 231, 34, 52, 203, 34, - 52, 227, 147, 34, 52, 227, 22, 34, 52, 227, 216, 34, 52, 227, 75, 34, 52, - 219, 7, 34, 52, 218, 204, 34, 52, 218, 227, 34, 52, 218, 187, 40, 254, - 91, 40, 254, 15, 40, 254, 108, 40, 255, 16, 40, 237, 199, 40, 237, 172, - 40, 220, 66, 40, 246, 124, 40, 246, 248, 40, 230, 130, 40, 230, 125, 40, - 236, 242, 40, 236, 214, 40, 236, 212, 40, 244, 217, 40, 244, 225, 40, - 244, 94, 40, 244, 90, 40, 235, 203, 40, 244, 84, 40, 236, 97, 40, 236, - 96, 40, 236, 95, 40, 236, 94, 40, 243, 251, 40, 243, 250, 40, 235, 244, - 40, 235, 246, 40, 236, 180, 40, 236, 32, 40, 236, 39, 40, 226, 162, 40, - 226, 136, 40, 224, 85, 40, 225, 58, 40, 225, 57, 40, 249, 204, 40, 249, - 45, 40, 248, 146, 40, 221, 134, 40, 232, 214, 40, 231, 176, 40, 243, 199, - 40, 230, 40, 40, 230, 39, 40, 252, 235, 40, 229, 105, 40, 229, 74, 40, - 229, 75, 40, 252, 65, 40, 242, 172, 40, 242, 168, 40, 251, 223, 40, 242, - 155, 40, 243, 143, 40, 229, 150, 40, 229, 178, 40, 243, 129, 40, 229, - 176, 40, 229, 189, 40, 252, 133, 40, 229, 27, 40, 252, 31, 40, 242, 249, - 40, 229, 22, 40, 242, 245, 40, 242, 246, 40, 234, 98, 40, 234, 95, 40, - 234, 102, 40, 234, 59, 40, 234, 80, 40, 233, 167, 40, 233, 149, 40, 233, - 148, 40, 234, 9, 40, 234, 7, 40, 234, 10, 40, 218, 75, 40, 218, 73, 40, - 217, 190, 40, 227, 86, 40, 227, 90, 40, 227, 3, 40, 226, 254, 40, 227, - 188, 40, 227, 186, 40, 218, 239, 98, 183, 16, 35, 242, 184, 217, 84, 98, - 183, 16, 35, 242, 184, 107, 98, 183, 16, 35, 242, 184, 103, 98, 183, 16, - 35, 242, 184, 160, 98, 183, 16, 35, 242, 184, 154, 98, 183, 16, 35, 242, - 184, 174, 98, 183, 16, 35, 242, 184, 182, 98, 183, 16, 35, 242, 184, 191, - 98, 183, 16, 35, 242, 184, 185, 98, 183, 16, 35, 242, 184, 190, 98, 183, - 16, 35, 242, 184, 222, 65, 98, 183, 16, 35, 242, 184, 246, 211, 98, 183, - 16, 35, 242, 184, 220, 221, 98, 183, 16, 35, 242, 184, 221, 247, 98, 183, - 16, 35, 242, 184, 245, 111, 98, 183, 16, 35, 242, 184, 245, 200, 98, 183, - 16, 35, 242, 184, 224, 77, 98, 183, 16, 35, 242, 184, 225, 41, 98, 183, - 16, 35, 242, 184, 246, 233, 98, 183, 16, 35, 242, 184, 232, 29, 98, 183, - 16, 35, 242, 184, 220, 219, 98, 183, 16, 35, 242, 184, 220, 213, 98, 183, - 16, 35, 242, 184, 220, 209, 98, 183, 16, 35, 242, 184, 220, 210, 98, 183, - 16, 35, 242, 184, 220, 215, 40, 242, 178, 40, 249, 207, 40, 253, 232, 40, - 135, 40, 230, 79, 40, 229, 201, 40, 248, 169, 40, 248, 170, 223, 226, 40, - 248, 170, 250, 88, 40, 237, 137, 40, 246, 147, 232, 219, 243, 144, 40, - 246, 147, 232, 219, 222, 221, 40, 246, 147, 232, 219, 222, 132, 40, 246, - 147, 232, 219, 234, 6, 40, 250, 120, 40, 230, 44, 254, 133, 40, 208, 40, - 233, 100, 60, 40, 196, 40, 175, 40, 236, 187, 40, 234, 41, 40, 244, 205, - 40, 251, 161, 40, 236, 186, 40, 229, 144, 40, 232, 119, 40, 233, 100, - 246, 74, 40, 233, 100, 245, 67, 40, 233, 230, 40, 236, 151, 40, 242, 116, - 40, 236, 115, 40, 233, 198, 40, 244, 105, 40, 221, 207, 40, 233, 100, - 153, 40, 233, 143, 40, 248, 177, 40, 236, 68, 40, 245, 141, 40, 231, 219, - 40, 233, 100, 189, 40, 233, 140, 40, 250, 183, 40, 236, 62, 40, 233, 141, - 223, 226, 40, 250, 184, 223, 226, 40, 234, 187, 223, 226, 40, 236, 63, - 223, 226, 40, 233, 141, 250, 88, 40, 250, 184, 250, 88, 40, 234, 187, - 250, 88, 40, 236, 63, 250, 88, 40, 234, 187, 104, 198, 40, 234, 187, 104, - 226, 235, 223, 226, 40, 187, 40, 236, 26, 40, 233, 102, 40, 244, 48, 40, - 227, 252, 40, 227, 253, 104, 198, 40, 227, 253, 104, 226, 235, 223, 226, - 40, 228, 213, 40, 231, 148, 40, 233, 100, 198, 40, 233, 101, 40, 228, - 183, 40, 231, 87, 40, 233, 100, 216, 216, 40, 233, 52, 40, 235, 237, 40, - 233, 53, 234, 9, 40, 228, 182, 40, 231, 86, 40, 233, 100, 219, 40, 40, - 233, 50, 40, 235, 235, 40, 233, 51, 234, 9, 40, 237, 18, 230, 159, 40, - 234, 187, 230, 159, 40, 254, 140, 40, 252, 20, 40, 251, 115, 40, 251, - 100, 40, 251, 203, 104, 236, 151, 40, 250, 182, 40, 249, 134, 40, 243, - 237, 40, 155, 40, 242, 179, 40, 237, 223, 40, 236, 75, 40, 236, 63, 251, - 142, 40, 236, 9, 40, 235, 15, 40, 235, 14, 40, 235, 8, 40, 234, 199, 40, - 234, 42, 224, 43, 40, 233, 166, 40, 233, 129, 40, 229, 142, 40, 229, 40, - 40, 229, 5, 40, 229, 3, 40, 223, 220, 40, 223, 41, 40, 218, 228, 40, 220, - 11, 104, 189, 40, 112, 104, 189, 98, 183, 16, 35, 249, 137, 107, 98, 183, - 16, 35, 249, 137, 103, 98, 183, 16, 35, 249, 137, 160, 98, 183, 16, 35, - 249, 137, 154, 98, 183, 16, 35, 249, 137, 174, 98, 183, 16, 35, 249, 137, - 182, 98, 183, 16, 35, 249, 137, 191, 98, 183, 16, 35, 249, 137, 185, 98, - 183, 16, 35, 249, 137, 190, 98, 183, 16, 35, 249, 137, 222, 65, 98, 183, - 16, 35, 249, 137, 246, 211, 98, 183, 16, 35, 249, 137, 220, 221, 98, 183, - 16, 35, 249, 137, 221, 247, 98, 183, 16, 35, 249, 137, 245, 111, 98, 183, - 16, 35, 249, 137, 245, 200, 98, 183, 16, 35, 249, 137, 224, 77, 98, 183, - 16, 35, 249, 137, 225, 41, 98, 183, 16, 35, 249, 137, 246, 233, 98, 183, - 16, 35, 249, 137, 232, 29, 98, 183, 16, 35, 249, 137, 220, 219, 98, 183, - 16, 35, 249, 137, 220, 213, 98, 183, 16, 35, 249, 137, 220, 209, 98, 183, - 16, 35, 249, 137, 220, 210, 98, 183, 16, 35, 249, 137, 220, 215, 98, 183, - 16, 35, 249, 137, 220, 216, 98, 183, 16, 35, 249, 137, 220, 211, 98, 183, - 16, 35, 249, 137, 220, 212, 98, 183, 16, 35, 249, 137, 220, 218, 98, 183, - 16, 35, 249, 137, 220, 214, 98, 183, 16, 35, 249, 137, 221, 245, 98, 183, - 16, 35, 249, 137, 221, 244, 40, 244, 240, 205, 35, 222, 23, 250, 108, - 243, 151, 205, 35, 222, 23, 227, 213, 247, 8, 205, 35, 248, 244, 253, - 245, 222, 23, 252, 130, 205, 35, 217, 211, 245, 137, 205, 35, 219, 1, - 205, 35, 250, 155, 205, 35, 222, 23, 254, 30, 205, 35, 242, 253, 221, - 136, 205, 35, 3, 222, 120, 205, 35, 221, 100, 205, 35, 229, 196, 205, 35, - 223, 158, 205, 35, 245, 218, 205, 35, 244, 32, 229, 15, 205, 35, 233, - 132, 205, 35, 246, 175, 205, 35, 245, 138, 205, 35, 218, 172, 230, 139, - 222, 23, 249, 88, 205, 35, 254, 75, 205, 35, 250, 139, 205, 35, 252, 59, - 221, 224, 205, 35, 244, 46, 205, 35, 223, 237, 254, 90, 205, 35, 227, - 162, 205, 35, 237, 194, 205, 35, 244, 32, 222, 120, 205, 35, 233, 106, - 250, 122, 205, 35, 244, 32, 228, 240, 205, 35, 222, 23, 255, 4, 218, 240, - 205, 35, 222, 23, 250, 201, 245, 179, 205, 35, 237, 206, 205, 35, 247, - 90, 205, 35, 227, 165, 205, 35, 244, 32, 229, 10, 205, 35, 228, 227, 205, - 35, 249, 151, 117, 222, 23, 235, 58, 205, 35, 222, 23, 245, 246, 205, 35, - 230, 109, 205, 35, 230, 173, 205, 35, 249, 66, 205, 35, 249, 84, 205, 35, - 237, 217, 205, 35, 252, 11, 205, 35, 250, 170, 199, 234, 12, 205, 35, - 244, 212, 221, 136, 205, 35, 228, 187, 220, 54, 205, 35, 230, 108, 205, - 35, 222, 23, 218, 221, 205, 35, 227, 156, 205, 35, 222, 23, 251, 121, - 205, 35, 222, 23, 254, 26, 221, 221, 205, 35, 222, 23, 236, 181, 223, - 141, 233, 107, 205, 35, 249, 43, 205, 35, 222, 23, 234, 61, 234, 99, 205, - 35, 255, 5, 205, 35, 222, 23, 218, 252, 205, 35, 222, 23, 244, 177, 218, - 194, 205, 35, 222, 23, 237, 44, 235, 165, 205, 35, 248, 200, 205, 35, - 235, 50, 205, 35, 237, 197, 221, 59, 205, 35, 3, 228, 240, 205, 35, 254, - 210, 250, 162, 205, 35, 252, 132, 250, 162, 8, 4, 237, 140, 8, 4, 237, - 134, 8, 4, 72, 8, 4, 237, 159, 8, 4, 238, 24, 8, 4, 238, 7, 8, 4, 238, - 26, 8, 4, 238, 25, 8, 4, 253, 244, 8, 4, 253, 214, 8, 4, 60, 8, 4, 254, - 92, 8, 4, 220, 64, 8, 4, 220, 67, 8, 4, 220, 65, 8, 4, 230, 92, 8, 4, - 230, 68, 8, 4, 74, 8, 4, 230, 120, 8, 4, 246, 98, 8, 4, 73, 8, 4, 218, - 165, 8, 4, 252, 60, 8, 4, 252, 57, 8, 4, 252, 84, 8, 4, 252, 68, 8, 4, - 252, 78, 8, 4, 252, 77, 8, 4, 252, 80, 8, 4, 252, 79, 8, 4, 252, 184, 8, - 4, 252, 180, 8, 4, 252, 237, 8, 4, 252, 202, 8, 4, 251, 231, 8, 4, 251, - 235, 8, 4, 251, 232, 8, 4, 252, 30, 8, 4, 252, 21, 8, 4, 252, 41, 8, 4, - 252, 32, 8, 4, 252, 97, 8, 4, 252, 144, 8, 4, 252, 109, 8, 4, 251, 221, - 8, 4, 251, 219, 8, 4, 251, 248, 8, 4, 251, 230, 8, 4, 251, 224, 8, 4, - 251, 228, 8, 4, 251, 207, 8, 4, 251, 206, 8, 4, 251, 212, 8, 4, 251, 210, - 8, 4, 251, 208, 8, 4, 251, 209, 8, 4, 229, 64, 8, 4, 229, 60, 8, 4, 229, - 108, 8, 4, 229, 70, 8, 4, 229, 79, 8, 4, 229, 103, 8, 4, 229, 101, 8, 4, - 229, 215, 8, 4, 229, 206, 8, 4, 187, 8, 4, 229, 246, 8, 4, 228, 192, 8, - 4, 228, 194, 8, 4, 228, 193, 8, 4, 229, 12, 8, 4, 229, 8, 8, 4, 229, 37, - 8, 4, 229, 19, 8, 4, 228, 185, 8, 4, 228, 184, 8, 4, 228, 202, 8, 4, 228, - 191, 8, 4, 228, 188, 8, 4, 228, 190, 8, 4, 228, 167, 8, 4, 228, 166, 8, - 4, 228, 171, 8, 4, 228, 170, 8, 4, 228, 168, 8, 4, 228, 169, 8, 4, 252, - 165, 8, 4, 252, 164, 8, 4, 252, 171, 8, 4, 252, 166, 8, 4, 252, 168, 8, - 4, 252, 167, 8, 4, 252, 170, 8, 4, 252, 169, 8, 4, 252, 176, 8, 4, 252, - 175, 8, 4, 252, 178, 8, 4, 252, 177, 8, 4, 252, 156, 8, 4, 252, 158, 8, - 4, 252, 157, 8, 4, 252, 161, 8, 4, 252, 160, 8, 4, 252, 163, 8, 4, 252, - 162, 8, 4, 252, 172, 8, 4, 252, 174, 8, 4, 252, 173, 8, 4, 252, 152, 8, - 4, 252, 151, 8, 4, 252, 159, 8, 4, 252, 155, 8, 4, 252, 153, 8, 4, 252, - 154, 8, 4, 252, 148, 8, 4, 252, 147, 8, 4, 252, 150, 8, 4, 252, 149, 8, - 4, 232, 188, 8, 4, 232, 187, 8, 4, 232, 193, 8, 4, 232, 189, 8, 4, 232, - 190, 8, 4, 232, 192, 8, 4, 232, 191, 8, 4, 232, 195, 8, 4, 232, 194, 8, - 4, 232, 197, 8, 4, 232, 196, 8, 4, 232, 184, 8, 4, 232, 183, 8, 4, 232, - 186, 8, 4, 232, 185, 8, 4, 232, 178, 8, 4, 232, 177, 8, 4, 232, 182, 8, - 4, 232, 181, 8, 4, 232, 179, 8, 4, 232, 180, 8, 4, 232, 172, 8, 4, 232, - 171, 8, 4, 232, 176, 8, 4, 232, 175, 8, 4, 232, 173, 8, 4, 232, 174, 8, - 4, 243, 46, 8, 4, 243, 45, 8, 4, 243, 51, 8, 4, 243, 47, 8, 4, 243, 48, - 8, 4, 243, 50, 8, 4, 243, 49, 8, 4, 243, 54, 8, 4, 243, 53, 8, 4, 243, - 56, 8, 4, 243, 55, 8, 4, 243, 37, 8, 4, 243, 39, 8, 4, 243, 38, 8, 4, - 243, 42, 8, 4, 243, 41, 8, 4, 243, 44, 8, 4, 243, 43, 8, 4, 243, 33, 8, - 4, 243, 32, 8, 4, 243, 40, 8, 4, 243, 36, 8, 4, 243, 34, 8, 4, 243, 35, - 8, 4, 243, 27, 8, 4, 243, 31, 8, 4, 243, 30, 8, 4, 243, 28, 8, 4, 243, - 29, 8, 4, 233, 145, 8, 4, 233, 144, 8, 4, 233, 196, 8, 4, 233, 151, 8, 4, - 233, 173, 8, 4, 233, 190, 8, 4, 233, 189, 8, 4, 234, 51, 8, 4, 234, 47, - 8, 4, 196, 8, 4, 234, 78, 8, 4, 233, 75, 8, 4, 233, 74, 8, 4, 233, 77, 8, - 4, 233, 76, 8, 4, 233, 111, 8, 4, 233, 103, 8, 4, 233, 136, 8, 4, 233, - 115, 8, 4, 233, 232, 8, 4, 234, 25, 8, 4, 233, 57, 8, 4, 233, 54, 8, 4, - 233, 99, 8, 4, 233, 71, 8, 4, 233, 64, 8, 4, 233, 69, 8, 4, 233, 36, 8, - 4, 233, 35, 8, 4, 233, 41, 8, 4, 233, 38, 8, 4, 245, 172, 8, 4, 245, 168, - 8, 4, 245, 203, 8, 4, 245, 180, 8, 4, 245, 240, 8, 4, 245, 234, 8, 4, - 246, 8, 8, 4, 245, 242, 8, 4, 245, 109, 8, 4, 245, 139, 8, 4, 245, 130, - 8, 4, 245, 80, 8, 4, 245, 79, 8, 4, 245, 92, 8, 4, 245, 85, 8, 4, 245, - 83, 8, 4, 245, 84, 8, 4, 245, 70, 8, 4, 245, 69, 8, 4, 245, 73, 8, 4, - 245, 71, 8, 4, 219, 74, 8, 4, 219, 73, 8, 4, 219, 94, 8, 4, 219, 83, 8, - 4, 219, 89, 8, 4, 219, 87, 8, 4, 219, 91, 8, 4, 219, 90, 8, 4, 219, 172, - 8, 4, 219, 168, 8, 4, 219, 189, 8, 4, 219, 182, 8, 4, 219, 62, 8, 4, 219, - 58, 8, 4, 219, 72, 8, 4, 219, 63, 8, 4, 219, 95, 8, 4, 219, 156, 8, 4, - 219, 51, 8, 4, 219, 50, 8, 4, 219, 56, 8, 4, 219, 54, 8, 4, 219, 52, 8, - 4, 219, 53, 8, 4, 219, 44, 8, 4, 219, 43, 8, 4, 219, 48, 8, 4, 219, 47, - 8, 4, 219, 45, 8, 4, 219, 46, 8, 4, 248, 197, 8, 4, 248, 185, 8, 4, 249, - 15, 8, 4, 248, 216, 8, 4, 248, 249, 8, 4, 248, 253, 8, 4, 248, 252, 8, 4, - 249, 143, 8, 4, 249, 138, 8, 4, 249, 207, 8, 4, 249, 162, 8, 4, 247, 95, - 8, 4, 247, 96, 8, 4, 248, 145, 8, 4, 247, 128, 8, 4, 248, 167, 8, 4, 248, - 147, 8, 4, 249, 41, 8, 4, 249, 92, 8, 4, 249, 53, 8, 4, 247, 88, 8, 4, - 247, 86, 8, 4, 247, 111, 8, 4, 247, 94, 8, 4, 247, 89, 8, 4, 247, 92, 8, - 4, 221, 161, 8, 4, 221, 157, 8, 4, 221, 205, 8, 4, 221, 169, 8, 4, 221, - 198, 8, 4, 221, 200, 8, 4, 221, 199, 8, 4, 222, 110, 8, 4, 222, 97, 8, 4, - 222, 155, 8, 4, 222, 115, 8, 4, 220, 244, 8, 4, 220, 243, 8, 4, 220, 246, - 8, 4, 220, 245, 8, 4, 221, 113, 8, 4, 221, 110, 8, 4, 101, 8, 4, 221, - 119, 8, 4, 222, 40, 8, 4, 222, 87, 8, 4, 222, 57, 8, 4, 220, 231, 8, 4, - 220, 228, 8, 4, 221, 0, 8, 4, 220, 242, 8, 4, 220, 232, 8, 4, 220, 240, - 8, 4, 249, 109, 8, 4, 249, 108, 8, 4, 249, 114, 8, 4, 249, 110, 8, 4, - 249, 111, 8, 4, 249, 113, 8, 4, 249, 112, 8, 4, 249, 125, 8, 4, 249, 124, - 8, 4, 249, 132, 8, 4, 249, 126, 8, 4, 249, 99, 8, 4, 249, 101, 8, 4, 249, - 100, 8, 4, 249, 104, 8, 4, 249, 103, 8, 4, 249, 107, 8, 4, 249, 105, 8, - 4, 249, 117, 8, 4, 249, 120, 8, 4, 249, 118, 8, 4, 249, 95, 8, 4, 249, - 94, 8, 4, 249, 102, 8, 4, 249, 98, 8, 4, 249, 96, 8, 4, 249, 97, 8, 4, - 232, 156, 8, 4, 232, 155, 8, 4, 232, 160, 8, 4, 232, 157, 8, 4, 232, 158, - 8, 4, 232, 159, 8, 4, 232, 166, 8, 4, 232, 165, 8, 4, 232, 169, 8, 4, - 232, 167, 8, 4, 232, 150, 8, 4, 232, 149, 8, 4, 232, 154, 8, 4, 232, 151, - 8, 4, 232, 161, 8, 4, 232, 164, 8, 4, 232, 162, 8, 4, 232, 144, 8, 4, - 232, 143, 8, 4, 232, 148, 8, 4, 232, 147, 8, 4, 232, 145, 8, 4, 232, 146, - 8, 4, 243, 13, 8, 4, 243, 12, 8, 4, 243, 19, 8, 4, 243, 14, 8, 4, 243, - 16, 8, 4, 243, 15, 8, 4, 243, 18, 8, 4, 243, 17, 8, 4, 243, 24, 8, 4, - 243, 23, 8, 4, 243, 26, 8, 4, 243, 25, 8, 4, 243, 7, 8, 4, 243, 8, 8, 4, - 243, 10, 8, 4, 243, 9, 8, 4, 243, 11, 8, 4, 243, 20, 8, 4, 243, 22, 8, 4, - 243, 21, 8, 4, 243, 6, 8, 4, 232, 21, 8, 4, 232, 20, 8, 4, 232, 62, 8, 4, - 232, 24, 8, 4, 232, 44, 8, 4, 232, 58, 8, 4, 232, 57, 8, 4, 232, 201, 8, - 4, 208, 8, 4, 232, 212, 8, 4, 231, 95, 8, 4, 231, 97, 8, 4, 231, 96, 8, - 4, 231, 184, 8, 4, 231, 173, 8, 4, 231, 204, 8, 4, 231, 191, 8, 4, 232, - 121, 8, 4, 232, 141, 8, 4, 232, 130, 8, 4, 231, 91, 8, 4, 231, 88, 8, 4, - 231, 144, 8, 4, 231, 94, 8, 4, 231, 92, 8, 4, 231, 93, 8, 4, 243, 77, 8, - 4, 243, 76, 8, 4, 243, 82, 8, 4, 243, 78, 8, 4, 243, 79, 8, 4, 243, 81, - 8, 4, 243, 80, 8, 4, 243, 87, 8, 4, 243, 86, 8, 4, 243, 89, 8, 4, 243, - 88, 8, 4, 243, 69, 8, 4, 243, 71, 8, 4, 243, 70, 8, 4, 243, 73, 8, 4, - 243, 75, 8, 4, 243, 74, 8, 4, 243, 83, 8, 4, 243, 85, 8, 4, 243, 84, 8, - 4, 243, 65, 8, 4, 243, 64, 8, 4, 243, 72, 8, 4, 243, 68, 8, 4, 243, 66, - 8, 4, 243, 67, 8, 4, 243, 59, 8, 4, 243, 58, 8, 4, 243, 63, 8, 4, 243, - 62, 8, 4, 243, 60, 8, 4, 243, 61, 8, 4, 235, 27, 8, 4, 235, 22, 8, 4, - 235, 67, 8, 4, 235, 32, 8, 4, 235, 61, 8, 4, 235, 60, 8, 4, 235, 63, 8, - 4, 235, 62, 8, 4, 235, 141, 8, 4, 235, 133, 8, 4, 235, 188, 8, 4, 235, - 147, 8, 4, 234, 214, 8, 4, 234, 213, 8, 4, 234, 216, 8, 4, 234, 215, 8, - 4, 234, 242, 8, 4, 234, 236, 8, 4, 235, 12, 8, 4, 234, 245, 8, 4, 235, - 82, 8, 4, 235, 122, 8, 4, 235, 89, 8, 4, 234, 209, 8, 4, 234, 208, 8, 4, - 234, 231, 8, 4, 234, 212, 8, 4, 234, 210, 8, 4, 234, 211, 8, 4, 234, 191, - 8, 4, 234, 190, 8, 4, 234, 198, 8, 4, 234, 194, 8, 4, 234, 192, 8, 4, - 234, 193, 8, 4, 244, 80, 8, 4, 244, 79, 8, 4, 244, 103, 8, 4, 244, 89, 8, - 4, 244, 96, 8, 4, 244, 95, 8, 4, 244, 98, 8, 4, 244, 97, 8, 4, 244, 214, - 8, 4, 244, 209, 8, 4, 245, 0, 8, 4, 244, 223, 8, 4, 244, 0, 8, 4, 243, - 255, 8, 4, 244, 2, 8, 4, 244, 1, 8, 4, 244, 51, 8, 4, 244, 49, 8, 4, 244, - 68, 8, 4, 244, 59, 8, 4, 244, 164, 8, 4, 244, 162, 8, 4, 244, 191, 8, 4, - 244, 174, 8, 4, 243, 246, 8, 4, 243, 245, 8, 4, 244, 17, 8, 4, 243, 254, - 8, 4, 243, 247, 8, 4, 243, 253, 8, 4, 236, 89, 8, 4, 236, 88, 8, 4, 236, - 113, 8, 4, 236, 99, 8, 4, 236, 107, 8, 4, 236, 109, 8, 4, 236, 108, 8, 4, - 236, 203, 8, 4, 236, 192, 8, 4, 175, 8, 4, 236, 227, 8, 4, 235, 250, 8, - 4, 235, 252, 8, 4, 235, 251, 8, 4, 236, 31, 8, 4, 236, 27, 8, 4, 236, 57, - 8, 4, 236, 38, 8, 4, 236, 159, 8, 4, 236, 156, 8, 4, 236, 184, 8, 4, 236, - 162, 8, 4, 235, 240, 8, 4, 235, 238, 8, 4, 236, 7, 8, 4, 235, 249, 8, 4, - 235, 243, 8, 4, 235, 247, 8, 4, 244, 146, 8, 4, 244, 145, 8, 4, 244, 150, - 8, 4, 244, 147, 8, 4, 244, 149, 8, 4, 244, 148, 8, 4, 244, 157, 8, 4, - 244, 156, 8, 4, 244, 160, 8, 4, 244, 158, 8, 4, 244, 137, 8, 4, 244, 136, - 8, 4, 244, 139, 8, 4, 244, 138, 8, 4, 244, 142, 8, 4, 244, 141, 8, 4, - 244, 144, 8, 4, 244, 143, 8, 4, 244, 152, 8, 4, 244, 151, 8, 4, 244, 155, - 8, 4, 244, 153, 8, 4, 244, 132, 8, 4, 244, 131, 8, 4, 244, 140, 8, 4, - 244, 135, 8, 4, 244, 133, 8, 4, 244, 134, 8, 4, 233, 214, 8, 4, 233, 215, - 8, 4, 233, 227, 8, 4, 233, 226, 8, 4, 233, 229, 8, 4, 233, 228, 8, 4, - 233, 205, 8, 4, 233, 207, 8, 4, 233, 206, 8, 4, 233, 210, 8, 4, 233, 209, - 8, 4, 233, 212, 8, 4, 233, 211, 8, 4, 233, 216, 8, 4, 233, 218, 8, 4, - 233, 217, 8, 4, 233, 201, 8, 4, 233, 200, 8, 4, 233, 208, 8, 4, 233, 204, - 8, 4, 233, 202, 8, 4, 233, 203, 8, 4, 242, 133, 8, 4, 242, 132, 8, 4, - 242, 139, 8, 4, 242, 134, 8, 4, 242, 136, 8, 4, 242, 135, 8, 4, 242, 138, - 8, 4, 242, 137, 8, 4, 242, 144, 8, 4, 242, 143, 8, 4, 242, 146, 8, 4, - 242, 145, 8, 4, 242, 125, 8, 4, 242, 124, 8, 4, 242, 127, 8, 4, 242, 126, - 8, 4, 242, 129, 8, 4, 242, 128, 8, 4, 242, 131, 8, 4, 242, 130, 8, 4, - 242, 140, 8, 4, 242, 142, 8, 4, 242, 141, 8, 4, 232, 89, 8, 4, 232, 91, - 8, 4, 232, 90, 8, 4, 232, 108, 8, 4, 232, 107, 8, 4, 232, 115, 8, 4, 232, - 110, 8, 4, 232, 71, 8, 4, 232, 70, 8, 4, 232, 72, 8, 4, 232, 78, 8, 4, - 232, 75, 8, 4, 232, 84, 8, 4, 232, 79, 8, 4, 232, 102, 8, 4, 232, 106, 8, - 4, 232, 103, 8, 4, 243, 92, 8, 4, 243, 100, 8, 4, 243, 108, 8, 4, 243, - 173, 8, 4, 243, 167, 8, 4, 155, 8, 4, 243, 183, 8, 4, 242, 157, 8, 4, - 242, 156, 8, 4, 242, 159, 8, 4, 242, 158, 8, 4, 242, 186, 8, 4, 242, 181, - 8, 4, 243, 4, 8, 4, 242, 244, 8, 4, 243, 125, 8, 4, 243, 162, 8, 4, 243, - 135, 8, 4, 218, 243, 8, 4, 218, 231, 8, 4, 219, 7, 8, 4, 218, 251, 8, 4, - 218, 157, 8, 4, 218, 159, 8, 4, 218, 158, 8, 4, 218, 170, 8, 4, 218, 187, - 8, 4, 218, 175, 8, 4, 218, 214, 8, 4, 218, 227, 8, 4, 218, 218, 8, 4, - 217, 28, 8, 4, 217, 27, 8, 4, 217, 42, 8, 4, 217, 30, 8, 4, 217, 35, 8, - 4, 217, 37, 8, 4, 217, 36, 8, 4, 217, 100, 8, 4, 217, 97, 8, 4, 217, 114, - 8, 4, 217, 103, 8, 4, 217, 6, 8, 4, 217, 8, 8, 4, 217, 7, 8, 4, 217, 17, - 8, 4, 217, 16, 8, 4, 217, 21, 8, 4, 217, 18, 8, 4, 217, 82, 8, 4, 217, - 92, 8, 4, 217, 86, 8, 4, 217, 2, 8, 4, 217, 1, 8, 4, 217, 13, 8, 4, 217, - 5, 8, 4, 217, 3, 8, 4, 217, 4, 8, 4, 216, 249, 8, 4, 216, 248, 8, 4, 216, - 254, 8, 4, 216, 252, 8, 4, 216, 250, 8, 4, 216, 251, 8, 4, 250, 215, 8, - 4, 250, 212, 8, 4, 250, 235, 8, 4, 250, 223, 8, 4, 250, 232, 8, 4, 250, - 226, 8, 4, 250, 234, 8, 4, 250, 233, 8, 4, 251, 124, 8, 4, 251, 118, 8, - 4, 251, 169, 8, 4, 251, 143, 8, 4, 250, 84, 8, 4, 250, 86, 8, 4, 250, 85, - 8, 4, 250, 116, 8, 4, 250, 109, 8, 4, 250, 182, 8, 4, 250, 129, 8, 4, - 251, 71, 8, 4, 251, 99, 8, 4, 251, 75, 8, 4, 250, 68, 8, 4, 250, 67, 8, - 4, 250, 92, 8, 4, 250, 82, 8, 4, 250, 71, 8, 4, 250, 81, 8, 4, 250, 49, - 8, 4, 250, 48, 8, 4, 250, 58, 8, 4, 250, 55, 8, 4, 250, 50, 8, 4, 250, - 52, 8, 4, 216, 232, 8, 4, 216, 231, 8, 4, 216, 238, 8, 4, 216, 233, 8, 4, - 216, 235, 8, 4, 216, 234, 8, 4, 216, 237, 8, 4, 216, 236, 8, 4, 216, 244, - 8, 4, 216, 243, 8, 4, 216, 247, 8, 4, 216, 245, 8, 4, 216, 228, 8, 4, - 216, 230, 8, 4, 216, 229, 8, 4, 216, 239, 8, 4, 216, 242, 8, 4, 216, 240, - 8, 4, 216, 223, 8, 4, 216, 227, 8, 4, 216, 226, 8, 4, 216, 224, 8, 4, - 216, 225, 8, 4, 216, 218, 8, 4, 216, 217, 8, 4, 216, 222, 8, 4, 216, 221, - 8, 4, 216, 219, 8, 4, 216, 220, 8, 4, 231, 31, 8, 4, 231, 30, 8, 4, 231, - 36, 8, 4, 231, 32, 8, 4, 231, 33, 8, 4, 231, 35, 8, 4, 231, 34, 8, 4, - 231, 40, 8, 4, 231, 39, 8, 4, 231, 42, 8, 4, 231, 41, 8, 4, 231, 25, 8, - 4, 231, 26, 8, 4, 231, 28, 8, 4, 231, 29, 8, 4, 231, 37, 8, 4, 231, 38, - 8, 4, 231, 21, 8, 4, 231, 27, 8, 4, 231, 24, 8, 4, 231, 22, 8, 4, 231, - 23, 8, 4, 231, 16, 8, 4, 231, 15, 8, 4, 231, 20, 8, 4, 231, 19, 8, 4, - 231, 17, 8, 4, 231, 18, 8, 4, 224, 84, 8, 4, 182, 8, 4, 224, 140, 8, 4, - 224, 86, 8, 4, 224, 133, 8, 4, 224, 135, 8, 4, 224, 134, 8, 4, 226, 127, - 8, 4, 226, 120, 8, 4, 226, 177, 8, 4, 226, 133, 8, 4, 223, 63, 8, 4, 223, - 65, 8, 4, 223, 64, 8, 4, 224, 12, 8, 4, 224, 2, 8, 4, 224, 26, 8, 4, 224, - 13, 8, 4, 225, 36, 8, 4, 226, 94, 8, 4, 225, 56, 8, 4, 223, 44, 8, 4, - 223, 42, 8, 4, 223, 103, 8, 4, 223, 62, 8, 4, 223, 46, 8, 4, 223, 53, 8, - 4, 222, 215, 8, 4, 222, 214, 8, 4, 223, 21, 8, 4, 222, 220, 8, 4, 222, - 216, 8, 4, 222, 219, 8, 4, 223, 184, 8, 4, 223, 183, 8, 4, 223, 189, 8, - 4, 223, 185, 8, 4, 223, 186, 8, 4, 223, 188, 8, 4, 223, 187, 8, 4, 223, - 196, 8, 4, 223, 195, 8, 4, 223, 218, 8, 4, 223, 197, 8, 4, 223, 180, 8, - 4, 223, 179, 8, 4, 223, 182, 8, 4, 223, 181, 8, 4, 223, 191, 8, 4, 223, - 194, 8, 4, 223, 192, 8, 4, 223, 176, 8, 4, 223, 175, 8, 4, 223, 178, 8, - 4, 223, 177, 8, 4, 223, 170, 8, 4, 223, 169, 8, 4, 223, 174, 8, 4, 223, - 173, 8, 4, 223, 171, 8, 4, 223, 172, 8, 4, 217, 75, 8, 4, 217, 74, 8, 4, - 217, 80, 8, 4, 217, 77, 8, 4, 217, 57, 8, 4, 217, 59, 8, 4, 217, 58, 8, - 4, 217, 62, 8, 4, 217, 61, 8, 4, 217, 65, 8, 4, 217, 63, 8, 4, 217, 69, - 8, 4, 217, 68, 8, 4, 217, 72, 8, 4, 217, 70, 8, 4, 217, 53, 8, 4, 217, - 52, 8, 4, 217, 60, 8, 4, 217, 56, 8, 4, 217, 54, 8, 4, 217, 55, 8, 4, - 217, 45, 8, 4, 217, 44, 8, 4, 217, 49, 8, 4, 217, 48, 8, 4, 217, 46, 8, - 4, 217, 47, 8, 4, 251, 51, 8, 4, 251, 48, 8, 4, 251, 69, 8, 4, 251, 57, - 8, 4, 250, 249, 8, 4, 250, 248, 8, 4, 250, 251, 8, 4, 250, 250, 8, 4, - 251, 5, 8, 4, 251, 4, 8, 4, 251, 11, 8, 4, 251, 7, 8, 4, 251, 36, 8, 4, - 251, 34, 8, 4, 251, 46, 8, 4, 251, 38, 8, 4, 250, 243, 8, 4, 250, 253, 8, - 4, 250, 247, 8, 4, 250, 244, 8, 4, 250, 246, 8, 4, 250, 237, 8, 4, 250, - 236, 8, 4, 250, 241, 8, 4, 250, 240, 8, 4, 250, 238, 8, 4, 250, 239, 8, - 4, 227, 51, 8, 4, 227, 52, 8, 4, 227, 38, 8, 4, 227, 39, 8, 4, 227, 42, - 8, 4, 227, 41, 8, 4, 227, 44, 8, 4, 227, 43, 8, 4, 227, 46, 8, 4, 227, - 45, 8, 4, 227, 50, 8, 4, 227, 47, 8, 4, 227, 34, 8, 4, 227, 33, 8, 4, - 227, 40, 8, 4, 227, 37, 8, 4, 227, 35, 8, 4, 227, 36, 8, 4, 227, 28, 8, - 4, 227, 27, 8, 4, 227, 32, 8, 4, 227, 31, 8, 4, 227, 29, 8, 4, 227, 30, - 8, 4, 231, 169, 8, 4, 231, 168, 8, 4, 231, 171, 8, 4, 231, 170, 8, 4, - 231, 161, 8, 4, 231, 163, 8, 4, 231, 162, 8, 4, 231, 165, 8, 4, 231, 164, - 8, 4, 231, 167, 8, 4, 231, 166, 8, 4, 231, 156, 8, 4, 231, 155, 8, 4, - 231, 160, 8, 4, 231, 159, 8, 4, 231, 157, 8, 4, 231, 158, 8, 4, 231, 150, - 8, 4, 231, 149, 8, 4, 231, 154, 8, 4, 231, 153, 8, 4, 231, 151, 8, 4, - 231, 152, 8, 4, 224, 253, 8, 4, 224, 250, 8, 4, 225, 25, 8, 4, 225, 7, 8, - 4, 224, 163, 8, 4, 224, 165, 8, 4, 224, 164, 8, 4, 224, 178, 8, 4, 224, - 176, 8, 4, 224, 200, 8, 4, 224, 193, 8, 4, 224, 226, 8, 4, 224, 223, 8, - 4, 224, 246, 8, 4, 224, 233, 8, 4, 224, 159, 8, 4, 224, 158, 8, 4, 224, - 170, 8, 4, 224, 162, 8, 4, 224, 160, 8, 4, 224, 161, 8, 4, 224, 143, 8, - 4, 224, 142, 8, 4, 224, 149, 8, 4, 224, 146, 8, 4, 224, 144, 8, 4, 224, - 145, 8, 4, 227, 228, 8, 4, 227, 223, 8, 4, 203, 8, 4, 227, 233, 8, 4, - 227, 6, 8, 4, 227, 8, 8, 4, 227, 7, 8, 4, 227, 60, 8, 4, 227, 54, 8, 4, - 227, 75, 8, 4, 227, 63, 8, 4, 227, 155, 8, 4, 227, 216, 8, 4, 227, 185, - 8, 4, 226, 255, 8, 4, 226, 253, 8, 4, 227, 22, 8, 4, 227, 5, 8, 4, 227, - 1, 8, 4, 227, 2, 8, 4, 226, 238, 8, 4, 226, 237, 8, 4, 226, 243, 8, 4, - 226, 241, 8, 4, 226, 239, 8, 4, 226, 240, 8, 4, 237, 89, 8, 4, 237, 88, - 8, 4, 237, 98, 8, 4, 237, 90, 8, 4, 237, 94, 8, 4, 237, 93, 8, 4, 237, - 96, 8, 4, 237, 95, 8, 4, 237, 34, 8, 4, 237, 33, 8, 4, 237, 36, 8, 4, - 237, 35, 8, 4, 237, 47, 8, 4, 237, 46, 8, 4, 237, 59, 8, 4, 237, 49, 8, - 4, 237, 28, 8, 4, 237, 26, 8, 4, 237, 43, 8, 4, 237, 32, 8, 4, 237, 29, - 8, 4, 237, 30, 8, 4, 237, 20, 8, 4, 237, 19, 8, 4, 237, 24, 8, 4, 237, - 23, 8, 4, 237, 21, 8, 4, 237, 22, 8, 4, 228, 114, 8, 4, 228, 112, 8, 4, - 228, 121, 8, 4, 228, 115, 8, 4, 228, 118, 8, 4, 228, 117, 8, 4, 228, 120, - 8, 4, 228, 119, 8, 4, 228, 70, 8, 4, 228, 67, 8, 4, 228, 72, 8, 4, 228, - 71, 8, 4, 228, 101, 8, 4, 228, 100, 8, 4, 228, 110, 8, 4, 228, 104, 8, 4, - 228, 62, 8, 4, 228, 58, 8, 4, 228, 98, 8, 4, 228, 66, 8, 4, 228, 64, 8, - 4, 228, 65, 8, 4, 228, 42, 8, 4, 228, 40, 8, 4, 228, 52, 8, 4, 228, 45, - 8, 4, 228, 43, 8, 4, 228, 44, 8, 4, 237, 78, 8, 4, 237, 77, 8, 4, 237, - 84, 8, 4, 237, 79, 8, 4, 237, 81, 8, 4, 237, 80, 8, 4, 237, 83, 8, 4, - 237, 82, 8, 4, 237, 69, 8, 4, 237, 71, 8, 4, 237, 70, 8, 4, 237, 74, 8, - 4, 237, 73, 8, 4, 237, 76, 8, 4, 237, 75, 8, 4, 237, 65, 8, 4, 237, 64, - 8, 4, 237, 72, 8, 4, 237, 68, 8, 4, 237, 66, 8, 4, 237, 67, 8, 4, 237, - 61, 8, 4, 237, 60, 8, 4, 237, 63, 8, 4, 237, 62, 8, 4, 232, 7, 8, 4, 232, - 6, 8, 4, 232, 13, 8, 4, 232, 8, 8, 4, 232, 10, 8, 4, 232, 9, 8, 4, 232, - 12, 8, 4, 232, 11, 8, 4, 231, 253, 8, 4, 231, 254, 8, 4, 232, 2, 8, 4, - 232, 1, 8, 4, 232, 5, 8, 4, 232, 3, 8, 4, 231, 249, 8, 4, 232, 0, 8, 4, - 231, 252, 8, 4, 231, 250, 8, 4, 231, 251, 8, 4, 231, 244, 8, 4, 231, 243, - 8, 4, 231, 248, 8, 4, 231, 247, 8, 4, 231, 245, 8, 4, 231, 246, 8, 4, - 231, 59, 8, 4, 231, 58, 8, 4, 231, 67, 8, 4, 231, 61, 8, 4, 231, 64, 8, - 4, 231, 63, 8, 4, 231, 66, 8, 4, 231, 65, 8, 4, 231, 47, 8, 4, 231, 49, - 8, 4, 231, 48, 8, 4, 231, 52, 8, 4, 231, 51, 8, 4, 231, 56, 8, 4, 231, - 53, 8, 4, 231, 45, 8, 4, 231, 44, 8, 4, 231, 50, 8, 4, 231, 46, 8, 4, - 218, 123, 8, 4, 218, 122, 8, 4, 218, 130, 8, 4, 218, 125, 8, 4, 218, 127, - 8, 4, 218, 126, 8, 4, 218, 129, 8, 4, 218, 128, 8, 4, 218, 112, 8, 4, - 218, 113, 8, 4, 218, 117, 8, 4, 218, 116, 8, 4, 218, 121, 8, 4, 218, 119, - 8, 4, 218, 94, 8, 4, 218, 92, 8, 4, 218, 104, 8, 4, 218, 97, 8, 4, 218, - 95, 8, 4, 218, 96, 8, 4, 217, 237, 8, 4, 217, 235, 8, 4, 217, 250, 8, 4, - 217, 238, 8, 4, 217, 245, 8, 4, 217, 244, 8, 4, 217, 247, 8, 4, 217, 246, - 8, 4, 217, 185, 8, 4, 217, 184, 8, 4, 217, 187, 8, 4, 217, 186, 8, 4, - 217, 212, 8, 4, 217, 209, 8, 4, 217, 231, 8, 4, 217, 215, 8, 4, 217, 177, - 8, 4, 217, 175, 8, 4, 217, 200, 8, 4, 217, 183, 8, 4, 217, 180, 8, 4, - 217, 181, 8, 4, 217, 160, 8, 4, 217, 159, 8, 4, 217, 166, 8, 4, 217, 163, - 8, 4, 217, 161, 8, 4, 217, 162, 8, 32, 228, 101, 8, 32, 235, 67, 8, 32, - 236, 89, 8, 32, 231, 61, 8, 32, 250, 55, 8, 32, 223, 189, 8, 32, 244, - 143, 8, 32, 244, 174, 8, 32, 233, 196, 8, 32, 242, 133, 8, 32, 234, 193, - 8, 32, 252, 152, 8, 32, 233, 115, 8, 32, 217, 231, 8, 32, 228, 185, 8, - 32, 242, 127, 8, 32, 222, 110, 8, 32, 245, 0, 8, 32, 217, 5, 8, 32, 250, - 49, 8, 32, 249, 97, 8, 32, 251, 228, 8, 32, 244, 139, 8, 32, 231, 53, 8, - 32, 221, 0, 8, 32, 230, 120, 8, 32, 237, 65, 8, 32, 217, 17, 8, 32, 228, - 167, 8, 32, 243, 44, 8, 32, 217, 237, 8, 32, 219, 53, 8, 32, 224, 149, 8, - 32, 219, 156, 8, 32, 217, 114, 8, 32, 237, 59, 8, 32, 231, 24, 8, 32, - 237, 63, 8, 32, 244, 51, 8, 32, 237, 83, 8, 32, 218, 187, 8, 32, 247, - 111, 8, 32, 224, 161, 8, 32, 235, 63, 8, 32, 250, 58, 8, 32, 250, 85, 8, - 32, 250, 223, 8, 32, 242, 130, 8, 32, 224, 253, 8, 32, 217, 4, 8, 32, - 224, 193, 8, 32, 251, 46, 8, 32, 216, 235, 8, 32, 232, 192, 8, 32, 236, - 184, 235, 28, 1, 252, 237, 235, 28, 1, 187, 235, 28, 1, 229, 141, 235, - 28, 1, 249, 207, 235, 28, 1, 222, 155, 235, 28, 1, 222, 35, 235, 28, 1, - 245, 0, 235, 28, 1, 175, 235, 28, 1, 236, 149, 235, 28, 1, 237, 123, 235, - 28, 1, 251, 169, 235, 28, 1, 251, 69, 235, 28, 1, 247, 74, 235, 28, 1, - 221, 55, 235, 28, 1, 221, 47, 235, 28, 1, 196, 235, 28, 1, 208, 235, 28, - 1, 235, 188, 235, 28, 1, 226, 177, 235, 28, 1, 217, 80, 235, 28, 1, 217, - 114, 235, 28, 1, 232, 115, 235, 28, 1, 155, 235, 28, 1, 218, 138, 235, - 28, 1, 243, 121, 235, 28, 1, 246, 8, 235, 28, 1, 219, 7, 235, 28, 1, 225, - 25, 235, 28, 1, 184, 235, 28, 1, 244, 125, 235, 28, 1, 60, 235, 28, 1, - 254, 234, 235, 28, 1, 73, 235, 28, 1, 246, 115, 235, 28, 1, 72, 235, 28, - 1, 74, 235, 28, 1, 68, 235, 28, 1, 220, 110, 235, 28, 1, 220, 105, 235, - 28, 1, 230, 167, 235, 28, 1, 145, 233, 40, 221, 205, 235, 28, 1, 145, - 232, 238, 229, 37, 235, 28, 1, 145, 233, 40, 250, 57, 235, 28, 1, 145, - 233, 40, 252, 41, 235, 28, 1, 145, 233, 40, 208, 235, 28, 1, 145, 233, - 40, 237, 104, 235, 28, 228, 197, 250, 168, 235, 28, 228, 197, 245, 90, - 223, 136, 38, 4, 246, 250, 38, 4, 246, 247, 38, 4, 243, 148, 38, 4, 218, - 224, 38, 4, 218, 223, 38, 4, 229, 191, 38, 4, 252, 91, 38, 4, 252, 137, - 38, 4, 234, 34, 38, 4, 236, 23, 38, 4, 233, 223, 38, 4, 244, 201, 38, 4, - 245, 226, 38, 4, 219, 160, 38, 4, 222, 80, 38, 4, 222, 21, 38, 4, 249, - 28, 38, 4, 249, 25, 38, 4, 235, 118, 38, 4, 227, 200, 38, 4, 249, 82, 38, - 4, 232, 163, 38, 4, 226, 84, 38, 4, 224, 244, 38, 4, 217, 90, 38, 4, 217, - 71, 38, 4, 251, 91, 38, 4, 237, 113, 38, 4, 232, 14, 38, 4, 218, 22, 38, - 4, 236, 183, 38, 4, 232, 98, 38, 4, 244, 184, 38, 4, 234, 16, 38, 4, 232, - 139, 38, 4, 231, 72, 38, 4, 72, 38, 4, 237, 223, 38, 4, 243, 112, 38, 4, - 243, 96, 38, 4, 218, 204, 38, 4, 218, 195, 38, 4, 229, 108, 38, 4, 252, - 89, 38, 4, 252, 84, 38, 4, 234, 32, 38, 4, 236, 21, 38, 4, 233, 222, 38, - 4, 244, 199, 38, 4, 245, 203, 38, 4, 219, 94, 38, 4, 221, 205, 38, 4, - 222, 2, 38, 4, 249, 20, 38, 4, 249, 24, 38, 4, 235, 67, 38, 4, 227, 147, - 38, 4, 249, 15, 38, 4, 232, 160, 38, 4, 224, 140, 38, 4, 224, 221, 38, 4, - 217, 42, 38, 4, 217, 67, 38, 4, 250, 235, 38, 4, 237, 98, 38, 4, 232, 13, - 38, 4, 217, 250, 38, 4, 236, 113, 38, 4, 232, 96, 38, 4, 244, 103, 38, 4, - 233, 196, 38, 4, 232, 62, 38, 4, 231, 67, 38, 4, 60, 38, 4, 254, 131, 38, - 4, 232, 111, 38, 4, 155, 38, 4, 243, 191, 38, 4, 219, 7, 38, 4, 218, 253, - 38, 4, 187, 38, 4, 252, 94, 38, 4, 252, 237, 38, 4, 234, 37, 38, 4, 236, - 26, 38, 4, 236, 25, 38, 4, 233, 225, 38, 4, 244, 204, 38, 4, 246, 8, 38, - 4, 219, 189, 38, 4, 222, 155, 38, 4, 222, 35, 38, 4, 249, 36, 38, 4, 249, - 27, 38, 4, 235, 188, 38, 4, 203, 38, 4, 249, 207, 38, 4, 232, 169, 38, 4, - 226, 177, 38, 4, 225, 25, 38, 4, 217, 114, 38, 4, 217, 80, 38, 4, 251, - 169, 38, 4, 237, 123, 38, 4, 232, 18, 38, 4, 184, 38, 4, 175, 38, 4, 236, - 233, 38, 4, 232, 100, 38, 4, 245, 0, 38, 4, 196, 38, 4, 208, 38, 4, 231, - 77, 38, 4, 230, 127, 38, 4, 230, 124, 38, 4, 242, 248, 38, 4, 218, 180, - 38, 4, 218, 176, 38, 4, 229, 21, 38, 4, 252, 87, 38, 4, 252, 34, 38, 4, - 234, 30, 38, 4, 236, 19, 38, 4, 233, 220, 38, 4, 244, 196, 38, 4, 245, - 134, 38, 4, 219, 64, 38, 4, 221, 122, 38, 4, 221, 236, 38, 4, 249, 18, - 38, 4, 249, 22, 38, 4, 234, 248, 38, 4, 227, 67, 38, 4, 248, 150, 38, 4, - 232, 152, 38, 4, 224, 14, 38, 4, 224, 195, 38, 4, 217, 19, 38, 4, 217, - 64, 38, 4, 250, 130, 38, 4, 237, 50, 38, 4, 232, 4, 38, 4, 217, 216, 38, - 4, 236, 41, 38, 4, 232, 94, 38, 4, 244, 60, 38, 4, 233, 119, 38, 4, 231, - 195, 38, 4, 231, 54, 38, 4, 68, 38, 4, 220, 87, 38, 4, 242, 173, 38, 4, - 242, 163, 38, 4, 218, 165, 38, 4, 218, 161, 38, 4, 228, 202, 38, 4, 252, - 86, 38, 4, 251, 248, 38, 4, 234, 29, 38, 4, 236, 18, 38, 4, 233, 219, 38, - 4, 244, 195, 38, 4, 245, 92, 38, 4, 219, 56, 38, 4, 221, 0, 38, 4, 221, - 223, 38, 4, 249, 16, 38, 4, 249, 21, 38, 4, 234, 231, 38, 4, 227, 22, 38, - 4, 247, 111, 38, 4, 232, 148, 38, 4, 223, 103, 38, 4, 224, 170, 38, 4, - 217, 13, 38, 4, 217, 60, 38, 4, 250, 92, 38, 4, 237, 43, 38, 4, 232, 0, - 38, 4, 217, 200, 38, 4, 236, 7, 38, 4, 232, 93, 38, 4, 244, 17, 38, 4, - 233, 99, 38, 4, 231, 144, 38, 4, 231, 50, 38, 4, 74, 38, 4, 230, 138, 38, - 4, 232, 81, 38, 4, 243, 4, 38, 4, 242, 249, 38, 4, 218, 187, 38, 4, 218, - 181, 38, 4, 229, 37, 38, 4, 252, 88, 38, 4, 252, 41, 38, 4, 234, 31, 38, - 4, 236, 20, 38, 4, 233, 221, 38, 4, 244, 198, 38, 4, 244, 197, 38, 4, - 245, 139, 38, 4, 219, 72, 38, 4, 101, 38, 4, 221, 239, 38, 4, 249, 19, - 38, 4, 249, 23, 38, 4, 235, 12, 38, 4, 227, 75, 38, 4, 248, 167, 38, 4, - 232, 154, 38, 4, 224, 26, 38, 4, 224, 200, 38, 4, 217, 21, 38, 4, 217, - 65, 38, 4, 250, 182, 38, 4, 237, 59, 38, 4, 232, 5, 38, 4, 217, 231, 38, - 4, 236, 57, 38, 4, 232, 95, 38, 4, 244, 68, 38, 4, 233, 136, 38, 4, 231, - 204, 38, 4, 231, 56, 38, 4, 73, 38, 4, 246, 197, 38, 4, 232, 104, 38, 4, - 243, 162, 38, 4, 243, 138, 38, 4, 218, 227, 38, 4, 218, 220, 38, 4, 229, - 198, 38, 4, 252, 92, 38, 4, 252, 144, 38, 4, 234, 35, 38, 4, 236, 24, 38, - 4, 236, 22, 38, 4, 233, 224, 38, 4, 244, 202, 38, 4, 244, 200, 38, 4, - 245, 231, 38, 4, 219, 165, 38, 4, 222, 87, 38, 4, 222, 22, 38, 4, 249, - 29, 38, 4, 249, 26, 38, 4, 235, 122, 38, 4, 227, 216, 38, 4, 249, 92, 38, - 4, 232, 164, 38, 4, 226, 94, 38, 4, 224, 246, 38, 4, 217, 92, 38, 4, 217, - 72, 38, 4, 251, 99, 38, 4, 237, 114, 38, 4, 232, 15, 38, 4, 218, 25, 38, - 4, 236, 184, 38, 4, 232, 99, 38, 4, 232, 97, 38, 4, 244, 191, 38, 4, 244, - 181, 38, 4, 234, 25, 38, 4, 232, 141, 38, 4, 231, 73, 38, 4, 232, 117, - 38, 4, 235, 93, 38, 250, 168, 38, 245, 90, 223, 136, 38, 228, 82, 78, 38, - 4, 232, 153, 246, 8, 38, 4, 232, 153, 175, 38, 4, 232, 153, 224, 14, 38, - 16, 245, 223, 38, 16, 236, 182, 38, 16, 221, 174, 38, 16, 232, 38, 38, - 16, 252, 205, 38, 16, 246, 7, 38, 16, 222, 152, 38, 16, 249, 165, 38, 16, - 248, 149, 38, 16, 235, 253, 38, 16, 221, 125, 38, 16, 248, 166, 38, 16, - 237, 51, 38, 20, 217, 84, 38, 20, 107, 38, 20, 103, 38, 20, 160, 38, 20, - 154, 38, 20, 174, 38, 20, 182, 38, 20, 191, 38, 20, 185, 38, 20, 190, 38, - 4, 232, 153, 196, 38, 4, 232, 153, 248, 167, 31, 6, 1, 217, 88, 31, 3, 1, - 217, 88, 31, 6, 1, 247, 71, 31, 3, 1, 247, 71, 31, 6, 1, 210, 247, 73, - 31, 3, 1, 210, 247, 73, 31, 6, 1, 237, 162, 31, 3, 1, 237, 162, 31, 6, 1, - 248, 181, 31, 3, 1, 248, 181, 31, 6, 1, 233, 123, 220, 102, 31, 3, 1, - 233, 123, 220, 102, 31, 6, 1, 252, 2, 230, 143, 31, 3, 1, 252, 2, 230, - 143, 31, 6, 1, 232, 123, 218, 11, 31, 3, 1, 232, 123, 218, 11, 31, 6, 1, - 218, 8, 2, 252, 234, 218, 11, 31, 3, 1, 218, 8, 2, 252, 234, 218, 11, 31, - 6, 1, 237, 160, 218, 36, 31, 3, 1, 237, 160, 218, 36, 31, 6, 1, 210, 217, - 200, 31, 3, 1, 210, 217, 200, 31, 6, 1, 237, 160, 60, 31, 3, 1, 237, 160, - 60, 31, 6, 1, 250, 197, 235, 25, 217, 178, 31, 3, 1, 250, 197, 235, 25, - 217, 178, 31, 6, 1, 252, 46, 217, 178, 31, 3, 1, 252, 46, 217, 178, 31, - 6, 1, 237, 160, 250, 197, 235, 25, 217, 178, 31, 3, 1, 237, 160, 250, - 197, 235, 25, 217, 178, 31, 6, 1, 217, 233, 31, 3, 1, 217, 233, 31, 6, 1, - 224, 21, 249, 92, 31, 3, 1, 224, 21, 249, 92, 31, 6, 1, 224, 21, 246, - 217, 31, 3, 1, 224, 21, 246, 217, 31, 6, 1, 224, 21, 246, 205, 31, 3, 1, - 224, 21, 246, 205, 31, 6, 1, 233, 127, 74, 31, 3, 1, 233, 127, 74, 31, 6, - 1, 252, 70, 74, 31, 3, 1, 252, 70, 74, 31, 6, 1, 51, 233, 127, 74, 31, 3, - 1, 51, 233, 127, 74, 31, 1, 233, 86, 74, 36, 31, 219, 42, 36, 31, 222, - 66, 233, 162, 55, 36, 31, 242, 162, 233, 162, 55, 36, 31, 221, 232, 233, - 162, 55, 224, 53, 253, 251, 36, 31, 236, 194, 36, 31, 229, 203, 31, 236, - 194, 31, 229, 203, 31, 6, 1, 247, 82, 31, 3, 1, 247, 82, 31, 6, 1, 247, - 64, 31, 3, 1, 247, 64, 31, 6, 1, 217, 50, 31, 3, 1, 217, 50, 31, 6, 1, - 251, 108, 31, 3, 1, 251, 108, 31, 6, 1, 247, 63, 31, 3, 1, 247, 63, 31, - 6, 1, 222, 88, 2, 233, 193, 96, 31, 3, 1, 222, 88, 2, 233, 193, 96, 31, - 6, 1, 220, 223, 31, 3, 1, 220, 223, 31, 6, 1, 221, 33, 31, 3, 1, 221, 33, - 31, 6, 1, 221, 37, 31, 3, 1, 221, 37, 31, 6, 1, 222, 93, 31, 3, 1, 222, - 93, 31, 6, 1, 242, 151, 31, 3, 1, 242, 151, 31, 6, 1, 224, 155, 31, 3, 1, - 224, 155, 139, 1, 60, 139, 1, 175, 139, 1, 68, 139, 1, 236, 7, 139, 1, - 246, 250, 139, 1, 227, 200, 139, 1, 222, 142, 139, 1, 74, 139, 1, 231, - 67, 139, 1, 72, 139, 1, 235, 188, 139, 1, 187, 139, 1, 227, 98, 139, 1, - 227, 143, 139, 1, 235, 117, 139, 1, 234, 15, 139, 1, 222, 152, 139, 1, - 232, 168, 139, 1, 232, 17, 139, 1, 189, 139, 1, 223, 43, 139, 1, 233, 99, - 139, 1, 224, 216, 139, 1, 224, 140, 139, 1, 224, 225, 139, 1, 225, 44, - 139, 1, 235, 208, 139, 1, 236, 159, 139, 1, 231, 116, 139, 1, 231, 144, - 139, 1, 231, 255, 139, 1, 217, 214, 139, 1, 224, 170, 139, 1, 217, 182, - 139, 1, 184, 139, 1, 231, 147, 139, 1, 236, 157, 139, 1, 229, 145, 139, - 1, 232, 14, 139, 1, 231, 146, 139, 1, 228, 199, 139, 1, 218, 164, 139, 1, - 229, 191, 139, 1, 245, 226, 139, 1, 227, 22, 139, 1, 234, 231, 139, 1, - 233, 196, 139, 1, 232, 62, 139, 1, 227, 161, 139, 1, 227, 249, 139, 1, - 236, 168, 139, 1, 232, 86, 139, 1, 232, 100, 139, 1, 232, 115, 139, 1, - 224, 200, 139, 1, 228, 200, 139, 1, 245, 92, 139, 1, 245, 136, 139, 1, - 219, 7, 139, 1, 208, 139, 1, 235, 67, 139, 1, 229, 108, 139, 1, 234, 244, - 139, 1, 236, 57, 139, 1, 234, 33, 139, 1, 227, 187, 139, 1, 233, 251, - 139, 1, 196, 139, 1, 221, 205, 139, 1, 236, 113, 139, 1, 233, 136, 139, - 1, 234, 36, 139, 1, 222, 50, 139, 1, 236, 26, 139, 1, 222, 65, 139, 1, - 231, 145, 139, 1, 226, 147, 139, 1, 246, 4, 139, 1, 236, 28, 139, 1, 236, - 54, 139, 36, 164, 236, 36, 139, 36, 164, 220, 250, 139, 232, 16, 139, - 245, 90, 223, 136, 139, 250, 175, 139, 250, 168, 139, 225, 67, 139, 228, - 82, 78, 58, 1, 251, 21, 145, 217, 241, 229, 72, 58, 1, 251, 21, 145, 218, - 46, 229, 72, 58, 1, 251, 21, 145, 217, 241, 225, 8, 58, 1, 251, 21, 145, - 218, 46, 225, 8, 58, 1, 251, 21, 145, 217, 241, 228, 98, 58, 1, 251, 21, - 145, 218, 46, 228, 98, 58, 1, 251, 21, 145, 217, 241, 227, 22, 58, 1, - 251, 21, 145, 218, 46, 227, 22, 58, 1, 246, 85, 247, 143, 145, 135, 58, - 1, 116, 247, 143, 145, 135, 58, 1, 233, 194, 247, 143, 145, 135, 58, 1, - 109, 247, 143, 145, 135, 58, 1, 246, 84, 247, 143, 145, 135, 58, 1, 246, - 85, 247, 143, 235, 109, 145, 135, 58, 1, 116, 247, 143, 235, 109, 145, - 135, 58, 1, 233, 194, 247, 143, 235, 109, 145, 135, 58, 1, 109, 247, 143, - 235, 109, 145, 135, 58, 1, 246, 84, 247, 143, 235, 109, 145, 135, 58, 1, - 246, 85, 235, 109, 145, 135, 58, 1, 116, 235, 109, 145, 135, 58, 1, 233, - 194, 235, 109, 145, 135, 58, 1, 109, 235, 109, 145, 135, 58, 1, 246, 84, - 235, 109, 145, 135, 58, 1, 61, 69, 135, 58, 1, 61, 224, 55, 58, 1, 61, - 186, 135, 58, 1, 234, 237, 45, 250, 124, 254, 119, 58, 1, 227, 241, 108, - 65, 58, 1, 227, 241, 113, 65, 58, 1, 227, 241, 246, 95, 78, 58, 1, 227, - 241, 237, 170, 246, 95, 78, 58, 1, 109, 237, 170, 246, 95, 78, 58, 1, - 223, 125, 25, 116, 221, 132, 58, 1, 223, 125, 25, 109, 221, 132, 7, 6, 1, - 246, 241, 254, 168, 7, 3, 1, 246, 241, 254, 168, 7, 6, 1, 246, 241, 254, - 191, 7, 3, 1, 246, 241, 254, 191, 7, 6, 1, 243, 136, 7, 3, 1, 243, 136, - 7, 6, 1, 220, 189, 7, 3, 1, 220, 189, 7, 6, 1, 221, 94, 7, 3, 1, 221, 94, - 7, 6, 1, 250, 90, 7, 3, 1, 250, 90, 7, 6, 1, 250, 91, 2, 250, 168, 7, 3, - 1, 250, 91, 2, 250, 168, 7, 1, 3, 6, 246, 74, 7, 1, 3, 6, 198, 7, 6, 1, - 255, 58, 7, 3, 1, 255, 58, 7, 6, 1, 254, 93, 7, 3, 1, 254, 93, 7, 6, 1, - 253, 232, 7, 3, 1, 253, 232, 7, 6, 1, 253, 220, 7, 3, 1, 253, 220, 7, 6, - 1, 253, 221, 2, 186, 135, 7, 3, 1, 253, 221, 2, 186, 135, 7, 6, 1, 253, - 212, 7, 3, 1, 253, 212, 7, 6, 1, 210, 251, 203, 2, 248, 145, 7, 3, 1, - 210, 251, 203, 2, 248, 145, 7, 6, 1, 237, 18, 2, 92, 7, 3, 1, 237, 18, 2, - 92, 7, 6, 1, 237, 18, 2, 249, 11, 92, 7, 3, 1, 237, 18, 2, 249, 11, 92, - 7, 6, 1, 237, 18, 2, 214, 25, 249, 11, 92, 7, 3, 1, 237, 18, 2, 214, 25, - 249, 11, 92, 7, 6, 1, 252, 1, 153, 7, 3, 1, 252, 1, 153, 7, 6, 1, 235, - 202, 2, 116, 92, 7, 3, 1, 235, 202, 2, 116, 92, 7, 6, 1, 142, 2, 171, - 214, 230, 74, 7, 3, 1, 142, 2, 171, 214, 230, 74, 7, 6, 1, 142, 2, 234, - 247, 7, 3, 1, 142, 2, 234, 247, 7, 6, 1, 230, 127, 7, 3, 1, 230, 127, 7, - 6, 1, 230, 60, 2, 214, 221, 225, 249, 48, 7, 3, 1, 230, 60, 2, 214, 221, - 225, 249, 48, 7, 6, 1, 230, 60, 2, 245, 146, 7, 3, 1, 230, 60, 2, 245, - 146, 7, 6, 1, 230, 60, 2, 223, 222, 222, 135, 7, 3, 1, 230, 60, 2, 223, - 222, 222, 135, 7, 6, 1, 228, 164, 2, 214, 221, 225, 249, 48, 7, 3, 1, - 228, 164, 2, 214, 221, 225, 249, 48, 7, 6, 1, 228, 164, 2, 249, 11, 92, - 7, 3, 1, 228, 164, 2, 249, 11, 92, 7, 6, 1, 228, 39, 227, 58, 7, 3, 1, - 228, 39, 227, 58, 7, 6, 1, 227, 14, 227, 58, 7, 3, 1, 227, 14, 227, 58, - 7, 6, 1, 220, 11, 2, 249, 11, 92, 7, 3, 1, 220, 11, 2, 249, 11, 92, 7, 6, - 1, 219, 48, 7, 3, 1, 219, 48, 7, 6, 1, 219, 75, 217, 157, 7, 3, 1, 219, - 75, 217, 157, 7, 6, 1, 221, 235, 2, 92, 7, 3, 1, 221, 235, 2, 92, 7, 6, - 1, 221, 235, 2, 214, 221, 225, 249, 48, 7, 3, 1, 221, 235, 2, 214, 221, - 225, 249, 48, 7, 6, 1, 219, 157, 7, 3, 1, 219, 157, 7, 6, 1, 246, 123, 7, - 3, 1, 246, 123, 7, 6, 1, 237, 151, 7, 3, 1, 237, 151, 7, 6, 1, 250, 158, - 7, 3, 1, 250, 158, 58, 1, 220, 34, 7, 3, 1, 247, 102, 7, 3, 1, 234, 219, - 7, 3, 1, 233, 80, 7, 3, 1, 231, 109, 7, 3, 1, 227, 13, 7, 1, 3, 6, 227, - 13, 7, 3, 1, 220, 249, 7, 3, 1, 220, 94, 7, 6, 1, 237, 188, 250, 46, 7, - 3, 1, 237, 188, 250, 46, 7, 6, 1, 237, 188, 246, 74, 7, 3, 1, 237, 188, - 246, 74, 7, 6, 1, 237, 188, 245, 67, 7, 6, 1, 215, 237, 188, 245, 67, 7, - 3, 1, 215, 237, 188, 245, 67, 7, 6, 1, 215, 153, 7, 3, 1, 215, 153, 7, 6, - 1, 237, 188, 152, 7, 3, 1, 237, 188, 152, 7, 6, 1, 237, 188, 198, 7, 3, - 1, 237, 188, 198, 7, 6, 1, 237, 188, 222, 201, 7, 3, 1, 237, 188, 222, - 201, 58, 1, 109, 250, 217, 255, 0, 58, 1, 250, 175, 58, 1, 224, 192, 246, - 154, 55, 7, 6, 1, 226, 150, 7, 3, 1, 226, 150, 7, 246, 158, 1, 210, 246, - 74, 7, 246, 158, 1, 210, 230, 59, 7, 246, 158, 1, 237, 170, 189, 7, 246, - 158, 1, 242, 107, 234, 250, 7, 246, 158, 1, 254, 49, 189, 223, 19, 232, - 225, 1, 60, 223, 19, 232, 225, 1, 72, 223, 19, 232, 225, 5, 247, 84, 223, - 19, 232, 225, 1, 68, 223, 19, 232, 225, 1, 73, 223, 19, 232, 225, 1, 74, - 223, 19, 232, 225, 5, 243, 175, 223, 19, 232, 225, 1, 236, 57, 223, 19, - 232, 225, 1, 236, 125, 223, 19, 232, 225, 1, 244, 68, 223, 19, 232, 225, - 1, 244, 112, 223, 19, 232, 225, 5, 254, 95, 223, 19, 232, 225, 1, 250, - 182, 223, 19, 232, 225, 1, 251, 11, 223, 19, 232, 225, 1, 237, 59, 223, - 19, 232, 225, 1, 237, 99, 223, 19, 232, 225, 1, 221, 11, 223, 19, 232, - 225, 1, 221, 15, 223, 19, 232, 225, 1, 249, 107, 223, 19, 232, 225, 1, - 249, 115, 223, 19, 232, 225, 1, 101, 223, 19, 232, 225, 1, 221, 239, 223, - 19, 232, 225, 1, 248, 167, 223, 19, 232, 225, 1, 249, 19, 223, 19, 232, - 225, 1, 231, 204, 223, 19, 232, 225, 1, 229, 37, 223, 19, 232, 225, 1, - 229, 118, 223, 19, 232, 225, 1, 252, 41, 223, 19, 232, 225, 1, 252, 88, - 223, 19, 232, 225, 1, 233, 136, 223, 19, 232, 225, 1, 227, 75, 223, 19, - 232, 225, 1, 235, 12, 223, 19, 232, 225, 1, 227, 44, 223, 19, 232, 225, - 1, 224, 26, 223, 19, 232, 225, 1, 243, 4, 223, 19, 232, 225, 29, 5, 60, - 223, 19, 232, 225, 29, 5, 72, 223, 19, 232, 225, 29, 5, 68, 223, 19, 232, - 225, 29, 5, 73, 223, 19, 232, 225, 29, 5, 230, 127, 223, 19, 232, 225, - 229, 33, 234, 67, 223, 19, 232, 225, 229, 33, 234, 66, 223, 19, 232, 225, - 229, 33, 234, 65, 223, 19, 232, 225, 229, 33, 234, 64, 231, 187, 237, - 212, 245, 108, 131, 228, 89, 231, 187, 237, 212, 245, 108, 131, 243, 194, - 231, 187, 237, 212, 245, 108, 148, 228, 87, 231, 187, 237, 212, 245, 108, - 131, 224, 75, 231, 187, 237, 212, 245, 108, 131, 246, 231, 231, 187, 237, - 212, 245, 108, 148, 224, 74, 231, 187, 237, 212, 228, 90, 78, 231, 187, - 237, 212, 229, 56, 78, 231, 187, 237, 212, 227, 4, 78, 231, 187, 237, - 212, 228, 91, 78, 229, 138, 1, 175, 229, 138, 1, 236, 149, 229, 138, 1, - 245, 0, 229, 138, 1, 232, 115, 229, 138, 1, 251, 169, 229, 138, 1, 251, - 69, 229, 138, 1, 237, 123, 229, 138, 1, 231, 77, 229, 138, 1, 222, 155, - 229, 138, 1, 222, 35, 229, 138, 1, 249, 207, 229, 138, 1, 208, 229, 138, - 1, 187, 229, 138, 1, 229, 141, 229, 138, 1, 252, 237, 229, 138, 1, 196, - 229, 138, 1, 221, 55, 229, 138, 1, 221, 47, 229, 138, 1, 247, 74, 229, - 138, 1, 219, 7, 229, 138, 1, 217, 80, 229, 138, 1, 217, 114, 229, 138, 1, - 3, 60, 229, 138, 1, 184, 229, 138, 1, 203, 229, 138, 1, 235, 188, 229, - 138, 1, 225, 25, 229, 138, 1, 226, 177, 229, 138, 1, 155, 229, 138, 1, - 60, 229, 138, 1, 72, 229, 138, 1, 68, 229, 138, 1, 73, 229, 138, 1, 74, - 229, 138, 1, 228, 155, 229, 138, 1, 218, 138, 229, 138, 1, 246, 8, 229, - 138, 1, 244, 160, 229, 138, 1, 246, 250, 229, 138, 223, 97, 1, 219, 7, - 229, 138, 223, 97, 1, 184, 229, 138, 1, 221, 29, 229, 138, 1, 221, 19, - 229, 138, 1, 249, 132, 229, 138, 1, 231, 217, 229, 138, 1, 254, 144, 184, - 229, 138, 1, 219, 69, 225, 25, 229, 138, 1, 219, 70, 155, 229, 138, 1, - 254, 1, 246, 8, 229, 138, 223, 97, 1, 203, 229, 138, 223, 61, 1, 203, - 229, 138, 1, 251, 146, 229, 138, 224, 109, 243, 160, 78, 229, 138, 51, - 243, 160, 78, 229, 138, 164, 225, 18, 229, 138, 164, 51, 225, 18, 158, 5, - 254, 95, 158, 5, 219, 77, 158, 1, 60, 158, 1, 255, 58, 158, 1, 72, 158, - 1, 237, 255, 158, 1, 68, 158, 1, 220, 23, 158, 1, 167, 152, 158, 1, 167, - 227, 53, 158, 1, 167, 153, 158, 1, 167, 235, 18, 158, 1, 73, 158, 1, 246, - 250, 158, 1, 254, 196, 158, 1, 74, 158, 1, 230, 127, 158, 1, 253, 232, - 158, 1, 175, 158, 1, 236, 149, 158, 1, 245, 0, 158, 1, 244, 125, 158, 1, - 232, 115, 158, 1, 251, 169, 158, 1, 251, 69, 158, 1, 237, 123, 158, 1, - 237, 103, 158, 1, 231, 77, 158, 1, 221, 29, 158, 1, 221, 19, 158, 1, 249, - 132, 158, 1, 249, 116, 158, 1, 231, 217, 158, 1, 222, 155, 158, 1, 222, - 35, 158, 1, 249, 207, 158, 1, 249, 36, 158, 1, 208, 158, 1, 187, 158, 1, - 229, 141, 158, 1, 252, 237, 158, 1, 252, 94, 158, 1, 196, 158, 1, 184, - 158, 1, 203, 158, 1, 235, 188, 158, 1, 219, 189, 158, 1, 225, 25, 158, 1, - 223, 218, 158, 1, 226, 177, 158, 1, 155, 158, 1, 235, 17, 158, 250, 147, - 5, 243, 209, 158, 29, 5, 255, 58, 158, 29, 5, 72, 158, 29, 5, 237, 255, - 158, 29, 5, 68, 158, 29, 5, 220, 23, 158, 29, 5, 167, 152, 158, 29, 5, - 167, 227, 53, 158, 29, 5, 167, 153, 158, 29, 5, 167, 235, 18, 158, 29, 5, - 73, 158, 29, 5, 246, 250, 158, 29, 5, 254, 196, 158, 29, 5, 74, 158, 29, - 5, 230, 127, 158, 29, 5, 253, 232, 158, 5, 219, 82, 158, 249, 167, 158, - 51, 249, 167, 158, 20, 217, 84, 158, 20, 107, 158, 20, 103, 158, 20, 160, - 158, 20, 154, 158, 20, 174, 158, 20, 182, 158, 20, 191, 158, 20, 185, - 158, 20, 190, 36, 80, 20, 217, 84, 36, 80, 20, 107, 36, 80, 20, 103, 36, - 80, 20, 160, 36, 80, 20, 154, 36, 80, 20, 174, 36, 80, 20, 182, 36, 80, - 20, 191, 36, 80, 20, 185, 36, 80, 20, 190, 36, 80, 1, 60, 36, 80, 1, 68, - 36, 80, 1, 175, 36, 80, 1, 208, 36, 80, 1, 187, 36, 80, 1, 203, 36, 80, - 1, 219, 94, 36, 80, 5, 253, 219, 80, 5, 223, 253, 251, 146, 80, 5, 251, - 147, 219, 82, 80, 5, 51, 251, 147, 219, 82, 80, 5, 251, 147, 103, 80, 5, - 251, 147, 160, 80, 5, 251, 147, 253, 219, 80, 5, 228, 186, 80, 244, 224, - 245, 185, 80, 251, 134, 80, 243, 155, 236, 190, 235, 68, 20, 217, 84, - 236, 190, 235, 68, 20, 107, 236, 190, 235, 68, 20, 103, 236, 190, 235, - 68, 20, 160, 236, 190, 235, 68, 20, 154, 236, 190, 235, 68, 20, 174, 236, - 190, 235, 68, 20, 182, 236, 190, 235, 68, 20, 191, 236, 190, 235, 68, 20, - 185, 236, 190, 235, 68, 20, 190, 236, 190, 235, 68, 1, 175, 236, 190, - 235, 68, 1, 236, 149, 236, 190, 235, 68, 1, 245, 0, 236, 190, 235, 68, 1, - 232, 115, 236, 190, 235, 68, 1, 226, 177, 236, 190, 235, 68, 1, 225, 25, - 236, 190, 235, 68, 1, 217, 114, 236, 190, 235, 68, 1, 231, 77, 236, 190, - 235, 68, 1, 222, 155, 236, 190, 235, 68, 1, 242, 175, 236, 190, 235, 68, - 1, 208, 236, 190, 235, 68, 1, 187, 236, 190, 235, 68, 1, 229, 141, 236, - 190, 235, 68, 1, 196, 236, 190, 235, 68, 1, 249, 207, 236, 190, 235, 68, - 1, 252, 237, 236, 190, 235, 68, 1, 203, 236, 190, 235, 68, 1, 184, 236, - 190, 235, 68, 1, 235, 188, 236, 190, 235, 68, 1, 219, 7, 236, 190, 235, - 68, 1, 222, 35, 236, 190, 235, 68, 1, 155, 236, 190, 235, 68, 1, 219, - 189, 236, 190, 235, 68, 1, 251, 169, 236, 190, 235, 68, 1, 60, 236, 190, - 235, 68, 1, 230, 167, 236, 190, 235, 68, 1, 72, 236, 190, 235, 68, 1, - 230, 127, 236, 190, 235, 68, 29, 220, 110, 236, 190, 235, 68, 29, 73, - 236, 190, 235, 68, 29, 68, 236, 190, 235, 68, 29, 246, 250, 236, 190, - 235, 68, 29, 74, 236, 190, 235, 68, 145, 229, 48, 236, 190, 235, 68, 145, - 251, 157, 236, 190, 235, 68, 145, 251, 158, 229, 48, 236, 190, 235, 68, - 5, 250, 62, 236, 190, 235, 68, 5, 224, 148, 227, 194, 1, 175, 227, 194, - 1, 245, 0, 227, 194, 1, 232, 115, 227, 194, 1, 222, 155, 227, 194, 1, - 249, 207, 227, 194, 1, 208, 227, 194, 1, 187, 227, 194, 1, 252, 237, 227, - 194, 1, 196, 227, 194, 1, 251, 169, 227, 194, 1, 237, 123, 227, 194, 1, - 231, 77, 227, 194, 1, 226, 177, 227, 194, 1, 203, 227, 194, 1, 235, 188, - 227, 194, 1, 184, 227, 194, 1, 219, 7, 227, 194, 1, 155, 227, 194, 1, - 234, 37, 227, 194, 1, 232, 100, 227, 194, 1, 232, 169, 227, 194, 1, 231, - 57, 227, 194, 1, 60, 227, 194, 29, 5, 72, 227, 194, 29, 5, 68, 227, 194, - 29, 5, 73, 227, 194, 29, 5, 254, 196, 227, 194, 29, 5, 74, 227, 194, 29, - 5, 253, 232, 227, 194, 29, 5, 246, 115, 227, 194, 29, 5, 247, 16, 227, - 194, 250, 147, 5, 232, 117, 227, 194, 250, 147, 5, 207, 227, 194, 250, - 147, 5, 152, 227, 194, 250, 147, 5, 243, 225, 227, 194, 219, 82, 227, - 194, 226, 87, 78, 22, 91, 221, 188, 22, 91, 221, 187, 22, 91, 221, 185, - 22, 91, 221, 190, 22, 91, 227, 135, 22, 91, 227, 119, 22, 91, 227, 114, - 22, 91, 227, 116, 22, 91, 227, 132, 22, 91, 227, 125, 22, 91, 227, 118, - 22, 91, 227, 137, 22, 91, 227, 120, 22, 91, 227, 139, 22, 91, 227, 136, - 22, 91, 233, 183, 22, 91, 233, 174, 22, 91, 233, 177, 22, 91, 229, 84, - 22, 91, 229, 95, 22, 91, 229, 96, 22, 91, 223, 203, 22, 91, 238, 12, 22, - 91, 238, 19, 22, 91, 223, 214, 22, 91, 223, 201, 22, 91, 229, 126, 22, - 91, 243, 101, 22, 91, 223, 198, 133, 5, 229, 252, 133, 5, 251, 96, 133, - 5, 235, 130, 133, 5, 218, 197, 133, 1, 60, 133, 1, 242, 107, 236, 193, - 133, 1, 72, 133, 1, 237, 255, 133, 1, 68, 133, 1, 230, 44, 251, 73, 133, - 1, 232, 116, 235, 98, 133, 1, 232, 116, 235, 99, 227, 229, 133, 1, 73, - 133, 1, 254, 196, 133, 1, 74, 133, 1, 175, 133, 1, 206, 226, 128, 133, 1, - 206, 233, 67, 133, 1, 245, 0, 133, 1, 245, 1, 233, 67, 133, 1, 232, 115, - 133, 1, 251, 169, 133, 1, 251, 170, 233, 67, 133, 1, 237, 123, 133, 1, - 231, 78, 233, 67, 133, 1, 237, 124, 234, 103, 133, 1, 231, 77, 133, 1, - 221, 29, 133, 1, 221, 30, 234, 103, 133, 1, 249, 132, 133, 1, 249, 133, - 234, 103, 133, 1, 232, 238, 233, 67, 133, 1, 222, 155, 133, 1, 222, 156, - 233, 67, 133, 1, 249, 207, 133, 1, 249, 208, 234, 103, 133, 1, 208, 133, - 1, 187, 133, 1, 230, 44, 233, 67, 133, 1, 252, 237, 133, 1, 252, 238, - 233, 67, 133, 1, 196, 133, 1, 184, 133, 1, 203, 133, 1, 228, 3, 254, 203, - 133, 1, 235, 188, 133, 1, 219, 7, 133, 1, 226, 178, 233, 67, 133, 1, 226, - 178, 234, 103, 133, 1, 226, 177, 133, 1, 155, 133, 5, 251, 97, 222, 68, - 133, 29, 5, 222, 111, 133, 29, 5, 221, 135, 133, 29, 5, 218, 162, 133, - 29, 5, 218, 163, 234, 5, 133, 29, 5, 223, 77, 133, 29, 5, 223, 78, 233, - 250, 133, 29, 5, 222, 124, 133, 29, 5, 248, 207, 233, 66, 133, 29, 5, - 229, 171, 133, 250, 147, 5, 236, 161, 133, 250, 147, 5, 229, 179, 133, - 250, 147, 5, 251, 162, 133, 230, 6, 133, 42, 227, 176, 133, 45, 227, 176, - 133, 230, 36, 254, 125, 133, 230, 36, 234, 107, 133, 230, 36, 234, 223, - 133, 230, 36, 218, 193, 133, 230, 36, 230, 7, 133, 230, 36, 235, 35, 133, - 230, 36, 234, 217, 133, 230, 36, 254, 239, 133, 230, 36, 254, 240, 254, - 239, 133, 230, 36, 229, 65, 133, 215, 230, 36, 229, 65, 133, 230, 4, 133, - 20, 217, 84, 133, 20, 107, 133, 20, 103, 133, 20, 160, 133, 20, 154, 133, - 20, 174, 133, 20, 182, 133, 20, 191, 133, 20, 185, 133, 20, 190, 133, - 230, 36, 221, 163, 220, 248, 133, 230, 36, 237, 147, 149, 1, 60, 149, 1, - 72, 149, 1, 68, 149, 1, 73, 149, 1, 254, 196, 149, 1, 74, 149, 1, 175, - 149, 1, 236, 149, 149, 1, 245, 0, 149, 1, 244, 125, 149, 1, 232, 73, 149, - 1, 232, 115, 149, 1, 251, 69, 149, 1, 251, 33, 149, 1, 237, 123, 149, 1, - 237, 103, 149, 1, 232, 64, 149, 1, 232, 66, 149, 1, 232, 65, 149, 1, 222, - 155, 149, 1, 222, 35, 149, 1, 249, 207, 149, 1, 249, 36, 149, 1, 231, - 114, 149, 1, 208, 149, 1, 249, 132, 149, 1, 187, 149, 1, 229, 6, 149, 1, - 229, 141, 149, 1, 252, 237, 149, 1, 252, 94, 149, 1, 233, 94, 149, 1, - 196, 149, 1, 252, 178, 149, 1, 184, 149, 1, 203, 149, 1, 235, 188, 149, - 1, 219, 189, 149, 1, 223, 218, 149, 1, 226, 177, 149, 1, 155, 149, 29, 5, - 255, 58, 149, 29, 5, 72, 149, 29, 5, 237, 255, 149, 29, 5, 246, 237, 149, - 29, 5, 68, 149, 29, 5, 230, 167, 149, 29, 5, 74, 149, 29, 5, 254, 196, - 149, 29, 5, 253, 232, 149, 29, 5, 220, 110, 149, 250, 147, 5, 184, 149, - 250, 147, 5, 203, 149, 250, 147, 5, 235, 188, 149, 250, 147, 5, 219, 7, - 149, 1, 39, 237, 17, 149, 1, 39, 245, 67, 149, 1, 39, 232, 117, 149, 250, - 147, 5, 39, 232, 117, 149, 1, 39, 251, 70, 149, 1, 39, 222, 201, 149, 1, - 39, 207, 149, 1, 39, 230, 59, 149, 1, 39, 218, 90, 149, 1, 39, 152, 149, - 1, 39, 153, 149, 1, 39, 223, 219, 149, 250, 147, 5, 39, 189, 149, 250, - 147, 5, 39, 243, 225, 149, 20, 217, 84, 149, 20, 107, 149, 20, 103, 149, - 20, 160, 149, 20, 154, 149, 20, 174, 149, 20, 182, 149, 20, 191, 149, 20, - 185, 149, 20, 190, 149, 228, 197, 223, 242, 149, 228, 197, 249, 167, 149, - 228, 197, 51, 249, 167, 149, 228, 197, 221, 78, 249, 167, 63, 1, 236, - 143, 245, 0, 63, 1, 236, 143, 251, 169, 63, 1, 236, 143, 251, 69, 63, 1, - 236, 143, 237, 123, 63, 1, 236, 143, 237, 103, 63, 1, 236, 143, 231, 77, - 63, 1, 236, 143, 221, 29, 63, 1, 236, 143, 221, 19, 63, 1, 236, 143, 249, - 132, 63, 1, 236, 143, 249, 116, 63, 1, 236, 143, 249, 36, 63, 1, 236, - 143, 208, 63, 1, 236, 143, 226, 177, 63, 1, 236, 143, 155, 63, 1, 236, - 143, 243, 121, 63, 1, 236, 143, 246, 8, 63, 58, 1, 236, 143, 227, 201, - 63, 1, 236, 143, 218, 138, 63, 1, 236, 143, 217, 114, 63, 1, 236, 143, - 203, 63, 235, 6, 236, 143, 230, 182, 63, 235, 6, 236, 143, 228, 111, 63, - 235, 6, 236, 143, 243, 57, 63, 16, 254, 186, 246, 94, 63, 16, 254, 186, - 107, 63, 16, 254, 186, 103, 63, 1, 254, 186, 203, 63, 5, 229, 248, 236, - 213, 221, 132, 37, 177, 1, 109, 236, 57, 37, 177, 1, 116, 236, 57, 37, - 177, 1, 109, 236, 125, 37, 177, 1, 116, 236, 125, 37, 177, 1, 109, 236, - 132, 37, 177, 1, 116, 236, 132, 37, 177, 1, 109, 244, 68, 37, 177, 1, - 116, 244, 68, 37, 177, 1, 109, 232, 84, 37, 177, 1, 116, 232, 84, 37, - 177, 1, 109, 250, 182, 37, 177, 1, 116, 250, 182, 37, 177, 1, 109, 251, - 11, 37, 177, 1, 116, 251, 11, 37, 177, 1, 109, 224, 26, 37, 177, 1, 116, - 224, 26, 37, 177, 1, 109, 231, 56, 37, 177, 1, 116, 231, 56, 37, 177, 1, - 109, 248, 167, 37, 177, 1, 116, 248, 167, 37, 177, 1, 109, 101, 37, 177, - 1, 116, 101, 37, 177, 1, 109, 221, 239, 37, 177, 1, 116, 221, 239, 37, - 177, 1, 109, 231, 204, 37, 177, 1, 116, 231, 204, 37, 177, 1, 109, 252, - 41, 37, 177, 1, 116, 252, 41, 37, 177, 1, 109, 229, 37, 37, 177, 1, 116, - 229, 37, 37, 177, 1, 109, 229, 118, 37, 177, 1, 116, 229, 118, 37, 177, - 1, 109, 245, 139, 37, 177, 1, 116, 245, 139, 37, 177, 1, 109, 233, 136, - 37, 177, 1, 116, 233, 136, 37, 177, 1, 109, 217, 231, 37, 177, 1, 116, - 217, 231, 37, 177, 1, 109, 227, 75, 37, 177, 1, 116, 227, 75, 37, 177, 1, - 109, 235, 12, 37, 177, 1, 116, 235, 12, 37, 177, 1, 109, 219, 72, 37, - 177, 1, 116, 219, 72, 37, 177, 1, 109, 243, 4, 37, 177, 1, 116, 243, 4, - 37, 177, 1, 109, 74, 37, 177, 1, 116, 74, 37, 177, 234, 100, 236, 229, - 37, 177, 29, 255, 58, 37, 177, 29, 72, 37, 177, 29, 220, 110, 37, 177, - 29, 68, 37, 177, 29, 73, 37, 177, 29, 74, 37, 177, 234, 100, 236, 127, - 37, 177, 29, 242, 72, 37, 177, 29, 220, 109, 37, 177, 29, 220, 123, 37, - 177, 29, 253, 231, 37, 177, 29, 253, 212, 37, 177, 29, 254, 131, 37, 177, - 29, 254, 140, 37, 177, 145, 234, 100, 246, 223, 37, 177, 145, 234, 100, - 231, 113, 37, 177, 145, 234, 100, 221, 239, 37, 177, 145, 234, 100, 224, - 15, 37, 177, 16, 236, 44, 37, 177, 16, 231, 113, 37, 177, 16, 226, 148, - 37, 177, 16, 243, 5, 243, 1, 37, 177, 16, 236, 52, 236, 51, 234, 11, 234, - 43, 1, 236, 49, 234, 11, 234, 43, 1, 226, 148, 234, 11, 234, 43, 1, 235, - 167, 234, 11, 234, 43, 1, 233, 145, 234, 11, 234, 43, 1, 187, 234, 11, - 234, 43, 1, 208, 234, 11, 234, 43, 1, 251, 25, 234, 11, 234, 43, 1, 221, - 181, 234, 11, 234, 43, 1, 236, 121, 234, 11, 234, 43, 1, 232, 76, 234, - 11, 234, 43, 1, 221, 233, 234, 11, 234, 43, 1, 219, 2, 234, 11, 234, 43, - 1, 218, 45, 234, 11, 234, 43, 1, 242, 167, 234, 11, 234, 43, 1, 220, 87, - 234, 11, 234, 43, 1, 72, 234, 11, 234, 43, 1, 229, 136, 234, 11, 234, 43, - 1, 253, 241, 234, 11, 234, 43, 1, 244, 63, 234, 11, 234, 43, 1, 237, 102, - 234, 11, 234, 43, 1, 227, 246, 234, 11, 234, 43, 1, 252, 237, 234, 11, - 234, 43, 1, 237, 91, 234, 11, 234, 43, 1, 248, 232, 234, 11, 234, 43, 1, - 244, 110, 234, 11, 234, 43, 1, 249, 17, 234, 11, 234, 43, 1, 252, 93, - 234, 11, 234, 43, 1, 236, 50, 234, 249, 234, 11, 234, 43, 1, 235, 168, - 234, 249, 234, 11, 234, 43, 1, 233, 146, 234, 249, 234, 11, 234, 43, 1, - 230, 44, 234, 249, 234, 11, 234, 43, 1, 232, 238, 234, 249, 234, 11, 234, - 43, 1, 221, 182, 234, 249, 234, 11, 234, 43, 1, 232, 77, 234, 249, 234, - 11, 234, 43, 1, 242, 107, 234, 249, 234, 11, 234, 43, 29, 5, 230, 137, - 234, 11, 234, 43, 29, 5, 237, 221, 234, 11, 234, 43, 29, 5, 254, 130, - 234, 11, 234, 43, 29, 5, 218, 18, 234, 11, 234, 43, 29, 5, 224, 10, 234, - 11, 234, 43, 29, 5, 220, 85, 234, 11, 234, 43, 29, 5, 251, 40, 234, 11, - 234, 43, 29, 5, 231, 100, 234, 11, 234, 43, 251, 41, 234, 11, 234, 43, - 234, 220, 237, 131, 234, 11, 234, 43, 254, 70, 237, 131, 234, 11, 234, - 43, 20, 217, 84, 234, 11, 234, 43, 20, 107, 234, 11, 234, 43, 20, 103, - 234, 11, 234, 43, 20, 160, 234, 11, 234, 43, 20, 154, 234, 11, 234, 43, - 20, 174, 234, 11, 234, 43, 20, 182, 234, 11, 234, 43, 20, 191, 234, 11, - 234, 43, 20, 185, 234, 11, 234, 43, 20, 190, 22, 122, 231, 6, 22, 122, - 231, 11, 22, 122, 217, 230, 22, 122, 217, 229, 22, 122, 217, 228, 22, - 122, 220, 173, 22, 122, 220, 176, 22, 122, 217, 198, 22, 122, 217, 194, - 22, 122, 246, 114, 22, 122, 246, 112, 22, 122, 246, 113, 22, 122, 246, - 110, 22, 122, 242, 97, 22, 122, 242, 96, 22, 122, 242, 94, 22, 122, 242, - 95, 22, 122, 242, 100, 22, 122, 242, 93, 22, 122, 242, 92, 22, 122, 242, - 102, 22, 122, 254, 59, 22, 122, 254, 58, 22, 85, 232, 48, 22, 85, 232, - 54, 22, 85, 223, 200, 22, 85, 223, 199, 22, 85, 221, 187, 22, 85, 221, - 185, 22, 85, 221, 184, 22, 85, 221, 190, 22, 85, 221, 191, 22, 85, 221, - 183, 22, 85, 227, 119, 22, 85, 227, 134, 22, 85, 223, 206, 22, 85, 227, - 131, 22, 85, 227, 121, 22, 85, 227, 123, 22, 85, 227, 110, 22, 85, 227, - 111, 22, 85, 236, 217, 22, 85, 233, 182, 22, 85, 233, 176, 22, 85, 223, - 210, 22, 85, 233, 179, 22, 85, 233, 185, 22, 85, 229, 80, 22, 85, 229, - 89, 22, 85, 229, 93, 22, 85, 223, 208, 22, 85, 229, 83, 22, 85, 229, 97, - 22, 85, 229, 98, 22, 85, 224, 96, 22, 85, 224, 99, 22, 85, 223, 204, 22, - 85, 223, 202, 22, 85, 224, 94, 22, 85, 224, 102, 22, 85, 224, 103, 22, - 85, 224, 88, 22, 85, 224, 101, 22, 85, 229, 255, 22, 85, 230, 0, 22, 85, - 218, 4, 22, 85, 218, 5, 22, 85, 250, 228, 22, 85, 250, 227, 22, 85, 223, - 215, 22, 85, 229, 124, 22, 85, 229, 123, 9, 13, 239, 244, 9, 13, 239, - 243, 9, 13, 239, 242, 9, 13, 239, 241, 9, 13, 239, 240, 9, 13, 239, 239, - 9, 13, 239, 238, 9, 13, 239, 237, 9, 13, 239, 236, 9, 13, 239, 235, 9, - 13, 239, 234, 9, 13, 239, 233, 9, 13, 239, 232, 9, 13, 239, 231, 9, 13, - 239, 230, 9, 13, 239, 229, 9, 13, 239, 228, 9, 13, 239, 227, 9, 13, 239, - 226, 9, 13, 239, 225, 9, 13, 239, 224, 9, 13, 239, 223, 9, 13, 239, 222, - 9, 13, 239, 221, 9, 13, 239, 220, 9, 13, 239, 219, 9, 13, 239, 218, 9, - 13, 239, 217, 9, 13, 239, 216, 9, 13, 239, 215, 9, 13, 239, 214, 9, 13, - 239, 213, 9, 13, 239, 212, 9, 13, 239, 211, 9, 13, 239, 210, 9, 13, 239, - 209, 9, 13, 239, 208, 9, 13, 239, 207, 9, 13, 239, 206, 9, 13, 239, 205, - 9, 13, 239, 204, 9, 13, 239, 203, 9, 13, 239, 202, 9, 13, 239, 201, 9, - 13, 239, 200, 9, 13, 239, 199, 9, 13, 239, 198, 9, 13, 239, 197, 9, 13, - 239, 196, 9, 13, 239, 195, 9, 13, 239, 194, 9, 13, 239, 193, 9, 13, 239, - 192, 9, 13, 239, 191, 9, 13, 239, 190, 9, 13, 239, 189, 9, 13, 239, 188, - 9, 13, 239, 187, 9, 13, 239, 186, 9, 13, 239, 185, 9, 13, 239, 184, 9, - 13, 239, 183, 9, 13, 239, 182, 9, 13, 239, 181, 9, 13, 239, 180, 9, 13, - 239, 179, 9, 13, 239, 178, 9, 13, 239, 177, 9, 13, 239, 176, 9, 13, 239, - 175, 9, 13, 239, 174, 9, 13, 239, 173, 9, 13, 239, 172, 9, 13, 239, 171, - 9, 13, 239, 170, 9, 13, 239, 169, 9, 13, 239, 168, 9, 13, 239, 167, 9, - 13, 239, 166, 9, 13, 239, 165, 9, 13, 239, 164, 9, 13, 239, 163, 9, 13, - 239, 162, 9, 13, 239, 161, 9, 13, 239, 160, 9, 13, 239, 159, 9, 13, 239, - 158, 9, 13, 239, 157, 9, 13, 239, 156, 9, 13, 239, 155, 9, 13, 239, 154, - 9, 13, 239, 153, 9, 13, 239, 152, 9, 13, 239, 151, 9, 13, 239, 150, 9, - 13, 239, 149, 9, 13, 239, 148, 9, 13, 239, 147, 9, 13, 239, 146, 9, 13, - 239, 145, 9, 13, 239, 144, 9, 13, 239, 143, 9, 13, 239, 142, 9, 13, 239, - 141, 9, 13, 239, 140, 9, 13, 239, 139, 9, 13, 239, 138, 9, 13, 239, 137, - 9, 13, 239, 136, 9, 13, 239, 135, 9, 13, 239, 134, 9, 13, 239, 133, 9, - 13, 239, 132, 9, 13, 239, 131, 9, 13, 239, 130, 9, 13, 239, 129, 9, 13, - 239, 128, 9, 13, 239, 127, 9, 13, 239, 126, 9, 13, 239, 125, 9, 13, 239, - 124, 9, 13, 239, 123, 9, 13, 239, 122, 9, 13, 239, 121, 9, 13, 239, 120, - 9, 13, 239, 119, 9, 13, 239, 118, 9, 13, 239, 117, 9, 13, 239, 116, 9, - 13, 239, 115, 9, 13, 239, 114, 9, 13, 239, 113, 9, 13, 239, 112, 9, 13, - 239, 111, 9, 13, 239, 110, 9, 13, 239, 109, 9, 13, 239, 108, 9, 13, 239, - 107, 9, 13, 239, 106, 9, 13, 239, 105, 9, 13, 239, 104, 9, 13, 239, 103, - 9, 13, 239, 102, 9, 13, 239, 101, 9, 13, 239, 100, 9, 13, 239, 99, 9, 13, - 239, 98, 9, 13, 239, 97, 9, 13, 239, 96, 9, 13, 239, 95, 9, 13, 239, 94, - 9, 13, 239, 93, 9, 13, 239, 92, 9, 13, 239, 91, 9, 13, 239, 90, 9, 13, - 239, 89, 9, 13, 239, 88, 9, 13, 239, 87, 9, 13, 239, 86, 9, 13, 239, 85, - 9, 13, 239, 84, 9, 13, 239, 83, 9, 13, 239, 82, 9, 13, 239, 81, 9, 13, - 239, 80, 9, 13, 239, 79, 9, 13, 239, 78, 9, 13, 239, 77, 9, 13, 239, 76, - 9, 13, 239, 75, 9, 13, 239, 74, 9, 13, 239, 73, 9, 13, 239, 72, 9, 13, - 239, 71, 9, 13, 239, 70, 9, 13, 239, 69, 9, 13, 239, 68, 9, 13, 239, 67, - 9, 13, 239, 66, 9, 13, 239, 65, 9, 13, 239, 64, 9, 13, 239, 63, 9, 13, - 239, 62, 9, 13, 239, 61, 9, 13, 239, 60, 9, 13, 239, 59, 9, 13, 239, 58, - 9, 13, 239, 57, 9, 13, 239, 56, 9, 13, 239, 55, 9, 13, 239, 54, 9, 13, - 239, 53, 9, 13, 239, 52, 9, 13, 239, 51, 9, 13, 239, 50, 9, 13, 239, 49, - 9, 13, 239, 48, 9, 13, 239, 47, 9, 13, 239, 46, 9, 13, 239, 45, 9, 13, - 239, 44, 9, 13, 239, 43, 9, 13, 239, 42, 9, 13, 239, 41, 9, 13, 239, 40, - 9, 13, 239, 39, 9, 13, 239, 38, 9, 13, 239, 37, 9, 13, 239, 36, 9, 13, - 239, 35, 9, 13, 239, 34, 9, 13, 239, 33, 9, 13, 239, 32, 9, 13, 239, 31, - 9, 13, 239, 30, 9, 13, 239, 29, 9, 13, 239, 28, 9, 13, 239, 27, 9, 13, - 239, 26, 9, 13, 239, 25, 9, 13, 239, 24, 9, 13, 239, 23, 9, 13, 239, 22, - 9, 13, 239, 21, 9, 13, 239, 20, 9, 13, 239, 19, 9, 13, 239, 18, 9, 13, - 239, 17, 9, 13, 239, 16, 9, 13, 239, 15, 9, 13, 239, 14, 9, 13, 239, 13, - 9, 13, 239, 12, 9, 13, 239, 11, 9, 13, 239, 10, 9, 13, 239, 9, 9, 13, - 239, 8, 9, 13, 239, 7, 9, 13, 239, 6, 9, 13, 239, 5, 9, 13, 239, 4, 9, - 13, 239, 3, 9, 13, 239, 2, 9, 13, 239, 1, 9, 13, 239, 0, 9, 13, 238, 255, - 9, 13, 238, 254, 9, 13, 238, 253, 9, 13, 238, 252, 9, 13, 238, 251, 9, - 13, 238, 250, 9, 13, 238, 249, 9, 13, 238, 248, 9, 13, 238, 247, 9, 13, - 238, 246, 9, 13, 238, 245, 9, 13, 238, 244, 9, 13, 238, 243, 9, 13, 238, - 242, 9, 13, 238, 241, 9, 13, 238, 240, 9, 13, 238, 239, 9, 13, 238, 238, - 9, 13, 238, 237, 9, 13, 238, 236, 9, 13, 238, 235, 9, 13, 238, 234, 9, - 13, 238, 233, 9, 13, 238, 232, 9, 13, 238, 231, 9, 13, 238, 230, 9, 13, - 238, 229, 9, 13, 238, 228, 9, 13, 238, 227, 9, 13, 238, 226, 9, 13, 238, - 225, 9, 13, 238, 224, 9, 13, 238, 223, 9, 13, 238, 222, 9, 13, 238, 221, - 9, 13, 238, 220, 9, 13, 238, 219, 9, 13, 238, 218, 9, 13, 238, 217, 9, - 13, 238, 216, 9, 13, 238, 215, 9, 13, 238, 214, 9, 13, 238, 213, 9, 13, - 238, 212, 9, 13, 238, 211, 9, 13, 238, 210, 9, 13, 238, 209, 9, 13, 238, - 208, 9, 13, 238, 207, 9, 13, 238, 206, 9, 13, 238, 205, 9, 13, 238, 204, - 9, 13, 238, 203, 9, 13, 238, 202, 9, 13, 238, 201, 9, 13, 238, 200, 9, - 13, 238, 199, 9, 13, 238, 198, 9, 13, 238, 197, 9, 13, 238, 196, 9, 13, - 238, 195, 9, 13, 238, 194, 9, 13, 238, 193, 9, 13, 238, 192, 9, 13, 238, - 191, 9, 13, 238, 190, 9, 13, 238, 189, 9, 13, 238, 188, 9, 13, 238, 187, - 9, 13, 238, 186, 9, 13, 238, 185, 9, 13, 238, 184, 9, 13, 238, 183, 9, - 13, 238, 182, 9, 13, 238, 181, 9, 13, 238, 180, 9, 13, 238, 179, 9, 13, - 238, 178, 9, 13, 238, 177, 9, 13, 238, 176, 9, 13, 238, 175, 9, 13, 238, - 174, 9, 13, 238, 173, 9, 13, 238, 172, 9, 13, 238, 171, 9, 13, 238, 170, - 9, 13, 238, 169, 9, 13, 238, 168, 9, 13, 238, 167, 9, 13, 238, 166, 9, - 13, 238, 165, 9, 13, 238, 164, 9, 13, 238, 163, 9, 13, 238, 162, 9, 13, - 238, 161, 9, 13, 238, 160, 9, 13, 238, 159, 9, 13, 238, 158, 9, 13, 238, - 157, 9, 13, 238, 156, 9, 13, 238, 155, 9, 13, 238, 154, 9, 13, 238, 153, - 9, 13, 238, 152, 9, 13, 238, 151, 9, 13, 238, 150, 9, 13, 238, 149, 9, - 13, 238, 148, 9, 13, 238, 147, 9, 13, 238, 146, 9, 13, 238, 145, 9, 13, - 238, 144, 9, 13, 238, 143, 9, 13, 238, 142, 9, 13, 238, 141, 9, 13, 238, - 140, 9, 13, 238, 139, 9, 13, 238, 138, 9, 13, 238, 137, 9, 13, 238, 136, - 9, 13, 238, 135, 9, 13, 238, 134, 9, 13, 238, 133, 9, 13, 238, 132, 9, - 13, 238, 131, 9, 13, 238, 130, 9, 13, 238, 129, 9, 13, 238, 128, 9, 13, - 238, 127, 9, 13, 238, 126, 9, 13, 238, 125, 9, 13, 238, 124, 9, 13, 238, - 123, 9, 13, 238, 122, 9, 13, 238, 121, 9, 13, 238, 120, 9, 13, 238, 119, - 9, 13, 238, 118, 9, 13, 238, 117, 9, 13, 238, 116, 9, 13, 238, 115, 9, - 13, 238, 114, 9, 13, 238, 113, 9, 13, 238, 112, 9, 13, 238, 111, 9, 13, - 238, 110, 9, 13, 238, 109, 9, 13, 238, 108, 9, 13, 238, 107, 9, 13, 238, - 106, 9, 13, 238, 105, 9, 13, 238, 104, 9, 13, 238, 103, 9, 13, 238, 102, - 9, 13, 238, 101, 9, 13, 238, 100, 9, 13, 238, 99, 9, 13, 238, 98, 9, 13, - 238, 97, 9, 13, 238, 96, 9, 13, 238, 95, 9, 13, 238, 94, 9, 13, 238, 93, - 9, 13, 238, 92, 9, 13, 238, 91, 9, 13, 238, 90, 9, 13, 238, 89, 9, 13, - 238, 88, 9, 13, 238, 87, 9, 13, 238, 86, 9, 13, 238, 85, 9, 13, 238, 84, - 9, 13, 238, 83, 9, 13, 238, 82, 9, 13, 238, 81, 9, 13, 238, 80, 9, 13, - 238, 79, 9, 13, 238, 78, 9, 13, 238, 77, 9, 13, 238, 76, 9, 13, 238, 75, - 9, 13, 238, 74, 9, 13, 238, 73, 9, 13, 238, 72, 9, 13, 238, 71, 9, 13, - 238, 70, 9, 13, 238, 69, 9, 13, 238, 68, 9, 13, 238, 67, 9, 13, 238, 66, - 9, 13, 238, 65, 9, 13, 238, 64, 9, 13, 238, 63, 9, 13, 238, 62, 9, 13, - 238, 61, 9, 13, 238, 60, 9, 13, 238, 59, 9, 13, 238, 58, 9, 13, 238, 57, - 9, 13, 238, 56, 9, 13, 238, 55, 9, 13, 238, 54, 9, 13, 238, 53, 9, 13, - 238, 52, 9, 13, 238, 51, 9, 13, 238, 50, 9, 13, 238, 49, 9, 13, 238, 48, - 9, 13, 238, 47, 9, 13, 238, 46, 9, 13, 238, 45, 9, 13, 238, 44, 9, 13, - 238, 43, 9, 13, 238, 42, 9, 13, 238, 41, 9, 13, 238, 40, 9, 13, 238, 39, - 9, 13, 238, 38, 9, 13, 238, 37, 9, 13, 238, 36, 9, 13, 238, 35, 9, 13, - 238, 34, 9, 13, 238, 33, 9, 13, 238, 32, 9, 13, 238, 31, 7, 3, 24, 245, - 207, 7, 3, 24, 245, 203, 7, 3, 24, 245, 166, 7, 3, 24, 245, 206, 7, 3, - 24, 245, 205, 7, 3, 24, 171, 226, 235, 222, 201, 7, 3, 24, 223, 168, 132, - 3, 24, 233, 252, 231, 174, 132, 3, 24, 233, 252, 246, 254, 132, 3, 24, - 233, 252, 237, 200, 132, 3, 24, 219, 97, 231, 174, 132, 3, 24, 233, 252, - 218, 133, 87, 1, 217, 221, 2, 243, 94, 87, 229, 32, 237, 42, 219, 176, - 87, 24, 217, 248, 217, 221, 217, 221, 229, 214, 87, 1, 254, 142, 253, - 207, 87, 1, 218, 201, 254, 168, 87, 1, 218, 201, 249, 177, 87, 1, 218, - 201, 243, 162, 87, 1, 218, 201, 236, 246, 87, 1, 218, 201, 235, 152, 87, - 1, 218, 201, 39, 234, 1, 87, 1, 218, 201, 227, 174, 87, 1, 218, 201, 222, - 102, 87, 1, 254, 142, 88, 55, 87, 1, 224, 210, 2, 224, 210, 248, 145, 87, - 1, 224, 210, 2, 224, 113, 248, 145, 87, 1, 224, 210, 2, 249, 194, 25, - 224, 210, 248, 145, 87, 1, 224, 210, 2, 249, 194, 25, 224, 113, 248, 145, - 87, 1, 99, 2, 229, 214, 87, 1, 99, 2, 228, 143, 87, 1, 99, 2, 234, 77, - 87, 1, 252, 105, 2, 249, 193, 87, 1, 244, 92, 2, 249, 193, 87, 1, 249, - 178, 2, 249, 193, 87, 1, 243, 163, 2, 234, 77, 87, 1, 219, 170, 2, 249, - 193, 87, 1, 217, 96, 2, 249, 193, 87, 1, 222, 51, 2, 249, 193, 87, 1, - 217, 221, 2, 249, 193, 87, 1, 39, 236, 247, 2, 249, 193, 87, 1, 236, 247, - 2, 249, 193, 87, 1, 235, 153, 2, 249, 193, 87, 1, 234, 2, 2, 249, 193, - 87, 1, 231, 104, 2, 249, 193, 87, 1, 226, 146, 2, 249, 193, 87, 1, 39, - 229, 199, 2, 249, 193, 87, 1, 229, 199, 2, 249, 193, 87, 1, 221, 52, 2, - 249, 193, 87, 1, 228, 108, 2, 249, 193, 87, 1, 227, 175, 2, 249, 193, 87, - 1, 224, 210, 2, 249, 193, 87, 1, 222, 103, 2, 249, 193, 87, 1, 219, 170, - 2, 242, 254, 87, 1, 252, 105, 2, 227, 248, 87, 1, 236, 247, 2, 227, 248, - 87, 1, 229, 199, 2, 227, 248, 87, 24, 99, 235, 152, 12, 1, 99, 218, 247, - 47, 17, 12, 1, 99, 218, 247, 39, 17, 12, 1, 252, 136, 47, 17, 12, 1, 252, - 136, 39, 17, 12, 1, 252, 136, 66, 17, 12, 1, 252, 136, 128, 17, 12, 1, - 229, 188, 47, 17, 12, 1, 229, 188, 39, 17, 12, 1, 229, 188, 66, 17, 12, - 1, 229, 188, 128, 17, 12, 1, 252, 127, 47, 17, 12, 1, 252, 127, 39, 17, - 12, 1, 252, 127, 66, 17, 12, 1, 252, 127, 128, 17, 12, 1, 221, 22, 47, - 17, 12, 1, 221, 22, 39, 17, 12, 1, 221, 22, 66, 17, 12, 1, 221, 22, 128, - 17, 12, 1, 222, 76, 47, 17, 12, 1, 222, 76, 39, 17, 12, 1, 222, 76, 66, - 17, 12, 1, 222, 76, 128, 17, 12, 1, 221, 24, 47, 17, 12, 1, 221, 24, 39, - 17, 12, 1, 221, 24, 66, 17, 12, 1, 221, 24, 128, 17, 12, 1, 219, 159, 47, - 17, 12, 1, 219, 159, 39, 17, 12, 1, 219, 159, 66, 17, 12, 1, 219, 159, - 128, 17, 12, 1, 229, 186, 47, 17, 12, 1, 229, 186, 39, 17, 12, 1, 229, - 186, 66, 17, 12, 1, 229, 186, 128, 17, 12, 1, 247, 80, 47, 17, 12, 1, - 247, 80, 39, 17, 12, 1, 247, 80, 66, 17, 12, 1, 247, 80, 128, 17, 12, 1, - 231, 71, 47, 17, 12, 1, 231, 71, 39, 17, 12, 1, 231, 71, 66, 17, 12, 1, - 231, 71, 128, 17, 12, 1, 222, 92, 47, 17, 12, 1, 222, 92, 39, 17, 12, 1, - 222, 92, 66, 17, 12, 1, 222, 92, 128, 17, 12, 1, 222, 90, 47, 17, 12, 1, - 222, 90, 39, 17, 12, 1, 222, 90, 66, 17, 12, 1, 222, 90, 128, 17, 12, 1, - 249, 130, 47, 17, 12, 1, 249, 130, 39, 17, 12, 1, 249, 190, 47, 17, 12, - 1, 249, 190, 39, 17, 12, 1, 247, 104, 47, 17, 12, 1, 247, 104, 39, 17, - 12, 1, 249, 128, 47, 17, 12, 1, 249, 128, 39, 17, 12, 1, 237, 110, 47, - 17, 12, 1, 237, 110, 39, 17, 12, 1, 227, 49, 47, 17, 12, 1, 227, 49, 39, - 17, 12, 1, 236, 177, 47, 17, 12, 1, 236, 177, 39, 17, 12, 1, 236, 177, - 66, 17, 12, 1, 236, 177, 128, 17, 12, 1, 244, 244, 47, 17, 12, 1, 244, - 244, 39, 17, 12, 1, 244, 244, 66, 17, 12, 1, 244, 244, 128, 17, 12, 1, - 244, 10, 47, 17, 12, 1, 244, 10, 39, 17, 12, 1, 244, 10, 66, 17, 12, 1, - 244, 10, 128, 17, 12, 1, 232, 83, 47, 17, 12, 1, 232, 83, 39, 17, 12, 1, - 232, 83, 66, 17, 12, 1, 232, 83, 128, 17, 12, 1, 231, 194, 244, 108, 47, - 17, 12, 1, 231, 194, 244, 108, 39, 17, 12, 1, 227, 79, 47, 17, 12, 1, - 227, 79, 39, 17, 12, 1, 227, 79, 66, 17, 12, 1, 227, 79, 128, 17, 12, 1, - 243, 147, 2, 70, 71, 47, 17, 12, 1, 243, 147, 2, 70, 71, 39, 17, 12, 1, - 243, 147, 244, 66, 47, 17, 12, 1, 243, 147, 244, 66, 39, 17, 12, 1, 243, - 147, 244, 66, 66, 17, 12, 1, 243, 147, 244, 66, 128, 17, 12, 1, 243, 147, - 248, 164, 47, 17, 12, 1, 243, 147, 248, 164, 39, 17, 12, 1, 243, 147, - 248, 164, 66, 17, 12, 1, 243, 147, 248, 164, 128, 17, 12, 1, 70, 252, - 195, 47, 17, 12, 1, 70, 252, 195, 39, 17, 12, 1, 70, 252, 195, 2, 181, - 71, 47, 17, 12, 1, 70, 252, 195, 2, 181, 71, 39, 17, 12, 1, 232, 118, 47, - 17, 12, 1, 232, 118, 39, 17, 12, 1, 232, 118, 66, 17, 12, 1, 232, 118, - 128, 17, 12, 1, 105, 47, 17, 12, 1, 105, 39, 17, 12, 1, 230, 168, 47, 17, - 12, 1, 230, 168, 39, 17, 12, 1, 217, 201, 47, 17, 12, 1, 217, 201, 39, - 17, 12, 1, 105, 2, 181, 71, 47, 17, 12, 1, 219, 166, 47, 17, 12, 1, 219, - 166, 39, 17, 12, 1, 236, 98, 230, 168, 47, 17, 12, 1, 236, 98, 230, 168, - 39, 17, 12, 1, 236, 98, 217, 201, 47, 17, 12, 1, 236, 98, 217, 201, 39, - 17, 12, 1, 178, 47, 17, 12, 1, 178, 39, 17, 12, 1, 178, 66, 17, 12, 1, - 178, 128, 17, 12, 1, 220, 104, 236, 188, 236, 98, 99, 197, 66, 17, 12, 1, - 220, 104, 236, 188, 236, 98, 99, 197, 128, 17, 12, 24, 70, 2, 181, 71, 2, - 99, 47, 17, 12, 24, 70, 2, 181, 71, 2, 99, 39, 17, 12, 24, 70, 2, 181, - 71, 2, 254, 235, 47, 17, 12, 24, 70, 2, 181, 71, 2, 254, 235, 39, 17, 12, - 24, 70, 2, 181, 71, 2, 218, 234, 47, 17, 12, 24, 70, 2, 181, 71, 2, 218, - 234, 39, 17, 12, 24, 70, 2, 181, 71, 2, 105, 47, 17, 12, 24, 70, 2, 181, - 71, 2, 105, 39, 17, 12, 24, 70, 2, 181, 71, 2, 230, 168, 47, 17, 12, 24, - 70, 2, 181, 71, 2, 230, 168, 39, 17, 12, 24, 70, 2, 181, 71, 2, 217, 201, - 47, 17, 12, 24, 70, 2, 181, 71, 2, 217, 201, 39, 17, 12, 24, 70, 2, 181, - 71, 2, 178, 47, 17, 12, 24, 70, 2, 181, 71, 2, 178, 39, 17, 12, 24, 70, - 2, 181, 71, 2, 178, 66, 17, 12, 24, 220, 104, 236, 98, 70, 2, 181, 71, 2, - 99, 197, 47, 17, 12, 24, 220, 104, 236, 98, 70, 2, 181, 71, 2, 99, 197, - 39, 17, 12, 24, 220, 104, 236, 98, 70, 2, 181, 71, 2, 99, 197, 66, 17, - 12, 1, 245, 241, 70, 47, 17, 12, 1, 245, 241, 70, 39, 17, 12, 1, 245, - 241, 70, 66, 17, 12, 1, 245, 241, 70, 128, 17, 12, 24, 70, 2, 181, 71, 2, - 134, 47, 17, 12, 24, 70, 2, 181, 71, 2, 111, 47, 17, 12, 24, 70, 2, 181, - 71, 2, 62, 47, 17, 12, 24, 70, 2, 181, 71, 2, 99, 197, 47, 17, 12, 24, - 70, 2, 181, 71, 2, 70, 47, 17, 12, 24, 252, 129, 2, 134, 47, 17, 12, 24, - 252, 129, 2, 111, 47, 17, 12, 24, 252, 129, 2, 236, 147, 47, 17, 12, 24, - 252, 129, 2, 62, 47, 17, 12, 24, 252, 129, 2, 99, 197, 47, 17, 12, 24, - 252, 129, 2, 70, 47, 17, 12, 24, 222, 78, 2, 134, 47, 17, 12, 24, 222, - 78, 2, 111, 47, 17, 12, 24, 222, 78, 2, 236, 147, 47, 17, 12, 24, 222, - 78, 2, 62, 47, 17, 12, 24, 222, 78, 2, 99, 197, 47, 17, 12, 24, 222, 78, - 2, 70, 47, 17, 12, 24, 222, 20, 2, 134, 47, 17, 12, 24, 222, 20, 2, 62, - 47, 17, 12, 24, 222, 20, 2, 99, 197, 47, 17, 12, 24, 222, 20, 2, 70, 47, - 17, 12, 24, 134, 2, 111, 47, 17, 12, 24, 134, 2, 62, 47, 17, 12, 24, 111, - 2, 134, 47, 17, 12, 24, 111, 2, 62, 47, 17, 12, 24, 236, 147, 2, 134, 47, - 17, 12, 24, 236, 147, 2, 111, 47, 17, 12, 24, 236, 147, 2, 62, 47, 17, - 12, 24, 226, 83, 2, 134, 47, 17, 12, 24, 226, 83, 2, 111, 47, 17, 12, 24, - 226, 83, 2, 236, 147, 47, 17, 12, 24, 226, 83, 2, 62, 47, 17, 12, 24, - 226, 171, 2, 111, 47, 17, 12, 24, 226, 171, 2, 62, 47, 17, 12, 24, 249, - 203, 2, 134, 47, 17, 12, 24, 249, 203, 2, 111, 47, 17, 12, 24, 249, 203, - 2, 236, 147, 47, 17, 12, 24, 249, 203, 2, 62, 47, 17, 12, 24, 222, 138, - 2, 111, 47, 17, 12, 24, 222, 138, 2, 62, 47, 17, 12, 24, 217, 110, 2, 62, - 47, 17, 12, 24, 254, 192, 2, 134, 47, 17, 12, 24, 254, 192, 2, 62, 47, - 17, 12, 24, 244, 123, 2, 134, 47, 17, 12, 24, 244, 123, 2, 62, 47, 17, - 12, 24, 245, 222, 2, 134, 47, 17, 12, 24, 245, 222, 2, 111, 47, 17, 12, - 24, 245, 222, 2, 236, 147, 47, 17, 12, 24, 245, 222, 2, 62, 47, 17, 12, - 24, 245, 222, 2, 99, 197, 47, 17, 12, 24, 245, 222, 2, 70, 47, 17, 12, - 24, 228, 149, 2, 111, 47, 17, 12, 24, 228, 149, 2, 62, 47, 17, 12, 24, - 228, 149, 2, 99, 197, 47, 17, 12, 24, 228, 149, 2, 70, 47, 17, 12, 24, - 236, 247, 2, 99, 47, 17, 12, 24, 236, 247, 2, 134, 47, 17, 12, 24, 236, - 247, 2, 111, 47, 17, 12, 24, 236, 247, 2, 236, 147, 47, 17, 12, 24, 236, - 247, 2, 235, 161, 47, 17, 12, 24, 236, 247, 2, 62, 47, 17, 12, 24, 236, - 247, 2, 99, 197, 47, 17, 12, 24, 236, 247, 2, 70, 47, 17, 12, 24, 235, - 161, 2, 134, 47, 17, 12, 24, 235, 161, 2, 111, 47, 17, 12, 24, 235, 161, - 2, 236, 147, 47, 17, 12, 24, 235, 161, 2, 62, 47, 17, 12, 24, 235, 161, - 2, 99, 197, 47, 17, 12, 24, 235, 161, 2, 70, 47, 17, 12, 24, 62, 2, 134, - 47, 17, 12, 24, 62, 2, 111, 47, 17, 12, 24, 62, 2, 236, 147, 47, 17, 12, - 24, 62, 2, 62, 47, 17, 12, 24, 62, 2, 99, 197, 47, 17, 12, 24, 62, 2, 70, - 47, 17, 12, 24, 231, 194, 2, 134, 47, 17, 12, 24, 231, 194, 2, 111, 47, - 17, 12, 24, 231, 194, 2, 236, 147, 47, 17, 12, 24, 231, 194, 2, 62, 47, - 17, 12, 24, 231, 194, 2, 99, 197, 47, 17, 12, 24, 231, 194, 2, 70, 47, - 17, 12, 24, 243, 147, 2, 134, 47, 17, 12, 24, 243, 147, 2, 62, 47, 17, - 12, 24, 243, 147, 2, 99, 197, 47, 17, 12, 24, 243, 147, 2, 70, 47, 17, - 12, 24, 70, 2, 134, 47, 17, 12, 24, 70, 2, 111, 47, 17, 12, 24, 70, 2, - 236, 147, 47, 17, 12, 24, 70, 2, 62, 47, 17, 12, 24, 70, 2, 99, 197, 47, - 17, 12, 24, 70, 2, 70, 47, 17, 12, 24, 222, 30, 2, 223, 59, 99, 47, 17, - 12, 24, 227, 197, 2, 223, 59, 99, 47, 17, 12, 24, 99, 197, 2, 223, 59, - 99, 47, 17, 12, 24, 225, 17, 2, 249, 171, 47, 17, 12, 24, 225, 17, 2, - 236, 205, 47, 17, 12, 24, 225, 17, 2, 245, 239, 47, 17, 12, 24, 225, 17, - 2, 249, 173, 47, 17, 12, 24, 225, 17, 2, 236, 207, 47, 17, 12, 24, 225, - 17, 2, 223, 59, 99, 47, 17, 12, 24, 70, 2, 181, 71, 2, 227, 197, 39, 17, - 12, 24, 70, 2, 181, 71, 2, 217, 107, 39, 17, 12, 24, 70, 2, 181, 71, 2, - 62, 39, 17, 12, 24, 70, 2, 181, 71, 2, 231, 194, 39, 17, 12, 24, 70, 2, - 181, 71, 2, 99, 197, 39, 17, 12, 24, 70, 2, 181, 71, 2, 70, 39, 17, 12, - 24, 252, 129, 2, 227, 197, 39, 17, 12, 24, 252, 129, 2, 217, 107, 39, 17, - 12, 24, 252, 129, 2, 62, 39, 17, 12, 24, 252, 129, 2, 231, 194, 39, 17, - 12, 24, 252, 129, 2, 99, 197, 39, 17, 12, 24, 252, 129, 2, 70, 39, 17, - 12, 24, 222, 78, 2, 227, 197, 39, 17, 12, 24, 222, 78, 2, 217, 107, 39, - 17, 12, 24, 222, 78, 2, 62, 39, 17, 12, 24, 222, 78, 2, 231, 194, 39, 17, - 12, 24, 222, 78, 2, 99, 197, 39, 17, 12, 24, 222, 78, 2, 70, 39, 17, 12, - 24, 222, 20, 2, 227, 197, 39, 17, 12, 24, 222, 20, 2, 217, 107, 39, 17, - 12, 24, 222, 20, 2, 62, 39, 17, 12, 24, 222, 20, 2, 231, 194, 39, 17, 12, - 24, 222, 20, 2, 99, 197, 39, 17, 12, 24, 222, 20, 2, 70, 39, 17, 12, 24, - 245, 222, 2, 99, 197, 39, 17, 12, 24, 245, 222, 2, 70, 39, 17, 12, 24, - 228, 149, 2, 99, 197, 39, 17, 12, 24, 228, 149, 2, 70, 39, 17, 12, 24, - 236, 247, 2, 99, 39, 17, 12, 24, 236, 247, 2, 235, 161, 39, 17, 12, 24, - 236, 247, 2, 62, 39, 17, 12, 24, 236, 247, 2, 99, 197, 39, 17, 12, 24, - 236, 247, 2, 70, 39, 17, 12, 24, 235, 161, 2, 62, 39, 17, 12, 24, 235, - 161, 2, 99, 197, 39, 17, 12, 24, 235, 161, 2, 70, 39, 17, 12, 24, 62, 2, - 99, 39, 17, 12, 24, 62, 2, 62, 39, 17, 12, 24, 231, 194, 2, 227, 197, 39, - 17, 12, 24, 231, 194, 2, 217, 107, 39, 17, 12, 24, 231, 194, 2, 62, 39, - 17, 12, 24, 231, 194, 2, 231, 194, 39, 17, 12, 24, 231, 194, 2, 99, 197, - 39, 17, 12, 24, 231, 194, 2, 70, 39, 17, 12, 24, 99, 197, 2, 223, 59, 99, - 39, 17, 12, 24, 70, 2, 227, 197, 39, 17, 12, 24, 70, 2, 217, 107, 39, 17, - 12, 24, 70, 2, 62, 39, 17, 12, 24, 70, 2, 231, 194, 39, 17, 12, 24, 70, - 2, 99, 197, 39, 17, 12, 24, 70, 2, 70, 39, 17, 12, 24, 70, 2, 181, 71, 2, - 134, 66, 17, 12, 24, 70, 2, 181, 71, 2, 111, 66, 17, 12, 24, 70, 2, 181, - 71, 2, 236, 147, 66, 17, 12, 24, 70, 2, 181, 71, 2, 62, 66, 17, 12, 24, - 70, 2, 181, 71, 2, 243, 147, 66, 17, 12, 24, 252, 129, 2, 134, 66, 17, - 12, 24, 252, 129, 2, 111, 66, 17, 12, 24, 252, 129, 2, 236, 147, 66, 17, - 12, 24, 252, 129, 2, 62, 66, 17, 12, 24, 252, 129, 2, 243, 147, 66, 17, - 12, 24, 222, 78, 2, 134, 66, 17, 12, 24, 222, 78, 2, 111, 66, 17, 12, 24, - 222, 78, 2, 236, 147, 66, 17, 12, 24, 222, 78, 2, 62, 66, 17, 12, 24, - 222, 78, 2, 243, 147, 66, 17, 12, 24, 222, 20, 2, 62, 66, 17, 12, 24, - 134, 2, 111, 66, 17, 12, 24, 134, 2, 62, 66, 17, 12, 24, 111, 2, 134, 66, - 17, 12, 24, 111, 2, 62, 66, 17, 12, 24, 236, 147, 2, 134, 66, 17, 12, 24, - 236, 147, 2, 62, 66, 17, 12, 24, 226, 83, 2, 134, 66, 17, 12, 24, 226, - 83, 2, 111, 66, 17, 12, 24, 226, 83, 2, 236, 147, 66, 17, 12, 24, 226, - 83, 2, 62, 66, 17, 12, 24, 226, 171, 2, 111, 66, 17, 12, 24, 226, 171, 2, - 236, 147, 66, 17, 12, 24, 226, 171, 2, 62, 66, 17, 12, 24, 249, 203, 2, - 134, 66, 17, 12, 24, 249, 203, 2, 111, 66, 17, 12, 24, 249, 203, 2, 236, - 147, 66, 17, 12, 24, 249, 203, 2, 62, 66, 17, 12, 24, 222, 138, 2, 111, - 66, 17, 12, 24, 217, 110, 2, 62, 66, 17, 12, 24, 254, 192, 2, 134, 66, - 17, 12, 24, 254, 192, 2, 62, 66, 17, 12, 24, 244, 123, 2, 134, 66, 17, - 12, 24, 244, 123, 2, 62, 66, 17, 12, 24, 245, 222, 2, 134, 66, 17, 12, - 24, 245, 222, 2, 111, 66, 17, 12, 24, 245, 222, 2, 236, 147, 66, 17, 12, - 24, 245, 222, 2, 62, 66, 17, 12, 24, 228, 149, 2, 111, 66, 17, 12, 24, - 228, 149, 2, 62, 66, 17, 12, 24, 236, 247, 2, 134, 66, 17, 12, 24, 236, - 247, 2, 111, 66, 17, 12, 24, 236, 247, 2, 236, 147, 66, 17, 12, 24, 236, - 247, 2, 235, 161, 66, 17, 12, 24, 236, 247, 2, 62, 66, 17, 12, 24, 235, - 161, 2, 134, 66, 17, 12, 24, 235, 161, 2, 111, 66, 17, 12, 24, 235, 161, - 2, 236, 147, 66, 17, 12, 24, 235, 161, 2, 62, 66, 17, 12, 24, 235, 161, - 2, 243, 147, 66, 17, 12, 24, 62, 2, 134, 66, 17, 12, 24, 62, 2, 111, 66, - 17, 12, 24, 62, 2, 236, 147, 66, 17, 12, 24, 62, 2, 62, 66, 17, 12, 24, - 231, 194, 2, 134, 66, 17, 12, 24, 231, 194, 2, 111, 66, 17, 12, 24, 231, - 194, 2, 236, 147, 66, 17, 12, 24, 231, 194, 2, 62, 66, 17, 12, 24, 231, - 194, 2, 243, 147, 66, 17, 12, 24, 243, 147, 2, 134, 66, 17, 12, 24, 243, - 147, 2, 62, 66, 17, 12, 24, 243, 147, 2, 223, 59, 99, 66, 17, 12, 24, 70, - 2, 134, 66, 17, 12, 24, 70, 2, 111, 66, 17, 12, 24, 70, 2, 236, 147, 66, - 17, 12, 24, 70, 2, 62, 66, 17, 12, 24, 70, 2, 243, 147, 66, 17, 12, 24, - 70, 2, 181, 71, 2, 62, 128, 17, 12, 24, 70, 2, 181, 71, 2, 243, 147, 128, - 17, 12, 24, 252, 129, 2, 62, 128, 17, 12, 24, 252, 129, 2, 243, 147, 128, - 17, 12, 24, 222, 78, 2, 62, 128, 17, 12, 24, 222, 78, 2, 243, 147, 128, - 17, 12, 24, 222, 20, 2, 62, 128, 17, 12, 24, 222, 20, 2, 243, 147, 128, - 17, 12, 24, 226, 83, 2, 62, 128, 17, 12, 24, 226, 83, 2, 243, 147, 128, - 17, 12, 24, 224, 243, 2, 62, 128, 17, 12, 24, 224, 243, 2, 243, 147, 128, - 17, 12, 24, 236, 247, 2, 235, 161, 128, 17, 12, 24, 236, 247, 2, 62, 128, - 17, 12, 24, 235, 161, 2, 62, 128, 17, 12, 24, 231, 194, 2, 62, 128, 17, - 12, 24, 231, 194, 2, 243, 147, 128, 17, 12, 24, 70, 2, 62, 128, 17, 12, - 24, 70, 2, 243, 147, 128, 17, 12, 24, 225, 17, 2, 245, 239, 128, 17, 12, - 24, 225, 17, 2, 249, 173, 128, 17, 12, 24, 225, 17, 2, 236, 207, 128, 17, - 12, 24, 222, 138, 2, 99, 197, 47, 17, 12, 24, 222, 138, 2, 70, 47, 17, - 12, 24, 254, 192, 2, 99, 197, 47, 17, 12, 24, 254, 192, 2, 70, 47, 17, - 12, 24, 244, 123, 2, 99, 197, 47, 17, 12, 24, 244, 123, 2, 70, 47, 17, - 12, 24, 226, 83, 2, 99, 197, 47, 17, 12, 24, 226, 83, 2, 70, 47, 17, 12, - 24, 224, 243, 2, 99, 197, 47, 17, 12, 24, 224, 243, 2, 70, 47, 17, 12, - 24, 111, 2, 99, 197, 47, 17, 12, 24, 111, 2, 70, 47, 17, 12, 24, 134, 2, - 99, 197, 47, 17, 12, 24, 134, 2, 70, 47, 17, 12, 24, 236, 147, 2, 99, - 197, 47, 17, 12, 24, 236, 147, 2, 70, 47, 17, 12, 24, 226, 171, 2, 99, - 197, 47, 17, 12, 24, 226, 171, 2, 70, 47, 17, 12, 24, 249, 203, 2, 99, - 197, 47, 17, 12, 24, 249, 203, 2, 70, 47, 17, 12, 24, 224, 243, 2, 134, - 47, 17, 12, 24, 224, 243, 2, 111, 47, 17, 12, 24, 224, 243, 2, 236, 147, - 47, 17, 12, 24, 224, 243, 2, 62, 47, 17, 12, 24, 224, 243, 2, 227, 197, - 47, 17, 12, 24, 226, 83, 2, 227, 197, 47, 17, 12, 24, 226, 171, 2, 227, - 197, 47, 17, 12, 24, 249, 203, 2, 227, 197, 47, 17, 12, 24, 222, 138, 2, - 99, 197, 39, 17, 12, 24, 222, 138, 2, 70, 39, 17, 12, 24, 254, 192, 2, - 99, 197, 39, 17, 12, 24, 254, 192, 2, 70, 39, 17, 12, 24, 244, 123, 2, - 99, 197, 39, 17, 12, 24, 244, 123, 2, 70, 39, 17, 12, 24, 226, 83, 2, 99, - 197, 39, 17, 12, 24, 226, 83, 2, 70, 39, 17, 12, 24, 224, 243, 2, 99, - 197, 39, 17, 12, 24, 224, 243, 2, 70, 39, 17, 12, 24, 111, 2, 99, 197, - 39, 17, 12, 24, 111, 2, 70, 39, 17, 12, 24, 134, 2, 99, 197, 39, 17, 12, - 24, 134, 2, 70, 39, 17, 12, 24, 236, 147, 2, 99, 197, 39, 17, 12, 24, - 236, 147, 2, 70, 39, 17, 12, 24, 226, 171, 2, 99, 197, 39, 17, 12, 24, - 226, 171, 2, 70, 39, 17, 12, 24, 249, 203, 2, 99, 197, 39, 17, 12, 24, - 249, 203, 2, 70, 39, 17, 12, 24, 224, 243, 2, 134, 39, 17, 12, 24, 224, - 243, 2, 111, 39, 17, 12, 24, 224, 243, 2, 236, 147, 39, 17, 12, 24, 224, - 243, 2, 62, 39, 17, 12, 24, 224, 243, 2, 227, 197, 39, 17, 12, 24, 226, - 83, 2, 227, 197, 39, 17, 12, 24, 226, 171, 2, 227, 197, 39, 17, 12, 24, - 249, 203, 2, 227, 197, 39, 17, 12, 24, 224, 243, 2, 134, 66, 17, 12, 24, - 224, 243, 2, 111, 66, 17, 12, 24, 224, 243, 2, 236, 147, 66, 17, 12, 24, - 224, 243, 2, 62, 66, 17, 12, 24, 226, 83, 2, 243, 147, 66, 17, 12, 24, - 224, 243, 2, 243, 147, 66, 17, 12, 24, 222, 138, 2, 62, 66, 17, 12, 24, - 226, 83, 2, 134, 128, 17, 12, 24, 226, 83, 2, 111, 128, 17, 12, 24, 226, - 83, 2, 236, 147, 128, 17, 12, 24, 224, 243, 2, 134, 128, 17, 12, 24, 224, - 243, 2, 111, 128, 17, 12, 24, 224, 243, 2, 236, 147, 128, 17, 12, 24, - 222, 138, 2, 62, 128, 17, 12, 24, 217, 110, 2, 62, 128, 17, 12, 24, 99, - 2, 245, 237, 39, 17, 12, 24, 99, 2, 245, 237, 47, 17, 230, 97, 42, 229, - 229, 230, 97, 45, 229, 229, 12, 24, 222, 78, 2, 134, 2, 62, 66, 17, 12, - 24, 222, 78, 2, 111, 2, 134, 39, 17, 12, 24, 222, 78, 2, 111, 2, 134, 66, - 17, 12, 24, 222, 78, 2, 111, 2, 62, 66, 17, 12, 24, 222, 78, 2, 236, 147, - 2, 62, 66, 17, 12, 24, 222, 78, 2, 62, 2, 134, 66, 17, 12, 24, 222, 78, - 2, 62, 2, 111, 66, 17, 12, 24, 222, 78, 2, 62, 2, 236, 147, 66, 17, 12, - 24, 134, 2, 62, 2, 111, 39, 17, 12, 24, 134, 2, 62, 2, 111, 66, 17, 12, - 24, 111, 2, 62, 2, 70, 39, 17, 12, 24, 111, 2, 62, 2, 99, 197, 39, 17, - 12, 24, 226, 83, 2, 111, 2, 134, 66, 17, 12, 24, 226, 83, 2, 134, 2, 111, - 66, 17, 12, 24, 226, 83, 2, 134, 2, 99, 197, 39, 17, 12, 24, 226, 83, 2, - 62, 2, 111, 39, 17, 12, 24, 226, 83, 2, 62, 2, 111, 66, 17, 12, 24, 226, - 83, 2, 62, 2, 134, 66, 17, 12, 24, 226, 83, 2, 62, 2, 62, 39, 17, 12, 24, - 226, 83, 2, 62, 2, 62, 66, 17, 12, 24, 226, 171, 2, 111, 2, 111, 39, 17, - 12, 24, 226, 171, 2, 111, 2, 111, 66, 17, 12, 24, 226, 171, 2, 62, 2, 62, - 39, 17, 12, 24, 224, 243, 2, 111, 2, 62, 39, 17, 12, 24, 224, 243, 2, - 111, 2, 62, 66, 17, 12, 24, 224, 243, 2, 134, 2, 70, 39, 17, 12, 24, 224, - 243, 2, 62, 2, 236, 147, 39, 17, 12, 24, 224, 243, 2, 62, 2, 236, 147, - 66, 17, 12, 24, 224, 243, 2, 62, 2, 62, 39, 17, 12, 24, 224, 243, 2, 62, - 2, 62, 66, 17, 12, 24, 249, 203, 2, 111, 2, 99, 197, 39, 17, 12, 24, 249, - 203, 2, 236, 147, 2, 62, 39, 17, 12, 24, 249, 203, 2, 236, 147, 2, 62, - 66, 17, 12, 24, 222, 138, 2, 62, 2, 111, 39, 17, 12, 24, 222, 138, 2, 62, - 2, 111, 66, 17, 12, 24, 222, 138, 2, 62, 2, 62, 66, 17, 12, 24, 222, 138, - 2, 62, 2, 70, 39, 17, 12, 24, 254, 192, 2, 134, 2, 62, 39, 17, 12, 24, - 254, 192, 2, 62, 2, 62, 39, 17, 12, 24, 254, 192, 2, 62, 2, 62, 66, 17, - 12, 24, 254, 192, 2, 62, 2, 99, 197, 39, 17, 12, 24, 244, 123, 2, 62, 2, - 62, 39, 17, 12, 24, 244, 123, 2, 62, 2, 70, 39, 17, 12, 24, 244, 123, 2, - 62, 2, 99, 197, 39, 17, 12, 24, 245, 222, 2, 236, 147, 2, 62, 39, 17, 12, - 24, 245, 222, 2, 236, 147, 2, 62, 66, 17, 12, 24, 228, 149, 2, 62, 2, - 111, 39, 17, 12, 24, 228, 149, 2, 62, 2, 62, 39, 17, 12, 24, 235, 161, 2, - 111, 2, 62, 39, 17, 12, 24, 235, 161, 2, 111, 2, 70, 39, 17, 12, 24, 235, - 161, 2, 111, 2, 99, 197, 39, 17, 12, 24, 235, 161, 2, 134, 2, 134, 66, - 17, 12, 24, 235, 161, 2, 134, 2, 134, 39, 17, 12, 24, 235, 161, 2, 236, - 147, 2, 62, 39, 17, 12, 24, 235, 161, 2, 236, 147, 2, 62, 66, 17, 12, 24, - 235, 161, 2, 62, 2, 111, 39, 17, 12, 24, 235, 161, 2, 62, 2, 111, 66, 17, - 12, 24, 62, 2, 111, 2, 134, 66, 17, 12, 24, 62, 2, 111, 2, 62, 66, 17, - 12, 24, 62, 2, 111, 2, 70, 39, 17, 12, 24, 62, 2, 134, 2, 111, 66, 17, - 12, 24, 62, 2, 134, 2, 62, 66, 17, 12, 24, 62, 2, 236, 147, 2, 134, 66, - 17, 12, 24, 62, 2, 236, 147, 2, 62, 66, 17, 12, 24, 62, 2, 134, 2, 236, - 147, 66, 17, 12, 24, 243, 147, 2, 62, 2, 134, 66, 17, 12, 24, 243, 147, - 2, 62, 2, 62, 66, 17, 12, 24, 231, 194, 2, 111, 2, 62, 66, 17, 12, 24, - 231, 194, 2, 111, 2, 99, 197, 39, 17, 12, 24, 231, 194, 2, 134, 2, 62, - 39, 17, 12, 24, 231, 194, 2, 134, 2, 62, 66, 17, 12, 24, 231, 194, 2, - 134, 2, 99, 197, 39, 17, 12, 24, 231, 194, 2, 62, 2, 70, 39, 17, 12, 24, - 231, 194, 2, 62, 2, 99, 197, 39, 17, 12, 24, 70, 2, 62, 2, 62, 39, 17, - 12, 24, 70, 2, 62, 2, 62, 66, 17, 12, 24, 252, 129, 2, 236, 147, 2, 70, - 39, 17, 12, 24, 222, 78, 2, 134, 2, 70, 39, 17, 12, 24, 222, 78, 2, 134, - 2, 99, 197, 39, 17, 12, 24, 222, 78, 2, 236, 147, 2, 70, 39, 17, 12, 24, - 222, 78, 2, 236, 147, 2, 99, 197, 39, 17, 12, 24, 222, 78, 2, 62, 2, 70, - 39, 17, 12, 24, 222, 78, 2, 62, 2, 99, 197, 39, 17, 12, 24, 134, 2, 62, - 2, 70, 39, 17, 12, 24, 134, 2, 111, 2, 99, 197, 39, 17, 12, 24, 134, 2, - 62, 2, 99, 197, 39, 17, 12, 24, 226, 83, 2, 236, 147, 2, 99, 197, 39, 17, - 12, 24, 226, 171, 2, 111, 2, 70, 39, 17, 12, 24, 224, 243, 2, 111, 2, 70, - 39, 17, 12, 24, 249, 203, 2, 111, 2, 70, 39, 17, 12, 24, 235, 161, 2, - 134, 2, 70, 39, 17, 12, 24, 235, 161, 2, 62, 2, 70, 39, 17, 12, 24, 70, - 2, 111, 2, 70, 39, 17, 12, 24, 70, 2, 134, 2, 70, 39, 17, 12, 24, 70, 2, - 62, 2, 70, 39, 17, 12, 24, 62, 2, 62, 2, 70, 39, 17, 12, 24, 228, 149, 2, - 62, 2, 70, 39, 17, 12, 24, 231, 194, 2, 111, 2, 70, 39, 17, 12, 24, 228, - 149, 2, 62, 2, 111, 66, 17, 12, 24, 235, 161, 2, 111, 2, 62, 66, 17, 12, - 24, 254, 192, 2, 62, 2, 70, 39, 17, 12, 24, 236, 247, 2, 62, 2, 70, 39, - 17, 12, 24, 231, 194, 2, 134, 2, 111, 66, 17, 12, 24, 62, 2, 236, 147, 2, - 70, 39, 17, 12, 24, 235, 161, 2, 134, 2, 62, 66, 17, 12, 24, 236, 247, 2, - 62, 2, 62, 39, 17, 12, 24, 235, 161, 2, 134, 2, 62, 39, 17, 12, 24, 231, - 194, 2, 134, 2, 111, 39, 17, 12, 24, 134, 2, 111, 2, 70, 39, 17, 12, 24, - 111, 2, 134, 2, 70, 39, 17, 12, 24, 62, 2, 134, 2, 70, 39, 17, 12, 24, - 245, 222, 2, 62, 2, 70, 39, 17, 12, 24, 252, 129, 2, 111, 2, 70, 39, 17, - 12, 24, 236, 247, 2, 62, 2, 62, 66, 17, 12, 24, 254, 192, 2, 134, 2, 62, - 66, 17, 12, 24, 226, 171, 2, 62, 2, 62, 66, 17, 12, 24, 226, 83, 2, 236, - 147, 2, 70, 39, 17, 12, 24, 231, 194, 2, 134, 2, 70, 39, 17, 12, 24, 226, - 153, 220, 32, 254, 14, 236, 35, 223, 137, 5, 47, 17, 12, 24, 228, 145, - 220, 32, 254, 14, 236, 35, 223, 137, 5, 47, 17, 12, 24, 254, 156, 47, 17, - 12, 24, 254, 179, 47, 17, 12, 24, 233, 130, 47, 17, 12, 24, 226, 154, 47, - 17, 12, 24, 227, 230, 47, 17, 12, 24, 254, 170, 47, 17, 12, 24, 218, 249, - 47, 17, 12, 24, 226, 153, 47, 17, 12, 24, 226, 152, 254, 170, 218, 248, - 12, 24, 237, 120, 227, 146, 55, 12, 24, 252, 61, 254, 65, 254, 66, 41, - 226, 73, 41, 225, 218, 41, 225, 150, 41, 225, 139, 41, 225, 128, 41, 225, - 117, 41, 225, 106, 41, 225, 95, 41, 225, 84, 41, 226, 72, 41, 226, 61, - 41, 226, 50, 41, 226, 39, 41, 226, 28, 41, 226, 17, 41, 226, 6, 228, 238, - 245, 124, 35, 69, 250, 168, 228, 238, 245, 124, 35, 69, 98, 250, 168, - 228, 238, 245, 124, 35, 69, 98, 245, 90, 223, 136, 228, 238, 245, 124, - 35, 69, 250, 175, 228, 238, 245, 124, 35, 69, 225, 67, 228, 238, 245, - 124, 35, 69, 246, 95, 78, 228, 238, 245, 124, 35, 69, 228, 82, 78, 228, - 238, 245, 124, 35, 69, 42, 67, 235, 91, 115, 228, 238, 245, 124, 35, 69, - 45, 67, 235, 91, 252, 16, 228, 238, 245, 124, 35, 69, 186, 246, 208, 36, - 24, 42, 243, 194, 36, 24, 45, 243, 194, 36, 51, 221, 180, 42, 243, 194, - 36, 51, 221, 180, 45, 243, 194, 36, 234, 116, 42, 243, 194, 36, 234, 116, - 45, 243, 194, 36, 250, 151, 234, 115, 228, 238, 245, 124, 35, 69, 124, - 61, 235, 121, 228, 238, 245, 124, 35, 69, 246, 206, 249, 146, 228, 238, - 245, 124, 35, 69, 246, 198, 249, 146, 228, 238, 245, 124, 35, 69, 109, - 235, 43, 228, 238, 245, 124, 35, 69, 218, 235, 109, 235, 43, 228, 238, - 245, 124, 35, 69, 42, 229, 229, 228, 238, 245, 124, 35, 69, 45, 229, 229, - 228, 238, 245, 124, 35, 69, 42, 250, 79, 115, 228, 238, 245, 124, 35, 69, - 45, 250, 79, 115, 228, 238, 245, 124, 35, 69, 42, 221, 114, 224, 236, - 115, 228, 238, 245, 124, 35, 69, 45, 221, 114, 224, 236, 115, 228, 238, - 245, 124, 35, 69, 42, 84, 235, 91, 115, 228, 238, 245, 124, 35, 69, 45, - 84, 235, 91, 115, 228, 238, 245, 124, 35, 69, 42, 51, 254, 120, 115, 228, - 238, 245, 124, 35, 69, 45, 51, 254, 120, 115, 228, 238, 245, 124, 35, 69, - 42, 254, 120, 115, 228, 238, 245, 124, 35, 69, 45, 254, 120, 115, 228, - 238, 245, 124, 35, 69, 42, 250, 124, 115, 228, 238, 245, 124, 35, 69, 45, - 250, 124, 115, 228, 238, 245, 124, 35, 69, 42, 67, 250, 124, 115, 228, - 238, 245, 124, 35, 69, 45, 67, 250, 124, 115, 225, 49, 248, 145, 67, 225, - 49, 248, 145, 228, 238, 245, 124, 35, 69, 42, 40, 115, 228, 238, 245, - 124, 35, 69, 45, 40, 115, 249, 145, 230, 73, 251, 82, 230, 73, 218, 235, - 230, 73, 51, 218, 235, 230, 73, 249, 145, 109, 235, 43, 251, 82, 109, - 235, 43, 218, 235, 109, 235, 43, 3, 250, 168, 3, 98, 250, 168, 3, 245, - 90, 223, 136, 3, 225, 67, 3, 250, 175, 3, 228, 82, 78, 3, 246, 95, 78, 3, - 246, 206, 249, 146, 3, 42, 229, 229, 3, 45, 229, 229, 3, 42, 250, 79, - 115, 3, 45, 250, 79, 115, 3, 42, 221, 114, 224, 236, 115, 3, 45, 221, - 114, 224, 236, 115, 3, 54, 55, 3, 254, 134, 3, 253, 251, 3, 88, 55, 3, - 242, 120, 3, 235, 87, 55, 3, 244, 30, 55, 3, 246, 154, 55, 3, 227, 160, - 224, 17, 3, 248, 155, 55, 3, 229, 169, 55, 3, 250, 167, 253, 244, 12, - 245, 237, 47, 17, 12, 222, 108, 2, 245, 237, 50, 12, 249, 171, 47, 17, - 12, 222, 136, 245, 107, 12, 236, 205, 47, 17, 12, 245, 239, 47, 17, 12, - 245, 239, 128, 17, 12, 249, 173, 47, 17, 12, 249, 173, 128, 17, 12, 236, - 207, 47, 17, 12, 236, 207, 128, 17, 12, 225, 17, 47, 17, 12, 225, 17, - 128, 17, 12, 223, 76, 47, 17, 12, 223, 76, 128, 17, 12, 1, 181, 47, 17, - 12, 1, 99, 2, 234, 111, 71, 47, 17, 12, 1, 99, 2, 234, 111, 71, 39, 17, - 12, 1, 99, 2, 181, 71, 47, 17, 12, 1, 99, 2, 181, 71, 39, 17, 12, 1, 218, - 234, 2, 181, 71, 47, 17, 12, 1, 218, 234, 2, 181, 71, 39, 17, 12, 1, 99, - 2, 181, 252, 118, 47, 17, 12, 1, 99, 2, 181, 252, 118, 39, 17, 12, 1, 70, - 2, 181, 71, 47, 17, 12, 1, 70, 2, 181, 71, 39, 17, 12, 1, 70, 2, 181, 71, - 66, 17, 12, 1, 70, 2, 181, 71, 128, 17, 12, 1, 99, 47, 17, 12, 1, 99, 39, - 17, 12, 1, 252, 129, 47, 17, 12, 1, 252, 129, 39, 17, 12, 1, 252, 129, - 66, 17, 12, 1, 252, 129, 128, 17, 12, 1, 222, 78, 234, 73, 47, 17, 12, 1, - 222, 78, 234, 73, 39, 17, 12, 1, 222, 78, 47, 17, 12, 1, 222, 78, 39, 17, - 12, 1, 222, 78, 66, 17, 12, 1, 222, 78, 128, 17, 12, 1, 222, 20, 47, 17, - 12, 1, 222, 20, 39, 17, 12, 1, 222, 20, 66, 17, 12, 1, 222, 20, 128, 17, - 12, 1, 134, 47, 17, 12, 1, 134, 39, 17, 12, 1, 134, 66, 17, 12, 1, 134, - 128, 17, 12, 1, 111, 47, 17, 12, 1, 111, 39, 17, 12, 1, 111, 66, 17, 12, - 1, 111, 128, 17, 12, 1, 236, 147, 47, 17, 12, 1, 236, 147, 39, 17, 12, 1, - 236, 147, 66, 17, 12, 1, 236, 147, 128, 17, 12, 1, 249, 184, 47, 17, 12, - 1, 249, 184, 39, 17, 12, 1, 222, 30, 47, 17, 12, 1, 222, 30, 39, 17, 12, - 1, 227, 197, 47, 17, 12, 1, 227, 197, 39, 17, 12, 1, 217, 107, 47, 17, - 12, 1, 217, 107, 39, 17, 12, 1, 226, 83, 47, 17, 12, 1, 226, 83, 39, 17, - 12, 1, 226, 83, 66, 17, 12, 1, 226, 83, 128, 17, 12, 1, 224, 243, 47, 17, - 12, 1, 224, 243, 39, 17, 12, 1, 224, 243, 66, 17, 12, 1, 224, 243, 128, - 17, 12, 1, 226, 171, 47, 17, 12, 1, 226, 171, 39, 17, 12, 1, 226, 171, - 66, 17, 12, 1, 226, 171, 128, 17, 12, 1, 249, 203, 47, 17, 12, 1, 249, - 203, 39, 17, 12, 1, 249, 203, 66, 17, 12, 1, 249, 203, 128, 17, 12, 1, - 222, 138, 47, 17, 12, 1, 222, 138, 39, 17, 12, 1, 222, 138, 66, 17, 12, - 1, 222, 138, 128, 17, 12, 1, 217, 110, 47, 17, 12, 1, 217, 110, 39, 17, - 12, 1, 217, 110, 66, 17, 12, 1, 217, 110, 128, 17, 12, 1, 254, 192, 47, - 17, 12, 1, 254, 192, 39, 17, 12, 1, 254, 192, 66, 17, 12, 1, 254, 192, - 128, 17, 12, 1, 244, 123, 47, 17, 12, 1, 244, 123, 39, 17, 12, 1, 244, - 123, 66, 17, 12, 1, 244, 123, 128, 17, 12, 1, 245, 222, 47, 17, 12, 1, - 245, 222, 39, 17, 12, 1, 245, 222, 66, 17, 12, 1, 245, 222, 128, 17, 12, - 1, 228, 149, 47, 17, 12, 1, 228, 149, 39, 17, 12, 1, 228, 149, 66, 17, - 12, 1, 228, 149, 128, 17, 12, 1, 236, 247, 47, 17, 12, 1, 236, 247, 39, - 17, 12, 1, 236, 247, 66, 17, 12, 1, 236, 247, 128, 17, 12, 1, 235, 161, - 47, 17, 12, 1, 235, 161, 39, 17, 12, 1, 235, 161, 66, 17, 12, 1, 235, - 161, 128, 17, 12, 1, 62, 47, 17, 12, 1, 62, 39, 17, 12, 1, 62, 66, 17, - 12, 1, 62, 128, 17, 12, 1, 231, 194, 47, 17, 12, 1, 231, 194, 39, 17, 12, - 1, 231, 194, 66, 17, 12, 1, 231, 194, 128, 17, 12, 1, 243, 147, 47, 17, - 12, 1, 243, 147, 39, 17, 12, 1, 243, 147, 66, 17, 12, 1, 243, 147, 128, - 17, 12, 1, 218, 234, 47, 17, 12, 1, 218, 234, 39, 17, 12, 1, 99, 197, 47, - 17, 12, 1, 99, 197, 39, 17, 12, 1, 70, 47, 17, 12, 1, 70, 39, 17, 12, 1, - 70, 66, 17, 12, 1, 70, 128, 17, 12, 24, 235, 161, 2, 99, 2, 234, 111, 71, - 47, 17, 12, 24, 235, 161, 2, 99, 2, 234, 111, 71, 39, 17, 12, 24, 235, - 161, 2, 99, 2, 181, 71, 47, 17, 12, 24, 235, 161, 2, 99, 2, 181, 71, 39, - 17, 12, 24, 235, 161, 2, 99, 2, 181, 252, 118, 47, 17, 12, 24, 235, 161, - 2, 99, 2, 181, 252, 118, 39, 17, 12, 24, 235, 161, 2, 99, 47, 17, 12, 24, - 235, 161, 2, 99, 39, 17, 217, 85, 218, 199, 231, 203, 223, 254, 110, 246, - 95, 78, 110, 228, 69, 78, 110, 54, 55, 110, 248, 155, 55, 110, 229, 169, - 55, 110, 254, 134, 110, 254, 79, 110, 42, 229, 229, 110, 45, 229, 229, - 110, 253, 251, 110, 88, 55, 110, 250, 168, 110, 242, 120, 110, 245, 90, - 223, 136, 110, 224, 17, 110, 20, 217, 84, 110, 20, 107, 110, 20, 103, - 110, 20, 160, 110, 20, 154, 110, 20, 174, 110, 20, 182, 110, 20, 191, - 110, 20, 185, 110, 20, 190, 110, 250, 175, 110, 225, 67, 110, 235, 87, - 55, 110, 246, 154, 55, 110, 244, 30, 55, 110, 228, 82, 78, 110, 250, 167, - 253, 244, 110, 7, 6, 1, 60, 110, 7, 6, 1, 253, 204, 110, 7, 6, 1, 251, - 202, 110, 7, 6, 1, 250, 46, 110, 7, 6, 1, 73, 110, 7, 6, 1, 246, 74, 110, - 7, 6, 1, 245, 67, 110, 7, 6, 1, 243, 225, 110, 7, 6, 1, 72, 110, 7, 6, 1, - 237, 126, 110, 7, 6, 1, 237, 17, 110, 7, 6, 1, 153, 110, 7, 6, 1, 189, - 110, 7, 6, 1, 207, 110, 7, 6, 1, 74, 110, 7, 6, 1, 230, 59, 110, 7, 6, 1, - 228, 163, 110, 7, 6, 1, 152, 110, 7, 6, 1, 198, 110, 7, 6, 1, 222, 201, - 110, 7, 6, 1, 68, 110, 7, 6, 1, 216, 216, 110, 7, 6, 1, 219, 40, 110, 7, - 6, 1, 218, 151, 110, 7, 6, 1, 218, 90, 110, 7, 6, 1, 217, 157, 110, 42, - 40, 115, 110, 227, 160, 224, 17, 110, 45, 40, 115, 110, 250, 217, 255, 0, - 110, 109, 235, 43, 110, 244, 37, 255, 0, 110, 7, 3, 1, 60, 110, 7, 3, 1, - 253, 204, 110, 7, 3, 1, 251, 202, 110, 7, 3, 1, 250, 46, 110, 7, 3, 1, - 73, 110, 7, 3, 1, 246, 74, 110, 7, 3, 1, 245, 67, 110, 7, 3, 1, 243, 225, - 110, 7, 3, 1, 72, 110, 7, 3, 1, 237, 126, 110, 7, 3, 1, 237, 17, 110, 7, - 3, 1, 153, 110, 7, 3, 1, 189, 110, 7, 3, 1, 207, 110, 7, 3, 1, 74, 110, - 7, 3, 1, 230, 59, 110, 7, 3, 1, 228, 163, 110, 7, 3, 1, 152, 110, 7, 3, - 1, 198, 110, 7, 3, 1, 222, 201, 110, 7, 3, 1, 68, 110, 7, 3, 1, 216, 216, - 110, 7, 3, 1, 219, 40, 110, 7, 3, 1, 218, 151, 110, 7, 3, 1, 218, 90, - 110, 7, 3, 1, 217, 157, 110, 42, 250, 79, 115, 110, 69, 235, 43, 110, 45, - 250, 79, 115, 110, 221, 179, 110, 42, 67, 229, 229, 110, 45, 67, 229, - 229, 93, 98, 245, 90, 223, 136, 93, 42, 250, 124, 115, 93, 45, 250, 124, - 115, 93, 98, 250, 168, 93, 52, 233, 193, 248, 145, 93, 52, 1, 218, 187, - 93, 52, 1, 3, 60, 93, 52, 1, 3, 72, 93, 52, 1, 3, 68, 93, 52, 1, 3, 73, - 93, 52, 1, 3, 74, 93, 52, 1, 3, 184, 93, 52, 1, 3, 217, 200, 93, 52, 1, - 3, 217, 231, 93, 52, 1, 3, 221, 0, 93, 236, 202, 228, 223, 224, 9, 78, - 93, 52, 1, 60, 93, 52, 1, 72, 93, 52, 1, 68, 93, 52, 1, 73, 93, 52, 1, - 74, 93, 52, 1, 175, 93, 52, 1, 236, 113, 93, 52, 1, 236, 7, 93, 52, 1, - 236, 184, 93, 52, 1, 236, 57, 93, 52, 1, 226, 177, 93, 52, 1, 224, 140, - 93, 52, 1, 223, 103, 93, 52, 1, 226, 94, 93, 52, 1, 224, 26, 93, 52, 1, - 222, 155, 93, 52, 1, 221, 205, 93, 52, 1, 221, 0, 93, 52, 1, 222, 87, 93, - 52, 1, 101, 93, 52, 1, 208, 93, 52, 1, 232, 62, 93, 52, 1, 231, 144, 93, - 52, 1, 232, 141, 93, 52, 1, 231, 204, 93, 52, 1, 155, 93, 52, 1, 243, - 112, 93, 52, 1, 242, 173, 93, 52, 1, 243, 162, 93, 52, 1, 243, 4, 93, 52, - 1, 196, 93, 52, 1, 233, 196, 93, 52, 1, 233, 99, 93, 52, 1, 234, 25, 93, - 52, 1, 233, 136, 93, 52, 1, 184, 93, 52, 1, 217, 200, 93, 52, 1, 217, - 231, 93, 52, 1, 203, 93, 52, 1, 227, 147, 93, 52, 1, 227, 22, 93, 52, 1, - 227, 216, 93, 52, 1, 227, 75, 93, 52, 1, 219, 7, 93, 52, 1, 207, 93, 52, - 219, 70, 224, 9, 78, 93, 52, 225, 72, 224, 9, 78, 93, 22, 245, 185, 93, - 22, 1, 236, 86, 93, 22, 1, 223, 211, 93, 22, 1, 236, 79, 93, 22, 1, 232, - 55, 93, 22, 1, 232, 53, 93, 22, 1, 232, 52, 93, 22, 1, 221, 192, 93, 22, - 1, 223, 200, 93, 22, 1, 227, 140, 93, 22, 1, 227, 135, 93, 22, 1, 227, - 132, 93, 22, 1, 227, 125, 93, 22, 1, 227, 120, 93, 22, 1, 227, 115, 93, - 22, 1, 227, 126, 93, 22, 1, 227, 138, 93, 22, 1, 233, 187, 93, 22, 1, - 229, 99, 93, 22, 1, 223, 208, 93, 22, 1, 229, 88, 93, 22, 1, 224, 104, - 93, 22, 1, 223, 205, 93, 22, 1, 238, 22, 93, 22, 1, 250, 230, 93, 22, 1, - 223, 215, 93, 22, 1, 251, 29, 93, 22, 1, 236, 128, 93, 22, 1, 222, 0, 93, - 22, 1, 229, 127, 93, 22, 1, 243, 106, 93, 22, 1, 60, 93, 22, 1, 254, 234, - 93, 22, 1, 184, 93, 22, 1, 218, 65, 93, 22, 1, 246, 168, 93, 22, 1, 73, - 93, 22, 1, 218, 16, 93, 22, 1, 218, 25, 93, 22, 1, 74, 93, 22, 1, 219, 7, - 93, 22, 1, 219, 4, 93, 22, 1, 230, 167, 93, 22, 1, 217, 231, 93, 22, 1, - 68, 93, 22, 1, 218, 219, 93, 22, 1, 218, 227, 93, 22, 1, 218, 204, 93, - 22, 1, 217, 200, 93, 22, 1, 246, 115, 93, 22, 1, 217, 250, 93, 22, 1, 72, - 110, 251, 86, 55, 110, 229, 11, 55, 110, 212, 55, 110, 234, 115, 110, - 252, 1, 135, 110, 218, 19, 55, 110, 218, 182, 55, 93, 245, 122, 170, 219, - 152, 93, 127, 65, 93, 220, 53, 65, 93, 90, 65, 93, 247, 130, 65, 93, 84, - 223, 227, 93, 67, 250, 221, 237, 180, 254, 112, 254, 128, 237, 180, 254, - 112, 225, 54, 237, 180, 254, 112, 222, 56, 230, 178, 227, 179, 251, 55, - 227, 179, 251, 55, 57, 49, 4, 253, 188, 60, 57, 49, 4, 253, 157, 73, 57, - 49, 4, 253, 166, 72, 57, 49, 4, 253, 134, 74, 57, 49, 4, 253, 184, 68, - 57, 49, 4, 253, 203, 249, 207, 57, 49, 4, 253, 150, 249, 92, 57, 49, 4, - 253, 190, 249, 15, 57, 49, 4, 253, 180, 248, 167, 57, 49, 4, 253, 144, - 247, 111, 57, 49, 4, 253, 138, 237, 123, 57, 49, 4, 253, 149, 237, 114, - 57, 49, 4, 253, 159, 237, 59, 57, 49, 4, 253, 130, 237, 43, 57, 49, 4, - 253, 118, 175, 57, 49, 4, 253, 151, 236, 184, 57, 49, 4, 253, 128, 236, - 113, 57, 49, 4, 253, 125, 236, 57, 57, 49, 4, 253, 114, 236, 7, 57, 49, - 4, 253, 115, 196, 57, 49, 4, 253, 181, 234, 25, 57, 49, 4, 253, 122, 233, - 196, 57, 49, 4, 253, 179, 233, 136, 57, 49, 4, 253, 171, 233, 99, 57, 49, - 4, 253, 192, 208, 57, 49, 4, 253, 170, 232, 141, 57, 49, 4, 253, 164, - 232, 62, 57, 49, 4, 253, 143, 231, 204, 57, 49, 4, 253, 140, 231, 144, - 57, 49, 4, 253, 199, 187, 57, 49, 4, 253, 123, 229, 198, 57, 49, 4, 253, - 156, 229, 108, 57, 49, 4, 253, 183, 229, 37, 57, 49, 4, 253, 145, 228, - 202, 57, 49, 4, 253, 178, 228, 155, 57, 49, 4, 253, 117, 228, 136, 57, - 49, 4, 253, 173, 228, 121, 57, 49, 4, 253, 162, 228, 110, 57, 49, 4, 253, - 135, 203, 57, 49, 4, 253, 167, 227, 216, 57, 49, 4, 253, 142, 227, 147, - 57, 49, 4, 253, 201, 227, 75, 57, 49, 4, 253, 168, 227, 22, 57, 49, 4, - 253, 163, 226, 177, 57, 49, 4, 253, 186, 226, 94, 57, 49, 4, 253, 154, - 224, 140, 57, 49, 4, 253, 182, 224, 26, 57, 49, 4, 253, 137, 223, 103, - 57, 49, 4, 253, 136, 222, 155, 57, 49, 4, 253, 197, 222, 87, 57, 49, 4, - 253, 158, 221, 205, 57, 49, 4, 253, 195, 101, 57, 49, 4, 253, 126, 221, - 0, 57, 49, 4, 253, 141, 219, 7, 57, 49, 4, 253, 120, 218, 227, 57, 49, 4, - 253, 155, 218, 204, 57, 49, 4, 253, 153, 218, 187, 57, 49, 4, 253, 177, - 217, 114, 57, 49, 4, 253, 121, 217, 92, 57, 49, 4, 253, 174, 217, 21, 57, - 49, 4, 253, 169, 255, 60, 57, 49, 4, 253, 152, 255, 59, 57, 49, 4, 253, - 111, 253, 232, 57, 49, 4, 253, 124, 247, 82, 57, 49, 4, 253, 107, 247, - 81, 57, 49, 4, 253, 147, 231, 85, 57, 49, 4, 253, 165, 228, 201, 57, 49, - 4, 253, 133, 228, 204, 57, 49, 4, 253, 119, 228, 2, 57, 49, 4, 253, 161, - 228, 1, 57, 49, 4, 253, 127, 227, 74, 57, 49, 4, 253, 129, 222, 153, 57, - 49, 4, 253, 109, 220, 223, 57, 49, 4, 253, 106, 103, 57, 49, 16, 253, - 176, 57, 49, 16, 253, 175, 57, 49, 16, 253, 172, 57, 49, 16, 253, 160, - 57, 49, 16, 253, 148, 57, 49, 16, 253, 146, 57, 49, 16, 253, 139, 57, 49, - 16, 253, 132, 57, 49, 16, 253, 131, 57, 49, 16, 253, 116, 57, 49, 16, - 253, 113, 57, 49, 16, 253, 112, 57, 49, 16, 253, 110, 57, 49, 16, 253, - 108, 57, 49, 97, 253, 105, 234, 86, 57, 49, 97, 253, 104, 218, 183, 57, - 49, 97, 253, 103, 249, 80, 57, 49, 97, 253, 102, 246, 151, 57, 49, 97, - 253, 101, 234, 68, 57, 49, 97, 253, 100, 223, 162, 57, 49, 97, 253, 99, - 246, 100, 57, 49, 97, 253, 98, 227, 239, 57, 49, 97, 253, 97, 224, 245, - 57, 49, 97, 253, 96, 243, 161, 57, 49, 97, 253, 95, 224, 4, 57, 49, 97, - 253, 94, 252, 39, 57, 49, 97, 253, 93, 250, 110, 57, 49, 97, 253, 92, - 251, 243, 57, 49, 97, 253, 91, 218, 212, 57, 49, 97, 253, 90, 252, 198, - 57, 49, 97, 253, 89, 230, 147, 57, 49, 97, 253, 88, 223, 244, 57, 49, 97, - 253, 87, 250, 54, 57, 49, 233, 125, 253, 86, 236, 223, 57, 49, 233, 125, - 253, 85, 236, 231, 57, 49, 97, 253, 84, 230, 157, 57, 49, 97, 253, 83, - 218, 192, 57, 49, 97, 253, 82, 57, 49, 233, 125, 253, 81, 254, 44, 57, - 49, 233, 125, 253, 80, 233, 247, 57, 49, 97, 253, 79, 252, 0, 57, 49, 97, - 253, 78, 244, 62, 57, 49, 97, 253, 77, 57, 49, 97, 253, 76, 218, 177, 57, - 49, 97, 253, 75, 57, 49, 97, 253, 74, 57, 49, 97, 253, 73, 242, 189, 57, - 49, 97, 253, 72, 57, 49, 97, 253, 71, 57, 49, 97, 253, 70, 57, 49, 233, - 125, 253, 68, 220, 235, 57, 49, 97, 253, 67, 57, 49, 97, 253, 66, 57, 49, - 97, 253, 65, 250, 192, 57, 49, 97, 253, 64, 57, 49, 97, 253, 63, 57, 49, - 97, 253, 62, 244, 218, 57, 49, 97, 253, 61, 254, 31, 57, 49, 97, 253, 60, - 57, 49, 97, 253, 59, 57, 49, 97, 253, 58, 57, 49, 97, 253, 57, 57, 49, - 97, 253, 56, 57, 49, 97, 253, 55, 57, 49, 97, 253, 54, 57, 49, 97, 253, - 53, 57, 49, 97, 253, 52, 57, 49, 97, 253, 51, 233, 120, 57, 49, 97, 253, - 50, 57, 49, 97, 253, 49, 221, 98, 57, 49, 97, 253, 48, 57, 49, 97, 253, - 47, 57, 49, 97, 253, 46, 57, 49, 97, 253, 45, 57, 49, 97, 253, 44, 57, - 49, 97, 253, 43, 57, 49, 97, 253, 42, 57, 49, 97, 253, 41, 57, 49, 97, - 253, 40, 57, 49, 97, 253, 39, 57, 49, 97, 253, 38, 57, 49, 97, 253, 37, - 243, 140, 57, 49, 97, 253, 16, 245, 131, 57, 49, 97, 253, 13, 252, 182, - 57, 49, 97, 253, 8, 223, 249, 57, 49, 97, 253, 7, 65, 57, 49, 97, 253, 6, - 57, 49, 97, 253, 5, 223, 25, 57, 49, 97, 253, 4, 57, 49, 97, 253, 3, 57, - 49, 97, 253, 2, 218, 208, 251, 52, 57, 49, 97, 253, 1, 251, 52, 57, 49, - 97, 253, 0, 251, 53, 245, 105, 57, 49, 97, 252, 255, 218, 210, 57, 49, - 97, 252, 254, 57, 49, 97, 252, 253, 57, 49, 233, 125, 252, 252, 248, 211, - 57, 49, 97, 252, 251, 57, 49, 97, 252, 250, 57, 49, 97, 252, 248, 57, 49, - 97, 252, 247, 57, 49, 97, 252, 246, 57, 49, 97, 252, 245, 249, 149, 57, - 49, 97, 252, 244, 57, 49, 97, 252, 243, 57, 49, 97, 252, 242, 57, 49, 97, - 252, 241, 57, 49, 97, 252, 240, 57, 49, 97, 219, 99, 253, 69, 57, 49, 97, - 219, 99, 253, 36, 57, 49, 97, 219, 99, 253, 35, 57, 49, 97, 219, 99, 253, - 34, 57, 49, 97, 219, 99, 253, 33, 57, 49, 97, 219, 99, 253, 32, 57, 49, - 97, 219, 99, 253, 31, 57, 49, 97, 219, 99, 253, 30, 57, 49, 97, 219, 99, - 253, 29, 57, 49, 97, 219, 99, 253, 28, 57, 49, 97, 219, 99, 253, 27, 57, - 49, 97, 219, 99, 253, 26, 57, 49, 97, 219, 99, 253, 25, 57, 49, 97, 219, - 99, 253, 24, 57, 49, 97, 219, 99, 253, 23, 57, 49, 97, 219, 99, 253, 22, - 57, 49, 97, 219, 99, 253, 21, 57, 49, 97, 219, 99, 253, 20, 57, 49, 97, - 219, 99, 253, 19, 57, 49, 97, 219, 99, 253, 18, 57, 49, 97, 219, 99, 253, - 17, 57, 49, 97, 219, 99, 253, 15, 57, 49, 97, 219, 99, 253, 14, 57, 49, - 97, 219, 99, 253, 12, 57, 49, 97, 219, 99, 253, 11, 57, 49, 97, 219, 99, - 253, 10, 57, 49, 97, 219, 99, 253, 9, 57, 49, 97, 219, 99, 252, 249, 57, - 49, 97, 219, 99, 252, 239, 254, 227, 218, 174, 225, 55, 235, 43, 254, - 227, 218, 174, 225, 55, 248, 145, 254, 227, 251, 45, 78, 254, 227, 54, - 107, 254, 227, 54, 103, 254, 227, 54, 160, 254, 227, 54, 154, 254, 227, - 54, 174, 254, 227, 54, 182, 254, 227, 54, 191, 254, 227, 54, 185, 254, - 227, 54, 190, 254, 227, 54, 222, 65, 254, 227, 54, 220, 219, 254, 227, - 54, 221, 245, 254, 227, 54, 245, 119, 254, 227, 54, 245, 196, 254, 227, - 54, 224, 69, 254, 227, 54, 225, 38, 254, 227, 54, 246, 227, 254, 227, 54, - 232, 27, 254, 227, 54, 131, 242, 161, 254, 227, 54, 124, 242, 161, 254, - 227, 54, 148, 242, 161, 254, 227, 54, 245, 116, 242, 161, 254, 227, 54, - 245, 170, 242, 161, 254, 227, 54, 224, 82, 242, 161, 254, 227, 54, 225, - 43, 242, 161, 254, 227, 54, 246, 235, 242, 161, 254, 227, 54, 232, 31, - 242, 161, 254, 227, 54, 131, 221, 231, 254, 227, 54, 124, 221, 231, 254, - 227, 54, 148, 221, 231, 254, 227, 54, 245, 116, 221, 231, 254, 227, 54, - 245, 170, 221, 231, 254, 227, 54, 224, 82, 221, 231, 254, 227, 54, 225, - 43, 221, 231, 254, 227, 54, 246, 235, 221, 231, 254, 227, 54, 232, 31, - 221, 231, 254, 227, 54, 222, 66, 221, 231, 254, 227, 54, 220, 220, 221, - 231, 254, 227, 54, 221, 246, 221, 231, 254, 227, 54, 245, 120, 221, 231, - 254, 227, 54, 245, 197, 221, 231, 254, 227, 54, 224, 70, 221, 231, 254, - 227, 54, 225, 39, 221, 231, 254, 227, 54, 246, 228, 221, 231, 254, 227, - 54, 232, 28, 221, 231, 254, 227, 218, 222, 252, 190, 220, 72, 254, 227, - 218, 222, 245, 178, 223, 88, 254, 227, 218, 222, 226, 90, 223, 88, 254, - 227, 218, 222, 221, 252, 223, 88, 254, 227, 218, 222, 245, 110, 223, 88, - 254, 227, 247, 114, 234, 24, 245, 178, 223, 88, 254, 227, 235, 31, 234, - 24, 245, 178, 223, 88, 254, 227, 234, 24, 226, 90, 223, 88, 254, 227, - 234, 24, 221, 252, 223, 88, 23, 254, 251, 253, 234, 131, 228, 89, 23, - 254, 251, 253, 234, 131, 243, 194, 23, 254, 251, 253, 234, 131, 247, 126, - 23, 254, 251, 253, 234, 174, 23, 254, 251, 253, 234, 245, 196, 23, 254, - 251, 253, 234, 245, 170, 242, 161, 23, 254, 251, 253, 234, 245, 170, 221, - 231, 23, 254, 251, 253, 234, 245, 197, 221, 231, 23, 254, 251, 253, 234, - 245, 170, 222, 126, 23, 254, 251, 253, 234, 222, 66, 222, 126, 23, 254, - 251, 253, 234, 245, 197, 222, 126, 23, 254, 251, 253, 234, 131, 242, 162, - 222, 126, 23, 254, 251, 253, 234, 245, 170, 242, 162, 222, 126, 23, 254, - 251, 253, 234, 131, 221, 232, 222, 126, 23, 254, 251, 253, 234, 245, 170, - 221, 232, 222, 126, 23, 254, 251, 253, 234, 245, 170, 223, 153, 23, 254, - 251, 253, 234, 222, 66, 223, 153, 23, 254, 251, 253, 234, 245, 197, 223, - 153, 23, 254, 251, 253, 234, 131, 242, 162, 223, 153, 23, 254, 251, 253, - 234, 245, 170, 242, 162, 223, 153, 23, 254, 251, 253, 234, 131, 221, 232, - 223, 153, 23, 254, 251, 253, 234, 222, 66, 221, 232, 223, 153, 23, 254, - 251, 253, 234, 245, 197, 221, 232, 223, 153, 23, 254, 251, 253, 234, 222, - 66, 233, 139, 23, 254, 251, 243, 134, 131, 229, 49, 23, 254, 251, 222, 8, - 107, 23, 254, 251, 243, 132, 107, 23, 254, 251, 246, 159, 103, 23, 254, - 251, 222, 8, 103, 23, 254, 251, 250, 51, 124, 247, 125, 23, 254, 251, - 246, 159, 124, 247, 125, 23, 254, 251, 221, 71, 174, 23, 254, 251, 221, - 71, 222, 65, 23, 254, 251, 221, 71, 222, 66, 254, 144, 17, 23, 254, 251, - 243, 132, 222, 65, 23, 254, 251, 233, 240, 222, 65, 23, 254, 251, 222, 8, - 222, 65, 23, 254, 251, 222, 8, 221, 245, 23, 254, 251, 221, 71, 245, 196, - 23, 254, 251, 221, 71, 245, 197, 254, 144, 17, 23, 254, 251, 243, 132, - 245, 196, 23, 254, 251, 222, 8, 245, 196, 23, 254, 251, 222, 8, 131, 242, - 161, 23, 254, 251, 222, 8, 148, 242, 161, 23, 254, 251, 246, 159, 245, - 170, 242, 161, 23, 254, 251, 221, 71, 245, 170, 242, 161, 23, 254, 251, - 222, 8, 245, 170, 242, 161, 23, 254, 251, 251, 126, 245, 170, 242, 161, - 23, 254, 251, 232, 200, 245, 170, 242, 161, 23, 254, 251, 222, 8, 131, - 221, 231, 23, 254, 251, 222, 8, 245, 170, 221, 231, 23, 254, 251, 249, - 65, 245, 170, 233, 139, 23, 254, 251, 223, 127, 245, 197, 233, 139, 23, - 131, 144, 55, 23, 131, 144, 5, 254, 144, 17, 23, 124, 221, 250, 55, 23, - 148, 228, 88, 55, 23, 218, 23, 55, 23, 222, 127, 55, 23, 247, 127, 55, - 23, 230, 175, 55, 23, 124, 230, 174, 55, 23, 148, 230, 174, 55, 23, 245, - 116, 230, 174, 55, 23, 245, 170, 230, 174, 55, 23, 233, 235, 55, 23, 235, - 210, 252, 190, 55, 23, 235, 26, 55, 23, 230, 84, 55, 23, 218, 132, 55, - 23, 254, 16, 55, 23, 254, 27, 55, 23, 244, 42, 55, 23, 221, 58, 252, 190, - 55, 23, 217, 85, 55, 227, 68, 225, 35, 55, 227, 68, 220, 83, 55, 227, 68, - 225, 59, 55, 227, 68, 225, 33, 55, 227, 68, 248, 226, 225, 33, 55, 227, - 68, 224, 120, 55, 227, 68, 249, 61, 55, 227, 68, 228, 76, 55, 227, 68, - 225, 47, 55, 227, 68, 247, 93, 55, 227, 68, 254, 14, 55, 227, 68, 251, - 81, 55, 229, 137, 248, 205, 5, 229, 192, 229, 137, 248, 205, 5, 229, 44, - 243, 159, 229, 137, 248, 205, 5, 222, 109, 243, 159, 229, 137, 248, 205, - 5, 251, 139, 229, 137, 248, 205, 5, 251, 24, 229, 137, 248, 205, 5, 218, - 183, 229, 137, 248, 205, 5, 243, 140, 229, 137, 248, 205, 5, 244, 210, - 229, 137, 248, 205, 5, 221, 204, 229, 137, 248, 205, 5, 65, 229, 137, - 248, 205, 5, 252, 24, 229, 137, 248, 205, 5, 224, 218, 229, 137, 248, - 205, 5, 250, 187, 229, 137, 248, 205, 5, 234, 85, 229, 137, 248, 205, 5, - 234, 48, 229, 137, 248, 205, 5, 226, 122, 229, 137, 248, 205, 5, 235, 64, - 229, 137, 248, 205, 5, 252, 33, 229, 137, 248, 205, 5, 251, 129, 229, 51, - 229, 137, 248, 205, 5, 248, 156, 229, 137, 248, 205, 5, 250, 172, 229, - 137, 248, 205, 5, 224, 50, 229, 137, 248, 205, 5, 250, 173, 229, 137, - 248, 205, 5, 252, 134, 229, 137, 248, 205, 5, 224, 206, 229, 137, 248, - 205, 5, 242, 189, 229, 137, 248, 205, 5, 243, 111, 229, 137, 248, 205, 5, - 251, 240, 235, 106, 229, 137, 248, 205, 5, 251, 124, 229, 137, 248, 205, - 5, 227, 239, 229, 137, 248, 205, 5, 247, 13, 229, 137, 248, 205, 5, 247, - 133, 229, 137, 248, 205, 5, 220, 247, 229, 137, 248, 205, 5, 252, 137, - 229, 137, 248, 205, 5, 229, 52, 221, 98, 229, 137, 248, 205, 5, 219, 84, - 229, 137, 248, 205, 5, 229, 244, 229, 137, 248, 205, 5, 227, 62, 229, - 137, 248, 205, 5, 235, 52, 229, 137, 248, 205, 5, 230, 69, 252, 233, 229, - 137, 248, 205, 5, 245, 143, 229, 137, 248, 205, 5, 244, 38, 229, 137, - 248, 205, 5, 223, 128, 229, 137, 248, 205, 5, 3, 253, 213, 229, 137, 248, - 205, 5, 218, 235, 252, 206, 229, 137, 248, 205, 5, 36, 230, 177, 92, 234, - 197, 1, 60, 234, 197, 1, 73, 234, 197, 1, 253, 204, 234, 197, 1, 252, 95, - 234, 197, 1, 245, 67, 234, 197, 1, 250, 46, 234, 197, 1, 72, 234, 197, 1, - 219, 40, 234, 197, 1, 217, 157, 234, 197, 1, 222, 37, 234, 197, 1, 237, - 126, 234, 197, 1, 237, 17, 234, 197, 1, 228, 163, 234, 197, 1, 153, 234, - 197, 1, 189, 234, 197, 1, 207, 234, 197, 1, 233, 140, 234, 197, 1, 231, - 218, 234, 197, 1, 68, 234, 197, 1, 230, 59, 234, 197, 1, 236, 75, 234, - 197, 1, 152, 234, 197, 1, 198, 234, 197, 1, 222, 201, 234, 197, 1, 221, - 32, 234, 197, 1, 254, 131, 234, 197, 1, 246, 197, 234, 197, 1, 243, 225, - 234, 197, 1, 218, 151, 251, 133, 1, 60, 251, 133, 1, 230, 45, 251, 133, - 1, 250, 46, 251, 133, 1, 153, 251, 133, 1, 220, 21, 251, 133, 1, 152, - 251, 133, 1, 235, 126, 251, 133, 1, 255, 60, 251, 133, 1, 228, 163, 251, - 133, 1, 253, 204, 251, 133, 1, 189, 251, 133, 1, 74, 251, 133, 1, 249, - 209, 251, 133, 1, 222, 201, 251, 133, 1, 225, 27, 251, 133, 1, 225, 26, - 251, 133, 1, 198, 251, 133, 1, 251, 201, 251, 133, 1, 68, 251, 133, 1, - 231, 218, 251, 133, 1, 218, 151, 251, 133, 1, 207, 251, 133, 1, 221, 31, - 251, 133, 1, 230, 59, 251, 133, 1, 223, 219, 251, 133, 1, 72, 251, 133, - 1, 73, 251, 133, 1, 220, 18, 251, 133, 1, 237, 17, 251, 133, 1, 237, 8, - 251, 133, 1, 232, 170, 251, 133, 1, 220, 23, 251, 133, 1, 245, 67, 251, - 133, 1, 245, 2, 251, 133, 1, 223, 168, 251, 133, 1, 223, 167, 251, 133, - 1, 232, 117, 251, 133, 1, 237, 255, 251, 133, 1, 251, 200, 251, 133, 1, - 221, 32, 251, 133, 1, 220, 20, 251, 133, 1, 227, 53, 251, 133, 1, 234, - 41, 251, 133, 1, 234, 40, 251, 133, 1, 234, 39, 251, 133, 1, 234, 38, - 251, 133, 1, 235, 125, 251, 133, 1, 247, 17, 251, 133, 1, 220, 19, 48, - 30, 1, 60, 48, 30, 1, 252, 144, 48, 30, 1, 236, 184, 48, 30, 1, 249, 92, - 48, 30, 1, 73, 48, 30, 1, 219, 165, 48, 30, 1, 217, 92, 48, 30, 1, 243, - 162, 48, 30, 1, 222, 22, 48, 30, 1, 72, 48, 30, 1, 175, 48, 30, 1, 246, - 217, 48, 30, 1, 246, 205, 48, 30, 1, 246, 197, 48, 30, 1, 246, 133, 48, - 30, 1, 74, 48, 30, 1, 229, 198, 48, 30, 1, 224, 246, 48, 30, 1, 236, 7, - 48, 30, 1, 246, 148, 48, 30, 1, 246, 138, 48, 30, 1, 222, 87, 48, 30, 1, - 68, 48, 30, 1, 246, 220, 48, 30, 1, 229, 132, 48, 30, 1, 236, 137, 48, - 30, 1, 246, 244, 48, 30, 1, 246, 140, 48, 30, 1, 251, 46, 48, 30, 1, 237, - 255, 48, 30, 1, 220, 23, 48, 30, 231, 107, 107, 48, 30, 231, 107, 174, - 48, 30, 231, 107, 222, 65, 48, 30, 231, 107, 245, 196, 244, 50, 1, 254, - 199, 244, 50, 1, 252, 219, 244, 50, 1, 244, 100, 244, 50, 1, 249, 191, - 244, 50, 1, 254, 195, 244, 50, 1, 228, 146, 244, 50, 1, 237, 136, 244, - 50, 1, 243, 204, 244, 50, 1, 221, 241, 244, 50, 1, 246, 226, 244, 50, 1, - 235, 241, 244, 50, 1, 235, 170, 244, 50, 1, 234, 82, 244, 50, 1, 232, - 202, 244, 50, 1, 237, 108, 244, 50, 1, 220, 37, 244, 50, 1, 230, 31, 244, - 50, 1, 232, 27, 244, 50, 1, 227, 245, 244, 50, 1, 226, 123, 244, 50, 1, - 222, 74, 244, 50, 1, 218, 191, 244, 50, 1, 245, 249, 244, 50, 1, 238, 3, - 244, 50, 1, 242, 152, 244, 50, 1, 230, 91, 244, 50, 1, 232, 31, 242, 161, - 220, 106, 1, 254, 150, 220, 106, 1, 252, 102, 220, 106, 1, 244, 232, 220, - 106, 1, 236, 149, 220, 106, 1, 249, 62, 220, 106, 1, 243, 4, 220, 106, 1, - 218, 187, 220, 106, 1, 217, 83, 220, 106, 1, 242, 185, 220, 106, 1, 222, - 50, 220, 106, 1, 217, 220, 220, 106, 1, 236, 246, 220, 106, 1, 224, 209, - 220, 106, 1, 235, 156, 220, 106, 1, 234, 1, 220, 106, 1, 249, 33, 220, - 106, 1, 231, 103, 220, 106, 1, 217, 13, 220, 106, 1, 226, 144, 220, 106, - 1, 254, 191, 220, 106, 1, 228, 202, 220, 106, 1, 226, 169, 220, 106, 1, - 228, 103, 220, 106, 1, 227, 231, 220, 106, 1, 222, 26, 220, 106, 1, 244, - 122, 220, 106, 1, 101, 220, 106, 1, 72, 220, 106, 1, 68, 220, 106, 1, - 223, 178, 220, 106, 218, 174, 248, 191, 48, 229, 159, 5, 60, 48, 229, - 159, 5, 72, 48, 229, 159, 5, 68, 48, 229, 159, 5, 175, 48, 229, 159, 5, - 236, 7, 48, 229, 159, 5, 245, 0, 48, 229, 159, 5, 244, 17, 48, 229, 159, - 5, 218, 138, 48, 229, 159, 5, 251, 169, 48, 229, 159, 5, 237, 123, 48, - 229, 159, 5, 237, 98, 48, 229, 159, 5, 222, 155, 48, 229, 159, 5, 221, 0, - 48, 229, 159, 5, 249, 207, 48, 229, 159, 5, 249, 15, 48, 229, 159, 5, - 247, 111, 48, 229, 159, 5, 222, 35, 48, 229, 159, 5, 187, 48, 229, 159, - 5, 252, 237, 48, 229, 159, 5, 246, 8, 48, 229, 159, 5, 208, 48, 229, 159, - 5, 231, 144, 48, 229, 159, 5, 196, 48, 229, 159, 5, 233, 196, 48, 229, - 159, 5, 233, 99, 48, 229, 159, 5, 184, 48, 229, 159, 5, 219, 189, 48, - 229, 159, 5, 219, 94, 48, 229, 159, 5, 203, 48, 229, 159, 5, 227, 22, 48, - 229, 159, 5, 235, 188, 48, 229, 159, 5, 226, 177, 48, 229, 159, 5, 217, - 114, 48, 229, 159, 5, 225, 25, 48, 229, 159, 5, 223, 218, 48, 229, 159, - 5, 155, 48, 229, 159, 5, 253, 227, 48, 229, 159, 5, 253, 226, 48, 229, - 159, 5, 253, 225, 48, 229, 159, 5, 218, 115, 48, 229, 159, 5, 249, 188, - 48, 229, 159, 5, 249, 187, 48, 229, 159, 5, 252, 224, 48, 229, 159, 5, - 251, 220, 48, 229, 159, 218, 174, 248, 191, 48, 229, 159, 54, 107, 48, - 229, 159, 54, 103, 48, 229, 159, 54, 222, 65, 48, 229, 159, 54, 220, 219, - 48, 229, 159, 54, 242, 161, 161, 6, 1, 171, 72, 161, 6, 1, 171, 73, 161, - 6, 1, 171, 60, 161, 6, 1, 171, 254, 202, 161, 6, 1, 171, 74, 161, 6, 1, - 171, 230, 127, 161, 6, 1, 224, 192, 72, 161, 6, 1, 224, 192, 73, 161, 6, - 1, 224, 192, 60, 161, 6, 1, 224, 192, 254, 202, 161, 6, 1, 224, 192, 74, - 161, 6, 1, 224, 192, 230, 127, 161, 6, 1, 253, 212, 161, 6, 1, 230, 70, - 161, 6, 1, 218, 165, 161, 6, 1, 218, 22, 161, 6, 1, 243, 225, 161, 6, 1, - 229, 191, 161, 6, 1, 252, 137, 161, 6, 1, 222, 80, 161, 6, 1, 249, 82, - 161, 6, 1, 251, 43, 161, 6, 1, 237, 113, 161, 6, 1, 236, 191, 161, 6, 1, - 244, 208, 161, 6, 1, 246, 244, 161, 6, 1, 219, 160, 161, 6, 1, 246, 118, - 161, 6, 1, 222, 21, 161, 6, 1, 246, 138, 161, 6, 1, 217, 90, 161, 6, 1, - 246, 133, 161, 6, 1, 217, 71, 161, 6, 1, 246, 148, 161, 6, 1, 246, 217, - 161, 6, 1, 246, 205, 161, 6, 1, 246, 197, 161, 6, 1, 246, 185, 161, 6, 1, - 230, 158, 161, 6, 1, 246, 101, 161, 3, 1, 171, 72, 161, 3, 1, 171, 73, - 161, 3, 1, 171, 60, 161, 3, 1, 171, 254, 202, 161, 3, 1, 171, 74, 161, 3, - 1, 171, 230, 127, 161, 3, 1, 224, 192, 72, 161, 3, 1, 224, 192, 73, 161, - 3, 1, 224, 192, 60, 161, 3, 1, 224, 192, 254, 202, 161, 3, 1, 224, 192, - 74, 161, 3, 1, 224, 192, 230, 127, 161, 3, 1, 253, 212, 161, 3, 1, 230, - 70, 161, 3, 1, 218, 165, 161, 3, 1, 218, 22, 161, 3, 1, 243, 225, 161, 3, - 1, 229, 191, 161, 3, 1, 252, 137, 161, 3, 1, 222, 80, 161, 3, 1, 249, 82, - 161, 3, 1, 251, 43, 161, 3, 1, 237, 113, 161, 3, 1, 236, 191, 161, 3, 1, - 244, 208, 161, 3, 1, 246, 244, 161, 3, 1, 219, 160, 161, 3, 1, 246, 118, - 161, 3, 1, 222, 21, 161, 3, 1, 246, 138, 161, 3, 1, 217, 90, 161, 3, 1, - 246, 133, 161, 3, 1, 217, 71, 161, 3, 1, 246, 148, 161, 3, 1, 246, 217, - 161, 3, 1, 246, 205, 161, 3, 1, 246, 197, 161, 3, 1, 246, 185, 161, 3, 1, - 230, 158, 161, 3, 1, 246, 101, 224, 252, 1, 229, 190, 224, 252, 1, 221, - 113, 224, 252, 1, 236, 112, 224, 252, 1, 245, 226, 224, 252, 1, 221, 255, - 224, 252, 1, 224, 26, 224, 252, 1, 223, 50, 224, 252, 1, 250, 245, 224, - 252, 1, 218, 24, 224, 252, 1, 242, 160, 224, 252, 1, 252, 83, 224, 252, - 1, 249, 91, 224, 252, 1, 244, 242, 224, 252, 1, 219, 60, 224, 252, 1, - 222, 3, 224, 252, 1, 217, 19, 224, 252, 1, 234, 23, 224, 252, 1, 237, 41, - 224, 252, 1, 218, 185, 224, 252, 1, 243, 213, 224, 252, 1, 235, 3, 224, - 252, 1, 233, 160, 224, 252, 1, 238, 6, 224, 252, 1, 246, 243, 224, 252, - 1, 254, 7, 224, 252, 1, 254, 237, 224, 252, 1, 230, 138, 224, 252, 1, - 218, 177, 224, 252, 1, 230, 83, 224, 252, 1, 254, 202, 224, 252, 1, 227, - 72, 224, 252, 1, 231, 103, 224, 252, 1, 247, 2, 224, 252, 1, 254, 207, - 224, 252, 1, 242, 65, 224, 252, 1, 220, 63, 224, 252, 1, 230, 183, 224, - 252, 1, 230, 121, 224, 252, 1, 230, 157, 224, 252, 1, 253, 215, 224, 252, - 1, 254, 45, 224, 252, 1, 230, 105, 224, 252, 1, 254, 188, 224, 252, 1, - 246, 142, 224, 252, 1, 254, 24, 224, 252, 1, 247, 11, 224, 252, 1, 242, - 71, 224, 252, 1, 217, 255, 230, 93, 1, 254, 168, 230, 93, 1, 252, 237, - 230, 93, 1, 222, 155, 230, 93, 1, 237, 123, 230, 93, 1, 218, 138, 230, - 93, 1, 236, 149, 230, 93, 1, 249, 81, 230, 93, 1, 203, 230, 93, 1, 226, - 177, 230, 93, 1, 224, 215, 230, 93, 1, 249, 36, 230, 93, 1, 251, 116, - 230, 93, 1, 245, 0, 230, 93, 1, 246, 8, 230, 93, 1, 228, 153, 230, 93, 1, - 237, 4, 230, 93, 1, 235, 184, 230, 93, 1, 233, 170, 230, 93, 1, 231, 89, - 230, 93, 1, 218, 233, 230, 93, 1, 155, 230, 93, 1, 184, 230, 93, 1, 60, - 230, 93, 1, 73, 230, 93, 1, 72, 230, 93, 1, 74, 230, 93, 1, 68, 230, 93, - 1, 255, 58, 230, 93, 1, 246, 250, 230, 93, 1, 230, 127, 230, 93, 20, 217, - 84, 230, 93, 20, 107, 230, 93, 20, 103, 230, 93, 20, 160, 230, 93, 20, - 154, 230, 93, 20, 174, 230, 93, 20, 182, 230, 93, 20, 191, 230, 93, 20, - 185, 230, 93, 20, 190, 250, 53, 4, 60, 250, 53, 4, 73, 250, 53, 4, 72, - 250, 53, 4, 74, 250, 53, 4, 68, 250, 53, 4, 237, 123, 250, 53, 4, 237, - 59, 250, 53, 4, 175, 250, 53, 4, 236, 184, 250, 53, 4, 236, 113, 250, 53, - 4, 236, 57, 250, 53, 4, 236, 7, 250, 53, 4, 235, 188, 250, 53, 4, 235, - 122, 250, 53, 4, 235, 67, 250, 53, 4, 235, 12, 250, 53, 4, 234, 231, 250, - 53, 4, 196, 250, 53, 4, 234, 25, 250, 53, 4, 233, 196, 250, 53, 4, 233, - 136, 250, 53, 4, 233, 99, 250, 53, 4, 208, 250, 53, 4, 232, 141, 250, 53, - 4, 232, 62, 250, 53, 4, 231, 204, 250, 53, 4, 231, 144, 250, 53, 4, 187, - 250, 53, 4, 229, 198, 250, 53, 4, 229, 108, 250, 53, 4, 229, 37, 250, 53, - 4, 228, 202, 250, 53, 4, 203, 250, 53, 4, 227, 216, 250, 53, 4, 227, 147, - 250, 53, 4, 227, 75, 250, 53, 4, 227, 22, 250, 53, 4, 226, 177, 250, 53, - 4, 226, 94, 250, 53, 4, 224, 140, 250, 53, 4, 224, 26, 250, 53, 4, 223, - 103, 250, 53, 4, 222, 155, 250, 53, 4, 222, 87, 250, 53, 4, 221, 205, - 250, 53, 4, 101, 250, 53, 4, 221, 0, 250, 53, 4, 219, 7, 250, 53, 4, 218, - 227, 250, 53, 4, 218, 204, 250, 53, 4, 218, 187, 250, 53, 4, 218, 138, - 250, 53, 4, 218, 135, 250, 53, 4, 217, 114, 250, 53, 4, 217, 21, 237, - 225, 254, 53, 1, 254, 166, 237, 225, 254, 53, 1, 252, 101, 237, 225, 254, - 53, 1, 244, 91, 237, 225, 254, 53, 1, 249, 176, 237, 225, 254, 53, 1, - 243, 162, 237, 225, 254, 53, 1, 218, 233, 237, 225, 254, 53, 1, 217, 95, - 237, 225, 254, 53, 1, 243, 126, 237, 225, 254, 53, 1, 222, 46, 237, 225, - 254, 53, 1, 217, 219, 237, 225, 254, 53, 1, 236, 224, 237, 225, 254, 53, - 1, 235, 151, 237, 225, 254, 53, 1, 234, 1, 237, 225, 254, 53, 1, 231, - 103, 237, 225, 254, 53, 1, 226, 145, 237, 225, 254, 53, 1, 253, 207, 237, - 225, 254, 53, 1, 229, 198, 237, 225, 254, 53, 1, 226, 168, 237, 225, 254, - 53, 1, 228, 102, 237, 225, 254, 53, 1, 227, 174, 237, 225, 254, 53, 1, - 224, 209, 237, 225, 254, 53, 1, 222, 100, 237, 225, 254, 53, 226, 87, 55, - 237, 225, 254, 53, 54, 107, 237, 225, 254, 53, 54, 103, 237, 225, 254, - 53, 54, 160, 237, 225, 254, 53, 54, 222, 65, 237, 225, 254, 53, 54, 220, - 219, 237, 225, 254, 53, 54, 131, 242, 161, 237, 225, 254, 53, 54, 131, - 221, 231, 237, 225, 254, 53, 54, 222, 66, 221, 231, 229, 116, 1, 254, - 164, 229, 116, 1, 252, 104, 229, 116, 1, 244, 233, 229, 116, 1, 249, 64, - 229, 116, 1, 243, 162, 229, 116, 1, 218, 238, 229, 116, 1, 217, 108, 229, - 116, 1, 243, 128, 229, 116, 1, 222, 50, 229, 116, 1, 217, 220, 229, 116, - 1, 236, 246, 229, 116, 1, 235, 157, 229, 116, 1, 234, 1, 229, 116, 1, - 231, 103, 229, 116, 1, 225, 61, 229, 116, 1, 254, 191, 229, 116, 1, 229, - 198, 229, 116, 1, 226, 169, 229, 116, 1, 228, 107, 229, 116, 1, 227, 61, - 229, 116, 1, 224, 209, 229, 116, 1, 222, 105, 229, 116, 54, 107, 229, - 116, 54, 222, 65, 229, 116, 54, 220, 219, 229, 116, 54, 131, 242, 161, - 229, 116, 54, 103, 229, 116, 54, 160, 229, 116, 218, 174, 225, 54, 234, - 196, 1, 60, 234, 196, 1, 253, 204, 234, 196, 1, 245, 67, 234, 196, 1, - 250, 46, 234, 196, 1, 73, 234, 196, 1, 216, 216, 234, 196, 1, 72, 234, - 196, 1, 218, 90, 234, 196, 1, 237, 17, 234, 196, 1, 153, 234, 196, 1, - 189, 234, 196, 1, 207, 234, 196, 1, 74, 234, 196, 1, 152, 234, 196, 1, - 223, 219, 234, 196, 1, 222, 201, 234, 196, 1, 68, 234, 196, 1, 246, 74, - 234, 196, 1, 228, 163, 234, 196, 1, 198, 234, 196, 1, 221, 32, 234, 196, - 1, 254, 131, 234, 196, 1, 246, 197, 234, 196, 1, 234, 198, 234, 196, 1, - 231, 218, 234, 196, 1, 251, 202, 234, 196, 221, 87, 78, 201, 1, 60, 201, - 29, 5, 72, 201, 29, 5, 68, 201, 29, 5, 167, 152, 201, 29, 5, 73, 201, 29, - 5, 74, 201, 29, 235, 94, 78, 201, 5, 51, 227, 94, 56, 201, 5, 254, 95, - 201, 5, 219, 77, 201, 1, 175, 201, 1, 236, 149, 201, 1, 245, 0, 201, 1, - 244, 125, 201, 1, 251, 169, 201, 1, 251, 69, 201, 1, 237, 123, 201, 1, - 231, 77, 201, 1, 221, 29, 201, 1, 221, 19, 201, 1, 249, 132, 201, 1, 249, - 116, 201, 1, 231, 217, 201, 1, 222, 155, 201, 1, 222, 35, 201, 1, 249, - 207, 201, 1, 249, 36, 201, 1, 208, 201, 1, 187, 201, 1, 229, 141, 201, 1, - 252, 237, 201, 1, 252, 94, 201, 1, 196, 201, 1, 184, 201, 1, 203, 201, 1, - 235, 188, 201, 1, 219, 189, 201, 1, 225, 25, 201, 1, 223, 218, 201, 1, - 226, 177, 201, 1, 217, 114, 201, 1, 155, 201, 1, 236, 74, 201, 1, 221, 4, - 201, 5, 252, 201, 50, 201, 5, 251, 122, 201, 5, 61, 56, 201, 219, 82, - 201, 20, 107, 201, 20, 103, 201, 20, 160, 201, 20, 154, 201, 54, 222, 65, - 201, 54, 220, 219, 201, 54, 131, 242, 161, 201, 54, 131, 221, 231, 201, - 228, 197, 248, 145, 201, 228, 197, 3, 250, 221, 201, 228, 197, 250, 221, - 201, 228, 197, 250, 105, 135, 201, 228, 197, 234, 83, 201, 228, 197, 234, - 241, 201, 228, 197, 249, 167, 201, 228, 197, 51, 249, 167, 201, 228, 197, - 235, 37, 48, 224, 6, 254, 64, 1, 243, 162, 48, 224, 6, 254, 64, 1, 235, - 151, 48, 224, 6, 254, 64, 1, 243, 126, 48, 224, 6, 254, 64, 1, 234, 1, - 48, 224, 6, 254, 64, 1, 228, 102, 48, 224, 6, 254, 64, 1, 218, 233, 48, - 224, 6, 254, 64, 1, 224, 209, 48, 224, 6, 254, 64, 1, 227, 174, 48, 224, - 6, 254, 64, 1, 252, 101, 48, 224, 6, 254, 64, 1, 222, 100, 48, 224, 6, - 254, 64, 1, 226, 127, 48, 224, 6, 254, 64, 1, 236, 224, 48, 224, 6, 254, - 64, 1, 231, 103, 48, 224, 6, 254, 64, 1, 236, 134, 48, 224, 6, 254, 64, - 1, 226, 168, 48, 224, 6, 254, 64, 1, 226, 145, 48, 224, 6, 254, 64, 1, - 245, 231, 48, 224, 6, 254, 64, 1, 254, 168, 48, 224, 6, 254, 64, 1, 253, - 206, 48, 224, 6, 254, 64, 1, 249, 34, 48, 224, 6, 254, 64, 1, 244, 91, - 48, 224, 6, 254, 64, 1, 249, 176, 48, 224, 6, 254, 64, 1, 244, 118, 48, - 224, 6, 254, 64, 1, 222, 46, 48, 224, 6, 254, 64, 1, 217, 94, 48, 224, 6, - 254, 64, 1, 249, 31, 48, 224, 6, 254, 64, 1, 217, 219, 48, 224, 6, 254, - 64, 1, 222, 24, 48, 224, 6, 254, 64, 1, 222, 5, 48, 224, 6, 254, 64, 54, - 107, 48, 224, 6, 254, 64, 54, 245, 196, 48, 224, 6, 254, 64, 120, 237, - 211, 253, 216, 1, 60, 253, 216, 1, 255, 58, 253, 216, 1, 254, 93, 253, - 216, 1, 255, 17, 253, 216, 1, 254, 131, 253, 216, 1, 255, 18, 253, 216, - 1, 254, 234, 253, 216, 1, 254, 230, 253, 216, 1, 73, 253, 216, 1, 246, - 250, 253, 216, 1, 74, 253, 216, 1, 230, 127, 253, 216, 1, 72, 253, 216, - 1, 237, 255, 253, 216, 1, 68, 253, 216, 1, 220, 23, 253, 216, 1, 236, - 184, 253, 216, 1, 218, 135, 253, 216, 1, 218, 101, 253, 216, 1, 218, 110, - 253, 216, 1, 244, 191, 253, 216, 1, 244, 155, 253, 216, 1, 244, 116, 253, - 216, 1, 251, 99, 253, 216, 1, 237, 114, 253, 216, 1, 222, 87, 253, 216, - 1, 222, 22, 253, 216, 1, 249, 92, 253, 216, 1, 249, 29, 253, 216, 1, 221, - 26, 253, 216, 1, 229, 198, 253, 216, 1, 245, 231, 253, 216, 1, 252, 144, - 253, 216, 1, 252, 92, 253, 216, 1, 232, 106, 253, 216, 1, 232, 68, 253, - 216, 1, 232, 69, 253, 216, 1, 232, 141, 253, 216, 1, 231, 73, 253, 216, - 1, 231, 216, 253, 216, 1, 234, 25, 253, 216, 1, 243, 52, 253, 216, 1, - 217, 164, 253, 216, 1, 218, 25, 253, 216, 1, 219, 165, 253, 216, 1, 227, - 216, 253, 216, 1, 235, 122, 253, 216, 1, 226, 94, 253, 216, 1, 217, 92, - 253, 216, 1, 224, 246, 253, 216, 1, 217, 72, 253, 216, 1, 224, 147, 253, - 216, 1, 223, 190, 253, 216, 1, 243, 162, 253, 216, 255, 7, 78, 221, 172, - 124, 188, 104, 131, 61, 228, 196, 3, 124, 188, 104, 131, 61, 228, 196, - 235, 146, 124, 188, 104, 131, 61, 228, 196, 235, 146, 131, 61, 104, 124, - 188, 228, 196, 235, 146, 124, 227, 92, 104, 131, 227, 94, 228, 196, 235, - 146, 131, 227, 94, 104, 124, 227, 92, 228, 196, 237, 193, 229, 224, 1, - 254, 166, 237, 193, 229, 224, 1, 252, 101, 237, 193, 229, 224, 1, 244, - 91, 237, 193, 229, 224, 1, 249, 176, 237, 193, 229, 224, 1, 243, 162, - 237, 193, 229, 224, 1, 218, 233, 237, 193, 229, 224, 1, 217, 95, 237, - 193, 229, 224, 1, 243, 126, 237, 193, 229, 224, 1, 222, 46, 237, 193, - 229, 224, 1, 217, 219, 237, 193, 229, 224, 1, 236, 224, 237, 193, 229, - 224, 1, 235, 151, 237, 193, 229, 224, 1, 234, 1, 237, 193, 229, 224, 1, - 231, 103, 237, 193, 229, 224, 1, 226, 145, 237, 193, 229, 224, 1, 253, - 207, 237, 193, 229, 224, 1, 229, 198, 237, 193, 229, 224, 1, 226, 168, - 237, 193, 229, 224, 1, 228, 102, 237, 193, 229, 224, 1, 227, 174, 237, - 193, 229, 224, 1, 224, 209, 237, 193, 229, 224, 1, 222, 100, 237, 193, - 229, 224, 54, 107, 237, 193, 229, 224, 54, 103, 237, 193, 229, 224, 54, - 160, 237, 193, 229, 224, 54, 154, 237, 193, 229, 224, 54, 222, 65, 237, - 193, 229, 224, 54, 220, 219, 237, 193, 229, 224, 54, 131, 242, 161, 237, - 193, 229, 224, 54, 131, 221, 231, 237, 193, 230, 33, 1, 254, 166, 237, - 193, 230, 33, 1, 252, 101, 237, 193, 230, 33, 1, 244, 91, 237, 193, 230, - 33, 1, 249, 176, 237, 193, 230, 33, 1, 243, 162, 237, 193, 230, 33, 1, - 218, 232, 237, 193, 230, 33, 1, 217, 95, 237, 193, 230, 33, 1, 243, 126, - 237, 193, 230, 33, 1, 222, 46, 237, 193, 230, 33, 1, 217, 219, 237, 193, - 230, 33, 1, 236, 224, 237, 193, 230, 33, 1, 235, 151, 237, 193, 230, 33, - 1, 234, 0, 237, 193, 230, 33, 1, 231, 103, 237, 193, 230, 33, 1, 226, - 145, 237, 193, 230, 33, 1, 229, 198, 237, 193, 230, 33, 1, 226, 168, 237, - 193, 230, 33, 1, 224, 209, 237, 193, 230, 33, 1, 222, 100, 237, 193, 230, - 33, 54, 107, 237, 193, 230, 33, 54, 103, 237, 193, 230, 33, 54, 160, 237, - 193, 230, 33, 54, 154, 237, 193, 230, 33, 54, 222, 65, 237, 193, 230, 33, - 54, 220, 219, 237, 193, 230, 33, 54, 131, 242, 161, 237, 193, 230, 33, - 54, 131, 221, 231, 48, 172, 1, 230, 100, 60, 48, 172, 1, 218, 17, 60, 48, - 172, 1, 218, 17, 254, 234, 48, 172, 1, 230, 100, 72, 48, 172, 1, 218, 17, - 72, 48, 172, 1, 218, 17, 73, 48, 172, 1, 230, 100, 74, 48, 172, 1, 230, - 100, 230, 167, 48, 172, 1, 218, 17, 230, 167, 48, 172, 1, 230, 100, 255, - 11, 48, 172, 1, 218, 17, 255, 11, 48, 172, 1, 230, 100, 254, 233, 48, - 172, 1, 218, 17, 254, 233, 48, 172, 1, 230, 100, 254, 209, 48, 172, 1, - 218, 17, 254, 209, 48, 172, 1, 230, 100, 254, 228, 48, 172, 1, 218, 17, - 254, 228, 48, 172, 1, 230, 100, 254, 244, 48, 172, 1, 218, 17, 254, 244, - 48, 172, 1, 230, 100, 254, 232, 48, 172, 1, 230, 100, 246, 80, 48, 172, - 1, 218, 17, 246, 80, 48, 172, 1, 230, 100, 253, 212, 48, 172, 1, 218, 17, - 253, 212, 48, 172, 1, 230, 100, 254, 216, 48, 172, 1, 218, 17, 254, 216, - 48, 172, 1, 230, 100, 254, 226, 48, 172, 1, 218, 17, 254, 226, 48, 172, - 1, 230, 100, 230, 166, 48, 172, 1, 218, 17, 230, 166, 48, 172, 1, 230, - 100, 254, 175, 48, 172, 1, 218, 17, 254, 175, 48, 172, 1, 230, 100, 254, - 225, 48, 172, 1, 230, 100, 246, 207, 48, 172, 1, 230, 100, 246, 205, 48, - 172, 1, 230, 100, 254, 131, 48, 172, 1, 230, 100, 254, 223, 48, 172, 1, - 218, 17, 254, 223, 48, 172, 1, 230, 100, 246, 180, 48, 172, 1, 218, 17, - 246, 180, 48, 172, 1, 230, 100, 246, 194, 48, 172, 1, 218, 17, 246, 194, - 48, 172, 1, 230, 100, 246, 169, 48, 172, 1, 218, 17, 246, 169, 48, 172, - 1, 218, 17, 254, 123, 48, 172, 1, 230, 100, 246, 185, 48, 172, 1, 218, - 17, 254, 222, 48, 172, 1, 230, 100, 246, 162, 48, 172, 1, 230, 100, 230, - 120, 48, 172, 1, 230, 100, 242, 67, 48, 172, 1, 230, 100, 247, 0, 48, - 172, 1, 218, 17, 247, 0, 48, 172, 1, 230, 100, 254, 69, 48, 172, 1, 218, - 17, 254, 69, 48, 172, 1, 230, 100, 237, 158, 48, 172, 1, 218, 17, 237, - 158, 48, 172, 1, 230, 100, 230, 106, 48, 172, 1, 218, 17, 230, 106, 48, - 172, 1, 230, 100, 254, 67, 48, 172, 1, 218, 17, 254, 67, 48, 172, 1, 230, - 100, 254, 221, 48, 172, 1, 230, 100, 254, 13, 48, 172, 1, 230, 100, 254, - 220, 48, 172, 1, 230, 100, 254, 7, 48, 172, 1, 218, 17, 254, 7, 48, 172, - 1, 230, 100, 246, 133, 48, 172, 1, 218, 17, 246, 133, 48, 172, 1, 230, - 100, 253, 244, 48, 172, 1, 218, 17, 253, 244, 48, 172, 1, 230, 100, 254, - 217, 48, 172, 1, 218, 17, 254, 217, 48, 172, 1, 230, 100, 230, 92, 48, - 172, 1, 230, 100, 252, 187, 227, 11, 20, 107, 227, 11, 20, 103, 227, 11, - 20, 160, 227, 11, 20, 154, 227, 11, 20, 174, 227, 11, 20, 182, 227, 11, - 20, 191, 227, 11, 20, 185, 227, 11, 20, 190, 227, 11, 54, 222, 65, 227, - 11, 54, 220, 219, 227, 11, 54, 221, 245, 227, 11, 54, 245, 119, 227, 11, - 54, 245, 196, 227, 11, 54, 224, 69, 227, 11, 54, 225, 38, 227, 11, 54, - 246, 227, 227, 11, 54, 232, 27, 227, 11, 54, 131, 242, 161, 227, 11, 54, - 124, 242, 161, 227, 11, 54, 148, 242, 161, 227, 11, 54, 245, 116, 242, - 161, 227, 11, 54, 245, 170, 242, 161, 227, 11, 54, 224, 82, 242, 161, - 227, 11, 54, 225, 43, 242, 161, 227, 11, 54, 246, 235, 242, 161, 227, 11, - 54, 232, 31, 242, 161, 227, 11, 245, 108, 131, 243, 194, 227, 11, 245, - 108, 131, 228, 89, 227, 11, 245, 108, 131, 221, 251, 227, 11, 245, 108, - 124, 221, 249, 194, 5, 251, 146, 194, 5, 254, 95, 194, 5, 219, 77, 194, - 1, 60, 194, 1, 255, 58, 194, 1, 72, 194, 1, 237, 255, 194, 1, 68, 194, 1, - 220, 23, 194, 1, 73, 194, 1, 254, 196, 194, 1, 74, 194, 1, 253, 232, 194, - 1, 175, 194, 1, 236, 149, 194, 1, 245, 0, 194, 1, 244, 125, 194, 1, 232, - 115, 194, 1, 251, 169, 194, 1, 251, 69, 194, 1, 237, 123, 194, 1, 237, - 103, 194, 1, 231, 77, 194, 1, 221, 29, 194, 1, 221, 19, 194, 1, 249, 132, - 194, 1, 249, 121, 194, 1, 249, 116, 194, 1, 227, 151, 194, 1, 231, 217, - 194, 1, 222, 155, 194, 1, 222, 35, 194, 1, 249, 207, 194, 1, 249, 36, - 194, 1, 208, 194, 1, 187, 194, 1, 229, 141, 194, 1, 252, 237, 194, 1, - 252, 94, 194, 1, 196, 194, 1, 184, 194, 1, 203, 194, 1, 235, 188, 194, 1, - 219, 189, 194, 1, 225, 25, 194, 1, 223, 218, 194, 1, 226, 177, 194, 1, - 155, 194, 29, 5, 255, 58, 194, 29, 5, 72, 194, 29, 5, 237, 255, 194, 29, - 5, 68, 194, 29, 5, 220, 23, 194, 29, 5, 73, 194, 29, 5, 254, 196, 194, - 29, 5, 74, 194, 29, 5, 253, 232, 194, 5, 219, 82, 194, 5, 231, 112, 194, - 255, 7, 55, 194, 246, 171, 55, 194, 54, 55, 194, 226, 87, 78, 194, 51, - 226, 87, 78, 194, 249, 167, 194, 51, 249, 167, 15, 5, 60, 15, 5, 112, 27, - 60, 15, 5, 112, 27, 252, 228, 15, 5, 112, 27, 244, 229, 222, 59, 15, 5, - 112, 27, 155, 15, 5, 112, 27, 238, 1, 15, 5, 112, 27, 235, 173, 244, 3, - 15, 5, 112, 27, 233, 62, 15, 5, 112, 27, 226, 165, 15, 5, 255, 60, 15, 5, - 255, 11, 15, 5, 255, 12, 27, 254, 5, 15, 5, 255, 12, 27, 247, 100, 244, - 3, 15, 5, 255, 12, 27, 244, 240, 15, 5, 255, 12, 27, 244, 229, 222, 59, - 15, 5, 255, 12, 27, 155, 15, 5, 255, 12, 27, 238, 2, 244, 3, 15, 5, 255, - 12, 27, 237, 231, 15, 5, 255, 12, 27, 235, 174, 15, 5, 255, 12, 27, 224, - 231, 15, 5, 255, 12, 27, 105, 88, 105, 88, 68, 15, 5, 255, 12, 244, 3, - 15, 5, 255, 9, 15, 5, 255, 10, 27, 252, 216, 15, 5, 255, 10, 27, 244, - 229, 222, 59, 15, 5, 255, 10, 27, 234, 26, 88, 246, 197, 15, 5, 255, 10, - 27, 225, 23, 15, 5, 255, 10, 27, 222, 130, 15, 5, 254, 244, 15, 5, 254, - 182, 15, 5, 254, 183, 27, 246, 143, 15, 5, 254, 183, 27, 224, 203, 88, - 244, 81, 15, 5, 254, 175, 15, 5, 254, 176, 27, 254, 175, 15, 5, 254, 176, - 27, 248, 229, 15, 5, 254, 176, 27, 244, 81, 15, 5, 254, 176, 27, 155, 15, - 5, 254, 176, 27, 236, 251, 15, 5, 254, 176, 27, 236, 113, 15, 5, 254, - 176, 27, 224, 246, 15, 5, 254, 176, 27, 220, 30, 15, 5, 254, 172, 15, 5, - 254, 166, 15, 5, 254, 137, 15, 5, 254, 138, 27, 224, 246, 15, 5, 254, - 131, 15, 5, 254, 132, 104, 254, 131, 15, 5, 254, 132, 148, 221, 176, 15, - 5, 254, 132, 88, 232, 228, 230, 110, 254, 132, 88, 232, 227, 15, 5, 254, - 132, 88, 232, 228, 223, 226, 15, 5, 254, 107, 15, 5, 254, 88, 15, 5, 254, - 61, 15, 5, 254, 62, 27, 235, 247, 15, 5, 254, 35, 15, 5, 254, 12, 15, 5, - 254, 7, 15, 5, 254, 8, 217, 38, 222, 59, 15, 5, 254, 8, 236, 254, 222, - 59, 15, 5, 254, 8, 104, 254, 8, 220, 254, 104, 220, 254, 220, 254, 104, - 220, 254, 229, 246, 15, 5, 254, 8, 104, 254, 8, 104, 254, 7, 15, 5, 254, - 8, 104, 254, 8, 104, 254, 8, 250, 95, 254, 8, 104, 254, 8, 104, 254, 7, - 15, 5, 254, 5, 15, 5, 254, 3, 15, 5, 252, 237, 15, 5, 252, 228, 15, 5, - 252, 225, 15, 5, 252, 223, 15, 5, 252, 217, 15, 5, 252, 218, 104, 252, - 217, 15, 5, 252, 216, 15, 5, 135, 15, 5, 252, 200, 15, 5, 252, 84, 15, 5, - 252, 85, 27, 60, 15, 5, 252, 85, 27, 244, 220, 15, 5, 252, 85, 27, 238, - 2, 244, 3, 15, 5, 251, 248, 15, 5, 251, 249, 104, 251, 249, 255, 11, 15, - 5, 251, 249, 104, 251, 249, 220, 87, 15, 5, 251, 249, 250, 95, 251, 248, - 15, 5, 251, 237, 15, 5, 251, 238, 104, 251, 237, 15, 5, 251, 228, 15, 5, - 251, 227, 15, 5, 249, 207, 15, 5, 249, 198, 15, 5, 249, 199, 236, 91, 27, - 112, 88, 234, 57, 15, 5, 249, 199, 236, 91, 27, 254, 137, 15, 5, 249, - 199, 236, 91, 27, 252, 216, 15, 5, 249, 199, 236, 91, 27, 252, 84, 15, 5, - 249, 199, 236, 91, 27, 245, 0, 15, 5, 249, 199, 236, 91, 27, 245, 1, 88, - 234, 57, 15, 5, 249, 199, 236, 91, 27, 244, 103, 15, 5, 249, 199, 236, - 91, 27, 244, 87, 15, 5, 249, 199, 236, 91, 27, 244, 11, 15, 5, 249, 199, - 236, 91, 27, 155, 15, 5, 249, 199, 236, 91, 27, 237, 156, 15, 5, 249, - 199, 236, 91, 27, 237, 157, 88, 234, 231, 15, 5, 249, 199, 236, 91, 27, - 236, 240, 15, 5, 249, 199, 236, 91, 27, 235, 188, 15, 5, 249, 199, 236, - 91, 27, 234, 231, 15, 5, 249, 199, 236, 91, 27, 234, 232, 88, 234, 56, - 15, 5, 249, 199, 236, 91, 27, 234, 219, 15, 5, 249, 199, 236, 91, 27, - 232, 141, 15, 5, 249, 199, 236, 91, 27, 229, 247, 88, 229, 246, 15, 5, - 249, 199, 236, 91, 27, 224, 140, 15, 5, 249, 199, 236, 91, 27, 222, 130, - 15, 5, 249, 199, 236, 91, 27, 220, 125, 88, 244, 87, 15, 5, 249, 199, - 236, 91, 27, 220, 30, 15, 5, 249, 175, 15, 5, 249, 156, 15, 5, 249, 155, - 15, 5, 249, 154, 15, 5, 249, 15, 15, 5, 248, 255, 15, 5, 248, 230, 15, 5, - 248, 231, 27, 224, 246, 15, 5, 248, 229, 15, 5, 248, 219, 15, 5, 248, - 220, 236, 209, 105, 244, 4, 248, 202, 15, 5, 248, 202, 15, 5, 247, 111, - 15, 5, 247, 112, 104, 247, 111, 15, 5, 247, 112, 244, 3, 15, 5, 247, 112, - 224, 228, 15, 5, 247, 109, 15, 5, 247, 110, 27, 246, 130, 15, 5, 247, - 108, 15, 5, 247, 107, 15, 5, 247, 106, 15, 5, 247, 105, 15, 5, 247, 101, - 15, 5, 247, 99, 15, 5, 247, 100, 244, 3, 15, 5, 247, 100, 244, 4, 244, 3, - 15, 5, 247, 98, 15, 5, 247, 91, 15, 5, 73, 15, 5, 178, 27, 229, 246, 15, - 5, 178, 104, 178, 231, 104, 104, 231, 103, 15, 5, 247, 17, 15, 5, 247, - 18, 27, 112, 88, 243, 214, 88, 249, 207, 15, 5, 247, 18, 27, 244, 220, - 15, 5, 247, 18, 27, 233, 196, 15, 5, 247, 18, 27, 226, 156, 15, 5, 247, - 18, 27, 224, 246, 15, 5, 247, 18, 27, 68, 15, 5, 246, 252, 15, 5, 246, - 242, 15, 5, 246, 217, 15, 5, 246, 197, 15, 5, 246, 198, 27, 244, 228, 15, - 5, 246, 198, 27, 244, 229, 222, 59, 15, 5, 246, 198, 27, 234, 25, 15, 5, - 246, 198, 250, 95, 246, 197, 15, 5, 246, 198, 230, 110, 246, 197, 15, 5, - 246, 198, 223, 226, 15, 5, 246, 145, 15, 5, 246, 143, 15, 5, 246, 130, - 15, 5, 246, 78, 15, 5, 246, 79, 27, 60, 15, 5, 246, 79, 27, 112, 88, 235, - 162, 15, 5, 246, 79, 27, 112, 88, 235, 163, 27, 235, 162, 15, 5, 246, 79, - 27, 254, 131, 15, 5, 246, 79, 27, 252, 228, 15, 5, 246, 79, 27, 247, 100, - 244, 3, 15, 5, 246, 79, 27, 247, 100, 244, 4, 244, 3, 15, 5, 246, 79, 27, - 155, 15, 5, 246, 79, 27, 243, 214, 244, 3, 15, 5, 246, 79, 27, 238, 2, - 244, 3, 15, 5, 246, 79, 27, 236, 208, 15, 5, 246, 79, 27, 236, 209, 223, - 226, 15, 5, 246, 79, 27, 236, 5, 15, 5, 246, 79, 27, 235, 188, 15, 5, - 246, 79, 27, 235, 163, 27, 235, 162, 15, 5, 246, 79, 27, 235, 67, 15, 5, - 246, 79, 27, 234, 231, 15, 5, 246, 79, 27, 220, 124, 15, 5, 246, 79, 27, - 220, 115, 15, 5, 245, 0, 15, 5, 245, 1, 244, 3, 15, 5, 244, 254, 15, 5, - 244, 255, 27, 112, 88, 249, 208, 88, 155, 15, 5, 244, 255, 27, 112, 88, - 155, 15, 5, 244, 255, 27, 112, 88, 238, 1, 15, 5, 244, 255, 27, 255, 10, - 222, 60, 88, 222, 147, 15, 5, 244, 255, 27, 254, 131, 15, 5, 244, 255, - 27, 254, 7, 15, 5, 244, 255, 27, 254, 6, 88, 244, 240, 15, 5, 244, 255, - 27, 252, 228, 15, 5, 244, 255, 27, 252, 201, 88, 203, 15, 5, 244, 255, - 27, 251, 228, 15, 5, 244, 255, 27, 251, 229, 88, 203, 15, 5, 244, 255, - 27, 249, 207, 15, 5, 244, 255, 27, 249, 15, 15, 5, 244, 255, 27, 248, - 231, 27, 224, 246, 15, 5, 244, 255, 27, 247, 109, 15, 5, 244, 255, 27, - 246, 217, 15, 5, 244, 255, 27, 246, 218, 88, 235, 188, 15, 5, 244, 255, - 27, 246, 197, 15, 5, 244, 255, 27, 246, 198, 27, 244, 229, 222, 59, 15, - 5, 244, 255, 27, 244, 229, 222, 59, 15, 5, 244, 255, 27, 244, 220, 15, 5, - 244, 255, 27, 244, 103, 15, 5, 244, 255, 27, 244, 101, 15, 5, 244, 255, - 27, 244, 102, 88, 60, 15, 5, 244, 255, 27, 244, 88, 88, 223, 103, 15, 5, - 244, 255, 27, 243, 214, 88, 234, 232, 88, 246, 130, 15, 5, 244, 255, 27, - 243, 197, 15, 5, 244, 255, 27, 243, 198, 88, 235, 188, 15, 5, 244, 255, - 27, 243, 113, 88, 235, 67, 15, 5, 244, 255, 27, 242, 169, 15, 5, 244, - 255, 27, 238, 2, 244, 3, 15, 5, 244, 255, 27, 237, 146, 88, 242, 174, 88, - 254, 7, 15, 5, 244, 255, 27, 236, 240, 15, 5, 244, 255, 27, 236, 208, 15, - 5, 244, 255, 27, 236, 110, 15, 5, 244, 255, 27, 236, 111, 88, 235, 162, - 15, 5, 244, 255, 27, 236, 6, 88, 254, 131, 15, 5, 244, 255, 27, 235, 188, - 15, 5, 244, 255, 27, 234, 26, 88, 246, 197, 15, 5, 244, 255, 27, 233, - 196, 15, 5, 244, 255, 27, 231, 103, 15, 5, 244, 255, 27, 231, 104, 104, - 231, 103, 15, 5, 244, 255, 27, 187, 15, 5, 244, 255, 27, 226, 156, 15, 5, - 244, 255, 27, 226, 131, 15, 5, 244, 255, 27, 224, 246, 15, 5, 244, 255, - 27, 224, 247, 88, 220, 240, 15, 5, 244, 255, 27, 224, 219, 15, 5, 244, - 255, 27, 223, 74, 15, 5, 244, 255, 27, 222, 130, 15, 5, 244, 255, 27, 68, - 15, 5, 244, 255, 27, 220, 115, 15, 5, 244, 255, 27, 220, 116, 88, 247, - 111, 15, 5, 244, 255, 104, 244, 254, 15, 5, 244, 249, 15, 5, 244, 250, - 250, 95, 244, 249, 15, 5, 244, 247, 15, 5, 244, 248, 104, 244, 248, 244, - 221, 104, 244, 220, 15, 5, 244, 240, 15, 5, 244, 241, 244, 248, 104, 244, - 248, 244, 221, 104, 244, 220, 15, 5, 244, 239, 15, 5, 244, 237, 15, 5, - 244, 230, 15, 5, 244, 228, 15, 5, 244, 229, 222, 59, 15, 5, 244, 229, - 104, 244, 228, 15, 5, 244, 229, 250, 95, 244, 228, 15, 5, 244, 220, 15, - 5, 244, 219, 15, 5, 244, 215, 15, 5, 244, 166, 15, 5, 244, 167, 27, 235, - 247, 15, 5, 244, 103, 15, 5, 244, 104, 27, 73, 15, 5, 244, 104, 27, 68, - 15, 5, 244, 104, 250, 95, 244, 103, 15, 5, 244, 101, 15, 5, 244, 102, - 104, 244, 101, 15, 5, 244, 102, 250, 95, 244, 101, 15, 5, 244, 99, 15, 5, - 244, 87, 15, 5, 244, 88, 244, 3, 15, 5, 244, 85, 15, 5, 244, 86, 27, 112, - 88, 238, 1, 15, 5, 244, 86, 27, 244, 229, 222, 59, 15, 5, 244, 86, 27, - 238, 1, 15, 5, 244, 86, 27, 234, 232, 88, 238, 1, 15, 5, 244, 86, 27, - 187, 15, 5, 244, 83, 15, 5, 244, 81, 15, 5, 244, 82, 250, 95, 244, 81, - 15, 5, 244, 82, 27, 252, 228, 15, 5, 244, 82, 27, 222, 130, 15, 5, 244, - 82, 222, 59, 15, 5, 244, 17, 15, 5, 244, 18, 250, 95, 244, 17, 15, 5, - 244, 15, 15, 5, 244, 16, 27, 236, 240, 15, 5, 244, 16, 27, 236, 241, 27, - 238, 2, 244, 3, 15, 5, 244, 16, 27, 231, 103, 15, 5, 244, 16, 27, 226, - 157, 88, 220, 253, 15, 5, 244, 16, 244, 3, 15, 5, 244, 11, 15, 5, 244, - 12, 27, 112, 88, 235, 247, 15, 5, 244, 12, 27, 235, 247, 15, 5, 244, 12, - 104, 244, 12, 234, 225, 15, 5, 244, 7, 15, 5, 244, 5, 15, 5, 244, 6, 27, - 224, 246, 15, 5, 243, 253, 15, 5, 243, 252, 15, 5, 243, 249, 15, 5, 243, - 248, 15, 5, 155, 15, 5, 243, 214, 222, 59, 15, 5, 243, 214, 244, 3, 15, - 5, 243, 197, 15, 5, 243, 112, 15, 5, 243, 113, 27, 254, 7, 15, 5, 243, - 113, 27, 254, 5, 15, 5, 243, 113, 27, 252, 228, 15, 5, 243, 113, 27, 248, - 202, 15, 5, 243, 113, 27, 244, 247, 15, 5, 243, 113, 27, 236, 104, 15, 5, - 243, 113, 27, 231, 103, 15, 5, 243, 113, 27, 224, 246, 15, 5, 243, 113, - 27, 68, 15, 5, 242, 173, 15, 5, 242, 169, 15, 5, 242, 170, 27, 254, 131, - 15, 5, 242, 170, 27, 243, 197, 15, 5, 242, 170, 27, 236, 208, 15, 5, 242, - 170, 27, 235, 29, 15, 5, 242, 170, 27, 220, 115, 15, 5, 242, 166, 15, 5, - 72, 15, 5, 242, 107, 60, 15, 5, 242, 69, 15, 5, 238, 29, 15, 5, 238, 30, - 104, 238, 30, 251, 228, 15, 5, 238, 30, 104, 238, 30, 223, 226, 15, 5, - 238, 4, 15, 5, 238, 1, 15, 5, 238, 2, 248, 255, 15, 5, 238, 2, 227, 147, - 15, 5, 238, 2, 104, 238, 2, 224, 205, 104, 224, 205, 220, 116, 104, 220, - 115, 15, 5, 238, 2, 244, 3, 15, 5, 237, 249, 15, 5, 237, 250, 27, 244, - 229, 222, 59, 15, 5, 237, 248, 15, 5, 237, 238, 15, 5, 237, 239, 27, 222, - 130, 15, 5, 237, 239, 250, 95, 237, 238, 15, 5, 237, 239, 230, 110, 237, - 238, 15, 5, 237, 239, 223, 226, 15, 5, 237, 231, 15, 5, 237, 223, 15, 5, - 237, 156, 15, 5, 237, 145, 15, 5, 175, 15, 5, 206, 27, 60, 15, 5, 206, - 27, 254, 244, 15, 5, 206, 27, 254, 245, 88, 236, 5, 15, 5, 206, 27, 254, - 5, 15, 5, 206, 27, 252, 228, 15, 5, 206, 27, 252, 216, 15, 5, 206, 27, - 135, 15, 5, 206, 27, 252, 84, 15, 5, 206, 27, 246, 143, 15, 5, 206, 27, - 246, 130, 15, 5, 206, 27, 245, 0, 15, 5, 206, 27, 244, 240, 15, 5, 206, - 27, 244, 229, 222, 59, 15, 5, 206, 27, 244, 220, 15, 5, 206, 27, 244, - 221, 88, 225, 24, 88, 60, 15, 5, 206, 27, 244, 103, 15, 5, 206, 27, 244, - 87, 15, 5, 206, 27, 244, 82, 88, 226, 131, 15, 5, 206, 27, 244, 82, 250, - 95, 244, 81, 15, 5, 206, 27, 244, 17, 15, 5, 206, 27, 243, 252, 15, 5, - 206, 27, 238, 1, 15, 5, 206, 27, 237, 238, 15, 5, 206, 27, 236, 240, 15, - 5, 206, 27, 236, 113, 15, 5, 206, 27, 236, 110, 15, 5, 206, 27, 235, 67, - 15, 5, 206, 27, 234, 231, 15, 5, 206, 27, 234, 25, 15, 5, 206, 27, 234, - 26, 88, 247, 111, 15, 5, 206, 27, 234, 26, 88, 244, 103, 15, 5, 206, 27, - 234, 26, 88, 222, 87, 15, 5, 206, 27, 233, 196, 15, 5, 206, 27, 233, 197, - 88, 231, 98, 15, 5, 206, 27, 232, 141, 15, 5, 206, 27, 231, 103, 15, 5, - 206, 27, 229, 108, 15, 5, 206, 27, 227, 22, 15, 5, 206, 27, 226, 177, 15, - 5, 206, 27, 226, 131, 15, 5, 206, 27, 225, 25, 15, 5, 206, 27, 224, 246, - 15, 5, 206, 27, 224, 219, 15, 5, 206, 27, 224, 170, 15, 5, 206, 27, 224, - 132, 15, 5, 206, 27, 223, 81, 15, 5, 206, 27, 222, 112, 15, 5, 206, 27, - 68, 15, 5, 206, 27, 220, 124, 15, 5, 206, 27, 220, 115, 15, 5, 206, 27, - 220, 90, 27, 187, 15, 5, 206, 27, 220, 30, 15, 5, 206, 27, 217, 42, 15, - 5, 237, 6, 15, 5, 237, 7, 250, 95, 237, 6, 15, 5, 236, 255, 15, 5, 236, - 253, 15, 5, 236, 251, 15, 5, 236, 250, 15, 5, 236, 248, 15, 5, 236, 249, - 104, 236, 248, 15, 5, 236, 240, 15, 5, 236, 241, 27, 238, 2, 244, 3, 15, - 5, 236, 236, 15, 5, 236, 237, 27, 252, 228, 15, 5, 236, 237, 250, 95, - 236, 236, 15, 5, 236, 235, 15, 5, 236, 234, 15, 5, 236, 208, 15, 5, 236, - 209, 235, 175, 27, 105, 104, 235, 175, 27, 68, 15, 5, 236, 209, 104, 236, - 209, 235, 175, 27, 105, 104, 235, 175, 27, 68, 15, 5, 236, 160, 15, 5, - 236, 113, 15, 5, 236, 114, 27, 252, 228, 15, 5, 236, 114, 27, 68, 15, 5, - 236, 114, 27, 220, 115, 15, 5, 236, 110, 15, 5, 236, 104, 15, 5, 236, 93, - 15, 5, 236, 92, 15, 5, 236, 90, 15, 5, 236, 91, 104, 236, 90, 15, 5, 236, - 7, 15, 5, 236, 8, 104, 243, 113, 27, 254, 6, 236, 8, 104, 243, 113, 27, - 254, 5, 15, 5, 236, 5, 15, 5, 236, 3, 15, 5, 236, 4, 219, 177, 17, 15, 5, - 236, 2, 15, 5, 236, 0, 15, 5, 236, 1, 244, 3, 15, 5, 235, 255, 15, 5, - 235, 247, 15, 5, 235, 248, 230, 110, 235, 247, 15, 5, 235, 242, 15, 5, - 235, 225, 15, 5, 235, 188, 15, 5, 235, 174, 15, 5, 235, 175, 27, 60, 15, - 5, 235, 175, 27, 112, 88, 249, 208, 88, 155, 15, 5, 235, 175, 27, 112, - 88, 244, 220, 15, 5, 235, 175, 27, 112, 88, 235, 162, 15, 5, 235, 175, - 27, 254, 175, 15, 5, 235, 175, 27, 254, 131, 15, 5, 235, 175, 27, 254, 8, - 217, 38, 222, 59, 15, 5, 235, 175, 27, 252, 228, 15, 5, 235, 175, 27, - 252, 84, 15, 5, 235, 175, 27, 249, 156, 15, 5, 235, 175, 27, 246, 197, - 15, 5, 235, 175, 27, 245, 0, 15, 5, 235, 175, 27, 244, 220, 15, 5, 235, - 175, 27, 244, 11, 15, 5, 235, 175, 27, 244, 12, 88, 244, 11, 15, 5, 235, - 175, 27, 155, 15, 5, 235, 175, 27, 243, 197, 15, 5, 235, 175, 27, 243, - 113, 27, 231, 103, 15, 5, 235, 175, 27, 238, 2, 244, 3, 15, 5, 235, 175, - 27, 237, 238, 15, 5, 235, 175, 27, 237, 239, 88, 155, 15, 5, 235, 175, - 27, 237, 239, 88, 234, 231, 15, 5, 235, 175, 27, 236, 113, 15, 5, 235, - 175, 27, 236, 104, 15, 5, 235, 175, 27, 236, 5, 15, 5, 235, 175, 27, 236, - 0, 15, 5, 235, 175, 27, 236, 1, 88, 243, 113, 88, 60, 15, 5, 235, 175, - 27, 235, 174, 15, 5, 235, 175, 27, 235, 29, 15, 5, 235, 175, 27, 234, - 231, 15, 5, 235, 175, 27, 234, 221, 15, 5, 235, 175, 27, 234, 25, 15, 5, - 235, 175, 27, 234, 26, 88, 246, 197, 15, 5, 235, 175, 27, 233, 62, 15, 5, - 235, 175, 27, 232, 141, 15, 5, 235, 175, 27, 224, 247, 88, 223, 74, 15, - 5, 235, 175, 27, 224, 203, 88, 244, 82, 88, 246, 143, 15, 5, 235, 175, - 27, 224, 203, 88, 244, 82, 222, 59, 15, 5, 235, 175, 27, 224, 168, 15, 5, - 235, 175, 27, 224, 169, 88, 224, 168, 15, 5, 235, 175, 27, 223, 74, 15, - 5, 235, 175, 27, 222, 141, 15, 5, 235, 175, 27, 222, 130, 15, 5, 235, - 175, 27, 222, 88, 88, 112, 88, 223, 104, 88, 208, 15, 5, 235, 175, 27, - 68, 15, 5, 235, 175, 27, 105, 88, 60, 15, 5, 235, 175, 27, 105, 88, 105, - 88, 68, 15, 5, 235, 175, 27, 220, 125, 88, 254, 7, 15, 5, 235, 175, 27, - 220, 115, 15, 5, 235, 175, 27, 220, 30, 15, 5, 235, 175, 223, 226, 15, 5, - 235, 172, 15, 5, 235, 173, 27, 224, 246, 15, 5, 235, 173, 27, 224, 247, - 88, 223, 74, 15, 5, 235, 173, 244, 3, 15, 5, 235, 173, 244, 4, 104, 235, - 173, 244, 4, 224, 246, 15, 5, 235, 169, 15, 5, 235, 162, 15, 5, 235, 163, - 27, 235, 162, 15, 5, 235, 160, 15, 5, 235, 161, 27, 235, 247, 15, 5, 235, - 161, 27, 235, 248, 88, 227, 22, 15, 5, 235, 67, 15, 5, 235, 54, 15, 5, - 235, 46, 15, 5, 235, 29, 15, 5, 234, 231, 15, 5, 234, 232, 27, 252, 228, - 15, 5, 234, 229, 15, 5, 234, 230, 27, 254, 175, 15, 5, 234, 230, 27, 252, - 228, 15, 5, 234, 230, 27, 246, 130, 15, 5, 234, 230, 27, 246, 131, 222, - 59, 15, 5, 234, 230, 27, 244, 229, 222, 59, 15, 5, 234, 230, 27, 243, - 113, 27, 252, 228, 15, 5, 234, 230, 27, 237, 238, 15, 5, 234, 230, 27, - 236, 253, 15, 5, 234, 230, 27, 236, 251, 15, 5, 234, 230, 27, 236, 252, - 88, 254, 7, 15, 5, 234, 230, 27, 236, 113, 15, 5, 234, 230, 27, 235, 189, - 88, 254, 7, 15, 5, 234, 230, 27, 235, 174, 15, 5, 234, 230, 27, 234, 26, - 88, 246, 197, 15, 5, 234, 230, 27, 232, 141, 15, 5, 234, 230, 27, 231, - 144, 15, 5, 234, 230, 27, 224, 141, 88, 254, 7, 15, 5, 234, 230, 27, 224, - 124, 88, 251, 248, 15, 5, 234, 230, 27, 220, 253, 15, 5, 234, 230, 222, - 59, 15, 5, 234, 230, 250, 95, 234, 229, 15, 5, 234, 230, 230, 110, 234, - 229, 15, 5, 234, 230, 223, 226, 15, 5, 234, 230, 224, 228, 15, 5, 234, - 228, 15, 5, 234, 225, 15, 5, 234, 226, 104, 234, 225, 15, 5, 234, 226, - 230, 110, 234, 225, 15, 5, 234, 226, 224, 228, 15, 5, 234, 224, 15, 5, - 234, 221, 15, 5, 234, 219, 15, 5, 234, 220, 104, 234, 219, 15, 5, 234, - 220, 104, 234, 220, 244, 221, 104, 244, 220, 15, 5, 196, 15, 5, 234, 120, - 27, 222, 130, 15, 5, 234, 120, 244, 3, 15, 5, 234, 119, 15, 5, 234, 106, - 15, 5, 234, 74, 15, 5, 234, 57, 15, 5, 234, 56, 15, 5, 234, 25, 15, 5, - 233, 244, 15, 5, 233, 196, 15, 5, 233, 159, 15, 5, 233, 99, 15, 5, 233, - 100, 104, 233, 99, 15, 5, 233, 92, 15, 5, 233, 93, 244, 3, 15, 5, 233, - 78, 15, 5, 233, 65, 15, 5, 233, 62, 15, 5, 233, 63, 27, 60, 15, 5, 233, - 63, 27, 235, 247, 15, 5, 233, 63, 27, 217, 114, 15, 5, 233, 63, 104, 233, - 62, 15, 5, 233, 63, 104, 233, 63, 27, 112, 88, 208, 15, 5, 233, 63, 250, - 95, 233, 62, 15, 5, 233, 60, 15, 5, 233, 61, 27, 60, 15, 5, 233, 61, 27, - 112, 88, 249, 15, 15, 5, 233, 61, 27, 249, 15, 15, 5, 233, 61, 244, 3, - 15, 5, 208, 15, 5, 232, 237, 15, 5, 232, 227, 15, 5, 232, 228, 237, 169, - 15, 5, 232, 228, 27, 224, 171, 222, 59, 15, 5, 232, 228, 230, 110, 232, - 227, 15, 5, 232, 226, 15, 5, 232, 222, 231, 90, 15, 5, 232, 221, 15, 5, - 232, 220, 15, 5, 232, 141, 15, 5, 232, 142, 27, 60, 15, 5, 232, 142, 27, - 220, 115, 15, 5, 232, 142, 224, 228, 15, 5, 232, 62, 15, 5, 232, 63, 27, - 73, 15, 5, 232, 61, 15, 5, 232, 34, 15, 5, 232, 35, 27, 244, 229, 222, - 59, 15, 5, 232, 35, 27, 244, 221, 88, 244, 229, 222, 59, 15, 5, 232, 32, - 15, 5, 232, 33, 27, 254, 131, 15, 5, 232, 33, 27, 254, 7, 15, 5, 232, 33, - 27, 254, 8, 88, 254, 7, 15, 5, 232, 33, 27, 244, 11, 15, 5, 232, 33, 27, - 234, 26, 88, 244, 229, 222, 59, 15, 5, 232, 33, 27, 232, 141, 15, 5, 232, - 33, 27, 231, 103, 15, 5, 232, 33, 27, 224, 246, 15, 5, 232, 33, 27, 224, - 247, 88, 112, 254, 131, 15, 5, 232, 33, 27, 224, 247, 88, 254, 7, 15, 5, - 232, 33, 27, 224, 247, 88, 254, 8, 88, 254, 7, 15, 5, 232, 33, 27, 220, - 125, 88, 254, 7, 15, 5, 232, 33, 27, 220, 30, 15, 5, 232, 22, 15, 5, 231, - 144, 15, 5, 231, 117, 15, 5, 231, 103, 15, 5, 231, 104, 235, 173, 27, - 244, 220, 15, 5, 231, 104, 235, 173, 27, 234, 57, 15, 5, 231, 104, 235, - 173, 27, 226, 156, 15, 5, 231, 104, 235, 173, 27, 226, 157, 104, 231, - 104, 235, 173, 27, 226, 156, 15, 5, 231, 104, 235, 173, 27, 220, 30, 15, - 5, 231, 104, 222, 59, 15, 5, 231, 104, 104, 231, 103, 15, 5, 231, 104, - 250, 95, 231, 103, 15, 5, 231, 104, 250, 95, 231, 104, 235, 173, 104, - 235, 172, 15, 5, 231, 98, 15, 5, 231, 99, 255, 10, 27, 254, 3, 15, 5, - 231, 99, 255, 10, 27, 252, 84, 15, 5, 231, 99, 255, 10, 27, 247, 107, 15, - 5, 231, 99, 255, 10, 27, 244, 11, 15, 5, 231, 99, 255, 10, 27, 238, 2, - 244, 3, 15, 5, 231, 99, 255, 10, 27, 236, 251, 15, 5, 231, 99, 255, 10, - 27, 235, 188, 15, 5, 231, 99, 255, 10, 27, 232, 141, 15, 5, 231, 99, 255, - 10, 27, 224, 121, 15, 5, 231, 99, 255, 10, 27, 220, 124, 15, 5, 231, 99, - 236, 91, 27, 252, 84, 15, 5, 231, 99, 236, 91, 27, 252, 85, 68, 15, 5, - 187, 15, 5, 230, 37, 15, 5, 230, 12, 15, 5, 229, 246, 15, 5, 229, 152, - 15, 5, 229, 108, 15, 5, 229, 109, 27, 60, 15, 5, 229, 109, 27, 255, 11, - 15, 5, 229, 109, 27, 252, 84, 15, 5, 229, 109, 27, 251, 248, 15, 5, 229, - 109, 27, 73, 15, 5, 229, 109, 27, 72, 15, 5, 229, 109, 27, 242, 69, 15, - 5, 229, 109, 27, 68, 15, 5, 229, 109, 27, 220, 124, 15, 5, 229, 109, 250, - 95, 229, 108, 15, 5, 229, 67, 15, 5, 229, 68, 27, 236, 236, 15, 5, 229, - 68, 27, 220, 115, 15, 5, 229, 68, 27, 217, 114, 15, 5, 229, 68, 230, 110, - 229, 67, 15, 5, 203, 15, 5, 227, 254, 15, 5, 227, 147, 15, 5, 227, 22, - 15, 5, 226, 177, 15, 5, 226, 166, 231, 90, 15, 5, 226, 165, 15, 5, 226, - 166, 27, 60, 15, 5, 226, 166, 27, 247, 111, 15, 5, 226, 166, 27, 247, - 109, 15, 5, 226, 166, 27, 155, 15, 5, 226, 166, 27, 236, 240, 15, 5, 226, - 166, 27, 235, 247, 15, 5, 226, 166, 27, 234, 219, 15, 5, 226, 166, 27, - 233, 196, 15, 5, 226, 166, 27, 231, 103, 15, 5, 226, 166, 27, 226, 156, - 15, 5, 226, 166, 27, 224, 219, 15, 5, 226, 166, 27, 222, 147, 15, 5, 226, - 166, 27, 220, 124, 15, 5, 226, 166, 27, 220, 121, 15, 5, 226, 166, 27, - 220, 94, 15, 5, 226, 166, 27, 220, 50, 15, 5, 226, 166, 27, 220, 30, 15, - 5, 226, 166, 104, 226, 165, 15, 5, 226, 166, 244, 3, 15, 5, 226, 156, 15, - 5, 226, 157, 235, 175, 27, 254, 5, 15, 5, 226, 138, 15, 5, 226, 131, 15, - 5, 225, 25, 15, 5, 225, 23, 15, 5, 225, 24, 27, 60, 15, 5, 225, 24, 27, - 252, 228, 15, 5, 225, 24, 27, 244, 81, 15, 5, 225, 24, 27, 232, 141, 15, - 5, 225, 24, 27, 224, 168, 15, 5, 225, 24, 27, 220, 240, 15, 5, 225, 24, - 27, 68, 15, 5, 225, 24, 27, 105, 88, 60, 15, 5, 225, 22, 15, 5, 225, 20, - 15, 5, 225, 3, 15, 5, 224, 246, 15, 5, 224, 247, 242, 173, 15, 5, 224, - 247, 104, 224, 247, 244, 248, 104, 244, 248, 244, 221, 104, 244, 220, 15, - 5, 224, 247, 104, 224, 247, 222, 148, 104, 222, 148, 244, 221, 104, 244, - 220, 15, 5, 224, 239, 15, 5, 224, 234, 15, 5, 224, 231, 15, 5, 224, 230, - 15, 5, 224, 227, 15, 5, 224, 219, 15, 5, 224, 220, 27, 60, 15, 5, 224, - 220, 27, 237, 238, 15, 5, 224, 213, 15, 5, 224, 214, 27, 60, 15, 5, 224, - 214, 27, 252, 217, 15, 5, 224, 214, 27, 251, 237, 15, 5, 224, 214, 27, - 248, 219, 15, 5, 224, 214, 27, 244, 220, 15, 5, 224, 214, 27, 238, 1, 15, - 5, 224, 214, 27, 238, 2, 244, 3, 15, 5, 224, 214, 27, 235, 242, 15, 5, - 224, 214, 27, 234, 221, 15, 5, 224, 214, 27, 233, 92, 15, 5, 224, 214, - 27, 226, 156, 15, 5, 224, 208, 15, 5, 224, 204, 15, 5, 224, 205, 222, 59, - 15, 5, 224, 205, 104, 224, 205, 251, 229, 104, 251, 228, 15, 5, 224, 202, - 15, 5, 224, 170, 15, 5, 224, 171, 104, 237, 170, 224, 170, 15, 5, 224, - 168, 15, 5, 224, 167, 15, 5, 224, 140, 15, 5, 224, 141, 244, 3, 15, 5, - 224, 132, 15, 5, 224, 130, 15, 5, 224, 131, 104, 224, 131, 224, 168, 15, - 5, 224, 123, 15, 5, 224, 121, 15, 5, 223, 103, 15, 5, 223, 104, 104, 223, - 103, 15, 5, 223, 83, 15, 5, 223, 82, 15, 5, 223, 81, 15, 5, 223, 74, 15, - 5, 223, 73, 15, 5, 223, 53, 15, 5, 223, 52, 15, 5, 222, 155, 15, 5, 222, - 156, 253, 251, 15, 5, 222, 156, 27, 243, 112, 15, 5, 222, 156, 27, 233, - 196, 15, 5, 222, 156, 244, 3, 15, 5, 222, 147, 15, 5, 222, 148, 104, 222, - 148, 232, 63, 104, 232, 63, 248, 203, 104, 248, 202, 15, 5, 222, 148, - 223, 226, 15, 5, 222, 141, 15, 5, 118, 27, 252, 84, 15, 5, 118, 27, 244, - 11, 15, 5, 118, 27, 224, 246, 15, 5, 118, 27, 224, 170, 15, 5, 118, 27, - 220, 253, 15, 5, 118, 27, 220, 115, 15, 5, 222, 130, 15, 5, 222, 112, 15, - 5, 222, 87, 15, 5, 222, 88, 244, 3, 15, 5, 221, 205, 15, 5, 221, 206, - 222, 59, 15, 5, 221, 181, 15, 5, 221, 165, 15, 5, 221, 166, 27, 222, 130, - 15, 5, 221, 166, 104, 221, 165, 15, 5, 221, 166, 104, 221, 166, 244, 248, - 104, 244, 248, 244, 221, 104, 244, 220, 15, 5, 221, 0, 15, 5, 220, 253, - 15, 5, 220, 251, 15, 5, 220, 249, 15, 5, 220, 240, 15, 5, 220, 241, 104, - 220, 241, 217, 115, 104, 217, 114, 15, 5, 68, 15, 5, 105, 244, 11, 15, 5, - 105, 105, 68, 15, 5, 105, 104, 105, 230, 44, 104, 230, 44, 244, 221, 104, - 244, 220, 15, 5, 105, 104, 105, 223, 54, 104, 223, 53, 15, 5, 105, 104, - 105, 105, 210, 104, 105, 227, 159, 15, 5, 220, 124, 15, 5, 220, 121, 15, - 5, 220, 115, 15, 5, 220, 116, 235, 242, 15, 5, 220, 116, 27, 252, 228, - 15, 5, 220, 116, 27, 233, 196, 15, 5, 220, 116, 27, 105, 88, 105, 88, 68, - 15, 5, 220, 116, 27, 105, 88, 105, 88, 105, 244, 3, 15, 5, 220, 116, 244, - 3, 15, 5, 220, 116, 224, 228, 15, 5, 220, 116, 224, 229, 27, 252, 228, - 15, 5, 220, 111, 15, 5, 220, 94, 15, 5, 220, 95, 27, 235, 174, 15, 5, - 220, 95, 27, 234, 26, 88, 249, 207, 15, 5, 220, 95, 27, 225, 23, 15, 5, - 220, 95, 27, 68, 15, 5, 220, 93, 15, 5, 220, 89, 15, 5, 220, 90, 27, 236, - 208, 15, 5, 220, 90, 27, 187, 15, 5, 220, 87, 15, 5, 220, 88, 244, 3, 15, - 5, 220, 50, 15, 5, 220, 51, 250, 95, 220, 50, 15, 5, 220, 51, 224, 228, - 15, 5, 220, 48, 15, 5, 220, 49, 27, 112, 88, 155, 15, 5, 220, 49, 27, - 112, 88, 208, 15, 5, 220, 49, 27, 254, 175, 15, 5, 220, 49, 27, 155, 15, - 5, 220, 49, 27, 231, 103, 15, 5, 220, 49, 27, 220, 124, 15, 5, 220, 49, - 27, 220, 125, 88, 254, 7, 15, 5, 220, 49, 27, 220, 125, 88, 252, 84, 15, - 5, 220, 47, 15, 5, 220, 44, 15, 5, 220, 43, 15, 5, 220, 40, 15, 5, 220, - 41, 27, 60, 15, 5, 220, 41, 27, 254, 3, 15, 5, 220, 41, 27, 135, 15, 5, - 220, 41, 27, 247, 101, 15, 5, 220, 41, 27, 245, 0, 15, 5, 220, 41, 27, - 244, 240, 15, 5, 220, 41, 27, 244, 229, 222, 59, 15, 5, 220, 41, 27, 244, - 220, 15, 5, 220, 41, 27, 244, 17, 15, 5, 220, 41, 27, 155, 15, 5, 220, - 41, 27, 238, 1, 15, 5, 220, 41, 27, 237, 238, 15, 5, 220, 41, 27, 237, - 145, 15, 5, 220, 41, 27, 236, 113, 15, 5, 220, 41, 27, 234, 219, 15, 5, - 220, 41, 27, 233, 159, 15, 5, 220, 41, 27, 187, 15, 5, 220, 41, 27, 224, - 246, 15, 5, 220, 41, 27, 224, 130, 15, 5, 220, 41, 27, 221, 0, 15, 5, - 220, 41, 27, 105, 88, 244, 11, 15, 5, 220, 41, 27, 220, 115, 15, 5, 220, - 41, 27, 220, 38, 15, 5, 220, 38, 15, 5, 220, 39, 27, 68, 15, 5, 220, 30, - 15, 5, 220, 31, 27, 60, 15, 5, 220, 31, 27, 236, 7, 15, 5, 220, 31, 27, - 235, 247, 15, 5, 220, 31, 27, 222, 130, 15, 5, 220, 27, 15, 5, 220, 29, - 15, 5, 220, 28, 15, 5, 220, 24, 15, 5, 220, 13, 15, 5, 220, 14, 27, 236, - 208, 15, 5, 220, 12, 15, 5, 217, 114, 15, 5, 217, 115, 222, 59, 15, 5, - 217, 115, 204, 27, 235, 247, 15, 5, 217, 111, 15, 5, 217, 104, 15, 5, - 217, 91, 15, 5, 217, 42, 15, 5, 217, 43, 104, 217, 42, 15, 5, 217, 41, - 15, 5, 217, 39, 15, 5, 217, 40, 236, 254, 222, 59, 15, 5, 217, 34, 15, 5, - 217, 26, 15, 5, 217, 13, 15, 5, 217, 11, 15, 5, 217, 12, 27, 60, 15, 5, - 217, 10, 15, 5, 217, 9, 15, 120, 5, 124, 254, 7, 15, 120, 5, 148, 254, 7, - 15, 120, 5, 245, 116, 254, 7, 15, 120, 5, 245, 170, 254, 7, 15, 120, 5, - 224, 82, 254, 7, 15, 120, 5, 225, 43, 254, 7, 15, 120, 5, 246, 235, 254, - 7, 15, 120, 5, 232, 31, 254, 7, 15, 120, 5, 148, 248, 202, 15, 120, 5, - 245, 116, 248, 202, 15, 120, 5, 245, 170, 248, 202, 15, 120, 5, 224, 82, - 248, 202, 15, 120, 5, 225, 43, 248, 202, 15, 120, 5, 246, 235, 248, 202, - 15, 120, 5, 232, 31, 248, 202, 15, 120, 5, 245, 116, 68, 15, 120, 5, 245, - 170, 68, 15, 120, 5, 224, 82, 68, 15, 120, 5, 225, 43, 68, 15, 120, 5, - 246, 235, 68, 15, 120, 5, 232, 31, 68, 15, 120, 5, 131, 244, 168, 15, - 120, 5, 124, 244, 168, 15, 120, 5, 148, 244, 168, 15, 120, 5, 245, 116, - 244, 168, 15, 120, 5, 245, 170, 244, 168, 15, 120, 5, 224, 82, 244, 168, - 15, 120, 5, 225, 43, 244, 168, 15, 120, 5, 246, 235, 244, 168, 15, 120, - 5, 232, 31, 244, 168, 15, 120, 5, 131, 244, 165, 15, 120, 5, 124, 244, - 165, 15, 120, 5, 148, 244, 165, 15, 120, 5, 245, 116, 244, 165, 15, 120, - 5, 245, 170, 244, 165, 15, 120, 5, 124, 225, 3, 15, 120, 5, 148, 225, 3, - 15, 120, 5, 148, 225, 4, 219, 177, 17, 15, 120, 5, 245, 116, 225, 3, 15, - 120, 5, 245, 170, 225, 3, 15, 120, 5, 224, 82, 225, 3, 15, 120, 5, 225, - 43, 225, 3, 15, 120, 5, 246, 235, 225, 3, 15, 120, 5, 232, 31, 225, 3, - 15, 120, 5, 131, 224, 254, 15, 120, 5, 124, 224, 254, 15, 120, 5, 148, - 224, 254, 15, 120, 5, 148, 224, 255, 219, 177, 17, 15, 120, 5, 245, 116, - 224, 254, 15, 120, 5, 245, 170, 224, 254, 15, 120, 5, 225, 4, 27, 244, - 241, 88, 248, 202, 15, 120, 5, 225, 4, 27, 244, 241, 88, 233, 159, 15, - 120, 5, 131, 251, 225, 15, 120, 5, 124, 251, 225, 15, 120, 5, 148, 251, - 225, 15, 120, 5, 148, 251, 226, 219, 177, 17, 15, 120, 5, 245, 116, 251, - 225, 15, 120, 5, 245, 170, 251, 225, 15, 120, 5, 148, 219, 177, 245, 124, - 246, 132, 15, 120, 5, 148, 219, 177, 245, 124, 246, 129, 15, 120, 5, 245, - 116, 219, 177, 245, 124, 235, 47, 15, 120, 5, 245, 116, 219, 177, 245, - 124, 235, 45, 15, 120, 5, 245, 116, 219, 177, 245, 124, 235, 48, 60, 15, - 120, 5, 245, 116, 219, 177, 245, 124, 235, 48, 253, 204, 15, 120, 5, 224, - 82, 219, 177, 245, 124, 254, 4, 15, 120, 5, 225, 43, 219, 177, 245, 124, - 237, 230, 15, 120, 5, 225, 43, 219, 177, 245, 124, 237, 232, 60, 15, 120, - 5, 225, 43, 219, 177, 245, 124, 237, 232, 253, 204, 15, 120, 5, 246, 235, - 219, 177, 245, 124, 220, 26, 15, 120, 5, 246, 235, 219, 177, 245, 124, - 220, 25, 15, 120, 5, 232, 31, 219, 177, 245, 124, 237, 246, 15, 120, 5, - 232, 31, 219, 177, 245, 124, 237, 245, 15, 120, 5, 232, 31, 219, 177, - 245, 124, 237, 244, 15, 120, 5, 232, 31, 219, 177, 245, 124, 237, 247, - 60, 15, 120, 5, 124, 254, 8, 222, 59, 15, 120, 5, 148, 254, 8, 222, 59, - 15, 120, 5, 245, 116, 254, 8, 222, 59, 15, 120, 5, 245, 170, 254, 8, 222, - 59, 15, 120, 5, 224, 82, 254, 8, 222, 59, 15, 120, 5, 131, 252, 207, 15, - 120, 5, 124, 252, 207, 15, 120, 5, 148, 252, 207, 15, 120, 5, 245, 116, - 252, 207, 15, 120, 5, 245, 116, 252, 208, 219, 177, 17, 15, 120, 5, 245, - 170, 252, 207, 15, 120, 5, 245, 170, 252, 208, 219, 177, 17, 15, 120, 5, - 232, 40, 15, 120, 5, 232, 41, 15, 120, 5, 131, 246, 128, 15, 120, 5, 124, - 246, 128, 15, 120, 5, 131, 221, 252, 248, 202, 15, 120, 5, 124, 221, 250, - 248, 202, 15, 120, 5, 245, 170, 224, 72, 248, 202, 15, 120, 5, 131, 221, - 252, 219, 177, 245, 124, 60, 15, 120, 5, 124, 221, 250, 219, 177, 245, - 124, 60, 15, 120, 5, 131, 246, 232, 254, 7, 15, 120, 5, 131, 228, 90, - 254, 7, 15, 120, 5, 48, 253, 254, 131, 224, 73, 15, 120, 5, 48, 253, 254, - 131, 228, 89, 15, 228, 197, 5, 48, 253, 254, 218, 174, 248, 191, 15, 228, - 197, 5, 69, 250, 175, 15, 228, 197, 5, 249, 11, 250, 175, 15, 228, 197, - 5, 249, 11, 221, 86, 10, 11, 255, 140, 10, 11, 255, 139, 10, 11, 255, - 138, 10, 11, 255, 137, 10, 11, 255, 136, 10, 11, 255, 135, 10, 11, 255, - 134, 10, 11, 255, 133, 10, 11, 255, 132, 10, 11, 255, 131, 10, 11, 255, - 130, 10, 11, 255, 129, 10, 11, 255, 128, 10, 11, 255, 127, 10, 11, 255, - 126, 10, 11, 255, 125, 10, 11, 255, 124, 10, 11, 255, 123, 10, 11, 255, - 122, 10, 11, 255, 121, 10, 11, 255, 120, 10, 11, 255, 119, 10, 11, 255, - 118, 10, 11, 255, 117, 10, 11, 255, 116, 10, 11, 255, 115, 10, 11, 255, - 114, 10, 11, 255, 113, 10, 11, 255, 112, 10, 11, 255, 111, 10, 11, 255, - 110, 10, 11, 255, 109, 10, 11, 255, 108, 10, 11, 255, 107, 10, 11, 255, - 106, 10, 11, 255, 105, 10, 11, 255, 104, 10, 11, 255, 103, 10, 11, 255, - 102, 10, 11, 255, 101, 10, 11, 255, 100, 10, 11, 255, 99, 10, 11, 255, - 98, 10, 11, 255, 97, 10, 11, 255, 96, 10, 11, 255, 95, 10, 11, 255, 94, - 10, 11, 255, 93, 10, 11, 255, 92, 10, 11, 255, 91, 10, 11, 255, 90, 10, - 11, 255, 89, 10, 11, 255, 88, 10, 11, 255, 87, 10, 11, 255, 86, 10, 11, - 255, 85, 10, 11, 255, 84, 10, 11, 255, 83, 10, 11, 255, 82, 10, 11, 255, - 81, 10, 11, 255, 80, 10, 11, 255, 79, 10, 11, 255, 78, 10, 11, 255, 77, - 10, 11, 255, 76, 10, 11, 255, 75, 10, 11, 255, 74, 10, 11, 255, 73, 10, - 11, 255, 72, 10, 11, 255, 71, 10, 11, 255, 70, 10, 11, 255, 69, 10, 11, - 255, 68, 10, 11, 255, 67, 10, 11, 255, 66, 10, 11, 255, 65, 10, 11, 255, - 64, 10, 11, 255, 63, 10, 11, 255, 62, 10, 11, 255, 61, 10, 11, 253, 202, - 10, 11, 253, 200, 10, 11, 253, 198, 10, 11, 253, 196, 10, 11, 253, 194, - 10, 11, 253, 193, 10, 11, 253, 191, 10, 11, 253, 189, 10, 11, 253, 187, - 10, 11, 253, 185, 10, 11, 251, 198, 10, 11, 251, 197, 10, 11, 251, 196, - 10, 11, 251, 195, 10, 11, 251, 194, 10, 11, 251, 193, 10, 11, 251, 192, - 10, 11, 251, 191, 10, 11, 251, 190, 10, 11, 251, 189, 10, 11, 251, 188, - 10, 11, 251, 187, 10, 11, 251, 186, 10, 11, 251, 185, 10, 11, 251, 184, - 10, 11, 251, 183, 10, 11, 251, 182, 10, 11, 251, 181, 10, 11, 251, 180, - 10, 11, 251, 179, 10, 11, 251, 178, 10, 11, 251, 177, 10, 11, 251, 176, - 10, 11, 251, 175, 10, 11, 251, 174, 10, 11, 251, 173, 10, 11, 251, 172, - 10, 11, 251, 171, 10, 11, 250, 45, 10, 11, 250, 44, 10, 11, 250, 43, 10, - 11, 250, 42, 10, 11, 250, 41, 10, 11, 250, 40, 10, 11, 250, 39, 10, 11, - 250, 38, 10, 11, 250, 37, 10, 11, 250, 36, 10, 11, 250, 35, 10, 11, 250, - 34, 10, 11, 250, 33, 10, 11, 250, 32, 10, 11, 250, 31, 10, 11, 250, 30, - 10, 11, 250, 29, 10, 11, 250, 28, 10, 11, 250, 27, 10, 11, 250, 26, 10, - 11, 250, 25, 10, 11, 250, 24, 10, 11, 250, 23, 10, 11, 250, 22, 10, 11, - 250, 21, 10, 11, 250, 20, 10, 11, 250, 19, 10, 11, 250, 18, 10, 11, 250, - 17, 10, 11, 250, 16, 10, 11, 250, 15, 10, 11, 250, 14, 10, 11, 250, 13, - 10, 11, 250, 12, 10, 11, 250, 11, 10, 11, 250, 10, 10, 11, 250, 9, 10, - 11, 250, 8, 10, 11, 250, 7, 10, 11, 250, 6, 10, 11, 250, 5, 10, 11, 250, - 4, 10, 11, 250, 3, 10, 11, 250, 2, 10, 11, 250, 1, 10, 11, 250, 0, 10, - 11, 249, 255, 10, 11, 249, 254, 10, 11, 249, 253, 10, 11, 249, 252, 10, - 11, 249, 251, 10, 11, 249, 250, 10, 11, 249, 249, 10, 11, 249, 248, 10, - 11, 249, 247, 10, 11, 249, 246, 10, 11, 249, 245, 10, 11, 249, 244, 10, - 11, 249, 243, 10, 11, 249, 242, 10, 11, 249, 241, 10, 11, 249, 240, 10, - 11, 249, 239, 10, 11, 249, 238, 10, 11, 249, 237, 10, 11, 249, 236, 10, - 11, 249, 235, 10, 11, 249, 234, 10, 11, 249, 233, 10, 11, 249, 232, 10, - 11, 249, 231, 10, 11, 249, 230, 10, 11, 249, 229, 10, 11, 249, 228, 10, - 11, 249, 227, 10, 11, 249, 226, 10, 11, 249, 225, 10, 11, 249, 224, 10, - 11, 249, 223, 10, 11, 249, 222, 10, 11, 249, 221, 10, 11, 249, 220, 10, - 11, 249, 219, 10, 11, 249, 218, 10, 11, 249, 217, 10, 11, 249, 216, 10, - 11, 249, 215, 10, 11, 249, 214, 10, 11, 249, 213, 10, 11, 249, 212, 10, - 11, 249, 211, 10, 11, 249, 210, 10, 11, 247, 62, 10, 11, 247, 61, 10, 11, - 247, 60, 10, 11, 247, 59, 10, 11, 247, 58, 10, 11, 247, 57, 10, 11, 247, - 56, 10, 11, 247, 55, 10, 11, 247, 54, 10, 11, 247, 53, 10, 11, 247, 52, - 10, 11, 247, 51, 10, 11, 247, 50, 10, 11, 247, 49, 10, 11, 247, 48, 10, - 11, 247, 47, 10, 11, 247, 46, 10, 11, 247, 45, 10, 11, 247, 44, 10, 11, - 247, 43, 10, 11, 247, 42, 10, 11, 247, 41, 10, 11, 247, 40, 10, 11, 247, - 39, 10, 11, 247, 38, 10, 11, 247, 37, 10, 11, 247, 36, 10, 11, 247, 35, - 10, 11, 247, 34, 10, 11, 247, 33, 10, 11, 247, 32, 10, 11, 247, 31, 10, - 11, 247, 30, 10, 11, 247, 29, 10, 11, 247, 28, 10, 11, 247, 27, 10, 11, - 247, 26, 10, 11, 247, 25, 10, 11, 247, 24, 10, 11, 247, 23, 10, 11, 247, - 22, 10, 11, 247, 21, 10, 11, 247, 20, 10, 11, 247, 19, 10, 11, 246, 73, - 10, 11, 246, 72, 10, 11, 246, 71, 10, 11, 246, 70, 10, 11, 246, 69, 10, - 11, 246, 68, 10, 11, 246, 67, 10, 11, 246, 66, 10, 11, 246, 65, 10, 11, - 246, 64, 10, 11, 246, 63, 10, 11, 246, 62, 10, 11, 246, 61, 10, 11, 246, - 60, 10, 11, 246, 59, 10, 11, 246, 58, 10, 11, 246, 57, 10, 11, 246, 56, - 10, 11, 246, 55, 10, 11, 246, 54, 10, 11, 246, 53, 10, 11, 246, 52, 10, - 11, 246, 51, 10, 11, 246, 50, 10, 11, 246, 49, 10, 11, 246, 48, 10, 11, - 246, 47, 10, 11, 246, 46, 10, 11, 246, 45, 10, 11, 246, 44, 10, 11, 246, - 43, 10, 11, 246, 42, 10, 11, 246, 41, 10, 11, 246, 40, 10, 11, 246, 39, - 10, 11, 246, 38, 10, 11, 246, 37, 10, 11, 246, 36, 10, 11, 246, 35, 10, - 11, 246, 34, 10, 11, 246, 33, 10, 11, 246, 32, 10, 11, 246, 31, 10, 11, - 246, 30, 10, 11, 246, 29, 10, 11, 246, 28, 10, 11, 246, 27, 10, 11, 246, - 26, 10, 11, 246, 25, 10, 11, 246, 24, 10, 11, 246, 23, 10, 11, 246, 22, - 10, 11, 246, 21, 10, 11, 246, 20, 10, 11, 246, 19, 10, 11, 246, 18, 10, - 11, 246, 17, 10, 11, 246, 16, 10, 11, 246, 15, 10, 11, 246, 14, 10, 11, - 246, 13, 10, 11, 246, 12, 10, 11, 246, 11, 10, 11, 246, 10, 10, 11, 246, - 9, 10, 11, 245, 66, 10, 11, 245, 65, 10, 11, 245, 64, 10, 11, 245, 63, - 10, 11, 245, 62, 10, 11, 245, 61, 10, 11, 245, 60, 10, 11, 245, 59, 10, - 11, 245, 58, 10, 11, 245, 57, 10, 11, 245, 56, 10, 11, 245, 55, 10, 11, - 245, 54, 10, 11, 245, 53, 10, 11, 245, 52, 10, 11, 245, 51, 10, 11, 245, - 50, 10, 11, 245, 49, 10, 11, 245, 48, 10, 11, 245, 47, 10, 11, 245, 46, - 10, 11, 245, 45, 10, 11, 245, 44, 10, 11, 245, 43, 10, 11, 245, 42, 10, - 11, 245, 41, 10, 11, 245, 40, 10, 11, 245, 39, 10, 11, 245, 38, 10, 11, - 245, 37, 10, 11, 245, 36, 10, 11, 245, 35, 10, 11, 245, 34, 10, 11, 245, - 33, 10, 11, 245, 32, 10, 11, 245, 31, 10, 11, 245, 30, 10, 11, 245, 29, - 10, 11, 245, 28, 10, 11, 245, 27, 10, 11, 245, 26, 10, 11, 245, 25, 10, - 11, 245, 24, 10, 11, 245, 23, 10, 11, 245, 22, 10, 11, 245, 21, 10, 11, - 245, 20, 10, 11, 245, 19, 10, 11, 245, 18, 10, 11, 245, 17, 10, 11, 245, - 16, 10, 11, 245, 15, 10, 11, 245, 14, 10, 11, 245, 13, 10, 11, 245, 12, - 10, 11, 245, 11, 10, 11, 245, 10, 10, 11, 245, 9, 10, 11, 245, 8, 10, 11, - 245, 7, 10, 11, 245, 6, 10, 11, 245, 5, 10, 11, 245, 4, 10, 11, 245, 3, - 10, 11, 243, 223, 10, 11, 243, 222, 10, 11, 243, 221, 10, 11, 243, 220, - 10, 11, 243, 219, 10, 11, 243, 218, 10, 11, 243, 217, 10, 11, 243, 216, - 10, 11, 243, 215, 10, 11, 242, 91, 10, 11, 242, 90, 10, 11, 242, 89, 10, - 11, 242, 88, 10, 11, 242, 87, 10, 11, 242, 86, 10, 11, 242, 85, 10, 11, - 242, 84, 10, 11, 242, 83, 10, 11, 242, 82, 10, 11, 242, 81, 10, 11, 242, - 80, 10, 11, 242, 79, 10, 11, 242, 78, 10, 11, 242, 77, 10, 11, 242, 76, - 10, 11, 242, 75, 10, 11, 242, 74, 10, 11, 242, 73, 10, 11, 237, 16, 10, - 11, 237, 15, 10, 11, 237, 14, 10, 11, 237, 13, 10, 11, 237, 12, 10, 11, - 237, 11, 10, 11, 237, 10, 10, 11, 237, 9, 10, 11, 235, 199, 10, 11, 235, - 198, 10, 11, 235, 197, 10, 11, 235, 196, 10, 11, 235, 195, 10, 11, 235, - 194, 10, 11, 235, 193, 10, 11, 235, 192, 10, 11, 235, 191, 10, 11, 235, - 190, 10, 11, 234, 186, 10, 11, 234, 185, 10, 11, 234, 184, 10, 11, 234, - 183, 10, 11, 234, 182, 10, 11, 234, 181, 10, 11, 234, 180, 10, 11, 234, - 179, 10, 11, 234, 178, 10, 11, 234, 177, 10, 11, 234, 176, 10, 11, 234, - 175, 10, 11, 234, 174, 10, 11, 234, 173, 10, 11, 234, 172, 10, 11, 234, - 171, 10, 11, 234, 170, 10, 11, 234, 169, 10, 11, 234, 168, 10, 11, 234, - 167, 10, 11, 234, 166, 10, 11, 234, 165, 10, 11, 234, 164, 10, 11, 234, - 163, 10, 11, 234, 162, 10, 11, 234, 161, 10, 11, 234, 160, 10, 11, 234, - 159, 10, 11, 234, 158, 10, 11, 234, 157, 10, 11, 234, 156, 10, 11, 234, - 155, 10, 11, 234, 154, 10, 11, 234, 153, 10, 11, 234, 152, 10, 11, 234, - 151, 10, 11, 234, 150, 10, 11, 234, 149, 10, 11, 234, 148, 10, 11, 234, - 147, 10, 11, 234, 146, 10, 11, 234, 145, 10, 11, 234, 144, 10, 11, 234, - 143, 10, 11, 234, 142, 10, 11, 234, 141, 10, 11, 234, 140, 10, 11, 234, - 139, 10, 11, 234, 138, 10, 11, 234, 137, 10, 11, 234, 136, 10, 11, 234, - 135, 10, 11, 234, 134, 10, 11, 234, 133, 10, 11, 234, 132, 10, 11, 234, - 131, 10, 11, 234, 130, 10, 11, 234, 129, 10, 11, 234, 128, 10, 11, 234, - 127, 10, 11, 234, 126, 10, 11, 234, 125, 10, 11, 234, 124, 10, 11, 234, - 123, 10, 11, 234, 122, 10, 11, 234, 121, 10, 11, 233, 31, 10, 11, 233, - 30, 10, 11, 233, 29, 10, 11, 233, 28, 10, 11, 233, 27, 10, 11, 233, 26, - 10, 11, 233, 25, 10, 11, 233, 24, 10, 11, 233, 23, 10, 11, 233, 22, 10, - 11, 233, 21, 10, 11, 233, 20, 10, 11, 233, 19, 10, 11, 233, 18, 10, 11, - 233, 17, 10, 11, 233, 16, 10, 11, 233, 15, 10, 11, 233, 14, 10, 11, 233, - 13, 10, 11, 233, 12, 10, 11, 233, 11, 10, 11, 233, 10, 10, 11, 233, 9, - 10, 11, 233, 8, 10, 11, 233, 7, 10, 11, 233, 6, 10, 11, 233, 5, 10, 11, - 233, 4, 10, 11, 233, 3, 10, 11, 233, 2, 10, 11, 233, 1, 10, 11, 233, 0, - 10, 11, 232, 255, 10, 11, 232, 254, 10, 11, 232, 253, 10, 11, 232, 252, - 10, 11, 232, 251, 10, 11, 232, 250, 10, 11, 232, 249, 10, 11, 232, 248, - 10, 11, 232, 247, 10, 11, 232, 246, 10, 11, 232, 245, 10, 11, 232, 244, - 10, 11, 232, 243, 10, 11, 232, 242, 10, 11, 232, 241, 10, 11, 232, 240, - 10, 11, 232, 239, 10, 11, 231, 241, 10, 11, 231, 240, 10, 11, 231, 239, - 10, 11, 231, 238, 10, 11, 231, 237, 10, 11, 231, 236, 10, 11, 231, 235, - 10, 11, 231, 234, 10, 11, 231, 233, 10, 11, 231, 232, 10, 11, 231, 231, - 10, 11, 231, 230, 10, 11, 231, 229, 10, 11, 231, 228, 10, 11, 231, 227, - 10, 11, 231, 226, 10, 11, 231, 225, 10, 11, 231, 224, 10, 11, 231, 223, - 10, 11, 231, 222, 10, 11, 231, 221, 10, 11, 231, 220, 10, 11, 231, 143, - 10, 11, 231, 142, 10, 11, 231, 141, 10, 11, 231, 140, 10, 11, 231, 139, - 10, 11, 231, 138, 10, 11, 231, 137, 10, 11, 231, 136, 10, 11, 231, 135, - 10, 11, 231, 134, 10, 11, 231, 133, 10, 11, 231, 132, 10, 11, 231, 131, - 10, 11, 231, 130, 10, 11, 231, 129, 10, 11, 231, 128, 10, 11, 231, 127, - 10, 11, 231, 126, 10, 11, 231, 125, 10, 11, 231, 124, 10, 11, 231, 123, - 10, 11, 231, 122, 10, 11, 231, 121, 10, 11, 231, 120, 10, 11, 231, 119, - 10, 11, 231, 118, 10, 11, 231, 5, 10, 11, 231, 4, 10, 11, 231, 3, 10, 11, - 231, 2, 10, 11, 231, 1, 10, 11, 231, 0, 10, 11, 230, 255, 10, 11, 230, - 254, 10, 11, 230, 253, 10, 11, 230, 252, 10, 11, 230, 251, 10, 11, 230, - 250, 10, 11, 230, 249, 10, 11, 230, 248, 10, 11, 230, 247, 10, 11, 230, - 246, 10, 11, 230, 245, 10, 11, 230, 244, 10, 11, 230, 243, 10, 11, 230, - 242, 10, 11, 230, 241, 10, 11, 230, 240, 10, 11, 230, 239, 10, 11, 230, - 238, 10, 11, 230, 237, 10, 11, 230, 236, 10, 11, 230, 235, 10, 11, 230, - 234, 10, 11, 230, 233, 10, 11, 230, 232, 10, 11, 230, 231, 10, 11, 230, - 230, 10, 11, 230, 229, 10, 11, 230, 228, 10, 11, 230, 227, 10, 11, 230, - 226, 10, 11, 230, 225, 10, 11, 230, 224, 10, 11, 230, 223, 10, 11, 230, - 222, 10, 11, 230, 221, 10, 11, 230, 220, 10, 11, 230, 219, 10, 11, 230, - 218, 10, 11, 230, 217, 10, 11, 230, 216, 10, 11, 230, 215, 10, 11, 230, - 214, 10, 11, 230, 213, 10, 11, 230, 212, 10, 11, 230, 211, 10, 11, 230, - 210, 10, 11, 230, 209, 10, 11, 230, 208, 10, 11, 230, 207, 10, 11, 230, - 206, 10, 11, 230, 205, 10, 11, 230, 204, 10, 11, 230, 203, 10, 11, 230, - 202, 10, 11, 230, 201, 10, 11, 230, 200, 10, 11, 230, 199, 10, 11, 230, - 198, 10, 11, 230, 197, 10, 11, 230, 196, 10, 11, 230, 195, 10, 11, 230, - 194, 10, 11, 230, 193, 10, 11, 230, 192, 10, 11, 230, 191, 10, 11, 230, - 190, 10, 11, 230, 189, 10, 11, 230, 188, 10, 11, 230, 187, 10, 11, 230, - 58, 10, 11, 230, 57, 10, 11, 230, 56, 10, 11, 230, 55, 10, 11, 230, 54, - 10, 11, 230, 53, 10, 11, 230, 52, 10, 11, 230, 51, 10, 11, 230, 50, 10, - 11, 230, 49, 10, 11, 230, 48, 10, 11, 230, 47, 10, 11, 230, 46, 10, 11, - 228, 162, 10, 11, 228, 161, 10, 11, 228, 160, 10, 11, 228, 159, 10, 11, - 228, 158, 10, 11, 228, 157, 10, 11, 228, 156, 10, 11, 228, 37, 10, 11, - 228, 36, 10, 11, 228, 35, 10, 11, 228, 34, 10, 11, 228, 33, 10, 11, 228, - 32, 10, 11, 228, 31, 10, 11, 228, 30, 10, 11, 228, 29, 10, 11, 228, 28, - 10, 11, 228, 27, 10, 11, 228, 26, 10, 11, 228, 25, 10, 11, 228, 24, 10, - 11, 228, 23, 10, 11, 228, 22, 10, 11, 228, 21, 10, 11, 228, 20, 10, 11, - 228, 19, 10, 11, 228, 18, 10, 11, 228, 17, 10, 11, 228, 16, 10, 11, 228, - 15, 10, 11, 228, 14, 10, 11, 228, 13, 10, 11, 228, 12, 10, 11, 228, 11, - 10, 11, 228, 10, 10, 11, 228, 9, 10, 11, 228, 8, 10, 11, 228, 7, 10, 11, - 228, 6, 10, 11, 228, 5, 10, 11, 228, 4, 10, 11, 226, 232, 10, 11, 226, - 231, 10, 11, 226, 230, 10, 11, 226, 229, 10, 11, 226, 228, 10, 11, 226, - 227, 10, 11, 226, 226, 10, 11, 226, 225, 10, 11, 226, 224, 10, 11, 226, - 223, 10, 11, 226, 222, 10, 11, 226, 221, 10, 11, 226, 220, 10, 11, 226, - 219, 10, 11, 226, 218, 10, 11, 226, 217, 10, 11, 226, 216, 10, 11, 226, - 215, 10, 11, 226, 214, 10, 11, 226, 213, 10, 11, 226, 212, 10, 11, 226, - 211, 10, 11, 226, 210, 10, 11, 226, 209, 10, 11, 226, 208, 10, 11, 226, - 207, 10, 11, 226, 206, 10, 11, 226, 205, 10, 11, 226, 204, 10, 11, 226, - 203, 10, 11, 226, 202, 10, 11, 226, 201, 10, 11, 226, 200, 10, 11, 226, - 199, 10, 11, 226, 198, 10, 11, 226, 197, 10, 11, 226, 196, 10, 11, 226, - 195, 10, 11, 226, 194, 10, 11, 226, 193, 10, 11, 226, 192, 10, 11, 226, - 191, 10, 11, 226, 190, 10, 11, 226, 189, 10, 11, 226, 188, 10, 11, 226, - 187, 10, 11, 226, 186, 10, 11, 226, 185, 10, 11, 226, 184, 10, 11, 226, - 183, 10, 11, 226, 182, 10, 11, 226, 181, 10, 11, 226, 180, 10, 11, 226, - 179, 10, 11, 222, 200, 10, 11, 222, 199, 10, 11, 222, 198, 10, 11, 222, - 197, 10, 11, 222, 196, 10, 11, 222, 195, 10, 11, 222, 194, 10, 11, 222, - 193, 10, 11, 222, 192, 10, 11, 222, 191, 10, 11, 222, 190, 10, 11, 222, - 189, 10, 11, 222, 188, 10, 11, 222, 187, 10, 11, 222, 186, 10, 11, 222, - 185, 10, 11, 222, 184, 10, 11, 222, 183, 10, 11, 222, 182, 10, 11, 222, - 181, 10, 11, 222, 180, 10, 11, 222, 179, 10, 11, 222, 178, 10, 11, 222, - 177, 10, 11, 222, 176, 10, 11, 222, 175, 10, 11, 222, 174, 10, 11, 222, - 173, 10, 11, 222, 172, 10, 11, 222, 171, 10, 11, 222, 170, 10, 11, 222, - 169, 10, 11, 222, 168, 10, 11, 222, 167, 10, 11, 222, 166, 10, 11, 222, - 165, 10, 11, 222, 164, 10, 11, 222, 163, 10, 11, 222, 162, 10, 11, 222, - 161, 10, 11, 222, 160, 10, 11, 222, 159, 10, 11, 222, 158, 10, 11, 222, - 157, 10, 11, 220, 172, 10, 11, 220, 171, 10, 11, 220, 170, 10, 11, 220, - 169, 10, 11, 220, 168, 10, 11, 220, 167, 10, 11, 220, 166, 10, 11, 220, - 165, 10, 11, 220, 164, 10, 11, 220, 163, 10, 11, 220, 162, 10, 11, 220, - 161, 10, 11, 220, 160, 10, 11, 220, 159, 10, 11, 220, 158, 10, 11, 220, - 157, 10, 11, 220, 156, 10, 11, 220, 155, 10, 11, 220, 154, 10, 11, 220, - 153, 10, 11, 220, 152, 10, 11, 220, 151, 10, 11, 220, 150, 10, 11, 220, - 149, 10, 11, 220, 148, 10, 11, 220, 147, 10, 11, 220, 146, 10, 11, 220, - 145, 10, 11, 220, 144, 10, 11, 220, 143, 10, 11, 220, 142, 10, 11, 220, - 141, 10, 11, 220, 140, 10, 11, 220, 139, 10, 11, 220, 138, 10, 11, 220, - 137, 10, 11, 220, 136, 10, 11, 220, 135, 10, 11, 220, 134, 10, 11, 220, - 133, 10, 11, 220, 132, 10, 11, 220, 131, 10, 11, 220, 130, 10, 11, 220, - 129, 10, 11, 220, 128, 10, 11, 220, 127, 10, 11, 220, 126, 10, 11, 220, - 10, 10, 11, 220, 9, 10, 11, 220, 8, 10, 11, 220, 7, 10, 11, 220, 6, 10, - 11, 220, 5, 10, 11, 220, 4, 10, 11, 220, 3, 10, 11, 220, 2, 10, 11, 220, - 1, 10, 11, 220, 0, 10, 11, 219, 255, 10, 11, 219, 254, 10, 11, 219, 253, - 10, 11, 219, 252, 10, 11, 219, 251, 10, 11, 219, 250, 10, 11, 219, 249, - 10, 11, 219, 248, 10, 11, 219, 247, 10, 11, 219, 246, 10, 11, 219, 245, - 10, 11, 219, 244, 10, 11, 219, 243, 10, 11, 219, 242, 10, 11, 219, 241, - 10, 11, 219, 240, 10, 11, 219, 239, 10, 11, 219, 238, 10, 11, 219, 237, - 10, 11, 219, 236, 10, 11, 219, 235, 10, 11, 219, 234, 10, 11, 219, 233, - 10, 11, 219, 232, 10, 11, 219, 231, 10, 11, 219, 230, 10, 11, 219, 229, - 10, 11, 219, 228, 10, 11, 219, 227, 10, 11, 219, 226, 10, 11, 219, 225, - 10, 11, 219, 224, 10, 11, 219, 223, 10, 11, 219, 222, 10, 11, 219, 221, - 10, 11, 219, 220, 10, 11, 219, 219, 10, 11, 219, 218, 10, 11, 219, 217, - 10, 11, 219, 216, 10, 11, 219, 215, 10, 11, 219, 214, 10, 11, 219, 213, - 10, 11, 219, 212, 10, 11, 219, 211, 10, 11, 219, 210, 10, 11, 219, 209, - 10, 11, 219, 208, 10, 11, 219, 207, 10, 11, 219, 206, 10, 11, 219, 205, - 10, 11, 219, 204, 10, 11, 219, 203, 10, 11, 219, 202, 10, 11, 219, 201, - 10, 11, 219, 200, 10, 11, 219, 199, 10, 11, 219, 198, 10, 11, 219, 197, - 10, 11, 219, 196, 10, 11, 219, 195, 10, 11, 219, 194, 10, 11, 219, 193, - 10, 11, 219, 192, 10, 11, 219, 191, 10, 11, 219, 190, 10, 11, 219, 39, - 10, 11, 219, 38, 10, 11, 219, 37, 10, 11, 219, 36, 10, 11, 219, 35, 10, - 11, 219, 34, 10, 11, 219, 33, 10, 11, 219, 32, 10, 11, 219, 31, 10, 11, - 219, 30, 10, 11, 219, 29, 10, 11, 219, 28, 10, 11, 219, 27, 10, 11, 219, - 26, 10, 11, 219, 25, 10, 11, 219, 24, 10, 11, 219, 23, 10, 11, 219, 22, - 10, 11, 219, 21, 10, 11, 219, 20, 10, 11, 219, 19, 10, 11, 219, 18, 10, - 11, 219, 17, 10, 11, 219, 16, 10, 11, 219, 15, 10, 11, 219, 14, 10, 11, - 219, 13, 10, 11, 219, 12, 10, 11, 219, 11, 10, 11, 219, 10, 10, 11, 219, - 9, 10, 11, 219, 8, 10, 11, 218, 150, 10, 11, 218, 149, 10, 11, 218, 148, - 10, 11, 218, 147, 10, 11, 218, 146, 10, 11, 218, 145, 10, 11, 218, 144, - 10, 11, 218, 143, 10, 11, 218, 142, 10, 11, 218, 141, 10, 11, 218, 140, - 10, 11, 218, 139, 10, 11, 218, 88, 10, 11, 218, 87, 10, 11, 218, 86, 10, - 11, 218, 85, 10, 11, 218, 84, 10, 11, 218, 83, 10, 11, 218, 82, 10, 11, - 218, 81, 10, 11, 218, 80, 10, 11, 217, 156, 10, 11, 217, 155, 10, 11, - 217, 154, 10, 11, 217, 153, 10, 11, 217, 152, 10, 11, 217, 151, 10, 11, - 217, 150, 10, 11, 217, 149, 10, 11, 217, 148, 10, 11, 217, 147, 10, 11, - 217, 146, 10, 11, 217, 145, 10, 11, 217, 144, 10, 11, 217, 143, 10, 11, - 217, 142, 10, 11, 217, 141, 10, 11, 217, 140, 10, 11, 217, 139, 10, 11, - 217, 138, 10, 11, 217, 137, 10, 11, 217, 136, 10, 11, 217, 135, 10, 11, - 217, 134, 10, 11, 217, 133, 10, 11, 217, 132, 10, 11, 217, 131, 10, 11, - 217, 130, 10, 11, 217, 129, 10, 11, 217, 128, 10, 11, 217, 127, 10, 11, - 217, 126, 10, 11, 217, 125, 10, 11, 217, 124, 10, 11, 217, 123, 10, 11, - 217, 122, 10, 11, 217, 121, 10, 11, 217, 120, 10, 11, 217, 119, 10, 11, - 217, 118, 10, 11, 217, 117, 10, 11, 217, 116, 10, 11, 255, 57, 10, 11, - 255, 56, 10, 11, 255, 55, 10, 11, 255, 54, 10, 11, 255, 53, 10, 11, 255, - 52, 10, 11, 255, 51, 10, 11, 255, 50, 10, 11, 255, 49, 10, 11, 255, 48, - 10, 11, 255, 47, 10, 11, 255, 46, 10, 11, 255, 45, 10, 11, 255, 44, 10, - 11, 255, 43, 10, 11, 255, 42, 10, 11, 255, 41, 10, 11, 255, 40, 10, 11, - 255, 39, 10, 11, 255, 38, 10, 11, 255, 37, 10, 11, 255, 36, 10, 11, 255, - 35, 10, 11, 255, 34, 10, 11, 255, 33, 10, 11, 255, 32, 10, 11, 255, 31, - 10, 11, 255, 30, 10, 11, 255, 29, 10, 11, 255, 28, 10, 11, 255, 27, 10, - 11, 255, 26, 10, 11, 255, 25, 10, 11, 255, 24, 46, 26, 16, 228, 206, 46, - 26, 16, 249, 148, 46, 26, 16, 229, 163, 46, 26, 16, 230, 67, 246, 221, - 46, 26, 16, 230, 67, 248, 214, 46, 26, 16, 219, 181, 246, 221, 46, 26, - 16, 219, 181, 248, 214, 46, 26, 16, 236, 198, 46, 26, 16, 222, 217, 46, - 26, 16, 229, 235, 46, 26, 16, 217, 205, 46, 26, 16, 217, 206, 248, 214, - 46, 26, 16, 236, 12, 46, 26, 16, 254, 89, 246, 221, 46, 26, 16, 246, 90, - 246, 221, 46, 26, 16, 222, 73, 46, 26, 16, 236, 164, 46, 26, 16, 254, 80, - 46, 26, 16, 254, 81, 248, 214, 46, 26, 16, 222, 222, 46, 26, 16, 221, - 242, 46, 26, 16, 230, 148, 254, 47, 46, 26, 16, 244, 56, 254, 47, 46, 26, - 16, 228, 205, 46, 26, 16, 251, 62, 46, 26, 16, 219, 171, 46, 26, 16, 237, - 144, 254, 47, 46, 26, 16, 236, 166, 254, 47, 46, 26, 16, 236, 165, 254, - 47, 46, 26, 16, 226, 119, 46, 26, 16, 229, 226, 46, 26, 16, 223, 151, - 254, 83, 46, 26, 16, 230, 66, 254, 47, 46, 26, 16, 219, 180, 254, 47, 46, - 26, 16, 254, 84, 254, 47, 46, 26, 16, 254, 78, 46, 26, 16, 236, 65, 46, - 26, 16, 227, 157, 46, 26, 16, 229, 106, 254, 47, 46, 26, 16, 221, 175, - 46, 26, 16, 254, 129, 46, 26, 16, 226, 75, 46, 26, 16, 222, 225, 254, 47, - 46, 26, 16, 222, 225, 233, 239, 223, 149, 46, 26, 16, 230, 61, 254, 47, - 46, 26, 16, 222, 17, 46, 26, 16, 235, 97, 46, 26, 16, 247, 77, 46, 26, - 16, 221, 92, 46, 26, 16, 222, 52, 46, 26, 16, 236, 15, 46, 26, 16, 254, - 89, 246, 90, 232, 131, 46, 26, 16, 245, 93, 254, 47, 46, 26, 16, 237, - 234, 46, 26, 16, 221, 68, 254, 47, 46, 26, 16, 236, 201, 221, 67, 46, 26, - 16, 229, 182, 46, 26, 16, 228, 209, 46, 26, 16, 236, 42, 46, 26, 16, 251, - 6, 254, 47, 46, 26, 16, 227, 232, 46, 26, 16, 229, 238, 254, 47, 46, 26, - 16, 229, 236, 254, 47, 46, 26, 16, 242, 63, 46, 26, 16, 232, 217, 46, 26, - 16, 229, 148, 46, 26, 16, 236, 43, 254, 152, 46, 26, 16, 221, 68, 254, - 152, 46, 26, 16, 223, 132, 46, 26, 16, 244, 25, 46, 26, 16, 237, 144, - 232, 131, 46, 26, 16, 230, 148, 232, 131, 46, 26, 16, 230, 67, 232, 131, - 46, 26, 16, 229, 147, 46, 26, 16, 236, 29, 46, 26, 16, 229, 146, 46, 26, - 16, 236, 14, 46, 26, 16, 229, 183, 232, 131, 46, 26, 16, 236, 165, 232, - 132, 254, 109, 46, 26, 16, 236, 166, 232, 132, 254, 109, 46, 26, 16, 217, - 203, 46, 26, 16, 254, 81, 232, 131, 46, 26, 16, 254, 82, 222, 223, 232, - 131, 46, 26, 16, 217, 204, 46, 26, 16, 236, 13, 46, 26, 16, 246, 216, 46, - 26, 16, 251, 63, 46, 26, 16, 233, 168, 237, 143, 46, 26, 16, 219, 181, - 232, 131, 46, 26, 16, 229, 106, 232, 131, 46, 26, 16, 228, 210, 232, 131, - 46, 26, 16, 230, 145, 46, 26, 16, 254, 100, 46, 26, 16, 234, 195, 46, 26, - 16, 229, 236, 232, 131, 46, 26, 16, 229, 238, 232, 131, 46, 26, 16, 246, - 119, 229, 237, 46, 26, 16, 235, 206, 46, 26, 16, 254, 101, 46, 26, 16, - 221, 68, 232, 131, 46, 26, 16, 246, 219, 46, 26, 16, 222, 225, 232, 131, - 46, 26, 16, 222, 218, 46, 26, 16, 251, 6, 232, 131, 46, 26, 16, 246, 161, - 46, 26, 16, 226, 76, 232, 131, 46, 26, 16, 218, 124, 236, 65, 46, 26, 16, - 221, 65, 46, 26, 16, 228, 211, 46, 26, 16, 221, 69, 46, 26, 16, 221, 66, - 46, 26, 16, 228, 208, 46, 26, 16, 221, 64, 46, 26, 16, 228, 207, 46, 26, - 16, 244, 55, 46, 26, 16, 254, 41, 46, 26, 16, 246, 119, 254, 41, 46, 26, - 16, 230, 61, 232, 131, 46, 26, 16, 222, 16, 246, 127, 46, 26, 16, 222, - 16, 246, 89, 46, 26, 16, 222, 18, 254, 85, 46, 26, 16, 222, 11, 236, 244, - 254, 77, 46, 26, 16, 236, 200, 46, 26, 16, 246, 186, 46, 26, 16, 217, - 253, 236, 197, 46, 26, 16, 217, 253, 254, 109, 46, 26, 16, 223, 150, 46, - 26, 16, 236, 66, 254, 109, 46, 26, 16, 248, 215, 254, 47, 46, 26, 16, - 236, 16, 254, 47, 46, 26, 16, 236, 16, 254, 152, 46, 26, 16, 236, 16, - 232, 131, 46, 26, 16, 254, 84, 232, 131, 46, 26, 16, 254, 86, 46, 26, 16, - 248, 214, 46, 26, 16, 221, 77, 46, 26, 16, 222, 44, 46, 26, 16, 236, 33, - 46, 26, 16, 235, 102, 246, 182, 250, 255, 46, 26, 16, 235, 102, 247, 78, - 251, 0, 46, 26, 16, 235, 102, 221, 79, 251, 0, 46, 26, 16, 235, 102, 222, - 54, 251, 0, 46, 26, 16, 235, 102, 237, 229, 250, 255, 46, 26, 16, 244, - 56, 232, 132, 254, 109, 46, 26, 16, 244, 56, 229, 227, 254, 37, 46, 26, - 16, 244, 56, 229, 227, 249, 40, 46, 26, 16, 248, 238, 46, 26, 16, 248, - 239, 229, 227, 254, 38, 236, 197, 46, 26, 16, 248, 239, 229, 227, 254, - 38, 254, 109, 46, 26, 16, 248, 239, 229, 227, 249, 40, 46, 26, 16, 221, - 83, 46, 26, 16, 254, 42, 46, 26, 16, 237, 236, 46, 26, 16, 249, 3, 46, - 26, 16, 254, 204, 229, 23, 254, 43, 46, 26, 16, 254, 204, 254, 40, 46, - 26, 16, 254, 204, 254, 43, 46, 26, 16, 254, 204, 233, 234, 46, 26, 16, - 254, 204, 233, 242, 46, 26, 16, 254, 204, 244, 57, 46, 26, 16, 254, 204, - 244, 54, 46, 26, 16, 254, 204, 229, 23, 244, 57, 46, 26, 16, 234, 60, - 228, 216, 242, 61, 46, 26, 16, 234, 60, 254, 154, 228, 216, 242, 61, 46, - 26, 16, 234, 60, 249, 39, 242, 61, 46, 26, 16, 234, 60, 254, 154, 249, - 39, 242, 61, 46, 26, 16, 234, 60, 221, 72, 242, 61, 46, 26, 16, 234, 60, - 221, 84, 46, 26, 16, 234, 60, 222, 48, 242, 61, 46, 26, 16, 234, 60, 222, - 48, 235, 105, 242, 61, 46, 26, 16, 234, 60, 235, 105, 242, 61, 46, 26, - 16, 234, 60, 229, 55, 242, 61, 46, 26, 16, 237, 149, 222, 69, 242, 62, - 46, 26, 16, 254, 82, 222, 69, 242, 62, 46, 26, 16, 245, 244, 222, 45, 46, - 26, 16, 245, 244, 233, 126, 46, 26, 16, 245, 244, 248, 243, 46, 26, 16, - 234, 60, 219, 175, 242, 61, 46, 26, 16, 234, 60, 228, 215, 242, 61, 46, - 26, 16, 234, 60, 229, 55, 222, 48, 242, 61, 46, 26, 16, 244, 52, 233, 34, - 254, 85, 46, 26, 16, 244, 52, 233, 34, 248, 213, 46, 26, 16, 246, 195, - 236, 244, 245, 93, 219, 61, 46, 26, 16, 237, 235, 46, 26, 16, 237, 233, - 46, 26, 16, 245, 93, 254, 48, 249, 38, 242, 60, 46, 26, 16, 245, 93, 249, - 1, 187, 46, 26, 16, 245, 93, 249, 1, 232, 217, 46, 26, 16, 245, 93, 232, - 213, 242, 61, 46, 26, 16, 245, 93, 249, 1, 249, 15, 46, 26, 16, 245, 93, - 224, 61, 249, 0, 249, 15, 46, 26, 16, 245, 93, 249, 1, 236, 184, 46, 26, - 16, 245, 93, 249, 1, 217, 21, 46, 26, 16, 245, 93, 249, 1, 232, 63, 236, - 197, 46, 26, 16, 245, 93, 249, 1, 232, 63, 254, 109, 46, 26, 16, 245, 93, - 234, 91, 251, 1, 248, 243, 46, 26, 16, 245, 93, 234, 91, 251, 1, 233, - 126, 46, 26, 16, 245, 204, 224, 61, 251, 1, 219, 174, 46, 26, 16, 245, - 93, 224, 61, 251, 1, 222, 226, 46, 26, 16, 245, 93, 232, 133, 46, 26, 16, - 251, 2, 216, 253, 46, 26, 16, 251, 2, 236, 64, 46, 26, 16, 251, 2, 223, - 250, 46, 26, 16, 245, 93, 242, 107, 217, 252, 222, 49, 46, 26, 16, 245, - 93, 246, 196, 254, 102, 46, 26, 16, 217, 252, 221, 73, 46, 26, 16, 248, - 251, 221, 73, 46, 26, 16, 248, 251, 222, 49, 46, 26, 16, 248, 251, 254, - 87, 247, 78, 248, 161, 46, 26, 16, 248, 251, 233, 124, 222, 53, 248, 161, - 46, 26, 16, 248, 251, 248, 235, 246, 99, 248, 161, 46, 26, 16, 248, 251, - 221, 81, 230, 152, 248, 161, 46, 26, 16, 217, 252, 254, 87, 247, 78, 248, - 161, 46, 26, 16, 217, 252, 233, 124, 222, 53, 248, 161, 46, 26, 16, 217, - 252, 248, 235, 246, 99, 248, 161, 46, 26, 16, 217, 252, 221, 81, 230, - 152, 248, 161, 46, 26, 16, 244, 179, 248, 250, 46, 26, 16, 244, 179, 217, - 251, 46, 26, 16, 249, 2, 254, 87, 233, 169, 46, 26, 16, 249, 2, 254, 87, - 234, 8, 46, 26, 16, 249, 2, 248, 214, 46, 26, 16, 249, 2, 222, 9, 46, 26, - 16, 224, 117, 222, 9, 46, 26, 16, 224, 117, 222, 10, 248, 201, 46, 26, - 16, 224, 117, 222, 10, 221, 74, 46, 26, 16, 224, 117, 222, 10, 222, 42, - 46, 26, 16, 224, 117, 254, 17, 46, 26, 16, 224, 117, 254, 18, 248, 201, - 46, 26, 16, 224, 117, 254, 18, 221, 74, 46, 26, 16, 224, 117, 254, 18, - 222, 42, 46, 26, 16, 248, 236, 244, 161, 46, 26, 16, 248, 242, 230, 86, - 46, 26, 16, 223, 144, 46, 26, 16, 254, 34, 187, 46, 26, 16, 254, 34, 219, - 61, 46, 26, 16, 254, 34, 245, 0, 46, 26, 16, 254, 34, 249, 15, 46, 26, - 16, 254, 34, 236, 184, 46, 26, 16, 254, 34, 217, 21, 46, 26, 16, 254, 34, - 232, 62, 46, 26, 16, 236, 165, 232, 132, 233, 241, 46, 26, 16, 236, 166, - 232, 132, 233, 241, 46, 26, 16, 236, 165, 232, 132, 236, 197, 46, 26, 16, - 236, 166, 232, 132, 236, 197, 46, 26, 16, 236, 66, 236, 197, 46, 26, 16, - 244, 56, 232, 132, 236, 197, 26, 16, 224, 109, 252, 197, 26, 16, 51, 252, - 197, 26, 16, 39, 252, 197, 26, 16, 227, 160, 39, 252, 197, 26, 16, 249, - 145, 252, 197, 26, 16, 224, 192, 252, 197, 26, 16, 42, 227, 182, 55, 26, - 16, 45, 227, 182, 55, 26, 16, 227, 182, 248, 143, 26, 16, 249, 184, 226, - 79, 26, 16, 249, 208, 251, 141, 26, 16, 226, 79, 26, 16, 250, 180, 26, - 16, 227, 180, 245, 193, 26, 16, 227, 180, 245, 192, 26, 16, 227, 180, - 245, 191, 26, 16, 245, 210, 26, 16, 245, 211, 56, 26, 16, 252, 10, 78, - 26, 16, 251, 163, 26, 16, 252, 19, 26, 16, 115, 26, 16, 230, 136, 223, - 163, 26, 16, 220, 205, 223, 163, 26, 16, 221, 227, 223, 163, 26, 16, 245, - 115, 223, 163, 26, 16, 245, 169, 223, 163, 26, 16, 224, 81, 223, 163, 26, - 16, 224, 79, 245, 101, 26, 16, 245, 113, 245, 101, 26, 16, 245, 68, 250, - 207, 26, 16, 245, 68, 250, 208, 230, 88, 254, 145, 26, 16, 245, 68, 250, - 208, 230, 88, 252, 185, 26, 16, 251, 203, 250, 207, 26, 16, 246, 75, 250, - 207, 26, 16, 246, 75, 250, 208, 230, 88, 254, 145, 26, 16, 246, 75, 250, - 208, 230, 88, 252, 185, 26, 16, 247, 116, 250, 206, 26, 16, 247, 116, - 250, 205, 26, 16, 233, 85, 234, 24, 227, 168, 26, 16, 51, 225, 0, 26, 16, - 51, 245, 156, 26, 16, 245, 157, 220, 63, 26, 16, 245, 157, 247, 132, 26, - 16, 232, 205, 220, 63, 26, 16, 232, 205, 247, 132, 26, 16, 225, 1, 220, - 63, 26, 16, 225, 1, 247, 132, 26, 16, 228, 90, 145, 225, 0, 26, 16, 228, - 90, 145, 245, 156, 26, 16, 250, 166, 221, 177, 26, 16, 250, 69, 221, 177, - 26, 16, 230, 88, 254, 145, 26, 16, 230, 88, 252, 185, 26, 16, 228, 74, - 254, 145, 26, 16, 228, 74, 252, 185, 26, 16, 233, 88, 227, 168, 26, 16, - 218, 205, 227, 168, 26, 16, 144, 227, 168, 26, 16, 228, 90, 227, 168, 26, - 16, 246, 232, 227, 168, 26, 16, 224, 76, 227, 168, 26, 16, 221, 243, 227, - 168, 26, 16, 224, 68, 227, 168, 26, 16, 131, 242, 162, 220, 217, 227, - 168, 26, 16, 218, 152, 231, 178, 26, 16, 88, 231, 178, 26, 16, 250, 222, - 218, 152, 231, 178, 26, 16, 40, 231, 179, 218, 207, 26, 16, 40, 231, 179, - 252, 53, 26, 16, 221, 91, 231, 179, 108, 218, 207, 26, 16, 221, 91, 231, - 179, 108, 252, 53, 26, 16, 221, 91, 231, 179, 42, 218, 207, 26, 16, 221, - 91, 231, 179, 42, 252, 53, 26, 16, 221, 91, 231, 179, 45, 218, 207, 26, - 16, 221, 91, 231, 179, 45, 252, 53, 26, 16, 221, 91, 231, 179, 113, 218, - 207, 26, 16, 221, 91, 231, 179, 113, 252, 53, 26, 16, 221, 91, 231, 179, - 108, 45, 218, 207, 26, 16, 221, 91, 231, 179, 108, 45, 252, 53, 26, 16, - 233, 118, 231, 179, 218, 207, 26, 16, 233, 118, 231, 179, 252, 53, 26, - 16, 221, 88, 231, 179, 113, 218, 207, 26, 16, 221, 88, 231, 179, 113, - 252, 53, 26, 16, 229, 230, 231, 178, 26, 16, 219, 67, 231, 178, 26, 16, - 231, 179, 252, 53, 26, 16, 231, 111, 231, 178, 26, 16, 250, 185, 231, - 179, 218, 207, 26, 16, 250, 185, 231, 179, 252, 53, 26, 16, 252, 8, 26, - 16, 218, 205, 231, 180, 26, 16, 144, 231, 180, 26, 16, 228, 90, 231, 180, - 26, 16, 246, 232, 231, 180, 26, 16, 224, 76, 231, 180, 26, 16, 221, 243, - 231, 180, 26, 16, 224, 68, 231, 180, 26, 16, 131, 242, 162, 220, 217, - 231, 180, 26, 16, 36, 223, 146, 26, 16, 36, 223, 233, 223, 146, 26, 16, - 36, 221, 97, 26, 16, 36, 221, 96, 26, 16, 36, 221, 95, 26, 16, 245, 183, - 221, 97, 26, 16, 245, 183, 221, 96, 26, 16, 245, 183, 221, 95, 26, 16, - 36, 253, 230, 248, 145, 26, 16, 36, 245, 162, 26, 16, 36, 245, 161, 26, - 16, 36, 245, 160, 26, 16, 36, 245, 159, 26, 16, 36, 245, 158, 26, 16, - 252, 131, 252, 143, 26, 16, 246, 190, 252, 143, 26, 16, 252, 131, 221, - 200, 26, 16, 246, 190, 221, 200, 26, 16, 252, 131, 224, 44, 26, 16, 246, - 190, 224, 44, 26, 16, 252, 131, 229, 115, 26, 16, 246, 190, 229, 115, 26, - 16, 36, 255, 0, 26, 16, 36, 223, 165, 26, 16, 36, 222, 58, 26, 16, 36, - 223, 166, 26, 16, 36, 234, 71, 26, 16, 36, 234, 70, 26, 16, 36, 254, 255, - 26, 16, 36, 234, 240, 26, 16, 254, 25, 220, 63, 26, 16, 254, 25, 247, - 132, 26, 16, 36, 248, 158, 26, 16, 36, 227, 91, 26, 16, 36, 245, 150, 26, - 16, 36, 224, 40, 26, 16, 36, 252, 113, 26, 16, 36, 51, 221, 124, 26, 16, - 36, 221, 78, 221, 124, 26, 16, 227, 95, 26, 16, 223, 99, 26, 16, 217, - 157, 26, 16, 229, 107, 26, 16, 233, 231, 26, 16, 245, 121, 26, 16, 250, - 106, 26, 16, 249, 83, 26, 16, 244, 47, 231, 181, 224, 55, 26, 16, 244, - 47, 231, 181, 231, 205, 224, 55, 26, 16, 221, 109, 26, 16, 220, 237, 26, - 16, 237, 170, 220, 237, 26, 16, 220, 238, 224, 55, 26, 16, 220, 238, 220, - 63, 26, 16, 230, 99, 223, 119, 26, 16, 230, 99, 223, 116, 26, 16, 230, - 99, 223, 115, 26, 16, 230, 99, 223, 114, 26, 16, 230, 99, 223, 113, 26, - 16, 230, 99, 223, 112, 26, 16, 230, 99, 223, 111, 26, 16, 230, 99, 223, - 110, 26, 16, 230, 99, 223, 109, 26, 16, 230, 99, 223, 118, 26, 16, 230, - 99, 223, 117, 26, 16, 243, 169, 26, 16, 232, 140, 26, 16, 246, 190, 117, - 223, 140, 26, 16, 249, 77, 224, 55, 26, 16, 36, 113, 252, 24, 26, 16, 36, - 108, 252, 24, 26, 16, 36, 243, 178, 26, 16, 36, 224, 34, 229, 59, 26, 16, - 229, 195, 78, 26, 16, 229, 195, 108, 78, 26, 16, 144, 229, 195, 78, 26, - 16, 244, 74, 220, 63, 26, 16, 244, 74, 247, 132, 26, 16, 2, 245, 182, 26, - 16, 249, 168, 26, 16, 249, 169, 254, 157, 26, 16, 234, 46, 26, 16, 234, - 250, 26, 16, 252, 5, 26, 16, 225, 71, 218, 207, 26, 16, 225, 71, 252, 53, - 26, 16, 233, 157, 26, 16, 233, 158, 252, 53, 26, 16, 225, 65, 218, 207, - 26, 16, 225, 65, 252, 53, 26, 16, 245, 82, 218, 207, 26, 16, 245, 82, - 252, 53, 26, 16, 234, 251, 229, 167, 227, 168, 26, 16, 234, 251, 237, - 228, 227, 168, 26, 16, 252, 6, 227, 168, 26, 16, 225, 71, 227, 168, 26, - 16, 233, 158, 227, 168, 26, 16, 225, 65, 227, 168, 26, 16, 222, 67, 229, - 165, 250, 87, 228, 224, 229, 166, 26, 16, 222, 67, 229, 165, 250, 87, - 228, 224, 237, 227, 26, 16, 222, 67, 229, 165, 250, 87, 228, 224, 229, - 167, 248, 224, 26, 16, 222, 67, 237, 226, 250, 87, 228, 224, 229, 166, - 26, 16, 222, 67, 237, 226, 250, 87, 228, 224, 237, 227, 26, 16, 222, 67, - 237, 226, 250, 87, 228, 224, 237, 228, 248, 224, 26, 16, 222, 67, 237, - 226, 250, 87, 228, 224, 237, 228, 248, 223, 26, 16, 222, 67, 237, 226, - 250, 87, 228, 224, 237, 228, 248, 222, 26, 16, 250, 103, 26, 16, 244, 26, - 251, 203, 250, 207, 26, 16, 244, 26, 246, 75, 250, 207, 26, 16, 40, 253, - 204, 26, 16, 219, 81, 26, 16, 229, 35, 26, 16, 250, 200, 26, 16, 226, - 110, 26, 16, 250, 202, 26, 16, 221, 115, 26, 16, 229, 17, 26, 16, 229, - 18, 245, 152, 26, 16, 226, 111, 245, 152, 26, 16, 221, 116, 227, 166, 26, - 16, 229, 154, 223, 95, 23, 219, 71, 165, 223, 18, 23, 219, 71, 165, 223, - 7, 23, 219, 71, 165, 222, 253, 23, 219, 71, 165, 222, 246, 23, 219, 71, - 165, 222, 238, 23, 219, 71, 165, 222, 232, 23, 219, 71, 165, 222, 231, - 23, 219, 71, 165, 222, 230, 23, 219, 71, 165, 222, 229, 23, 219, 71, 165, - 223, 17, 23, 219, 71, 165, 223, 16, 23, 219, 71, 165, 223, 15, 23, 219, - 71, 165, 223, 14, 23, 219, 71, 165, 223, 13, 23, 219, 71, 165, 223, 12, - 23, 219, 71, 165, 223, 11, 23, 219, 71, 165, 223, 10, 23, 219, 71, 165, - 223, 9, 23, 219, 71, 165, 223, 8, 23, 219, 71, 165, 223, 6, 23, 219, 71, - 165, 223, 5, 23, 219, 71, 165, 223, 4, 23, 219, 71, 165, 223, 3, 23, 219, - 71, 165, 223, 2, 23, 219, 71, 165, 222, 237, 23, 219, 71, 165, 222, 236, - 23, 219, 71, 165, 222, 235, 23, 219, 71, 165, 222, 234, 23, 219, 71, 165, - 222, 233, 23, 237, 189, 165, 223, 18, 23, 237, 189, 165, 223, 7, 23, 237, - 189, 165, 222, 246, 23, 237, 189, 165, 222, 238, 23, 237, 189, 165, 222, - 231, 23, 237, 189, 165, 222, 230, 23, 237, 189, 165, 223, 16, 23, 237, - 189, 165, 223, 15, 23, 237, 189, 165, 223, 14, 23, 237, 189, 165, 223, - 13, 23, 237, 189, 165, 223, 10, 23, 237, 189, 165, 223, 9, 23, 237, 189, - 165, 223, 8, 23, 237, 189, 165, 223, 3, 23, 237, 189, 165, 223, 2, 23, - 237, 189, 165, 223, 1, 23, 237, 189, 165, 223, 0, 23, 237, 189, 165, 222, - 255, 23, 237, 189, 165, 222, 254, 23, 237, 189, 165, 222, 252, 23, 237, - 189, 165, 222, 251, 23, 237, 189, 165, 222, 250, 23, 237, 189, 165, 222, - 249, 23, 237, 189, 165, 222, 248, 23, 237, 189, 165, 222, 247, 23, 237, - 189, 165, 222, 245, 23, 237, 189, 165, 222, 244, 23, 237, 189, 165, 222, - 243, 23, 237, 189, 165, 222, 242, 23, 237, 189, 165, 222, 241, 23, 237, - 189, 165, 222, 240, 23, 237, 189, 165, 222, 239, 23, 237, 189, 165, 222, - 237, 23, 237, 189, 165, 222, 236, 23, 237, 189, 165, 222, 235, 23, 237, - 189, 165, 222, 234, 23, 237, 189, 165, 222, 233, 36, 23, 26, 221, 75, 36, - 23, 26, 222, 43, 36, 23, 26, 229, 174, 23, 26, 235, 101, 233, 125, 35, - 247, 8, 248, 237, 35, 243, 150, 247, 8, 248, 237, 35, 242, 165, 247, 8, - 248, 237, 35, 247, 7, 243, 151, 248, 237, 35, 247, 7, 242, 164, 248, 237, - 35, 247, 8, 159, 35, 251, 84, 159, 35, 245, 90, 250, 221, 159, 35, 233, - 150, 159, 35, 252, 192, 159, 35, 236, 181, 224, 43, 159, 35, 250, 133, - 159, 35, 254, 9, 159, 35, 230, 109, 159, 35, 252, 13, 230, 83, 159, 35, - 249, 79, 156, 248, 198, 159, 35, 248, 195, 159, 35, 217, 210, 159, 35, - 237, 217, 159, 35, 229, 180, 159, 35, 227, 215, 159, 35, 250, 143, 159, - 35, 242, 253, 252, 233, 159, 35, 219, 1, 159, 35, 245, 138, 159, 35, 254, - 236, 159, 35, 227, 190, 159, 35, 227, 172, 159, 35, 247, 6, 159, 35, 237, - 45, 159, 35, 250, 138, 159, 35, 246, 189, 159, 35, 247, 87, 159, 35, 251, - 58, 159, 35, 249, 85, 159, 35, 21, 227, 171, 159, 35, 230, 38, 159, 35, - 235, 104, 159, 35, 250, 195, 159, 35, 236, 101, 159, 35, 244, 211, 159, - 35, 223, 126, 159, 35, 228, 189, 159, 35, 245, 89, 159, 35, 227, 173, - 159, 35, 235, 134, 156, 233, 134, 159, 35, 227, 169, 159, 35, 244, 64, - 199, 234, 12, 159, 35, 246, 191, 159, 35, 223, 133, 159, 35, 244, 28, - 159, 35, 246, 184, 159, 35, 229, 210, 159, 35, 227, 85, 159, 35, 245, - 151, 159, 35, 219, 173, 156, 218, 244, 159, 35, 250, 146, 159, 35, 234, - 23, 159, 35, 246, 120, 159, 35, 220, 71, 159, 35, 248, 225, 159, 35, 250, - 197, 233, 105, 159, 35, 244, 13, 159, 35, 244, 212, 237, 223, 159, 35, - 234, 53, 159, 35, 254, 253, 159, 35, 246, 203, 159, 35, 247, 134, 159, - 35, 218, 242, 159, 35, 224, 106, 159, 35, 237, 196, 159, 35, 249, 51, - 159, 35, 249, 150, 159, 35, 248, 221, 159, 35, 246, 93, 159, 35, 225, 37, - 159, 35, 223, 135, 159, 35, 243, 180, 159, 35, 250, 162, 159, 35, 250, - 193, 159, 35, 245, 248, 159, 35, 254, 205, 159, 35, 250, 161, 159, 35, - 230, 139, 222, 23, 219, 155, 159, 35, 248, 245, 159, 35, 235, 180, 159, - 35, 245, 118, 250, 112, 227, 69, 220, 73, 20, 107, 250, 112, 227, 69, - 220, 73, 20, 103, 250, 112, 227, 69, 220, 73, 20, 160, 250, 112, 227, 69, - 220, 73, 20, 154, 250, 112, 227, 69, 220, 73, 20, 174, 250, 112, 227, 69, - 220, 73, 20, 182, 250, 112, 227, 69, 220, 73, 20, 191, 250, 112, 227, 69, - 220, 73, 20, 185, 250, 112, 227, 69, 220, 73, 20, 190, 250, 112, 227, 69, - 222, 63, 20, 107, 250, 112, 227, 69, 222, 63, 20, 103, 250, 112, 227, 69, - 222, 63, 20, 160, 250, 112, 227, 69, 222, 63, 20, 154, 250, 112, 227, 69, - 222, 63, 20, 174, 250, 112, 227, 69, 222, 63, 20, 182, 250, 112, 227, 69, - 222, 63, 20, 191, 250, 112, 227, 69, 222, 63, 20, 185, 250, 112, 227, 69, - 222, 63, 20, 190, 14, 21, 6, 60, 14, 21, 6, 253, 204, 14, 21, 6, 251, - 202, 14, 21, 6, 250, 46, 14, 21, 6, 73, 14, 21, 6, 246, 74, 14, 21, 6, - 245, 67, 14, 21, 6, 243, 225, 14, 21, 6, 72, 14, 21, 6, 237, 126, 14, 21, - 6, 237, 17, 14, 21, 6, 153, 14, 21, 6, 189, 14, 21, 6, 207, 14, 21, 6, - 74, 14, 21, 6, 230, 59, 14, 21, 6, 228, 163, 14, 21, 6, 152, 14, 21, 6, - 198, 14, 21, 6, 222, 201, 14, 21, 6, 68, 14, 21, 6, 216, 216, 14, 21, 6, - 219, 40, 14, 21, 6, 218, 151, 14, 21, 6, 218, 90, 14, 21, 6, 217, 157, - 14, 21, 3, 60, 14, 21, 3, 253, 204, 14, 21, 3, 251, 202, 14, 21, 3, 250, - 46, 14, 21, 3, 73, 14, 21, 3, 246, 74, 14, 21, 3, 245, 67, 14, 21, 3, - 243, 225, 14, 21, 3, 72, 14, 21, 3, 237, 126, 14, 21, 3, 237, 17, 14, 21, - 3, 153, 14, 21, 3, 189, 14, 21, 3, 207, 14, 21, 3, 74, 14, 21, 3, 230, - 59, 14, 21, 3, 228, 163, 14, 21, 3, 152, 14, 21, 3, 198, 14, 21, 3, 222, - 201, 14, 21, 3, 68, 14, 21, 3, 216, 216, 14, 21, 3, 219, 40, 14, 21, 3, - 218, 151, 14, 21, 3, 218, 90, 14, 21, 3, 217, 157, 14, 30, 6, 60, 14, 30, - 6, 253, 204, 14, 30, 6, 251, 202, 14, 30, 6, 250, 46, 14, 30, 6, 73, 14, - 30, 6, 246, 74, 14, 30, 6, 245, 67, 14, 30, 6, 243, 225, 14, 30, 6, 72, - 14, 30, 6, 237, 126, 14, 30, 6, 237, 17, 14, 30, 6, 153, 14, 30, 6, 189, - 14, 30, 6, 207, 14, 30, 6, 74, 14, 30, 6, 230, 59, 14, 30, 6, 228, 163, - 14, 30, 6, 152, 14, 30, 6, 198, 14, 30, 6, 222, 201, 14, 30, 6, 68, 14, - 30, 6, 216, 216, 14, 30, 6, 219, 40, 14, 30, 6, 218, 151, 14, 30, 6, 218, - 90, 14, 30, 6, 217, 157, 14, 30, 3, 60, 14, 30, 3, 253, 204, 14, 30, 3, - 251, 202, 14, 30, 3, 250, 46, 14, 30, 3, 73, 14, 30, 3, 246, 74, 14, 30, - 3, 245, 67, 14, 30, 3, 72, 14, 30, 3, 237, 126, 14, 30, 3, 237, 17, 14, - 30, 3, 153, 14, 30, 3, 189, 14, 30, 3, 207, 14, 30, 3, 74, 14, 30, 3, - 230, 59, 14, 30, 3, 228, 163, 14, 30, 3, 152, 14, 30, 3, 198, 14, 30, 3, - 222, 201, 14, 30, 3, 68, 14, 30, 3, 216, 216, 14, 30, 3, 219, 40, 14, 30, - 3, 218, 151, 14, 30, 3, 218, 90, 14, 30, 3, 217, 157, 14, 21, 30, 6, 60, - 14, 21, 30, 6, 253, 204, 14, 21, 30, 6, 251, 202, 14, 21, 30, 6, 250, 46, - 14, 21, 30, 6, 73, 14, 21, 30, 6, 246, 74, 14, 21, 30, 6, 245, 67, 14, - 21, 30, 6, 243, 225, 14, 21, 30, 6, 72, 14, 21, 30, 6, 237, 126, 14, 21, - 30, 6, 237, 17, 14, 21, 30, 6, 153, 14, 21, 30, 6, 189, 14, 21, 30, 6, - 207, 14, 21, 30, 6, 74, 14, 21, 30, 6, 230, 59, 14, 21, 30, 6, 228, 163, - 14, 21, 30, 6, 152, 14, 21, 30, 6, 198, 14, 21, 30, 6, 222, 201, 14, 21, - 30, 6, 68, 14, 21, 30, 6, 216, 216, 14, 21, 30, 6, 219, 40, 14, 21, 30, - 6, 218, 151, 14, 21, 30, 6, 218, 90, 14, 21, 30, 6, 217, 157, 14, 21, 30, - 3, 60, 14, 21, 30, 3, 253, 204, 14, 21, 30, 3, 251, 202, 14, 21, 30, 3, - 250, 46, 14, 21, 30, 3, 73, 14, 21, 30, 3, 246, 74, 14, 21, 30, 3, 245, - 67, 14, 21, 30, 3, 243, 225, 14, 21, 30, 3, 72, 14, 21, 30, 3, 237, 126, - 14, 21, 30, 3, 237, 17, 14, 21, 30, 3, 153, 14, 21, 30, 3, 189, 14, 21, - 30, 3, 207, 14, 21, 30, 3, 74, 14, 21, 30, 3, 230, 59, 14, 21, 30, 3, - 228, 163, 14, 21, 30, 3, 152, 14, 21, 30, 3, 198, 14, 21, 30, 3, 222, - 201, 14, 21, 30, 3, 68, 14, 21, 30, 3, 216, 216, 14, 21, 30, 3, 219, 40, - 14, 21, 30, 3, 218, 151, 14, 21, 30, 3, 218, 90, 14, 21, 30, 3, 217, 157, - 14, 102, 6, 60, 14, 102, 6, 251, 202, 14, 102, 6, 250, 46, 14, 102, 6, - 245, 67, 14, 102, 6, 237, 126, 14, 102, 6, 237, 17, 14, 102, 6, 207, 14, - 102, 6, 74, 14, 102, 6, 230, 59, 14, 102, 6, 228, 163, 14, 102, 6, 198, - 14, 102, 6, 222, 201, 14, 102, 6, 68, 14, 102, 6, 216, 216, 14, 102, 6, - 219, 40, 14, 102, 6, 218, 151, 14, 102, 6, 218, 90, 14, 102, 6, 217, 157, - 14, 102, 3, 60, 14, 102, 3, 253, 204, 14, 102, 3, 251, 202, 14, 102, 3, - 250, 46, 14, 102, 3, 246, 74, 14, 102, 3, 243, 225, 14, 102, 3, 72, 14, - 102, 3, 237, 126, 14, 102, 3, 237, 17, 14, 102, 3, 153, 14, 102, 3, 189, - 14, 102, 3, 207, 14, 102, 3, 230, 59, 14, 102, 3, 228, 163, 14, 102, 3, - 152, 14, 102, 3, 198, 14, 102, 3, 222, 201, 14, 102, 3, 68, 14, 102, 3, - 216, 216, 14, 102, 3, 219, 40, 14, 102, 3, 218, 151, 14, 102, 3, 218, 90, - 14, 102, 3, 217, 157, 14, 21, 102, 6, 60, 14, 21, 102, 6, 253, 204, 14, - 21, 102, 6, 251, 202, 14, 21, 102, 6, 250, 46, 14, 21, 102, 6, 73, 14, - 21, 102, 6, 246, 74, 14, 21, 102, 6, 245, 67, 14, 21, 102, 6, 243, 225, - 14, 21, 102, 6, 72, 14, 21, 102, 6, 237, 126, 14, 21, 102, 6, 237, 17, - 14, 21, 102, 6, 153, 14, 21, 102, 6, 189, 14, 21, 102, 6, 207, 14, 21, - 102, 6, 74, 14, 21, 102, 6, 230, 59, 14, 21, 102, 6, 228, 163, 14, 21, - 102, 6, 152, 14, 21, 102, 6, 198, 14, 21, 102, 6, 222, 201, 14, 21, 102, - 6, 68, 14, 21, 102, 6, 216, 216, 14, 21, 102, 6, 219, 40, 14, 21, 102, 6, - 218, 151, 14, 21, 102, 6, 218, 90, 14, 21, 102, 6, 217, 157, 14, 21, 102, - 3, 60, 14, 21, 102, 3, 253, 204, 14, 21, 102, 3, 251, 202, 14, 21, 102, - 3, 250, 46, 14, 21, 102, 3, 73, 14, 21, 102, 3, 246, 74, 14, 21, 102, 3, - 245, 67, 14, 21, 102, 3, 243, 225, 14, 21, 102, 3, 72, 14, 21, 102, 3, - 237, 126, 14, 21, 102, 3, 237, 17, 14, 21, 102, 3, 153, 14, 21, 102, 3, - 189, 14, 21, 102, 3, 207, 14, 21, 102, 3, 74, 14, 21, 102, 3, 230, 59, - 14, 21, 102, 3, 228, 163, 14, 21, 102, 3, 152, 14, 21, 102, 3, 198, 14, - 21, 102, 3, 222, 201, 14, 21, 102, 3, 68, 14, 21, 102, 3, 216, 216, 14, - 21, 102, 3, 219, 40, 14, 21, 102, 3, 218, 151, 14, 21, 102, 3, 218, 90, - 14, 21, 102, 3, 217, 157, 14, 121, 6, 60, 14, 121, 6, 253, 204, 14, 121, - 6, 250, 46, 14, 121, 6, 73, 14, 121, 6, 246, 74, 14, 121, 6, 245, 67, 14, - 121, 6, 237, 126, 14, 121, 6, 237, 17, 14, 121, 6, 153, 14, 121, 6, 189, - 14, 121, 6, 207, 14, 121, 6, 74, 14, 121, 6, 230, 59, 14, 121, 6, 228, - 163, 14, 121, 6, 198, 14, 121, 6, 222, 201, 14, 121, 6, 68, 14, 121, 6, - 216, 216, 14, 121, 6, 219, 40, 14, 121, 6, 218, 151, 14, 121, 6, 218, 90, - 14, 121, 3, 60, 14, 121, 3, 253, 204, 14, 121, 3, 251, 202, 14, 121, 3, - 250, 46, 14, 121, 3, 73, 14, 121, 3, 246, 74, 14, 121, 3, 245, 67, 14, - 121, 3, 243, 225, 14, 121, 3, 72, 14, 121, 3, 237, 126, 14, 121, 3, 237, - 17, 14, 121, 3, 153, 14, 121, 3, 189, 14, 121, 3, 207, 14, 121, 3, 74, - 14, 121, 3, 230, 59, 14, 121, 3, 228, 163, 14, 121, 3, 152, 14, 121, 3, - 198, 14, 121, 3, 222, 201, 14, 121, 3, 68, 14, 121, 3, 216, 216, 14, 121, - 3, 219, 40, 14, 121, 3, 218, 151, 14, 121, 3, 218, 90, 14, 121, 3, 217, - 157, 14, 173, 6, 60, 14, 173, 6, 253, 204, 14, 173, 6, 250, 46, 14, 173, - 6, 73, 14, 173, 6, 246, 74, 14, 173, 6, 245, 67, 14, 173, 6, 72, 14, 173, - 6, 237, 126, 14, 173, 6, 237, 17, 14, 173, 6, 153, 14, 173, 6, 189, 14, - 173, 6, 74, 14, 173, 6, 198, 14, 173, 6, 222, 201, 14, 173, 6, 68, 14, - 173, 6, 216, 216, 14, 173, 6, 219, 40, 14, 173, 6, 218, 151, 14, 173, 6, - 218, 90, 14, 173, 3, 60, 14, 173, 3, 253, 204, 14, 173, 3, 251, 202, 14, - 173, 3, 250, 46, 14, 173, 3, 73, 14, 173, 3, 246, 74, 14, 173, 3, 245, - 67, 14, 173, 3, 243, 225, 14, 173, 3, 72, 14, 173, 3, 237, 126, 14, 173, - 3, 237, 17, 14, 173, 3, 153, 14, 173, 3, 189, 14, 173, 3, 207, 14, 173, - 3, 74, 14, 173, 3, 230, 59, 14, 173, 3, 228, 163, 14, 173, 3, 152, 14, - 173, 3, 198, 14, 173, 3, 222, 201, 14, 173, 3, 68, 14, 173, 3, 216, 216, - 14, 173, 3, 219, 40, 14, 173, 3, 218, 151, 14, 173, 3, 218, 90, 14, 173, - 3, 217, 157, 14, 21, 121, 6, 60, 14, 21, 121, 6, 253, 204, 14, 21, 121, - 6, 251, 202, 14, 21, 121, 6, 250, 46, 14, 21, 121, 6, 73, 14, 21, 121, 6, - 246, 74, 14, 21, 121, 6, 245, 67, 14, 21, 121, 6, 243, 225, 14, 21, 121, - 6, 72, 14, 21, 121, 6, 237, 126, 14, 21, 121, 6, 237, 17, 14, 21, 121, 6, - 153, 14, 21, 121, 6, 189, 14, 21, 121, 6, 207, 14, 21, 121, 6, 74, 14, - 21, 121, 6, 230, 59, 14, 21, 121, 6, 228, 163, 14, 21, 121, 6, 152, 14, - 21, 121, 6, 198, 14, 21, 121, 6, 222, 201, 14, 21, 121, 6, 68, 14, 21, - 121, 6, 216, 216, 14, 21, 121, 6, 219, 40, 14, 21, 121, 6, 218, 151, 14, - 21, 121, 6, 218, 90, 14, 21, 121, 6, 217, 157, 14, 21, 121, 3, 60, 14, - 21, 121, 3, 253, 204, 14, 21, 121, 3, 251, 202, 14, 21, 121, 3, 250, 46, - 14, 21, 121, 3, 73, 14, 21, 121, 3, 246, 74, 14, 21, 121, 3, 245, 67, 14, - 21, 121, 3, 243, 225, 14, 21, 121, 3, 72, 14, 21, 121, 3, 237, 126, 14, - 21, 121, 3, 237, 17, 14, 21, 121, 3, 153, 14, 21, 121, 3, 189, 14, 21, - 121, 3, 207, 14, 21, 121, 3, 74, 14, 21, 121, 3, 230, 59, 14, 21, 121, 3, - 228, 163, 14, 21, 121, 3, 152, 14, 21, 121, 3, 198, 14, 21, 121, 3, 222, - 201, 14, 21, 121, 3, 68, 14, 21, 121, 3, 216, 216, 14, 21, 121, 3, 219, - 40, 14, 21, 121, 3, 218, 151, 14, 21, 121, 3, 218, 90, 14, 21, 121, 3, - 217, 157, 14, 33, 6, 60, 14, 33, 6, 253, 204, 14, 33, 6, 251, 202, 14, - 33, 6, 250, 46, 14, 33, 6, 73, 14, 33, 6, 246, 74, 14, 33, 6, 245, 67, - 14, 33, 6, 243, 225, 14, 33, 6, 72, 14, 33, 6, 237, 126, 14, 33, 6, 237, - 17, 14, 33, 6, 153, 14, 33, 6, 189, 14, 33, 6, 207, 14, 33, 6, 74, 14, - 33, 6, 230, 59, 14, 33, 6, 228, 163, 14, 33, 6, 152, 14, 33, 6, 198, 14, - 33, 6, 222, 201, 14, 33, 6, 68, 14, 33, 6, 216, 216, 14, 33, 6, 219, 40, - 14, 33, 6, 218, 151, 14, 33, 6, 218, 90, 14, 33, 6, 217, 157, 14, 33, 3, - 60, 14, 33, 3, 253, 204, 14, 33, 3, 251, 202, 14, 33, 3, 250, 46, 14, 33, - 3, 73, 14, 33, 3, 246, 74, 14, 33, 3, 245, 67, 14, 33, 3, 243, 225, 14, - 33, 3, 72, 14, 33, 3, 237, 126, 14, 33, 3, 237, 17, 14, 33, 3, 153, 14, - 33, 3, 189, 14, 33, 3, 207, 14, 33, 3, 74, 14, 33, 3, 230, 59, 14, 33, 3, - 228, 163, 14, 33, 3, 152, 14, 33, 3, 198, 14, 33, 3, 222, 201, 14, 33, 3, - 68, 14, 33, 3, 216, 216, 14, 33, 3, 219, 40, 14, 33, 3, 218, 151, 14, 33, - 3, 218, 90, 14, 33, 3, 217, 157, 14, 33, 21, 6, 60, 14, 33, 21, 6, 253, - 204, 14, 33, 21, 6, 251, 202, 14, 33, 21, 6, 250, 46, 14, 33, 21, 6, 73, - 14, 33, 21, 6, 246, 74, 14, 33, 21, 6, 245, 67, 14, 33, 21, 6, 243, 225, - 14, 33, 21, 6, 72, 14, 33, 21, 6, 237, 126, 14, 33, 21, 6, 237, 17, 14, - 33, 21, 6, 153, 14, 33, 21, 6, 189, 14, 33, 21, 6, 207, 14, 33, 21, 6, - 74, 14, 33, 21, 6, 230, 59, 14, 33, 21, 6, 228, 163, 14, 33, 21, 6, 152, - 14, 33, 21, 6, 198, 14, 33, 21, 6, 222, 201, 14, 33, 21, 6, 68, 14, 33, - 21, 6, 216, 216, 14, 33, 21, 6, 219, 40, 14, 33, 21, 6, 218, 151, 14, 33, - 21, 6, 218, 90, 14, 33, 21, 6, 217, 157, 14, 33, 21, 3, 60, 14, 33, 21, - 3, 253, 204, 14, 33, 21, 3, 251, 202, 14, 33, 21, 3, 250, 46, 14, 33, 21, - 3, 73, 14, 33, 21, 3, 246, 74, 14, 33, 21, 3, 245, 67, 14, 33, 21, 3, - 243, 225, 14, 33, 21, 3, 72, 14, 33, 21, 3, 237, 126, 14, 33, 21, 3, 237, - 17, 14, 33, 21, 3, 153, 14, 33, 21, 3, 189, 14, 33, 21, 3, 207, 14, 33, - 21, 3, 74, 14, 33, 21, 3, 230, 59, 14, 33, 21, 3, 228, 163, 14, 33, 21, - 3, 152, 14, 33, 21, 3, 198, 14, 33, 21, 3, 222, 201, 14, 33, 21, 3, 68, - 14, 33, 21, 3, 216, 216, 14, 33, 21, 3, 219, 40, 14, 33, 21, 3, 218, 151, - 14, 33, 21, 3, 218, 90, 14, 33, 21, 3, 217, 157, 14, 33, 30, 6, 60, 14, - 33, 30, 6, 253, 204, 14, 33, 30, 6, 251, 202, 14, 33, 30, 6, 250, 46, 14, - 33, 30, 6, 73, 14, 33, 30, 6, 246, 74, 14, 33, 30, 6, 245, 67, 14, 33, - 30, 6, 243, 225, 14, 33, 30, 6, 72, 14, 33, 30, 6, 237, 126, 14, 33, 30, - 6, 237, 17, 14, 33, 30, 6, 153, 14, 33, 30, 6, 189, 14, 33, 30, 6, 207, - 14, 33, 30, 6, 74, 14, 33, 30, 6, 230, 59, 14, 33, 30, 6, 228, 163, 14, - 33, 30, 6, 152, 14, 33, 30, 6, 198, 14, 33, 30, 6, 222, 201, 14, 33, 30, - 6, 68, 14, 33, 30, 6, 216, 216, 14, 33, 30, 6, 219, 40, 14, 33, 30, 6, - 218, 151, 14, 33, 30, 6, 218, 90, 14, 33, 30, 6, 217, 157, 14, 33, 30, 3, - 60, 14, 33, 30, 3, 253, 204, 14, 33, 30, 3, 251, 202, 14, 33, 30, 3, 250, - 46, 14, 33, 30, 3, 73, 14, 33, 30, 3, 246, 74, 14, 33, 30, 3, 245, 67, - 14, 33, 30, 3, 243, 225, 14, 33, 30, 3, 72, 14, 33, 30, 3, 237, 126, 14, - 33, 30, 3, 237, 17, 14, 33, 30, 3, 153, 14, 33, 30, 3, 189, 14, 33, 30, - 3, 207, 14, 33, 30, 3, 74, 14, 33, 30, 3, 230, 59, 14, 33, 30, 3, 228, - 163, 14, 33, 30, 3, 152, 14, 33, 30, 3, 198, 14, 33, 30, 3, 222, 201, 14, - 33, 30, 3, 68, 14, 33, 30, 3, 216, 216, 14, 33, 30, 3, 219, 40, 14, 33, - 30, 3, 218, 151, 14, 33, 30, 3, 218, 90, 14, 33, 30, 3, 217, 157, 14, 33, - 21, 30, 6, 60, 14, 33, 21, 30, 6, 253, 204, 14, 33, 21, 30, 6, 251, 202, - 14, 33, 21, 30, 6, 250, 46, 14, 33, 21, 30, 6, 73, 14, 33, 21, 30, 6, - 246, 74, 14, 33, 21, 30, 6, 245, 67, 14, 33, 21, 30, 6, 243, 225, 14, 33, - 21, 30, 6, 72, 14, 33, 21, 30, 6, 237, 126, 14, 33, 21, 30, 6, 237, 17, - 14, 33, 21, 30, 6, 153, 14, 33, 21, 30, 6, 189, 14, 33, 21, 30, 6, 207, - 14, 33, 21, 30, 6, 74, 14, 33, 21, 30, 6, 230, 59, 14, 33, 21, 30, 6, - 228, 163, 14, 33, 21, 30, 6, 152, 14, 33, 21, 30, 6, 198, 14, 33, 21, 30, - 6, 222, 201, 14, 33, 21, 30, 6, 68, 14, 33, 21, 30, 6, 216, 216, 14, 33, - 21, 30, 6, 219, 40, 14, 33, 21, 30, 6, 218, 151, 14, 33, 21, 30, 6, 218, - 90, 14, 33, 21, 30, 6, 217, 157, 14, 33, 21, 30, 3, 60, 14, 33, 21, 30, - 3, 253, 204, 14, 33, 21, 30, 3, 251, 202, 14, 33, 21, 30, 3, 250, 46, 14, - 33, 21, 30, 3, 73, 14, 33, 21, 30, 3, 246, 74, 14, 33, 21, 30, 3, 245, - 67, 14, 33, 21, 30, 3, 243, 225, 14, 33, 21, 30, 3, 72, 14, 33, 21, 30, - 3, 237, 126, 14, 33, 21, 30, 3, 237, 17, 14, 33, 21, 30, 3, 153, 14, 33, - 21, 30, 3, 189, 14, 33, 21, 30, 3, 207, 14, 33, 21, 30, 3, 74, 14, 33, - 21, 30, 3, 230, 59, 14, 33, 21, 30, 3, 228, 163, 14, 33, 21, 30, 3, 152, - 14, 33, 21, 30, 3, 198, 14, 33, 21, 30, 3, 222, 201, 14, 33, 21, 30, 3, - 68, 14, 33, 21, 30, 3, 216, 216, 14, 33, 21, 30, 3, 219, 40, 14, 33, 21, - 30, 3, 218, 151, 14, 33, 21, 30, 3, 218, 90, 14, 33, 21, 30, 3, 217, 157, - 14, 211, 6, 60, 14, 211, 6, 253, 204, 14, 211, 6, 251, 202, 14, 211, 6, - 250, 46, 14, 211, 6, 73, 14, 211, 6, 246, 74, 14, 211, 6, 245, 67, 14, - 211, 6, 243, 225, 14, 211, 6, 72, 14, 211, 6, 237, 126, 14, 211, 6, 237, - 17, 14, 211, 6, 153, 14, 211, 6, 189, 14, 211, 6, 207, 14, 211, 6, 74, - 14, 211, 6, 230, 59, 14, 211, 6, 228, 163, 14, 211, 6, 152, 14, 211, 6, - 198, 14, 211, 6, 222, 201, 14, 211, 6, 68, 14, 211, 6, 216, 216, 14, 211, - 6, 219, 40, 14, 211, 6, 218, 151, 14, 211, 6, 218, 90, 14, 211, 6, 217, - 157, 14, 211, 3, 60, 14, 211, 3, 253, 204, 14, 211, 3, 251, 202, 14, 211, - 3, 250, 46, 14, 211, 3, 73, 14, 211, 3, 246, 74, 14, 211, 3, 245, 67, 14, - 211, 3, 243, 225, 14, 211, 3, 72, 14, 211, 3, 237, 126, 14, 211, 3, 237, - 17, 14, 211, 3, 153, 14, 211, 3, 189, 14, 211, 3, 207, 14, 211, 3, 74, - 14, 211, 3, 230, 59, 14, 211, 3, 228, 163, 14, 211, 3, 152, 14, 211, 3, - 198, 14, 211, 3, 222, 201, 14, 211, 3, 68, 14, 211, 3, 216, 216, 14, 211, - 3, 219, 40, 14, 211, 3, 218, 151, 14, 211, 3, 218, 90, 14, 211, 3, 217, - 157, 14, 30, 3, 248, 144, 72, 14, 30, 3, 248, 144, 237, 126, 14, 21, 6, - 254, 146, 14, 21, 6, 252, 102, 14, 21, 6, 244, 231, 14, 21, 6, 249, 62, - 14, 21, 6, 246, 156, 14, 21, 6, 217, 83, 14, 21, 6, 246, 121, 14, 21, 6, - 222, 6, 14, 21, 6, 237, 162, 14, 21, 6, 236, 221, 14, 21, 6, 235, 156, - 14, 21, 6, 233, 99, 14, 21, 6, 231, 144, 14, 21, 6, 218, 130, 14, 21, 6, - 230, 141, 14, 21, 6, 229, 108, 14, 21, 6, 227, 149, 14, 21, 6, 222, 7, - 100, 14, 21, 6, 224, 127, 14, 21, 6, 222, 105, 14, 21, 6, 220, 57, 14, - 21, 6, 229, 129, 14, 21, 6, 251, 31, 14, 21, 6, 228, 212, 14, 21, 6, 230, - 143, 14, 21, 232, 231, 14, 21, 3, 254, 146, 14, 21, 3, 252, 102, 14, 21, - 3, 244, 231, 14, 21, 3, 249, 62, 14, 21, 3, 246, 156, 14, 21, 3, 217, 83, - 14, 21, 3, 246, 121, 14, 21, 3, 222, 6, 14, 21, 3, 237, 162, 14, 21, 3, - 236, 221, 14, 21, 3, 235, 156, 14, 21, 3, 233, 99, 14, 21, 3, 231, 144, - 14, 21, 3, 218, 130, 14, 21, 3, 230, 141, 14, 21, 3, 229, 108, 14, 21, 3, - 227, 149, 14, 21, 3, 39, 224, 127, 14, 21, 3, 224, 127, 14, 21, 3, 222, - 105, 14, 21, 3, 220, 57, 14, 21, 3, 229, 129, 14, 21, 3, 251, 31, 14, 21, - 3, 228, 212, 14, 21, 3, 230, 143, 14, 21, 229, 223, 248, 246, 14, 21, - 246, 157, 100, 14, 21, 222, 7, 100, 14, 21, 236, 222, 100, 14, 21, 229, - 130, 100, 14, 21, 227, 150, 100, 14, 21, 229, 109, 100, 14, 30, 6, 254, - 146, 14, 30, 6, 252, 102, 14, 30, 6, 244, 231, 14, 30, 6, 249, 62, 14, - 30, 6, 246, 156, 14, 30, 6, 217, 83, 14, 30, 6, 246, 121, 14, 30, 6, 222, - 6, 14, 30, 6, 237, 162, 14, 30, 6, 236, 221, 14, 30, 6, 235, 156, 14, 30, - 6, 233, 99, 14, 30, 6, 231, 144, 14, 30, 6, 218, 130, 14, 30, 6, 230, - 141, 14, 30, 6, 229, 108, 14, 30, 6, 227, 149, 14, 30, 6, 222, 7, 100, - 14, 30, 6, 224, 127, 14, 30, 6, 222, 105, 14, 30, 6, 220, 57, 14, 30, 6, - 229, 129, 14, 30, 6, 251, 31, 14, 30, 6, 228, 212, 14, 30, 6, 230, 143, - 14, 30, 232, 231, 14, 30, 3, 254, 146, 14, 30, 3, 252, 102, 14, 30, 3, - 244, 231, 14, 30, 3, 249, 62, 14, 30, 3, 246, 156, 14, 30, 3, 217, 83, - 14, 30, 3, 246, 121, 14, 30, 3, 222, 6, 14, 30, 3, 237, 162, 14, 30, 3, - 236, 221, 14, 30, 3, 235, 156, 14, 30, 3, 233, 99, 14, 30, 3, 231, 144, - 14, 30, 3, 218, 130, 14, 30, 3, 230, 141, 14, 30, 3, 229, 108, 14, 30, 3, - 227, 149, 14, 30, 3, 39, 224, 127, 14, 30, 3, 224, 127, 14, 30, 3, 222, - 105, 14, 30, 3, 220, 57, 14, 30, 3, 229, 129, 14, 30, 3, 251, 31, 14, 30, - 3, 228, 212, 14, 30, 3, 230, 143, 14, 30, 229, 223, 248, 246, 14, 30, - 246, 157, 100, 14, 30, 222, 7, 100, 14, 30, 236, 222, 100, 14, 30, 229, - 130, 100, 14, 30, 227, 150, 100, 14, 30, 229, 109, 100, 14, 21, 30, 6, - 254, 146, 14, 21, 30, 6, 252, 102, 14, 21, 30, 6, 244, 231, 14, 21, 30, - 6, 249, 62, 14, 21, 30, 6, 246, 156, 14, 21, 30, 6, 217, 83, 14, 21, 30, - 6, 246, 121, 14, 21, 30, 6, 222, 6, 14, 21, 30, 6, 237, 162, 14, 21, 30, - 6, 236, 221, 14, 21, 30, 6, 235, 156, 14, 21, 30, 6, 233, 99, 14, 21, 30, - 6, 231, 144, 14, 21, 30, 6, 218, 130, 14, 21, 30, 6, 230, 141, 14, 21, - 30, 6, 229, 108, 14, 21, 30, 6, 227, 149, 14, 21, 30, 6, 222, 7, 100, 14, - 21, 30, 6, 224, 127, 14, 21, 30, 6, 222, 105, 14, 21, 30, 6, 220, 57, 14, - 21, 30, 6, 229, 129, 14, 21, 30, 6, 251, 31, 14, 21, 30, 6, 228, 212, 14, - 21, 30, 6, 230, 143, 14, 21, 30, 232, 231, 14, 21, 30, 3, 254, 146, 14, - 21, 30, 3, 252, 102, 14, 21, 30, 3, 244, 231, 14, 21, 30, 3, 249, 62, 14, - 21, 30, 3, 246, 156, 14, 21, 30, 3, 217, 83, 14, 21, 30, 3, 246, 121, 14, - 21, 30, 3, 222, 6, 14, 21, 30, 3, 237, 162, 14, 21, 30, 3, 236, 221, 14, - 21, 30, 3, 235, 156, 14, 21, 30, 3, 233, 99, 14, 21, 30, 3, 231, 144, 14, - 21, 30, 3, 218, 130, 14, 21, 30, 3, 230, 141, 14, 21, 30, 3, 229, 108, - 14, 21, 30, 3, 227, 149, 14, 21, 30, 3, 39, 224, 127, 14, 21, 30, 3, 224, - 127, 14, 21, 30, 3, 222, 105, 14, 21, 30, 3, 220, 57, 14, 21, 30, 3, 229, - 129, 14, 21, 30, 3, 251, 31, 14, 21, 30, 3, 228, 212, 14, 21, 30, 3, 230, - 143, 14, 21, 30, 229, 223, 248, 246, 14, 21, 30, 246, 157, 100, 14, 21, - 30, 222, 7, 100, 14, 21, 30, 236, 222, 100, 14, 21, 30, 229, 130, 100, - 14, 21, 30, 227, 150, 100, 14, 21, 30, 229, 109, 100, 14, 33, 21, 6, 254, - 146, 14, 33, 21, 6, 252, 102, 14, 33, 21, 6, 244, 231, 14, 33, 21, 6, - 249, 62, 14, 33, 21, 6, 246, 156, 14, 33, 21, 6, 217, 83, 14, 33, 21, 6, - 246, 121, 14, 33, 21, 6, 222, 6, 14, 33, 21, 6, 237, 162, 14, 33, 21, 6, - 236, 221, 14, 33, 21, 6, 235, 156, 14, 33, 21, 6, 233, 99, 14, 33, 21, 6, - 231, 144, 14, 33, 21, 6, 218, 130, 14, 33, 21, 6, 230, 141, 14, 33, 21, - 6, 229, 108, 14, 33, 21, 6, 227, 149, 14, 33, 21, 6, 222, 7, 100, 14, 33, - 21, 6, 224, 127, 14, 33, 21, 6, 222, 105, 14, 33, 21, 6, 220, 57, 14, 33, - 21, 6, 229, 129, 14, 33, 21, 6, 251, 31, 14, 33, 21, 6, 228, 212, 14, 33, - 21, 6, 230, 143, 14, 33, 21, 232, 231, 14, 33, 21, 3, 254, 146, 14, 33, - 21, 3, 252, 102, 14, 33, 21, 3, 244, 231, 14, 33, 21, 3, 249, 62, 14, 33, - 21, 3, 246, 156, 14, 33, 21, 3, 217, 83, 14, 33, 21, 3, 246, 121, 14, 33, - 21, 3, 222, 6, 14, 33, 21, 3, 237, 162, 14, 33, 21, 3, 236, 221, 14, 33, - 21, 3, 235, 156, 14, 33, 21, 3, 233, 99, 14, 33, 21, 3, 231, 144, 14, 33, - 21, 3, 218, 130, 14, 33, 21, 3, 230, 141, 14, 33, 21, 3, 229, 108, 14, - 33, 21, 3, 227, 149, 14, 33, 21, 3, 39, 224, 127, 14, 33, 21, 3, 224, - 127, 14, 33, 21, 3, 222, 105, 14, 33, 21, 3, 220, 57, 14, 33, 21, 3, 229, - 129, 14, 33, 21, 3, 251, 31, 14, 33, 21, 3, 228, 212, 14, 33, 21, 3, 230, - 143, 14, 33, 21, 229, 223, 248, 246, 14, 33, 21, 246, 157, 100, 14, 33, - 21, 222, 7, 100, 14, 33, 21, 236, 222, 100, 14, 33, 21, 229, 130, 100, - 14, 33, 21, 227, 150, 100, 14, 33, 21, 229, 109, 100, 14, 33, 21, 30, 6, - 254, 146, 14, 33, 21, 30, 6, 252, 102, 14, 33, 21, 30, 6, 244, 231, 14, - 33, 21, 30, 6, 249, 62, 14, 33, 21, 30, 6, 246, 156, 14, 33, 21, 30, 6, - 217, 83, 14, 33, 21, 30, 6, 246, 121, 14, 33, 21, 30, 6, 222, 6, 14, 33, - 21, 30, 6, 237, 162, 14, 33, 21, 30, 6, 236, 221, 14, 33, 21, 30, 6, 235, - 156, 14, 33, 21, 30, 6, 233, 99, 14, 33, 21, 30, 6, 231, 144, 14, 33, 21, - 30, 6, 218, 130, 14, 33, 21, 30, 6, 230, 141, 14, 33, 21, 30, 6, 229, - 108, 14, 33, 21, 30, 6, 227, 149, 14, 33, 21, 30, 6, 222, 7, 100, 14, 33, - 21, 30, 6, 224, 127, 14, 33, 21, 30, 6, 222, 105, 14, 33, 21, 30, 6, 220, - 57, 14, 33, 21, 30, 6, 229, 129, 14, 33, 21, 30, 6, 251, 31, 14, 33, 21, - 30, 6, 228, 212, 14, 33, 21, 30, 6, 230, 143, 14, 33, 21, 30, 232, 231, - 14, 33, 21, 30, 3, 254, 146, 14, 33, 21, 30, 3, 252, 102, 14, 33, 21, 30, - 3, 244, 231, 14, 33, 21, 30, 3, 249, 62, 14, 33, 21, 30, 3, 246, 156, 14, - 33, 21, 30, 3, 217, 83, 14, 33, 21, 30, 3, 246, 121, 14, 33, 21, 30, 3, - 222, 6, 14, 33, 21, 30, 3, 237, 162, 14, 33, 21, 30, 3, 236, 221, 14, 33, - 21, 30, 3, 235, 156, 14, 33, 21, 30, 3, 233, 99, 14, 33, 21, 30, 3, 231, - 144, 14, 33, 21, 30, 3, 218, 130, 14, 33, 21, 30, 3, 230, 141, 14, 33, - 21, 30, 3, 229, 108, 14, 33, 21, 30, 3, 227, 149, 14, 33, 21, 30, 3, 39, - 224, 127, 14, 33, 21, 30, 3, 224, 127, 14, 33, 21, 30, 3, 222, 105, 14, - 33, 21, 30, 3, 220, 57, 14, 33, 21, 30, 3, 229, 129, 14, 33, 21, 30, 3, - 251, 31, 14, 33, 21, 30, 3, 228, 212, 14, 33, 21, 30, 3, 230, 143, 14, - 33, 21, 30, 229, 223, 248, 246, 14, 33, 21, 30, 246, 157, 100, 14, 33, - 21, 30, 222, 7, 100, 14, 33, 21, 30, 236, 222, 100, 14, 33, 21, 30, 229, - 130, 100, 14, 33, 21, 30, 227, 150, 100, 14, 33, 21, 30, 229, 109, 100, - 14, 21, 6, 248, 240, 14, 21, 3, 248, 240, 14, 21, 20, 217, 84, 14, 21, - 20, 107, 14, 21, 20, 103, 14, 21, 20, 160, 14, 21, 20, 154, 14, 21, 20, - 174, 14, 21, 20, 182, 14, 21, 20, 191, 14, 21, 20, 185, 14, 21, 20, 190, - 14, 173, 20, 217, 84, 14, 173, 20, 107, 14, 173, 20, 103, 14, 173, 20, - 160, 14, 173, 20, 154, 14, 173, 20, 174, 14, 173, 20, 182, 14, 173, 20, - 191, 14, 173, 20, 185, 14, 173, 20, 190, 14, 33, 20, 217, 84, 14, 33, 20, - 107, 14, 33, 20, 103, 14, 33, 20, 160, 14, 33, 20, 154, 14, 33, 20, 174, - 14, 33, 20, 182, 14, 33, 20, 191, 14, 33, 20, 185, 14, 33, 20, 190, 14, - 33, 21, 20, 217, 84, 14, 33, 21, 20, 107, 14, 33, 21, 20, 103, 14, 33, - 21, 20, 160, 14, 33, 21, 20, 154, 14, 33, 21, 20, 174, 14, 33, 21, 20, - 182, 14, 33, 21, 20, 191, 14, 33, 21, 20, 185, 14, 33, 21, 20, 190, 14, - 211, 20, 217, 84, 14, 211, 20, 107, 14, 211, 20, 103, 14, 211, 20, 160, - 14, 211, 20, 154, 14, 211, 20, 174, 14, 211, 20, 182, 14, 211, 20, 191, - 14, 211, 20, 185, 14, 211, 20, 190, 234, 101, 81, 247, 5, 218, 194, 234, - 101, 81, 224, 6, 218, 194, 234, 101, 81, 218, 217, 218, 194, 234, 101, - 81, 231, 187, 218, 194, 234, 101, 81, 227, 203, 247, 123, 234, 101, 81, - 244, 27, 247, 123, 234, 101, 81, 67, 247, 123, 234, 101, 81, 131, 117, - 251, 54, 234, 101, 81, 124, 117, 251, 54, 234, 101, 81, 148, 117, 251, - 54, 234, 101, 81, 245, 116, 117, 251, 54, 234, 101, 81, 245, 170, 117, - 251, 54, 234, 101, 81, 224, 82, 117, 251, 54, 234, 101, 81, 225, 43, 117, - 251, 54, 234, 101, 81, 246, 235, 117, 251, 54, 234, 101, 81, 232, 31, - 117, 251, 54, 234, 101, 81, 131, 117, 252, 210, 234, 101, 81, 124, 117, - 252, 210, 234, 101, 81, 148, 117, 252, 210, 234, 101, 81, 245, 116, 117, - 252, 210, 234, 101, 81, 245, 170, 117, 252, 210, 234, 101, 81, 224, 82, - 117, 252, 210, 234, 101, 81, 225, 43, 117, 252, 210, 234, 101, 81, 246, - 235, 117, 252, 210, 234, 101, 81, 232, 31, 117, 252, 210, 234, 101, 81, - 131, 117, 250, 220, 234, 101, 81, 124, 117, 250, 220, 234, 101, 81, 148, - 117, 250, 220, 234, 101, 81, 245, 116, 117, 250, 220, 234, 101, 81, 245, - 170, 117, 250, 220, 234, 101, 81, 224, 82, 117, 250, 220, 234, 101, 81, - 225, 43, 117, 250, 220, 234, 101, 81, 246, 235, 117, 250, 220, 234, 101, - 81, 232, 31, 117, 250, 220, 234, 101, 81, 229, 45, 234, 101, 81, 230, - 104, 234, 101, 81, 252, 211, 234, 101, 81, 250, 254, 234, 101, 81, 223, - 232, 234, 101, 81, 223, 70, 234, 101, 81, 253, 223, 234, 101, 81, 218, - 190, 234, 101, 81, 237, 53, 234, 101, 81, 252, 233, 119, 81, 186, 252, - 233, 119, 81, 242, 240, 119, 81, 242, 239, 119, 81, 242, 238, 119, 81, - 242, 237, 119, 81, 242, 236, 119, 81, 242, 235, 119, 81, 242, 234, 119, - 81, 242, 233, 119, 81, 242, 232, 119, 81, 242, 231, 119, 81, 242, 230, - 119, 81, 242, 229, 119, 81, 242, 228, 119, 81, 242, 227, 119, 81, 242, - 226, 119, 81, 242, 225, 119, 81, 242, 224, 119, 81, 242, 223, 119, 81, - 242, 222, 119, 81, 242, 221, 119, 81, 242, 220, 119, 81, 242, 219, 119, - 81, 242, 218, 119, 81, 242, 217, 119, 81, 242, 216, 119, 81, 242, 215, - 119, 81, 242, 214, 119, 81, 242, 213, 119, 81, 242, 212, 119, 81, 242, - 211, 119, 81, 242, 210, 119, 81, 242, 209, 119, 81, 242, 208, 119, 81, - 242, 207, 119, 81, 242, 206, 119, 81, 242, 205, 119, 81, 242, 204, 119, - 81, 242, 203, 119, 81, 242, 202, 119, 81, 242, 201, 119, 81, 242, 200, - 119, 81, 242, 199, 119, 81, 242, 198, 119, 81, 242, 197, 119, 81, 242, - 196, 119, 81, 242, 195, 119, 81, 242, 194, 119, 81, 242, 193, 119, 81, - 242, 192, 119, 81, 69, 252, 233, 119, 81, 219, 151, 119, 81, 219, 150, - 119, 81, 219, 149, 119, 81, 219, 148, 119, 81, 219, 147, 119, 81, 219, - 146, 119, 81, 219, 145, 119, 81, 219, 144, 119, 81, 219, 143, 119, 81, - 219, 142, 119, 81, 219, 141, 119, 81, 219, 140, 119, 81, 219, 139, 119, - 81, 219, 138, 119, 81, 219, 137, 119, 81, 219, 136, 119, 81, 219, 135, - 119, 81, 219, 134, 119, 81, 219, 133, 119, 81, 219, 132, 119, 81, 219, - 131, 119, 81, 219, 130, 119, 81, 219, 129, 119, 81, 219, 128, 119, 81, - 219, 127, 119, 81, 219, 126, 119, 81, 219, 125, 119, 81, 219, 124, 119, - 81, 219, 123, 119, 81, 219, 122, 119, 81, 219, 121, 119, 81, 219, 120, - 119, 81, 219, 119, 119, 81, 219, 118, 119, 81, 219, 117, 119, 81, 219, - 116, 119, 81, 219, 115, 119, 81, 219, 114, 119, 81, 219, 113, 119, 81, - 219, 112, 119, 81, 219, 111, 119, 81, 219, 110, 119, 81, 219, 109, 119, - 81, 219, 108, 119, 81, 219, 107, 119, 81, 219, 106, 119, 81, 219, 105, - 119, 81, 219, 104, 119, 81, 219, 103, 20, 217, 85, 245, 90, 223, 136, 20, - 217, 85, 250, 168, 20, 131, 250, 168, 20, 124, 250, 168, 20, 148, 250, - 168, 20, 245, 116, 250, 168, 20, 245, 170, 250, 168, 20, 224, 82, 250, - 168, 20, 225, 43, 250, 168, 20, 246, 235, 250, 168, 20, 232, 31, 250, - 168, 82, 7, 6, 1, 60, 82, 7, 6, 1, 253, 204, 82, 7, 6, 1, 251, 202, 82, - 7, 6, 1, 250, 46, 82, 7, 6, 1, 73, 82, 7, 6, 1, 246, 74, 82, 7, 6, 1, - 245, 67, 82, 7, 6, 1, 243, 225, 82, 7, 6, 1, 72, 82, 7, 6, 1, 237, 126, - 82, 7, 6, 1, 237, 17, 82, 7, 6, 1, 153, 82, 7, 6, 1, 189, 82, 7, 6, 1, - 207, 82, 7, 6, 1, 74, 82, 7, 6, 1, 230, 59, 82, 7, 6, 1, 228, 163, 82, 7, - 6, 1, 152, 82, 7, 6, 1, 198, 82, 7, 6, 1, 222, 201, 82, 7, 6, 1, 68, 82, - 7, 6, 1, 216, 216, 82, 7, 6, 1, 219, 40, 82, 7, 6, 1, 218, 151, 82, 7, 6, - 1, 218, 90, 82, 7, 6, 1, 217, 157, 221, 114, 224, 236, 252, 17, 7, 6, 1, - 198, 34, 30, 7, 6, 1, 251, 202, 34, 30, 7, 6, 1, 152, 34, 251, 100, 34, - 218, 153, 204, 7, 6, 1, 253, 204, 204, 7, 6, 1, 207, 204, 7, 6, 1, 230, - 59, 204, 7, 6, 1, 198, 204, 7, 6, 1, 219, 40, 204, 242, 154, 204, 233, - 52, 204, 226, 96, 204, 223, 219, 204, 229, 4, 232, 136, 34, 7, 6, 1, 243, - 225, 232, 136, 34, 7, 6, 1, 230, 59, 232, 136, 204, 7, 6, 1, 237, 126, - 232, 136, 204, 7, 6, 1, 153, 232, 136, 204, 7, 6, 1, 189, 232, 136, 204, - 7, 6, 1, 230, 59, 250, 98, 232, 136, 204, 7, 6, 1, 230, 59, 232, 136, - 204, 242, 67, 232, 136, 204, 187, 232, 136, 204, 226, 177, 40, 248, 184, - 40, 136, 243, 0, 204, 9, 220, 76, 240, 8, 204, 9, 220, 76, 240, 12, 204, - 9, 220, 76, 240, 18, 204, 52, 249, 92, 204, 9, 220, 76, 240, 24, 204, 9, - 220, 76, 240, 14, 204, 9, 220, 76, 239, 248, 204, 9, 220, 76, 240, 13, - 204, 9, 220, 76, 240, 23, 204, 9, 220, 76, 240, 0, 204, 9, 220, 76, 239, - 252, 204, 9, 220, 76, 240, 2, 204, 9, 220, 76, 240, 20, 204, 9, 220, 76, - 240, 9, 204, 9, 220, 76, 240, 22, 204, 9, 220, 76, 240, 1, 204, 9, 220, - 76, 240, 21, 204, 9, 220, 76, 239, 249, 204, 9, 220, 76, 239, 251, 204, - 9, 220, 76, 239, 247, 204, 9, 220, 76, 240, 15, 204, 9, 220, 76, 240, 16, - 204, 9, 220, 76, 239, 254, 204, 9, 220, 76, 240, 6, 204, 9, 220, 76, 240, - 4, 204, 9, 220, 76, 240, 27, 204, 9, 220, 76, 240, 26, 204, 9, 220, 76, - 239, 245, 204, 9, 220, 76, 240, 10, 204, 9, 220, 76, 240, 25, 204, 9, - 220, 76, 240, 17, 204, 9, 220, 76, 240, 5, 204, 9, 220, 76, 239, 246, - 204, 9, 220, 76, 240, 7, 221, 114, 224, 236, 252, 17, 9, 220, 76, 239, - 255, 221, 114, 224, 236, 252, 17, 9, 220, 76, 240, 26, 221, 114, 224, - 236, 252, 17, 9, 220, 76, 240, 24, 221, 114, 224, 236, 252, 17, 9, 220, - 76, 240, 11, 221, 114, 224, 236, 252, 17, 9, 220, 76, 239, 253, 221, 114, - 224, 236, 252, 17, 9, 220, 76, 240, 7, 221, 114, 224, 236, 252, 17, 9, - 220, 76, 239, 250, 221, 114, 224, 236, 252, 17, 9, 220, 76, 240, 19, 221, - 114, 224, 236, 252, 17, 9, 220, 76, 240, 3, 9, 13, 242, 57, 9, 13, 242, - 56, 9, 13, 242, 55, 9, 13, 242, 54, 9, 13, 242, 53, 9, 13, 242, 52, 9, - 13, 242, 51, 9, 13, 242, 50, 9, 13, 242, 49, 9, 13, 242, 48, 9, 13, 242, - 47, 9, 13, 242, 46, 9, 13, 242, 45, 9, 13, 242, 44, 9, 13, 242, 43, 9, - 13, 242, 42, 9, 13, 242, 41, 9, 13, 242, 40, 9, 13, 242, 39, 9, 13, 242, - 38, 9, 13, 242, 37, 9, 13, 242, 36, 9, 13, 242, 35, 9, 13, 242, 34, 9, - 13, 242, 33, 9, 13, 242, 32, 9, 13, 242, 31, 9, 13, 242, 30, 9, 13, 242, - 29, 9, 13, 242, 28, 9, 13, 242, 27, 9, 13, 242, 26, 9, 13, 242, 25, 9, - 13, 242, 24, 9, 13, 242, 23, 9, 13, 242, 22, 9, 13, 242, 21, 9, 13, 242, - 20, 9, 13, 242, 19, 9, 13, 242, 18, 9, 13, 242, 17, 9, 13, 242, 16, 9, - 13, 242, 15, 9, 13, 242, 14, 9, 13, 242, 13, 9, 13, 242, 12, 9, 13, 242, - 11, 9, 13, 242, 10, 9, 13, 242, 9, 9, 13, 242, 8, 9, 13, 242, 7, 9, 13, - 242, 6, 9, 13, 242, 5, 9, 13, 242, 4, 9, 13, 242, 3, 9, 13, 242, 2, 9, - 13, 242, 1, 9, 13, 242, 0, 9, 13, 241, 255, 9, 13, 241, 254, 9, 13, 241, - 253, 9, 13, 241, 252, 9, 13, 241, 251, 9, 13, 241, 250, 9, 13, 241, 249, - 9, 13, 241, 248, 9, 13, 241, 247, 9, 13, 241, 246, 9, 13, 241, 245, 9, - 13, 241, 244, 9, 13, 241, 243, 9, 13, 241, 242, 9, 13, 241, 241, 9, 13, - 241, 240, 9, 13, 241, 239, 9, 13, 241, 238, 9, 13, 241, 237, 9, 13, 241, - 236, 9, 13, 241, 235, 9, 13, 241, 234, 9, 13, 241, 233, 9, 13, 241, 232, - 9, 13, 241, 231, 9, 13, 241, 230, 9, 13, 241, 229, 9, 13, 241, 228, 9, - 13, 241, 227, 9, 13, 241, 226, 9, 13, 241, 225, 9, 13, 241, 224, 9, 13, - 241, 223, 9, 13, 241, 222, 9, 13, 241, 221, 9, 13, 241, 220, 9, 13, 241, - 219, 9, 13, 241, 218, 9, 13, 241, 217, 9, 13, 241, 216, 9, 13, 241, 215, - 9, 13, 241, 214, 9, 13, 241, 213, 9, 13, 241, 212, 9, 13, 241, 211, 9, - 13, 241, 210, 9, 13, 241, 209, 9, 13, 241, 208, 9, 13, 241, 207, 9, 13, - 241, 206, 9, 13, 241, 205, 9, 13, 241, 204, 9, 13, 241, 203, 9, 13, 241, - 202, 9, 13, 241, 201, 9, 13, 241, 200, 9, 13, 241, 199, 9, 13, 241, 198, - 9, 13, 241, 197, 9, 13, 241, 196, 9, 13, 241, 195, 9, 13, 241, 194, 9, - 13, 241, 193, 9, 13, 241, 192, 9, 13, 241, 191, 9, 13, 241, 190, 9, 13, - 241, 189, 9, 13, 241, 188, 9, 13, 241, 187, 9, 13, 241, 186, 9, 13, 241, - 185, 9, 13, 241, 184, 9, 13, 241, 183, 9, 13, 241, 182, 9, 13, 241, 181, - 9, 13, 241, 180, 9, 13, 241, 179, 9, 13, 241, 178, 9, 13, 241, 177, 9, - 13, 241, 176, 9, 13, 241, 175, 9, 13, 241, 174, 9, 13, 241, 173, 9, 13, - 241, 172, 9, 13, 241, 171, 9, 13, 241, 170, 9, 13, 241, 169, 9, 13, 241, - 168, 9, 13, 241, 167, 9, 13, 241, 166, 9, 13, 241, 165, 9, 13, 241, 164, - 9, 13, 241, 163, 9, 13, 241, 162, 9, 13, 241, 161, 9, 13, 241, 160, 9, - 13, 241, 159, 9, 13, 241, 158, 9, 13, 241, 157, 9, 13, 241, 156, 9, 13, - 241, 155, 9, 13, 241, 154, 9, 13, 241, 153, 9, 13, 241, 152, 9, 13, 241, - 151, 9, 13, 241, 150, 9, 13, 241, 149, 9, 13, 241, 148, 9, 13, 241, 147, - 9, 13, 241, 146, 9, 13, 241, 145, 9, 13, 241, 144, 9, 13, 241, 143, 9, - 13, 241, 142, 9, 13, 241, 141, 9, 13, 241, 140, 9, 13, 241, 139, 9, 13, - 241, 138, 9, 13, 241, 137, 9, 13, 241, 136, 9, 13, 241, 135, 9, 13, 241, - 134, 9, 13, 241, 133, 9, 13, 241, 132, 9, 13, 241, 131, 9, 13, 241, 130, - 9, 13, 241, 129, 9, 13, 241, 128, 9, 13, 241, 127, 9, 13, 241, 126, 9, - 13, 241, 125, 9, 13, 241, 124, 9, 13, 241, 123, 9, 13, 241, 122, 9, 13, - 241, 121, 9, 13, 241, 120, 9, 13, 241, 119, 9, 13, 241, 118, 9, 13, 241, - 117, 9, 13, 241, 116, 9, 13, 241, 115, 9, 13, 241, 114, 9, 13, 241, 113, - 9, 13, 241, 112, 9, 13, 241, 111, 9, 13, 241, 110, 9, 13, 241, 109, 9, - 13, 241, 108, 9, 13, 241, 107, 9, 13, 241, 106, 9, 13, 241, 105, 9, 13, - 241, 104, 9, 13, 241, 103, 9, 13, 241, 102, 9, 13, 241, 101, 9, 13, 241, - 100, 9, 13, 241, 99, 9, 13, 241, 98, 9, 13, 241, 97, 9, 13, 241, 96, 9, - 13, 241, 95, 9, 13, 241, 94, 9, 13, 241, 93, 9, 13, 241, 92, 9, 13, 241, - 91, 9, 13, 241, 90, 9, 13, 241, 89, 9, 13, 241, 88, 9, 13, 241, 87, 9, - 13, 241, 86, 9, 13, 241, 85, 9, 13, 241, 84, 9, 13, 241, 83, 9, 13, 241, - 82, 9, 13, 241, 81, 9, 13, 241, 80, 9, 13, 241, 79, 9, 13, 241, 78, 9, - 13, 241, 77, 9, 13, 241, 76, 9, 13, 241, 75, 9, 13, 241, 74, 9, 13, 241, - 73, 9, 13, 241, 72, 9, 13, 241, 71, 9, 13, 241, 70, 9, 13, 241, 69, 9, - 13, 241, 68, 9, 13, 241, 67, 9, 13, 241, 66, 9, 13, 241, 65, 9, 13, 241, - 64, 9, 13, 241, 63, 9, 13, 241, 62, 9, 13, 241, 61, 9, 13, 241, 60, 9, - 13, 241, 59, 9, 13, 241, 58, 9, 13, 241, 57, 9, 13, 241, 56, 9, 13, 241, - 55, 9, 13, 241, 54, 9, 13, 241, 53, 9, 13, 241, 52, 9, 13, 241, 51, 9, - 13, 241, 50, 9, 13, 241, 49, 9, 13, 241, 48, 9, 13, 241, 47, 9, 13, 241, - 46, 9, 13, 241, 45, 9, 13, 241, 44, 9, 13, 241, 43, 9, 13, 241, 42, 9, - 13, 241, 41, 9, 13, 241, 40, 9, 13, 241, 39, 9, 13, 241, 38, 9, 13, 241, - 37, 9, 13, 241, 36, 9, 13, 241, 35, 9, 13, 241, 34, 9, 13, 241, 33, 9, - 13, 241, 32, 9, 13, 241, 31, 9, 13, 241, 30, 9, 13, 241, 29, 9, 13, 241, - 28, 9, 13, 241, 27, 9, 13, 241, 26, 9, 13, 241, 25, 9, 13, 241, 24, 9, - 13, 241, 23, 9, 13, 241, 22, 9, 13, 241, 21, 9, 13, 241, 20, 9, 13, 241, - 19, 9, 13, 241, 18, 9, 13, 241, 17, 9, 13, 241, 16, 9, 13, 241, 15, 9, - 13, 241, 14, 9, 13, 241, 13, 9, 13, 241, 12, 9, 13, 241, 11, 9, 13, 241, - 10, 9, 13, 241, 9, 9, 13, 241, 8, 9, 13, 241, 7, 9, 13, 241, 6, 9, 13, - 241, 5, 9, 13, 241, 4, 9, 13, 241, 3, 9, 13, 241, 2, 9, 13, 241, 1, 9, - 13, 241, 0, 9, 13, 240, 255, 9, 13, 240, 254, 9, 13, 240, 253, 9, 13, - 240, 252, 9, 13, 240, 251, 9, 13, 240, 250, 9, 13, 240, 249, 9, 13, 240, - 248, 9, 13, 240, 247, 9, 13, 240, 246, 9, 13, 240, 245, 9, 13, 240, 244, - 9, 13, 240, 243, 9, 13, 240, 242, 9, 13, 240, 241, 9, 13, 240, 240, 9, - 13, 240, 239, 9, 13, 240, 238, 9, 13, 240, 237, 9, 13, 240, 236, 9, 13, - 240, 235, 9, 13, 240, 234, 9, 13, 240, 233, 9, 13, 240, 232, 9, 13, 240, - 231, 9, 13, 240, 230, 9, 13, 240, 229, 9, 13, 240, 228, 9, 13, 240, 227, - 9, 13, 240, 226, 9, 13, 240, 225, 9, 13, 240, 224, 9, 13, 240, 223, 9, - 13, 240, 222, 9, 13, 240, 221, 9, 13, 240, 220, 9, 13, 240, 219, 9, 13, - 240, 218, 9, 13, 240, 217, 9, 13, 240, 216, 9, 13, 240, 215, 9, 13, 240, - 214, 9, 13, 240, 213, 9, 13, 240, 212, 9, 13, 240, 211, 9, 13, 240, 210, - 9, 13, 240, 209, 9, 13, 240, 208, 9, 13, 240, 207, 9, 13, 240, 206, 9, - 13, 240, 205, 9, 13, 240, 204, 9, 13, 240, 203, 9, 13, 240, 202, 9, 13, - 240, 201, 9, 13, 240, 200, 9, 13, 240, 199, 9, 13, 240, 198, 9, 13, 240, - 197, 9, 13, 240, 196, 9, 13, 240, 195, 9, 13, 240, 194, 9, 13, 240, 193, - 9, 13, 240, 192, 9, 13, 240, 191, 9, 13, 240, 190, 9, 13, 240, 189, 9, - 13, 240, 188, 9, 13, 240, 187, 9, 13, 240, 186, 9, 13, 240, 185, 9, 13, - 240, 184, 9, 13, 240, 183, 9, 13, 240, 182, 9, 13, 240, 181, 9, 13, 240, - 180, 9, 13, 240, 179, 9, 13, 240, 178, 9, 13, 240, 177, 9, 13, 240, 176, - 9, 13, 240, 175, 9, 13, 240, 174, 9, 13, 240, 173, 9, 13, 240, 172, 9, - 13, 240, 171, 9, 13, 240, 170, 9, 13, 240, 169, 9, 13, 240, 168, 9, 13, - 240, 167, 9, 13, 240, 166, 9, 13, 240, 165, 9, 13, 240, 164, 9, 13, 240, - 163, 9, 13, 240, 162, 9, 13, 240, 161, 9, 13, 240, 160, 9, 13, 240, 159, - 9, 13, 240, 158, 9, 13, 240, 157, 9, 13, 240, 156, 9, 13, 240, 155, 9, - 13, 240, 154, 9, 13, 240, 153, 9, 13, 240, 152, 9, 13, 240, 151, 9, 13, - 240, 150, 9, 13, 240, 149, 9, 13, 240, 148, 9, 13, 240, 147, 9, 13, 240, - 146, 9, 13, 240, 145, 9, 13, 240, 144, 9, 13, 240, 143, 9, 13, 240, 142, - 9, 13, 240, 141, 9, 13, 240, 140, 9, 13, 240, 139, 9, 13, 240, 138, 9, - 13, 240, 137, 9, 13, 240, 136, 9, 13, 240, 135, 9, 13, 240, 134, 9, 13, - 240, 133, 9, 13, 240, 132, 9, 13, 240, 131, 9, 13, 240, 130, 9, 13, 240, - 129, 9, 13, 240, 128, 9, 13, 240, 127, 9, 13, 240, 126, 9, 13, 240, 125, - 9, 13, 240, 124, 9, 13, 240, 123, 9, 13, 240, 122, 9, 13, 240, 121, 9, - 13, 240, 120, 9, 13, 240, 119, 9, 13, 240, 118, 9, 13, 240, 117, 9, 13, - 240, 116, 9, 13, 240, 115, 9, 13, 240, 114, 9, 13, 240, 113, 9, 13, 240, - 112, 9, 13, 240, 111, 9, 13, 240, 110, 9, 13, 240, 109, 9, 13, 240, 108, - 9, 13, 240, 107, 9, 13, 240, 106, 9, 13, 240, 105, 9, 13, 240, 104, 9, - 13, 240, 103, 9, 13, 240, 102, 9, 13, 240, 101, 9, 13, 240, 100, 9, 13, - 240, 99, 9, 13, 240, 98, 9, 13, 240, 97, 9, 13, 240, 96, 9, 13, 240, 95, - 9, 13, 240, 94, 9, 13, 240, 93, 9, 13, 240, 92, 9, 13, 240, 91, 9, 13, - 240, 90, 9, 13, 240, 89, 9, 13, 240, 88, 9, 13, 240, 87, 9, 13, 240, 86, - 9, 13, 240, 85, 9, 13, 240, 84, 9, 13, 240, 83, 9, 13, 240, 82, 9, 13, - 240, 81, 9, 13, 240, 80, 9, 13, 240, 79, 9, 13, 240, 78, 9, 13, 240, 77, - 9, 13, 240, 76, 9, 13, 240, 75, 9, 13, 240, 74, 9, 13, 240, 73, 9, 13, - 240, 72, 9, 13, 240, 71, 9, 13, 240, 70, 9, 13, 240, 69, 9, 13, 240, 68, - 9, 13, 240, 67, 9, 13, 240, 66, 9, 13, 240, 65, 9, 13, 240, 64, 9, 13, - 240, 63, 9, 13, 240, 62, 9, 13, 240, 61, 9, 13, 240, 60, 9, 13, 240, 59, - 9, 13, 240, 58, 9, 13, 240, 57, 9, 13, 240, 56, 9, 13, 240, 55, 9, 13, - 240, 54, 9, 13, 240, 53, 9, 13, 240, 52, 9, 13, 240, 51, 9, 13, 240, 50, - 9, 13, 240, 49, 9, 13, 240, 48, 9, 13, 240, 47, 9, 13, 240, 46, 9, 13, - 240, 45, 9, 13, 240, 44, 9, 13, 240, 43, 9, 13, 240, 42, 9, 13, 240, 41, - 9, 13, 240, 40, 9, 13, 240, 39, 9, 13, 240, 38, 9, 13, 240, 37, 9, 13, - 240, 36, 9, 13, 240, 35, 9, 13, 240, 34, 9, 13, 240, 33, 9, 13, 240, 32, - 9, 13, 240, 31, 9, 13, 240, 30, 9, 13, 240, 29, 9, 13, 240, 28, 235, 148, - 222, 141, 118, 223, 254, 118, 246, 95, 78, 118, 228, 69, 78, 118, 54, 55, - 118, 248, 155, 55, 118, 229, 169, 55, 118, 254, 134, 118, 254, 79, 118, - 42, 229, 229, 118, 45, 229, 229, 118, 253, 251, 118, 88, 55, 118, 250, - 168, 118, 242, 120, 118, 245, 90, 223, 136, 118, 224, 17, 118, 20, 217, - 84, 118, 20, 107, 118, 20, 103, 118, 20, 160, 118, 20, 154, 118, 20, 174, - 118, 20, 182, 118, 20, 191, 118, 20, 185, 118, 20, 190, 118, 250, 175, - 118, 225, 67, 118, 235, 87, 55, 118, 246, 154, 55, 118, 244, 30, 55, 118, - 228, 82, 78, 118, 250, 167, 253, 244, 118, 7, 6, 1, 60, 118, 7, 6, 1, - 253, 204, 118, 7, 6, 1, 251, 202, 118, 7, 6, 1, 250, 46, 118, 7, 6, 1, - 73, 118, 7, 6, 1, 246, 74, 118, 7, 6, 1, 245, 67, 118, 7, 6, 1, 243, 225, - 118, 7, 6, 1, 72, 118, 7, 6, 1, 237, 126, 118, 7, 6, 1, 237, 17, 118, 7, - 6, 1, 153, 118, 7, 6, 1, 189, 118, 7, 6, 1, 207, 118, 7, 6, 1, 74, 118, - 7, 6, 1, 230, 59, 118, 7, 6, 1, 228, 163, 118, 7, 6, 1, 152, 118, 7, 6, - 1, 198, 118, 7, 6, 1, 222, 201, 118, 7, 6, 1, 68, 118, 7, 6, 1, 216, 216, - 118, 7, 6, 1, 219, 40, 118, 7, 6, 1, 218, 151, 118, 7, 6, 1, 218, 90, - 118, 7, 6, 1, 217, 157, 118, 42, 40, 115, 118, 227, 160, 224, 17, 118, - 45, 40, 115, 118, 250, 217, 255, 0, 118, 109, 235, 43, 118, 244, 37, 255, - 0, 118, 7, 3, 1, 60, 118, 7, 3, 1, 253, 204, 118, 7, 3, 1, 251, 202, 118, - 7, 3, 1, 250, 46, 118, 7, 3, 1, 73, 118, 7, 3, 1, 246, 74, 118, 7, 3, 1, - 245, 67, 118, 7, 3, 1, 243, 225, 118, 7, 3, 1, 72, 118, 7, 3, 1, 237, - 126, 118, 7, 3, 1, 237, 17, 118, 7, 3, 1, 153, 118, 7, 3, 1, 189, 118, 7, - 3, 1, 207, 118, 7, 3, 1, 74, 118, 7, 3, 1, 230, 59, 118, 7, 3, 1, 228, - 163, 118, 7, 3, 1, 152, 118, 7, 3, 1, 198, 118, 7, 3, 1, 222, 201, 118, - 7, 3, 1, 68, 118, 7, 3, 1, 216, 216, 118, 7, 3, 1, 219, 40, 118, 7, 3, 1, - 218, 151, 118, 7, 3, 1, 218, 90, 118, 7, 3, 1, 217, 157, 118, 42, 250, - 79, 115, 118, 69, 235, 43, 118, 45, 250, 79, 115, 118, 221, 179, 251, - 153, 222, 141, 41, 225, 251, 41, 225, 240, 41, 225, 229, 41, 225, 217, - 41, 225, 206, 41, 225, 195, 41, 225, 184, 41, 225, 173, 41, 225, 162, 41, - 225, 154, 41, 225, 153, 41, 225, 152, 41, 225, 151, 41, 225, 149, 41, - 225, 148, 41, 225, 147, 41, 225, 146, 41, 225, 145, 41, 225, 144, 41, - 225, 143, 41, 225, 142, 41, 225, 141, 41, 225, 140, 41, 225, 138, 41, - 225, 137, 41, 225, 136, 41, 225, 135, 41, 225, 134, 41, 225, 133, 41, - 225, 132, 41, 225, 131, 41, 225, 130, 41, 225, 129, 41, 225, 127, 41, - 225, 126, 41, 225, 125, 41, 225, 124, 41, 225, 123, 41, 225, 122, 41, - 225, 121, 41, 225, 120, 41, 225, 119, 41, 225, 118, 41, 225, 116, 41, - 225, 115, 41, 225, 114, 41, 225, 113, 41, 225, 112, 41, 225, 111, 41, - 225, 110, 41, 225, 109, 41, 225, 108, 41, 225, 107, 41, 225, 105, 41, - 225, 104, 41, 225, 103, 41, 225, 102, 41, 225, 101, 41, 225, 100, 41, - 225, 99, 41, 225, 98, 41, 225, 97, 41, 225, 96, 41, 225, 94, 41, 225, 93, - 41, 225, 92, 41, 225, 91, 41, 225, 90, 41, 225, 89, 41, 225, 88, 41, 225, - 87, 41, 225, 86, 41, 225, 85, 41, 225, 83, 41, 225, 82, 41, 225, 81, 41, - 225, 80, 41, 225, 79, 41, 225, 78, 41, 225, 77, 41, 225, 76, 41, 225, 75, - 41, 225, 74, 41, 226, 71, 41, 226, 70, 41, 226, 69, 41, 226, 68, 41, 226, - 67, 41, 226, 66, 41, 226, 65, 41, 226, 64, 41, 226, 63, 41, 226, 62, 41, - 226, 60, 41, 226, 59, 41, 226, 58, 41, 226, 57, 41, 226, 56, 41, 226, 55, - 41, 226, 54, 41, 226, 53, 41, 226, 52, 41, 226, 51, 41, 226, 49, 41, 226, - 48, 41, 226, 47, 41, 226, 46, 41, 226, 45, 41, 226, 44, 41, 226, 43, 41, - 226, 42, 41, 226, 41, 41, 226, 40, 41, 226, 38, 41, 226, 37, 41, 226, 36, - 41, 226, 35, 41, 226, 34, 41, 226, 33, 41, 226, 32, 41, 226, 31, 41, 226, - 30, 41, 226, 29, 41, 226, 27, 41, 226, 26, 41, 226, 25, 41, 226, 24, 41, - 226, 23, 41, 226, 22, 41, 226, 21, 41, 226, 20, 41, 226, 19, 41, 226, 18, - 41, 226, 16, 41, 226, 15, 41, 226, 14, 41, 226, 13, 41, 226, 12, 41, 226, - 11, 41, 226, 10, 41, 226, 9, 41, 226, 8, 41, 226, 7, 41, 226, 5, 41, 226, - 4, 41, 226, 3, 41, 226, 2, 41, 226, 1, 41, 226, 0, 41, 225, 255, 41, 225, - 254, 41, 225, 253, 41, 225, 252, 41, 225, 250, 41, 225, 249, 41, 225, - 248, 41, 225, 247, 41, 225, 246, 41, 225, 245, 41, 225, 244, 41, 225, - 243, 41, 225, 242, 41, 225, 241, 41, 225, 239, 41, 225, 238, 41, 225, - 237, 41, 225, 236, 41, 225, 235, 41, 225, 234, 41, 225, 233, 41, 225, - 232, 41, 225, 231, 41, 225, 230, 41, 225, 228, 41, 225, 227, 41, 225, - 226, 41, 225, 225, 41, 225, 224, 41, 225, 223, 41, 225, 222, 41, 225, - 221, 41, 225, 220, 41, 225, 219, 41, 225, 216, 41, 225, 215, 41, 225, - 214, 41, 225, 213, 41, 225, 212, 41, 225, 211, 41, 225, 210, 41, 225, - 209, 41, 225, 208, 41, 225, 207, 41, 225, 205, 41, 225, 204, 41, 225, - 203, 41, 225, 202, 41, 225, 201, 41, 225, 200, 41, 225, 199, 41, 225, - 198, 41, 225, 197, 41, 225, 196, 41, 225, 194, 41, 225, 193, 41, 225, - 192, 41, 225, 191, 41, 225, 190, 41, 225, 189, 41, 225, 188, 41, 225, - 187, 41, 225, 186, 41, 225, 185, 41, 225, 183, 41, 225, 182, 41, 225, - 181, 41, 225, 180, 41, 225, 179, 41, 225, 178, 41, 225, 177, 41, 225, - 176, 41, 225, 175, 41, 225, 174, 41, 225, 172, 41, 225, 171, 41, 225, - 170, 41, 225, 169, 41, 225, 168, 41, 225, 167, 41, 225, 166, 41, 225, - 165, 41, 225, 164, 41, 225, 163, 41, 225, 161, 41, 225, 160, 41, 225, - 159, 41, 225, 158, 41, 225, 157, 41, 225, 156, 41, 225, 155, + 0, 219, 206, 244, 254, 77, 224, 143, 77, 50, 52, 247, 86, 52, 226, 57, + 52, 254, 35, 253, 226, 42, 226, 131, 46, 226, 131, 253, 132, 94, 52, 249, + 157, 240, 159, 243, 200, 219, 69, 219, 231, 21, 212, 79, 21, 116, 21, + 109, 21, 166, 21, 163, 21, 180, 21, 189, 21, 198, 21, 195, 21, 200, 249, + 164, 221, 70, 233, 39, 52, 245, 61, 52, 242, 107, 52, 224, 158, 77, 249, + 156, 253, 122, 7, 6, 1, 61, 7, 6, 1, 253, 74, 7, 6, 1, 250, 252, 7, 6, 1, + 249, 3, 7, 6, 1, 74, 7, 6, 1, 244, 230, 7, 6, 1, 243, 177, 7, 6, 1, 242, + 41, 7, 6, 1, 72, 7, 6, 1, 235, 142, 7, 6, 1, 235, 27, 7, 6, 1, 150, 7, 6, + 1, 183, 7, 6, 1, 204, 7, 6, 1, 75, 7, 6, 1, 226, 229, 7, 6, 1, 224, 240, + 7, 6, 1, 149, 7, 6, 1, 197, 7, 6, 1, 218, 99, 7, 6, 1, 69, 7, 6, 1, 215, + 79, 7, 6, 1, 214, 82, 7, 6, 1, 213, 166, 7, 6, 1, 213, 105, 7, 6, 1, 212, + 152, 42, 41, 125, 223, 203, 219, 231, 46, 41, 125, 249, 224, 254, 174, + 115, 232, 242, 242, 114, 254, 174, 7, 3, 1, 61, 7, 3, 1, 253, 74, 7, 3, + 1, 250, 252, 7, 3, 1, 249, 3, 7, 3, 1, 74, 7, 3, 1, 244, 230, 7, 3, 1, + 243, 177, 7, 3, 1, 242, 41, 7, 3, 1, 72, 7, 3, 1, 235, 142, 7, 3, 1, 235, + 27, 7, 3, 1, 150, 7, 3, 1, 183, 7, 3, 1, 204, 7, 3, 1, 75, 7, 3, 1, 226, + 229, 7, 3, 1, 224, 240, 7, 3, 1, 149, 7, 3, 1, 197, 7, 3, 1, 218, 99, 7, + 3, 1, 69, 7, 3, 1, 215, 79, 7, 3, 1, 214, 82, 7, 3, 1, 213, 166, 7, 3, 1, + 213, 105, 7, 3, 1, 212, 152, 42, 249, 40, 125, 71, 232, 242, 46, 249, 40, + 125, 217, 42, 228, 184, 219, 206, 235, 191, 244, 254, 77, 250, 110, 52, + 225, 108, 52, 249, 39, 52, 213, 31, 52, 251, 63, 134, 222, 92, 52, 247, + 209, 249, 102, 52, 244, 105, 227, 21, 235, 235, 233, 66, 51, 254, 19, + 224, 143, 77, 228, 163, 52, 219, 236, 240, 160, 223, 252, 52, 232, 37, + 248, 22, 52, 225, 155, 52, 218, 223, 109, 218, 223, 166, 254, 164, 254, + 174, 231, 41, 52, 225, 200, 52, 231, 37, 247, 74, 250, 117, 218, 223, + 116, 231, 211, 227, 21, 235, 235, 223, 144, 51, 254, 19, 224, 143, 77, + 214, 97, 243, 228, 122, 224, 166, 214, 97, 243, 228, 122, 242, 9, 214, + 97, 243, 228, 133, 224, 164, 235, 191, 224, 158, 77, 7, 6, 1, 118, 2, + 242, 113, 7, 6, 1, 118, 2, 179, 7, 6, 1, 118, 2, 249, 223, 7, 6, 1, 118, + 2, 217, 42, 7, 6, 1, 118, 2, 247, 209, 7, 6, 1, 118, 2, 223, 131, 49, 7, + 6, 1, 254, 148, 7, 6, 1, 250, 253, 2, 250, 117, 7, 6, 1, 191, 2, 242, + 113, 7, 6, 1, 191, 2, 179, 7, 6, 1, 191, 2, 249, 223, 7, 6, 1, 191, 2, + 247, 209, 7, 6, 1, 240, 146, 2, 242, 113, 7, 6, 1, 240, 146, 2, 179, 7, + 6, 1, 240, 146, 2, 249, 223, 7, 6, 1, 240, 146, 2, 247, 209, 7, 6, 1, + 245, 25, 7, 6, 1, 230, 98, 2, 217, 42, 7, 6, 1, 157, 2, 242, 113, 7, 6, + 1, 157, 2, 179, 7, 6, 1, 157, 2, 249, 223, 7, 6, 1, 157, 2, 217, 42, 7, + 6, 1, 157, 2, 247, 209, 230, 154, 52, 7, 6, 1, 157, 2, 90, 7, 6, 1, 111, + 2, 242, 113, 7, 6, 1, 111, 2, 179, 7, 6, 1, 111, 2, 249, 223, 7, 6, 1, + 111, 2, 247, 209, 7, 6, 1, 213, 106, 2, 179, 7, 6, 1, 217, 104, 7, 3, 1, + 220, 255, 197, 7, 3, 1, 118, 2, 242, 113, 7, 3, 1, 118, 2, 179, 7, 3, 1, + 118, 2, 249, 223, 7, 3, 1, 118, 2, 217, 42, 7, 3, 1, 118, 2, 247, 209, 7, + 3, 1, 118, 2, 223, 131, 49, 7, 3, 1, 254, 148, 7, 3, 1, 250, 253, 2, 250, + 117, 7, 3, 1, 191, 2, 242, 113, 7, 3, 1, 191, 2, 179, 7, 3, 1, 191, 2, + 249, 223, 7, 3, 1, 191, 2, 247, 209, 7, 3, 1, 240, 146, 2, 242, 113, 7, + 3, 1, 240, 146, 2, 179, 7, 3, 1, 240, 146, 2, 249, 223, 7, 3, 1, 240, + 146, 2, 247, 209, 7, 3, 1, 245, 25, 7, 3, 1, 230, 98, 2, 217, 42, 7, 3, + 1, 157, 2, 242, 113, 7, 3, 1, 157, 2, 179, 7, 3, 1, 157, 2, 249, 223, 7, + 3, 1, 157, 2, 217, 42, 7, 3, 1, 157, 2, 247, 209, 247, 121, 52, 7, 3, 1, + 157, 2, 90, 7, 3, 1, 111, 2, 242, 113, 7, 3, 1, 111, 2, 179, 7, 3, 1, + 111, 2, 249, 223, 7, 3, 1, 111, 2, 247, 209, 7, 3, 1, 213, 106, 2, 179, + 7, 3, 1, 217, 104, 7, 3, 1, 213, 106, 2, 247, 209, 7, 6, 1, 118, 2, 232, + 37, 7, 3, 1, 118, 2, 232, 37, 7, 6, 1, 118, 2, 251, 74, 7, 3, 1, 118, 2, + 251, 74, 7, 6, 1, 118, 2, 227, 90, 7, 3, 1, 118, 2, 227, 90, 7, 6, 1, + 250, 253, 2, 179, 7, 3, 1, 250, 253, 2, 179, 7, 6, 1, 250, 253, 2, 249, + 223, 7, 3, 1, 250, 253, 2, 249, 223, 7, 6, 1, 250, 253, 2, 62, 49, 7, 3, + 1, 250, 253, 2, 62, 49, 7, 6, 1, 250, 253, 2, 250, 166, 7, 3, 1, 250, + 253, 2, 250, 166, 7, 6, 1, 249, 4, 2, 250, 166, 7, 3, 1, 249, 4, 2, 250, + 166, 7, 6, 1, 249, 4, 2, 90, 7, 3, 1, 249, 4, 2, 90, 7, 6, 1, 191, 2, + 232, 37, 7, 3, 1, 191, 2, 232, 37, 7, 6, 1, 191, 2, 251, 74, 7, 3, 1, + 191, 2, 251, 74, 7, 6, 1, 191, 2, 62, 49, 7, 3, 1, 191, 2, 62, 49, 7, 6, + 1, 191, 2, 227, 90, 7, 3, 1, 191, 2, 227, 90, 7, 6, 1, 191, 2, 250, 166, + 7, 3, 1, 191, 2, 250, 166, 7, 6, 1, 243, 178, 2, 249, 223, 7, 3, 1, 243, + 178, 2, 249, 223, 7, 6, 1, 243, 178, 2, 251, 74, 7, 3, 1, 243, 178, 2, + 251, 74, 7, 6, 1, 243, 178, 2, 62, 49, 7, 3, 1, 243, 178, 2, 62, 49, 7, + 6, 1, 243, 178, 2, 250, 117, 7, 3, 1, 243, 178, 2, 250, 117, 7, 6, 1, + 242, 42, 2, 249, 223, 7, 3, 1, 242, 42, 2, 249, 223, 7, 6, 1, 242, 42, 2, + 90, 7, 3, 1, 242, 42, 2, 90, 7, 6, 1, 240, 146, 2, 217, 42, 7, 3, 1, 240, + 146, 2, 217, 42, 7, 6, 1, 240, 146, 2, 232, 37, 7, 3, 1, 240, 146, 2, + 232, 37, 7, 6, 1, 240, 146, 2, 251, 74, 7, 3, 1, 240, 146, 2, 251, 74, 7, + 6, 1, 240, 146, 2, 227, 90, 7, 3, 1, 240, 146, 2, 227, 90, 7, 6, 1, 240, + 146, 2, 62, 49, 7, 3, 1, 247, 73, 72, 7, 6, 26, 236, 26, 7, 3, 26, 236, + 26, 7, 6, 1, 235, 143, 2, 249, 223, 7, 3, 1, 235, 143, 2, 249, 223, 7, 6, + 1, 235, 28, 2, 250, 117, 7, 3, 1, 235, 28, 2, 250, 117, 7, 3, 1, 233, + 248, 7, 6, 1, 233, 171, 2, 179, 7, 3, 1, 233, 171, 2, 179, 7, 6, 1, 233, + 171, 2, 250, 117, 7, 3, 1, 233, 171, 2, 250, 117, 7, 6, 1, 233, 171, 2, + 250, 166, 7, 3, 1, 233, 171, 2, 250, 166, 7, 6, 1, 233, 171, 2, 231, 37, + 247, 74, 7, 3, 1, 233, 171, 2, 231, 37, 247, 74, 7, 6, 1, 233, 171, 2, + 90, 7, 3, 1, 233, 171, 2, 90, 7, 6, 1, 230, 98, 2, 179, 7, 3, 1, 230, 98, + 2, 179, 7, 6, 1, 230, 98, 2, 250, 117, 7, 3, 1, 230, 98, 2, 250, 117, 7, + 6, 1, 230, 98, 2, 250, 166, 7, 3, 1, 230, 98, 2, 250, 166, 7, 3, 1, 230, + 98, 225, 84, 251, 7, 253, 226, 7, 6, 1, 245, 96, 7, 3, 1, 245, 96, 7, 6, + 1, 157, 2, 232, 37, 7, 3, 1, 157, 2, 232, 37, 7, 6, 1, 157, 2, 251, 74, + 7, 3, 1, 157, 2, 251, 74, 7, 6, 1, 157, 2, 51, 179, 7, 3, 1, 157, 2, 51, + 179, 7, 6, 26, 227, 99, 7, 3, 26, 227, 99, 7, 6, 1, 224, 113, 2, 179, 7, + 3, 1, 224, 113, 2, 179, 7, 6, 1, 224, 113, 2, 250, 117, 7, 3, 1, 224, + 113, 2, 250, 117, 7, 6, 1, 224, 113, 2, 250, 166, 7, 3, 1, 224, 113, 2, + 250, 166, 7, 6, 1, 223, 4, 2, 179, 7, 3, 1, 223, 4, 2, 179, 7, 6, 1, 223, + 4, 2, 249, 223, 7, 3, 1, 223, 4, 2, 249, 223, 7, 6, 1, 223, 4, 2, 250, + 117, 7, 3, 1, 223, 4, 2, 250, 117, 7, 6, 1, 223, 4, 2, 250, 166, 7, 3, 1, + 223, 4, 2, 250, 166, 7, 6, 1, 218, 100, 2, 250, 117, 7, 3, 1, 218, 100, + 2, 250, 117, 7, 6, 1, 218, 100, 2, 250, 166, 7, 3, 1, 218, 100, 2, 250, + 166, 7, 6, 1, 218, 100, 2, 90, 7, 3, 1, 218, 100, 2, 90, 7, 6, 1, 111, 2, + 217, 42, 7, 3, 1, 111, 2, 217, 42, 7, 6, 1, 111, 2, 232, 37, 7, 3, 1, + 111, 2, 232, 37, 7, 6, 1, 111, 2, 251, 74, 7, 3, 1, 111, 2, 251, 74, 7, + 6, 1, 111, 2, 223, 131, 49, 7, 3, 1, 111, 2, 223, 131, 49, 7, 6, 1, 111, + 2, 51, 179, 7, 3, 1, 111, 2, 51, 179, 7, 6, 1, 111, 2, 227, 90, 7, 3, 1, + 111, 2, 227, 90, 7, 6, 1, 214, 83, 2, 249, 223, 7, 3, 1, 214, 83, 2, 249, + 223, 7, 6, 1, 213, 106, 2, 249, 223, 7, 3, 1, 213, 106, 2, 249, 223, 7, + 6, 1, 213, 106, 2, 247, 209, 7, 6, 1, 212, 153, 2, 179, 7, 3, 1, 212, + 153, 2, 179, 7, 6, 1, 212, 153, 2, 62, 49, 7, 3, 1, 212, 153, 2, 62, 49, + 7, 6, 1, 212, 153, 2, 250, 166, 7, 3, 1, 212, 153, 2, 250, 166, 7, 3, 1, + 184, 197, 7, 3, 1, 54, 2, 90, 7, 6, 1, 54, 2, 101, 7, 6, 1, 54, 2, 216, + 224, 7, 3, 1, 54, 2, 216, 224, 7, 6, 1, 160, 189, 7, 3, 1, 160, 189, 7, + 6, 1, 227, 40, 75, 7, 6, 1, 250, 253, 2, 101, 7, 3, 1, 250, 253, 2, 101, + 7, 6, 1, 254, 124, 249, 3, 7, 6, 1, 249, 4, 2, 101, 7, 6, 1, 249, 4, 2, + 216, 224, 7, 3, 1, 249, 4, 2, 216, 224, 7, 3, 1, 216, 58, 248, 5, 7, 6, + 1, 223, 202, 74, 7, 6, 1, 222, 113, 7, 6, 1, 227, 40, 74, 7, 6, 1, 244, + 231, 2, 101, 7, 3, 1, 244, 231, 2, 101, 7, 6, 1, 243, 178, 2, 101, 7, 6, + 1, 243, 83, 7, 3, 1, 240, 193, 7, 6, 1, 235, 183, 7, 6, 1, 240, 146, 2, + 90, 7, 6, 1, 235, 28, 2, 101, 7, 3, 1, 235, 28, 2, 101, 7, 3, 1, 233, + 171, 2, 134, 7, 3, 1, 233, 124, 2, 90, 7, 6, 1, 216, 58, 183, 7, 6, 1, + 230, 98, 2, 42, 101, 7, 3, 1, 230, 98, 2, 184, 46, 233, 60, 7, 6, 1, 157, + 2, 231, 37, 217, 42, 7, 6, 1, 157, 2, 240, 235, 7, 3, 1, 157, 2, 240, + 235, 7, 6, 1, 227, 85, 7, 3, 1, 227, 85, 7, 6, 1, 226, 230, 2, 101, 7, 3, + 1, 226, 230, 2, 101, 7, 1, 212, 205, 7, 6, 1, 160, 109, 7, 3, 1, 160, + 109, 7, 6, 1, 245, 40, 7, 1, 223, 202, 245, 41, 232, 177, 7, 3, 1, 218, + 100, 2, 226, 193, 101, 7, 6, 1, 218, 100, 2, 101, 7, 3, 1, 218, 100, 2, + 101, 7, 6, 1, 218, 100, 2, 223, 207, 101, 7, 6, 1, 111, 2, 240, 235, 7, + 3, 1, 111, 2, 240, 235, 7, 6, 1, 215, 128, 7, 6, 1, 215, 80, 2, 101, 7, + 6, 1, 213, 106, 2, 101, 7, 3, 1, 213, 106, 2, 101, 7, 6, 1, 212, 153, 2, + 90, 7, 3, 1, 212, 153, 2, 90, 7, 6, 1, 244, 232, 7, 6, 1, 244, 233, 223, + 201, 7, 3, 1, 244, 233, 223, 201, 7, 3, 1, 244, 233, 2, 218, 27, 7, 1, + 117, 2, 90, 7, 6, 1, 160, 180, 7, 3, 1, 160, 180, 7, 1, 235, 191, 242, + 156, 219, 70, 2, 90, 7, 1, 213, 169, 7, 1, 247, 254, 249, 204, 7, 1, 233, + 100, 249, 204, 7, 1, 254, 46, 249, 204, 7, 1, 223, 207, 249, 204, 7, 6, + 1, 245, 251, 2, 250, 166, 7, 6, 1, 249, 4, 2, 3, 1, 212, 153, 2, 250, + 166, 7, 3, 1, 245, 251, 2, 250, 166, 7, 6, 1, 232, 217, 7, 6, 1, 233, + 171, 2, 3, 1, 235, 142, 7, 3, 1, 232, 217, 7, 6, 1, 229, 17, 7, 6, 1, + 230, 98, 2, 3, 1, 235, 142, 7, 3, 1, 229, 17, 7, 6, 1, 118, 2, 250, 166, + 7, 3, 1, 118, 2, 250, 166, 7, 6, 1, 240, 146, 2, 250, 166, 7, 3, 1, 240, + 146, 2, 250, 166, 7, 6, 1, 157, 2, 250, 166, 7, 3, 1, 157, 2, 250, 166, + 7, 6, 1, 111, 2, 250, 166, 7, 3, 1, 111, 2, 250, 166, 7, 6, 1, 111, 2, + 247, 210, 24, 232, 37, 7, 3, 1, 111, 2, 247, 210, 24, 232, 37, 7, 6, 1, + 111, 2, 247, 210, 24, 179, 7, 3, 1, 111, 2, 247, 210, 24, 179, 7, 6, 1, + 111, 2, 247, 210, 24, 250, 166, 7, 3, 1, 111, 2, 247, 210, 24, 250, 166, + 7, 6, 1, 111, 2, 247, 210, 24, 242, 113, 7, 3, 1, 111, 2, 247, 210, 24, + 242, 113, 7, 3, 1, 216, 58, 74, 7, 6, 1, 118, 2, 247, 210, 24, 232, 37, + 7, 3, 1, 118, 2, 247, 210, 24, 232, 37, 7, 6, 1, 118, 2, 62, 78, 24, 232, + 37, 7, 3, 1, 118, 2, 62, 78, 24, 232, 37, 7, 6, 1, 254, 149, 2, 232, 37, + 7, 3, 1, 254, 149, 2, 232, 37, 7, 6, 1, 243, 178, 2, 90, 7, 3, 1, 243, + 178, 2, 90, 7, 6, 1, 243, 178, 2, 250, 166, 7, 3, 1, 243, 178, 2, 250, + 166, 7, 6, 1, 235, 28, 2, 250, 166, 7, 3, 1, 235, 28, 2, 250, 166, 7, 6, + 1, 157, 2, 227, 90, 7, 3, 1, 157, 2, 227, 90, 7, 6, 1, 157, 2, 227, 91, + 24, 232, 37, 7, 3, 1, 157, 2, 227, 91, 24, 232, 37, 7, 6, 1, 244, 233, 2, + 250, 166, 7, 3, 1, 244, 233, 2, 250, 166, 7, 3, 1, 235, 143, 2, 250, 166, + 7, 6, 1, 245, 250, 7, 6, 1, 249, 4, 2, 3, 1, 212, 152, 7, 3, 1, 245, 250, + 7, 6, 1, 243, 178, 2, 179, 7, 3, 1, 243, 178, 2, 179, 7, 6, 1, 240, 191, + 7, 6, 1, 213, 169, 7, 6, 1, 230, 98, 2, 242, 113, 7, 3, 1, 230, 98, 2, + 242, 113, 7, 6, 1, 118, 2, 223, 131, 78, 24, 179, 7, 3, 1, 118, 2, 223, + 131, 78, 24, 179, 7, 6, 1, 254, 149, 2, 179, 7, 3, 1, 254, 149, 2, 179, + 7, 6, 1, 157, 2, 219, 45, 24, 179, 7, 3, 1, 157, 2, 219, 45, 24, 179, 7, + 6, 1, 118, 2, 51, 242, 113, 7, 3, 1, 118, 2, 51, 242, 113, 7, 6, 1, 118, + 2, 235, 191, 251, 74, 7, 3, 1, 118, 2, 235, 191, 251, 74, 7, 6, 1, 191, + 2, 51, 242, 113, 7, 3, 1, 191, 2, 51, 242, 113, 7, 6, 1, 191, 2, 235, + 191, 251, 74, 7, 3, 1, 191, 2, 235, 191, 251, 74, 7, 6, 1, 240, 146, 2, + 51, 242, 113, 7, 3, 1, 240, 146, 2, 51, 242, 113, 7, 6, 1, 240, 146, 2, + 235, 191, 251, 74, 7, 3, 1, 240, 146, 2, 235, 191, 251, 74, 7, 6, 1, 157, + 2, 51, 242, 113, 7, 3, 1, 157, 2, 51, 242, 113, 7, 6, 1, 157, 2, 235, + 191, 251, 74, 7, 3, 1, 157, 2, 235, 191, 251, 74, 7, 6, 1, 224, 113, 2, + 51, 242, 113, 7, 3, 1, 224, 113, 2, 51, 242, 113, 7, 6, 1, 224, 113, 2, + 235, 191, 251, 74, 7, 3, 1, 224, 113, 2, 235, 191, 251, 74, 7, 6, 1, 111, + 2, 51, 242, 113, 7, 3, 1, 111, 2, 51, 242, 113, 7, 6, 1, 111, 2, 235, + 191, 251, 74, 7, 3, 1, 111, 2, 235, 191, 251, 74, 7, 6, 1, 223, 4, 2, + 249, 158, 55, 7, 3, 1, 223, 4, 2, 249, 158, 55, 7, 6, 1, 218, 100, 2, + 249, 158, 55, 7, 3, 1, 218, 100, 2, 249, 158, 55, 7, 6, 1, 212, 222, 7, + 3, 1, 212, 222, 7, 6, 1, 242, 42, 2, 250, 166, 7, 3, 1, 242, 42, 2, 250, + 166, 7, 6, 1, 230, 98, 2, 184, 46, 233, 60, 7, 3, 1, 249, 4, 2, 249, 41, + 7, 6, 1, 227, 2, 7, 3, 1, 227, 2, 7, 6, 1, 212, 153, 2, 101, 7, 3, 1, + 212, 153, 2, 101, 7, 6, 1, 118, 2, 62, 49, 7, 3, 1, 118, 2, 62, 49, 7, 6, + 1, 191, 2, 250, 117, 7, 3, 1, 191, 2, 250, 117, 7, 6, 1, 157, 2, 247, + 210, 24, 232, 37, 7, 3, 1, 157, 2, 247, 210, 24, 232, 37, 7, 6, 1, 157, + 2, 217, 43, 24, 232, 37, 7, 3, 1, 157, 2, 217, 43, 24, 232, 37, 7, 6, 1, + 157, 2, 62, 49, 7, 3, 1, 157, 2, 62, 49, 7, 6, 1, 157, 2, 62, 78, 24, + 232, 37, 7, 3, 1, 157, 2, 62, 78, 24, 232, 37, 7, 6, 1, 213, 106, 2, 232, + 37, 7, 3, 1, 213, 106, 2, 232, 37, 7, 3, 1, 233, 171, 2, 249, 41, 7, 3, + 1, 230, 98, 2, 249, 41, 7, 3, 1, 218, 100, 2, 249, 41, 7, 3, 1, 247, 73, + 235, 142, 7, 3, 1, 248, 89, 247, 172, 7, 3, 1, 224, 176, 247, 172, 7, 6, + 1, 118, 2, 90, 7, 6, 1, 250, 253, 2, 90, 7, 3, 1, 250, 253, 2, 90, 7, 6, + 1, 233, 171, 2, 134, 7, 6, 1, 218, 100, 2, 247, 207, 90, 7, 3, 1, 223, 4, + 2, 218, 195, 218, 27, 7, 3, 1, 212, 153, 2, 218, 195, 218, 27, 7, 6, 1, + 242, 156, 219, 69, 7, 3, 1, 242, 156, 219, 69, 7, 6, 1, 54, 2, 90, 7, 6, + 1, 111, 134, 7, 6, 1, 216, 58, 215, 79, 7, 6, 1, 191, 2, 90, 7, 3, 1, + 191, 2, 90, 7, 6, 1, 235, 143, 2, 90, 7, 3, 1, 235, 143, 2, 90, 7, 6, 1, + 3, 224, 241, 2, 241, 38, 218, 27, 7, 3, 1, 224, 241, 2, 241, 38, 218, 27, + 7, 6, 1, 224, 113, 2, 90, 7, 3, 1, 224, 113, 2, 90, 7, 6, 1, 213, 106, 2, + 90, 7, 3, 1, 213, 106, 2, 90, 7, 3, 1, 216, 58, 61, 7, 3, 1, 254, 52, 7, + 3, 1, 216, 58, 254, 52, 7, 3, 1, 54, 2, 101, 7, 3, 1, 227, 40, 75, 7, 3, + 1, 250, 253, 2, 249, 41, 7, 3, 1, 249, 4, 2, 218, 27, 7, 3, 1, 249, 4, 2, + 101, 7, 3, 1, 223, 202, 74, 7, 3, 1, 222, 113, 7, 3, 1, 222, 114, 2, 101, + 7, 3, 1, 227, 40, 74, 7, 3, 1, 223, 202, 227, 40, 74, 7, 3, 1, 223, 202, + 227, 40, 191, 2, 101, 7, 3, 1, 249, 193, 223, 202, 227, 40, 74, 7, 3, 1, + 247, 73, 235, 143, 2, 90, 7, 3, 1, 243, 178, 2, 101, 7, 3, 1, 113, 243, + 177, 7, 1, 3, 6, 243, 177, 7, 3, 1, 243, 83, 7, 3, 1, 224, 43, 240, 235, + 7, 3, 1, 216, 58, 242, 41, 7, 3, 1, 242, 42, 2, 101, 7, 3, 1, 241, 192, + 2, 101, 7, 3, 1, 240, 146, 2, 90, 7, 3, 1, 235, 183, 7, 1, 3, 6, 72, 7, + 3, 1, 233, 171, 2, 231, 37, 217, 42, 7, 3, 1, 233, 171, 2, 251, 218, 7, + 3, 1, 233, 171, 2, 223, 207, 101, 7, 3, 1, 233, 27, 7, 3, 1, 216, 58, + 183, 7, 3, 1, 216, 58, 232, 110, 2, 184, 233, 60, 7, 3, 1, 232, 110, 2, + 101, 7, 3, 1, 230, 98, 2, 42, 101, 7, 3, 1, 230, 98, 2, 223, 207, 101, 7, + 1, 3, 6, 204, 7, 3, 1, 252, 54, 75, 7, 1, 3, 6, 227, 99, 7, 3, 1, 249, + 193, 227, 67, 7, 3, 1, 226, 9, 7, 3, 1, 216, 58, 149, 7, 3, 1, 216, 58, + 224, 113, 2, 184, 233, 60, 7, 3, 1, 216, 58, 224, 113, 2, 101, 7, 3, 1, + 224, 113, 2, 184, 233, 60, 7, 3, 1, 224, 113, 2, 218, 27, 7, 3, 1, 224, + 113, 2, 244, 56, 7, 3, 1, 223, 202, 224, 113, 2, 244, 56, 7, 1, 3, 6, + 149, 7, 1, 3, 6, 235, 191, 149, 7, 3, 1, 223, 4, 2, 101, 7, 3, 1, 245, + 40, 7, 3, 1, 247, 73, 235, 143, 2, 219, 45, 24, 101, 7, 3, 1, 219, 163, + 223, 202, 245, 40, 7, 3, 1, 245, 41, 2, 249, 41, 7, 3, 1, 216, 58, 218, + 99, 7, 3, 1, 218, 100, 2, 223, 207, 101, 7, 3, 1, 111, 134, 7, 3, 1, 215, + 128, 7, 3, 1, 215, 80, 2, 101, 7, 3, 1, 216, 58, 215, 79, 7, 3, 1, 216, + 58, 214, 82, 7, 3, 1, 216, 58, 213, 105, 7, 1, 3, 6, 213, 105, 7, 3, 1, + 212, 153, 2, 223, 207, 101, 7, 3, 1, 212, 153, 2, 249, 41, 7, 3, 1, 244, + 232, 7, 3, 1, 244, 233, 2, 249, 41, 7, 1, 242, 156, 219, 69, 7, 1, 226, + 15, 214, 116, 243, 219, 7, 1, 235, 191, 242, 156, 219, 69, 7, 1, 219, 50, + 250, 252, 7, 1, 251, 169, 249, 204, 7, 1, 3, 6, 253, 74, 7, 3, 1, 249, + 193, 227, 40, 74, 7, 1, 3, 6, 243, 178, 2, 101, 7, 1, 3, 6, 242, 41, 7, + 3, 1, 235, 143, 2, 249, 67, 7, 3, 1, 216, 58, 235, 27, 7, 1, 3, 6, 150, + 7, 3, 1, 224, 241, 2, 101, 7, 1, 242, 156, 219, 70, 2, 90, 7, 1, 223, + 202, 242, 156, 219, 70, 2, 90, 7, 3, 1, 245, 251, 247, 172, 7, 3, 1, 247, + 233, 247, 172, 7, 3, 1, 245, 251, 247, 173, 2, 249, 41, 7, 3, 1, 216, + 143, 247, 172, 7, 3, 1, 217, 188, 247, 172, 7, 3, 1, 217, 236, 247, 173, + 2, 249, 41, 7, 3, 1, 244, 103, 247, 172, 7, 3, 1, 232, 158, 247, 172, 7, + 3, 1, 232, 111, 247, 172, 7, 1, 251, 169, 226, 56, 7, 1, 251, 177, 226, + 56, 7, 3, 1, 216, 58, 242, 42, 2, 244, 56, 7, 3, 1, 216, 58, 242, 42, 2, + 244, 57, 24, 218, 27, 59, 1, 3, 242, 41, 59, 1, 3, 242, 42, 2, 101, 59, + 1, 3, 235, 142, 59, 1, 3, 149, 59, 1, 3, 216, 58, 149, 59, 1, 3, 216, 58, + 224, 113, 2, 101, 59, 1, 3, 6, 235, 191, 149, 59, 1, 3, 214, 82, 59, 1, + 3, 213, 105, 59, 1, 225, 71, 59, 1, 51, 225, 71, 59, 1, 216, 58, 249, + 157, 59, 1, 253, 226, 59, 1, 223, 202, 249, 157, 59, 1, 46, 151, 223, + 130, 59, 1, 42, 151, 223, 130, 59, 1, 242, 156, 219, 69, 59, 1, 223, 202, + 242, 156, 219, 69, 59, 1, 42, 253, 164, 59, 1, 46, 253, 164, 59, 1, 114, + 253, 164, 59, 1, 119, 253, 164, 59, 1, 249, 224, 254, 174, 250, 166, 59, + 1, 71, 232, 242, 59, 1, 232, 37, 59, 1, 254, 164, 254, 174, 59, 1, 242, + 114, 254, 174, 59, 1, 115, 71, 232, 242, 59, 1, 115, 232, 37, 59, 1, 115, + 242, 114, 254, 174, 59, 1, 115, 254, 164, 254, 174, 59, 1, 216, 180, 249, + 164, 59, 1, 151, 216, 180, 249, 164, 59, 1, 250, 107, 46, 151, 223, 130, + 59, 1, 250, 107, 42, 151, 223, 130, 59, 1, 114, 218, 36, 59, 1, 119, 218, + 36, 59, 1, 94, 52, 59, 1, 230, 251, 52, 251, 74, 62, 49, 223, 131, 49, + 227, 90, 3, 217, 42, 51, 254, 164, 254, 174, 59, 1, 223, 189, 101, 59, 1, + 249, 71, 254, 174, 59, 1, 3, 243, 83, 59, 1, 3, 150, 59, 1, 3, 197, 59, + 1, 3, 213, 166, 59, 1, 3, 223, 202, 242, 156, 219, 69, 59, 1, 244, 244, + 160, 134, 59, 1, 124, 160, 134, 59, 1, 231, 38, 160, 134, 59, 1, 115, + 160, 134, 59, 1, 244, 243, 160, 134, 59, 1, 212, 245, 247, 251, 160, 77, + 59, 1, 213, 59, 247, 251, 160, 77, 59, 1, 214, 114, 59, 1, 215, 156, 59, + 1, 51, 253, 226, 59, 1, 115, 119, 253, 164, 59, 1, 115, 114, 253, 164, + 59, 1, 115, 42, 253, 164, 59, 1, 115, 46, 253, 164, 59, 1, 115, 223, 130, + 59, 1, 231, 37, 242, 114, 254, 174, 59, 1, 231, 37, 51, 242, 114, 254, + 174, 59, 1, 231, 37, 51, 254, 164, 254, 174, 59, 1, 115, 217, 42, 59, 1, + 224, 48, 249, 164, 59, 1, 251, 234, 124, 216, 241, 59, 1, 245, 101, 124, + 216, 241, 59, 1, 251, 234, 115, 216, 241, 59, 1, 245, 101, 115, 216, 241, + 59, 1, 220, 234, 59, 1, 227, 40, 220, 234, 59, 1, 115, 42, 68, 37, 242, + 114, 254, 174, 37, 254, 164, 254, 174, 37, 249, 224, 254, 174, 37, 217, + 42, 37, 232, 37, 37, 226, 243, 37, 251, 74, 37, 62, 49, 37, 247, 209, 37, + 241, 38, 49, 37, 223, 131, 49, 37, 51, 254, 164, 254, 174, 37, 250, 166, + 37, 71, 232, 243, 49, 37, 51, 71, 232, 243, 49, 37, 51, 242, 114, 254, + 174, 37, 250, 187, 37, 235, 191, 251, 74, 37, 216, 58, 249, 158, 49, 37, + 249, 158, 49, 37, 223, 202, 249, 158, 49, 37, 249, 158, 78, 223, 148, 37, + 242, 114, 254, 175, 55, 37, 254, 164, 254, 175, 55, 37, 42, 218, 37, 55, + 37, 46, 218, 37, 55, 37, 42, 254, 19, 49, 37, 240, 235, 37, 42, 151, 223, + 131, 55, 37, 114, 218, 37, 55, 37, 119, 218, 37, 55, 37, 94, 5, 55, 37, + 230, 251, 5, 55, 37, 226, 191, 241, 38, 55, 37, 223, 207, 241, 38, 55, + 37, 62, 55, 37, 247, 210, 55, 37, 223, 131, 55, 37, 249, 158, 55, 37, + 250, 117, 37, 227, 90, 37, 71, 232, 243, 55, 37, 251, 68, 55, 37, 235, + 191, 51, 253, 194, 55, 37, 250, 167, 55, 37, 249, 224, 254, 175, 55, 37, + 251, 75, 55, 37, 235, 191, 251, 75, 55, 37, 217, 43, 55, 37, 232, 38, 55, + 37, 115, 232, 242, 37, 51, 115, 232, 242, 37, 217, 43, 226, 244, 37, 220, + 175, 219, 45, 226, 244, 37, 184, 219, 45, 226, 244, 37, 220, 175, 219, + 232, 226, 244, 37, 184, 219, 232, 226, 244, 37, 46, 151, 223, 131, 55, + 37, 235, 191, 251, 68, 55, 37, 41, 55, 37, 222, 99, 55, 37, 213, 167, 49, + 37, 71, 217, 42, 37, 51, 226, 243, 37, 242, 114, 160, 77, 37, 254, 164, + 160, 77, 37, 25, 226, 50, 37, 25, 234, 11, 37, 25, 247, 204, 216, 231, + 37, 25, 212, 210, 37, 251, 68, 49, 37, 245, 61, 5, 55, 37, 51, 71, 232, + 243, 55, 37, 42, 254, 19, 55, 37, 228, 163, 217, 43, 49, 37, 241, 44, 49, + 37, 254, 57, 123, 211, 211, 49, 37, 42, 46, 76, 55, 37, 215, 124, 76, 55, + 37, 242, 118, 235, 66, 37, 46, 253, 165, 49, 37, 42, 151, 223, 131, 49, + 37, 244, 100, 37, 213, 167, 55, 37, 42, 253, 165, 55, 37, 46, 253, 165, + 55, 37, 46, 253, 165, 24, 114, 253, 165, 55, 37, 46, 151, 223, 131, 49, + 37, 62, 78, 223, 148, 37, 253, 133, 55, 37, 51, 223, 131, 55, 37, 212, + 28, 49, 37, 51, 251, 75, 55, 37, 51, 251, 74, 37, 51, 232, 37, 37, 51, + 232, 38, 55, 37, 51, 217, 42, 37, 51, 235, 191, 251, 74, 37, 51, 95, 76, + 55, 37, 7, 3, 1, 61, 37, 7, 3, 1, 74, 37, 7, 3, 1, 72, 37, 7, 3, 1, 75, + 37, 7, 3, 1, 69, 37, 7, 3, 1, 250, 252, 37, 7, 3, 1, 249, 3, 37, 7, 3, 1, + 242, 41, 37, 7, 3, 1, 183, 37, 7, 3, 1, 149, 37, 7, 3, 1, 218, 99, 37, 7, + 3, 1, 215, 79, 37, 7, 3, 1, 213, 166, 25, 6, 1, 241, 181, 25, 3, 1, 241, + 181, 25, 6, 1, 253, 193, 222, 161, 25, 3, 1, 253, 193, 222, 161, 25, 228, + 54, 52, 25, 232, 163, 228, 54, 52, 25, 6, 1, 226, 178, 247, 179, 25, 3, + 1, 226, 178, 247, 179, 25, 212, 210, 25, 3, 223, 202, 232, 141, 220, 104, + 87, 25, 3, 246, 72, 232, 141, 220, 104, 87, 25, 3, 223, 202, 246, 72, + 232, 141, 220, 104, 87, 25, 224, 158, 77, 25, 216, 231, 25, 247, 204, + 216, 231, 25, 6, 1, 254, 53, 2, 216, 231, 25, 254, 8, 217, 211, 25, 6, 1, + 245, 64, 2, 216, 231, 25, 6, 1, 245, 29, 2, 216, 231, 25, 6, 1, 235, 184, + 2, 216, 231, 25, 6, 1, 227, 66, 2, 216, 231, 25, 6, 1, 215, 129, 2, 216, + 231, 25, 6, 1, 227, 68, 2, 216, 231, 25, 3, 1, 235, 184, 2, 247, 204, 24, + 216, 231, 25, 6, 1, 254, 52, 25, 6, 1, 251, 203, 25, 6, 1, 243, 83, 25, + 6, 1, 248, 5, 25, 6, 1, 245, 63, 25, 6, 1, 212, 78, 25, 6, 1, 245, 28, + 25, 6, 1, 217, 132, 25, 6, 1, 235, 183, 25, 6, 1, 234, 227, 25, 6, 1, + 233, 122, 25, 6, 1, 230, 172, 25, 6, 1, 228, 92, 25, 6, 1, 213, 145, 25, + 6, 1, 227, 65, 25, 6, 1, 225, 240, 25, 6, 1, 223, 190, 25, 6, 1, 220, + 103, 25, 6, 1, 217, 248, 25, 6, 1, 215, 128, 25, 6, 1, 226, 9, 25, 6, 1, + 250, 47, 25, 6, 1, 225, 46, 25, 6, 1, 227, 67, 25, 6, 1, 235, 184, 2, + 247, 203, 25, 6, 1, 215, 129, 2, 247, 203, 25, 3, 1, 254, 53, 2, 216, + 231, 25, 3, 1, 245, 64, 2, 216, 231, 25, 3, 1, 245, 29, 2, 216, 231, 25, + 3, 1, 235, 184, 2, 216, 231, 25, 3, 1, 215, 129, 2, 247, 204, 24, 216, + 231, 25, 3, 1, 254, 52, 25, 3, 1, 251, 203, 25, 3, 1, 243, 83, 25, 3, 1, + 248, 5, 25, 3, 1, 245, 63, 25, 3, 1, 212, 78, 25, 3, 1, 245, 28, 25, 3, + 1, 217, 132, 25, 3, 1, 235, 183, 25, 3, 1, 234, 227, 25, 3, 1, 233, 122, + 25, 3, 1, 230, 172, 25, 3, 1, 228, 92, 25, 3, 1, 213, 145, 25, 3, 1, 227, + 65, 25, 3, 1, 225, 240, 25, 3, 1, 223, 190, 25, 3, 1, 40, 220, 103, 25, + 3, 1, 220, 103, 25, 3, 1, 217, 248, 25, 3, 1, 215, 128, 25, 3, 1, 226, 9, + 25, 3, 1, 250, 47, 25, 3, 1, 225, 46, 25, 3, 1, 227, 67, 25, 3, 1, 235, + 184, 2, 247, 203, 25, 3, 1, 215, 129, 2, 247, 203, 25, 3, 1, 227, 66, 2, + 216, 231, 25, 3, 1, 215, 129, 2, 216, 231, 25, 3, 1, 227, 68, 2, 216, + 231, 25, 6, 234, 251, 87, 25, 251, 204, 87, 25, 217, 133, 87, 25, 215, + 129, 2, 241, 38, 87, 25, 215, 129, 2, 254, 164, 24, 241, 38, 87, 25, 215, + 129, 2, 247, 210, 24, 241, 38, 87, 25, 226, 10, 87, 25, 225, 241, 87, 25, + 234, 251, 87, 25, 1, 253, 193, 234, 15, 25, 3, 1, 253, 193, 234, 15, 25, + 1, 219, 77, 25, 3, 1, 219, 77, 25, 1, 247, 179, 25, 3, 1, 247, 179, 25, + 1, 234, 15, 25, 3, 1, 234, 15, 25, 1, 222, 161, 25, 3, 1, 222, 161, 79, + 6, 1, 220, 235, 79, 3, 1, 220, 235, 79, 6, 1, 244, 109, 79, 3, 1, 244, + 109, 79, 6, 1, 234, 123, 79, 3, 1, 234, 123, 79, 6, 1, 241, 32, 79, 3, 1, + 241, 32, 79, 6, 1, 243, 78, 79, 3, 1, 243, 78, 79, 6, 1, 220, 202, 79, 3, + 1, 220, 202, 79, 6, 1, 248, 20, 79, 3, 1, 248, 20, 25, 234, 228, 87, 25, + 223, 191, 87, 25, 232, 141, 220, 104, 87, 25, 1, 212, 215, 25, 6, 217, + 133, 87, 25, 232, 141, 245, 64, 87, 25, 223, 202, 232, 141, 245, 64, 87, + 25, 6, 1, 220, 187, 25, 3, 1, 220, 187, 25, 6, 232, 141, 220, 104, 87, + 25, 6, 1, 222, 159, 25, 3, 1, 222, 159, 25, 223, 191, 2, 219, 45, 87, 25, + 6, 223, 202, 232, 141, 220, 104, 87, 25, 6, 246, 72, 232, 141, 220, 104, + 87, 25, 6, 223, 202, 246, 72, 232, 141, 220, 104, 87, 33, 6, 1, 236, 56, + 2, 242, 113, 33, 6, 1, 235, 187, 33, 6, 1, 247, 114, 33, 6, 1, 242, 163, + 33, 6, 1, 215, 172, 236, 55, 33, 6, 1, 245, 247, 33, 6, 1, 251, 5, 72, + 33, 6, 1, 212, 255, 33, 6, 1, 235, 127, 33, 6, 1, 232, 216, 33, 6, 1, + 229, 9, 33, 6, 1, 216, 132, 33, 6, 1, 234, 57, 33, 6, 1, 240, 146, 2, + 242, 113, 33, 6, 1, 220, 175, 69, 33, 6, 1, 245, 243, 33, 6, 1, 61, 33, + 6, 1, 251, 251, 33, 6, 1, 214, 232, 33, 6, 1, 242, 212, 33, 6, 1, 248, + 41, 33, 6, 1, 236, 55, 33, 6, 1, 212, 67, 33, 6, 1, 212, 87, 33, 6, 1, + 72, 33, 6, 1, 220, 175, 72, 33, 6, 1, 181, 33, 6, 1, 245, 131, 33, 6, 1, + 245, 117, 33, 6, 1, 245, 108, 33, 6, 1, 75, 33, 6, 1, 226, 96, 33, 6, 1, + 245, 55, 33, 6, 1, 245, 45, 33, 6, 1, 217, 229, 33, 6, 1, 69, 33, 6, 1, + 245, 159, 33, 6, 1, 159, 33, 6, 1, 216, 136, 33, 6, 1, 250, 67, 33, 6, 1, + 221, 24, 33, 6, 1, 220, 245, 33, 6, 1, 241, 242, 52, 33, 6, 1, 213, 18, + 33, 6, 1, 219, 236, 52, 33, 6, 1, 74, 33, 6, 1, 212, 203, 33, 6, 1, 186, + 33, 3, 1, 61, 33, 3, 1, 251, 251, 33, 3, 1, 214, 232, 33, 3, 1, 242, 212, + 33, 3, 1, 248, 41, 33, 3, 1, 236, 55, 33, 3, 1, 212, 67, 33, 3, 1, 212, + 87, 33, 3, 1, 72, 33, 3, 1, 220, 175, 72, 33, 3, 1, 181, 33, 3, 1, 245, + 131, 33, 3, 1, 245, 117, 33, 3, 1, 245, 108, 33, 3, 1, 75, 33, 3, 1, 226, + 96, 33, 3, 1, 245, 55, 33, 3, 1, 245, 45, 33, 3, 1, 217, 229, 33, 3, 1, + 69, 33, 3, 1, 245, 159, 33, 3, 1, 159, 33, 3, 1, 216, 136, 33, 3, 1, 250, + 67, 33, 3, 1, 221, 24, 33, 3, 1, 220, 245, 33, 3, 1, 241, 242, 52, 33, 3, + 1, 213, 18, 33, 3, 1, 219, 236, 52, 33, 3, 1, 74, 33, 3, 1, 212, 203, 33, + 3, 1, 186, 33, 3, 1, 236, 56, 2, 242, 113, 33, 3, 1, 235, 187, 33, 3, 1, + 247, 114, 33, 3, 1, 242, 163, 33, 3, 1, 215, 172, 236, 55, 33, 3, 1, 245, + 247, 33, 3, 1, 251, 5, 72, 33, 3, 1, 212, 255, 33, 3, 1, 235, 127, 33, 3, + 1, 232, 216, 33, 3, 1, 229, 9, 33, 3, 1, 216, 132, 33, 3, 1, 234, 57, 33, + 3, 1, 240, 146, 2, 242, 113, 33, 3, 1, 220, 175, 69, 33, 3, 1, 245, 243, + 33, 6, 1, 227, 67, 33, 3, 1, 227, 67, 33, 6, 1, 213, 49, 33, 3, 1, 213, + 49, 33, 6, 1, 235, 181, 74, 33, 3, 1, 235, 181, 74, 33, 6, 1, 232, 221, + 212, 174, 33, 3, 1, 232, 221, 212, 174, 33, 6, 1, 235, 181, 232, 221, + 212, 174, 33, 3, 1, 235, 181, 232, 221, 212, 174, 33, 6, 1, 251, 172, + 212, 174, 33, 3, 1, 251, 172, 212, 174, 33, 6, 1, 235, 181, 251, 172, + 212, 174, 33, 3, 1, 235, 181, 251, 172, 212, 174, 33, 6, 1, 233, 242, 33, + 3, 1, 233, 242, 33, 6, 1, 225, 46, 33, 3, 1, 225, 46, 33, 6, 1, 244, 51, + 33, 3, 1, 244, 51, 33, 6, 1, 235, 144, 33, 3, 1, 235, 144, 33, 6, 1, 235, + 145, 2, 51, 242, 114, 254, 174, 33, 3, 1, 235, 145, 2, 51, 242, 114, 254, + 174, 33, 6, 1, 215, 175, 33, 3, 1, 215, 175, 33, 6, 1, 223, 87, 227, 67, + 33, 3, 1, 223, 87, 227, 67, 33, 6, 1, 227, 68, 2, 217, 18, 33, 3, 1, 227, + 68, 2, 217, 18, 33, 6, 1, 227, 8, 33, 3, 1, 227, 8, 33, 6, 1, 234, 15, + 33, 3, 1, 234, 15, 33, 217, 99, 52, 37, 33, 217, 18, 37, 33, 226, 192, + 37, 33, 207, 225, 152, 37, 33, 225, 40, 225, 152, 37, 33, 225, 137, 37, + 33, 240, 201, 217, 99, 52, 37, 33, 231, 4, 52, 33, 6, 1, 220, 175, 240, + 146, 2, 218, 27, 33, 3, 1, 220, 175, 240, 146, 2, 218, 27, 33, 6, 1, 221, + 66, 52, 33, 3, 1, 221, 66, 52, 33, 6, 1, 245, 56, 2, 217, 68, 33, 3, 1, + 245, 56, 2, 217, 68, 33, 6, 1, 242, 213, 2, 215, 127, 33, 3, 1, 242, 213, + 2, 215, 127, 33, 6, 1, 242, 213, 2, 90, 33, 3, 1, 242, 213, 2, 90, 33, 6, + 1, 242, 213, 2, 231, 37, 101, 33, 3, 1, 242, 213, 2, 231, 37, 101, 33, 6, + 1, 212, 68, 2, 247, 246, 33, 3, 1, 212, 68, 2, 247, 246, 33, 6, 1, 212, + 88, 2, 247, 246, 33, 3, 1, 212, 88, 2, 247, 246, 33, 6, 1, 235, 17, 2, + 247, 246, 33, 3, 1, 235, 17, 2, 247, 246, 33, 6, 1, 235, 17, 2, 71, 90, + 33, 3, 1, 235, 17, 2, 71, 90, 33, 6, 1, 235, 17, 2, 90, 33, 3, 1, 235, + 17, 2, 90, 33, 6, 1, 252, 44, 181, 33, 3, 1, 252, 44, 181, 33, 6, 1, 245, + 109, 2, 247, 246, 33, 3, 1, 245, 109, 2, 247, 246, 33, 6, 26, 245, 109, + 242, 212, 33, 3, 26, 245, 109, 242, 212, 33, 6, 1, 226, 97, 2, 231, 37, + 101, 33, 3, 1, 226, 97, 2, 231, 37, 101, 33, 6, 1, 254, 180, 159, 33, 3, + 1, 254, 180, 159, 33, 6, 1, 245, 46, 2, 247, 246, 33, 3, 1, 245, 46, 2, + 247, 246, 33, 6, 1, 217, 230, 2, 247, 246, 33, 3, 1, 217, 230, 2, 247, + 246, 33, 6, 1, 219, 61, 69, 33, 3, 1, 219, 61, 69, 33, 6, 1, 219, 61, + 111, 2, 90, 33, 3, 1, 219, 61, 111, 2, 90, 33, 6, 1, 242, 30, 2, 247, + 246, 33, 3, 1, 242, 30, 2, 247, 246, 33, 6, 26, 217, 230, 216, 136, 33, + 3, 26, 217, 230, 216, 136, 33, 6, 1, 250, 68, 2, 247, 246, 33, 3, 1, 250, + 68, 2, 247, 246, 33, 6, 1, 250, 68, 2, 71, 90, 33, 3, 1, 250, 68, 2, 71, + 90, 33, 6, 1, 220, 213, 33, 3, 1, 220, 213, 33, 6, 1, 254, 180, 250, 67, + 33, 3, 1, 254, 180, 250, 67, 33, 6, 1, 254, 180, 250, 68, 2, 247, 246, + 33, 3, 1, 254, 180, 250, 68, 2, 247, 246, 33, 1, 226, 185, 33, 6, 1, 212, + 68, 2, 251, 74, 33, 3, 1, 212, 68, 2, 251, 74, 33, 6, 1, 235, 17, 2, 101, + 33, 3, 1, 235, 17, 2, 101, 33, 6, 1, 245, 132, 2, 218, 27, 33, 3, 1, 245, + 132, 2, 218, 27, 33, 6, 1, 245, 109, 2, 101, 33, 3, 1, 245, 109, 2, 101, + 33, 6, 1, 245, 109, 2, 218, 27, 33, 3, 1, 245, 109, 2, 218, 27, 33, 6, 1, + 234, 133, 250, 67, 33, 3, 1, 234, 133, 250, 67, 33, 6, 1, 245, 118, 2, + 218, 27, 33, 3, 1, 245, 118, 2, 218, 27, 33, 3, 1, 226, 185, 33, 6, 1, + 118, 2, 251, 74, 33, 3, 1, 118, 2, 251, 74, 33, 6, 1, 118, 2, 247, 209, + 33, 3, 1, 118, 2, 247, 209, 33, 6, 26, 118, 236, 55, 33, 3, 26, 118, 236, + 55, 33, 6, 1, 236, 56, 2, 251, 74, 33, 3, 1, 236, 56, 2, 251, 74, 33, 6, + 1, 222, 113, 33, 3, 1, 222, 113, 33, 6, 1, 222, 114, 2, 247, 209, 33, 3, + 1, 222, 114, 2, 247, 209, 33, 6, 1, 212, 68, 2, 247, 209, 33, 3, 1, 212, + 68, 2, 247, 209, 33, 6, 1, 212, 88, 2, 247, 209, 33, 3, 1, 212, 88, 2, + 247, 209, 33, 6, 1, 254, 180, 245, 247, 33, 3, 1, 254, 180, 245, 247, 33, + 6, 1, 240, 146, 2, 232, 37, 33, 3, 1, 240, 146, 2, 232, 37, 33, 6, 1, + 240, 146, 2, 247, 209, 33, 3, 1, 240, 146, 2, 247, 209, 33, 6, 1, 157, 2, + 247, 209, 33, 3, 1, 157, 2, 247, 209, 33, 6, 1, 252, 54, 75, 33, 3, 1, + 252, 54, 75, 33, 6, 1, 252, 54, 157, 2, 247, 209, 33, 3, 1, 252, 54, 157, + 2, 247, 209, 33, 6, 1, 191, 2, 247, 209, 33, 3, 1, 191, 2, 247, 209, 33, + 6, 1, 111, 2, 232, 37, 33, 3, 1, 111, 2, 232, 37, 33, 6, 1, 111, 2, 247, + 209, 33, 3, 1, 111, 2, 247, 209, 33, 6, 1, 111, 2, 51, 179, 33, 3, 1, + 111, 2, 51, 179, 33, 6, 1, 250, 68, 2, 247, 209, 33, 3, 1, 250, 68, 2, + 247, 209, 33, 6, 1, 242, 213, 2, 247, 246, 33, 3, 1, 242, 213, 2, 247, + 246, 33, 6, 1, 213, 19, 2, 247, 209, 33, 3, 1, 213, 19, 2, 247, 209, 33, + 6, 1, 242, 213, 2, 219, 45, 24, 101, 33, 3, 1, 242, 213, 2, 219, 45, 24, + 101, 33, 6, 1, 242, 30, 2, 101, 33, 3, 1, 242, 30, 2, 101, 33, 6, 1, 242, + 30, 2, 90, 33, 3, 1, 242, 30, 2, 90, 33, 6, 1, 234, 23, 248, 41, 33, 3, + 1, 234, 23, 248, 41, 33, 6, 1, 234, 23, 247, 114, 33, 3, 1, 234, 23, 247, + 114, 33, 6, 1, 234, 23, 212, 20, 33, 3, 1, 234, 23, 212, 20, 33, 6, 1, + 234, 23, 245, 241, 33, 3, 1, 234, 23, 245, 241, 33, 6, 1, 234, 23, 232, + 216, 33, 3, 1, 234, 23, 232, 216, 33, 6, 1, 234, 23, 229, 9, 33, 3, 1, + 234, 23, 229, 9, 33, 6, 1, 234, 23, 220, 37, 33, 3, 1, 234, 23, 220, 37, + 33, 6, 1, 234, 23, 217, 13, 33, 3, 1, 234, 23, 217, 13, 33, 6, 1, 223, + 202, 212, 87, 33, 3, 1, 223, 202, 212, 87, 33, 6, 1, 245, 132, 2, 101, + 33, 3, 1, 245, 132, 2, 101, 33, 6, 1, 233, 25, 33, 3, 1, 233, 25, 33, 6, + 1, 223, 192, 33, 3, 1, 223, 192, 33, 6, 1, 213, 80, 33, 3, 1, 213, 80, + 33, 6, 1, 224, 232, 33, 3, 1, 224, 232, 33, 6, 1, 214, 6, 33, 3, 1, 214, + 6, 33, 6, 1, 254, 75, 181, 33, 3, 1, 254, 75, 181, 33, 6, 1, 245, 132, 2, + 231, 37, 101, 33, 3, 1, 245, 132, 2, 231, 37, 101, 33, 6, 1, 245, 109, 2, + 231, 37, 101, 33, 3, 1, 245, 109, 2, 231, 37, 101, 33, 6, 1, 226, 97, 2, + 247, 246, 33, 3, 1, 226, 97, 2, 247, 246, 33, 6, 1, 220, 214, 2, 247, + 246, 33, 3, 1, 220, 214, 2, 247, 246, 141, 6, 1, 253, 80, 141, 6, 1, 251, + 216, 141, 6, 1, 242, 179, 141, 6, 1, 248, 164, 141, 6, 1, 245, 169, 141, + 6, 1, 212, 109, 141, 6, 1, 245, 154, 141, 6, 1, 245, 30, 141, 6, 1, 108, + 141, 6, 1, 212, 67, 141, 6, 1, 235, 224, 141, 6, 1, 232, 219, 141, 6, 1, + 213, 148, 141, 6, 1, 250, 219, 141, 6, 1, 234, 171, 141, 6, 1, 241, 54, + 141, 6, 1, 235, 139, 141, 6, 1, 242, 222, 141, 6, 1, 250, 62, 141, 6, 1, + 231, 122, 141, 6, 1, 212, 255, 141, 6, 1, 228, 150, 141, 6, 1, 221, 24, + 141, 6, 1, 214, 119, 141, 6, 1, 250, 92, 141, 6, 1, 226, 80, 141, 6, 1, + 235, 112, 141, 6, 1, 203, 141, 6, 1, 222, 80, 141, 6, 1, 214, 156, 141, + 6, 1, 217, 15, 141, 6, 1, 223, 245, 141, 6, 1, 249, 175, 141, 6, 1, 212, + 240, 141, 6, 1, 225, 178, 141, 6, 1, 234, 182, 141, 6, 1, 227, 88, 141, + 6, 1, 244, 111, 141, 59, 1, 42, 151, 223, 130, 141, 253, 226, 141, 245, + 112, 77, 141, 244, 254, 77, 141, 249, 157, 141, 224, 158, 77, 141, 254, + 181, 77, 141, 3, 1, 253, 80, 141, 3, 1, 251, 216, 141, 3, 1, 242, 179, + 141, 3, 1, 248, 164, 141, 3, 1, 245, 169, 141, 3, 1, 212, 109, 141, 3, 1, + 245, 154, 141, 3, 1, 245, 30, 141, 3, 1, 108, 141, 3, 1, 212, 67, 141, 3, + 1, 235, 224, 141, 3, 1, 232, 219, 141, 3, 1, 213, 148, 141, 3, 1, 250, + 219, 141, 3, 1, 234, 171, 141, 3, 1, 241, 54, 141, 3, 1, 235, 139, 141, + 3, 1, 242, 222, 141, 3, 1, 250, 62, 141, 3, 1, 231, 122, 141, 3, 1, 212, + 255, 141, 3, 1, 228, 150, 141, 3, 1, 221, 24, 141, 3, 1, 214, 119, 141, + 3, 1, 250, 92, 141, 3, 1, 226, 80, 141, 3, 1, 235, 112, 141, 3, 1, 203, + 141, 3, 1, 222, 80, 141, 3, 1, 214, 156, 141, 3, 1, 217, 15, 141, 3, 1, + 223, 245, 141, 3, 1, 249, 175, 141, 3, 1, 212, 240, 141, 3, 1, 225, 178, + 141, 3, 1, 234, 182, 141, 3, 1, 227, 88, 141, 3, 1, 244, 111, 141, 3, 26, + 245, 170, 212, 240, 141, 243, 200, 219, 69, 141, 240, 160, 93, 254, 175, + 245, 23, 93, 254, 175, 222, 81, 93, 254, 175, 221, 11, 93, 254, 175, 212, + 97, 224, 215, 93, 254, 175, 212, 97, 243, 100, 93, 254, 175, 217, 28, 93, + 254, 175, 223, 200, 93, 254, 175, 212, 96, 93, 254, 175, 226, 118, 93, + 254, 175, 213, 11, 93, 254, 175, 217, 167, 93, 254, 175, 243, 17, 93, + 254, 175, 243, 18, 230, 139, 93, 254, 175, 243, 15, 93, 254, 175, 224, + 216, 226, 144, 93, 254, 175, 217, 206, 243, 32, 93, 254, 175, 226, 100, + 93, 254, 175, 253, 116, 242, 22, 93, 254, 175, 230, 149, 93, 254, 175, + 232, 13, 93, 254, 175, 231, 113, 93, 254, 175, 231, 114, 234, 183, 93, + 254, 175, 248, 108, 93, 254, 175, 224, 227, 93, 254, 175, 217, 206, 224, + 211, 93, 254, 175, 213, 21, 251, 217, 212, 221, 93, 254, 175, 227, 73, + 93, 254, 175, 236, 14, 93, 254, 175, 248, 21, 93, 254, 175, 212, 26, 93, + 152, 231, 206, 249, 228, 93, 225, 145, 220, 216, 93, 225, 145, 241, 233, + 222, 81, 93, 225, 145, 241, 233, 226, 112, 93, 225, 145, 241, 233, 224, + 220, 93, 225, 145, 241, 144, 93, 225, 145, 216, 134, 93, 225, 145, 222, + 81, 93, 225, 145, 226, 112, 93, 225, 145, 224, 220, 93, 225, 145, 241, + 47, 93, 225, 145, 241, 48, 241, 235, 31, 214, 236, 93, 225, 145, 224, + 162, 93, 225, 145, 248, 151, 167, 231, 234, 93, 225, 145, 231, 105, 93, + 225, 27, 231, 231, 93, 225, 145, 224, 59, 93, 225, 27, 226, 120, 93, 225, + 145, 220, 201, 247, 74, 93, 225, 145, 220, 85, 247, 74, 93, 225, 27, 219, + 237, 226, 114, 93, 152, 215, 131, 247, 74, 93, 152, 232, 163, 247, 74, + 93, 225, 27, 228, 51, 242, 21, 93, 225, 145, 224, 221, 224, 215, 93, 1, + 254, 78, 93, 1, 251, 205, 93, 1, 242, 177, 93, 1, 248, 134, 93, 1, 241, + 222, 93, 1, 214, 236, 93, 1, 212, 90, 93, 1, 241, 182, 93, 1, 217, 183, + 93, 1, 212, 224, 93, 1, 40, 234, 254, 93, 1, 234, 254, 93, 1, 233, 118, + 93, 1, 40, 231, 129, 93, 1, 231, 129, 93, 1, 40, 228, 50, 93, 1, 228, 50, + 93, 1, 222, 164, 93, 1, 253, 78, 93, 1, 40, 226, 96, 93, 1, 226, 96, 93, + 1, 40, 216, 137, 93, 1, 216, 137, 93, 1, 224, 184, 93, 1, 223, 219, 93, + 1, 220, 200, 93, 1, 217, 245, 93, 26, 212, 253, 51, 214, 236, 93, 26, + 212, 253, 214, 237, 212, 224, 93, 26, 212, 253, 51, 212, 224, 93, 225, + 27, 243, 17, 93, 225, 27, 243, 15, 12, 50, 52, 12, 5, 222, 158, 12, 243, + 255, 231, 217, 12, 5, 222, 192, 253, 207, 249, 50, 223, 95, 253, 207, + 243, 230, 223, 95, 12, 224, 27, 253, 207, 226, 58, 231, 6, 52, 253, 207, + 226, 58, 217, 201, 217, 101, 52, 254, 126, 52, 12, 249, 157, 12, 248, 96, + 221, 57, 12, 225, 147, 214, 218, 52, 12, 5, 230, 243, 12, 5, 222, 174, + 254, 80, 214, 29, 12, 5, 254, 80, 253, 137, 12, 5, 224, 58, 254, 79, 12, + 5, 224, 65, 254, 61, 254, 14, 12, 5, 218, 20, 12, 3, 124, 218, 29, 12, 3, + 124, 26, 106, 2, 233, 127, 2, 213, 34, 12, 3, 124, 212, 101, 12, 3, 244, + 133, 12, 3, 248, 129, 12, 3, 234, 210, 12, 221, 70, 12, 216, 169, 62, + 225, 27, 77, 12, 224, 158, 77, 12, 1, 234, 214, 213, 34, 12, 1, 242, 2, + 12, 1, 106, 2, 232, 33, 49, 12, 1, 106, 2, 192, 49, 12, 1, 214, 15, 2, + 192, 49, 12, 1, 106, 2, 192, 55, 12, 1, 73, 2, 192, 49, 12, 1, 254, 78, + 12, 1, 251, 230, 12, 1, 217, 216, 231, 227, 12, 1, 217, 215, 12, 1, 217, + 145, 12, 1, 235, 124, 12, 1, 242, 18, 12, 1, 234, 135, 12, 1, 248, 140, + 12, 1, 217, 155, 12, 1, 223, 245, 12, 1, 212, 101, 12, 1, 222, 85, 12, 1, + 220, 239, 12, 1, 222, 195, 12, 1, 248, 159, 12, 1, 218, 29, 12, 1, 212, + 104, 12, 1, 254, 103, 12, 1, 242, 220, 12, 1, 234, 181, 2, 117, 176, 49, + 12, 1, 234, 181, 2, 133, 176, 55, 12, 1, 244, 136, 73, 2, 235, 191, 215, + 79, 12, 1, 244, 136, 73, 2, 117, 176, 49, 12, 1, 244, 136, 73, 2, 133, + 176, 49, 12, 217, 250, 12, 1, 244, 111, 12, 1, 224, 225, 12, 1, 234, 254, + 12, 1, 233, 126, 12, 1, 231, 143, 12, 1, 228, 173, 12, 1, 241, 202, 12, + 1, 214, 14, 12, 1, 106, 231, 255, 12, 1, 213, 34, 12, 244, 131, 12, 248, + 127, 12, 234, 208, 12, 244, 133, 12, 248, 129, 12, 234, 210, 12, 221, 15, + 12, 218, 246, 12, 232, 31, 49, 12, 192, 49, 12, 192, 55, 12, 219, 10, + 254, 78, 12, 235, 191, 248, 129, 12, 152, 228, 174, 242, 194, 12, 211, + 250, 12, 30, 5, 3, 215, 80, 49, 12, 30, 5, 235, 191, 3, 215, 80, 49, 12, + 30, 5, 62, 55, 12, 223, 202, 248, 129, 12, 244, 134, 2, 117, 247, 72, 12, + 214, 16, 192, 55, 253, 207, 21, 212, 79, 253, 207, 21, 116, 253, 207, 21, + 109, 253, 207, 21, 166, 253, 207, 21, 163, 253, 207, 21, 180, 253, 207, + 21, 189, 253, 207, 21, 198, 253, 207, 21, 195, 253, 207, 21, 200, 12, + 226, 57, 52, 12, 248, 34, 221, 57, 12, 217, 99, 221, 57, 12, 244, 50, + 225, 143, 219, 95, 12, 1, 247, 73, 251, 230, 12, 1, 247, 73, 224, 225, + 12, 1, 218, 223, 254, 78, 12, 1, 106, 214, 30, 12, 1, 106, 2, 214, 16, + 192, 49, 12, 1, 106, 2, 214, 16, 192, 55, 12, 1, 124, 242, 2, 12, 1, 124, + 192, 254, 78, 12, 1, 124, 192, 214, 14, 12, 1, 111, 2, 192, 49, 12, 1, + 124, 192, 213, 34, 12, 1, 216, 109, 12, 1, 216, 107, 12, 1, 251, 240, 12, + 1, 217, 216, 2, 223, 130, 12, 1, 217, 216, 2, 133, 176, 78, 246, 57, 12, + 1, 226, 80, 12, 1, 217, 213, 12, 1, 251, 228, 12, 1, 121, 2, 192, 49, 12, + 1, 121, 2, 117, 176, 71, 49, 12, 1, 228, 14, 12, 1, 245, 254, 12, 1, 121, + 2, 133, 176, 49, 12, 1, 217, 233, 12, 1, 217, 231, 12, 1, 248, 81, 12, 1, + 248, 141, 2, 223, 130, 12, 1, 248, 141, 2, 62, 55, 12, 1, 248, 141, 2, + 62, 251, 220, 24, 3, 218, 29, 12, 1, 248, 146, 12, 1, 248, 83, 12, 1, + 246, 25, 12, 1, 248, 141, 2, 133, 176, 78, 246, 57, 12, 1, 248, 141, 2, + 243, 237, 176, 49, 12, 1, 223, 77, 12, 1, 223, 246, 2, 3, 215, 79, 12, 1, + 223, 246, 2, 223, 130, 12, 1, 223, 246, 2, 62, 55, 12, 1, 223, 246, 2, 3, + 215, 80, 55, 12, 1, 223, 246, 2, 62, 251, 220, 24, 62, 49, 12, 1, 223, + 246, 2, 117, 176, 49, 12, 1, 235, 121, 12, 1, 223, 246, 2, 243, 237, 176, + 49, 12, 1, 222, 86, 2, 62, 251, 220, 24, 62, 49, 12, 1, 222, 86, 2, 133, + 176, 55, 12, 1, 222, 86, 2, 133, 176, 251, 220, 24, 133, 176, 49, 12, 1, + 222, 196, 2, 117, 176, 55, 12, 1, 222, 196, 2, 133, 176, 49, 12, 1, 218, + 30, 2, 133, 176, 49, 12, 1, 254, 104, 2, 133, 176, 49, 12, 1, 247, 73, + 244, 111, 12, 1, 244, 112, 2, 62, 230, 179, 55, 12, 1, 244, 112, 2, 62, + 55, 12, 1, 214, 225, 12, 1, 244, 112, 2, 133, 176, 55, 12, 1, 226, 78, + 12, 1, 224, 226, 2, 62, 49, 12, 1, 224, 226, 2, 133, 176, 49, 12, 1, 234, + 180, 12, 1, 218, 195, 234, 254, 12, 1, 234, 255, 2, 223, 130, 12, 1, 234, + 255, 2, 62, 49, 12, 1, 229, 161, 12, 1, 234, 255, 2, 133, 176, 55, 12, 1, + 243, 97, 12, 1, 243, 98, 2, 223, 130, 12, 1, 229, 88, 12, 1, 243, 98, 2, + 117, 176, 55, 12, 1, 242, 82, 12, 1, 243, 98, 2, 133, 176, 49, 12, 1, + 233, 127, 2, 3, 215, 79, 12, 1, 233, 127, 2, 62, 49, 12, 1, 233, 127, 2, + 133, 176, 49, 12, 1, 233, 127, 2, 133, 176, 55, 12, 1, 228, 174, 2, 62, + 55, 12, 1, 228, 174, 242, 194, 12, 1, 223, 115, 12, 1, 228, 174, 2, 223, + 130, 12, 1, 228, 174, 2, 133, 176, 49, 12, 1, 241, 203, 247, 95, 12, 1, + 217, 234, 2, 62, 49, 12, 1, 241, 203, 2, 73, 49, 12, 1, 241, 203, 242, + 147, 12, 1, 241, 203, 242, 148, 2, 192, 49, 12, 1, 217, 216, 231, 228, + 242, 147, 12, 1, 214, 15, 2, 223, 130, 12, 1, 234, 82, 227, 99, 12, 1, + 227, 99, 12, 1, 69, 12, 1, 212, 203, 12, 1, 234, 82, 212, 203, 12, 1, + 214, 15, 2, 117, 176, 49, 12, 1, 214, 232, 12, 1, 244, 136, 213, 34, 12, + 1, 73, 2, 218, 27, 12, 1, 73, 2, 3, 215, 79, 12, 1, 214, 15, 2, 62, 49, + 12, 1, 74, 12, 1, 73, 2, 133, 176, 55, 12, 1, 73, 252, 52, 12, 1, 73, + 252, 53, 2, 192, 49, 12, 243, 200, 219, 69, 12, 1, 254, 148, 12, 3, 124, + 26, 222, 196, 2, 233, 127, 2, 106, 231, 255, 12, 3, 124, 26, 224, 226, 2, + 233, 127, 2, 106, 231, 255, 12, 3, 124, 63, 70, 17, 12, 3, 124, 233, 127, + 254, 78, 12, 3, 124, 235, 124, 12, 3, 124, 133, 247, 72, 12, 3, 124, 222, + 85, 12, 245, 101, 65, 253, 82, 12, 219, 91, 65, 223, 49, 245, 132, 241, + 141, 12, 3, 124, 223, 85, 212, 79, 12, 3, 124, 215, 130, 224, 8, 212, 79, + 12, 3, 124, 247, 73, 241, 220, 65, 234, 135, 12, 3, 124, 63, 48, 17, 12, + 3, 115, 222, 85, 12, 3, 124, 232, 32, 12, 3, 214, 14, 12, 3, 213, 34, 12, + 3, 124, 213, 34, 12, 3, 124, 228, 173, 12, 225, 173, 65, 222, 184, 12, + 245, 110, 250, 109, 115, 219, 69, 12, 245, 110, 250, 109, 124, 219, 69, + 12, 223, 85, 124, 219, 70, 2, 244, 73, 250, 108, 12, 3, 115, 231, 143, + 12, 1, 248, 141, 2, 235, 191, 215, 79, 12, 1, 223, 246, 2, 235, 191, 215, + 79, 244, 246, 253, 207, 21, 212, 79, 244, 246, 253, 207, 21, 116, 244, + 246, 253, 207, 21, 109, 244, 246, 253, 207, 21, 166, 244, 246, 253, 207, + 21, 163, 244, 246, 253, 207, 21, 180, 244, 246, 253, 207, 21, 189, 244, + 246, 253, 207, 21, 198, 244, 246, 253, 207, 21, 195, 244, 246, 253, 207, + 21, 200, 12, 1, 220, 240, 2, 62, 55, 12, 1, 248, 160, 2, 62, 55, 12, 1, + 242, 221, 2, 62, 55, 12, 5, 220, 84, 254, 35, 12, 5, 220, 84, 225, 115, + 231, 122, 12, 1, 241, 203, 2, 235, 191, 215, 79, 175, 245, 101, 65, 226, + 142, 175, 218, 219, 243, 200, 219, 69, 175, 219, 12, 243, 200, 219, 69, + 175, 218, 219, 249, 164, 175, 219, 12, 249, 164, 175, 199, 249, 164, 175, + 249, 165, 220, 34, 233, 70, 175, 249, 165, 220, 34, 223, 148, 175, 218, + 219, 249, 165, 220, 34, 233, 70, 175, 219, 12, 249, 165, 220, 34, 223, + 148, 175, 249, 119, 175, 241, 240, 227, 114, 175, 241, 240, 231, 103, + 175, 241, 240, 253, 134, 175, 254, 181, 77, 175, 1, 254, 82, 175, 1, 218, + 223, 254, 82, 175, 1, 251, 202, 175, 1, 243, 89, 175, 1, 243, 90, 243, + 67, 175, 1, 248, 137, 175, 1, 247, 73, 248, 138, 223, 126, 175, 1, 241, + 222, 175, 1, 214, 14, 175, 1, 212, 101, 175, 1, 241, 180, 175, 1, 217, + 179, 175, 1, 217, 180, 243, 67, 175, 1, 212, 190, 175, 1, 212, 191, 241, + 222, 175, 1, 234, 230, 175, 1, 233, 125, 175, 1, 231, 3, 175, 1, 228, 50, + 175, 1, 221, 63, 175, 1, 40, 221, 63, 175, 1, 74, 175, 1, 226, 96, 175, + 1, 223, 202, 226, 96, 175, 1, 222, 193, 175, 1, 224, 219, 175, 1, 223, + 126, 175, 1, 220, 200, 175, 1, 217, 243, 175, 1, 226, 45, 251, 190, 175, + 1, 226, 45, 242, 218, 175, 1, 226, 45, 247, 228, 175, 225, 36, 49, 175, + 225, 36, 55, 175, 225, 36, 246, 71, 175, 212, 10, 49, 175, 212, 10, 55, + 175, 212, 10, 246, 71, 175, 224, 24, 49, 175, 224, 24, 55, 175, 246, 72, + 212, 17, 241, 31, 175, 246, 72, 212, 17, 254, 15, 175, 241, 225, 49, 175, + 241, 225, 55, 175, 241, 224, 246, 71, 175, 245, 43, 49, 175, 245, 43, 55, + 175, 223, 19, 175, 244, 105, 247, 74, 175, 224, 137, 175, 223, 45, 175, + 117, 71, 176, 49, 175, 117, 71, 176, 55, 175, 133, 176, 49, 175, 133, + 176, 55, 175, 227, 112, 232, 243, 49, 175, 227, 112, 232, 243, 55, 175, + 230, 126, 175, 252, 51, 175, 1, 219, 233, 212, 73, 175, 1, 219, 233, 234, + 128, 175, 1, 219, 233, 244, 123, 12, 1, 251, 231, 2, 133, 176, 240, 237, + 55, 12, 1, 251, 231, 2, 62, 251, 220, 24, 133, 176, 49, 12, 1, 251, 231, + 2, 133, 176, 225, 141, 215, 124, 55, 12, 1, 251, 231, 2, 133, 176, 225, + 141, 215, 124, 251, 220, 24, 117, 176, 49, 12, 1, 251, 231, 2, 117, 176, + 251, 220, 24, 62, 49, 12, 1, 251, 231, 2, 235, 191, 3, 215, 80, 55, 12, + 1, 251, 231, 2, 3, 215, 79, 12, 1, 121, 2, 117, 176, 49, 12, 1, 121, 2, + 133, 176, 225, 141, 215, 124, 55, 12, 1, 248, 141, 2, 117, 176, 214, 166, + 251, 220, 24, 3, 218, 29, 12, 1, 248, 141, 2, 235, 191, 3, 215, 80, 55, + 12, 1, 223, 246, 2, 90, 12, 1, 222, 86, 2, 243, 237, 176, 49, 12, 1, 254, + 104, 2, 117, 176, 49, 12, 1, 254, 104, 2, 133, 176, 225, 141, 246, 58, + 49, 12, 1, 254, 104, 2, 117, 176, 214, 166, 49, 12, 1, 244, 112, 2, 117, + 176, 55, 12, 1, 244, 112, 2, 133, 176, 225, 141, 215, 124, 55, 12, 1, + 234, 181, 2, 62, 49, 12, 1, 234, 181, 2, 133, 176, 49, 12, 1, 234, 181, + 2, 133, 176, 225, 141, 215, 124, 55, 12, 1, 63, 2, 62, 49, 12, 1, 63, 2, + 62, 55, 12, 1, 228, 174, 2, 117, 176, 55, 12, 1, 228, 174, 2, 3, 218, 29, + 12, 1, 228, 174, 2, 3, 215, 79, 12, 1, 233, 127, 2, 134, 12, 1, 223, 246, + 2, 117, 176, 214, 166, 49, 12, 1, 223, 246, 2, 192, 49, 12, 1, 222, 86, + 2, 117, 176, 214, 166, 49, 12, 1, 121, 2, 3, 12, 1, 218, 30, 55, 12, 1, + 121, 2, 3, 12, 1, 218, 30, 24, 117, 247, 72, 12, 1, 222, 86, 2, 3, 12, 1, + 218, 30, 24, 117, 247, 72, 12, 1, 223, 246, 2, 3, 12, 1, 218, 30, 24, + 117, 247, 72, 12, 1, 121, 2, 3, 12, 1, 218, 30, 49, 12, 1, 106, 2, 244, + 246, 253, 207, 21, 117, 49, 12, 1, 106, 2, 244, 246, 253, 207, 21, 133, + 49, 12, 1, 244, 136, 73, 2, 244, 246, 253, 207, 21, 117, 49, 12, 1, 244, + 136, 73, 2, 244, 246, 253, 207, 21, 133, 49, 12, 1, 244, 136, 73, 2, 244, + 246, 253, 207, 21, 243, 237, 55, 12, 1, 214, 15, 2, 244, 246, 253, 207, + 21, 117, 49, 12, 1, 214, 15, 2, 244, 246, 253, 207, 21, 133, 49, 12, 1, + 73, 252, 53, 2, 244, 246, 253, 207, 21, 117, 49, 12, 1, 73, 252, 53, 2, + 244, 246, 253, 207, 21, 133, 49, 12, 1, 121, 2, 244, 246, 253, 207, 21, + 243, 237, 55, 12, 1, 222, 86, 2, 244, 246, 253, 207, 21, 243, 237, 49, + 12, 1, 222, 86, 2, 235, 191, 215, 79, 12, 1, 234, 255, 2, 117, 176, 49, + 217, 158, 1, 242, 27, 217, 158, 1, 220, 248, 217, 158, 1, 228, 172, 217, + 158, 1, 224, 74, 217, 158, 1, 252, 106, 217, 158, 1, 233, 22, 217, 158, + 1, 235, 12, 217, 158, 1, 254, 68, 217, 158, 1, 214, 255, 217, 158, 1, + 231, 142, 217, 158, 1, 244, 162, 217, 158, 1, 247, 231, 217, 158, 1, 217, + 160, 217, 158, 1, 233, 153, 217, 158, 1, 243, 106, 217, 158, 1, 242, 153, + 217, 158, 1, 222, 84, 217, 158, 1, 248, 94, 217, 158, 1, 212, 93, 217, + 158, 1, 217, 244, 217, 158, 1, 213, 91, 217, 158, 1, 226, 107, 217, 158, + 1, 235, 129, 217, 158, 1, 250, 70, 217, 158, 1, 216, 114, 217, 158, 1, + 241, 173, 217, 158, 1, 234, 137, 217, 158, 1, 217, 159, 217, 158, 1, 212, + 108, 217, 158, 1, 220, 238, 217, 158, 1, 222, 199, 217, 158, 1, 248, 162, + 217, 158, 1, 108, 217, 158, 1, 212, 16, 217, 158, 1, 254, 101, 217, 158, + 1, 242, 219, 217, 158, 1, 224, 229, 217, 158, 1, 214, 47, 217, 158, 254, + 182, 217, 158, 254, 197, 217, 158, 240, 107, 217, 158, 245, 164, 217, + 158, 215, 191, 217, 158, 227, 48, 217, 158, 245, 172, 217, 158, 244, 240, + 217, 158, 227, 111, 217, 158, 227, 119, 217, 158, 218, 246, 217, 158, 1, + 230, 43, 228, 224, 21, 212, 79, 228, 224, 21, 116, 228, 224, 21, 109, + 228, 224, 21, 166, 228, 224, 21, 163, 228, 224, 21, 180, 228, 224, 21, + 189, 228, 224, 21, 198, 228, 224, 21, 195, 228, 224, 21, 200, 228, 224, + 1, 61, 228, 224, 1, 245, 165, 228, 224, 1, 72, 228, 224, 1, 74, 228, 224, + 1, 69, 228, 224, 1, 227, 49, 228, 224, 1, 75, 228, 224, 1, 248, 152, 228, + 224, 1, 204, 228, 224, 1, 252, 107, 228, 224, 1, 193, 228, 224, 1, 218, + 52, 228, 224, 1, 235, 139, 228, 224, 1, 250, 92, 228, 224, 1, 248, 164, + 228, 224, 1, 203, 228, 224, 1, 223, 81, 228, 224, 1, 222, 202, 228, 224, + 1, 243, 55, 228, 224, 1, 244, 164, 228, 224, 1, 181, 228, 224, 1, 233, + 157, 228, 224, 1, 230, 46, 213, 210, 228, 224, 1, 188, 228, 224, 1, 228, + 23, 228, 224, 1, 205, 228, 224, 1, 159, 228, 224, 1, 214, 49, 228, 224, + 1, 186, 228, 224, 1, 228, 24, 213, 210, 228, 224, 1, 235, 64, 235, 139, + 228, 224, 1, 235, 64, 250, 92, 228, 224, 1, 235, 64, 203, 228, 224, 37, + 220, 175, 124, 216, 241, 228, 224, 37, 220, 175, 115, 216, 241, 228, 224, + 37, 220, 175, 223, 125, 216, 241, 228, 224, 37, 184, 247, 245, 216, 241, + 228, 224, 37, 184, 124, 216, 241, 228, 224, 37, 184, 115, 216, 241, 228, + 224, 37, 184, 223, 125, 216, 241, 228, 224, 37, 230, 13, 77, 228, 224, + 37, 51, 62, 49, 228, 224, 124, 160, 253, 226, 228, 224, 115, 160, 253, + 226, 228, 224, 16, 227, 50, 248, 1, 228, 224, 16, 243, 54, 228, 224, 249, + 157, 228, 224, 244, 254, 77, 228, 224, 233, 132, 222, 167, 1, 254, 84, + 222, 167, 1, 251, 151, 222, 167, 1, 243, 88, 222, 167, 1, 248, 139, 222, + 167, 1, 235, 150, 222, 167, 1, 252, 106, 222, 167, 1, 212, 82, 222, 167, + 1, 235, 158, 222, 167, 1, 217, 20, 222, 167, 1, 212, 173, 222, 167, 1, + 235, 13, 222, 167, 1, 233, 150, 222, 167, 1, 231, 3, 222, 167, 1, 228, + 50, 222, 167, 1, 220, 82, 222, 167, 1, 235, 251, 222, 167, 1, 244, 90, + 222, 167, 1, 216, 139, 222, 167, 1, 224, 155, 222, 167, 1, 223, 126, 222, + 167, 1, 221, 8, 222, 167, 1, 218, 48, 222, 167, 152, 235, 251, 222, 167, + 152, 235, 250, 222, 167, 152, 227, 107, 222, 167, 152, 248, 150, 222, + 167, 59, 1, 245, 68, 212, 173, 222, 167, 152, 245, 68, 212, 173, 222, + 167, 30, 5, 184, 74, 222, 167, 30, 5, 74, 222, 167, 30, 5, 226, 242, 254, + 232, 222, 167, 30, 5, 184, 254, 232, 222, 167, 30, 5, 254, 232, 222, 167, + 30, 5, 226, 242, 61, 222, 167, 30, 5, 184, 61, 222, 167, 30, 5, 61, 222, + 167, 59, 1, 220, 175, 61, 222, 167, 30, 5, 220, 175, 61, 222, 167, 30, 5, + 184, 69, 222, 167, 30, 5, 69, 222, 167, 59, 1, 72, 222, 167, 30, 5, 184, + 72, 222, 167, 30, 5, 72, 222, 167, 30, 5, 75, 222, 167, 30, 5, 218, 246, + 222, 167, 152, 229, 174, 222, 167, 225, 27, 229, 174, 222, 167, 225, 27, + 254, 123, 222, 167, 225, 27, 254, 23, 222, 167, 225, 27, 252, 34, 222, + 167, 225, 27, 253, 117, 222, 167, 225, 27, 220, 188, 222, 167, 254, 181, + 77, 222, 167, 225, 27, 231, 132, 224, 190, 222, 167, 225, 27, 212, 24, + 222, 167, 225, 27, 224, 190, 222, 167, 225, 27, 212, 107, 222, 167, 225, + 27, 216, 54, 222, 167, 225, 27, 253, 180, 222, 167, 225, 27, 219, 237, + 231, 208, 222, 167, 225, 27, 254, 11, 231, 245, 1, 242, 7, 231, 245, 1, + 254, 185, 231, 245, 1, 254, 121, 231, 245, 1, 254, 160, 231, 245, 1, 254, + 114, 231, 245, 1, 215, 98, 231, 245, 1, 253, 76, 231, 245, 1, 235, 158, + 231, 245, 1, 253, 114, 231, 245, 1, 254, 89, 231, 245, 1, 254, 94, 231, + 245, 1, 254, 86, 231, 245, 1, 254, 45, 231, 245, 1, 254, 32, 231, 245, 1, + 253, 152, 231, 245, 1, 235, 251, 231, 245, 1, 253, 239, 231, 245, 1, 253, + 124, 231, 245, 1, 253, 215, 231, 245, 1, 253, 211, 231, 245, 1, 253, 146, + 231, 245, 1, 253, 122, 231, 245, 1, 246, 10, 231, 245, 1, 235, 6, 231, + 245, 1, 254, 103, 231, 245, 254, 127, 77, 231, 245, 214, 117, 77, 231, + 245, 243, 29, 77, 231, 245, 225, 26, 82, 5, 235, 191, 250, 187, 82, 5, + 250, 187, 82, 5, 253, 242, 82, 5, 214, 128, 82, 1, 220, 175, 61, 82, 1, + 61, 82, 1, 254, 232, 82, 1, 72, 82, 1, 236, 28, 82, 1, 69, 82, 1, 215, + 92, 82, 1, 161, 149, 82, 1, 161, 150, 82, 1, 250, 190, 74, 82, 1, 220, + 175, 74, 82, 1, 74, 82, 1, 254, 108, 82, 1, 250, 190, 75, 82, 1, 220, + 175, 75, 82, 1, 75, 82, 1, 253, 108, 82, 1, 181, 82, 1, 234, 138, 82, 1, + 243, 110, 82, 1, 242, 225, 82, 1, 229, 159, 82, 1, 250, 219, 82, 1, 250, + 92, 82, 1, 235, 139, 82, 1, 235, 115, 82, 1, 228, 23, 82, 1, 216, 115, + 82, 1, 216, 105, 82, 1, 248, 86, 82, 1, 248, 70, 82, 1, 228, 198, 82, 1, + 218, 52, 82, 1, 217, 161, 82, 1, 248, 164, 82, 1, 247, 232, 82, 1, 205, + 82, 1, 228, 189, 82, 1, 193, 82, 1, 226, 23, 82, 1, 252, 107, 82, 1, 251, + 195, 82, 1, 188, 82, 1, 186, 82, 1, 203, 82, 1, 223, 81, 82, 1, 233, 157, + 82, 1, 232, 213, 82, 1, 232, 212, 82, 1, 215, 1, 82, 1, 221, 24, 82, 1, + 219, 157, 82, 1, 222, 202, 82, 1, 159, 82, 30, 5, 227, 99, 82, 30, 5, + 227, 47, 82, 5, 228, 60, 82, 5, 253, 91, 82, 30, 5, 254, 232, 82, 30, 5, + 72, 82, 30, 5, 236, 28, 82, 30, 5, 69, 82, 30, 5, 215, 92, 82, 30, 5, + 161, 149, 82, 30, 5, 161, 223, 82, 82, 30, 5, 250, 190, 74, 82, 30, 5, + 220, 175, 74, 82, 30, 5, 74, 82, 30, 5, 254, 108, 82, 30, 5, 250, 190, + 75, 82, 30, 5, 220, 175, 75, 82, 30, 5, 75, 82, 30, 5, 253, 108, 82, 5, + 214, 133, 82, 30, 5, 225, 66, 74, 82, 30, 5, 253, 87, 82, 227, 70, 82, + 219, 51, 5, 215, 185, 82, 219, 51, 5, 253, 244, 82, 242, 114, 254, 174, + 82, 254, 164, 254, 174, 82, 30, 5, 250, 190, 184, 74, 82, 30, 5, 215, + 183, 82, 30, 5, 215, 91, 82, 1, 224, 232, 82, 1, 234, 121, 82, 1, 242, + 202, 82, 1, 212, 109, 82, 1, 248, 75, 82, 1, 223, 192, 82, 1, 244, 164, + 82, 1, 212, 160, 82, 1, 161, 223, 82, 82, 1, 161, 232, 214, 82, 30, 5, + 161, 150, 82, 30, 5, 161, 232, 214, 82, 248, 123, 82, 51, 248, 123, 82, + 21, 212, 79, 82, 21, 116, 82, 21, 109, 82, 21, 166, 82, 21, 163, 82, 21, + 180, 82, 21, 189, 82, 21, 198, 82, 21, 195, 82, 21, 200, 82, 254, 181, + 52, 82, 5, 124, 219, 205, 247, 74, 82, 1, 250, 190, 61, 82, 1, 227, 99, + 82, 1, 227, 47, 82, 1, 253, 87, 82, 1, 215, 183, 82, 1, 215, 91, 82, 1, + 212, 75, 82, 1, 107, 186, 82, 1, 243, 5, 82, 1, 235, 99, 82, 1, 242, 156, + 219, 69, 82, 1, 248, 76, 82, 1, 252, 31, 140, 5, 250, 187, 140, 5, 253, + 242, 140, 5, 214, 128, 140, 1, 61, 140, 1, 254, 232, 140, 1, 72, 140, 1, + 236, 28, 140, 1, 69, 140, 1, 215, 92, 140, 1, 161, 149, 140, 1, 161, 150, + 140, 1, 74, 140, 1, 254, 108, 140, 1, 75, 140, 1, 253, 108, 140, 1, 181, + 140, 1, 234, 138, 140, 1, 243, 110, 140, 1, 242, 225, 140, 1, 229, 159, + 140, 1, 250, 219, 140, 1, 250, 92, 140, 1, 235, 139, 140, 1, 235, 115, + 140, 1, 228, 23, 140, 1, 216, 115, 140, 1, 216, 105, 140, 1, 248, 86, + 140, 1, 248, 70, 140, 1, 228, 198, 140, 1, 218, 52, 140, 1, 217, 161, + 140, 1, 248, 164, 140, 1, 247, 232, 140, 1, 205, 140, 1, 193, 140, 1, + 226, 23, 140, 1, 252, 107, 140, 1, 251, 195, 140, 1, 188, 140, 1, 186, + 140, 1, 203, 140, 1, 233, 157, 140, 1, 221, 24, 140, 1, 219, 157, 140, 1, + 222, 202, 140, 1, 159, 140, 5, 228, 60, 140, 5, 253, 91, 140, 30, 5, 254, + 232, 140, 30, 5, 72, 140, 30, 5, 236, 28, 140, 30, 5, 69, 140, 30, 5, + 215, 92, 140, 30, 5, 161, 149, 140, 30, 5, 161, 223, 82, 140, 30, 5, 74, + 140, 30, 5, 254, 108, 140, 30, 5, 75, 140, 30, 5, 253, 108, 140, 5, 214, + 133, 140, 1, 234, 130, 218, 52, 140, 253, 109, 233, 47, 77, 140, 1, 223, + 81, 140, 1, 223, 192, 140, 1, 212, 160, 140, 1, 161, 223, 82, 140, 1, + 161, 232, 214, 140, 30, 5, 161, 150, 140, 30, 5, 161, 232, 214, 140, 21, + 212, 79, 140, 21, 116, 140, 21, 109, 140, 21, 166, 140, 21, 163, 140, 21, + 180, 140, 21, 189, 140, 21, 198, 140, 21, 195, 140, 21, 200, 140, 1, 224, + 77, 2, 231, 37, 247, 206, 140, 1, 224, 77, 2, 232, 163, 247, 206, 140, + 223, 29, 77, 140, 223, 29, 52, 140, 249, 39, 228, 53, 116, 140, 249, 39, + 228, 53, 109, 140, 249, 39, 228, 53, 166, 140, 249, 39, 228, 53, 163, + 140, 249, 39, 228, 53, 122, 233, 40, 217, 154, 217, 149, 247, 255, 140, + 249, 39, 248, 0, 220, 47, 140, 235, 159, 140, 243, 79, 77, 173, 5, 254, + 159, 251, 166, 173, 5, 251, 166, 173, 5, 214, 128, 173, 1, 61, 173, 1, + 254, 232, 173, 1, 72, 173, 1, 236, 28, 173, 1, 69, 173, 1, 215, 92, 173, + 1, 245, 165, 173, 1, 254, 108, 173, 1, 227, 49, 173, 1, 253, 108, 173, 1, + 181, 173, 1, 234, 138, 173, 1, 243, 110, 173, 1, 242, 225, 173, 1, 229, + 159, 173, 1, 250, 219, 173, 1, 250, 92, 173, 1, 235, 139, 173, 1, 235, + 115, 173, 1, 228, 23, 173, 1, 216, 115, 173, 1, 216, 105, 173, 1, 248, + 86, 173, 1, 248, 70, 173, 1, 228, 198, 173, 1, 218, 52, 173, 1, 217, 161, + 173, 1, 248, 164, 173, 1, 247, 232, 173, 1, 205, 173, 1, 193, 173, 1, + 226, 23, 173, 1, 252, 107, 173, 1, 251, 195, 173, 1, 188, 173, 1, 186, + 173, 1, 203, 173, 1, 233, 157, 173, 1, 232, 213, 173, 1, 215, 1, 173, 1, + 221, 24, 173, 1, 222, 202, 173, 1, 159, 173, 5, 228, 60, 173, 30, 5, 254, + 232, 173, 30, 5, 72, 173, 30, 5, 236, 28, 173, 30, 5, 69, 173, 30, 5, + 215, 92, 173, 30, 5, 245, 165, 173, 30, 5, 254, 108, 173, 30, 5, 227, 49, + 173, 30, 5, 253, 108, 173, 5, 214, 133, 173, 5, 215, 187, 173, 1, 234, + 121, 173, 1, 242, 202, 173, 1, 212, 109, 173, 1, 223, 81, 173, 1, 244, + 164, 173, 21, 212, 79, 173, 21, 116, 173, 21, 109, 173, 21, 166, 173, 21, + 163, 173, 21, 180, 173, 21, 189, 173, 21, 198, 173, 21, 195, 173, 21, + 200, 173, 217, 27, 173, 254, 158, 173, 235, 176, 173, 215, 117, 173, 245, + 138, 227, 54, 173, 5, 213, 67, 164, 5, 250, 187, 164, 5, 253, 242, 164, + 5, 214, 128, 164, 1, 61, 164, 1, 254, 232, 164, 1, 72, 164, 1, 236, 28, + 164, 1, 69, 164, 1, 215, 92, 164, 1, 161, 149, 164, 1, 161, 150, 164, 30, + 250, 190, 74, 164, 1, 74, 164, 1, 254, 108, 164, 30, 250, 190, 75, 164, + 1, 75, 164, 1, 253, 108, 164, 1, 181, 164, 1, 234, 138, 164, 1, 243, 110, + 164, 1, 242, 225, 164, 1, 229, 159, 164, 1, 250, 219, 164, 1, 250, 92, + 164, 1, 235, 139, 164, 1, 235, 115, 164, 1, 228, 23, 164, 1, 216, 115, + 164, 1, 216, 105, 164, 1, 248, 86, 164, 1, 248, 70, 164, 1, 228, 198, + 164, 1, 218, 52, 164, 1, 217, 161, 164, 1, 248, 164, 164, 1, 247, 232, + 164, 1, 205, 164, 1, 193, 164, 1, 226, 23, 164, 1, 252, 107, 164, 1, 251, + 195, 164, 1, 188, 164, 1, 186, 164, 1, 203, 164, 1, 233, 157, 164, 1, + 232, 213, 164, 1, 215, 1, 164, 1, 221, 24, 164, 1, 219, 157, 164, 1, 222, + 202, 164, 1, 159, 164, 5, 228, 60, 164, 5, 253, 91, 164, 30, 5, 254, 232, + 164, 30, 5, 72, 164, 30, 5, 236, 28, 164, 30, 5, 69, 164, 30, 5, 215, 92, + 164, 30, 5, 161, 149, 164, 30, 5, 161, 223, 82, 164, 30, 5, 250, 190, 74, + 164, 30, 5, 74, 164, 30, 5, 254, 108, 164, 30, 5, 250, 190, 75, 164, 30, + 5, 75, 164, 30, 5, 253, 108, 164, 5, 214, 133, 164, 227, 70, 164, 1, 161, + 223, 82, 164, 1, 161, 232, 214, 164, 30, 5, 161, 150, 164, 30, 5, 161, + 232, 214, 164, 21, 212, 79, 164, 21, 116, 164, 21, 109, 164, 21, 166, + 164, 21, 163, 164, 21, 180, 164, 21, 189, 164, 21, 198, 164, 21, 195, + 164, 21, 200, 164, 223, 29, 52, 147, 5, 250, 187, 147, 5, 253, 242, 147, + 5, 214, 128, 147, 1, 61, 147, 1, 254, 232, 147, 1, 72, 147, 1, 236, 28, + 147, 1, 69, 147, 1, 215, 92, 147, 1, 161, 149, 147, 1, 161, 150, 147, 1, + 74, 147, 1, 254, 108, 147, 1, 75, 147, 1, 253, 108, 147, 1, 181, 147, 1, + 234, 138, 147, 1, 243, 110, 147, 1, 242, 225, 147, 1, 229, 159, 147, 1, + 250, 219, 147, 1, 250, 92, 147, 1, 235, 139, 147, 1, 235, 115, 147, 1, + 228, 23, 147, 1, 216, 115, 147, 1, 216, 105, 147, 1, 248, 86, 147, 1, + 248, 70, 147, 1, 228, 198, 147, 1, 218, 52, 147, 1, 217, 161, 147, 1, + 248, 164, 147, 1, 247, 232, 147, 1, 205, 147, 1, 193, 147, 1, 226, 23, + 147, 1, 252, 107, 147, 1, 251, 195, 147, 1, 188, 147, 1, 186, 147, 1, + 203, 147, 1, 233, 157, 147, 1, 232, 213, 147, 1, 215, 1, 147, 1, 221, 24, + 147, 1, 219, 157, 147, 1, 222, 202, 147, 1, 159, 147, 5, 228, 60, 147, 5, + 253, 91, 147, 30, 5, 254, 232, 147, 30, 5, 72, 147, 30, 5, 236, 28, 147, + 30, 5, 69, 147, 30, 5, 215, 92, 147, 30, 5, 161, 149, 147, 30, 5, 161, + 223, 82, 147, 30, 5, 74, 147, 30, 5, 254, 108, 147, 30, 5, 75, 147, 30, + 5, 253, 108, 147, 5, 214, 133, 147, 254, 109, 233, 47, 77, 147, 253, 109, + 233, 47, 77, 147, 1, 223, 81, 147, 1, 223, 192, 147, 1, 212, 160, 147, 1, + 161, 223, 82, 147, 1, 161, 232, 214, 147, 30, 5, 161, 150, 147, 30, 5, + 161, 232, 214, 147, 21, 212, 79, 147, 21, 116, 147, 21, 109, 147, 21, + 166, 147, 21, 163, 147, 21, 180, 147, 21, 189, 147, 21, 198, 147, 21, + 195, 147, 21, 200, 147, 235, 159, 147, 1, 214, 49, 147, 243, 228, 122, + 224, 166, 147, 243, 228, 122, 242, 9, 147, 243, 228, 133, 224, 164, 147, + 243, 228, 122, 220, 45, 147, 243, 228, 122, 245, 145, 147, 243, 228, 133, + 220, 44, 178, 5, 253, 242, 178, 5, 214, 128, 178, 1, 61, 178, 1, 254, + 232, 178, 1, 72, 178, 1, 236, 28, 178, 1, 69, 178, 1, 215, 92, 178, 1, + 74, 178, 1, 245, 165, 178, 1, 254, 108, 178, 1, 75, 178, 1, 227, 49, 178, + 1, 253, 108, 178, 1, 181, 178, 1, 229, 159, 178, 1, 250, 219, 178, 1, + 235, 139, 178, 1, 228, 23, 178, 1, 216, 115, 178, 1, 228, 198, 178, 1, + 218, 52, 178, 1, 205, 178, 1, 228, 189, 178, 1, 193, 178, 1, 188, 178, 1, + 186, 178, 1, 203, 178, 1, 223, 81, 178, 1, 233, 157, 178, 1, 232, 213, + 178, 1, 232, 212, 178, 1, 215, 1, 178, 1, 221, 24, 178, 1, 219, 157, 178, + 1, 222, 202, 178, 1, 159, 178, 30, 5, 254, 232, 178, 30, 5, 72, 178, 30, + 5, 236, 28, 178, 30, 5, 69, 178, 30, 5, 215, 92, 178, 30, 5, 74, 178, 30, + 5, 245, 165, 178, 30, 5, 254, 108, 178, 30, 5, 75, 178, 30, 5, 227, 49, + 178, 30, 5, 253, 108, 178, 5, 214, 133, 178, 227, 70, 178, 253, 109, 233, + 47, 77, 178, 21, 212, 79, 178, 21, 116, 178, 21, 109, 178, 21, 166, 178, + 21, 163, 178, 21, 180, 178, 21, 189, 178, 21, 198, 178, 21, 195, 178, 21, + 200, 178, 50, 217, 200, 178, 50, 122, 240, 200, 178, 50, 122, 217, 100, + 178, 248, 92, 52, 178, 230, 205, 52, 178, 213, 36, 52, 178, 248, 38, 52, + 178, 249, 79, 52, 178, 253, 153, 78, 52, 178, 223, 29, 52, 178, 50, 52, + 139, 5, 250, 187, 139, 5, 253, 242, 139, 5, 214, 128, 139, 1, 61, 139, 1, + 254, 232, 139, 1, 72, 139, 1, 236, 28, 139, 1, 69, 139, 1, 215, 92, 139, + 1, 161, 149, 139, 1, 161, 150, 139, 1, 74, 139, 1, 245, 165, 139, 1, 254, + 108, 139, 1, 75, 139, 1, 227, 49, 139, 1, 253, 108, 139, 1, 181, 139, 1, + 234, 138, 139, 1, 243, 110, 139, 1, 242, 225, 139, 1, 229, 159, 139, 1, + 250, 219, 139, 1, 250, 92, 139, 1, 235, 139, 139, 1, 235, 115, 139, 1, + 228, 23, 139, 1, 216, 115, 139, 1, 216, 105, 139, 1, 248, 86, 139, 1, + 248, 70, 139, 1, 228, 198, 139, 1, 218, 52, 139, 1, 217, 161, 139, 1, + 248, 164, 139, 1, 247, 232, 139, 1, 205, 139, 1, 193, 139, 1, 226, 23, + 139, 1, 252, 107, 139, 1, 251, 195, 139, 1, 188, 139, 1, 186, 139, 1, + 203, 139, 1, 223, 81, 139, 1, 233, 157, 139, 1, 232, 213, 139, 1, 215, 1, + 139, 1, 221, 24, 139, 1, 219, 157, 139, 1, 222, 202, 139, 1, 159, 139, 5, + 253, 91, 139, 30, 5, 254, 232, 139, 30, 5, 72, 139, 30, 5, 236, 28, 139, + 30, 5, 69, 139, 30, 5, 215, 92, 139, 30, 5, 161, 149, 139, 30, 5, 161, + 223, 82, 139, 30, 5, 74, 139, 30, 5, 245, 165, 139, 30, 5, 254, 108, 139, + 30, 5, 75, 139, 30, 5, 227, 49, 139, 30, 5, 253, 108, 139, 5, 214, 133, + 139, 233, 47, 77, 139, 254, 109, 233, 47, 77, 139, 1, 216, 141, 139, 1, + 245, 249, 139, 1, 161, 223, 82, 139, 1, 161, 232, 214, 139, 30, 5, 161, + 150, 139, 30, 5, 161, 232, 214, 139, 21, 212, 79, 139, 21, 116, 139, 21, + 109, 139, 21, 166, 139, 21, 163, 139, 21, 180, 139, 21, 189, 139, 21, + 198, 139, 21, 195, 139, 21, 200, 139, 243, 228, 21, 212, 80, 31, 227, + 102, 225, 103, 65, 163, 139, 243, 228, 21, 122, 31, 227, 102, 225, 103, + 65, 163, 139, 243, 228, 21, 117, 31, 227, 102, 225, 103, 65, 163, 139, + 243, 228, 21, 133, 31, 227, 102, 225, 103, 65, 163, 139, 243, 228, 21, + 122, 31, 245, 9, 225, 103, 65, 163, 139, 243, 228, 21, 117, 31, 245, 9, + 225, 103, 65, 163, 139, 243, 228, 21, 133, 31, 245, 9, 225, 103, 65, 163, + 139, 5, 216, 49, 155, 5, 253, 242, 155, 5, 214, 128, 155, 1, 61, 155, 1, + 254, 232, 155, 1, 72, 155, 1, 236, 28, 155, 1, 69, 155, 1, 215, 92, 155, + 1, 161, 149, 155, 1, 161, 150, 155, 1, 74, 155, 1, 245, 165, 155, 1, 254, + 108, 155, 1, 75, 155, 1, 227, 49, 155, 1, 253, 108, 155, 1, 181, 155, 1, + 234, 138, 155, 1, 243, 110, 155, 1, 242, 225, 155, 1, 229, 159, 155, 1, + 250, 219, 155, 1, 250, 92, 155, 1, 235, 139, 155, 1, 235, 115, 155, 1, + 228, 23, 155, 1, 216, 115, 155, 1, 216, 105, 155, 1, 248, 86, 155, 1, + 248, 70, 155, 1, 228, 198, 155, 1, 218, 52, 155, 1, 217, 161, 155, 1, + 248, 164, 155, 1, 247, 232, 155, 1, 205, 155, 1, 193, 155, 1, 226, 23, + 155, 1, 252, 107, 155, 1, 251, 195, 155, 1, 188, 155, 1, 186, 155, 1, + 203, 155, 1, 223, 81, 155, 1, 233, 157, 155, 1, 232, 213, 155, 1, 215, 1, + 155, 1, 221, 24, 155, 1, 219, 157, 155, 1, 222, 202, 155, 1, 159, 155, 5, + 228, 60, 155, 5, 253, 91, 155, 30, 5, 254, 232, 155, 30, 5, 72, 155, 30, + 5, 236, 28, 155, 30, 5, 69, 155, 30, 5, 215, 92, 155, 30, 5, 161, 149, + 155, 30, 5, 161, 223, 82, 155, 30, 5, 74, 155, 30, 5, 245, 165, 155, 30, + 5, 254, 108, 155, 30, 5, 75, 155, 30, 5, 227, 49, 155, 30, 5, 253, 108, + 155, 5, 214, 133, 155, 233, 47, 77, 155, 254, 109, 233, 47, 77, 155, 1, + 244, 164, 155, 1, 161, 223, 82, 155, 1, 161, 232, 214, 155, 30, 5, 161, + 150, 155, 30, 5, 161, 232, 214, 155, 21, 212, 79, 155, 21, 116, 155, 21, + 109, 155, 21, 166, 155, 21, 163, 155, 21, 180, 155, 21, 189, 155, 21, + 198, 155, 21, 195, 155, 21, 200, 155, 5, 235, 104, 155, 5, 215, 132, 130, + 5, 253, 242, 130, 5, 214, 128, 130, 1, 61, 130, 1, 254, 232, 130, 1, 72, + 130, 1, 236, 28, 130, 1, 69, 130, 1, 215, 92, 130, 1, 161, 149, 130, 1, + 161, 150, 130, 1, 74, 130, 1, 245, 165, 130, 1, 254, 108, 130, 1, 75, + 130, 1, 227, 49, 130, 1, 253, 108, 130, 1, 181, 130, 1, 234, 138, 130, 1, + 243, 110, 130, 1, 242, 225, 130, 1, 229, 159, 130, 1, 250, 219, 130, 1, + 250, 92, 130, 1, 235, 139, 130, 1, 235, 115, 130, 1, 228, 23, 130, 1, + 216, 115, 130, 1, 216, 105, 130, 1, 248, 86, 130, 1, 248, 70, 130, 1, + 228, 198, 130, 1, 218, 52, 130, 1, 217, 161, 130, 1, 248, 164, 130, 1, + 247, 232, 130, 1, 205, 130, 1, 228, 189, 130, 1, 193, 130, 1, 226, 23, + 130, 1, 252, 107, 130, 1, 251, 195, 130, 1, 188, 130, 1, 186, 130, 1, + 203, 130, 1, 223, 81, 130, 1, 233, 157, 130, 1, 232, 213, 130, 1, 232, + 212, 130, 1, 215, 1, 130, 1, 221, 24, 130, 1, 219, 157, 130, 1, 222, 202, + 130, 1, 159, 130, 1, 216, 88, 130, 5, 253, 91, 130, 30, 5, 254, 232, 130, + 30, 5, 72, 130, 30, 5, 236, 28, 130, 30, 5, 69, 130, 30, 5, 215, 92, 130, + 30, 5, 161, 149, 130, 30, 5, 161, 223, 82, 130, 30, 5, 74, 130, 30, 5, + 245, 165, 130, 30, 5, 254, 108, 130, 30, 5, 75, 130, 30, 5, 227, 49, 130, + 30, 5, 253, 108, 130, 5, 214, 133, 130, 1, 62, 223, 225, 130, 253, 109, + 233, 47, 77, 130, 1, 161, 223, 82, 130, 1, 161, 232, 214, 130, 30, 5, + 161, 150, 130, 30, 5, 161, 232, 214, 130, 21, 212, 79, 130, 21, 116, 130, + 21, 109, 130, 21, 166, 130, 21, 163, 130, 21, 180, 130, 21, 189, 130, 21, + 198, 130, 21, 195, 130, 21, 200, 130, 50, 217, 200, 130, 50, 122, 240, + 200, 130, 50, 122, 217, 100, 130, 243, 228, 122, 224, 166, 130, 243, 228, + 122, 242, 9, 130, 243, 228, 133, 224, 164, 130, 248, 96, 77, 130, 1, 250, + 36, 228, 199, 130, 1, 250, 36, 204, 130, 1, 250, 36, 223, 82, 130, 1, + 250, 36, 150, 130, 1, 250, 36, 232, 214, 130, 1, 250, 36, 235, 27, 172, + 5, 253, 241, 172, 5, 214, 127, 172, 1, 253, 81, 172, 1, 254, 187, 172, 1, + 254, 128, 172, 1, 254, 143, 172, 1, 235, 149, 172, 1, 236, 27, 172, 1, + 215, 84, 172, 1, 215, 86, 172, 1, 235, 171, 172, 1, 235, 172, 172, 1, + 236, 13, 172, 1, 236, 15, 172, 1, 244, 241, 172, 1, 245, 161, 172, 1, + 254, 96, 172, 1, 226, 232, 172, 1, 227, 43, 172, 1, 253, 94, 172, 1, 254, + 55, 234, 193, 172, 1, 232, 14, 234, 193, 172, 1, 254, 55, 243, 58, 172, + 1, 232, 14, 243, 58, 172, 1, 234, 234, 230, 40, 172, 1, 222, 152, 243, + 58, 172, 1, 254, 55, 250, 149, 172, 1, 232, 14, 250, 149, 172, 1, 254, + 55, 235, 128, 172, 1, 232, 14, 235, 128, 172, 1, 218, 46, 230, 40, 172, + 1, 218, 46, 222, 151, 230, 41, 172, 1, 222, 152, 235, 128, 172, 1, 254, + 55, 216, 113, 172, 1, 232, 14, 216, 113, 172, 1, 254, 55, 248, 77, 172, + 1, 232, 14, 248, 77, 172, 1, 230, 124, 230, 2, 172, 1, 222, 152, 248, 77, + 172, 1, 254, 55, 217, 237, 172, 1, 232, 14, 217, 237, 172, 1, 254, 55, + 248, 90, 172, 1, 232, 14, 248, 90, 172, 1, 248, 119, 230, 2, 172, 1, 222, + 152, 248, 90, 172, 1, 254, 55, 226, 102, 172, 1, 232, 14, 226, 102, 172, + 1, 254, 55, 252, 32, 172, 1, 232, 14, 252, 32, 172, 1, 231, 195, 172, 1, + 254, 40, 252, 32, 172, 1, 213, 42, 172, 1, 224, 26, 172, 1, 248, 119, + 233, 91, 172, 1, 214, 234, 172, 1, 218, 46, 222, 128, 172, 1, 230, 124, + 222, 128, 172, 1, 248, 119, 222, 128, 172, 1, 241, 226, 172, 1, 230, 124, + 233, 91, 172, 1, 244, 125, 172, 5, 254, 85, 172, 30, 5, 254, 138, 172, + 30, 5, 234, 161, 254, 145, 172, 30, 5, 247, 180, 254, 145, 172, 30, 5, + 234, 161, 235, 168, 172, 30, 5, 247, 180, 235, 168, 172, 30, 5, 234, 161, + 226, 212, 172, 30, 5, 247, 180, 226, 212, 172, 30, 5, 243, 99, 172, 30, + 5, 234, 24, 172, 30, 5, 247, 180, 234, 24, 172, 30, 5, 234, 26, 248, 18, + 172, 30, 5, 234, 25, 242, 28, 254, 138, 172, 30, 5, 234, 25, 242, 28, + 247, 180, 254, 138, 172, 30, 5, 234, 25, 242, 28, 243, 57, 172, 30, 5, + 243, 57, 172, 30, 5, 247, 180, 243, 99, 172, 30, 5, 247, 180, 243, 57, + 172, 225, 27, 233, 228, 154, 137, 234, 38, 234, 250, 154, 137, 234, 114, + 234, 134, 154, 137, 234, 114, 234, 107, 154, 137, 234, 114, 234, 104, + 154, 137, 234, 114, 234, 111, 154, 137, 234, 114, 224, 46, 154, 137, 229, + 91, 229, 78, 154, 137, 250, 24, 250, 83, 154, 137, 250, 24, 250, 32, 154, + 137, 250, 24, 250, 82, 154, 137, 219, 243, 219, 242, 154, 137, 250, 24, + 250, 20, 154, 137, 212, 236, 212, 243, 154, 137, 247, 100, 250, 89, 154, + 137, 211, 211, 226, 111, 154, 137, 217, 110, 217, 153, 154, 137, 217, + 110, 230, 21, 154, 137, 217, 110, 225, 243, 154, 137, 228, 186, 229, 180, + 154, 137, 247, 100, 248, 19, 154, 137, 211, 211, 218, 6, 154, 137, 217, + 110, 217, 85, 154, 137, 217, 110, 217, 157, 154, 137, 217, 110, 217, 107, + 154, 137, 228, 186, 228, 92, 154, 137, 251, 129, 252, 83, 154, 137, 225, + 151, 225, 174, 154, 137, 225, 254, 225, 245, 154, 137, 244, 13, 244, 164, + 154, 137, 225, 254, 226, 17, 154, 137, 244, 13, 244, 141, 154, 137, 225, + 254, 222, 162, 154, 137, 230, 232, 188, 154, 137, 212, 236, 213, 68, 154, + 137, 223, 113, 223, 50, 154, 137, 223, 51, 154, 137, 232, 209, 232, 235, + 154, 137, 232, 156, 154, 137, 213, 215, 214, 45, 154, 137, 219, 243, 222, + 177, 154, 137, 219, 243, 223, 25, 154, 137, 219, 243, 219, 26, 154, 137, + 241, 55, 241, 145, 154, 137, 232, 209, 250, 5, 154, 137, 157, 254, 24, + 154, 137, 241, 55, 228, 181, 154, 137, 226, 195, 154, 137, 222, 146, 61, + 154, 137, 232, 9, 242, 0, 154, 137, 222, 146, 254, 232, 154, 137, 222, + 146, 254, 45, 154, 137, 222, 146, 72, 154, 137, 222, 146, 236, 28, 154, + 137, 222, 146, 215, 183, 154, 137, 222, 146, 215, 181, 154, 137, 222, + 146, 69, 154, 137, 222, 146, 215, 92, 154, 137, 226, 0, 154, 249, 39, 16, + 252, 84, 154, 137, 222, 146, 74, 154, 137, 222, 146, 254, 148, 154, 137, + 222, 146, 75, 154, 137, 222, 146, 254, 109, 232, 4, 154, 137, 222, 146, + 254, 109, 232, 5, 154, 137, 233, 130, 154, 137, 232, 1, 154, 137, 232, 2, + 154, 137, 232, 9, 245, 137, 154, 137, 232, 9, 217, 109, 154, 137, 232, 9, + 216, 186, 154, 137, 232, 9, 250, 71, 154, 137, 217, 151, 154, 137, 229, + 36, 154, 137, 213, 62, 154, 137, 244, 4, 154, 21, 212, 79, 154, 21, 116, + 154, 21, 109, 154, 21, 166, 154, 21, 163, 154, 21, 180, 154, 21, 189, + 154, 21, 198, 154, 21, 195, 154, 21, 200, 154, 137, 254, 20, 154, 137, + 234, 112, 233, 112, 1, 234, 37, 233, 112, 1, 234, 114, 218, 235, 233, + 112, 1, 234, 114, 218, 13, 233, 112, 1, 229, 90, 233, 112, 1, 249, 175, + 233, 112, 1, 219, 243, 218, 13, 233, 112, 1, 227, 253, 233, 112, 1, 247, + 99, 233, 112, 1, 108, 233, 112, 1, 217, 110, 218, 235, 233, 112, 1, 217, + 110, 218, 13, 233, 112, 1, 228, 185, 233, 112, 1, 251, 128, 233, 112, 1, + 225, 150, 233, 112, 1, 225, 254, 218, 235, 233, 112, 1, 244, 13, 218, 13, + 233, 112, 1, 225, 254, 218, 13, 233, 112, 1, 244, 13, 218, 235, 233, 112, + 1, 230, 231, 233, 112, 1, 212, 235, 233, 112, 1, 232, 209, 232, 235, 233, + 112, 1, 232, 209, 232, 176, 233, 112, 1, 213, 214, 233, 112, 1, 219, 243, + 218, 235, 233, 112, 1, 241, 55, 218, 235, 233, 112, 1, 75, 233, 112, 1, + 241, 55, 218, 13, 233, 112, 245, 120, 233, 112, 30, 5, 61, 233, 112, 30, + 5, 232, 9, 234, 239, 233, 112, 30, 5, 254, 232, 233, 112, 30, 5, 254, 45, + 233, 112, 30, 5, 72, 233, 112, 30, 5, 236, 28, 233, 112, 30, 5, 213, 105, + 233, 112, 30, 5, 212, 161, 233, 112, 30, 5, 69, 233, 112, 30, 5, 215, 92, + 233, 112, 30, 5, 232, 9, 234, 22, 233, 112, 221, 65, 5, 232, 208, 233, + 112, 221, 65, 5, 227, 253, 233, 112, 30, 5, 74, 233, 112, 30, 5, 245, + 152, 233, 112, 30, 5, 75, 233, 112, 30, 5, 253, 83, 233, 112, 30, 5, 254, + 108, 233, 112, 234, 38, 233, 157, 233, 112, 160, 232, 9, 245, 137, 233, + 112, 160, 232, 9, 217, 109, 233, 112, 160, 232, 9, 217, 71, 233, 112, + 160, 232, 9, 250, 155, 233, 112, 250, 192, 77, 233, 112, 229, 45, 233, + 112, 21, 212, 79, 233, 112, 21, 116, 233, 112, 21, 109, 233, 112, 21, + 166, 233, 112, 21, 163, 233, 112, 21, 180, 233, 112, 21, 189, 233, 112, + 21, 198, 233, 112, 21, 195, 233, 112, 21, 200, 233, 112, 241, 55, 228, + 185, 233, 112, 241, 55, 230, 231, 60, 4, 227, 70, 60, 152, 242, 94, 212, + 247, 231, 59, 216, 147, 61, 60, 152, 242, 94, 212, 247, 231, 59, 255, 62, + 223, 117, 251, 253, 188, 60, 152, 242, 94, 212, 247, 231, 59, 255, 62, + 242, 94, 216, 131, 188, 60, 152, 70, 212, 247, 231, 59, 231, 158, 188, + 60, 152, 249, 189, 212, 247, 231, 59, 221, 30, 188, 60, 152, 250, 171, + 212, 247, 231, 59, 225, 244, 221, 18, 188, 60, 152, 212, 247, 231, 59, + 216, 131, 221, 18, 188, 60, 152, 222, 126, 221, 17, 60, 152, 251, 57, + 212, 247, 231, 58, 60, 152, 251, 146, 220, 183, 212, 247, 231, 58, 60, + 152, 235, 194, 216, 130, 60, 152, 248, 12, 216, 131, 251, 56, 60, 152, + 221, 17, 60, 152, 228, 2, 221, 17, 60, 152, 216, 131, 221, 17, 60, 152, + 228, 2, 216, 131, 221, 17, 60, 152, 223, 133, 250, 59, 219, 168, 221, 17, + 60, 152, 223, 195, 242, 122, 221, 17, 60, 152, 250, 171, 255, 66, 223, + 55, 231, 157, 184, 250, 195, 60, 152, 242, 94, 216, 130, 60, 232, 197, 5, + 250, 90, 223, 54, 60, 232, 197, 5, 233, 23, 223, 54, 60, 253, 128, 5, + 221, 27, 243, 41, 255, 67, 223, 54, 60, 253, 128, 5, 255, 64, 193, 60, + 253, 128, 5, 222, 101, 216, 126, 60, 5, 224, 23, 247, 111, 243, 40, 60, + 5, 224, 23, 247, 111, 242, 152, 60, 5, 224, 23, 247, 111, 242, 95, 60, 5, + 224, 23, 230, 37, 243, 40, 60, 5, 224, 23, 230, 37, 242, 152, 60, 5, 224, + 23, 247, 111, 224, 23, 230, 36, 60, 21, 212, 79, 60, 21, 116, 60, 21, + 109, 60, 21, 166, 60, 21, 163, 60, 21, 180, 60, 21, 189, 60, 21, 198, 60, + 21, 195, 60, 21, 200, 60, 21, 151, 116, 60, 21, 151, 109, 60, 21, 151, + 166, 60, 21, 151, 163, 60, 21, 151, 180, 60, 21, 151, 189, 60, 21, 151, + 198, 60, 21, 151, 195, 60, 21, 151, 200, 60, 21, 151, 212, 79, 60, 152, + 251, 59, 223, 54, 60, 152, 229, 151, 250, 254, 228, 11, 212, 18, 60, 152, + 250, 171, 255, 66, 223, 55, 250, 255, 231, 15, 250, 195, 60, 152, 229, + 151, 250, 254, 221, 28, 223, 54, 60, 152, 250, 68, 231, 58, 60, 152, 216, + 142, 255, 63, 60, 152, 242, 81, 223, 55, 242, 44, 60, 152, 242, 81, 223, + 55, 242, 50, 60, 152, 254, 25, 234, 129, 242, 44, 60, 152, 254, 25, 234, + 129, 242, 50, 60, 5, 213, 55, 216, 129, 60, 5, 231, 230, 216, 129, 60, 1, + 181, 60, 1, 234, 138, 60, 1, 243, 110, 60, 1, 242, 225, 60, 1, 229, 159, + 60, 1, 250, 219, 60, 1, 250, 92, 60, 1, 235, 139, 60, 1, 228, 23, 60, 1, + 216, 115, 60, 1, 216, 105, 60, 1, 248, 86, 60, 1, 248, 70, 60, 1, 228, + 198, 60, 1, 218, 52, 60, 1, 217, 161, 60, 1, 248, 164, 60, 1, 247, 232, + 60, 1, 205, 60, 1, 193, 60, 1, 226, 23, 60, 1, 252, 107, 60, 1, 251, 195, + 60, 1, 188, 60, 1, 216, 141, 60, 1, 216, 133, 60, 1, 245, 249, 60, 1, + 245, 244, 60, 1, 214, 49, 60, 1, 212, 75, 60, 1, 212, 109, 60, 1, 255, + 69, 60, 1, 186, 60, 1, 203, 60, 1, 233, 157, 60, 1, 221, 24, 60, 1, 219, + 157, 60, 1, 222, 202, 60, 1, 159, 60, 1, 61, 60, 1, 233, 241, 60, 1, 244, + 46, 203, 60, 1, 234, 55, 60, 1, 223, 81, 60, 30, 5, 254, 232, 60, 30, 5, + 72, 60, 30, 5, 236, 28, 60, 30, 5, 69, 60, 30, 5, 215, 92, 60, 30, 5, + 161, 149, 60, 30, 5, 161, 223, 82, 60, 30, 5, 161, 150, 60, 30, 5, 161, + 232, 214, 60, 30, 5, 74, 60, 30, 5, 245, 165, 60, 30, 5, 75, 60, 30, 5, + 227, 49, 60, 5, 223, 118, 219, 28, 229, 160, 223, 112, 60, 5, 223, 117, + 251, 252, 60, 30, 5, 223, 202, 72, 60, 30, 5, 223, 202, 236, 28, 60, 5, + 228, 11, 212, 19, 230, 44, 248, 164, 60, 5, 219, 255, 233, 84, 60, 152, + 242, 11, 60, 152, 226, 184, 60, 5, 233, 87, 223, 54, 60, 5, 213, 59, 223, + 54, 60, 5, 233, 88, 216, 142, 250, 195, 60, 5, 231, 159, 250, 195, 60, 5, + 242, 97, 250, 196, 223, 193, 60, 5, 242, 97, 231, 150, 223, 193, 60, 5, + 235, 191, 231, 159, 250, 195, 60, 219, 18, 5, 233, 88, 216, 142, 250, + 195, 60, 219, 18, 5, 231, 159, 250, 195, 60, 219, 18, 5, 235, 191, 231, + 159, 250, 195, 60, 219, 18, 1, 181, 60, 219, 18, 1, 234, 138, 60, 219, + 18, 1, 243, 110, 60, 219, 18, 1, 242, 225, 60, 219, 18, 1, 229, 159, 60, + 219, 18, 1, 250, 219, 60, 219, 18, 1, 250, 92, 60, 219, 18, 1, 235, 139, + 60, 219, 18, 1, 228, 23, 60, 219, 18, 1, 216, 115, 60, 219, 18, 1, 216, + 105, 60, 219, 18, 1, 248, 86, 60, 219, 18, 1, 248, 70, 60, 219, 18, 1, + 228, 198, 60, 219, 18, 1, 218, 52, 60, 219, 18, 1, 217, 161, 60, 219, 18, + 1, 248, 164, 60, 219, 18, 1, 247, 232, 60, 219, 18, 1, 205, 60, 219, 18, + 1, 193, 60, 219, 18, 1, 226, 23, 60, 219, 18, 1, 252, 107, 60, 219, 18, + 1, 251, 195, 60, 219, 18, 1, 188, 60, 219, 18, 1, 216, 141, 60, 219, 18, + 1, 216, 133, 60, 219, 18, 1, 245, 249, 60, 219, 18, 1, 245, 244, 60, 219, + 18, 1, 214, 49, 60, 219, 18, 1, 212, 75, 60, 219, 18, 1, 212, 109, 60, + 219, 18, 1, 255, 69, 60, 219, 18, 1, 186, 60, 219, 18, 1, 203, 60, 219, + 18, 1, 233, 157, 60, 219, 18, 1, 221, 24, 60, 219, 18, 1, 219, 157, 60, + 219, 18, 1, 222, 202, 60, 219, 18, 1, 159, 60, 219, 18, 1, 61, 60, 219, + 18, 1, 233, 241, 60, 219, 18, 1, 244, 46, 214, 49, 60, 219, 18, 1, 244, + 46, 186, 60, 219, 18, 1, 244, 46, 203, 60, 233, 239, 223, 52, 234, 138, + 60, 233, 239, 223, 52, 234, 139, 250, 255, 231, 15, 250, 195, 60, 250, + 184, 5, 107, 251, 246, 60, 250, 184, 5, 177, 251, 246, 60, 250, 184, 5, + 250, 185, 217, 228, 60, 250, 184, 5, 222, 125, 255, 68, 60, 16, 246, 46, + 251, 54, 60, 16, 224, 22, 223, 119, 60, 16, 226, 202, 243, 39, 60, 16, + 224, 22, 223, 120, 223, 195, 242, 121, 60, 16, 225, 244, 193, 60, 16, + 228, 170, 251, 54, 60, 16, 228, 170, 251, 55, 228, 2, 255, 65, 60, 16, + 228, 170, 251, 55, 242, 96, 255, 65, 60, 16, 228, 170, 251, 55, 250, 255, + 255, 65, 60, 5, 224, 23, 230, 37, 224, 23, 247, 110, 60, 5, 224, 23, 230, + 37, 242, 95, 60, 152, 251, 58, 220, 183, 242, 191, 231, 59, 223, 194, 60, + 152, 230, 233, 212, 247, 242, 191, 231, 59, 223, 194, 60, 152, 228, 2, + 216, 130, 60, 152, 70, 251, 79, 223, 114, 212, 247, 231, 59, 231, 158, + 188, 60, 152, 249, 189, 251, 79, 223, 114, 212, 247, 231, 59, 221, 30, + 188, 223, 147, 218, 200, 52, 233, 69, 218, 200, 52, 223, 147, 218, 200, + 5, 2, 247, 72, 233, 69, 218, 200, 5, 2, 247, 72, 60, 152, 233, 79, 231, + 160, 223, 54, 60, 152, 216, 207, 231, 160, 223, 54, 64, 1, 181, 64, 1, + 234, 138, 64, 1, 243, 110, 64, 1, 242, 225, 64, 1, 229, 159, 64, 1, 250, + 219, 64, 1, 250, 92, 64, 1, 235, 139, 64, 1, 235, 115, 64, 1, 228, 23, + 64, 1, 228, 187, 64, 1, 216, 115, 64, 1, 216, 105, 64, 1, 248, 86, 64, 1, + 248, 70, 64, 1, 228, 198, 64, 1, 218, 52, 64, 1, 217, 161, 64, 1, 248, + 164, 64, 1, 247, 232, 64, 1, 205, 64, 1, 193, 64, 1, 226, 23, 64, 1, 252, + 107, 64, 1, 251, 195, 64, 1, 188, 64, 1, 186, 64, 1, 203, 64, 1, 233, + 157, 64, 1, 214, 49, 64, 1, 222, 202, 64, 1, 159, 64, 1, 232, 213, 64, 1, + 61, 64, 1, 221, 9, 61, 64, 1, 72, 64, 1, 236, 28, 64, 1, 69, 64, 1, 215, + 92, 64, 1, 74, 64, 1, 230, 221, 74, 64, 1, 75, 64, 1, 253, 108, 64, 30, + 5, 218, 15, 254, 232, 64, 30, 5, 254, 232, 64, 30, 5, 72, 64, 30, 5, 236, + 28, 64, 30, 5, 69, 64, 30, 5, 215, 92, 64, 30, 5, 74, 64, 30, 5, 254, + 108, 64, 30, 5, 230, 221, 236, 28, 64, 30, 5, 230, 221, 75, 64, 30, 5, + 191, 49, 64, 5, 253, 242, 64, 5, 62, 55, 64, 5, 214, 128, 64, 5, 214, + 133, 64, 5, 253, 150, 64, 249, 133, 5, 138, 186, 64, 249, 133, 5, 138, + 203, 64, 249, 133, 5, 138, 214, 49, 64, 249, 133, 5, 138, 159, 64, 1, + 242, 109, 222, 202, 64, 21, 212, 79, 64, 21, 116, 64, 21, 109, 64, 21, + 166, 64, 21, 163, 64, 21, 180, 64, 21, 189, 64, 21, 198, 64, 21, 195, 64, + 21, 200, 64, 5, 232, 221, 222, 91, 64, 5, 222, 91, 64, 16, 232, 205, 64, + 16, 249, 152, 64, 16, 254, 125, 64, 16, 243, 24, 64, 1, 221, 24, 64, 1, + 219, 157, 64, 1, 161, 149, 64, 1, 161, 223, 82, 64, 1, 161, 150, 64, 1, + 161, 232, 214, 64, 30, 5, 161, 149, 64, 30, 5, 161, 223, 82, 64, 30, 5, + 161, 150, 64, 30, 5, 161, 232, 214, 64, 1, 230, 221, 229, 159, 64, 1, + 230, 221, 235, 115, 64, 1, 230, 221, 252, 31, 64, 1, 230, 221, 252, 26, + 64, 249, 133, 5, 230, 221, 138, 205, 64, 249, 133, 5, 230, 221, 138, 188, + 64, 249, 133, 5, 230, 221, 138, 233, 157, 64, 1, 221, 29, 234, 218, 221, + 24, 64, 30, 5, 221, 29, 234, 218, 245, 22, 64, 160, 152, 221, 29, 234, + 218, 241, 230, 64, 160, 152, 221, 29, 234, 218, 234, 189, 225, 253, 64, + 1, 213, 248, 224, 252, 234, 218, 217, 161, 64, 1, 213, 248, 224, 252, + 234, 218, 225, 2, 64, 30, 5, 213, 248, 224, 252, 234, 218, 245, 22, 64, + 30, 5, 213, 248, 224, 252, 234, 218, 215, 183, 64, 5, 213, 248, 224, 252, + 234, 218, 216, 240, 64, 5, 213, 248, 224, 252, 234, 218, 216, 239, 64, 5, + 213, 248, 224, 252, 234, 218, 216, 238, 64, 5, 213, 248, 224, 252, 234, + 218, 216, 237, 64, 5, 213, 248, 224, 252, 234, 218, 216, 236, 64, 1, 245, + 175, 224, 252, 234, 218, 228, 198, 64, 1, 245, 175, 224, 252, 234, 218, + 212, 168, 64, 1, 245, 175, 224, 252, 234, 218, 242, 193, 64, 30, 5, 243, + 35, 234, 218, 72, 64, 30, 5, 234, 194, 227, 99, 64, 30, 5, 234, 194, 69, + 64, 30, 5, 234, 194, 245, 165, 64, 1, 221, 9, 181, 64, 1, 221, 9, 234, + 138, 64, 1, 221, 9, 243, 110, 64, 1, 221, 9, 250, 219, 64, 1, 221, 9, + 212, 109, 64, 1, 221, 9, 228, 23, 64, 1, 221, 9, 248, 164, 64, 1, 221, 9, + 205, 64, 1, 221, 9, 226, 23, 64, 1, 221, 9, 244, 164, 64, 1, 221, 9, 252, + 107, 64, 1, 221, 9, 217, 161, 64, 1, 221, 9, 159, 64, 249, 133, 5, 221, + 9, 138, 214, 49, 64, 30, 5, 221, 9, 254, 232, 64, 30, 5, 221, 9, 74, 64, + 30, 5, 221, 9, 191, 49, 64, 30, 5, 221, 9, 40, 213, 105, 64, 5, 221, 9, + 216, 239, 64, 5, 221, 9, 216, 238, 64, 5, 221, 9, 216, 236, 64, 5, 221, + 9, 216, 235, 64, 5, 221, 9, 249, 91, 216, 239, 64, 5, 221, 9, 249, 91, + 216, 238, 64, 5, 221, 9, 249, 91, 245, 111, 216, 241, 64, 1, 223, 39, + 226, 190, 244, 164, 64, 5, 223, 39, 226, 190, 216, 236, 64, 221, 9, 21, + 212, 79, 64, 221, 9, 21, 116, 64, 221, 9, 21, 109, 64, 221, 9, 21, 166, + 64, 221, 9, 21, 163, 64, 221, 9, 21, 180, 64, 221, 9, 21, 189, 64, 221, + 9, 21, 198, 64, 221, 9, 21, 195, 64, 221, 9, 21, 200, 64, 5, 234, 132, + 216, 240, 64, 5, 234, 132, 216, 238, 64, 30, 5, 254, 98, 61, 64, 30, 5, + 254, 98, 254, 108, 64, 16, 221, 9, 116, 64, 16, 221, 9, 244, 253, 100, 6, + 1, 254, 32, 100, 6, 1, 252, 71, 100, 6, 1, 243, 82, 100, 6, 1, 247, 82, + 100, 6, 1, 245, 108, 100, 6, 1, 214, 141, 100, 6, 1, 212, 82, 100, 6, 1, + 218, 11, 100, 6, 1, 235, 251, 100, 6, 1, 234, 239, 100, 6, 1, 233, 104, + 100, 6, 1, 231, 248, 100, 6, 1, 230, 15, 100, 6, 1, 227, 62, 100, 6, 1, + 226, 145, 100, 6, 1, 212, 71, 100, 6, 1, 224, 61, 100, 6, 1, 222, 159, + 100, 6, 1, 218, 1, 100, 6, 1, 215, 160, 100, 6, 1, 226, 16, 100, 6, 1, + 234, 127, 100, 6, 1, 242, 217, 100, 6, 1, 224, 217, 100, 6, 1, 220, 200, + 100, 6, 1, 250, 34, 100, 6, 1, 250, 195, 100, 6, 1, 235, 103, 100, 6, 1, + 249, 233, 100, 6, 1, 250, 79, 100, 6, 1, 213, 151, 100, 6, 1, 235, 113, + 100, 6, 1, 242, 24, 100, 6, 1, 241, 222, 100, 6, 1, 241, 160, 100, 6, 1, + 214, 6, 100, 6, 1, 241, 243, 100, 6, 1, 241, 51, 100, 1, 254, 32, 100, 1, + 252, 71, 100, 1, 243, 82, 100, 1, 247, 82, 100, 1, 245, 108, 100, 1, 214, + 141, 100, 1, 212, 82, 100, 1, 218, 11, 100, 1, 235, 251, 100, 1, 234, + 239, 100, 1, 233, 104, 100, 1, 231, 248, 100, 1, 230, 15, 100, 1, 227, + 62, 100, 1, 226, 145, 100, 1, 212, 71, 100, 1, 224, 61, 100, 1, 222, 159, + 100, 1, 218, 1, 100, 1, 215, 160, 100, 1, 226, 16, 100, 1, 234, 127, 100, + 1, 242, 217, 100, 1, 224, 217, 100, 1, 220, 200, 100, 1, 250, 34, 100, 1, + 250, 195, 100, 1, 235, 103, 100, 1, 249, 233, 100, 1, 250, 79, 100, 1, + 213, 151, 100, 1, 235, 113, 100, 1, 242, 24, 100, 1, 241, 222, 100, 1, + 241, 160, 100, 1, 214, 6, 100, 1, 241, 243, 100, 1, 241, 51, 100, 1, 244, + 90, 100, 1, 212, 237, 100, 1, 245, 122, 100, 1, 216, 58, 243, 82, 100, 1, + 254, 103, 100, 226, 143, 221, 57, 59, 1, 100, 230, 15, 23, 97, 234, 67, + 23, 97, 219, 150, 23, 97, 229, 57, 23, 97, 217, 55, 23, 97, 219, 139, 23, + 97, 223, 179, 23, 97, 231, 30, 23, 97, 225, 227, 23, 97, 219, 147, 23, + 97, 220, 76, 23, 97, 219, 144, 23, 97, 236, 51, 23, 97, 249, 239, 23, 97, + 219, 154, 23, 97, 250, 43, 23, 97, 234, 116, 23, 97, 217, 126, 23, 97, + 226, 7, 23, 97, 241, 158, 23, 97, 229, 53, 23, 97, 219, 148, 23, 97, 229, + 47, 23, 97, 229, 51, 23, 97, 217, 52, 23, 97, 223, 167, 23, 97, 219, 146, + 23, 97, 223, 177, 23, 97, 234, 223, 23, 97, 231, 23, 23, 97, 234, 226, + 23, 97, 225, 222, 23, 97, 225, 220, 23, 97, 225, 208, 23, 97, 225, 216, + 23, 97, 225, 214, 23, 97, 225, 211, 23, 97, 225, 213, 23, 97, 225, 210, + 23, 97, 225, 215, 23, 97, 225, 225, 23, 97, 225, 226, 23, 97, 225, 209, + 23, 97, 225, 219, 23, 97, 234, 224, 23, 97, 234, 222, 23, 97, 220, 69, + 23, 97, 220, 67, 23, 97, 220, 59, 23, 97, 220, 62, 23, 97, 220, 68, 23, + 97, 220, 64, 23, 97, 220, 63, 23, 97, 220, 61, 23, 97, 220, 72, 23, 97, + 220, 74, 23, 97, 220, 75, 23, 97, 220, 70, 23, 97, 220, 60, 23, 97, 220, + 65, 23, 97, 220, 73, 23, 97, 250, 27, 23, 97, 250, 25, 23, 97, 250, 102, + 23, 97, 250, 100, 23, 97, 226, 160, 23, 97, 236, 46, 23, 97, 236, 37, 23, + 97, 236, 45, 23, 97, 236, 42, 23, 97, 236, 40, 23, 97, 236, 44, 23, 97, + 219, 151, 23, 97, 236, 49, 23, 97, 236, 50, 23, 97, 236, 38, 23, 97, 236, + 43, 23, 97, 213, 17, 23, 97, 249, 238, 23, 97, 250, 28, 23, 97, 250, 26, + 23, 97, 250, 103, 23, 97, 250, 101, 23, 97, 250, 41, 23, 97, 250, 42, 23, + 97, 250, 29, 23, 97, 250, 104, 23, 97, 226, 5, 23, 97, 234, 225, 23, 97, + 219, 152, 23, 97, 213, 23, 23, 97, 234, 58, 23, 97, 229, 49, 23, 97, 229, + 55, 23, 97, 229, 54, 23, 97, 217, 49, 23, 97, 244, 72, 23, 135, 244, 72, + 23, 135, 61, 23, 135, 254, 148, 23, 135, 186, 23, 135, 213, 80, 23, 135, + 245, 76, 23, 135, 74, 23, 135, 213, 27, 23, 135, 213, 38, 23, 135, 75, + 23, 135, 214, 49, 23, 135, 214, 46, 23, 135, 227, 99, 23, 135, 212, 235, + 23, 135, 69, 23, 135, 213, 252, 23, 135, 214, 6, 23, 135, 213, 235, 23, + 135, 212, 203, 23, 135, 245, 22, 23, 135, 212, 255, 23, 135, 72, 23, 135, + 255, 60, 23, 135, 255, 59, 23, 135, 213, 94, 23, 135, 213, 92, 23, 135, + 245, 74, 23, 135, 245, 73, 23, 135, 245, 75, 23, 135, 213, 26, 23, 135, + 213, 25, 23, 135, 227, 204, 23, 135, 227, 205, 23, 135, 227, 198, 23, + 135, 227, 203, 23, 135, 227, 201, 23, 135, 212, 229, 23, 135, 212, 228, + 23, 135, 212, 227, 23, 135, 212, 230, 23, 135, 212, 231, 23, 135, 215, + 252, 23, 135, 215, 251, 23, 135, 215, 250, 23, 135, 215, 247, 23, 135, + 215, 248, 23, 135, 212, 202, 23, 135, 212, 199, 23, 135, 212, 200, 23, + 135, 212, 194, 23, 135, 212, 195, 23, 135, 212, 196, 23, 135, 212, 198, + 23, 135, 245, 16, 23, 135, 245, 18, 23, 135, 212, 254, 23, 135, 240, 145, + 23, 135, 240, 137, 23, 135, 240, 140, 23, 135, 240, 138, 23, 135, 240, + 142, 23, 135, 240, 144, 23, 135, 253, 204, 23, 135, 253, 201, 23, 135, + 253, 199, 23, 135, 253, 200, 23, 135, 219, 155, 23, 135, 255, 61, 23, + 135, 213, 93, 23, 135, 213, 24, 23, 135, 227, 200, 23, 135, 227, 199, 23, + 89, 234, 67, 23, 89, 219, 150, 23, 89, 234, 60, 23, 89, 229, 57, 23, 89, + 229, 55, 23, 89, 229, 54, 23, 89, 217, 55, 23, 89, 223, 179, 23, 89, 223, + 174, 23, 89, 223, 171, 23, 89, 223, 164, 23, 89, 223, 159, 23, 89, 223, + 154, 23, 89, 223, 165, 23, 89, 223, 177, 23, 89, 231, 30, 23, 89, 225, + 227, 23, 89, 225, 216, 23, 89, 220, 76, 23, 89, 219, 144, 23, 89, 236, + 51, 23, 89, 249, 239, 23, 89, 250, 43, 23, 89, 234, 116, 23, 89, 217, + 126, 23, 89, 226, 7, 23, 89, 241, 158, 23, 89, 234, 61, 23, 89, 234, 59, + 23, 89, 229, 53, 23, 89, 229, 47, 23, 89, 229, 49, 23, 89, 229, 52, 23, + 89, 229, 48, 23, 89, 217, 52, 23, 89, 217, 49, 23, 89, 223, 172, 23, 89, + 223, 167, 23, 89, 223, 153, 23, 89, 223, 152, 23, 89, 219, 146, 23, 89, + 223, 169, 23, 89, 223, 168, 23, 89, 223, 161, 23, 89, 223, 163, 23, 89, + 223, 176, 23, 89, 223, 156, 23, 89, 223, 166, 23, 89, 223, 175, 23, 89, + 223, 151, 23, 89, 231, 26, 23, 89, 231, 21, 23, 89, 231, 23, 23, 89, 231, + 20, 23, 89, 231, 18, 23, 89, 231, 24, 23, 89, 231, 29, 23, 89, 231, 27, + 23, 89, 234, 226, 23, 89, 225, 218, 23, 89, 225, 219, 23, 89, 225, 224, + 23, 89, 234, 224, 23, 89, 220, 69, 23, 89, 220, 59, 23, 89, 220, 62, 23, + 89, 220, 64, 23, 89, 226, 160, 23, 89, 236, 46, 23, 89, 236, 39, 23, 89, + 219, 151, 23, 89, 236, 47, 23, 89, 213, 17, 23, 89, 213, 13, 23, 89, 213, + 14, 23, 89, 226, 5, 23, 89, 234, 225, 23, 89, 241, 156, 23, 89, 241, 154, + 23, 89, 241, 157, 23, 89, 241, 155, 23, 89, 213, 23, 23, 89, 234, 63, 23, + 89, 234, 62, 23, 89, 234, 66, 23, 89, 234, 64, 23, 89, 234, 65, 23, 89, + 219, 148, 28, 4, 159, 28, 4, 240, 212, 28, 4, 241, 165, 28, 4, 242, 27, + 28, 4, 241, 204, 28, 4, 241, 222, 28, 4, 241, 54, 28, 4, 241, 53, 28, 4, + 233, 157, 28, 4, 232, 156, 28, 4, 233, 13, 28, 4, 233, 156, 28, 4, 233, + 74, 28, 4, 233, 82, 28, 4, 232, 208, 28, 4, 232, 129, 28, 4, 241, 174, + 28, 4, 241, 168, 28, 4, 241, 170, 28, 4, 241, 173, 28, 4, 241, 171, 28, + 4, 241, 172, 28, 4, 241, 169, 28, 4, 241, 167, 28, 4, 188, 28, 4, 230, + 172, 28, 4, 231, 42, 28, 4, 232, 41, 28, 4, 231, 145, 28, 4, 231, 156, + 28, 4, 230, 231, 28, 4, 230, 114, 28, 4, 218, 110, 28, 4, 218, 104, 28, + 4, 218, 106, 28, 4, 218, 109, 28, 4, 218, 107, 28, 4, 218, 108, 28, 4, + 218, 105, 28, 4, 218, 103, 28, 4, 203, 28, 4, 223, 51, 28, 4, 223, 188, + 28, 4, 224, 74, 28, 4, 224, 1, 28, 4, 224, 21, 28, 4, 223, 112, 28, 4, + 223, 21, 28, 4, 222, 202, 28, 4, 219, 27, 28, 4, 220, 117, 28, 4, 222, + 200, 28, 4, 222, 89, 28, 4, 222, 100, 28, 4, 219, 242, 28, 4, 218, 198, + 28, 4, 221, 24, 28, 4, 220, 150, 28, 4, 220, 212, 28, 4, 221, 20, 28, 4, + 220, 241, 28, 4, 220, 243, 28, 4, 220, 187, 28, 4, 220, 134, 28, 4, 224, + 232, 28, 4, 224, 175, 28, 4, 224, 198, 28, 4, 224, 231, 28, 4, 224, 212, + 28, 4, 224, 213, 28, 4, 224, 187, 28, 4, 224, 186, 28, 4, 224, 131, 28, + 4, 224, 127, 28, 4, 224, 130, 28, 4, 224, 128, 28, 4, 224, 129, 28, 4, + 224, 210, 28, 4, 224, 204, 28, 4, 224, 206, 28, 4, 224, 209, 28, 4, 224, + 207, 28, 4, 224, 208, 28, 4, 224, 205, 28, 4, 224, 203, 28, 4, 224, 199, + 28, 4, 224, 202, 28, 4, 224, 200, 28, 4, 224, 201, 28, 4, 252, 107, 28, + 4, 251, 54, 28, 4, 251, 184, 28, 4, 252, 106, 28, 4, 251, 242, 28, 4, + 251, 251, 28, 4, 251, 128, 28, 4, 251, 12, 28, 4, 215, 1, 28, 4, 214, 99, + 28, 4, 214, 154, 28, 4, 215, 0, 28, 4, 214, 227, 28, 4, 214, 232, 28, 4, + 214, 119, 28, 4, 214, 91, 28, 4, 218, 52, 28, 4, 216, 82, 28, 4, 217, 71, + 28, 4, 218, 49, 28, 4, 217, 219, 28, 4, 217, 229, 28, 4, 108, 28, 4, 216, + 45, 28, 4, 250, 219, 28, 4, 249, 53, 28, 4, 249, 244, 28, 4, 250, 218, + 28, 4, 250, 116, 28, 4, 250, 124, 28, 4, 249, 175, 28, 4, 249, 24, 28, 4, + 213, 153, 28, 4, 213, 129, 28, 4, 213, 145, 28, 4, 213, 152, 28, 4, 213, + 149, 28, 4, 213, 150, 28, 4, 213, 136, 28, 4, 213, 135, 28, 4, 213, 124, + 28, 4, 213, 120, 28, 4, 213, 123, 28, 4, 213, 121, 28, 4, 213, 122, 28, + 4, 205, 28, 4, 228, 92, 28, 4, 229, 64, 28, 4, 230, 43, 28, 4, 229, 184, + 28, 4, 229, 187, 28, 4, 228, 185, 28, 4, 228, 31, 28, 4, 228, 23, 28, 4, + 227, 247, 28, 4, 228, 10, 28, 4, 228, 22, 28, 4, 228, 16, 28, 4, 228, 17, + 28, 4, 227, 253, 28, 4, 227, 239, 28, 4, 242, 156, 61, 28, 4, 242, 156, + 69, 28, 4, 242, 156, 72, 28, 4, 242, 156, 254, 232, 28, 4, 242, 156, 245, + 165, 28, 4, 242, 156, 74, 28, 4, 242, 156, 75, 28, 4, 242, 156, 214, 49, + 28, 4, 181, 28, 4, 233, 238, 28, 4, 234, 101, 28, 4, 235, 14, 28, 4, 234, + 187, 28, 4, 234, 188, 28, 4, 234, 37, 28, 4, 234, 36, 28, 4, 233, 204, + 28, 4, 233, 198, 28, 4, 233, 203, 28, 4, 233, 199, 28, 4, 233, 200, 28, + 4, 233, 193, 28, 4, 233, 187, 28, 4, 233, 189, 28, 4, 233, 192, 28, 4, + 233, 190, 28, 4, 233, 191, 28, 4, 233, 188, 28, 4, 233, 186, 28, 4, 233, + 182, 28, 4, 233, 185, 28, 4, 233, 183, 28, 4, 233, 184, 28, 4, 214, 49, + 28, 4, 213, 183, 28, 4, 213, 235, 28, 4, 214, 48, 28, 4, 214, 1, 28, 4, + 214, 6, 28, 4, 213, 214, 28, 4, 213, 213, 28, 4, 226, 15, 61, 28, 4, 226, + 15, 69, 28, 4, 226, 15, 72, 28, 4, 226, 15, 254, 232, 28, 4, 226, 15, + 245, 165, 28, 4, 226, 15, 74, 28, 4, 226, 15, 75, 28, 4, 212, 109, 28, 4, + 212, 8, 28, 4, 212, 37, 28, 4, 212, 108, 28, 4, 212, 85, 28, 4, 212, 87, + 28, 4, 212, 16, 28, 4, 211, 251, 28, 4, 212, 75, 28, 4, 212, 55, 28, 4, + 212, 62, 28, 4, 212, 74, 28, 4, 212, 66, 28, 4, 212, 67, 28, 4, 212, 60, + 28, 4, 212, 46, 28, 4, 186, 28, 4, 212, 203, 28, 4, 212, 255, 28, 4, 213, + 91, 28, 4, 213, 35, 28, 4, 213, 38, 28, 4, 212, 235, 28, 4, 212, 226, 28, + 4, 248, 164, 28, 4, 246, 33, 28, 4, 247, 211, 28, 4, 248, 163, 28, 4, + 248, 28, 28, 4, 248, 41, 28, 4, 247, 99, 28, 4, 246, 2, 28, 4, 248, 86, + 28, 4, 248, 51, 28, 4, 248, 63, 28, 4, 248, 85, 28, 4, 248, 73, 28, 4, + 248, 74, 28, 4, 248, 56, 28, 4, 248, 42, 28, 4, 235, 139, 28, 4, 235, 54, + 28, 4, 235, 110, 28, 4, 235, 138, 28, 4, 235, 125, 28, 4, 235, 127, 28, + 4, 235, 71, 28, 4, 235, 35, 28, 4, 243, 110, 28, 4, 242, 92, 28, 4, 242, + 190, 28, 4, 243, 107, 28, 4, 243, 31, 28, 4, 243, 38, 28, 4, 242, 150, + 28, 4, 242, 149, 28, 4, 242, 59, 28, 4, 242, 55, 28, 4, 242, 58, 28, 4, + 242, 56, 28, 4, 242, 57, 28, 4, 243, 5, 28, 4, 242, 241, 28, 4, 242, 251, + 28, 4, 243, 4, 28, 4, 242, 255, 28, 4, 243, 0, 28, 4, 242, 245, 28, 4, + 242, 230, 28, 4, 217, 161, 28, 4, 217, 90, 28, 4, 217, 128, 28, 4, 217, + 160, 28, 4, 217, 147, 28, 4, 217, 148, 28, 4, 217, 109, 28, 4, 217, 82, + 28, 4, 250, 92, 28, 4, 250, 6, 28, 4, 250, 47, 28, 4, 250, 91, 28, 4, + 250, 64, 28, 4, 250, 67, 28, 4, 250, 23, 28, 4, 249, 251, 28, 4, 226, 23, + 28, 4, 225, 246, 28, 4, 226, 9, 28, 4, 226, 22, 28, 4, 226, 11, 28, 4, + 226, 12, 28, 4, 225, 253, 28, 4, 225, 242, 28, 4, 216, 141, 28, 4, 216, + 122, 28, 4, 216, 125, 28, 4, 216, 140, 28, 4, 216, 135, 28, 4, 216, 136, + 28, 4, 216, 124, 28, 4, 216, 120, 28, 4, 216, 5, 28, 4, 215, 253, 28, 4, + 216, 1, 28, 4, 216, 4, 28, 4, 216, 2, 28, 4, 216, 3, 28, 4, 215, 255, 28, + 4, 215, 254, 28, 4, 244, 164, 28, 4, 243, 205, 28, 4, 244, 90, 28, 4, + 244, 163, 28, 4, 244, 116, 28, 4, 244, 123, 28, 4, 244, 12, 28, 4, 243, + 188, 28, 4, 193, 28, 4, 225, 35, 28, 4, 225, 240, 28, 4, 226, 213, 28, 4, + 226, 86, 28, 4, 226, 96, 28, 4, 225, 150, 28, 4, 225, 2, 28, 4, 223, 11, + 28, 4, 230, 103, 28, 4, 243, 182, 28, 37, 243, 29, 24, 30, 233, 47, 77, + 28, 37, 30, 233, 47, 77, 28, 37, 243, 29, 77, 28, 222, 92, 77, 28, 213, + 195, 28, 243, 200, 219, 69, 28, 249, 157, 28, 221, 70, 28, 249, 164, 28, + 225, 79, 249, 164, 28, 224, 158, 77, 28, 226, 143, 221, 57, 28, 21, 116, + 28, 21, 109, 28, 21, 166, 28, 21, 163, 28, 21, 180, 28, 21, 189, 28, 21, + 198, 28, 21, 195, 28, 21, 200, 28, 50, 217, 200, 28, 50, 216, 38, 28, 50, + 217, 115, 28, 50, 243, 240, 28, 50, 244, 83, 28, 50, 220, 39, 28, 50, + 221, 37, 28, 50, 245, 141, 28, 50, 229, 26, 28, 50, 240, 200, 28, 50, + 217, 201, 217, 100, 28, 4, 222, 96, 230, 114, 28, 4, 230, 110, 28, 4, + 230, 111, 28, 4, 230, 112, 28, 4, 222, 96, 251, 12, 28, 4, 251, 9, 28, 4, + 251, 10, 28, 4, 251, 11, 28, 4, 222, 96, 243, 188, 28, 4, 243, 184, 28, + 4, 243, 185, 28, 4, 243, 186, 28, 4, 222, 96, 225, 2, 28, 4, 224, 254, + 28, 4, 224, 255, 28, 4, 225, 0, 28, 216, 242, 152, 212, 238, 28, 216, + 242, 152, 247, 248, 28, 216, 242, 152, 223, 135, 28, 216, 242, 152, 220, + 175, 223, 135, 28, 216, 242, 152, 247, 187, 28, 216, 242, 152, 234, 170, + 28, 216, 242, 152, 250, 31, 28, 216, 242, 152, 241, 162, 28, 216, 242, + 152, 247, 247, 28, 216, 242, 152, 233, 215, 158, 1, 61, 158, 1, 74, 158, + 1, 72, 158, 1, 75, 158, 1, 69, 158, 1, 215, 79, 158, 1, 243, 110, 158, 1, + 181, 158, 1, 243, 38, 158, 1, 242, 190, 158, 1, 242, 150, 158, 1, 242, + 92, 158, 1, 242, 60, 158, 1, 159, 158, 1, 241, 222, 158, 1, 241, 165, + 158, 1, 241, 54, 158, 1, 240, 212, 158, 1, 240, 193, 158, 1, 233, 157, + 158, 1, 233, 82, 158, 1, 233, 13, 158, 1, 232, 208, 158, 1, 232, 156, + 158, 1, 232, 130, 158, 1, 188, 158, 1, 231, 156, 158, 1, 231, 42, 158, 1, + 230, 231, 158, 1, 230, 172, 158, 1, 205, 158, 1, 241, 76, 158, 1, 230, + 31, 158, 1, 229, 187, 158, 1, 229, 64, 158, 1, 228, 185, 158, 1, 228, 92, + 158, 1, 228, 33, 158, 1, 224, 174, 158, 1, 224, 161, 158, 1, 224, 154, + 158, 1, 224, 146, 158, 1, 224, 135, 158, 1, 224, 133, 158, 1, 222, 202, + 158, 1, 197, 158, 1, 222, 100, 158, 1, 220, 117, 158, 1, 219, 242, 158, + 1, 219, 27, 158, 1, 218, 203, 158, 1, 248, 164, 158, 1, 218, 52, 158, 1, + 248, 41, 158, 1, 217, 229, 158, 1, 247, 211, 158, 1, 217, 71, 158, 1, + 247, 99, 158, 1, 246, 33, 158, 1, 246, 5, 158, 1, 247, 108, 158, 1, 217, + 12, 158, 1, 217, 11, 158, 1, 217, 1, 158, 1, 217, 0, 158, 1, 216, 255, + 158, 1, 216, 254, 158, 1, 216, 141, 158, 1, 216, 136, 158, 1, 216, 125, + 158, 1, 216, 124, 158, 1, 216, 122, 158, 1, 216, 121, 158, 1, 214, 49, + 158, 1, 214, 6, 158, 1, 213, 235, 158, 1, 213, 214, 158, 1, 213, 183, + 158, 1, 213, 171, 158, 1, 186, 158, 1, 213, 38, 158, 1, 212, 255, 158, 1, + 212, 235, 158, 1, 212, 203, 158, 1, 212, 169, 18, 19, 240, 160, 18, 19, + 74, 18, 19, 254, 196, 18, 19, 72, 18, 19, 236, 28, 18, 19, 75, 18, 19, + 227, 49, 18, 19, 213, 104, 227, 49, 18, 19, 66, 245, 165, 18, 19, 66, 72, + 18, 19, 61, 18, 19, 254, 232, 18, 19, 214, 6, 18, 19, 148, 214, 6, 18, + 19, 213, 235, 18, 19, 148, 213, 235, 18, 19, 213, 227, 18, 19, 148, 213, + 227, 18, 19, 213, 214, 18, 19, 148, 213, 214, 18, 19, 213, 202, 18, 19, + 148, 213, 202, 18, 19, 230, 11, 213, 202, 18, 19, 214, 49, 18, 19, 148, + 214, 49, 18, 19, 214, 48, 18, 19, 148, 214, 48, 18, 19, 230, 11, 214, 48, + 18, 19, 254, 108, 18, 19, 213, 104, 214, 82, 18, 19, 242, 156, 219, 69, + 18, 19, 40, 179, 18, 19, 40, 242, 113, 18, 19, 40, 251, 101, 151, 223, + 130, 18, 19, 40, 216, 227, 151, 223, 130, 18, 19, 40, 46, 151, 223, 130, + 18, 19, 40, 223, 130, 18, 19, 40, 51, 179, 18, 19, 40, 51, 220, 175, 71, + 219, 32, 18, 19, 40, 231, 37, 247, 74, 18, 19, 40, 220, 175, 199, 90, 18, + 19, 40, 225, 156, 18, 19, 40, 119, 218, 36, 18, 19, 245, 108, 18, 19, + 235, 251, 18, 19, 227, 62, 18, 19, 254, 32, 18, 19, 226, 96, 18, 19, 226, + 211, 18, 19, 225, 240, 18, 19, 225, 203, 18, 19, 225, 150, 18, 19, 225, + 129, 18, 19, 213, 104, 225, 129, 18, 19, 66, 241, 204, 18, 19, 66, 241, + 165, 18, 19, 193, 18, 19, 226, 213, 18, 19, 225, 0, 18, 19, 148, 225, 0, + 18, 19, 224, 254, 18, 19, 148, 224, 254, 18, 19, 224, 253, 18, 19, 148, + 224, 253, 18, 19, 224, 251, 18, 19, 148, 224, 251, 18, 19, 224, 250, 18, + 19, 148, 224, 250, 18, 19, 225, 2, 18, 19, 148, 225, 2, 18, 19, 225, 1, + 18, 19, 148, 225, 1, 18, 19, 213, 104, 225, 1, 18, 19, 226, 229, 18, 19, + 148, 226, 229, 18, 19, 66, 242, 41, 18, 19, 217, 229, 18, 19, 218, 47, + 18, 19, 217, 71, 18, 19, 217, 57, 18, 19, 108, 18, 19, 216, 230, 18, 19, + 213, 104, 216, 230, 18, 19, 66, 248, 28, 18, 19, 66, 247, 211, 18, 19, + 218, 52, 18, 19, 218, 49, 18, 19, 216, 43, 18, 19, 148, 216, 43, 18, 19, + 216, 27, 18, 19, 148, 216, 27, 18, 19, 216, 26, 18, 19, 148, 216, 26, 18, + 19, 109, 18, 19, 148, 109, 18, 19, 216, 20, 18, 19, 148, 216, 20, 18, 19, + 216, 45, 18, 19, 148, 216, 45, 18, 19, 216, 44, 18, 19, 148, 216, 44, 18, + 19, 230, 11, 216, 44, 18, 19, 218, 99, 18, 19, 216, 112, 18, 19, 216, 96, + 18, 19, 216, 95, 18, 19, 216, 115, 18, 19, 234, 188, 18, 19, 235, 11, 18, + 19, 234, 101, 18, 19, 234, 92, 18, 19, 234, 37, 18, 19, 234, 19, 18, 19, + 213, 104, 234, 19, 18, 19, 181, 18, 19, 235, 14, 18, 19, 233, 200, 18, + 19, 148, 233, 200, 18, 19, 233, 198, 18, 19, 148, 233, 198, 18, 19, 233, + 197, 18, 19, 148, 233, 197, 18, 19, 233, 196, 18, 19, 148, 233, 196, 18, + 19, 233, 195, 18, 19, 148, 233, 195, 18, 19, 233, 204, 18, 19, 148, 233, + 204, 18, 19, 233, 203, 18, 19, 148, 233, 203, 18, 19, 230, 11, 233, 203, + 18, 19, 235, 27, 18, 19, 233, 205, 18, 19, 219, 214, 234, 182, 18, 19, + 219, 214, 234, 93, 18, 19, 219, 214, 234, 32, 18, 19, 219, 214, 234, 252, + 18, 19, 250, 124, 18, 19, 250, 217, 18, 19, 249, 244, 18, 19, 249, 234, + 18, 19, 249, 175, 18, 19, 249, 113, 18, 19, 213, 104, 249, 113, 18, 19, + 250, 219, 18, 19, 250, 218, 18, 19, 249, 22, 18, 19, 148, 249, 22, 18, + 19, 249, 20, 18, 19, 148, 249, 20, 18, 19, 249, 19, 18, 19, 148, 249, 19, + 18, 19, 249, 18, 18, 19, 148, 249, 18, 18, 19, 249, 17, 18, 19, 148, 249, + 17, 18, 19, 249, 24, 18, 19, 148, 249, 24, 18, 19, 249, 23, 18, 19, 148, + 249, 23, 18, 19, 230, 11, 249, 23, 18, 19, 250, 252, 18, 19, 222, 127, + 217, 163, 18, 19, 231, 156, 18, 19, 232, 40, 18, 19, 231, 42, 18, 19, + 231, 14, 18, 19, 230, 231, 18, 19, 230, 202, 18, 19, 213, 104, 230, 202, + 18, 19, 188, 18, 19, 232, 41, 18, 19, 230, 112, 18, 19, 148, 230, 112, + 18, 19, 230, 110, 18, 19, 148, 230, 110, 18, 19, 230, 109, 18, 19, 148, + 230, 109, 18, 19, 230, 108, 18, 19, 148, 230, 108, 18, 19, 230, 107, 18, + 19, 148, 230, 107, 18, 19, 230, 114, 18, 19, 148, 230, 114, 18, 19, 230, + 113, 18, 19, 148, 230, 113, 18, 19, 230, 11, 230, 113, 18, 19, 183, 18, + 19, 148, 183, 18, 19, 231, 45, 18, 19, 253, 121, 183, 18, 19, 222, 127, + 183, 18, 19, 229, 187, 18, 19, 230, 42, 18, 19, 229, 64, 18, 19, 229, 39, + 18, 19, 228, 185, 18, 19, 228, 175, 18, 19, 213, 104, 228, 175, 18, 19, + 205, 18, 19, 230, 43, 18, 19, 228, 29, 18, 19, 148, 228, 29, 18, 19, 228, + 31, 18, 19, 148, 228, 31, 18, 19, 228, 30, 18, 19, 148, 228, 30, 18, 19, + 230, 11, 228, 30, 18, 19, 204, 18, 19, 66, 229, 161, 18, 19, 229, 69, 18, + 19, 233, 82, 18, 19, 233, 155, 18, 19, 233, 13, 18, 19, 232, 255, 18, 19, + 232, 208, 18, 19, 232, 180, 18, 19, 213, 104, 232, 180, 18, 19, 233, 157, + 18, 19, 233, 156, 18, 19, 232, 127, 18, 19, 148, 232, 127, 18, 19, 232, + 126, 18, 19, 148, 232, 126, 18, 19, 232, 125, 18, 19, 148, 232, 125, 18, + 19, 232, 124, 18, 19, 148, 232, 124, 18, 19, 232, 123, 18, 19, 148, 232, + 123, 18, 19, 232, 129, 18, 19, 148, 232, 129, 18, 19, 232, 128, 18, 19, + 148, 232, 128, 18, 19, 150, 18, 19, 148, 150, 18, 19, 138, 150, 18, 19, + 222, 100, 18, 19, 222, 198, 18, 19, 220, 117, 18, 19, 220, 101, 18, 19, + 219, 242, 18, 19, 219, 226, 18, 19, 213, 104, 219, 226, 18, 19, 222, 202, + 18, 19, 222, 200, 18, 19, 218, 194, 18, 19, 148, 218, 194, 18, 19, 218, + 188, 18, 19, 148, 218, 188, 18, 19, 218, 187, 18, 19, 148, 218, 187, 18, + 19, 218, 183, 18, 19, 148, 218, 183, 18, 19, 218, 182, 18, 19, 148, 218, + 182, 18, 19, 218, 198, 18, 19, 148, 218, 198, 18, 19, 218, 197, 18, 19, + 148, 218, 197, 18, 19, 230, 11, 218, 197, 18, 19, 197, 18, 19, 253, 121, + 197, 18, 19, 218, 199, 18, 19, 251, 141, 197, 18, 19, 230, 197, 220, 36, + 18, 19, 230, 11, 220, 27, 18, 19, 230, 11, 223, 2, 18, 19, 230, 11, 219, + 167, 18, 19, 230, 11, 219, 29, 18, 19, 230, 11, 220, 26, 18, 19, 230, 11, + 222, 103, 18, 19, 220, 243, 18, 19, 220, 212, 18, 19, 220, 207, 18, 19, + 220, 187, 18, 19, 220, 181, 18, 19, 221, 24, 18, 19, 221, 20, 18, 19, + 220, 132, 18, 19, 148, 220, 132, 18, 19, 220, 131, 18, 19, 148, 220, 131, + 18, 19, 220, 130, 18, 19, 148, 220, 130, 18, 19, 220, 129, 18, 19, 148, + 220, 129, 18, 19, 220, 128, 18, 19, 148, 220, 128, 18, 19, 220, 134, 18, + 19, 148, 220, 134, 18, 19, 220, 133, 18, 19, 148, 220, 133, 18, 19, 221, + 26, 18, 19, 213, 38, 18, 19, 213, 89, 18, 19, 212, 255, 18, 19, 212, 246, + 18, 19, 212, 235, 18, 19, 212, 220, 18, 19, 213, 104, 212, 220, 18, 19, + 186, 18, 19, 213, 91, 18, 19, 212, 166, 18, 19, 148, 212, 166, 18, 19, + 212, 165, 18, 19, 148, 212, 165, 18, 19, 212, 164, 18, 19, 148, 212, 164, + 18, 19, 212, 163, 18, 19, 148, 212, 163, 18, 19, 212, 162, 18, 19, 148, + 212, 162, 18, 19, 212, 168, 18, 19, 148, 212, 168, 18, 19, 212, 167, 18, + 19, 148, 212, 167, 18, 19, 230, 11, 212, 167, 18, 19, 213, 105, 18, 19, + 251, 182, 213, 105, 18, 19, 148, 213, 105, 18, 19, 222, 127, 212, 255, + 18, 19, 224, 21, 18, 19, 224, 112, 224, 21, 18, 19, 148, 233, 82, 18, 19, + 224, 73, 18, 19, 223, 188, 18, 19, 223, 136, 18, 19, 223, 112, 18, 19, + 223, 99, 18, 19, 148, 232, 208, 18, 19, 203, 18, 19, 224, 74, 18, 19, + 148, 233, 157, 18, 19, 223, 20, 18, 19, 148, 223, 20, 18, 19, 149, 18, + 19, 148, 149, 18, 19, 138, 149, 18, 19, 244, 123, 18, 19, 244, 161, 18, + 19, 244, 90, 18, 19, 244, 77, 18, 19, 244, 12, 18, 19, 244, 3, 18, 19, + 244, 164, 18, 19, 244, 163, 18, 19, 243, 187, 18, 19, 148, 243, 187, 18, + 19, 244, 230, 18, 19, 217, 148, 18, 19, 230, 96, 217, 148, 18, 19, 217, + 128, 18, 19, 230, 96, 217, 128, 18, 19, 217, 124, 18, 19, 230, 96, 217, + 124, 18, 19, 217, 109, 18, 19, 217, 106, 18, 19, 217, 161, 18, 19, 217, + 160, 18, 19, 217, 81, 18, 19, 148, 217, 81, 18, 19, 217, 163, 18, 19, + 216, 103, 18, 19, 216, 101, 18, 19, 216, 100, 18, 19, 216, 105, 18, 19, + 216, 106, 18, 19, 216, 18, 18, 19, 216, 17, 18, 19, 216, 16, 18, 19, 216, + 19, 18, 19, 228, 49, 241, 222, 18, 19, 228, 49, 241, 165, 18, 19, 228, + 49, 241, 147, 18, 19, 228, 49, 241, 54, 18, 19, 228, 49, 241, 39, 18, 19, + 228, 49, 159, 18, 19, 228, 49, 242, 27, 18, 19, 228, 49, 242, 41, 18, 19, + 228, 48, 242, 41, 18, 19, 241, 140, 18, 19, 224, 228, 18, 19, 224, 198, + 18, 19, 224, 193, 18, 19, 224, 187, 18, 19, 224, 182, 18, 19, 224, 232, + 18, 19, 224, 231, 18, 19, 224, 240, 18, 19, 217, 8, 18, 19, 217, 6, 18, + 19, 217, 5, 18, 19, 217, 9, 18, 19, 148, 224, 21, 18, 19, 148, 223, 188, + 18, 19, 148, 223, 112, 18, 19, 148, 203, 18, 19, 229, 157, 18, 19, 229, + 113, 18, 19, 229, 109, 18, 19, 229, 90, 18, 19, 229, 85, 18, 19, 229, + 159, 18, 19, 229, 158, 18, 19, 229, 161, 18, 19, 228, 196, 18, 19, 222, + 127, 220, 243, 18, 19, 222, 127, 220, 212, 18, 19, 222, 127, 220, 187, + 18, 19, 222, 127, 221, 24, 18, 19, 213, 200, 217, 148, 18, 19, 213, 200, + 217, 128, 18, 19, 213, 200, 217, 109, 18, 19, 213, 200, 217, 161, 18, 19, + 213, 200, 217, 163, 18, 19, 233, 19, 18, 19, 233, 18, 18, 19, 233, 17, + 18, 19, 233, 16, 18, 19, 233, 25, 18, 19, 233, 24, 18, 19, 233, 26, 18, + 19, 217, 162, 217, 148, 18, 19, 217, 162, 217, 128, 18, 19, 217, 162, + 217, 124, 18, 19, 217, 162, 217, 109, 18, 19, 217, 162, 217, 106, 18, 19, + 217, 162, 217, 161, 18, 19, 217, 162, 217, 160, 18, 19, 217, 162, 217, + 163, 18, 19, 254, 97, 253, 74, 18, 19, 251, 141, 74, 18, 19, 251, 141, + 72, 18, 19, 251, 141, 75, 18, 19, 251, 141, 61, 18, 19, 251, 141, 214, 6, + 18, 19, 251, 141, 213, 235, 18, 19, 251, 141, 213, 214, 18, 19, 251, 141, + 214, 49, 18, 19, 251, 141, 229, 187, 18, 19, 251, 141, 229, 64, 18, 19, + 251, 141, 228, 185, 18, 19, 251, 141, 205, 18, 19, 251, 141, 234, 188, + 18, 19, 251, 141, 234, 101, 18, 19, 251, 141, 234, 37, 18, 19, 251, 141, + 181, 18, 19, 222, 127, 241, 222, 18, 19, 222, 127, 241, 165, 18, 19, 222, + 127, 241, 54, 18, 19, 222, 127, 159, 18, 19, 66, 242, 196, 18, 19, 66, + 242, 200, 18, 19, 66, 242, 212, 18, 19, 66, 242, 211, 18, 19, 66, 242, + 201, 18, 19, 66, 242, 225, 18, 19, 66, 223, 51, 18, 19, 66, 223, 112, 18, + 19, 66, 224, 21, 18, 19, 66, 224, 1, 18, 19, 66, 223, 188, 18, 19, 66, + 203, 18, 19, 66, 213, 183, 18, 19, 66, 213, 214, 18, 19, 66, 214, 6, 18, + 19, 66, 214, 1, 18, 19, 66, 213, 235, 18, 19, 66, 214, 49, 18, 19, 66, + 240, 186, 18, 19, 66, 240, 187, 18, 19, 66, 240, 190, 18, 19, 66, 240, + 189, 18, 19, 66, 240, 188, 18, 19, 66, 240, 192, 18, 19, 66, 217, 90, 18, + 19, 66, 217, 109, 18, 19, 66, 217, 148, 18, 19, 66, 217, 147, 18, 19, 66, + 217, 128, 18, 19, 66, 217, 161, 18, 19, 66, 216, 86, 18, 19, 66, 216, 95, + 18, 19, 66, 216, 112, 18, 19, 66, 216, 111, 18, 19, 66, 216, 96, 18, 19, + 66, 216, 115, 18, 19, 66, 225, 35, 18, 19, 66, 225, 150, 18, 19, 66, 226, + 96, 18, 19, 66, 226, 86, 18, 19, 66, 225, 240, 18, 19, 66, 193, 18, 19, + 66, 226, 229, 18, 19, 66, 242, 92, 18, 19, 66, 242, 150, 18, 19, 66, 243, + 38, 18, 19, 66, 243, 31, 18, 19, 66, 242, 190, 18, 19, 66, 243, 110, 18, + 19, 66, 234, 108, 18, 19, 66, 234, 113, 18, 19, 66, 234, 125, 18, 19, 66, + 234, 124, 18, 19, 66, 234, 118, 18, 19, 66, 234, 138, 18, 19, 66, 234, + 50, 18, 19, 66, 234, 51, 18, 19, 66, 234, 54, 18, 19, 66, 234, 53, 18, + 19, 66, 234, 52, 18, 19, 66, 234, 55, 18, 19, 66, 234, 56, 18, 19, 66, + 228, 92, 18, 19, 66, 228, 185, 18, 19, 66, 229, 187, 18, 19, 66, 229, + 184, 18, 19, 66, 229, 64, 18, 19, 66, 205, 18, 19, 66, 230, 172, 18, 19, + 66, 230, 231, 18, 19, 66, 231, 156, 18, 19, 66, 231, 145, 18, 19, 66, + 231, 42, 18, 19, 66, 188, 18, 19, 66, 212, 203, 18, 19, 66, 212, 235, 18, + 19, 66, 213, 38, 18, 19, 66, 213, 35, 18, 19, 66, 212, 255, 18, 19, 66, + 186, 18, 19, 66, 235, 54, 18, 19, 222, 127, 235, 54, 18, 19, 66, 235, 71, + 18, 19, 66, 235, 127, 18, 19, 66, 235, 125, 18, 19, 66, 235, 110, 18, 19, + 222, 127, 235, 110, 18, 19, 66, 235, 139, 18, 19, 66, 235, 84, 18, 19, + 66, 235, 88, 18, 19, 66, 235, 98, 18, 19, 66, 235, 97, 18, 19, 66, 235, + 96, 18, 19, 66, 235, 99, 18, 19, 66, 232, 156, 18, 19, 66, 232, 208, 18, + 19, 66, 233, 82, 18, 19, 66, 233, 74, 18, 19, 66, 233, 13, 18, 19, 66, + 233, 157, 18, 19, 66, 247, 103, 18, 19, 66, 247, 104, 18, 19, 66, 247, + 107, 18, 19, 66, 247, 106, 18, 19, 66, 247, 105, 18, 19, 66, 247, 108, + 18, 19, 66, 233, 15, 18, 19, 66, 233, 17, 18, 19, 66, 233, 21, 18, 19, + 66, 233, 20, 18, 19, 66, 233, 19, 18, 19, 66, 233, 25, 18, 19, 66, 217, + 3, 18, 19, 66, 217, 5, 18, 19, 66, 217, 8, 18, 19, 66, 217, 7, 18, 19, + 66, 217, 6, 18, 19, 66, 217, 9, 18, 19, 66, 216, 255, 18, 19, 66, 217, 0, + 18, 19, 66, 217, 11, 18, 19, 66, 217, 10, 18, 19, 66, 217, 1, 18, 19, 66, + 217, 12, 18, 19, 66, 212, 8, 18, 19, 66, 212, 16, 18, 19, 66, 212, 87, + 18, 19, 66, 212, 85, 18, 19, 66, 212, 37, 18, 19, 66, 212, 109, 18, 19, + 66, 212, 152, 18, 19, 66, 70, 212, 152, 18, 19, 66, 245, 239, 18, 19, 66, + 245, 240, 18, 19, 66, 245, 247, 18, 19, 66, 245, 246, 18, 19, 66, 245, + 242, 18, 19, 66, 245, 249, 18, 19, 66, 219, 27, 18, 19, 66, 219, 242, 18, + 19, 66, 222, 100, 18, 19, 66, 222, 89, 18, 19, 66, 220, 117, 18, 19, 66, + 222, 202, 18, 19, 66, 220, 150, 18, 19, 66, 220, 187, 18, 19, 66, 220, + 243, 18, 19, 66, 220, 241, 18, 19, 66, 220, 212, 18, 19, 66, 221, 24, 18, + 19, 66, 221, 26, 18, 19, 66, 216, 122, 18, 19, 66, 216, 124, 18, 19, 66, + 216, 136, 18, 19, 66, 216, 135, 18, 19, 66, 216, 125, 18, 19, 66, 216, + 141, 18, 19, 66, 250, 6, 18, 19, 66, 250, 23, 18, 19, 66, 250, 67, 18, + 19, 66, 250, 64, 18, 19, 66, 250, 47, 18, 19, 66, 250, 92, 18, 19, 66, + 216, 89, 18, 19, 66, 216, 90, 18, 19, 66, 216, 93, 18, 19, 66, 216, 92, + 18, 19, 66, 216, 91, 18, 19, 66, 216, 94, 18, 19, 250, 48, 52, 18, 19, + 243, 200, 219, 69, 18, 19, 224, 224, 18, 19, 229, 156, 18, 19, 228, 193, + 18, 19, 228, 192, 18, 19, 228, 191, 18, 19, 228, 190, 18, 19, 228, 195, + 18, 19, 228, 194, 18, 19, 213, 200, 217, 79, 18, 19, 213, 200, 217, 78, + 18, 19, 213, 200, 217, 77, 18, 19, 213, 200, 217, 76, 18, 19, 213, 200, + 217, 75, 18, 19, 213, 200, 217, 82, 18, 19, 213, 200, 217, 81, 18, 19, + 213, 200, 40, 217, 163, 18, 19, 251, 141, 214, 82, 227, 92, 219, 207, 77, + 227, 92, 1, 251, 224, 227, 92, 1, 232, 145, 227, 92, 1, 244, 120, 227, + 92, 1, 222, 186, 227, 92, 1, 229, 24, 227, 92, 1, 215, 195, 227, 92, 1, + 248, 142, 227, 92, 1, 217, 33, 227, 92, 1, 249, 167, 227, 92, 1, 250, + 114, 227, 92, 1, 230, 161, 227, 92, 1, 242, 132, 227, 92, 1, 229, 147, + 227, 92, 1, 219, 62, 227, 92, 1, 223, 46, 227, 92, 1, 254, 105, 227, 92, + 1, 227, 53, 227, 92, 1, 215, 121, 227, 92, 1, 245, 187, 227, 92, 1, 235, + 186, 227, 92, 1, 245, 188, 227, 92, 1, 227, 24, 227, 92, 1, 215, 176, + 227, 92, 1, 236, 34, 227, 92, 1, 245, 185, 227, 92, 1, 226, 77, 227, 92, + 244, 119, 77, 227, 92, 223, 202, 244, 119, 77, 168, 1, 244, 110, 244, + 102, 244, 124, 244, 230, 168, 1, 215, 79, 168, 1, 215, 106, 215, 122, 69, + 168, 1, 212, 205, 168, 1, 213, 105, 168, 1, 214, 82, 168, 1, 217, 84, + 217, 83, 217, 104, 168, 1, 245, 25, 168, 1, 254, 4, 61, 168, 1, 227, 10, + 75, 168, 1, 254, 177, 61, 168, 1, 254, 132, 168, 1, 232, 186, 75, 168, 1, + 220, 168, 75, 168, 1, 75, 168, 1, 227, 99, 168, 1, 227, 62, 168, 1, 224, + 55, 224, 67, 223, 244, 149, 168, 1, 234, 199, 168, 1, 250, 111, 168, 1, + 234, 200, 235, 27, 168, 1, 243, 177, 168, 1, 245, 96, 168, 1, 243, 34, + 242, 47, 243, 177, 168, 1, 243, 72, 168, 1, 213, 176, 213, 170, 214, 82, + 168, 1, 242, 19, 242, 41, 168, 1, 242, 23, 242, 41, 168, 1, 232, 188, + 242, 41, 168, 1, 220, 171, 242, 41, 168, 1, 230, 7, 228, 18, 230, 8, 204, + 168, 1, 220, 169, 204, 168, 1, 246, 69, 168, 1, 235, 166, 235, 170, 235, + 160, 72, 168, 1, 74, 168, 1, 235, 118, 235, 142, 168, 1, 243, 19, 168, 1, + 232, 189, 254, 148, 168, 1, 220, 173, 61, 168, 1, 235, 152, 245, 72, 168, + 1, 226, 40, 226, 61, 226, 229, 168, 1, 254, 72, 245, 71, 168, 1, 219, + 211, 197, 168, 1, 220, 105, 232, 185, 197, 168, 1, 220, 167, 197, 168, 1, + 250, 252, 168, 1, 212, 152, 168, 1, 217, 16, 217, 26, 216, 7, 218, 99, + 168, 1, 220, 166, 218, 99, 168, 1, 249, 3, 168, 1, 251, 208, 251, 211, + 251, 147, 253, 74, 168, 1, 220, 172, 253, 74, 168, 1, 246, 68, 168, 1, + 227, 36, 168, 1, 245, 153, 245, 155, 74, 168, 1, 231, 241, 231, 249, 183, + 168, 1, 232, 187, 183, 168, 1, 220, 170, 183, 168, 1, 233, 97, 233, 137, + 232, 196, 150, 168, 1, 246, 70, 168, 1, 235, 227, 168, 1, 235, 228, 168, + 1, 248, 153, 248, 158, 249, 3, 168, 1, 227, 6, 245, 24, 75, 168, 1, 245, + 183, 168, 1, 235, 185, 168, 1, 249, 21, 168, 1, 250, 205, 168, 1, 250, + 123, 168, 1, 219, 100, 168, 1, 232, 184, 168, 1, 220, 165, 168, 1, 240, + 103, 168, 1, 224, 240, 168, 1, 213, 166, 168, 220, 81, 225, 26, 168, 230, + 155, 225, 26, 168, 249, 71, 225, 26, 168, 253, 177, 87, 168, 216, 47, 87, + 168, 251, 223, 87, 218, 32, 1, 61, 218, 32, 1, 72, 218, 32, 1, 69, 218, + 32, 1, 181, 218, 32, 1, 243, 110, 218, 32, 1, 229, 159, 218, 32, 1, 218, + 52, 218, 32, 1, 248, 164, 218, 32, 1, 205, 218, 32, 1, 193, 218, 32, 1, + 252, 107, 218, 32, 1, 188, 218, 32, 1, 186, 218, 32, 1, 233, 157, 218, + 32, 1, 214, 49, 218, 32, 1, 222, 202, 218, 32, 1, 159, 218, 32, 30, 5, + 72, 218, 32, 30, 5, 69, 218, 32, 5, 214, 133, 241, 246, 1, 61, 241, 246, + 1, 72, 241, 246, 1, 69, 241, 246, 1, 181, 241, 246, 1, 243, 110, 241, + 246, 1, 229, 159, 241, 246, 1, 218, 52, 241, 246, 1, 248, 164, 241, 246, + 1, 205, 241, 246, 1, 193, 241, 246, 1, 252, 107, 241, 246, 1, 188, 241, + 246, 1, 186, 241, 246, 1, 203, 241, 246, 1, 233, 157, 241, 246, 1, 214, + 49, 241, 246, 1, 222, 202, 241, 246, 1, 159, 241, 246, 30, 5, 72, 241, + 246, 30, 5, 69, 241, 246, 5, 226, 176, 226, 2, 220, 81, 225, 26, 226, 2, + 51, 225, 26, 251, 49, 1, 61, 251, 49, 1, 72, 251, 49, 1, 69, 251, 49, 1, + 181, 251, 49, 1, 243, 110, 251, 49, 1, 229, 159, 251, 49, 1, 218, 52, + 251, 49, 1, 248, 164, 251, 49, 1, 205, 251, 49, 1, 193, 251, 49, 1, 252, + 107, 251, 49, 1, 188, 251, 49, 1, 186, 251, 49, 1, 203, 251, 49, 1, 233, + 157, 251, 49, 1, 214, 49, 251, 49, 1, 222, 202, 251, 49, 1, 159, 251, 49, + 30, 5, 72, 251, 49, 30, 5, 69, 218, 31, 1, 61, 218, 31, 1, 72, 218, 31, + 1, 69, 218, 31, 1, 181, 218, 31, 1, 243, 110, 218, 31, 1, 229, 159, 218, + 31, 1, 218, 52, 218, 31, 1, 248, 164, 218, 31, 1, 205, 218, 31, 1, 193, + 218, 31, 1, 252, 107, 218, 31, 1, 188, 218, 31, 1, 186, 218, 31, 1, 233, + 157, 218, 31, 1, 214, 49, 218, 31, 1, 222, 202, 218, 31, 30, 5, 72, 218, + 31, 30, 5, 69, 84, 1, 181, 84, 1, 234, 138, 84, 1, 234, 37, 84, 1, 234, + 113, 84, 1, 229, 90, 84, 1, 250, 219, 84, 1, 250, 92, 84, 1, 249, 175, + 84, 1, 250, 23, 84, 1, 227, 253, 84, 1, 248, 164, 84, 1, 216, 105, 84, 1, + 247, 99, 84, 1, 216, 100, 84, 1, 228, 188, 84, 1, 218, 52, 84, 1, 217, + 161, 84, 1, 108, 84, 1, 217, 109, 84, 1, 228, 185, 84, 1, 252, 107, 84, + 1, 226, 23, 84, 1, 225, 150, 84, 1, 225, 253, 84, 1, 230, 231, 84, 1, + 212, 235, 84, 1, 223, 112, 84, 1, 232, 208, 84, 1, 214, 119, 84, 1, 221, + 24, 84, 1, 219, 121, 84, 1, 222, 202, 84, 1, 159, 84, 1, 233, 157, 84, 1, + 224, 232, 84, 235, 240, 30, 224, 218, 84, 235, 240, 30, 224, 231, 84, + 235, 240, 30, 224, 198, 84, 235, 240, 30, 224, 193, 84, 235, 240, 30, + 224, 175, 84, 235, 240, 30, 224, 147, 84, 235, 240, 30, 224, 135, 84, + 235, 240, 30, 224, 134, 84, 235, 240, 30, 223, 12, 84, 235, 240, 30, 223, + 5, 84, 235, 240, 30, 232, 121, 84, 235, 240, 30, 232, 112, 84, 235, 240, + 30, 224, 213, 84, 235, 240, 30, 224, 224, 84, 235, 240, 30, 224, 183, + 216, 15, 116, 84, 235, 240, 30, 224, 183, 216, 15, 109, 84, 235, 240, 30, + 224, 214, 84, 30, 235, 226, 253, 215, 84, 30, 235, 226, 254, 232, 84, 30, + 5, 254, 232, 84, 30, 5, 72, 84, 30, 5, 236, 28, 84, 30, 5, 213, 105, 84, + 30, 5, 212, 161, 84, 30, 5, 69, 84, 30, 5, 215, 92, 84, 30, 5, 215, 196, + 84, 30, 5, 227, 99, 84, 30, 5, 186, 84, 30, 5, 236, 55, 84, 30, 5, 74, + 84, 30, 5, 254, 148, 84, 30, 5, 254, 108, 84, 30, 5, 227, 49, 84, 30, 5, + 253, 108, 84, 5, 229, 37, 84, 5, 224, 19, 84, 5, 212, 172, 84, 5, 230, + 123, 84, 5, 216, 171, 84, 5, 252, 62, 84, 5, 223, 107, 84, 5, 216, 251, + 84, 5, 234, 246, 84, 5, 254, 110, 84, 5, 222, 160, 222, 154, 84, 5, 214, + 130, 84, 5, 249, 170, 84, 5, 252, 37, 84, 5, 234, 131, 84, 5, 252, 57, + 84, 5, 250, 197, 225, 204, 233, 209, 84, 5, 233, 54, 216, 230, 84, 5, + 251, 197, 84, 5, 225, 255, 230, 169, 84, 5, 234, 18, 84, 249, 39, 16, + 223, 181, 84, 5, 253, 90, 84, 5, 253, 111, 84, 21, 212, 79, 84, 21, 116, + 84, 21, 109, 84, 21, 166, 84, 21, 163, 84, 21, 180, 84, 21, 189, 84, 21, + 198, 84, 21, 195, 84, 21, 200, 84, 16, 233, 54, 253, 113, 219, 229, 84, + 16, 233, 54, 253, 113, 230, 141, 84, 16, 233, 54, 253, 113, 225, 203, 84, + 16, 233, 54, 253, 113, 251, 225, 84, 16, 233, 54, 253, 113, 251, 32, 84, + 16, 233, 54, 253, 113, 225, 95, 84, 16, 233, 54, 253, 113, 225, 89, 84, + 16, 233, 54, 253, 113, 225, 87, 84, 16, 233, 54, 253, 113, 225, 93, 84, + 16, 233, 54, 253, 113, 225, 91, 81, 251, 159, 81, 245, 120, 81, 249, 157, + 81, 243, 200, 219, 69, 81, 249, 164, 81, 243, 237, 247, 72, 81, 216, 250, + 219, 236, 240, 160, 81, 220, 116, 4, 251, 98, 231, 217, 81, 231, 246, + 249, 157, 81, 231, 246, 243, 200, 219, 69, 81, 229, 22, 81, 243, 223, 43, + 222, 77, 116, 81, 243, 223, 43, 222, 77, 109, 81, 243, 223, 43, 222, 77, + 166, 81, 30, 221, 57, 81, 21, 212, 79, 81, 21, 116, 81, 21, 109, 81, 21, + 166, 81, 21, 163, 81, 21, 180, 81, 21, 189, 81, 21, 198, 81, 21, 195, 81, + 21, 200, 81, 1, 61, 81, 1, 74, 81, 1, 72, 81, 1, 75, 81, 1, 69, 81, 1, + 227, 99, 81, 1, 215, 183, 81, 1, 245, 165, 81, 1, 205, 81, 1, 254, 24, + 81, 1, 252, 107, 81, 1, 193, 81, 1, 224, 232, 81, 1, 243, 110, 81, 1, + 188, 81, 1, 233, 157, 81, 1, 222, 202, 81, 1, 221, 24, 81, 1, 218, 52, + 81, 1, 248, 164, 81, 1, 250, 92, 81, 1, 235, 139, 81, 1, 186, 81, 1, 203, + 81, 1, 214, 49, 81, 1, 244, 164, 81, 1, 181, 81, 1, 234, 138, 81, 1, 216, + 141, 81, 1, 212, 109, 81, 1, 242, 27, 81, 1, 212, 9, 81, 1, 233, 25, 81, + 1, 212, 62, 81, 1, 250, 47, 81, 1, 216, 250, 184, 30, 52, 81, 1, 216, + 250, 74, 81, 1, 216, 250, 72, 81, 1, 216, 250, 75, 81, 1, 216, 250, 69, + 81, 1, 216, 250, 227, 99, 81, 1, 216, 250, 215, 183, 81, 1, 216, 250, + 254, 24, 81, 1, 216, 250, 252, 107, 81, 1, 216, 250, 193, 81, 1, 216, + 250, 224, 232, 81, 1, 216, 250, 243, 110, 81, 1, 216, 250, 188, 81, 1, + 216, 250, 218, 52, 81, 1, 216, 250, 248, 164, 81, 1, 216, 250, 250, 92, + 81, 1, 216, 250, 235, 139, 81, 1, 216, 250, 216, 141, 81, 1, 216, 250, + 186, 81, 1, 216, 250, 214, 49, 81, 1, 216, 250, 181, 81, 1, 216, 250, + 243, 107, 81, 1, 216, 250, 242, 27, 81, 1, 216, 250, 235, 109, 81, 1, + 216, 250, 229, 62, 81, 1, 216, 250, 245, 249, 81, 1, 220, 116, 74, 81, 1, + 220, 116, 72, 81, 1, 220, 116, 235, 150, 81, 1, 220, 116, 215, 183, 81, + 1, 220, 116, 69, 81, 1, 220, 116, 254, 24, 81, 1, 220, 116, 181, 81, 1, + 220, 116, 243, 110, 81, 1, 220, 116, 159, 81, 1, 220, 116, 193, 81, 1, + 220, 116, 221, 24, 81, 1, 220, 116, 218, 52, 81, 1, 220, 116, 248, 164, + 81, 1, 220, 116, 235, 139, 81, 1, 220, 116, 244, 164, 81, 1, 220, 116, + 243, 107, 81, 1, 220, 116, 242, 27, 81, 1, 220, 116, 216, 141, 81, 1, + 220, 116, 212, 109, 81, 1, 220, 116, 224, 74, 81, 1, 220, 116, 250, 92, + 81, 1, 220, 116, 212, 75, 81, 1, 231, 246, 72, 81, 1, 231, 246, 181, 81, + 1, 231, 246, 203, 81, 1, 231, 246, 244, 164, 81, 1, 231, 246, 212, 75, + 81, 1, 254, 71, 243, 92, 253, 243, 116, 81, 1, 254, 71, 243, 92, 214, + 129, 116, 81, 1, 254, 71, 243, 92, 248, 131, 81, 1, 254, 71, 243, 92, + 215, 193, 81, 1, 254, 71, 243, 92, 235, 191, 215, 193, 81, 1, 254, 71, + 243, 92, 252, 74, 81, 1, 254, 71, 243, 92, 133, 252, 74, 81, 1, 254, 71, + 243, 92, 61, 81, 1, 254, 71, 243, 92, 72, 81, 1, 254, 71, 243, 92, 181, + 81, 1, 254, 71, 243, 92, 229, 159, 81, 1, 254, 71, 243, 92, 250, 219, 81, + 1, 254, 71, 243, 92, 216, 115, 81, 1, 254, 71, 243, 92, 216, 105, 81, 1, + 254, 71, 243, 92, 248, 86, 81, 1, 254, 71, 243, 92, 228, 198, 81, 1, 254, + 71, 243, 92, 218, 52, 81, 1, 254, 71, 243, 92, 248, 164, 81, 1, 254, 71, + 243, 92, 193, 81, 1, 254, 71, 243, 92, 226, 23, 81, 1, 254, 71, 243, 92, + 219, 157, 81, 1, 254, 71, 243, 92, 212, 75, 81, 1, 254, 71, 243, 92, 212, + 109, 81, 1, 254, 71, 243, 92, 254, 114, 81, 1, 216, 250, 254, 71, 243, + 92, 218, 52, 81, 1, 216, 250, 254, 71, 243, 92, 212, 75, 81, 1, 231, 246, + 254, 71, 243, 92, 242, 225, 81, 1, 231, 246, 254, 71, 243, 92, 229, 159, + 81, 1, 231, 246, 254, 71, 243, 92, 250, 219, 81, 1, 231, 246, 254, 71, + 243, 92, 235, 115, 81, 1, 231, 246, 254, 71, 243, 92, 216, 115, 81, 1, + 231, 246, 254, 71, 243, 92, 248, 70, 81, 1, 231, 246, 254, 71, 243, 92, + 218, 52, 81, 1, 231, 246, 254, 71, 243, 92, 247, 232, 81, 1, 231, 246, + 254, 71, 243, 92, 219, 157, 81, 1, 231, 246, 254, 71, 243, 92, 249, 15, + 81, 1, 231, 246, 254, 71, 243, 92, 212, 75, 81, 1, 231, 246, 254, 71, + 243, 92, 212, 109, 81, 1, 254, 71, 243, 92, 151, 69, 81, 1, 254, 71, 243, + 92, 151, 186, 81, 1, 231, 246, 254, 71, 243, 92, 251, 195, 81, 1, 254, + 71, 243, 92, 248, 154, 81, 1, 231, 246, 254, 71, 243, 92, 233, 25, 18, + 19, 226, 233, 18, 19, 253, 83, 18, 19, 254, 188, 18, 19, 214, 9, 18, 19, + 225, 101, 18, 19, 226, 103, 18, 19, 224, 249, 18, 19, 217, 238, 18, 19, + 234, 195, 18, 19, 233, 201, 18, 19, 231, 196, 18, 19, 228, 148, 18, 19, + 230, 3, 18, 19, 233, 92, 18, 19, 219, 209, 18, 19, 222, 129, 18, 19, 220, + 156, 18, 19, 220, 246, 18, 19, 220, 127, 18, 19, 212, 211, 18, 19, 213, + 43, 18, 19, 224, 27, 18, 19, 228, 28, 18, 19, 227, 82, 228, 28, 18, 19, + 228, 27, 18, 19, 227, 82, 228, 27, 18, 19, 228, 26, 18, 19, 227, 82, 228, + 26, 18, 19, 228, 25, 18, 19, 227, 82, 228, 25, 18, 19, 223, 17, 18, 19, + 223, 16, 18, 19, 223, 15, 18, 19, 223, 14, 18, 19, 223, 13, 18, 19, 223, + 21, 18, 19, 227, 82, 226, 229, 18, 19, 227, 82, 218, 99, 18, 19, 227, 82, + 235, 27, 18, 19, 227, 82, 250, 252, 18, 19, 227, 82, 183, 18, 19, 227, + 82, 204, 18, 19, 227, 82, 197, 18, 19, 227, 82, 221, 26, 18, 19, 245, + 175, 214, 82, 18, 19, 213, 248, 214, 82, 18, 19, 40, 3, 223, 130, 18, 19, + 40, 224, 48, 247, 74, 18, 19, 224, 112, 223, 18, 18, 19, 148, 232, 180, + 18, 19, 148, 233, 156, 18, 19, 217, 80, 18, 19, 217, 82, 18, 19, 216, 97, + 18, 19, 216, 99, 18, 19, 216, 104, 18, 19, 217, 2, 18, 19, 217, 4, 18, + 19, 222, 127, 220, 132, 18, 19, 222, 127, 220, 181, 18, 19, 222, 127, + 241, 39, 18, 19, 66, 242, 54, 18, 19, 66, 248, 3, 243, 31, 18, 19, 66, + 243, 107, 18, 19, 66, 242, 59, 18, 19, 222, 127, 235, 37, 18, 19, 66, + 235, 35, 18, 19, 251, 244, 248, 3, 150, 18, 19, 251, 244, 248, 3, 149, + 18, 19, 66, 247, 254, 197, 209, 214, 103, 233, 34, 209, 1, 181, 209, 1, + 234, 138, 209, 1, 243, 110, 209, 1, 242, 225, 209, 1, 229, 159, 209, 1, + 250, 219, 209, 1, 250, 92, 209, 1, 235, 139, 209, 1, 235, 115, 209, 1, + 213, 60, 209, 1, 218, 52, 209, 1, 217, 161, 209, 1, 248, 164, 209, 1, + 247, 232, 209, 1, 205, 209, 1, 193, 209, 1, 226, 23, 209, 1, 252, 107, + 209, 1, 251, 195, 209, 1, 188, 209, 1, 186, 209, 1, 203, 209, 1, 233, + 157, 209, 1, 214, 49, 209, 1, 221, 24, 209, 1, 219, 157, 209, 1, 222, + 202, 209, 1, 159, 209, 30, 5, 61, 209, 30, 5, 72, 209, 30, 5, 69, 209, + 30, 5, 245, 165, 209, 30, 5, 254, 108, 209, 30, 5, 227, 49, 209, 30, 5, + 253, 108, 209, 30, 5, 74, 209, 30, 5, 75, 209, 219, 18, 1, 186, 209, 219, + 18, 1, 203, 209, 219, 18, 1, 214, 49, 209, 3, 1, 181, 209, 3, 1, 229, + 159, 209, 3, 1, 253, 242, 209, 3, 1, 218, 52, 209, 3, 1, 205, 209, 3, 1, + 193, 209, 3, 1, 188, 209, 3, 1, 203, 209, 3, 1, 233, 157, 209, 5, 230, + 159, 209, 5, 234, 177, 209, 5, 222, 201, 209, 5, 232, 180, 209, 244, 254, + 77, 209, 224, 158, 77, 209, 21, 212, 79, 209, 21, 116, 209, 21, 109, 209, + 21, 166, 209, 21, 163, 209, 21, 180, 209, 21, 189, 209, 21, 198, 209, 21, + 195, 209, 21, 200, 38, 233, 83, 1, 181, 38, 233, 83, 1, 213, 153, 38, + 233, 83, 1, 229, 159, 38, 233, 83, 1, 216, 141, 38, 233, 83, 1, 222, 202, + 38, 233, 83, 1, 186, 38, 233, 83, 1, 218, 52, 38, 233, 83, 1, 217, 161, + 38, 233, 83, 1, 233, 157, 38, 233, 83, 1, 193, 38, 233, 83, 1, 226, 23, + 38, 233, 83, 1, 188, 38, 233, 83, 1, 244, 164, 38, 233, 83, 1, 215, 1, + 38, 233, 83, 1, 159, 38, 233, 83, 1, 224, 232, 38, 233, 83, 1, 234, 138, + 38, 233, 83, 1, 216, 133, 38, 233, 83, 1, 205, 38, 233, 83, 1, 61, 38, + 233, 83, 1, 72, 38, 233, 83, 1, 245, 165, 38, 233, 83, 1, 245, 154, 38, + 233, 83, 1, 69, 38, 233, 83, 1, 227, 49, 38, 233, 83, 1, 75, 38, 233, 83, + 1, 215, 183, 38, 233, 83, 1, 74, 38, 233, 83, 1, 253, 106, 38, 233, 83, + 1, 254, 108, 38, 233, 83, 1, 216, 239, 38, 233, 83, 1, 216, 238, 38, 233, + 83, 1, 216, 237, 38, 233, 83, 1, 216, 236, 38, 233, 83, 1, 216, 235, 156, + 38, 165, 1, 124, 224, 232, 156, 38, 165, 1, 115, 224, 232, 156, 38, 165, + 1, 124, 181, 156, 38, 165, 1, 124, 213, 153, 156, 38, 165, 1, 124, 229, + 159, 156, 38, 165, 1, 115, 181, 156, 38, 165, 1, 115, 213, 153, 156, 38, + 165, 1, 115, 229, 159, 156, 38, 165, 1, 124, 216, 141, 156, 38, 165, 1, + 124, 222, 202, 156, 38, 165, 1, 124, 186, 156, 38, 165, 1, 115, 216, 141, + 156, 38, 165, 1, 115, 222, 202, 156, 38, 165, 1, 115, 186, 156, 38, 165, + 1, 124, 218, 52, 156, 38, 165, 1, 124, 217, 161, 156, 38, 165, 1, 124, + 205, 156, 38, 165, 1, 115, 218, 52, 156, 38, 165, 1, 115, 217, 161, 156, + 38, 165, 1, 115, 205, 156, 38, 165, 1, 124, 193, 156, 38, 165, 1, 124, + 226, 23, 156, 38, 165, 1, 124, 188, 156, 38, 165, 1, 115, 193, 156, 38, + 165, 1, 115, 226, 23, 156, 38, 165, 1, 115, 188, 156, 38, 165, 1, 124, + 244, 164, 156, 38, 165, 1, 124, 215, 1, 156, 38, 165, 1, 124, 233, 157, + 156, 38, 165, 1, 115, 244, 164, 156, 38, 165, 1, 115, 215, 1, 156, 38, + 165, 1, 115, 233, 157, 156, 38, 165, 1, 124, 159, 156, 38, 165, 1, 124, + 248, 164, 156, 38, 165, 1, 124, 252, 107, 156, 38, 165, 1, 115, 159, 156, + 38, 165, 1, 115, 248, 164, 156, 38, 165, 1, 115, 252, 107, 156, 38, 165, + 1, 124, 233, 206, 156, 38, 165, 1, 124, 213, 126, 156, 38, 165, 1, 115, + 233, 206, 156, 38, 165, 1, 115, 213, 126, 156, 38, 165, 1, 124, 219, 26, + 156, 38, 165, 1, 115, 219, 26, 156, 38, 165, 30, 5, 30, 220, 163, 156, + 38, 165, 30, 5, 254, 232, 156, 38, 165, 30, 5, 236, 28, 156, 38, 165, 30, + 5, 69, 156, 38, 165, 30, 5, 215, 92, 156, 38, 165, 30, 5, 74, 156, 38, + 165, 30, 5, 254, 148, 156, 38, 165, 30, 5, 75, 156, 38, 165, 30, 5, 227, + 120, 156, 38, 165, 30, 5, 215, 183, 156, 38, 165, 30, 5, 253, 83, 156, + 38, 165, 30, 5, 254, 188, 156, 38, 165, 30, 5, 215, 85, 156, 38, 165, 30, + 5, 226, 233, 156, 38, 165, 30, 5, 227, 117, 156, 38, 165, 30, 5, 215, + 180, 156, 38, 165, 30, 5, 235, 150, 156, 38, 165, 1, 40, 215, 79, 156, + 38, 165, 1, 40, 229, 161, 156, 38, 165, 1, 40, 204, 156, 38, 165, 1, 40, + 183, 156, 38, 165, 1, 40, 235, 27, 156, 38, 165, 1, 40, 249, 3, 156, 38, + 165, 1, 40, 253, 74, 156, 38, 165, 160, 231, 221, 156, 38, 165, 160, 231, + 220, 156, 38, 165, 21, 212, 79, 156, 38, 165, 21, 116, 156, 38, 165, 21, + 109, 156, 38, 165, 21, 166, 156, 38, 165, 21, 163, 156, 38, 165, 21, 180, + 156, 38, 165, 21, 189, 156, 38, 165, 21, 198, 156, 38, 165, 21, 195, 156, + 38, 165, 21, 200, 156, 38, 165, 88, 21, 116, 156, 38, 165, 5, 233, 143, + 156, 38, 165, 5, 233, 142, 84, 16, 226, 109, 84, 16, 230, 142, 234, 34, + 84, 16, 225, 204, 234, 34, 84, 16, 251, 226, 234, 34, 84, 16, 251, 33, + 234, 34, 84, 16, 225, 96, 234, 34, 84, 16, 225, 90, 234, 34, 84, 16, 225, + 88, 234, 34, 84, 16, 225, 94, 234, 34, 84, 16, 225, 92, 234, 34, 84, 16, + 248, 118, 234, 34, 84, 16, 248, 114, 234, 34, 84, 16, 248, 113, 234, 34, + 84, 16, 248, 116, 234, 34, 84, 16, 248, 115, 234, 34, 84, 16, 248, 112, + 234, 34, 84, 16, 216, 51, 84, 16, 230, 142, 223, 106, 84, 16, 225, 204, + 223, 106, 84, 16, 251, 226, 223, 106, 84, 16, 251, 33, 223, 106, 84, 16, + 225, 96, 223, 106, 84, 16, 225, 90, 223, 106, 84, 16, 225, 88, 223, 106, + 84, 16, 225, 94, 223, 106, 84, 16, 225, 92, 223, 106, 84, 16, 248, 118, + 223, 106, 84, 16, 248, 114, 223, 106, 84, 16, 248, 113, 223, 106, 84, 16, + 248, 116, 223, 106, 84, 16, 248, 115, 223, 106, 84, 16, 248, 112, 223, + 106, 251, 50, 1, 181, 251, 50, 1, 243, 110, 251, 50, 1, 229, 159, 251, + 50, 1, 229, 108, 251, 50, 1, 193, 251, 50, 1, 252, 107, 251, 50, 1, 188, + 251, 50, 1, 230, 175, 251, 50, 1, 218, 52, 251, 50, 1, 248, 164, 251, 50, + 1, 205, 251, 50, 1, 228, 147, 251, 50, 1, 250, 219, 251, 50, 1, 235, 139, + 251, 50, 1, 228, 23, 251, 50, 1, 228, 19, 251, 50, 1, 186, 251, 50, 1, + 203, 251, 50, 1, 233, 157, 251, 50, 1, 215, 1, 251, 50, 1, 222, 202, 251, + 50, 1, 61, 251, 50, 1, 159, 251, 50, 30, 5, 72, 251, 50, 30, 5, 69, 251, + 50, 30, 5, 74, 251, 50, 30, 5, 75, 251, 50, 30, 5, 254, 148, 251, 50, + 226, 187, 251, 50, 245, 101, 65, 222, 91, 38, 88, 1, 124, 181, 38, 88, 1, + 124, 234, 138, 38, 88, 1, 124, 233, 193, 38, 88, 1, 115, 181, 38, 88, 1, + 115, 233, 193, 38, 88, 1, 115, 234, 138, 38, 88, 1, 229, 159, 38, 88, 1, + 124, 250, 219, 38, 88, 1, 124, 250, 92, 38, 88, 1, 115, 250, 219, 38, 88, + 1, 115, 222, 202, 38, 88, 1, 115, 250, 92, 38, 88, 1, 228, 23, 38, 88, 1, + 224, 32, 38, 88, 1, 124, 224, 30, 38, 88, 1, 248, 164, 38, 88, 1, 115, + 224, 30, 38, 88, 1, 224, 41, 38, 88, 1, 124, 218, 52, 38, 88, 1, 124, + 217, 161, 38, 88, 1, 115, 218, 52, 38, 88, 1, 115, 217, 161, 38, 88, 1, + 205, 38, 88, 1, 252, 107, 38, 88, 1, 124, 193, 38, 88, 1, 124, 226, 23, + 38, 88, 1, 124, 244, 164, 38, 88, 1, 115, 193, 38, 88, 1, 115, 244, 164, + 38, 88, 1, 115, 226, 23, 38, 88, 1, 188, 38, 88, 1, 115, 186, 38, 88, 1, + 124, 186, 38, 88, 1, 203, 38, 88, 1, 223, 48, 38, 88, 1, 233, 157, 38, + 88, 1, 232, 151, 38, 88, 1, 214, 49, 38, 88, 1, 124, 221, 24, 38, 88, 1, + 124, 219, 157, 38, 88, 1, 124, 222, 202, 38, 88, 1, 124, 159, 38, 88, 1, + 232, 213, 38, 88, 1, 61, 38, 88, 1, 115, 159, 38, 88, 1, 72, 38, 88, 1, + 236, 28, 38, 88, 1, 69, 38, 88, 1, 215, 92, 38, 88, 1, 245, 165, 38, 88, + 1, 227, 49, 38, 88, 1, 233, 143, 38, 88, 1, 242, 109, 222, 202, 38, 88, + 249, 133, 5, 138, 203, 38, 88, 249, 133, 5, 138, 233, 157, 38, 88, 249, + 133, 5, 233, 158, 218, 9, 233, 133, 38, 88, 5, 232, 9, 234, 236, 233, + 133, 38, 88, 249, 133, 5, 40, 229, 159, 38, 88, 249, 133, 5, 115, 193, + 38, 88, 249, 133, 5, 124, 224, 31, 167, 115, 193, 38, 88, 249, 133, 5, + 188, 38, 88, 249, 133, 5, 252, 107, 38, 88, 249, 133, 5, 222, 202, 38, + 88, 5, 222, 181, 38, 88, 30, 5, 61, 38, 88, 30, 5, 232, 9, 222, 142, 38, + 88, 30, 5, 254, 232, 38, 88, 30, 5, 218, 15, 254, 232, 38, 88, 30, 5, 72, + 38, 88, 30, 5, 236, 28, 38, 88, 30, 5, 215, 183, 38, 88, 30, 5, 215, 91, + 38, 88, 30, 5, 69, 38, 88, 30, 5, 215, 92, 38, 88, 30, 5, 75, 38, 88, 30, + 5, 227, 121, 55, 38, 88, 30, 5, 226, 233, 38, 88, 30, 5, 74, 38, 88, 30, + 5, 254, 148, 38, 88, 30, 5, 227, 49, 38, 88, 30, 5, 254, 108, 38, 88, 30, + 5, 88, 254, 108, 38, 88, 30, 5, 227, 121, 49, 38, 88, 5, 232, 9, 234, + 235, 38, 88, 5, 216, 240, 38, 88, 5, 216, 239, 38, 88, 5, 234, 106, 216, + 238, 38, 88, 5, 234, 106, 216, 237, 38, 88, 5, 234, 106, 216, 236, 38, + 88, 5, 224, 77, 242, 26, 38, 88, 5, 232, 9, 222, 168, 38, 88, 5, 234, + 105, 234, 220, 38, 88, 37, 249, 55, 247, 74, 38, 88, 241, 33, 21, 212, + 79, 38, 88, 241, 33, 21, 116, 38, 88, 241, 33, 21, 109, 38, 88, 241, 33, + 21, 166, 38, 88, 241, 33, 21, 163, 38, 88, 241, 33, 21, 180, 38, 88, 241, + 33, 21, 189, 38, 88, 241, 33, 21, 198, 38, 88, 241, 33, 21, 195, 38, 88, + 241, 33, 21, 200, 38, 88, 88, 21, 212, 79, 38, 88, 88, 21, 116, 38, 88, + 88, 21, 109, 38, 88, 88, 21, 166, 38, 88, 88, 21, 163, 38, 88, 88, 21, + 180, 38, 88, 88, 21, 189, 38, 88, 88, 21, 198, 38, 88, 88, 21, 195, 38, + 88, 88, 21, 200, 38, 88, 5, 213, 234, 38, 88, 5, 213, 233, 38, 88, 5, + 222, 133, 38, 88, 5, 234, 166, 38, 88, 5, 240, 219, 38, 88, 5, 247, 88, + 38, 88, 5, 223, 202, 223, 89, 224, 41, 38, 88, 5, 232, 9, 213, 61, 38, + 88, 5, 235, 10, 38, 88, 5, 235, 9, 38, 88, 5, 222, 139, 38, 88, 5, 222, + 138, 38, 88, 5, 241, 248, 38, 88, 5, 250, 216, 99, 5, 215, 170, 223, 183, + 99, 5, 215, 170, 250, 189, 99, 5, 250, 120, 99, 5, 218, 215, 99, 5, 251, + 156, 99, 1, 254, 92, 99, 1, 254, 93, 217, 221, 99, 1, 236, 24, 99, 1, + 236, 25, 217, 221, 99, 1, 215, 173, 99, 1, 215, 174, 217, 221, 99, 1, + 224, 77, 223, 229, 99, 1, 224, 77, 223, 230, 217, 221, 99, 1, 233, 158, + 233, 48, 99, 1, 233, 158, 233, 49, 217, 221, 99, 1, 245, 136, 99, 1, 254, + 106, 99, 1, 227, 78, 99, 1, 227, 79, 217, 221, 99, 1, 181, 99, 1, 235, + 17, 232, 12, 99, 1, 243, 110, 99, 1, 243, 111, 242, 137, 99, 1, 229, 159, + 99, 1, 250, 219, 99, 1, 250, 220, 233, 146, 99, 1, 235, 139, 99, 1, 235, + 140, 235, 119, 99, 1, 228, 23, 99, 1, 218, 53, 233, 99, 99, 1, 218, 53, + 230, 137, 232, 12, 99, 1, 248, 165, 230, 137, 254, 54, 99, 1, 248, 165, + 230, 137, 232, 12, 99, 1, 230, 46, 224, 44, 99, 1, 218, 52, 99, 1, 218, + 53, 217, 242, 99, 1, 248, 164, 99, 1, 248, 165, 232, 30, 99, 1, 205, 99, + 1, 193, 99, 1, 226, 214, 234, 231, 99, 1, 252, 107, 99, 1, 252, 108, 234, + 178, 99, 1, 188, 99, 1, 186, 99, 1, 203, 99, 1, 233, 157, 99, 1, 214, 49, + 99, 1, 222, 203, 222, 189, 99, 1, 222, 203, 222, 149, 99, 1, 222, 202, + 99, 1, 159, 99, 5, 223, 222, 99, 30, 5, 217, 221, 99, 30, 5, 215, 169, + 99, 30, 5, 215, 170, 222, 145, 99, 30, 5, 218, 248, 99, 30, 5, 218, 249, + 236, 16, 99, 30, 5, 224, 77, 223, 229, 99, 30, 5, 224, 77, 223, 230, 217, + 221, 99, 30, 5, 233, 158, 233, 48, 99, 30, 5, 233, 158, 233, 49, 217, + 221, 99, 30, 5, 218, 16, 99, 30, 5, 218, 17, 223, 229, 99, 30, 5, 218, + 17, 217, 221, 99, 30, 5, 218, 17, 223, 230, 217, 221, 99, 30, 5, 226, 59, + 99, 30, 5, 226, 60, 217, 221, 99, 254, 155, 254, 154, 99, 1, 234, 255, + 222, 144, 99, 1, 234, 110, 222, 144, 99, 1, 216, 0, 222, 144, 99, 1, 245, + 160, 222, 144, 99, 1, 214, 233, 222, 144, 99, 1, 212, 100, 222, 144, 99, + 1, 253, 125, 222, 144, 99, 21, 212, 79, 99, 21, 116, 99, 21, 109, 99, 21, + 166, 99, 21, 163, 99, 21, 180, 99, 21, 189, 99, 21, 198, 99, 21, 195, 99, + 21, 200, 99, 226, 157, 99, 226, 182, 99, 213, 223, 99, 250, 168, 226, + 175, 99, 250, 168, 220, 98, 99, 250, 168, 226, 130, 99, 226, 181, 99, 27, + 16, 247, 80, 99, 27, 16, 248, 2, 99, 27, 16, 246, 19, 99, 27, 16, 248, + 121, 99, 27, 16, 248, 122, 218, 215, 99, 27, 16, 247, 157, 99, 27, 16, + 248, 157, 99, 27, 16, 247, 240, 99, 27, 16, 248, 143, 99, 27, 16, 248, + 122, 243, 33, 99, 27, 16, 37, 217, 217, 99, 27, 16, 37, 245, 99, 99, 27, + 16, 37, 234, 173, 99, 27, 16, 37, 234, 175, 99, 27, 16, 37, 235, 123, 99, + 27, 16, 37, 234, 174, 2, 235, 123, 99, 27, 16, 37, 234, 176, 2, 235, 123, + 99, 27, 16, 37, 251, 214, 99, 27, 16, 37, 242, 141, 99, 27, 16, 223, 146, + 227, 40, 246, 29, 99, 27, 16, 223, 146, 227, 40, 248, 155, 99, 27, 16, + 223, 146, 249, 193, 216, 75, 99, 27, 16, 223, 146, 249, 193, 218, 23, 99, + 27, 16, 233, 68, 227, 40, 226, 170, 99, 27, 16, 233, 68, 227, 40, 225, + 25, 99, 27, 16, 233, 68, 249, 193, 225, 170, 99, 27, 16, 233, 68, 249, + 193, 225, 160, 99, 27, 16, 233, 68, 227, 40, 225, 193, 218, 237, 5, 226, + 154, 218, 237, 5, 226, 166, 218, 237, 5, 226, 163, 218, 237, 1, 61, 218, + 237, 1, 72, 218, 237, 1, 69, 218, 237, 1, 254, 148, 218, 237, 1, 75, 218, + 237, 1, 74, 218, 237, 1, 245, 22, 218, 237, 1, 181, 218, 237, 1, 224, + 232, 218, 237, 1, 243, 110, 218, 237, 1, 229, 159, 218, 237, 1, 250, 219, + 218, 237, 1, 235, 139, 218, 237, 1, 212, 109, 218, 237, 1, 228, 23, 218, + 237, 1, 218, 52, 218, 237, 1, 248, 164, 218, 237, 1, 205, 218, 237, 1, + 193, 218, 237, 1, 244, 164, 218, 237, 1, 215, 1, 218, 237, 1, 252, 107, + 218, 237, 1, 188, 218, 237, 1, 186, 218, 237, 1, 203, 218, 237, 1, 233, + 157, 218, 237, 1, 214, 49, 218, 237, 1, 222, 202, 218, 237, 1, 213, 153, + 218, 237, 1, 159, 218, 237, 249, 133, 5, 226, 179, 218, 237, 249, 133, 5, + 226, 156, 218, 237, 249, 133, 5, 226, 153, 218, 237, 30, 5, 226, 169, + 218, 237, 30, 5, 226, 152, 218, 237, 30, 5, 226, 173, 218, 237, 30, 5, + 226, 162, 218, 237, 30, 5, 226, 180, 218, 237, 30, 5, 226, 171, 218, 237, + 5, 226, 183, 218, 237, 1, 234, 138, 218, 237, 1, 218, 176, 218, 237, 21, + 212, 79, 218, 237, 21, 116, 218, 237, 21, 109, 218, 237, 21, 166, 218, + 237, 21, 163, 218, 237, 21, 180, 218, 237, 21, 189, 218, 237, 21, 198, + 218, 237, 21, 195, 218, 237, 21, 200, 252, 40, 1, 61, 252, 40, 1, 220, + 90, 61, 252, 40, 1, 159, 252, 40, 1, 220, 90, 159, 252, 40, 1, 231, 244, + 159, 252, 40, 1, 252, 107, 252, 40, 1, 234, 217, 252, 107, 252, 40, 1, + 193, 252, 40, 1, 220, 90, 193, 252, 40, 1, 205, 252, 40, 1, 231, 244, + 205, 252, 40, 1, 214, 49, 252, 40, 1, 220, 90, 214, 49, 252, 40, 1, 226, + 194, 214, 49, 252, 40, 1, 243, 110, 252, 40, 1, 220, 90, 243, 110, 252, + 40, 1, 235, 139, 252, 40, 1, 248, 164, 252, 40, 1, 203, 252, 40, 1, 220, + 90, 203, 252, 40, 1, 188, 252, 40, 1, 220, 90, 188, 252, 40, 1, 219, 213, + 218, 52, 252, 40, 1, 228, 166, 218, 52, 252, 40, 1, 222, 202, 252, 40, 1, + 220, 90, 222, 202, 252, 40, 1, 231, 244, 222, 202, 252, 40, 1, 186, 252, + 40, 1, 220, 90, 186, 252, 40, 1, 229, 159, 252, 40, 1, 233, 157, 252, 40, + 1, 220, 90, 233, 157, 252, 40, 1, 228, 23, 252, 40, 1, 250, 219, 252, 40, + 1, 229, 228, 252, 40, 1, 231, 187, 252, 40, 1, 72, 252, 40, 1, 69, 252, + 40, 5, 216, 244, 252, 40, 30, 5, 74, 252, 40, 30, 5, 226, 194, 74, 252, + 40, 30, 5, 245, 165, 252, 40, 30, 5, 72, 252, 40, 30, 5, 234, 217, 72, + 252, 40, 30, 5, 75, 252, 40, 30, 5, 234, 217, 75, 252, 40, 30, 5, 69, + 252, 40, 30, 5, 111, 31, 220, 90, 222, 202, 252, 40, 249, 133, 5, 229, + 161, 252, 40, 249, 133, 5, 242, 41, 252, 40, 226, 165, 252, 40, 226, 161, + 252, 40, 16, 251, 164, 230, 46, 231, 104, 252, 40, 16, 251, 164, 225, + 196, 252, 40, 16, 251, 164, 235, 51, 252, 40, 16, 251, 164, 226, 165, + 182, 1, 181, 182, 1, 234, 48, 182, 1, 234, 138, 182, 1, 243, 110, 182, 1, + 242, 162, 182, 1, 229, 159, 182, 1, 250, 219, 182, 1, 250, 92, 182, 1, + 235, 139, 182, 1, 228, 23, 182, 1, 218, 52, 182, 1, 217, 161, 182, 1, + 248, 164, 182, 1, 205, 182, 1, 193, 182, 1, 225, 174, 182, 1, 226, 23, + 182, 1, 244, 164, 182, 1, 244, 44, 182, 1, 252, 107, 182, 1, 251, 145, + 182, 1, 188, 182, 1, 230, 237, 182, 1, 216, 141, 182, 1, 216, 133, 182, + 1, 245, 249, 182, 1, 186, 182, 1, 203, 182, 1, 233, 157, 182, 1, 159, + 182, 1, 241, 139, 182, 1, 215, 1, 182, 1, 222, 202, 182, 1, 221, 24, 182, + 1, 214, 49, 182, 1, 61, 182, 219, 18, 1, 186, 182, 219, 18, 1, 203, 182, + 30, 5, 254, 232, 182, 30, 5, 72, 182, 30, 5, 75, 182, 30, 5, 227, 49, + 182, 30, 5, 69, 182, 30, 5, 215, 92, 182, 30, 5, 74, 182, 249, 133, 5, + 235, 27, 182, 249, 133, 5, 183, 182, 249, 133, 5, 150, 182, 249, 133, 5, + 204, 182, 249, 133, 5, 226, 229, 182, 249, 133, 5, 149, 182, 249, 133, 5, + 218, 99, 182, 249, 133, 5, 228, 5, 182, 249, 133, 5, 234, 235, 182, 5, + 224, 42, 182, 5, 228, 60, 182, 225, 27, 218, 51, 182, 225, 27, 228, 13, + 217, 74, 218, 51, 182, 225, 27, 250, 98, 182, 225, 27, 216, 128, 250, 98, + 182, 225, 27, 216, 127, 182, 21, 212, 79, 182, 21, 116, 182, 21, 109, + 182, 21, 166, 182, 21, 163, 182, 21, 180, 182, 21, 189, 182, 21, 198, + 182, 21, 195, 182, 21, 200, 182, 1, 216, 115, 182, 1, 216, 105, 182, 1, + 248, 86, 227, 76, 250, 40, 21, 212, 79, 227, 76, 250, 40, 21, 116, 227, + 76, 250, 40, 21, 109, 227, 76, 250, 40, 21, 166, 227, 76, 250, 40, 21, + 163, 227, 76, 250, 40, 21, 180, 227, 76, 250, 40, 21, 189, 227, 76, 250, + 40, 21, 198, 227, 76, 250, 40, 21, 195, 227, 76, 250, 40, 21, 200, 227, + 76, 250, 40, 1, 233, 157, 227, 76, 250, 40, 1, 253, 122, 227, 76, 250, + 40, 1, 254, 121, 227, 76, 250, 40, 1, 254, 24, 227, 76, 250, 40, 1, 254, + 86, 227, 76, 250, 40, 1, 233, 156, 227, 76, 250, 40, 1, 254, 194, 227, + 76, 250, 40, 1, 254, 195, 227, 76, 250, 40, 1, 254, 193, 227, 76, 250, + 40, 1, 254, 189, 227, 76, 250, 40, 1, 233, 13, 227, 76, 250, 40, 1, 235, + 169, 227, 76, 250, 40, 1, 236, 29, 227, 76, 250, 40, 1, 235, 188, 227, + 76, 250, 40, 1, 235, 177, 227, 76, 250, 40, 1, 232, 156, 227, 76, 250, + 40, 1, 215, 190, 227, 76, 250, 40, 1, 215, 188, 227, 76, 250, 40, 1, 215, + 139, 227, 76, 250, 40, 1, 215, 85, 227, 76, 250, 40, 1, 233, 82, 227, 76, + 250, 40, 1, 245, 70, 227, 76, 250, 40, 1, 245, 168, 227, 76, 250, 40, 1, + 245, 108, 227, 76, 250, 40, 1, 245, 49, 227, 76, 250, 40, 1, 232, 208, + 227, 76, 250, 40, 1, 227, 5, 227, 76, 250, 40, 1, 227, 116, 227, 76, 250, + 40, 1, 226, 249, 227, 76, 250, 40, 1, 227, 88, 227, 76, 250, 40, 230, + 173, 216, 84, 227, 76, 250, 40, 243, 105, 216, 85, 227, 76, 250, 40, 230, + 171, 216, 85, 227, 76, 250, 40, 223, 242, 227, 76, 250, 40, 226, 21, 227, + 76, 250, 40, 254, 113, 227, 76, 250, 40, 225, 27, 230, 168, 227, 76, 250, + 40, 225, 27, 51, 230, 168, 214, 229, 160, 234, 215, 214, 229, 160, 221, + 0, 214, 229, 160, 225, 78, 214, 229, 5, 229, 40, 214, 229, 5, 213, 69, + 231, 35, 218, 201, 214, 229, 160, 213, 69, 254, 118, 235, 240, 218, 201, + 214, 229, 160, 213, 69, 235, 240, 218, 201, 214, 229, 160, 213, 69, 234, + 203, 235, 240, 218, 201, 214, 229, 160, 250, 190, 55, 214, 229, 160, 213, + 69, 234, 203, 235, 240, 218, 202, 222, 115, 214, 229, 160, 51, 218, 201, + 214, 229, 160, 216, 169, 218, 201, 214, 229, 160, 234, 203, 253, 244, + 214, 229, 160, 62, 55, 214, 229, 160, 117, 176, 55, 214, 229, 160, 133, + 176, 55, 214, 229, 160, 223, 137, 234, 214, 235, 240, 218, 201, 214, 229, + 160, 253, 120, 235, 240, 218, 201, 214, 229, 5, 214, 129, 218, 201, 214, + 229, 5, 214, 129, 215, 185, 214, 229, 5, 223, 202, 214, 129, 215, 185, + 214, 229, 5, 214, 129, 253, 244, 214, 229, 5, 223, 202, 214, 129, 253, + 244, 214, 229, 5, 214, 129, 215, 186, 2, 218, 27, 214, 229, 5, 214, 129, + 253, 245, 2, 218, 27, 214, 229, 5, 253, 243, 254, 2, 214, 229, 5, 253, + 243, 252, 85, 214, 229, 5, 253, 243, 214, 252, 214, 229, 5, 253, 243, + 214, 253, 2, 218, 27, 214, 229, 5, 217, 21, 214, 229, 5, 241, 176, 184, + 253, 242, 214, 229, 5, 184, 253, 242, 214, 229, 5, 223, 53, 184, 253, + 242, 214, 229, 5, 253, 243, 215, 192, 230, 160, 214, 229, 5, 253, 190, 7, + 1, 3, 6, 61, 7, 1, 3, 6, 254, 148, 7, 3, 1, 216, 58, 254, 148, 7, 1, 3, + 6, 252, 54, 253, 74, 7, 1, 3, 6, 250, 252, 7, 1, 3, 6, 249, 3, 7, 1, 3, + 6, 245, 25, 7, 1, 3, 6, 74, 7, 3, 1, 216, 58, 227, 40, 74, 7, 3, 1, 216, + 58, 72, 7, 1, 3, 6, 235, 142, 7, 1, 3, 6, 235, 27, 7, 1, 3, 6, 233, 171, + 2, 90, 7, 1, 3, 6, 183, 7, 1, 3, 6, 223, 202, 204, 7, 1, 3, 6, 75, 7, 1, + 3, 6, 227, 40, 75, 7, 3, 1, 220, 113, 75, 7, 3, 1, 220, 113, 227, 40, 75, + 7, 3, 1, 220, 113, 157, 2, 90, 7, 3, 1, 216, 58, 227, 99, 7, 1, 3, 6, + 227, 2, 7, 3, 1, 216, 227, 151, 75, 7, 3, 1, 251, 101, 151, 75, 7, 1, 3, + 6, 226, 229, 7, 1, 3, 6, 223, 202, 149, 7, 1, 3, 6, 216, 58, 149, 7, 1, + 3, 6, 218, 99, 7, 1, 3, 6, 69, 7, 3, 1, 220, 113, 69, 7, 3, 1, 220, 113, + 247, 208, 69, 7, 3, 1, 220, 113, 216, 58, 183, 7, 1, 3, 6, 215, 79, 7, 1, + 3, 6, 214, 82, 7, 1, 3, 6, 212, 152, 7, 1, 3, 6, 244, 232, 7, 1, 214, + 116, 233, 105, 219, 182, 7, 1, 254, 103, 25, 1, 3, 6, 243, 83, 25, 1, 3, + 6, 233, 122, 25, 1, 3, 6, 225, 240, 25, 1, 3, 6, 223, 190, 25, 1, 3, 6, + 225, 46, 33, 1, 3, 6, 245, 131, 59, 1, 6, 61, 59, 1, 6, 254, 148, 59, 1, + 6, 253, 74, 59, 1, 6, 252, 54, 253, 74, 59, 1, 6, 249, 3, 59, 1, 6, 74, + 59, 1, 6, 223, 202, 74, 59, 1, 6, 243, 177, 59, 1, 6, 242, 41, 59, 1, 6, + 72, 59, 1, 6, 235, 142, 59, 1, 6, 235, 27, 59, 1, 6, 150, 59, 1, 6, 183, + 59, 1, 6, 204, 59, 1, 6, 223, 202, 204, 59, 1, 6, 75, 59, 1, 6, 227, 2, + 59, 1, 6, 226, 229, 59, 1, 6, 149, 59, 1, 6, 218, 99, 59, 1, 6, 69, 59, + 1, 6, 214, 82, 59, 1, 3, 61, 59, 1, 3, 216, 58, 61, 59, 1, 3, 254, 52, + 59, 1, 3, 216, 58, 254, 148, 59, 1, 3, 253, 74, 59, 1, 3, 249, 3, 59, 1, + 3, 74, 59, 1, 3, 222, 113, 59, 1, 3, 227, 40, 74, 59, 1, 3, 216, 58, 227, + 40, 74, 59, 1, 3, 243, 177, 59, 1, 3, 216, 58, 72, 59, 1, 3, 235, 27, 59, + 1, 3, 183, 59, 1, 3, 245, 96, 59, 1, 3, 75, 59, 1, 3, 227, 40, 75, 59, 1, + 3, 216, 227, 151, 75, 59, 1, 3, 251, 101, 151, 75, 59, 1, 3, 226, 229, + 59, 1, 3, 218, 99, 59, 1, 3, 69, 59, 1, 3, 220, 113, 69, 59, 1, 3, 216, + 58, 183, 59, 1, 3, 215, 79, 59, 1, 3, 254, 103, 59, 1, 3, 251, 203, 59, + 1, 3, 25, 243, 83, 59, 1, 3, 248, 5, 59, 1, 3, 25, 226, 9, 59, 1, 3, 250, + 47, 7, 219, 10, 3, 1, 72, 7, 219, 10, 3, 1, 149, 7, 219, 10, 3, 1, 69, 7, + 219, 10, 3, 1, 215, 79, 25, 219, 10, 3, 1, 251, 203, 25, 219, 10, 3, 1, + 243, 83, 25, 219, 10, 3, 1, 223, 190, 25, 219, 10, 3, 1, 226, 9, 25, 219, + 10, 3, 1, 250, 47, 7, 3, 1, 215, 183, 7, 3, 1, 54, 2, 231, 37, 217, 42, + 7, 3, 1, 249, 4, 2, 231, 37, 217, 42, 7, 3, 1, 244, 231, 2, 231, 37, 217, + 42, 7, 3, 1, 232, 110, 2, 231, 37, 217, 42, 7, 3, 1, 230, 98, 2, 231, 37, + 217, 42, 7, 3, 1, 226, 230, 2, 231, 37, 217, 42, 7, 3, 1, 224, 113, 2, + 231, 37, 217, 42, 7, 3, 1, 224, 113, 2, 244, 57, 24, 231, 37, 217, 42, 7, + 3, 1, 223, 4, 2, 231, 37, 217, 42, 7, 3, 1, 218, 100, 2, 231, 37, 217, + 42, 7, 3, 1, 212, 153, 2, 231, 37, 217, 42, 7, 3, 1, 216, 58, 243, 177, + 59, 1, 33, 245, 108, 7, 3, 1, 235, 210, 243, 177, 7, 3, 1, 217, 164, 2, + 219, 47, 7, 3, 6, 1, 240, 146, 2, 90, 7, 3, 1, 235, 184, 2, 90, 7, 3, 1, + 226, 230, 2, 90, 7, 3, 6, 1, 111, 2, 90, 7, 3, 1, 215, 129, 2, 90, 7, 3, + 1, 54, 2, 226, 193, 101, 7, 3, 1, 249, 4, 2, 226, 193, 101, 7, 3, 1, 244, + 231, 2, 226, 193, 101, 7, 3, 1, 243, 178, 2, 226, 193, 101, 7, 3, 1, 235, + 28, 2, 226, 193, 101, 7, 3, 1, 233, 171, 2, 226, 193, 101, 7, 3, 1, 232, + 110, 2, 226, 193, 101, 7, 3, 1, 230, 98, 2, 226, 193, 101, 7, 3, 1, 226, + 230, 2, 226, 193, 101, 7, 3, 1, 224, 113, 2, 226, 193, 101, 7, 3, 1, 223, + 4, 2, 226, 193, 101, 7, 3, 1, 245, 41, 2, 226, 193, 101, 7, 3, 1, 215, + 80, 2, 226, 193, 101, 7, 3, 1, 213, 167, 2, 226, 193, 101, 7, 3, 1, 212, + 153, 2, 226, 193, 101, 7, 3, 1, 118, 2, 223, 207, 101, 7, 3, 1, 254, 53, + 2, 223, 207, 101, 7, 3, 1, 249, 4, 2, 241, 38, 24, 218, 27, 7, 3, 1, 191, + 2, 223, 207, 101, 7, 3, 1, 227, 40, 191, 2, 223, 207, 101, 7, 3, 1, 223, + 202, 227, 40, 191, 2, 223, 207, 101, 7, 3, 1, 222, 114, 2, 223, 207, 101, + 7, 3, 1, 240, 146, 2, 223, 207, 101, 7, 3, 1, 227, 40, 157, 2, 223, 207, + 101, 7, 3, 1, 245, 41, 2, 223, 207, 101, 7, 3, 1, 111, 2, 223, 207, 101, + 7, 3, 1, 244, 233, 2, 223, 207, 101, 59, 1, 3, 216, 58, 254, 52, 59, 1, + 3, 250, 252, 59, 1, 3, 250, 253, 2, 249, 41, 59, 1, 3, 245, 25, 59, 1, 3, + 223, 202, 227, 40, 74, 59, 1, 3, 244, 230, 59, 1, 3, 247, 73, 235, 143, + 2, 90, 59, 1, 3, 113, 243, 177, 59, 1, 3, 216, 58, 242, 41, 59, 1, 3, + 240, 146, 2, 90, 59, 1, 3, 235, 183, 59, 1, 3, 6, 72, 59, 1, 3, 6, 240, + 146, 2, 90, 59, 1, 3, 235, 143, 2, 249, 67, 59, 1, 3, 233, 171, 2, 223, + 207, 101, 59, 1, 3, 233, 171, 2, 226, 193, 101, 59, 1, 3, 6, 150, 59, 1, + 3, 232, 110, 2, 101, 59, 1, 3, 216, 58, 232, 110, 2, 184, 233, 60, 59, 1, + 3, 230, 98, 2, 42, 101, 59, 1, 3, 230, 98, 2, 223, 207, 101, 59, 1, 3, 6, + 204, 59, 1, 3, 252, 54, 75, 59, 1, 3, 226, 9, 59, 1, 3, 223, 4, 2, 101, + 59, 1, 3, 245, 40, 59, 1, 3, 218, 100, 2, 226, 193, 101, 59, 1, 3, 111, + 134, 59, 1, 3, 215, 128, 59, 1, 3, 6, 69, 59, 1, 3, 215, 80, 2, 101, 59, + 1, 3, 216, 58, 215, 79, 59, 1, 3, 212, 152, 59, 1, 3, 212, 153, 2, 223, + 207, 101, 59, 1, 3, 212, 153, 2, 249, 41, 59, 1, 3, 244, 232, 59, 1, 3, + 217, 132, 37, 246, 72, 242, 114, 254, 174, 37, 246, 72, 254, 164, 254, + 174, 37, 219, 253, 55, 37, 218, 207, 77, 37, 232, 36, 37, 242, 111, 37, + 232, 34, 37, 254, 162, 37, 242, 112, 37, 254, 163, 37, 7, 3, 1, 224, 113, + 55, 37, 251, 73, 37, 232, 35, 37, 51, 249, 224, 49, 37, 227, 91, 49, 37, + 212, 28, 55, 37, 235, 170, 55, 37, 215, 122, 49, 37, 215, 105, 49, 37, 7, + 3, 1, 244, 32, 227, 40, 118, 49, 37, 7, 3, 1, 254, 148, 37, 7, 3, 1, 253, + 240, 37, 7, 3, 1, 253, 92, 37, 7, 3, 1, 250, 253, 250, 117, 37, 7, 3, 1, + 235, 210, 249, 3, 37, 7, 3, 1, 245, 25, 37, 7, 3, 1, 243, 177, 37, 7, 1, + 3, 6, 243, 177, 37, 7, 3, 1, 235, 27, 37, 7, 3, 1, 150, 37, 7, 1, 3, 6, + 150, 37, 7, 1, 3, 6, 183, 37, 7, 3, 1, 204, 37, 7, 1, 3, 6, 204, 37, 7, + 1, 3, 6, 149, 37, 7, 3, 1, 224, 113, 223, 88, 37, 7, 3, 1, 197, 37, 7, 3, + 1, 184, 197, 37, 7, 3, 1, 212, 152, 37, 51, 235, 191, 251, 75, 55, 37, + 254, 57, 123, 211, 211, 55, 37, 42, 253, 165, 49, 37, 46, 253, 165, 24, + 119, 253, 165, 55, 7, 6, 1, 118, 2, 223, 131, 55, 7, 3, 1, 118, 2, 223, + 131, 55, 7, 6, 1, 54, 2, 62, 49, 7, 3, 1, 54, 2, 62, 49, 7, 6, 1, 54, 2, + 62, 55, 7, 3, 1, 54, 2, 62, 55, 7, 6, 1, 54, 2, 232, 243, 55, 7, 3, 1, + 54, 2, 232, 243, 55, 7, 6, 1, 250, 253, 2, 250, 118, 24, 179, 7, 3, 1, + 250, 253, 2, 250, 118, 24, 179, 7, 6, 1, 249, 4, 2, 62, 49, 7, 3, 1, 249, + 4, 2, 62, 49, 7, 6, 1, 249, 4, 2, 62, 55, 7, 3, 1, 249, 4, 2, 62, 55, 7, + 6, 1, 249, 4, 2, 232, 243, 55, 7, 3, 1, 249, 4, 2, 232, 243, 55, 7, 6, 1, + 249, 4, 2, 250, 117, 7, 3, 1, 249, 4, 2, 250, 117, 7, 6, 1, 249, 4, 2, + 249, 224, 55, 7, 3, 1, 249, 4, 2, 249, 224, 55, 7, 6, 1, 191, 2, 232, 38, + 24, 242, 113, 7, 3, 1, 191, 2, 232, 38, 24, 242, 113, 7, 6, 1, 191, 2, + 232, 38, 24, 179, 7, 3, 1, 191, 2, 232, 38, 24, 179, 7, 6, 1, 191, 2, + 249, 224, 55, 7, 3, 1, 191, 2, 249, 224, 55, 7, 6, 1, 191, 2, 217, 43, + 55, 7, 3, 1, 191, 2, 217, 43, 55, 7, 6, 1, 191, 2, 250, 118, 24, 251, 74, + 7, 3, 1, 191, 2, 250, 118, 24, 251, 74, 7, 6, 1, 244, 231, 2, 62, 49, 7, + 3, 1, 244, 231, 2, 62, 49, 7, 6, 1, 243, 178, 2, 232, 37, 7, 3, 1, 243, + 178, 2, 232, 37, 7, 6, 1, 242, 42, 2, 62, 49, 7, 3, 1, 242, 42, 2, 62, + 49, 7, 6, 1, 242, 42, 2, 62, 55, 7, 3, 1, 242, 42, 2, 62, 55, 7, 6, 1, + 242, 42, 2, 247, 209, 7, 3, 1, 242, 42, 2, 247, 209, 7, 6, 1, 242, 42, 2, + 250, 117, 7, 3, 1, 242, 42, 2, 250, 117, 7, 6, 1, 242, 42, 2, 251, 75, + 55, 7, 3, 1, 242, 42, 2, 251, 75, 55, 7, 6, 1, 240, 146, 2, 217, 43, 55, + 7, 3, 1, 240, 146, 2, 217, 43, 55, 7, 6, 1, 240, 146, 2, 247, 210, 24, + 179, 7, 3, 1, 240, 146, 2, 247, 210, 24, 179, 7, 6, 1, 235, 28, 2, 179, + 7, 3, 1, 235, 28, 2, 179, 7, 6, 1, 235, 28, 2, 62, 55, 7, 3, 1, 235, 28, + 2, 62, 55, 7, 6, 1, 235, 28, 2, 232, 243, 55, 7, 3, 1, 235, 28, 2, 232, + 243, 55, 7, 6, 1, 233, 171, 2, 62, 55, 7, 3, 1, 233, 171, 2, 62, 55, 7, + 6, 1, 233, 171, 2, 62, 251, 220, 24, 232, 37, 7, 3, 1, 233, 171, 2, 62, + 251, 220, 24, 232, 37, 7, 6, 1, 233, 171, 2, 232, 243, 55, 7, 3, 1, 233, + 171, 2, 232, 243, 55, 7, 6, 1, 233, 171, 2, 249, 224, 55, 7, 3, 1, 233, + 171, 2, 249, 224, 55, 7, 6, 1, 232, 110, 2, 179, 7, 3, 1, 232, 110, 2, + 179, 7, 6, 1, 232, 110, 2, 62, 49, 7, 3, 1, 232, 110, 2, 62, 49, 7, 6, 1, + 232, 110, 2, 62, 55, 7, 3, 1, 232, 110, 2, 62, 55, 7, 6, 1, 230, 98, 2, + 62, 49, 7, 3, 1, 230, 98, 2, 62, 49, 7, 6, 1, 230, 98, 2, 62, 55, 7, 3, + 1, 230, 98, 2, 62, 55, 7, 6, 1, 230, 98, 2, 232, 243, 55, 7, 3, 1, 230, + 98, 2, 232, 243, 55, 7, 6, 1, 230, 98, 2, 249, 224, 55, 7, 3, 1, 230, 98, + 2, 249, 224, 55, 7, 6, 1, 157, 2, 217, 43, 24, 179, 7, 3, 1, 157, 2, 217, + 43, 24, 179, 7, 6, 1, 157, 2, 217, 43, 24, 247, 209, 7, 3, 1, 157, 2, + 217, 43, 24, 247, 209, 7, 6, 1, 157, 2, 232, 38, 24, 242, 113, 7, 3, 1, + 157, 2, 232, 38, 24, 242, 113, 7, 6, 1, 157, 2, 232, 38, 24, 179, 7, 3, + 1, 157, 2, 232, 38, 24, 179, 7, 6, 1, 226, 230, 2, 179, 7, 3, 1, 226, + 230, 2, 179, 7, 6, 1, 226, 230, 2, 62, 49, 7, 3, 1, 226, 230, 2, 62, 49, + 7, 6, 1, 224, 113, 2, 62, 49, 7, 3, 1, 224, 113, 2, 62, 49, 7, 6, 1, 224, + 113, 2, 62, 55, 7, 3, 1, 224, 113, 2, 62, 55, 7, 6, 1, 224, 113, 2, 62, + 251, 220, 24, 232, 37, 7, 3, 1, 224, 113, 2, 62, 251, 220, 24, 232, 37, + 7, 6, 1, 224, 113, 2, 232, 243, 55, 7, 3, 1, 224, 113, 2, 232, 243, 55, + 7, 6, 1, 223, 4, 2, 62, 49, 7, 3, 1, 223, 4, 2, 62, 49, 7, 6, 1, 223, 4, + 2, 62, 55, 7, 3, 1, 223, 4, 2, 62, 55, 7, 6, 1, 223, 4, 2, 254, 164, 24, + 62, 49, 7, 3, 1, 223, 4, 2, 254, 164, 24, 62, 49, 7, 6, 1, 223, 4, 2, + 250, 167, 24, 62, 49, 7, 3, 1, 223, 4, 2, 250, 167, 24, 62, 49, 7, 6, 1, + 223, 4, 2, 62, 251, 220, 24, 62, 49, 7, 3, 1, 223, 4, 2, 62, 251, 220, + 24, 62, 49, 7, 6, 1, 218, 100, 2, 62, 49, 7, 3, 1, 218, 100, 2, 62, 49, + 7, 6, 1, 218, 100, 2, 62, 55, 7, 3, 1, 218, 100, 2, 62, 55, 7, 6, 1, 218, + 100, 2, 232, 243, 55, 7, 3, 1, 218, 100, 2, 232, 243, 55, 7, 6, 1, 218, + 100, 2, 249, 224, 55, 7, 3, 1, 218, 100, 2, 249, 224, 55, 7, 6, 1, 111, + 2, 247, 210, 55, 7, 3, 1, 111, 2, 247, 210, 55, 7, 6, 1, 111, 2, 217, 43, + 55, 7, 3, 1, 111, 2, 217, 43, 55, 7, 6, 1, 111, 2, 249, 224, 55, 7, 3, 1, + 111, 2, 249, 224, 55, 7, 6, 1, 111, 2, 217, 43, 24, 179, 7, 3, 1, 111, 2, + 217, 43, 24, 179, 7, 6, 1, 111, 2, 232, 38, 24, 247, 209, 7, 3, 1, 111, + 2, 232, 38, 24, 247, 209, 7, 6, 1, 215, 80, 2, 217, 42, 7, 3, 1, 215, 80, + 2, 217, 42, 7, 6, 1, 215, 80, 2, 62, 55, 7, 3, 1, 215, 80, 2, 62, 55, 7, + 6, 1, 214, 83, 2, 242, 113, 7, 3, 1, 214, 83, 2, 242, 113, 7, 6, 1, 214, + 83, 2, 179, 7, 3, 1, 214, 83, 2, 179, 7, 6, 1, 214, 83, 2, 247, 209, 7, + 3, 1, 214, 83, 2, 247, 209, 7, 6, 1, 214, 83, 2, 62, 49, 7, 3, 1, 214, + 83, 2, 62, 49, 7, 6, 1, 214, 83, 2, 62, 55, 7, 3, 1, 214, 83, 2, 62, 55, + 7, 6, 1, 213, 167, 2, 62, 49, 7, 3, 1, 213, 167, 2, 62, 49, 7, 6, 1, 213, + 167, 2, 247, 209, 7, 3, 1, 213, 167, 2, 247, 209, 7, 6, 1, 213, 106, 2, + 62, 49, 7, 3, 1, 213, 106, 2, 62, 49, 7, 6, 1, 212, 153, 2, 249, 223, 7, + 3, 1, 212, 153, 2, 249, 223, 7, 6, 1, 212, 153, 2, 62, 55, 7, 3, 1, 212, + 153, 2, 62, 55, 7, 6, 1, 212, 153, 2, 232, 243, 55, 7, 3, 1, 212, 153, 2, + 232, 243, 55, 7, 3, 1, 242, 42, 2, 232, 243, 55, 7, 3, 1, 218, 100, 2, + 247, 209, 7, 3, 1, 214, 83, 2, 223, 131, 49, 7, 3, 1, 213, 106, 2, 223, + 131, 49, 7, 3, 1, 118, 2, 46, 151, 223, 130, 7, 3, 1, 184, 223, 4, 2, 62, + 49, 7, 3, 1, 184, 223, 4, 2, 247, 207, 90, 7, 3, 1, 184, 223, 4, 2, 124, + 90, 7, 6, 1, 220, 255, 197, 7, 3, 1, 248, 5, 7, 6, 1, 118, 2, 62, 55, 7, + 3, 1, 118, 2, 62, 55, 7, 6, 1, 118, 2, 241, 38, 49, 7, 3, 1, 118, 2, 241, + 38, 49, 7, 6, 1, 118, 2, 249, 224, 24, 179, 7, 3, 1, 118, 2, 249, 224, + 24, 179, 7, 6, 1, 118, 2, 249, 224, 24, 242, 113, 7, 3, 1, 118, 2, 249, + 224, 24, 242, 113, 7, 6, 1, 118, 2, 249, 224, 24, 241, 38, 49, 7, 3, 1, + 118, 2, 249, 224, 24, 241, 38, 49, 7, 6, 1, 118, 2, 249, 224, 24, 217, + 42, 7, 3, 1, 118, 2, 249, 224, 24, 217, 42, 7, 6, 1, 118, 2, 249, 224, + 24, 62, 55, 7, 3, 1, 118, 2, 249, 224, 24, 62, 55, 7, 6, 1, 118, 2, 251, + 75, 24, 179, 7, 3, 1, 118, 2, 251, 75, 24, 179, 7, 6, 1, 118, 2, 251, 75, + 24, 242, 113, 7, 3, 1, 118, 2, 251, 75, 24, 242, 113, 7, 6, 1, 118, 2, + 251, 75, 24, 241, 38, 49, 7, 3, 1, 118, 2, 251, 75, 24, 241, 38, 49, 7, + 6, 1, 118, 2, 251, 75, 24, 217, 42, 7, 3, 1, 118, 2, 251, 75, 24, 217, + 42, 7, 6, 1, 118, 2, 251, 75, 24, 62, 55, 7, 3, 1, 118, 2, 251, 75, 24, + 62, 55, 7, 6, 1, 191, 2, 62, 55, 7, 3, 1, 191, 2, 62, 55, 7, 6, 1, 191, + 2, 241, 38, 49, 7, 3, 1, 191, 2, 241, 38, 49, 7, 6, 1, 191, 2, 217, 42, + 7, 3, 1, 191, 2, 217, 42, 7, 6, 1, 191, 2, 249, 224, 24, 179, 7, 3, 1, + 191, 2, 249, 224, 24, 179, 7, 6, 1, 191, 2, 249, 224, 24, 242, 113, 7, 3, + 1, 191, 2, 249, 224, 24, 242, 113, 7, 6, 1, 191, 2, 249, 224, 24, 241, + 38, 49, 7, 3, 1, 191, 2, 249, 224, 24, 241, 38, 49, 7, 6, 1, 191, 2, 249, + 224, 24, 217, 42, 7, 3, 1, 191, 2, 249, 224, 24, 217, 42, 7, 6, 1, 191, + 2, 249, 224, 24, 62, 55, 7, 3, 1, 191, 2, 249, 224, 24, 62, 55, 7, 6, 1, + 240, 146, 2, 241, 38, 49, 7, 3, 1, 240, 146, 2, 241, 38, 49, 7, 6, 1, + 240, 146, 2, 62, 55, 7, 3, 1, 240, 146, 2, 62, 55, 7, 6, 1, 157, 2, 62, + 55, 7, 3, 1, 157, 2, 62, 55, 7, 6, 1, 157, 2, 241, 38, 49, 7, 3, 1, 157, + 2, 241, 38, 49, 7, 6, 1, 157, 2, 249, 224, 24, 179, 7, 3, 1, 157, 2, 249, + 224, 24, 179, 7, 6, 1, 157, 2, 249, 224, 24, 242, 113, 7, 3, 1, 157, 2, + 249, 224, 24, 242, 113, 7, 6, 1, 157, 2, 249, 224, 24, 241, 38, 49, 7, 3, + 1, 157, 2, 249, 224, 24, 241, 38, 49, 7, 6, 1, 157, 2, 249, 224, 24, 217, + 42, 7, 3, 1, 157, 2, 249, 224, 24, 217, 42, 7, 6, 1, 157, 2, 249, 224, + 24, 62, 55, 7, 3, 1, 157, 2, 249, 224, 24, 62, 55, 7, 6, 1, 157, 2, 240, + 236, 24, 179, 7, 3, 1, 157, 2, 240, 236, 24, 179, 7, 6, 1, 157, 2, 240, + 236, 24, 242, 113, 7, 3, 1, 157, 2, 240, 236, 24, 242, 113, 7, 6, 1, 157, + 2, 240, 236, 24, 241, 38, 49, 7, 3, 1, 157, 2, 240, 236, 24, 241, 38, 49, + 7, 6, 1, 157, 2, 240, 236, 24, 217, 42, 7, 3, 1, 157, 2, 240, 236, 24, + 217, 42, 7, 6, 1, 157, 2, 240, 236, 24, 62, 55, 7, 3, 1, 157, 2, 240, + 236, 24, 62, 55, 7, 6, 1, 111, 2, 62, 55, 7, 3, 1, 111, 2, 62, 55, 7, 6, + 1, 111, 2, 241, 38, 49, 7, 3, 1, 111, 2, 241, 38, 49, 7, 6, 1, 111, 2, + 240, 236, 24, 179, 7, 3, 1, 111, 2, 240, 236, 24, 179, 7, 6, 1, 111, 2, + 240, 236, 24, 242, 113, 7, 3, 1, 111, 2, 240, 236, 24, 242, 113, 7, 6, 1, + 111, 2, 240, 236, 24, 241, 38, 49, 7, 3, 1, 111, 2, 240, 236, 24, 241, + 38, 49, 7, 6, 1, 111, 2, 240, 236, 24, 217, 42, 7, 3, 1, 111, 2, 240, + 236, 24, 217, 42, 7, 6, 1, 111, 2, 240, 236, 24, 62, 55, 7, 3, 1, 111, 2, + 240, 236, 24, 62, 55, 7, 6, 1, 213, 106, 2, 242, 113, 7, 3, 1, 213, 106, + 2, 242, 113, 7, 6, 1, 213, 106, 2, 62, 55, 7, 3, 1, 213, 106, 2, 62, 55, + 7, 6, 1, 213, 106, 2, 241, 38, 49, 7, 3, 1, 213, 106, 2, 241, 38, 49, 7, + 6, 1, 213, 106, 2, 217, 42, 7, 3, 1, 213, 106, 2, 217, 42, 7, 6, 1, 231, + 36, 232, 214, 7, 3, 1, 231, 36, 232, 214, 7, 6, 1, 231, 36, 215, 79, 7, + 3, 1, 231, 36, 215, 79, 7, 6, 1, 213, 106, 2, 232, 177, 7, 3, 1, 213, + 106, 2, 232, 177, 25, 3, 1, 254, 53, 2, 225, 39, 25, 3, 1, 254, 53, 2, + 248, 99, 25, 3, 1, 254, 53, 2, 225, 40, 24, 214, 245, 25, 3, 1, 254, 53, + 2, 207, 24, 214, 245, 25, 3, 1, 254, 53, 2, 225, 40, 24, 226, 234, 25, 3, + 1, 254, 53, 2, 207, 24, 226, 234, 25, 3, 1, 254, 53, 2, 225, 40, 24, 226, + 50, 25, 3, 1, 254, 53, 2, 207, 24, 226, 50, 25, 6, 1, 254, 53, 2, 225, + 39, 25, 6, 1, 254, 53, 2, 248, 99, 25, 6, 1, 254, 53, 2, 225, 40, 24, + 214, 245, 25, 6, 1, 254, 53, 2, 207, 24, 214, 245, 25, 6, 1, 254, 53, 2, + 225, 40, 24, 226, 234, 25, 6, 1, 254, 53, 2, 207, 24, 226, 234, 25, 6, 1, + 254, 53, 2, 225, 40, 24, 226, 50, 25, 6, 1, 254, 53, 2, 207, 24, 226, 50, + 25, 3, 1, 245, 64, 2, 225, 39, 25, 3, 1, 245, 64, 2, 248, 99, 25, 3, 1, + 245, 64, 2, 225, 40, 24, 214, 245, 25, 3, 1, 245, 64, 2, 207, 24, 214, + 245, 25, 3, 1, 245, 64, 2, 225, 40, 24, 226, 234, 25, 3, 1, 245, 64, 2, + 207, 24, 226, 234, 25, 6, 1, 245, 64, 2, 225, 39, 25, 6, 1, 245, 64, 2, + 248, 99, 25, 6, 1, 245, 64, 2, 225, 40, 24, 214, 245, 25, 6, 1, 245, 64, + 2, 207, 24, 214, 245, 25, 6, 1, 245, 64, 2, 225, 40, 24, 226, 234, 25, 6, + 1, 245, 64, 2, 207, 24, 226, 234, 25, 3, 1, 245, 29, 2, 225, 39, 25, 3, + 1, 245, 29, 2, 248, 99, 25, 3, 1, 245, 29, 2, 225, 40, 24, 214, 245, 25, + 3, 1, 245, 29, 2, 207, 24, 214, 245, 25, 3, 1, 245, 29, 2, 225, 40, 24, + 226, 234, 25, 3, 1, 245, 29, 2, 207, 24, 226, 234, 25, 3, 1, 245, 29, 2, + 225, 40, 24, 226, 50, 25, 3, 1, 245, 29, 2, 207, 24, 226, 50, 25, 6, 1, + 245, 29, 2, 225, 39, 25, 6, 1, 245, 29, 2, 248, 99, 25, 6, 1, 245, 29, 2, + 225, 40, 24, 214, 245, 25, 6, 1, 245, 29, 2, 207, 24, 214, 245, 25, 6, 1, + 245, 29, 2, 225, 40, 24, 226, 234, 25, 6, 1, 245, 29, 2, 207, 24, 226, + 234, 25, 6, 1, 245, 29, 2, 225, 40, 24, 226, 50, 25, 6, 1, 245, 29, 2, + 207, 24, 226, 50, 25, 3, 1, 235, 184, 2, 225, 39, 25, 3, 1, 235, 184, 2, + 248, 99, 25, 3, 1, 235, 184, 2, 225, 40, 24, 214, 245, 25, 3, 1, 235, + 184, 2, 207, 24, 214, 245, 25, 3, 1, 235, 184, 2, 225, 40, 24, 226, 234, + 25, 3, 1, 235, 184, 2, 207, 24, 226, 234, 25, 3, 1, 235, 184, 2, 225, 40, + 24, 226, 50, 25, 3, 1, 235, 184, 2, 207, 24, 226, 50, 25, 6, 1, 235, 184, + 2, 225, 39, 25, 6, 1, 235, 184, 2, 248, 99, 25, 6, 1, 235, 184, 2, 225, + 40, 24, 214, 245, 25, 6, 1, 235, 184, 2, 207, 24, 214, 245, 25, 6, 1, + 235, 184, 2, 225, 40, 24, 226, 234, 25, 6, 1, 235, 184, 2, 207, 24, 226, + 234, 25, 6, 1, 235, 184, 2, 225, 40, 24, 226, 50, 25, 6, 1, 235, 184, 2, + 207, 24, 226, 50, 25, 3, 1, 227, 66, 2, 225, 39, 25, 3, 1, 227, 66, 2, + 248, 99, 25, 3, 1, 227, 66, 2, 225, 40, 24, 214, 245, 25, 3, 1, 227, 66, + 2, 207, 24, 214, 245, 25, 3, 1, 227, 66, 2, 225, 40, 24, 226, 234, 25, 3, + 1, 227, 66, 2, 207, 24, 226, 234, 25, 6, 1, 227, 66, 2, 225, 39, 25, 6, + 1, 227, 66, 2, 248, 99, 25, 6, 1, 227, 66, 2, 225, 40, 24, 214, 245, 25, + 6, 1, 227, 66, 2, 207, 24, 214, 245, 25, 6, 1, 227, 66, 2, 225, 40, 24, + 226, 234, 25, 6, 1, 227, 66, 2, 207, 24, 226, 234, 25, 3, 1, 215, 129, 2, + 225, 39, 25, 3, 1, 215, 129, 2, 248, 99, 25, 3, 1, 215, 129, 2, 225, 40, + 24, 214, 245, 25, 3, 1, 215, 129, 2, 207, 24, 214, 245, 25, 3, 1, 215, + 129, 2, 225, 40, 24, 226, 234, 25, 3, 1, 215, 129, 2, 207, 24, 226, 234, + 25, 3, 1, 215, 129, 2, 225, 40, 24, 226, 50, 25, 3, 1, 215, 129, 2, 207, + 24, 226, 50, 25, 6, 1, 215, 129, 2, 248, 99, 25, 6, 1, 215, 129, 2, 207, + 24, 214, 245, 25, 6, 1, 215, 129, 2, 207, 24, 226, 234, 25, 6, 1, 215, + 129, 2, 207, 24, 226, 50, 25, 3, 1, 227, 68, 2, 225, 39, 25, 3, 1, 227, + 68, 2, 248, 99, 25, 3, 1, 227, 68, 2, 225, 40, 24, 214, 245, 25, 3, 1, + 227, 68, 2, 207, 24, 214, 245, 25, 3, 1, 227, 68, 2, 225, 40, 24, 226, + 234, 25, 3, 1, 227, 68, 2, 207, 24, 226, 234, 25, 3, 1, 227, 68, 2, 225, + 40, 24, 226, 50, 25, 3, 1, 227, 68, 2, 207, 24, 226, 50, 25, 6, 1, 227, + 68, 2, 225, 39, 25, 6, 1, 227, 68, 2, 248, 99, 25, 6, 1, 227, 68, 2, 225, + 40, 24, 214, 245, 25, 6, 1, 227, 68, 2, 207, 24, 214, 245, 25, 6, 1, 227, + 68, 2, 225, 40, 24, 226, 234, 25, 6, 1, 227, 68, 2, 207, 24, 226, 234, + 25, 6, 1, 227, 68, 2, 225, 40, 24, 226, 50, 25, 6, 1, 227, 68, 2, 207, + 24, 226, 50, 25, 3, 1, 254, 53, 2, 214, 245, 25, 3, 1, 254, 53, 2, 226, + 234, 25, 3, 1, 245, 64, 2, 214, 245, 25, 3, 1, 245, 64, 2, 226, 234, 25, + 3, 1, 245, 29, 2, 214, 245, 25, 3, 1, 245, 29, 2, 226, 234, 25, 3, 1, + 235, 184, 2, 214, 245, 25, 3, 1, 235, 184, 2, 226, 234, 25, 3, 1, 227, + 66, 2, 214, 245, 25, 3, 1, 227, 66, 2, 226, 234, 25, 3, 1, 215, 129, 2, + 214, 245, 25, 3, 1, 215, 129, 2, 226, 234, 25, 3, 1, 227, 68, 2, 214, + 245, 25, 3, 1, 227, 68, 2, 226, 234, 25, 3, 1, 254, 53, 2, 225, 40, 24, + 212, 210, 25, 3, 1, 254, 53, 2, 207, 24, 212, 210, 25, 3, 1, 254, 53, 2, + 225, 40, 24, 214, 246, 24, 212, 210, 25, 3, 1, 254, 53, 2, 207, 24, 214, + 246, 24, 212, 210, 25, 3, 1, 254, 53, 2, 225, 40, 24, 226, 235, 24, 212, + 210, 25, 3, 1, 254, 53, 2, 207, 24, 226, 235, 24, 212, 210, 25, 3, 1, + 254, 53, 2, 225, 40, 24, 226, 51, 24, 212, 210, 25, 3, 1, 254, 53, 2, + 207, 24, 226, 51, 24, 212, 210, 25, 6, 1, 254, 53, 2, 225, 40, 24, 225, + 51, 25, 6, 1, 254, 53, 2, 207, 24, 225, 51, 25, 6, 1, 254, 53, 2, 225, + 40, 24, 214, 246, 24, 225, 51, 25, 6, 1, 254, 53, 2, 207, 24, 214, 246, + 24, 225, 51, 25, 6, 1, 254, 53, 2, 225, 40, 24, 226, 235, 24, 225, 51, + 25, 6, 1, 254, 53, 2, 207, 24, 226, 235, 24, 225, 51, 25, 6, 1, 254, 53, + 2, 225, 40, 24, 226, 51, 24, 225, 51, 25, 6, 1, 254, 53, 2, 207, 24, 226, + 51, 24, 225, 51, 25, 3, 1, 245, 29, 2, 225, 40, 24, 212, 210, 25, 3, 1, + 245, 29, 2, 207, 24, 212, 210, 25, 3, 1, 245, 29, 2, 225, 40, 24, 214, + 246, 24, 212, 210, 25, 3, 1, 245, 29, 2, 207, 24, 214, 246, 24, 212, 210, + 25, 3, 1, 245, 29, 2, 225, 40, 24, 226, 235, 24, 212, 210, 25, 3, 1, 245, + 29, 2, 207, 24, 226, 235, 24, 212, 210, 25, 3, 1, 245, 29, 2, 225, 40, + 24, 226, 51, 24, 212, 210, 25, 3, 1, 245, 29, 2, 207, 24, 226, 51, 24, + 212, 210, 25, 6, 1, 245, 29, 2, 225, 40, 24, 225, 51, 25, 6, 1, 245, 29, + 2, 207, 24, 225, 51, 25, 6, 1, 245, 29, 2, 225, 40, 24, 214, 246, 24, + 225, 51, 25, 6, 1, 245, 29, 2, 207, 24, 214, 246, 24, 225, 51, 25, 6, 1, + 245, 29, 2, 225, 40, 24, 226, 235, 24, 225, 51, 25, 6, 1, 245, 29, 2, + 207, 24, 226, 235, 24, 225, 51, 25, 6, 1, 245, 29, 2, 225, 40, 24, 226, + 51, 24, 225, 51, 25, 6, 1, 245, 29, 2, 207, 24, 226, 51, 24, 225, 51, 25, + 3, 1, 227, 68, 2, 225, 40, 24, 212, 210, 25, 3, 1, 227, 68, 2, 207, 24, + 212, 210, 25, 3, 1, 227, 68, 2, 225, 40, 24, 214, 246, 24, 212, 210, 25, + 3, 1, 227, 68, 2, 207, 24, 214, 246, 24, 212, 210, 25, 3, 1, 227, 68, 2, + 225, 40, 24, 226, 235, 24, 212, 210, 25, 3, 1, 227, 68, 2, 207, 24, 226, + 235, 24, 212, 210, 25, 3, 1, 227, 68, 2, 225, 40, 24, 226, 51, 24, 212, + 210, 25, 3, 1, 227, 68, 2, 207, 24, 226, 51, 24, 212, 210, 25, 6, 1, 227, + 68, 2, 225, 40, 24, 225, 51, 25, 6, 1, 227, 68, 2, 207, 24, 225, 51, 25, + 6, 1, 227, 68, 2, 225, 40, 24, 214, 246, 24, 225, 51, 25, 6, 1, 227, 68, + 2, 207, 24, 214, 246, 24, 225, 51, 25, 6, 1, 227, 68, 2, 225, 40, 24, + 226, 235, 24, 225, 51, 25, 6, 1, 227, 68, 2, 207, 24, 226, 235, 24, 225, + 51, 25, 6, 1, 227, 68, 2, 225, 40, 24, 226, 51, 24, 225, 51, 25, 6, 1, + 227, 68, 2, 207, 24, 226, 51, 24, 225, 51, 25, 3, 1, 254, 53, 2, 214, + 101, 25, 3, 1, 254, 53, 2, 232, 37, 25, 3, 1, 254, 53, 2, 214, 246, 24, + 212, 210, 25, 3, 1, 254, 53, 2, 212, 210, 25, 3, 1, 254, 53, 2, 226, 235, + 24, 212, 210, 25, 3, 1, 254, 53, 2, 226, 50, 25, 3, 1, 254, 53, 2, 226, + 51, 24, 212, 210, 25, 6, 1, 254, 53, 2, 214, 101, 25, 6, 1, 254, 53, 2, + 232, 37, 25, 6, 1, 254, 53, 2, 214, 245, 25, 6, 1, 254, 53, 2, 226, 234, + 25, 6, 1, 254, 53, 2, 225, 51, 25, 234, 11, 25, 225, 51, 25, 225, 39, 25, + 226, 50, 25, 247, 204, 24, 226, 50, 25, 3, 1, 245, 29, 2, 214, 246, 24, + 212, 210, 25, 3, 1, 245, 29, 2, 212, 210, 25, 3, 1, 245, 29, 2, 226, 235, + 24, 212, 210, 25, 3, 1, 245, 29, 2, 226, 50, 25, 3, 1, 245, 29, 2, 226, + 51, 24, 212, 210, 25, 6, 1, 245, 64, 2, 214, 245, 25, 6, 1, 245, 64, 2, + 226, 234, 25, 6, 1, 245, 29, 2, 214, 245, 25, 6, 1, 245, 29, 2, 226, 234, + 25, 6, 1, 245, 29, 2, 225, 51, 25, 225, 40, 24, 214, 245, 25, 225, 40, + 24, 226, 234, 25, 225, 40, 24, 226, 50, 25, 3, 1, 235, 184, 2, 214, 101, + 25, 3, 1, 235, 184, 2, 232, 37, 25, 3, 1, 235, 184, 2, 247, 204, 24, 214, + 245, 25, 3, 1, 235, 184, 2, 247, 204, 24, 226, 234, 25, 3, 1, 235, 184, + 2, 226, 50, 25, 3, 1, 235, 184, 2, 247, 204, 24, 226, 50, 25, 6, 1, 235, + 184, 2, 214, 101, 25, 6, 1, 235, 184, 2, 232, 37, 25, 6, 1, 235, 184, 2, + 214, 245, 25, 6, 1, 235, 184, 2, 226, 234, 25, 207, 24, 214, 245, 25, + 207, 24, 226, 234, 25, 207, 24, 226, 50, 25, 3, 1, 215, 129, 2, 214, 101, + 25, 3, 1, 215, 129, 2, 232, 37, 25, 3, 1, 215, 129, 2, 247, 204, 24, 214, + 245, 25, 3, 1, 215, 129, 2, 247, 204, 24, 226, 234, 25, 3, 1, 223, 191, + 2, 225, 39, 25, 3, 1, 223, 191, 2, 248, 99, 25, 3, 1, 215, 129, 2, 226, + 50, 25, 3, 1, 215, 129, 2, 247, 204, 24, 226, 50, 25, 6, 1, 215, 129, 2, + 214, 101, 25, 6, 1, 215, 129, 2, 232, 37, 25, 6, 1, 215, 129, 2, 214, + 245, 25, 6, 1, 215, 129, 2, 226, 234, 25, 6, 1, 223, 191, 2, 248, 99, 25, + 247, 204, 24, 214, 245, 25, 247, 204, 24, 226, 234, 25, 214, 245, 25, 3, + 1, 227, 68, 2, 214, 246, 24, 212, 210, 25, 3, 1, 227, 68, 2, 212, 210, + 25, 3, 1, 227, 68, 2, 226, 235, 24, 212, 210, 25, 3, 1, 227, 68, 2, 226, + 50, 25, 3, 1, 227, 68, 2, 226, 51, 24, 212, 210, 25, 6, 1, 227, 66, 2, + 214, 245, 25, 6, 1, 227, 66, 2, 226, 234, 25, 6, 1, 227, 68, 2, 214, 245, + 25, 6, 1, 227, 68, 2, 226, 234, 25, 6, 1, 227, 68, 2, 225, 51, 25, 226, + 234, 25, 248, 99, 245, 109, 224, 172, 245, 118, 224, 172, 245, 109, 219, + 206, 245, 118, 219, 206, 217, 95, 219, 206, 243, 235, 219, 206, 220, 51, + 219, 206, 244, 81, 219, 206, 225, 27, 219, 206, 217, 123, 219, 206, 242, + 17, 219, 206, 212, 80, 213, 230, 219, 206, 212, 80, 213, 230, 228, 178, + 212, 80, 213, 230, 235, 66, 233, 62, 77, 223, 140, 77, 240, 160, 228, + 179, 240, 160, 244, 81, 248, 101, 245, 109, 248, 101, 245, 118, 248, 101, + 199, 134, 51, 71, 232, 242, 51, 115, 232, 242, 42, 220, 81, 224, 143, 77, + 46, 220, 81, 224, 143, 77, 220, 81, 232, 164, 224, 143, 77, 220, 81, 241, + 149, 224, 143, 77, 42, 51, 224, 143, 77, 46, 51, 224, 143, 77, 51, 232, + 164, 224, 143, 77, 51, 241, 149, 224, 143, 77, 248, 149, 51, 248, 149, + 251, 42, 216, 180, 251, 42, 122, 62, 233, 80, 117, 62, 233, 80, 199, 245, + 120, 240, 158, 225, 144, 232, 243, 221, 57, 226, 143, 221, 57, 233, 62, + 245, 116, 223, 140, 245, 116, 225, 126, 247, 148, 243, 244, 233, 62, 226, + 241, 223, 140, 226, 241, 230, 14, 228, 184, 219, 206, 226, 58, 231, 6, + 52, 226, 58, 217, 201, 217, 101, 52, 225, 71, 51, 225, 71, 216, 169, 225, + 71, 223, 202, 225, 71, 223, 202, 51, 225, 71, 223, 202, 216, 169, 225, + 71, 250, 170, 220, 81, 233, 66, 254, 19, 224, 143, 77, 220, 81, 223, 144, + 254, 19, 224, 143, 77, 224, 0, 77, 51, 244, 254, 77, 235, 198, 226, 243, + 215, 150, 137, 217, 65, 250, 171, 235, 213, 225, 144, 253, 130, 240, 161, + 251, 42, 243, 228, 220, 23, 42, 41, 251, 85, 2, 224, 152, 46, 41, 251, + 85, 2, 224, 152, 51, 224, 158, 77, 224, 158, 244, 254, 77, 244, 254, 224, + 158, 77, 217, 23, 5, 245, 30, 223, 202, 225, 200, 52, 83, 132, 251, 42, + 83, 95, 251, 42, 115, 253, 132, 223, 202, 221, 70, 249, 194, 215, 134, + 117, 253, 131, 254, 67, 214, 165, 249, 156, 230, 251, 52, 218, 179, 248, + 101, 235, 191, 215, 150, 244, 21, 225, 27, 77, 133, 62, 225, 26, 224, + 169, 225, 71, 243, 237, 62, 225, 26, 244, 50, 62, 225, 26, 117, 62, 225, + 26, 243, 237, 62, 77, 246, 72, 249, 70, 216, 179, 71, 243, 237, 247, 72, + 231, 147, 14, 219, 206, 213, 196, 235, 66, 243, 198, 253, 222, 235, 189, + 217, 38, 235, 189, 221, 57, 235, 189, 225, 156, 235, 225, 218, 127, 218, + 196, 254, 166, 218, 127, 218, 196, 235, 225, 12, 243, 245, 221, 3, 254, + 166, 12, 243, 245, 221, 3, 230, 10, 21, 221, 4, 228, 180, 21, 221, 4, + 218, 223, 212, 79, 218, 223, 7, 3, 1, 72, 218, 223, 163, 218, 223, 180, + 218, 223, 189, 218, 223, 198, 218, 223, 195, 218, 223, 200, 218, 223, 94, + 52, 218, 223, 230, 250, 218, 223, 245, 61, 52, 218, 223, 42, 226, 131, + 218, 223, 46, 226, 131, 218, 223, 7, 3, 1, 204, 219, 10, 212, 79, 219, + 10, 116, 219, 10, 109, 219, 10, 166, 219, 10, 163, 219, 10, 180, 219, 10, + 189, 219, 10, 198, 219, 10, 195, 219, 10, 200, 219, 10, 94, 52, 219, 10, + 230, 250, 219, 10, 245, 61, 52, 219, 10, 42, 226, 131, 219, 10, 46, 226, + 131, 7, 219, 10, 3, 1, 61, 7, 219, 10, 3, 1, 74, 7, 219, 10, 3, 1, 75, 7, + 219, 10, 3, 1, 213, 166, 7, 219, 10, 3, 1, 222, 113, 7, 219, 10, 3, 1, + 242, 41, 7, 219, 10, 3, 1, 235, 27, 7, 219, 10, 3, 1, 150, 7, 219, 10, 3, + 1, 183, 7, 219, 10, 3, 1, 204, 7, 219, 10, 3, 1, 226, 229, 7, 219, 10, 3, + 1, 197, 7, 219, 10, 3, 1, 218, 99, 245, 13, 52, 249, 165, 52, 249, 57, + 52, 243, 221, 243, 224, 52, 232, 227, 52, 231, 7, 52, 230, 29, 52, 226, + 38, 52, 223, 29, 52, 213, 204, 52, 156, 220, 229, 52, 247, 81, 52, 245, + 14, 52, 234, 85, 52, 216, 76, 52, 246, 55, 52, 243, 16, 226, 68, 52, 226, + 36, 52, 242, 88, 52, 253, 98, 52, 240, 215, 52, 250, 119, 52, 232, 220, + 216, 216, 52, 219, 188, 52, 217, 198, 52, 235, 238, 223, 29, 52, 37, 42, + 241, 238, 49, 37, 46, 241, 238, 49, 37, 184, 71, 232, 243, 226, 244, 37, + 220, 175, 71, 232, 243, 226, 244, 37, 253, 255, 76, 49, 37, 249, 195, 76, + 49, 37, 42, 76, 49, 37, 46, 76, 49, 37, 223, 131, 226, 244, 37, 249, 195, + 223, 131, 226, 244, 37, 253, 255, 223, 131, 226, 244, 37, 133, 176, 49, + 37, 243, 237, 176, 49, 37, 245, 104, 249, 228, 37, 245, 104, 219, 166, + 37, 245, 104, 247, 200, 37, 245, 104, 249, 229, 252, 97, 37, 42, 46, 76, + 49, 37, 245, 104, 222, 107, 37, 245, 104, 234, 141, 37, 245, 104, 215, + 126, 225, 141, 216, 183, 37, 223, 203, 219, 232, 226, 244, 37, 51, 71, + 219, 45, 226, 244, 37, 254, 9, 87, 37, 216, 169, 215, 152, 37, 213, 232, + 251, 68, 49, 37, 132, 76, 226, 244, 37, 184, 51, 219, 232, 226, 244, 37, + 95, 241, 238, 2, 206, 246, 57, 37, 132, 241, 238, 2, 206, 246, 57, 37, + 42, 76, 55, 37, 46, 76, 55, 37, 253, 133, 49, 254, 171, 227, 97, 254, + 156, 211, 211, 217, 149, 219, 19, 187, 6, 250, 252, 248, 22, 250, 112, + 250, 109, 232, 243, 87, 250, 172, 227, 97, 250, 212, 215, 159, 245, 15, + 249, 130, 222, 104, 248, 22, 244, 147, 113, 3, 243, 177, 113, 6, 242, 41, + 251, 142, 6, 242, 41, 187, 6, 242, 41, 225, 169, 249, 130, 225, 169, 249, + 131, 110, 117, 225, 240, 113, 6, 72, 251, 142, 6, 72, 113, 6, 150, 113, + 3, 150, 233, 171, 54, 252, 60, 87, 187, 6, 204, 228, 52, 52, 219, 218, + 224, 12, 249, 101, 113, 6, 226, 229, 187, 6, 226, 229, 187, 6, 224, 240, + 113, 6, 149, 251, 142, 6, 149, 187, 6, 149, 225, 76, 218, 21, 223, 214, + 221, 53, 77, 217, 210, 52, 216, 210, 152, 52, 214, 217, 187, 6, 212, 152, + 227, 1, 52, 227, 87, 52, 235, 191, 227, 87, 52, 251, 142, 6, 212, 152, + 216, 58, 25, 3, 1, 235, 183, 234, 179, 52, 254, 16, 52, 113, 6, 253, 74, + 251, 142, 6, 250, 252, 245, 33, 87, 113, 3, 74, 113, 6, 74, 113, 6, 244, + 230, 216, 58, 6, 244, 230, 113, 6, 183, 113, 3, 75, 106, 87, 251, 206, + 87, 242, 178, 87, 248, 135, 87, 235, 229, 219, 216, 223, 89, 6, 224, 240, + 244, 150, 52, 187, 3, 225, 240, 187, 3, 243, 83, 187, 6, 243, 83, 187, 6, + 225, 240, 187, 230, 97, 218, 241, 216, 58, 35, 6, 243, 177, 216, 58, 35, + 6, 150, 223, 202, 35, 6, 150, 216, 58, 35, 6, 213, 105, 187, 32, 6, 249, + 3, 187, 32, 3, 249, 3, 187, 32, 3, 74, 187, 32, 3, 72, 187, 32, 3, 235, + 142, 225, 54, 232, 242, 216, 58, 254, 35, 226, 58, 52, 254, 88, 216, 58, + 3, 244, 230, 16, 31, 222, 167, 219, 216, 214, 97, 243, 228, 122, 221, 39, + 214, 97, 243, 228, 122, 229, 25, 214, 97, 243, 228, 122, 217, 194, 214, + 97, 243, 228, 122, 217, 121, 214, 97, 243, 228, 117, 217, 119, 214, 97, + 243, 228, 122, 244, 86, 214, 97, 243, 228, 117, 244, 85, 214, 97, 243, + 228, 133, 244, 85, 214, 97, 243, 228, 243, 237, 244, 85, 214, 97, 243, + 228, 122, 220, 43, 214, 97, 243, 228, 244, 50, 220, 41, 214, 97, 243, + 228, 122, 245, 145, 214, 97, 243, 228, 133, 245, 143, 214, 97, 243, 228, + 244, 50, 245, 143, 214, 97, 243, 228, 221, 43, 245, 143, 243, 228, 228, + 53, 116, 223, 100, 228, 54, 116, 223, 100, 228, 54, 109, 223, 100, 228, + 54, 166, 223, 100, 228, 54, 163, 223, 100, 228, 54, 180, 223, 100, 228, + 54, 189, 223, 100, 228, 54, 198, 223, 100, 228, 54, 195, 223, 100, 228, + 54, 200, 223, 100, 228, 54, 217, 200, 223, 100, 228, 54, 245, 124, 223, + 100, 228, 54, 216, 41, 223, 100, 228, 54, 244, 83, 223, 100, 228, 54, + 122, 240, 200, 223, 100, 228, 54, 244, 50, 240, 200, 223, 100, 228, 54, + 122, 217, 100, 3, 223, 100, 228, 54, 116, 3, 223, 100, 228, 54, 109, 3, + 223, 100, 228, 54, 166, 3, 223, 100, 228, 54, 163, 3, 223, 100, 228, 54, + 180, 3, 223, 100, 228, 54, 189, 3, 223, 100, 228, 54, 198, 3, 223, 100, + 228, 54, 195, 3, 223, 100, 228, 54, 200, 3, 223, 100, 228, 54, 217, 200, + 3, 223, 100, 228, 54, 245, 124, 3, 223, 100, 228, 54, 216, 41, 3, 223, + 100, 228, 54, 244, 83, 3, 223, 100, 228, 54, 122, 240, 200, 3, 223, 100, + 228, 54, 244, 50, 240, 200, 3, 223, 100, 228, 54, 122, 217, 100, 223, + 100, 228, 54, 122, 217, 101, 250, 253, 249, 3, 223, 100, 228, 54, 244, + 50, 217, 100, 223, 100, 228, 54, 217, 201, 217, 100, 223, 100, 228, 54, + 223, 202, 122, 240, 200, 7, 3, 1, 223, 202, 250, 252, 223, 100, 228, 54, + 220, 53, 233, 101, 17, 223, 100, 228, 54, 244, 84, 245, 182, 17, 223, + 100, 228, 54, 244, 84, 217, 100, 223, 100, 228, 54, 122, 240, 201, 217, + 100, 214, 97, 243, 228, 212, 80, 217, 119, 132, 68, 215, 124, 68, 95, 68, + 246, 58, 68, 42, 46, 68, 114, 119, 68, 228, 167, 213, 250, 68, 228, 167, + 245, 176, 68, 219, 215, 245, 176, 68, 219, 215, 213, 250, 68, 132, 76, 2, + 90, 95, 76, 2, 90, 132, 214, 20, 68, 95, 214, 20, 68, 132, 117, 241, 218, + 68, 215, 124, 117, 241, 218, 68, 95, 117, 241, 218, 68, 246, 58, 117, + 241, 218, 68, 132, 76, 2, 218, 27, 95, 76, 2, 218, 27, 132, 76, 243, 213, + 134, 215, 124, 76, 243, 213, 134, 95, 76, 243, 213, 134, 246, 58, 76, + 243, 213, 134, 114, 119, 76, 2, 252, 47, 132, 76, 2, 101, 95, 76, 2, 101, + 132, 76, 2, 232, 177, 95, 76, 2, 232, 177, 42, 46, 214, 20, 68, 42, 46, + 76, 2, 90, 246, 58, 212, 28, 68, 215, 124, 76, 2, 217, 30, 233, 61, 215, + 124, 76, 2, 217, 30, 223, 138, 246, 58, 76, 2, 217, 30, 233, 61, 246, 58, + 76, 2, 217, 30, 223, 138, 95, 76, 2, 249, 100, 246, 57, 246, 58, 76, 2, + 249, 100, 233, 61, 253, 255, 216, 227, 221, 73, 68, 249, 195, 216, 227, + 221, 73, 68, 228, 167, 213, 250, 76, 211, 211, 184, 134, 132, 76, 211, + 211, 252, 60, 110, 95, 76, 211, 211, 134, 253, 255, 227, 40, 249, 229, + 68, 249, 195, 227, 40, 249, 229, 68, 132, 241, 238, 2, 206, 215, 123, + 132, 241, 238, 2, 206, 246, 57, 215, 124, 241, 238, 2, 206, 223, 138, + 215, 124, 241, 238, 2, 206, 233, 61, 95, 241, 238, 2, 206, 215, 123, 95, + 241, 238, 2, 206, 246, 57, 246, 58, 241, 238, 2, 206, 223, 138, 246, 58, + 241, 238, 2, 206, 233, 61, 95, 76, 110, 132, 68, 215, 124, 76, 132, 65, + 246, 58, 68, 132, 76, 110, 95, 68, 132, 226, 197, 253, 162, 215, 124, + 226, 197, 253, 162, 95, 226, 197, 253, 162, 246, 58, 226, 197, 253, 162, + 132, 241, 238, 110, 95, 241, 237, 95, 241, 238, 110, 132, 241, 237, 132, + 51, 76, 2, 90, 42, 46, 51, 76, 2, 90, 95, 51, 76, 2, 90, 132, 51, 68, + 215, 124, 51, 68, 95, 51, 68, 246, 58, 51, 68, 42, 46, 51, 68, 114, 119, + 51, 68, 228, 167, 213, 250, 51, 68, 228, 167, 245, 176, 51, 68, 219, 215, + 245, 176, 51, 68, 219, 215, 213, 250, 51, 68, 132, 216, 169, 68, 95, 216, + 169, 68, 132, 219, 162, 68, 95, 219, 162, 68, 215, 124, 76, 2, 51, 90, + 246, 58, 76, 2, 51, 90, 132, 248, 100, 68, 215, 124, 248, 100, 68, 95, + 248, 100, 68, 246, 58, 248, 100, 68, 132, 76, 211, 211, 134, 95, 76, 211, + 211, 134, 132, 67, 68, 215, 124, 67, 68, 95, 67, 68, 246, 58, 67, 68, + 215, 124, 67, 76, 243, 213, 134, 215, 124, 67, 76, 227, 63, 226, 89, 215, + 124, 67, 76, 227, 63, 226, 90, 2, 199, 134, 215, 124, 67, 76, 227, 63, + 226, 90, 2, 71, 134, 215, 124, 67, 51, 68, 215, 124, 67, 51, 76, 227, 63, + 226, 89, 95, 67, 76, 243, 213, 214, 40, 228, 167, 213, 250, 76, 211, 211, + 249, 99, 219, 215, 245, 176, 76, 211, 211, 249, 99, 114, 119, 67, 68, 46, + 76, 2, 3, 249, 228, 246, 58, 76, 132, 65, 215, 124, 68, 133, 95, 253, + 162, 132, 76, 2, 71, 90, 95, 76, 2, 71, 90, 42, 46, 76, 2, 71, 90, 132, + 76, 2, 51, 71, 90, 95, 76, 2, 51, 71, 90, 42, 46, 76, 2, 51, 71, 90, 132, + 227, 38, 68, 95, 227, 38, 68, 42, 46, 227, 38, 68, 31, 254, 63, 249, 153, + 226, 125, 247, 185, 217, 140, 244, 250, 217, 140, 247, 92, 228, 163, 244, + 251, 245, 110, 221, 48, 235, 241, 230, 39, 245, 127, 227, 97, 228, 163, + 254, 33, 245, 127, 227, 97, 3, 245, 127, 227, 97, 249, 125, 253, 153, + 231, 126, 247, 92, 228, 163, 249, 127, 253, 153, 231, 126, 3, 249, 125, + 253, 153, 231, 126, 245, 101, 65, 225, 56, 230, 97, 225, 63, 230, 97, + 249, 104, 230, 97, 218, 241, 230, 251, 52, 230, 249, 52, 62, 225, 156, + 247, 121, 220, 23, 221, 49, 230, 250, 253, 133, 227, 33, 223, 131, 227, + 33, 251, 43, 227, 33, 41, 223, 95, 249, 50, 223, 95, 243, 230, 223, 95, + 225, 52, 108, 235, 231, 46, 254, 18, 254, 18, 231, 153, 254, 18, 219, + 187, 254, 18, 247, 123, 247, 92, 228, 163, 247, 126, 226, 136, 108, 228, + 163, 226, 136, 108, 232, 199, 254, 27, 232, 199, 227, 24, 235, 195, 215, + 146, 235, 208, 51, 235, 208, 216, 169, 235, 208, 249, 121, 235, 208, 218, + 213, 235, 208, 214, 110, 235, 208, 249, 195, 235, 208, 249, 195, 249, + 121, 235, 208, 253, 255, 249, 121, 235, 208, 217, 139, 251, 243, 224, 29, + 225, 53, 62, 230, 250, 245, 0, 243, 22, 225, 53, 241, 43, 217, 43, 227, + 33, 223, 202, 217, 42, 235, 191, 233, 89, 197, 220, 83, 214, 19, 213, + 188, 225, 63, 228, 163, 217, 42, 230, 251, 217, 42, 253, 126, 123, 108, + 228, 163, 253, 126, 123, 108, 253, 218, 123, 108, 253, 218, 251, 17, 228, + 163, 254, 165, 123, 108, 229, 181, 253, 218, 228, 170, 254, 165, 123, + 108, 254, 57, 123, 108, 228, 163, 254, 57, 123, 108, 254, 57, 123, 167, + 123, 108, 216, 169, 217, 42, 254, 64, 123, 108, 245, 57, 108, 243, 21, + 245, 57, 108, 247, 186, 251, 200, 253, 220, 217, 149, 232, 250, 243, 21, + 123, 108, 253, 218, 123, 211, 211, 167, 217, 149, 236, 10, 227, 97, 236, + 10, 65, 167, 253, 218, 123, 108, 249, 165, 245, 60, 245, 61, 249, 164, + 223, 131, 235, 252, 123, 108, 223, 131, 123, 108, 249, 93, 108, 245, 32, + 245, 59, 108, 219, 96, 245, 60, 248, 6, 123, 108, 123, 211, 211, 251, 7, + 248, 23, 231, 153, 251, 6, 224, 156, 123, 108, 228, 163, 123, 108, 240, + 97, 108, 228, 163, 240, 97, 108, 219, 49, 245, 57, 108, 233, 39, 167, + 123, 108, 242, 107, 167, 123, 108, 233, 39, 110, 123, 108, 242, 107, 110, + 123, 108, 233, 39, 251, 17, 228, 163, 123, 108, 242, 107, 251, 17, 228, + 163, 123, 108, 230, 167, 233, 38, 230, 167, 242, 106, 251, 200, 228, 163, + 245, 57, 108, 228, 163, 233, 38, 228, 163, 242, 106, 229, 181, 233, 39, + 228, 170, 123, 108, 229, 181, 242, 107, 228, 170, 123, 108, 233, 39, 167, + 245, 57, 108, 242, 107, 167, 245, 57, 108, 229, 181, 233, 39, 228, 170, + 245, 57, 108, 229, 181, 242, 107, 228, 170, 245, 57, 108, 233, 39, 167, + 242, 106, 242, 107, 167, 233, 38, 229, 181, 233, 39, 228, 170, 242, 106, + 229, 181, 242, 107, 228, 170, 233, 38, 225, 82, 219, 0, 225, 83, 167, + 123, 108, 219, 1, 167, 123, 108, 225, 83, 167, 245, 57, 108, 219, 1, 167, + 245, 57, 108, 247, 92, 228, 163, 225, 85, 247, 92, 228, 163, 219, 2, 219, + 9, 227, 97, 218, 222, 227, 97, 228, 163, 118, 219, 9, 227, 97, 228, 163, + 118, 218, 222, 227, 97, 219, 9, 65, 167, 123, 108, 218, 222, 65, 167, + 123, 108, 229, 181, 118, 219, 9, 65, 228, 170, 123, 108, 229, 181, 118, + 218, 222, 65, 228, 170, 123, 108, 219, 9, 65, 2, 228, 163, 123, 108, 218, + 222, 65, 2, 228, 163, 123, 108, 230, 151, 230, 152, 230, 153, 230, 152, + 215, 146, 41, 236, 10, 227, 97, 41, 227, 17, 227, 97, 41, 236, 10, 65, + 167, 123, 108, 41, 227, 17, 65, 167, 123, 108, 41, 250, 183, 41, 249, 43, + 36, 225, 156, 36, 230, 250, 36, 217, 38, 36, 247, 121, 220, 23, 36, 62, + 227, 33, 36, 223, 131, 227, 33, 36, 253, 133, 227, 33, 36, 245, 60, 36, + 248, 101, 91, 225, 156, 91, 230, 250, 91, 217, 38, 91, 62, 227, 33, 46, + 218, 36, 42, 218, 36, 119, 218, 36, 114, 218, 36, 253, 136, 230, 226, + 216, 149, 243, 250, 216, 169, 71, 252, 60, 46, 216, 57, 51, 71, 252, 60, + 51, 46, 216, 57, 247, 92, 228, 163, 225, 48, 228, 163, 216, 149, 247, 92, + 228, 163, 243, 251, 229, 183, 51, 71, 252, 60, 51, 46, 216, 57, 225, 83, + 215, 154, 223, 241, 219, 1, 215, 154, 223, 241, 228, 168, 219, 22, 227, + 97, 249, 125, 253, 153, 228, 168, 219, 21, 228, 168, 219, 22, 65, 167, + 123, 108, 249, 125, 253, 153, 228, 168, 219, 22, 167, 123, 108, 227, 17, + 227, 97, 236, 10, 227, 97, 230, 157, 241, 185, 249, 136, 231, 200, 235, + 205, 213, 133, 230, 22, 228, 169, 46, 254, 19, 2, 253, 195, 46, 216, 183, + 230, 97, 232, 199, 254, 27, 230, 97, 232, 199, 227, 24, 230, 97, 235, + 195, 230, 97, 215, 146, 247, 201, 227, 33, 62, 227, 33, 219, 96, 227, 33, + 247, 121, 217, 38, 251, 90, 42, 228, 168, 244, 149, 221, 69, 225, 63, 46, + 228, 168, 244, 149, 221, 69, 225, 63, 42, 221, 69, 225, 63, 46, 221, 69, + 225, 63, 223, 202, 217, 43, 245, 60, 249, 40, 232, 199, 227, 24, 249, 40, + 232, 199, 254, 27, 51, 219, 8, 51, 218, 221, 51, 235, 195, 51, 215, 146, + 225, 179, 123, 24, 226, 136, 108, 233, 39, 2, 247, 74, 242, 107, 2, 247, + 74, 214, 164, 230, 167, 233, 38, 214, 164, 230, 167, 242, 106, 233, 39, + 123, 211, 211, 167, 242, 106, 242, 107, 123, 211, 211, 167, 233, 38, 123, + 211, 211, 167, 233, 38, 123, 211, 211, 167, 242, 106, 123, 211, 211, 167, + 225, 82, 123, 211, 211, 167, 219, 0, 247, 92, 228, 163, 225, 86, 167, + 245, 62, 247, 92, 228, 163, 219, 3, 167, 245, 62, 228, 163, 41, 236, 10, + 65, 167, 123, 108, 228, 163, 41, 227, 17, 65, 167, 123, 108, 41, 236, 10, + 65, 167, 228, 163, 123, 108, 41, 227, 17, 65, 167, 228, 163, 123, 108, + 233, 39, 251, 17, 228, 163, 245, 57, 108, 242, 107, 251, 17, 228, 163, + 245, 57, 108, 225, 83, 251, 17, 228, 163, 245, 57, 108, 219, 1, 251, 17, + 228, 163, 245, 57, 108, 228, 163, 228, 168, 219, 22, 227, 97, 247, 92, + 228, 163, 249, 127, 253, 153, 228, 168, 219, 21, 228, 163, 228, 168, 219, + 22, 65, 167, 123, 108, 247, 92, 228, 163, 249, 127, 253, 153, 228, 168, + 219, 22, 167, 245, 62, 71, 245, 120, 231, 35, 199, 245, 120, 114, 46, + 247, 207, 245, 120, 119, 46, 247, 207, 245, 120, 245, 127, 65, 2, 184, + 199, 90, 245, 127, 65, 2, 71, 252, 60, 253, 123, 245, 101, 65, 199, 90, + 3, 245, 127, 65, 2, 71, 252, 60, 253, 123, 245, 101, 65, 199, 90, 245, + 127, 65, 2, 62, 49, 245, 127, 65, 2, 226, 247, 3, 245, 127, 65, 2, 226, + 247, 245, 127, 65, 2, 215, 153, 245, 127, 65, 2, 117, 199, 219, 32, 249, + 125, 2, 184, 199, 90, 249, 125, 2, 71, 252, 60, 253, 123, 245, 101, 65, + 199, 90, 3, 249, 125, 2, 71, 252, 60, 253, 123, 245, 101, 65, 199, 90, + 249, 125, 2, 226, 247, 3, 249, 125, 2, 226, 247, 212, 153, 174, 252, 91, + 231, 125, 247, 202, 52, 245, 129, 68, 240, 221, 114, 253, 164, 119, 253, + 164, 225, 59, 226, 41, 214, 16, 232, 242, 42, 250, 115, 46, 250, 115, 42, + 244, 26, 46, 244, 26, 251, 101, 46, 249, 72, 251, 101, 42, 249, 72, 216, + 227, 46, 249, 72, 216, 227, 42, 249, 72, 223, 202, 228, 163, 52, 41, 232, + 159, 253, 195, 222, 83, 222, 90, 217, 210, 224, 13, 225, 121, 235, 235, + 214, 145, 219, 166, 225, 173, 65, 235, 204, 52, 216, 58, 228, 163, 52, + 214, 26, 240, 223, 216, 227, 42, 249, 99, 216, 227, 46, 249, 99, 251, + 101, 42, 249, 99, 251, 101, 46, 249, 99, 216, 227, 151, 235, 208, 251, + 101, 151, 235, 208, 243, 210, 220, 3, 114, 253, 165, 251, 201, 117, 199, + 252, 49, 227, 26, 234, 144, 245, 53, 211, 211, 217, 149, 223, 148, 213, + 167, 235, 252, 118, 224, 10, 251, 89, 234, 143, 233, 66, 254, 19, 125, + 223, 144, 254, 19, 125, 245, 53, 211, 211, 217, 149, 233, 70, 251, 212, + 223, 130, 249, 13, 254, 64, 253, 172, 218, 126, 216, 217, 223, 34, 247, + 167, 227, 18, 249, 138, 218, 3, 220, 14, 249, 90, 249, 89, 194, 196, 16, + 240, 143, 194, 196, 16, 219, 160, 224, 172, 194, 196, 16, 224, 173, 245, + 62, 194, 196, 16, 224, 173, 247, 126, 194, 196, 16, 224, 173, 247, 200, + 194, 196, 16, 224, 173, 235, 59, 194, 196, 16, 224, 173, 249, 228, 194, + 196, 16, 249, 229, 219, 75, 194, 196, 16, 249, 229, 235, 59, 194, 196, + 16, 220, 24, 134, 194, 196, 16, 252, 98, 134, 194, 196, 16, 224, 173, + 220, 23, 194, 196, 16, 224, 173, 252, 97, 194, 196, 16, 224, 173, 233, + 38, 194, 196, 16, 224, 173, 242, 106, 194, 196, 16, 132, 214, 251, 194, + 196, 16, 95, 214, 251, 194, 196, 16, 224, 173, 132, 68, 194, 196, 16, + 224, 173, 95, 68, 194, 196, 16, 249, 229, 252, 97, 194, 196, 16, 119, + 218, 37, 215, 153, 194, 196, 16, 248, 6, 219, 75, 194, 196, 16, 224, 173, + 119, 250, 170, 194, 196, 16, 224, 173, 248, 5, 194, 196, 16, 119, 218, + 37, 235, 59, 194, 196, 16, 215, 124, 214, 251, 194, 196, 16, 224, 173, + 215, 124, 68, 194, 196, 16, 114, 218, 37, 226, 247, 194, 196, 16, 248, + 17, 219, 75, 194, 196, 16, 224, 173, 114, 250, 170, 194, 196, 16, 224, + 173, 248, 16, 194, 196, 16, 114, 218, 37, 235, 59, 194, 196, 16, 246, 58, + 214, 251, 194, 196, 16, 224, 173, 246, 58, 68, 194, 196, 16, 224, 142, + 215, 153, 194, 196, 16, 248, 6, 215, 153, 194, 196, 16, 247, 201, 215, + 153, 194, 196, 16, 235, 60, 215, 153, 194, 196, 16, 249, 229, 215, 153, + 194, 196, 16, 114, 220, 185, 235, 59, 194, 196, 16, 224, 142, 224, 172, + 194, 196, 16, 249, 229, 219, 95, 194, 196, 16, 224, 173, 249, 164, 194, + 196, 16, 114, 218, 37, 247, 209, 194, 196, 16, 248, 17, 247, 209, 194, + 196, 16, 219, 96, 247, 209, 194, 196, 16, 235, 60, 247, 209, 194, 196, + 16, 249, 229, 247, 209, 194, 196, 16, 119, 220, 185, 219, 75, 194, 196, + 16, 42, 220, 185, 219, 75, 194, 196, 16, 217, 43, 247, 209, 194, 196, 16, + 242, 107, 247, 209, 194, 196, 16, 249, 158, 134, 194, 196, 16, 248, 17, + 217, 42, 194, 196, 16, 212, 27, 194, 196, 16, 219, 76, 217, 42, 194, 196, + 16, 221, 71, 215, 153, 194, 196, 16, 224, 173, 228, 163, 245, 62, 194, + 196, 16, 224, 173, 224, 157, 194, 196, 16, 119, 250, 171, 217, 42, 194, + 196, 16, 114, 250, 171, 217, 42, 194, 196, 16, 235, 183, 194, 196, 16, + 223, 190, 194, 196, 16, 227, 67, 194, 196, 16, 254, 53, 215, 153, 194, + 196, 16, 245, 64, 215, 153, 194, 196, 16, 235, 184, 215, 153, 194, 196, + 16, 227, 68, 215, 153, 194, 196, 16, 254, 52, 228, 163, 250, 66, 77, 46, + 254, 19, 2, 246, 58, 212, 28, 68, 220, 159, 227, 40, 251, 89, 251, 222, + 87, 71, 232, 243, 2, 231, 37, 247, 74, 235, 213, 87, 249, 122, 215, 151, + 87, 247, 141, 215, 151, 87, 245, 112, 87, 249, 149, 87, 67, 41, 2, 250, + 109, 71, 232, 242, 245, 89, 87, 254, 48, 234, 145, 87, 241, 197, 87, 36, + 199, 252, 60, 2, 228, 161, 36, 216, 184, 246, 60, 251, 63, 249, 229, 2, + 228, 165, 68, 215, 149, 87, 230, 207, 87, 240, 156, 87, 227, 39, 242, 40, + 87, 227, 39, 233, 169, 87, 226, 117, 87, 226, 116, 87, 247, 149, 249, 38, + 16, 243, 245, 109, 219, 234, 87, 194, 196, 16, 224, 172, 248, 34, 221, + 58, 234, 145, 87, 225, 73, 226, 200, 229, 164, 226, 200, 225, 69, 222, + 108, 87, 249, 210, 222, 108, 87, 42, 226, 132, 215, 131, 101, 42, 226, + 132, 244, 245, 42, 226, 132, 232, 163, 101, 46, 226, 132, 215, 131, 101, + 46, 226, 132, 244, 245, 46, 226, 132, 232, 163, 101, 42, 41, 251, 85, + 215, 131, 249, 99, 42, 41, 251, 85, 244, 245, 42, 41, 251, 85, 232, 163, + 249, 99, 46, 41, 251, 85, 215, 131, 249, 99, 46, 41, 251, 85, 244, 245, + 46, 41, 251, 85, 232, 163, 249, 99, 42, 249, 40, 251, 85, 215, 131, 101, + 42, 249, 40, 251, 85, 231, 37, 225, 233, 42, 249, 40, 251, 85, 232, 163, + 101, 249, 40, 251, 85, 244, 245, 46, 249, 40, 251, 85, 215, 131, 101, 46, + 249, 40, 251, 85, 231, 37, 225, 233, 46, 249, 40, 251, 85, 232, 163, 101, + 235, 209, 244, 245, 199, 232, 243, 244, 245, 215, 131, 42, 167, 232, 163, + 46, 249, 40, 251, 85, 222, 91, 215, 131, 46, 167, 232, 163, 42, 249, 40, + 251, 85, 222, 91, 218, 242, 216, 226, 218, 242, 251, 100, 216, 227, 41, + 125, 251, 101, 41, 125, 251, 101, 41, 251, 85, 110, 216, 227, 41, 125, + 34, 16, 251, 100, 42, 71, 92, 232, 242, 46, 71, 92, 232, 242, 199, 222, + 123, 232, 241, 199, 222, 123, 232, 240, 199, 222, 123, 232, 239, 199, + 222, 123, 232, 238, 247, 253, 16, 177, 71, 24, 216, 227, 223, 148, 247, + 253, 16, 177, 71, 24, 251, 101, 223, 148, 247, 253, 16, 177, 71, 2, 249, + 228, 247, 253, 16, 177, 119, 24, 199, 2, 249, 228, 247, 253, 16, 177, + 114, 24, 199, 2, 249, 228, 247, 253, 16, 177, 71, 2, 216, 183, 247, 253, + 16, 177, 119, 24, 199, 2, 216, 183, 247, 253, 16, 177, 114, 24, 199, 2, + 216, 183, 247, 253, 16, 177, 71, 24, 214, 19, 247, 253, 16, 177, 119, 24, + 199, 2, 214, 19, 247, 253, 16, 177, 114, 24, 199, 2, 214, 19, 247, 253, + 16, 177, 119, 24, 241, 31, 247, 253, 16, 177, 114, 24, 241, 31, 247, 253, + 16, 177, 71, 24, 216, 227, 233, 70, 247, 253, 16, 177, 71, 24, 251, 101, + 233, 70, 41, 244, 1, 223, 206, 87, 245, 139, 87, 71, 232, 243, 244, 245, + 231, 100, 251, 74, 231, 100, 184, 110, 220, 174, 231, 100, 220, 175, 110, + 232, 190, 231, 100, 184, 110, 117, 220, 161, 231, 100, 117, 220, 162, + 110, 232, 190, 231, 100, 117, 220, 162, 235, 67, 231, 100, 216, 166, 231, + 100, 217, 176, 231, 100, 226, 63, 245, 180, 242, 100, 243, 191, 216, 227, + 226, 131, 251, 101, 226, 131, 216, 227, 249, 40, 125, 251, 101, 249, 40, + 125, 216, 227, 216, 219, 220, 233, 125, 251, 101, 216, 219, 220, 233, + 125, 67, 216, 197, 251, 212, 223, 131, 2, 249, 228, 219, 60, 244, 33, + 254, 177, 249, 37, 245, 128, 235, 195, 248, 34, 244, 247, 87, 83, 223, + 144, 51, 216, 183, 83, 233, 66, 51, 216, 183, 83, 215, 133, 51, 216, 183, + 83, 246, 59, 51, 216, 183, 83, 223, 144, 51, 216, 184, 2, 71, 134, 83, + 233, 66, 51, 216, 184, 2, 71, 134, 83, 223, 144, 216, 184, 2, 51, 71, + 134, 254, 81, 249, 196, 219, 66, 217, 39, 249, 196, 240, 224, 2, 244, 19, + 222, 157, 16, 31, 228, 58, 16, 31, 219, 91, 65, 241, 217, 16, 31, 219, + 91, 65, 217, 165, 16, 31, 245, 101, 65, 217, 165, 16, 31, 245, 101, 65, + 216, 200, 16, 31, 245, 91, 16, 31, 254, 168, 16, 31, 251, 221, 16, 31, + 252, 96, 16, 31, 199, 218, 38, 16, 31, 232, 243, 244, 114, 16, 31, 71, + 218, 38, 16, 31, 243, 245, 244, 114, 16, 31, 250, 162, 223, 205, 16, 31, + 220, 208, 226, 254, 16, 31, 220, 208, 235, 251, 16, 31, 248, 97, 232, + 233, 245, 42, 16, 31, 247, 238, 249, 117, 116, 16, 31, 247, 238, 249, + 117, 109, 16, 31, 247, 238, 249, 117, 166, 16, 31, 247, 238, 249, 117, + 163, 16, 31, 146, 254, 168, 16, 31, 218, 123, 236, 57, 16, 31, 245, 101, + 65, 216, 201, 251, 136, 16, 31, 250, 193, 16, 31, 245, 101, 65, 231, 146, + 16, 31, 219, 6, 16, 31, 245, 42, 16, 31, 244, 76, 221, 57, 16, 31, 242, + 99, 221, 57, 16, 31, 224, 14, 221, 57, 16, 31, 215, 145, 221, 57, 16, 31, + 219, 206, 16, 31, 248, 14, 251, 139, 87, 227, 40, 251, 89, 16, 31, 229, + 167, 16, 31, 248, 15, 243, 245, 109, 16, 31, 219, 7, 243, 245, 109, 227, + 105, 101, 227, 105, 250, 87, 227, 105, 243, 248, 227, 105, 235, 191, 243, + 248, 227, 105, 251, 219, 251, 53, 227, 105, 251, 96, 217, 65, 227, 105, + 251, 82, 252, 65, 240, 96, 227, 105, 254, 36, 65, 250, 65, 227, 105, 248, + 101, 227, 105, 249, 29, 254, 171, 228, 56, 227, 105, 51, 252, 97, 36, 21, + 116, 36, 21, 109, 36, 21, 166, 36, 21, 163, 36, 21, 180, 36, 21, 189, 36, + 21, 198, 36, 21, 195, 36, 21, 200, 36, 50, 217, 200, 36, 50, 245, 124, + 36, 50, 216, 41, 36, 50, 217, 117, 36, 50, 243, 231, 36, 50, 244, 87, 36, + 50, 220, 47, 36, 50, 221, 40, 36, 50, 245, 147, 36, 50, 229, 28, 36, 50, + 216, 38, 86, 21, 116, 86, 21, 109, 86, 21, 166, 86, 21, 163, 86, 21, 180, + 86, 21, 189, 86, 21, 198, 86, 21, 195, 86, 21, 200, 86, 50, 217, 200, 86, + 50, 245, 124, 86, 50, 216, 41, 86, 50, 217, 117, 86, 50, 243, 231, 86, + 50, 244, 87, 86, 50, 220, 47, 86, 50, 221, 40, 86, 50, 245, 147, 86, 50, + 229, 28, 86, 50, 216, 38, 21, 122, 243, 200, 219, 69, 21, 117, 243, 200, + 219, 69, 21, 133, 243, 200, 219, 69, 21, 243, 237, 243, 200, 219, 69, 21, + 244, 50, 243, 200, 219, 69, 21, 220, 53, 243, 200, 219, 69, 21, 221, 43, + 243, 200, 219, 69, 21, 245, 150, 243, 200, 219, 69, 21, 229, 31, 243, + 200, 219, 69, 50, 217, 201, 243, 200, 219, 69, 50, 245, 125, 243, 200, + 219, 69, 50, 216, 42, 243, 200, 219, 69, 50, 217, 118, 243, 200, 219, 69, + 50, 243, 232, 243, 200, 219, 69, 50, 244, 88, 243, 200, 219, 69, 50, 220, + 48, 243, 200, 219, 69, 50, 221, 41, 243, 200, 219, 69, 50, 245, 148, 243, + 200, 219, 69, 50, 229, 29, 243, 200, 219, 69, 50, 216, 39, 243, 200, 219, + 69, 86, 7, 3, 1, 61, 86, 7, 3, 1, 253, 74, 86, 7, 3, 1, 250, 252, 86, 7, + 3, 1, 249, 3, 86, 7, 3, 1, 74, 86, 7, 3, 1, 244, 230, 86, 7, 3, 1, 243, + 177, 86, 7, 3, 1, 242, 41, 86, 7, 3, 1, 72, 86, 7, 3, 1, 235, 142, 86, 7, + 3, 1, 235, 27, 86, 7, 3, 1, 150, 86, 7, 3, 1, 183, 86, 7, 3, 1, 204, 86, + 7, 3, 1, 75, 86, 7, 3, 1, 226, 229, 86, 7, 3, 1, 224, 240, 86, 7, 3, 1, + 149, 86, 7, 3, 1, 197, 86, 7, 3, 1, 218, 99, 86, 7, 3, 1, 69, 86, 7, 3, + 1, 215, 79, 86, 7, 3, 1, 214, 82, 86, 7, 3, 1, 213, 166, 86, 7, 3, 1, + 213, 105, 86, 7, 3, 1, 212, 152, 36, 7, 6, 1, 61, 36, 7, 6, 1, 253, 74, + 36, 7, 6, 1, 250, 252, 36, 7, 6, 1, 249, 3, 36, 7, 6, 1, 74, 36, 7, 6, 1, + 244, 230, 36, 7, 6, 1, 243, 177, 36, 7, 6, 1, 242, 41, 36, 7, 6, 1, 72, + 36, 7, 6, 1, 235, 142, 36, 7, 6, 1, 235, 27, 36, 7, 6, 1, 150, 36, 7, 6, + 1, 183, 36, 7, 6, 1, 204, 36, 7, 6, 1, 75, 36, 7, 6, 1, 226, 229, 36, 7, + 6, 1, 224, 240, 36, 7, 6, 1, 149, 36, 7, 6, 1, 197, 36, 7, 6, 1, 218, 99, + 36, 7, 6, 1, 69, 36, 7, 6, 1, 215, 79, 36, 7, 6, 1, 214, 82, 36, 7, 6, 1, + 213, 166, 36, 7, 6, 1, 213, 105, 36, 7, 6, 1, 212, 152, 36, 7, 3, 1, 61, + 36, 7, 3, 1, 253, 74, 36, 7, 3, 1, 250, 252, 36, 7, 3, 1, 249, 3, 36, 7, + 3, 1, 74, 36, 7, 3, 1, 244, 230, 36, 7, 3, 1, 243, 177, 36, 7, 3, 1, 242, + 41, 36, 7, 3, 1, 72, 36, 7, 3, 1, 235, 142, 36, 7, 3, 1, 235, 27, 36, 7, + 3, 1, 150, 36, 7, 3, 1, 183, 36, 7, 3, 1, 204, 36, 7, 3, 1, 75, 36, 7, 3, + 1, 226, 229, 36, 7, 3, 1, 224, 240, 36, 7, 3, 1, 149, 36, 7, 3, 1, 197, + 36, 7, 3, 1, 218, 99, 36, 7, 3, 1, 69, 36, 7, 3, 1, 215, 79, 36, 7, 3, 1, + 214, 82, 36, 7, 3, 1, 213, 166, 36, 7, 3, 1, 213, 105, 36, 7, 3, 1, 212, + 152, 36, 21, 212, 79, 146, 36, 50, 245, 124, 146, 36, 50, 216, 41, 146, + 36, 50, 217, 117, 146, 36, 50, 243, 231, 146, 36, 50, 244, 87, 146, 36, + 50, 220, 47, 146, 36, 50, 221, 40, 146, 36, 50, 245, 147, 146, 36, 50, + 229, 28, 146, 36, 50, 216, 38, 51, 36, 21, 116, 51, 36, 21, 109, 51, 36, + 21, 166, 51, 36, 21, 163, 51, 36, 21, 180, 51, 36, 21, 189, 51, 36, 21, + 198, 51, 36, 21, 195, 51, 36, 21, 200, 51, 36, 50, 217, 200, 146, 36, 21, + 212, 79, 92, 96, 177, 241, 31, 92, 96, 107, 241, 31, 92, 96, 177, 214, + 216, 92, 96, 107, 214, 216, 92, 96, 177, 216, 169, 248, 102, 241, 31, 92, + 96, 107, 216, 169, 248, 102, 241, 31, 92, 96, 177, 216, 169, 248, 102, + 214, 216, 92, 96, 107, 216, 169, 248, 102, 214, 216, 92, 96, 177, 224, + 169, 248, 102, 241, 31, 92, 96, 107, 224, 169, 248, 102, 241, 31, 92, 96, + 177, 224, 169, 248, 102, 214, 216, 92, 96, 107, 224, 169, 248, 102, 214, + 216, 92, 96, 177, 119, 24, 223, 148, 92, 96, 119, 177, 24, 46, 241, 205, + 92, 96, 119, 107, 24, 46, 233, 2, 92, 96, 107, 119, 24, 223, 148, 92, 96, + 177, 119, 24, 233, 70, 92, 96, 119, 177, 24, 42, 241, 205, 92, 96, 119, + 107, 24, 42, 233, 2, 92, 96, 107, 119, 24, 233, 70, 92, 96, 177, 114, 24, + 223, 148, 92, 96, 114, 177, 24, 46, 241, 205, 92, 96, 114, 107, 24, 46, + 233, 2, 92, 96, 107, 114, 24, 223, 148, 92, 96, 177, 114, 24, 233, 70, + 92, 96, 114, 177, 24, 42, 241, 205, 92, 96, 114, 107, 24, 42, 233, 2, 92, + 96, 107, 114, 24, 233, 70, 92, 96, 177, 71, 24, 223, 148, 92, 96, 71, + 177, 24, 46, 241, 205, 92, 96, 114, 107, 24, 46, 119, 233, 2, 92, 96, + 119, 107, 24, 46, 114, 233, 2, 92, 96, 71, 107, 24, 46, 233, 2, 92, 96, + 119, 177, 24, 46, 114, 241, 205, 92, 96, 114, 177, 24, 46, 119, 241, 205, + 92, 96, 107, 71, 24, 223, 148, 92, 96, 177, 71, 24, 233, 70, 92, 96, 71, + 177, 24, 42, 241, 205, 92, 96, 114, 107, 24, 42, 119, 233, 2, 92, 96, + 119, 107, 24, 42, 114, 233, 2, 92, 96, 71, 107, 24, 42, 233, 2, 92, 96, + 119, 177, 24, 42, 114, 241, 205, 92, 96, 114, 177, 24, 42, 119, 241, 205, + 92, 96, 107, 71, 24, 233, 70, 92, 96, 177, 119, 24, 241, 31, 92, 96, 42, + 107, 24, 46, 119, 233, 2, 92, 96, 46, 107, 24, 42, 119, 233, 2, 92, 96, + 119, 177, 24, 199, 241, 205, 92, 96, 119, 107, 24, 199, 233, 2, 92, 96, + 46, 177, 24, 42, 119, 241, 205, 92, 96, 42, 177, 24, 46, 119, 241, 205, + 92, 96, 107, 119, 24, 241, 31, 92, 96, 177, 114, 24, 241, 31, 92, 96, 42, + 107, 24, 46, 114, 233, 2, 92, 96, 46, 107, 24, 42, 114, 233, 2, 92, 96, + 114, 177, 24, 199, 241, 205, 92, 96, 114, 107, 24, 199, 233, 2, 92, 96, + 46, 177, 24, 42, 114, 241, 205, 92, 96, 42, 177, 24, 46, 114, 241, 205, + 92, 96, 107, 114, 24, 241, 31, 92, 96, 177, 71, 24, 241, 31, 92, 96, 42, + 107, 24, 46, 71, 233, 2, 92, 96, 46, 107, 24, 42, 71, 233, 2, 92, 96, 71, + 177, 24, 199, 241, 205, 92, 96, 114, 107, 24, 119, 199, 233, 2, 92, 96, + 119, 107, 24, 114, 199, 233, 2, 92, 96, 71, 107, 24, 199, 233, 2, 92, 96, + 42, 114, 107, 24, 46, 119, 233, 2, 92, 96, 46, 114, 107, 24, 42, 119, + 233, 2, 92, 96, 42, 119, 107, 24, 46, 114, 233, 2, 92, 96, 46, 119, 107, + 24, 42, 114, 233, 2, 92, 96, 119, 177, 24, 114, 199, 241, 205, 92, 96, + 114, 177, 24, 119, 199, 241, 205, 92, 96, 46, 177, 24, 42, 71, 241, 205, + 92, 96, 42, 177, 24, 46, 71, 241, 205, 92, 96, 107, 71, 24, 241, 31, 92, + 96, 177, 51, 248, 102, 241, 31, 92, 96, 107, 51, 248, 102, 241, 31, 92, + 96, 177, 51, 248, 102, 214, 216, 92, 96, 107, 51, 248, 102, 214, 216, 92, + 96, 51, 241, 31, 92, 96, 51, 214, 216, 92, 96, 119, 220, 81, 24, 46, 246, + 67, 92, 96, 119, 51, 24, 46, 220, 80, 92, 96, 51, 119, 24, 223, 148, 92, + 96, 119, 220, 81, 24, 42, 246, 67, 92, 96, 119, 51, 24, 42, 220, 80, 92, + 96, 51, 119, 24, 233, 70, 92, 96, 114, 220, 81, 24, 46, 246, 67, 92, 96, + 114, 51, 24, 46, 220, 80, 92, 96, 51, 114, 24, 223, 148, 92, 96, 114, + 220, 81, 24, 42, 246, 67, 92, 96, 114, 51, 24, 42, 220, 80, 92, 96, 51, + 114, 24, 233, 70, 92, 96, 71, 220, 81, 24, 46, 246, 67, 92, 96, 71, 51, + 24, 46, 220, 80, 92, 96, 51, 71, 24, 223, 148, 92, 96, 71, 220, 81, 24, + 42, 246, 67, 92, 96, 71, 51, 24, 42, 220, 80, 92, 96, 51, 71, 24, 233, + 70, 92, 96, 119, 220, 81, 24, 199, 246, 67, 92, 96, 119, 51, 24, 199, + 220, 80, 92, 96, 51, 119, 24, 241, 31, 92, 96, 114, 220, 81, 24, 199, + 246, 67, 92, 96, 114, 51, 24, 199, 220, 80, 92, 96, 51, 114, 24, 241, 31, + 92, 96, 71, 220, 81, 24, 199, 246, 67, 92, 96, 71, 51, 24, 199, 220, 80, + 92, 96, 51, 71, 24, 241, 31, 92, 96, 177, 253, 196, 119, 24, 223, 148, + 92, 96, 177, 253, 196, 119, 24, 233, 70, 92, 96, 177, 253, 196, 114, 24, + 233, 70, 92, 96, 177, 253, 196, 114, 24, 223, 148, 92, 96, 177, 247, 207, + 215, 131, 46, 211, 211, 232, 163, 233, 70, 92, 96, 177, 247, 207, 215, + 131, 42, 211, 211, 232, 163, 223, 148, 92, 96, 177, 247, 207, 249, 70, + 92, 96, 177, 233, 70, 92, 96, 177, 215, 134, 92, 96, 177, 223, 148, 92, + 96, 177, 246, 60, 92, 96, 107, 233, 70, 92, 96, 107, 215, 134, 92, 96, + 107, 223, 148, 92, 96, 107, 246, 60, 92, 96, 177, 42, 24, 107, 223, 148, + 92, 96, 177, 114, 24, 107, 246, 60, 92, 96, 107, 42, 24, 177, 223, 148, + 92, 96, 107, 114, 24, 177, 246, 60, 215, 131, 151, 251, 136, 232, 163, + 122, 245, 146, 251, 136, 232, 163, 122, 224, 167, 251, 136, 232, 163, + 133, 245, 144, 251, 136, 232, 163, 151, 251, 136, 232, 163, 244, 50, 245, + 144, 251, 136, 232, 163, 133, 224, 165, 251, 136, 232, 163, 221, 43, 245, + 144, 251, 136, 243, 200, 251, 136, 42, 221, 43, 245, 144, 251, 136, 42, + 133, 224, 165, 251, 136, 42, 244, 50, 245, 144, 251, 136, 42, 151, 251, + 136, 42, 133, 245, 144, 251, 136, 42, 122, 224, 167, 251, 136, 42, 122, + 245, 146, 251, 136, 46, 151, 251, 136, 177, 221, 14, 231, 147, 221, 14, + 248, 107, 221, 14, 215, 131, 122, 245, 146, 251, 136, 46, 122, 245, 146, + 251, 136, 224, 171, 232, 163, 233, 70, 224, 171, 232, 163, 223, 148, 224, + 171, 215, 131, 233, 70, 224, 171, 215, 131, 42, 24, 232, 163, 42, 24, + 232, 163, 223, 148, 224, 171, 215, 131, 42, 24, 232, 163, 223, 148, 224, + 171, 215, 131, 42, 24, 215, 131, 46, 24, 232, 163, 233, 70, 224, 171, + 215, 131, 42, 24, 215, 131, 46, 24, 232, 163, 223, 148, 224, 171, 215, + 131, 223, 148, 224, 171, 215, 131, 46, 24, 232, 163, 233, 70, 224, 171, + 215, 131, 46, 24, 232, 163, 42, 24, 232, 163, 223, 148, 83, 219, 166, 67, + 219, 166, 67, 41, 2, 223, 85, 249, 98, 67, 41, 249, 126, 83, 3, 219, 166, + 41, 2, 199, 244, 74, 41, 2, 71, 244, 74, 41, 2, 227, 11, 249, 66, 244, + 74, 41, 2, 215, 131, 42, 211, 211, 232, 163, 46, 244, 74, 41, 2, 215, + 131, 46, 211, 211, 232, 163, 42, 244, 74, 41, 2, 247, 207, 249, 66, 244, + 74, 83, 3, 219, 166, 67, 3, 219, 166, 83, 224, 9, 67, 224, 9, 83, 71, + 224, 9, 67, 71, 224, 9, 83, 226, 134, 67, 226, 134, 83, 215, 133, 216, + 183, 67, 215, 133, 216, 183, 83, 215, 133, 3, 216, 183, 67, 215, 133, 3, + 216, 183, 83, 223, 144, 216, 183, 67, 223, 144, 216, 183, 83, 223, 144, + 3, 216, 183, 67, 223, 144, 3, 216, 183, 83, 223, 144, 225, 142, 67, 223, + 144, 225, 142, 83, 246, 59, 216, 183, 67, 246, 59, 216, 183, 83, 246, 59, + 3, 216, 183, 67, 246, 59, 3, 216, 183, 83, 233, 66, 216, 183, 67, 233, + 66, 216, 183, 83, 233, 66, 3, 216, 183, 67, 233, 66, 3, 216, 183, 83, + 233, 66, 225, 142, 67, 233, 66, 225, 142, 83, 247, 200, 67, 247, 200, 67, + 247, 201, 249, 126, 83, 3, 247, 200, 244, 58, 232, 159, 67, 249, 228, + 246, 72, 249, 228, 249, 229, 2, 71, 244, 74, 251, 40, 83, 249, 228, 249, + 229, 2, 42, 151, 251, 144, 249, 229, 2, 46, 151, 251, 144, 249, 229, 2, + 232, 163, 151, 251, 144, 249, 229, 2, 215, 131, 151, 251, 144, 249, 229, + 2, 215, 131, 46, 224, 171, 251, 144, 249, 229, 2, 254, 64, 251, 17, 215, + 131, 42, 224, 171, 251, 144, 42, 151, 83, 249, 228, 46, 151, 83, 249, + 228, 235, 192, 251, 42, 235, 192, 67, 249, 228, 215, 131, 151, 235, 192, + 67, 249, 228, 232, 163, 151, 235, 192, 67, 249, 228, 215, 131, 42, 224, + 171, 249, 226, 253, 195, 215, 131, 46, 224, 171, 249, 226, 253, 195, 232, + 163, 46, 224, 171, 249, 226, 253, 195, 232, 163, 42, 224, 171, 249, 226, + 253, 195, 215, 131, 151, 249, 228, 232, 163, 151, 249, 228, 83, 232, 163, + 46, 216, 183, 83, 232, 163, 42, 216, 183, 83, 215, 131, 42, 216, 183, 83, + 215, 131, 46, 216, 183, 67, 251, 42, 41, 2, 42, 151, 251, 144, 41, 2, 46, + 151, 251, 144, 41, 2, 215, 131, 42, 247, 207, 151, 251, 144, 41, 2, 232, + 163, 46, 247, 207, 151, 251, 144, 67, 41, 2, 71, 251, 155, 232, 242, 67, + 215, 133, 216, 184, 2, 247, 74, 215, 133, 216, 184, 2, 42, 151, 251, 144, + 215, 133, 216, 184, 2, 46, 151, 251, 144, 233, 108, 249, 228, 67, 41, 2, + 215, 131, 42, 224, 170, 67, 41, 2, 232, 163, 42, 224, 170, 67, 41, 2, + 232, 163, 46, 224, 170, 67, 41, 2, 215, 131, 46, 224, 170, 67, 249, 229, + 2, 215, 131, 42, 224, 170, 67, 249, 229, 2, 232, 163, 42, 224, 170, 67, + 249, 229, 2, 232, 163, 46, 224, 170, 67, 249, 229, 2, 215, 131, 46, 224, + 170, 215, 131, 42, 216, 183, 215, 131, 46, 216, 183, 232, 163, 42, 216, + 183, 67, 231, 147, 219, 166, 83, 231, 147, 219, 166, 67, 231, 147, 3, + 219, 166, 83, 231, 147, 3, 219, 166, 232, 163, 46, 216, 183, 83, 218, + 239, 2, 224, 25, 249, 184, 215, 164, 219, 244, 249, 160, 83, 219, 95, 67, + 219, 95, 233, 0, 217, 86, 218, 238, 253, 149, 228, 182, 247, 245, 228, + 182, 249, 135, 227, 29, 83, 217, 209, 67, 217, 209, 252, 75, 251, 89, + 252, 75, 92, 2, 250, 65, 252, 75, 92, 2, 213, 166, 222, 169, 215, 165, 2, + 224, 51, 246, 39, 240, 230, 251, 199, 67, 220, 182, 225, 233, 83, 220, + 182, 225, 233, 221, 10, 223, 202, 223, 89, 244, 24, 241, 212, 251, 42, + 83, 42, 225, 141, 235, 239, 83, 46, 225, 141, 235, 239, 67, 42, 225, 141, + 235, 239, 67, 114, 225, 141, 235, 239, 67, 46, 225, 141, 235, 239, 67, + 119, 225, 141, 235, 239, 220, 29, 24, 249, 69, 250, 152, 52, 224, 62, 52, + 251, 162, 52, 250, 211, 254, 13, 227, 12, 249, 70, 250, 48, 223, 190, + 249, 71, 65, 232, 173, 249, 71, 65, 235, 117, 219, 96, 24, 249, 76, 244, + 136, 87, 254, 153, 221, 12, 242, 5, 24, 220, 115, 226, 95, 87, 212, 245, + 213, 58, 216, 173, 31, 241, 207, 216, 173, 31, 233, 131, 216, 173, 31, + 244, 65, 216, 173, 31, 217, 87, 216, 173, 31, 213, 224, 216, 173, 31, + 214, 24, 216, 173, 31, 230, 185, 216, 173, 31, 245, 179, 213, 242, 65, + 247, 226, 67, 243, 209, 244, 158, 67, 220, 2, 244, 158, 83, 220, 2, 244, + 158, 67, 218, 239, 2, 224, 25, 244, 61, 224, 167, 230, 198, 233, 103, + 224, 167, 230, 198, 231, 118, 244, 107, 52, 245, 179, 231, 253, 52, 235, + 41, 222, 137, 215, 116, 229, 175, 225, 154, 253, 183, 217, 247, 243, 28, + 250, 191, 233, 43, 214, 131, 233, 10, 222, 110, 222, 188, 250, 180, 253, + 212, 225, 184, 67, 250, 54, 234, 87, 67, 250, 54, 224, 159, 67, 250, 54, + 223, 97, 67, 250, 54, 251, 154, 67, 250, 54, 234, 39, 67, 250, 54, 226, + 105, 83, 250, 54, 234, 87, 83, 250, 54, 224, 159, 83, 250, 54, 223, 97, + 83, 250, 54, 251, 154, 83, 250, 54, 234, 39, 83, 250, 54, 226, 105, 83, + 219, 204, 218, 251, 67, 241, 212, 218, 251, 67, 247, 201, 218, 251, 83, + 249, 182, 218, 251, 67, 219, 204, 218, 251, 83, 241, 212, 218, 251, 83, + 247, 201, 218, 251, 67, 249, 182, 218, 251, 240, 230, 219, 170, 224, 167, + 228, 158, 245, 146, 228, 158, 251, 249, 245, 146, 228, 153, 251, 249, + 220, 46, 228, 153, 230, 127, 244, 35, 52, 230, 127, 230, 9, 52, 230, 127, + 220, 255, 52, 213, 250, 175, 249, 70, 245, 176, 175, 249, 70, 215, 142, + 224, 5, 87, 224, 5, 16, 31, 216, 14, 225, 166, 224, 5, 16, 31, 216, 13, + 225, 166, 224, 5, 16, 31, 216, 12, 225, 166, 224, 5, 16, 31, 216, 11, + 225, 166, 224, 5, 16, 31, 216, 10, 225, 166, 224, 5, 16, 31, 216, 9, 225, + 166, 224, 5, 16, 31, 216, 8, 225, 166, 224, 5, 16, 31, 243, 26, 231, 201, + 83, 215, 142, 224, 5, 87, 224, 6, 226, 148, 87, 226, 124, 226, 148, 87, + 226, 49, 226, 148, 52, 213, 240, 87, 247, 193, 244, 157, 247, 193, 244, + 156, 247, 193, 244, 155, 247, 193, 244, 154, 247, 193, 244, 153, 247, + 193, 244, 152, 67, 249, 229, 2, 62, 223, 148, 67, 249, 229, 2, 117, 247, + 72, 83, 249, 229, 2, 67, 62, 223, 148, 83, 249, 229, 2, 117, 67, 247, 72, + 230, 212, 31, 213, 58, 230, 212, 31, 212, 244, 247, 176, 31, 242, 108, + 213, 58, 247, 176, 31, 233, 37, 212, 244, 247, 176, 31, 233, 37, 213, 58, + 247, 176, 31, 242, 108, 212, 244, 67, 244, 42, 83, 244, 42, 242, 5, 24, + 225, 236, 254, 29, 249, 68, 218, 180, 219, 103, 65, 254, 131, 222, 124, + 254, 77, 244, 20, 243, 36, 219, 103, 65, 241, 187, 253, 115, 87, 244, 31, + 226, 250, 67, 219, 95, 133, 232, 237, 249, 114, 223, 148, 133, 232, 237, + 249, 114, 233, 70, 214, 34, 52, 124, 214, 111, 52, 246, 64, 244, 107, 52, + 246, 64, 231, 253, 52, 235, 200, 244, 107, 24, 231, 253, 52, 231, 253, + 24, 244, 107, 52, 231, 253, 2, 219, 45, 52, 231, 253, 2, 219, 45, 24, + 231, 253, 24, 244, 107, 52, 71, 231, 253, 2, 219, 45, 52, 199, 231, 253, + 2, 219, 45, 52, 231, 147, 67, 249, 228, 231, 147, 83, 249, 228, 231, 147, + 3, 67, 249, 228, 231, 216, 87, 247, 119, 87, 215, 140, 226, 123, 87, 249, + 169, 243, 196, 215, 112, 229, 170, 250, 95, 226, 188, 235, 47, 214, 162, + 250, 30, 83, 230, 199, 232, 253, 221, 33, 221, 67, 224, 150, 221, 51, + 219, 239, 252, 78, 252, 46, 91, 234, 144, 67, 246, 48, 231, 248, 67, 246, + 48, 234, 87, 83, 246, 48, 231, 248, 83, 246, 48, 234, 87, 219, 245, 213, + 216, 219, 248, 218, 239, 251, 227, 249, 184, 224, 50, 83, 219, 244, 217, + 88, 249, 185, 24, 224, 50, 216, 58, 67, 220, 182, 225, 233, 216, 58, 83, + 220, 182, 225, 233, 67, 247, 201, 235, 252, 219, 166, 249, 65, 233, 115, + 247, 145, 250, 176, 227, 32, 225, 236, 250, 177, 220, 16, 241, 196, 2, + 67, 249, 70, 36, 249, 65, 233, 115, 250, 88, 228, 186, 245, 83, 254, 50, + 227, 57, 42, 214, 10, 216, 208, 83, 216, 21, 42, 214, 10, 216, 208, 67, + 216, 21, 42, 214, 10, 216, 208, 83, 42, 233, 116, 231, 117, 67, 42, 233, + 116, 231, 117, 246, 44, 220, 10, 52, 107, 67, 246, 59, 216, 183, 42, 249, + 193, 245, 83, 91, 222, 169, 244, 143, 247, 207, 235, 252, 67, 249, 229, + 235, 252, 83, 219, 166, 83, 216, 150, 223, 212, 42, 245, 82, 223, 212, + 42, 245, 81, 253, 127, 16, 31, 215, 116, 107, 249, 229, 2, 219, 45, 24, + 117, 176, 49, 226, 64, 223, 145, 235, 202, 226, 64, 233, 67, 235, 202, + 226, 64, 235, 191, 226, 64, 83, 249, 71, 227, 63, 220, 209, 220, 197, + 220, 154, 249, 254, 250, 158, 241, 143, 220, 54, 243, 37, 213, 216, 240, + 210, 243, 37, 2, 241, 251, 231, 236, 16, 31, 233, 1, 230, 185, 215, 165, + 227, 63, 242, 100, 243, 238, 244, 43, 235, 252, 241, 45, 244, 98, 222, + 185, 41, 243, 237, 249, 98, 220, 32, 240, 105, 220, 35, 226, 44, 2, 252, + 78, 217, 195, 235, 131, 252, 65, 87, 241, 215, 242, 110, 87, 243, 203, + 225, 28, 249, 44, 227, 63, 83, 219, 166, 67, 244, 43, 2, 199, 231, 37, + 83, 219, 46, 215, 131, 251, 140, 222, 112, 83, 222, 112, 232, 163, 251, + 140, 222, 112, 67, 222, 112, 67, 107, 250, 66, 77, 217, 210, 232, 206, + 52, 218, 4, 246, 43, 254, 99, 245, 78, 224, 48, 244, 54, 224, 48, 241, + 254, 214, 152, 241, 254, 213, 186, 241, 254, 232, 163, 46, 226, 73, 226, + 73, 215, 131, 46, 226, 73, 67, 229, 61, 83, 229, 61, 250, 66, 77, 107, + 250, 66, 77, 230, 154, 213, 166, 107, 230, 154, 213, 166, 252, 75, 213, + 166, 107, 252, 75, 213, 166, 226, 250, 25, 249, 70, 107, 25, 249, 70, + 227, 40, 250, 109, 249, 70, 107, 227, 40, 250, 109, 249, 70, 7, 249, 70, + 221, 13, 67, 7, 249, 70, 226, 250, 7, 249, 70, 231, 250, 249, 70, 219, + 96, 65, 248, 95, 243, 237, 217, 223, 253, 132, 243, 237, 252, 76, 253, + 132, 107, 243, 237, 252, 76, 253, 132, 243, 237, 249, 180, 253, 132, 83, + 243, 237, 225, 143, 219, 95, 67, 243, 237, 225, 143, 219, 95, 219, 199, + 219, 51, 226, 250, 67, 219, 95, 36, 67, 219, 95, 227, 40, 250, 109, 83, + 219, 95, 83, 250, 109, 67, 219, 95, 226, 250, 83, 219, 95, 107, 226, 250, + 83, 219, 95, 225, 192, 219, 95, 221, 13, 67, 219, 95, 107, 253, 132, 227, + 40, 250, 109, 253, 132, 245, 150, 219, 176, 253, 132, 245, 150, 225, 143, + 83, 219, 95, 245, 150, 225, 143, 225, 192, 219, 95, 220, 53, 225, 143, + 83, 219, 95, 245, 150, 225, 143, 224, 7, 83, 219, 95, 107, 245, 150, 225, + 143, 224, 7, 83, 219, 95, 216, 42, 225, 143, 83, 219, 95, 220, 48, 225, + 143, 253, 132, 217, 223, 253, 132, 227, 40, 250, 109, 217, 223, 253, 132, + 107, 217, 223, 253, 132, 220, 53, 226, 33, 83, 24, 67, 244, 23, 83, 244, + 23, 67, 244, 23, 245, 150, 226, 33, 226, 250, 83, 244, 23, 36, 227, 40, + 250, 109, 245, 150, 225, 143, 219, 95, 107, 217, 223, 225, 192, 253, 132, + 219, 246, 217, 59, 216, 176, 219, 246, 107, 250, 51, 219, 246, 219, 201, + 107, 219, 201, 252, 76, 253, 132, 245, 150, 217, 223, 225, 55, 253, 132, + 107, 245, 150, 217, 223, 225, 55, 253, 132, 249, 71, 77, 221, 13, 67, + 249, 228, 146, 91, 249, 71, 77, 232, 163, 46, 246, 41, 67, 219, 166, 215, + 131, 46, 246, 41, 67, 219, 166, 232, 163, 46, 221, 13, 67, 219, 166, 215, + 131, 46, 221, 13, 67, 219, 166, 83, 224, 158, 152, 227, 14, 67, 224, 158, + 152, 227, 14, 67, 244, 254, 152, 227, 14, 83, 247, 201, 230, 251, 67, + 213, 166, 107, 244, 254, 152, 87, 177, 71, 134, 231, 147, 71, 134, 107, + 71, 134, 107, 220, 81, 216, 58, 249, 158, 224, 143, 152, 227, 14, 107, + 220, 81, 249, 158, 224, 143, 152, 227, 14, 107, 51, 216, 58, 249, 158, + 224, 143, 152, 227, 14, 107, 51, 249, 158, 224, 143, 152, 227, 14, 107, + 115, 220, 81, 249, 158, 224, 143, 152, 227, 14, 107, 115, 51, 249, 158, + 224, 143, 152, 227, 14, 249, 33, 219, 80, 226, 143, 5, 227, 14, 107, 244, + 254, 152, 227, 14, 107, 241, 212, 244, 254, 152, 227, 14, 107, 83, 241, + 211, 223, 89, 107, 83, 241, 212, 251, 42, 244, 24, 241, 211, 223, 89, + 244, 24, 241, 212, 251, 42, 231, 147, 42, 226, 132, 227, 14, 231, 147, + 46, 226, 132, 227, 14, 231, 147, 244, 32, 42, 226, 132, 227, 14, 231, + 147, 244, 32, 46, 226, 132, 227, 14, 231, 147, 233, 66, 254, 19, 251, 85, + 227, 14, 231, 147, 223, 144, 254, 19, 251, 85, 227, 14, 107, 233, 66, + 254, 19, 224, 143, 152, 227, 14, 107, 223, 144, 254, 19, 224, 143, 152, + 227, 14, 107, 233, 66, 254, 19, 251, 85, 227, 14, 107, 223, 144, 254, 19, + 251, 85, 227, 14, 177, 42, 216, 219, 220, 233, 251, 85, 227, 14, 177, 46, + 216, 219, 220, 233, 251, 85, 227, 14, 231, 147, 42, 249, 40, 251, 85, + 227, 14, 231, 147, 46, 249, 40, 251, 85, 227, 14, 247, 156, 146, 36, 21, + 116, 247, 156, 146, 36, 21, 109, 247, 156, 146, 36, 21, 166, 247, 156, + 146, 36, 21, 163, 247, 156, 146, 36, 21, 180, 247, 156, 146, 36, 21, 189, + 247, 156, 146, 36, 21, 198, 247, 156, 146, 36, 21, 195, 247, 156, 146, + 36, 21, 200, 247, 156, 146, 36, 50, 217, 200, 247, 156, 36, 35, 21, 116, + 247, 156, 36, 35, 21, 109, 247, 156, 36, 35, 21, 166, 247, 156, 36, 35, + 21, 163, 247, 156, 36, 35, 21, 180, 247, 156, 36, 35, 21, 189, 247, 156, + 36, 35, 21, 198, 247, 156, 36, 35, 21, 195, 247, 156, 36, 35, 21, 200, + 247, 156, 36, 35, 50, 217, 200, 247, 156, 146, 36, 35, 21, 116, 247, 156, + 146, 36, 35, 21, 109, 247, 156, 146, 36, 35, 21, 166, 247, 156, 146, 36, + 35, 21, 163, 247, 156, 146, 36, 35, 21, 180, 247, 156, 146, 36, 35, 21, + 189, 247, 156, 146, 36, 35, 21, 198, 247, 156, 146, 36, 35, 21, 195, 247, + 156, 146, 36, 35, 21, 200, 247, 156, 146, 36, 35, 50, 217, 200, 107, 213, + 231, 95, 68, 107, 94, 52, 107, 230, 251, 52, 107, 247, 121, 52, 107, 219, + 215, 245, 176, 68, 107, 95, 68, 107, 228, 167, 245, 176, 68, 246, 52, + 225, 145, 95, 68, 107, 223, 86, 95, 68, 216, 182, 95, 68, 107, 216, 182, + 95, 68, 248, 100, 216, 182, 95, 68, 107, 248, 100, 216, 182, 95, 68, 83, + 95, 68, 217, 97, 216, 225, 95, 253, 164, 217, 97, 251, 99, 95, 253, 164, + 83, 95, 253, 164, 107, 83, 249, 33, 246, 58, 24, 95, 68, 107, 83, 249, + 33, 215, 124, 24, 95, 68, 219, 163, 83, 95, 68, 107, 249, 145, 83, 95, + 68, 223, 143, 67, 95, 68, 233, 65, 67, 95, 68, 252, 100, 221, 13, 67, 95, + 68, 243, 211, 221, 13, 67, 95, 68, 107, 232, 163, 223, 142, 67, 95, 68, + 107, 215, 131, 223, 142, 67, 95, 68, 228, 160, 232, 163, 223, 142, 67, + 95, 68, 249, 40, 232, 177, 228, 160, 215, 131, 223, 142, 67, 95, 68, 36, + 107, 67, 95, 68, 213, 237, 95, 68, 251, 143, 219, 215, 245, 176, 68, 251, + 143, 95, 68, 251, 143, 228, 167, 245, 176, 68, 107, 251, 143, 219, 215, + 245, 176, 68, 107, 251, 143, 95, 68, 107, 251, 143, 228, 167, 245, 176, + 68, 217, 225, 95, 68, 107, 217, 224, 95, 68, 214, 2, 95, 68, 107, 214, 2, + 95, 68, 227, 37, 95, 68, 51, 249, 40, 232, 177, 133, 247, 166, 254, 18, + 67, 216, 184, 249, 126, 3, 67, 216, 183, 226, 47, 227, 40, 219, 8, 227, + 40, 218, 221, 42, 223, 3, 252, 91, 248, 11, 46, 223, 3, 252, 91, 248, 11, + 167, 2, 62, 235, 212, 223, 203, 219, 232, 225, 81, 219, 8, 218, 222, 225, + 81, 219, 231, 71, 252, 60, 2, 199, 90, 184, 247, 120, 91, 232, 199, 254, + 27, 91, 232, 199, 227, 24, 67, 247, 201, 2, 250, 107, 247, 74, 24, 2, + 247, 74, 245, 127, 65, 227, 35, 215, 123, 232, 163, 46, 249, 100, 2, 247, + 74, 215, 131, 42, 249, 100, 2, 247, 74, 42, 226, 252, 235, 69, 46, 226, + 252, 235, 69, 243, 200, 226, 252, 235, 69, 233, 108, 114, 218, 36, 233, + 108, 119, 218, 36, 42, 24, 46, 51, 216, 57, 42, 24, 46, 218, 36, 42, 230, + 157, 184, 46, 218, 36, 184, 42, 218, 36, 114, 218, 37, 2, 249, 229, 49, + 232, 160, 247, 125, 251, 7, 199, 223, 44, 67, 249, 144, 247, 200, 67, + 249, 144, 247, 201, 2, 132, 217, 68, 67, 249, 144, 247, 201, 2, 95, 217, + 68, 67, 41, 2, 132, 217, 68, 67, 41, 2, 95, 217, 68, 14, 42, 67, 41, 125, + 14, 46, 67, 41, 125, 14, 42, 254, 19, 125, 14, 46, 254, 19, 125, 14, 42, + 51, 254, 19, 125, 14, 46, 51, 254, 19, 125, 14, 42, 67, 216, 219, 220, + 233, 125, 14, 46, 67, 216, 219, 220, 233, 125, 14, 42, 244, 32, 226, 131, + 14, 46, 244, 32, 226, 131, 215, 124, 224, 169, 68, 246, 58, 224, 169, 68, + 253, 255, 243, 74, 249, 229, 68, 249, 195, 243, 74, 249, 229, 68, 46, 76, + 2, 36, 225, 156, 184, 132, 68, 184, 95, 68, 184, 42, 46, 68, 184, 132, + 51, 68, 184, 95, 51, 68, 184, 42, 46, 51, 68, 184, 132, 76, 243, 213, + 134, 184, 95, 76, 243, 213, 134, 184, 132, 51, 76, 243, 213, 134, 184, + 95, 51, 76, 243, 213, 134, 184, 95, 219, 162, 68, 44, 45, 251, 138, 44, + 45, 247, 71, 44, 45, 246, 199, 44, 45, 247, 70, 44, 45, 246, 135, 44, 45, + 247, 6, 44, 45, 246, 198, 44, 45, 247, 69, 44, 45, 246, 103, 44, 45, 246, + 230, 44, 45, 246, 166, 44, 45, 247, 37, 44, 45, 246, 134, 44, 45, 247, 5, + 44, 45, 246, 197, 44, 45, 247, 68, 44, 45, 246, 87, 44, 45, 246, 214, 44, + 45, 246, 150, 44, 45, 247, 21, 44, 45, 246, 118, 44, 45, 246, 245, 44, + 45, 246, 181, 44, 45, 247, 52, 44, 45, 246, 102, 44, 45, 246, 229, 44, + 45, 246, 165, 44, 45, 247, 36, 44, 45, 246, 133, 44, 45, 247, 4, 44, 45, + 246, 196, 44, 45, 247, 67, 44, 45, 246, 79, 44, 45, 246, 206, 44, 45, + 246, 142, 44, 45, 247, 13, 44, 45, 246, 110, 44, 45, 246, 237, 44, 45, + 246, 173, 44, 45, 247, 44, 44, 45, 246, 94, 44, 45, 246, 221, 44, 45, + 246, 157, 44, 45, 247, 28, 44, 45, 246, 125, 44, 45, 246, 252, 44, 45, + 246, 188, 44, 45, 247, 59, 44, 45, 246, 86, 44, 45, 246, 213, 44, 45, + 246, 149, 44, 45, 247, 20, 44, 45, 246, 117, 44, 45, 246, 244, 44, 45, + 246, 180, 44, 45, 247, 51, 44, 45, 246, 101, 44, 45, 246, 228, 44, 45, + 246, 164, 44, 45, 247, 35, 44, 45, 246, 132, 44, 45, 247, 3, 44, 45, 246, + 195, 44, 45, 247, 66, 44, 45, 246, 75, 44, 45, 246, 202, 44, 45, 246, + 138, 44, 45, 247, 9, 44, 45, 246, 106, 44, 45, 246, 233, 44, 45, 246, + 169, 44, 45, 247, 40, 44, 45, 246, 90, 44, 45, 246, 217, 44, 45, 246, + 153, 44, 45, 247, 24, 44, 45, 246, 121, 44, 45, 246, 248, 44, 45, 246, + 184, 44, 45, 247, 55, 44, 45, 246, 82, 44, 45, 246, 209, 44, 45, 246, + 145, 44, 45, 247, 16, 44, 45, 246, 113, 44, 45, 246, 240, 44, 45, 246, + 176, 44, 45, 247, 47, 44, 45, 246, 97, 44, 45, 246, 224, 44, 45, 246, + 160, 44, 45, 247, 31, 44, 45, 246, 128, 44, 45, 246, 255, 44, 45, 246, + 191, 44, 45, 247, 62, 44, 45, 246, 78, 44, 45, 246, 205, 44, 45, 246, + 141, 44, 45, 247, 12, 44, 45, 246, 109, 44, 45, 246, 236, 44, 45, 246, + 172, 44, 45, 247, 43, 44, 45, 246, 93, 44, 45, 246, 220, 44, 45, 246, + 156, 44, 45, 247, 27, 44, 45, 246, 124, 44, 45, 246, 251, 44, 45, 246, + 187, 44, 45, 247, 58, 44, 45, 246, 85, 44, 45, 246, 212, 44, 45, 246, + 148, 44, 45, 247, 19, 44, 45, 246, 116, 44, 45, 246, 243, 44, 45, 246, + 179, 44, 45, 247, 50, 44, 45, 246, 100, 44, 45, 246, 227, 44, 45, 246, + 163, 44, 45, 247, 34, 44, 45, 246, 131, 44, 45, 247, 2, 44, 45, 246, 194, + 44, 45, 247, 65, 44, 45, 246, 73, 44, 45, 246, 200, 44, 45, 246, 136, 44, + 45, 247, 7, 44, 45, 246, 104, 44, 45, 246, 231, 44, 45, 246, 167, 44, 45, + 247, 38, 44, 45, 246, 88, 44, 45, 246, 215, 44, 45, 246, 151, 44, 45, + 247, 22, 44, 45, 246, 119, 44, 45, 246, 246, 44, 45, 246, 182, 44, 45, + 247, 53, 44, 45, 246, 80, 44, 45, 246, 207, 44, 45, 246, 143, 44, 45, + 247, 14, 44, 45, 246, 111, 44, 45, 246, 238, 44, 45, 246, 174, 44, 45, + 247, 45, 44, 45, 246, 95, 44, 45, 246, 222, 44, 45, 246, 158, 44, 45, + 247, 29, 44, 45, 246, 126, 44, 45, 246, 253, 44, 45, 246, 189, 44, 45, + 247, 60, 44, 45, 246, 76, 44, 45, 246, 203, 44, 45, 246, 139, 44, 45, + 247, 10, 44, 45, 246, 107, 44, 45, 246, 234, 44, 45, 246, 170, 44, 45, + 247, 41, 44, 45, 246, 91, 44, 45, 246, 218, 44, 45, 246, 154, 44, 45, + 247, 25, 44, 45, 246, 122, 44, 45, 246, 249, 44, 45, 246, 185, 44, 45, + 247, 56, 44, 45, 246, 83, 44, 45, 246, 210, 44, 45, 246, 146, 44, 45, + 247, 17, 44, 45, 246, 114, 44, 45, 246, 241, 44, 45, 246, 177, 44, 45, + 247, 48, 44, 45, 246, 98, 44, 45, 246, 225, 44, 45, 246, 161, 44, 45, + 247, 32, 44, 45, 246, 129, 44, 45, 247, 0, 44, 45, 246, 192, 44, 45, 247, + 63, 44, 45, 246, 74, 44, 45, 246, 201, 44, 45, 246, 137, 44, 45, 247, 8, + 44, 45, 246, 105, 44, 45, 246, 232, 44, 45, 246, 168, 44, 45, 247, 39, + 44, 45, 246, 89, 44, 45, 246, 216, 44, 45, 246, 152, 44, 45, 247, 23, 44, + 45, 246, 120, 44, 45, 246, 247, 44, 45, 246, 183, 44, 45, 247, 54, 44, + 45, 246, 81, 44, 45, 246, 208, 44, 45, 246, 144, 44, 45, 247, 15, 44, 45, + 246, 112, 44, 45, 246, 239, 44, 45, 246, 175, 44, 45, 247, 46, 44, 45, + 246, 96, 44, 45, 246, 223, 44, 45, 246, 159, 44, 45, 247, 30, 44, 45, + 246, 127, 44, 45, 246, 254, 44, 45, 246, 190, 44, 45, 247, 61, 44, 45, + 246, 77, 44, 45, 246, 204, 44, 45, 246, 140, 44, 45, 247, 11, 44, 45, + 246, 108, 44, 45, 246, 235, 44, 45, 246, 171, 44, 45, 247, 42, 44, 45, + 246, 92, 44, 45, 246, 219, 44, 45, 246, 155, 44, 45, 247, 26, 44, 45, + 246, 123, 44, 45, 246, 250, 44, 45, 246, 186, 44, 45, 247, 57, 44, 45, + 246, 84, 44, 45, 246, 211, 44, 45, 246, 147, 44, 45, 247, 18, 44, 45, + 246, 115, 44, 45, 246, 242, 44, 45, 246, 178, 44, 45, 247, 49, 44, 45, + 246, 99, 44, 45, 246, 226, 44, 45, 246, 162, 44, 45, 247, 33, 44, 45, + 246, 130, 44, 45, 247, 1, 44, 45, 246, 193, 44, 45, 247, 64, 95, 216, 24, + 76, 2, 71, 90, 95, 216, 24, 76, 2, 51, 71, 90, 132, 51, 76, 2, 71, 90, + 95, 51, 76, 2, 71, 90, 42, 46, 51, 76, 2, 71, 90, 95, 216, 24, 76, 243, + 213, 134, 132, 51, 76, 243, 213, 134, 95, 51, 76, 243, 213, 134, 246, 58, + 76, 2, 199, 90, 215, 124, 76, 2, 199, 90, 215, 124, 216, 169, 68, 246, + 58, 216, 169, 68, 132, 51, 248, 102, 68, 95, 51, 248, 102, 68, 132, 216, + 169, 248, 102, 68, 95, 216, 169, 248, 102, 68, 95, 216, 24, 216, 169, + 248, 102, 68, 95, 76, 2, 246, 72, 219, 79, 215, 124, 76, 211, 211, 134, + 246, 58, 76, 211, 211, 134, 95, 76, 2, 218, 28, 2, 71, 90, 95, 76, 2, + 218, 28, 2, 51, 71, 90, 95, 216, 24, 76, 2, 218, 27, 95, 216, 24, 76, 2, + 218, 28, 2, 71, 90, 95, 216, 24, 76, 2, 218, 28, 2, 51, 71, 90, 132, 253, + 166, 95, 253, 166, 132, 51, 253, 166, 95, 51, 253, 166, 132, 76, 211, + 211, 83, 247, 200, 95, 76, 211, 211, 83, 247, 200, 132, 76, 243, 213, + 252, 60, 211, 211, 83, 247, 200, 95, 76, 243, 213, 252, 60, 211, 211, 83, + 247, 200, 228, 167, 213, 250, 24, 219, 215, 245, 176, 68, 228, 167, 245, + 176, 24, 219, 215, 213, 250, 68, 228, 167, 213, 250, 76, 2, 101, 228, + 167, 245, 176, 76, 2, 101, 219, 215, 245, 176, 76, 2, 101, 219, 215, 213, + 250, 76, 2, 101, 228, 167, 213, 250, 76, 24, 228, 167, 245, 176, 68, 228, + 167, 245, 176, 76, 24, 219, 215, 245, 176, 68, 219, 215, 245, 176, 76, + 24, 219, 215, 213, 250, 68, 219, 215, 213, 250, 76, 24, 228, 167, 213, + 250, 68, 223, 125, 247, 207, 249, 65, 244, 143, 247, 206, 244, 143, 247, + 207, 249, 65, 223, 125, 247, 206, 219, 215, 245, 176, 76, 249, 65, 228, + 167, 245, 176, 68, 228, 167, 245, 176, 76, 249, 65, 219, 215, 245, 176, + 68, 244, 143, 247, 207, 249, 65, 228, 167, 245, 176, 68, 223, 125, 247, + 207, 249, 65, 219, 215, 245, 176, 68, 228, 167, 245, 176, 76, 249, 65, + 228, 167, 213, 250, 68, 228, 167, 213, 250, 76, 249, 65, 228, 167, 245, + 176, 68, 214, 20, 76, 225, 141, 247, 147, 223, 148, 76, 225, 141, 95, + 217, 141, 249, 32, 215, 123, 76, 225, 141, 95, 217, 141, 249, 32, 246, + 57, 76, 225, 141, 246, 58, 217, 141, 249, 32, 233, 61, 76, 225, 141, 246, + 58, 217, 141, 249, 32, 223, 138, 223, 141, 253, 196, 249, 195, 68, 233, + 64, 253, 196, 253, 255, 68, 216, 227, 253, 196, 253, 255, 68, 251, 101, + 253, 196, 253, 255, 68, 216, 227, 253, 196, 249, 195, 76, 2, 230, 250, + 216, 227, 253, 196, 253, 255, 76, 2, 225, 156, 232, 163, 46, 221, 72, + 249, 195, 68, 232, 163, 42, 221, 72, 253, 255, 68, 253, 255, 249, 193, + 249, 229, 68, 249, 195, 249, 193, 249, 229, 68, 95, 76, 78, 220, 175, + 132, 68, 132, 76, 78, 220, 175, 95, 68, 220, 175, 95, 76, 78, 132, 68, + 95, 76, 2, 94, 55, 132, 76, 2, 94, 55, 95, 76, 217, 93, 213, 166, 42, 46, + 76, 217, 93, 3, 249, 228, 215, 124, 216, 24, 76, 243, 213, 3, 249, 228, + 42, 206, 114, 46, 206, 119, 241, 237, 42, 206, 119, 46, 206, 114, 241, + 237, 114, 206, 46, 119, 206, 42, 241, 237, 114, 206, 42, 119, 206, 46, + 241, 237, 42, 206, 114, 46, 206, 114, 241, 237, 114, 206, 46, 119, 206, + 46, 241, 237, 42, 206, 119, 46, 206, 119, 241, 237, 114, 206, 42, 119, + 206, 42, 241, 237, 132, 241, 238, 2, 206, 114, 211, 211, 134, 95, 241, + 238, 2, 206, 114, 211, 211, 134, 215, 124, 241, 238, 2, 206, 46, 211, + 211, 134, 246, 58, 241, 238, 2, 206, 46, 211, 211, 134, 132, 241, 238, 2, + 206, 119, 211, 211, 134, 95, 241, 238, 2, 206, 119, 211, 211, 134, 215, + 124, 241, 238, 2, 206, 42, 211, 211, 134, 246, 58, 241, 238, 2, 206, 42, + 211, 211, 134, 132, 241, 238, 2, 206, 114, 243, 213, 134, 95, 241, 238, + 2, 206, 114, 243, 213, 134, 215, 124, 241, 238, 2, 206, 46, 243, 213, + 134, 246, 58, 241, 238, 2, 206, 46, 243, 213, 134, 132, 241, 238, 2, 206, + 119, 243, 213, 134, 95, 241, 238, 2, 206, 119, 243, 213, 134, 215, 124, + 241, 238, 2, 206, 42, 243, 213, 134, 246, 58, 241, 238, 2, 206, 42, 243, + 213, 134, 132, 241, 238, 2, 206, 114, 78, 132, 241, 238, 2, 206, 246, 60, + 215, 124, 241, 238, 2, 206, 42, 251, 207, 215, 124, 241, 238, 2, 206, + 223, 148, 95, 241, 238, 2, 206, 114, 78, 95, 241, 238, 2, 206, 246, 60, + 246, 58, 241, 238, 2, 206, 42, 251, 207, 246, 58, 241, 238, 2, 206, 223, + 148, 132, 241, 238, 2, 206, 114, 78, 95, 241, 238, 2, 206, 215, 134, 132, + 241, 238, 2, 206, 119, 78, 95, 241, 238, 2, 206, 246, 60, 95, 241, 238, + 2, 206, 114, 78, 132, 241, 238, 2, 206, 215, 134, 95, 241, 238, 2, 206, + 119, 78, 132, 241, 238, 2, 206, 246, 60, 132, 241, 238, 2, 206, 114, 78, + 184, 248, 101, 132, 241, 238, 2, 206, 119, 251, 220, 184, 248, 101, 95, + 241, 238, 2, 206, 114, 78, 184, 248, 101, 95, 241, 238, 2, 206, 119, 251, + 220, 184, 248, 101, 215, 124, 241, 238, 2, 206, 42, 251, 207, 246, 58, + 241, 238, 2, 206, 223, 148, 246, 58, 241, 238, 2, 206, 42, 251, 207, 215, + 124, 241, 238, 2, 206, 223, 148, 46, 51, 76, 2, 223, 85, 241, 219, 245, + 61, 5, 78, 95, 68, 217, 43, 227, 34, 78, 95, 68, 132, 76, 78, 217, 43, + 227, 33, 95, 76, 78, 217, 43, 227, 33, 95, 76, 78, 254, 57, 123, 108, + 233, 39, 78, 132, 68, 132, 76, 217, 93, 233, 38, 242, 107, 78, 95, 68, + 219, 9, 78, 95, 68, 132, 76, 217, 93, 219, 8, 218, 222, 78, 132, 68, 42, + 244, 60, 218, 27, 46, 244, 60, 218, 27, 114, 244, 60, 218, 27, 119, 244, + 60, 218, 27, 216, 169, 71, 252, 60, 248, 11, 212, 153, 174, 219, 174, + 212, 153, 174, 216, 15, 249, 164, 42, 67, 249, 40, 125, 46, 67, 249, 40, + 125, 42, 67, 226, 131, 46, 67, 226, 131, 212, 153, 174, 42, 236, 10, 125, + 212, 153, 174, 46, 236, 10, 125, 212, 153, 174, 42, 251, 165, 125, 212, + 153, 174, 46, 251, 165, 125, 42, 41, 251, 85, 2, 215, 153, 46, 41, 251, + 85, 2, 215, 153, 42, 41, 251, 85, 2, 217, 69, 235, 252, 216, 227, 249, + 99, 46, 41, 251, 85, 2, 217, 69, 235, 252, 251, 101, 249, 99, 42, 41, + 251, 85, 2, 217, 69, 235, 252, 251, 101, 249, 99, 46, 41, 251, 85, 2, + 217, 69, 235, 252, 216, 227, 249, 99, 42, 254, 19, 251, 85, 2, 247, 74, + 46, 254, 19, 251, 85, 2, 247, 74, 42, 253, 196, 233, 39, 125, 46, 253, + 196, 242, 107, 125, 51, 42, 253, 196, 242, 107, 125, 51, 46, 253, 196, + 233, 39, 125, 42, 83, 216, 219, 220, 233, 125, 46, 83, 216, 219, 220, + 233, 125, 246, 72, 244, 104, 71, 212, 28, 232, 242, 231, 153, 254, 19, + 227, 35, 233, 70, 46, 254, 19, 214, 244, 2, 219, 166, 231, 153, 46, 254, + 19, 2, 247, 74, 254, 19, 2, 223, 4, 235, 212, 254, 164, 254, 18, 219, + 187, 254, 19, 227, 35, 233, 70, 219, 187, 254, 19, 227, 35, 215, 134, + 216, 58, 254, 18, 223, 202, 254, 18, 254, 19, 2, 215, 153, 223, 202, 254, + 19, 2, 215, 153, 227, 112, 254, 19, 227, 35, 215, 134, 227, 112, 254, 19, + 227, 35, 246, 60, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, + 252, 76, 225, 141, 114, 24, 223, 148, 231, 153, 254, 19, 2, 227, 40, 253, + 176, 245, 98, 235, 252, 76, 225, 141, 114, 24, 233, 70, 231, 153, 254, + 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, 225, 141, 119, 24, 223, + 148, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, 225, + 141, 119, 24, 233, 70, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, + 235, 252, 76, 225, 141, 46, 24, 215, 134, 231, 153, 254, 19, 2, 227, 40, + 253, 176, 245, 98, 235, 252, 76, 225, 141, 42, 24, 215, 134, 231, 153, + 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, 225, 141, 46, 24, + 246, 60, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, + 225, 141, 42, 24, 246, 60, 223, 202, 245, 110, 221, 48, 245, 110, 221, + 49, 2, 226, 247, 245, 110, 221, 49, 2, 3, 249, 229, 49, 245, 110, 221, + 49, 2, 46, 76, 49, 245, 110, 221, 49, 2, 42, 76, 49, 249, 229, 2, 199, + 134, 36, 71, 134, 36, 226, 135, 36, 223, 203, 219, 231, 36, 226, 47, 249, + 229, 247, 125, 251, 7, 199, 252, 60, 24, 216, 227, 151, 247, 125, 251, 7, + 71, 134, 249, 229, 2, 218, 224, 213, 166, 36, 253, 254, 247, 121, 52, + 114, 76, 217, 93, 249, 228, 36, 67, 251, 42, 36, 251, 42, 36, 233, 38, + 36, 242, 106, 249, 229, 2, 3, 249, 229, 211, 211, 217, 149, 223, 148, + 249, 229, 2, 117, 199, 219, 33, 211, 211, 217, 149, 223, 148, 91, 223, + 125, 247, 207, 220, 23, 91, 244, 143, 247, 207, 220, 23, 91, 253, 132, + 91, 3, 249, 228, 91, 219, 166, 117, 235, 68, 219, 164, 216, 184, 2, 62, + 49, 216, 184, 2, 215, 153, 223, 4, 235, 252, 216, 183, 216, 184, 2, 221, + 55, 253, 123, 251, 100, 46, 216, 184, 78, 42, 216, 183, 42, 216, 184, + 251, 207, 71, 134, 71, 252, 60, 251, 207, 46, 216, 183, 251, 91, 2, 42, + 151, 251, 144, 251, 91, 2, 46, 151, 251, 144, 83, 251, 90, 29, 2, 42, + 151, 251, 144, 29, 2, 46, 151, 251, 144, 67, 240, 223, 83, 240, 223, 42, + 213, 229, 244, 104, 46, 213, 229, 244, 104, 42, 51, 213, 229, 244, 104, + 46, 51, 213, 229, 244, 104, 235, 244, 235, 231, 217, 66, 110, 235, 231, + 235, 232, 229, 183, 2, 71, 134, 246, 66, 230, 157, 41, 2, 249, 120, 226, + 251, 235, 242, 253, 152, 220, 144, 225, 63, 245, 61, 5, 24, 220, 25, 226, + 135, 245, 61, 5, 24, 220, 25, 226, 136, 2, 217, 43, 49, 240, 97, 211, + 211, 24, 220, 25, 226, 135, 242, 159, 219, 94, 217, 138, 246, 59, 216, + 184, 2, 42, 151, 251, 144, 246, 59, 216, 184, 2, 46, 151, 251, 144, 83, + 247, 201, 2, 119, 68, 83, 232, 159, 67, 249, 229, 2, 119, 68, 83, 249, + 229, 2, 119, 68, 245, 48, 67, 219, 166, 245, 48, 83, 219, 166, 245, 48, + 67, 247, 200, 245, 48, 83, 247, 200, 245, 48, 67, 249, 228, 245, 48, 83, + 249, 228, 223, 43, 223, 203, 219, 232, 227, 33, 219, 232, 2, 226, 247, + 223, 203, 219, 232, 2, 199, 90, 251, 172, 219, 231, 251, 172, 223, 203, + 219, 231, 51, 225, 156, 216, 169, 225, 156, 233, 66, 249, 33, 254, 19, + 125, 223, 144, 249, 33, 254, 19, 125, 217, 31, 230, 248, 230, 97, 36, 62, + 227, 33, 230, 97, 36, 94, 227, 33, 230, 97, 36, 29, 227, 33, 230, 97, + 215, 147, 227, 34, 2, 247, 74, 230, 97, 215, 147, 227, 34, 2, 225, 156, + 230, 97, 41, 235, 196, 227, 33, 230, 97, 41, 215, 147, 227, 33, 117, 232, + 199, 24, 227, 33, 117, 232, 199, 167, 227, 33, 230, 97, 29, 227, 33, 230, + 224, 117, 218, 244, 218, 242, 2, 235, 208, 224, 169, 235, 209, 227, 33, + 244, 68, 226, 127, 235, 208, 235, 209, 2, 51, 90, 235, 209, 253, 89, 2, + 220, 23, 249, 225, 243, 197, 253, 255, 235, 206, 232, 243, 235, 207, 2, + 224, 8, 226, 110, 253, 173, 225, 135, 232, 243, 235, 207, 2, 221, 72, + 226, 110, 253, 173, 225, 135, 232, 243, 235, 207, 228, 163, 235, 246, + 217, 149, 225, 135, 235, 209, 253, 173, 118, 225, 145, 227, 33, 224, 163, + 235, 209, 227, 33, 235, 209, 2, 132, 76, 2, 101, 235, 209, 2, 29, 52, + 235, 209, 2, 235, 195, 235, 209, 2, 215, 146, 235, 209, 2, 226, 247, 235, + 209, 2, 215, 153, 235, 69, 233, 108, 42, 216, 184, 227, 33, 212, 153, + 174, 222, 119, 249, 148, 212, 153, 174, 222, 119, 225, 188, 212, 153, + 174, 222, 119, 225, 60, 94, 5, 2, 3, 249, 229, 49, 94, 5, 2, 249, 224, + 254, 175, 49, 94, 5, 2, 217, 43, 49, 94, 5, 2, 62, 55, 94, 5, 2, 217, 43, + 55, 94, 5, 2, 219, 10, 109, 94, 5, 2, 83, 216, 183, 230, 251, 5, 2, 249, + 158, 49, 230, 251, 5, 2, 62, 55, 230, 251, 5, 2, 244, 143, 247, 72, 230, + 251, 5, 2, 223, 125, 247, 72, 94, 5, 235, 252, 42, 151, 249, 228, 94, 5, + 235, 252, 46, 151, 249, 228, 214, 231, 167, 249, 71, 225, 63, 230, 154, + 5, 2, 62, 49, 230, 154, 5, 2, 215, 153, 221, 69, 225, 64, 2, 251, 101, + 249, 192, 220, 5, 225, 63, 230, 154, 5, 235, 252, 42, 151, 249, 228, 230, + 154, 5, 235, 252, 46, 151, 249, 228, 36, 230, 154, 5, 2, 249, 224, 254, + 174, 230, 154, 5, 235, 252, 51, 249, 228, 36, 247, 121, 52, 94, 5, 235, + 252, 216, 183, 230, 251, 5, 235, 252, 216, 183, 230, 154, 5, 235, 252, + 216, 183, 235, 203, 225, 63, 223, 139, 235, 203, 225, 63, 212, 153, 174, + 223, 240, 249, 148, 254, 43, 167, 249, 104, 235, 196, 2, 247, 74, 215, + 147, 2, 230, 251, 52, 215, 147, 2, 226, 247, 235, 196, 2, 226, 247, 235, + 196, 2, 232, 199, 254, 27, 215, 147, 2, 232, 199, 227, 24, 215, 147, 78, + 235, 195, 235, 196, 78, 215, 146, 215, 147, 78, 252, 60, 78, 235, 195, + 235, 196, 78, 252, 60, 78, 215, 146, 215, 147, 251, 207, 24, 235, 68, 2, + 215, 146, 235, 196, 251, 207, 24, 235, 68, 2, 235, 195, 249, 193, 215, + 147, 2, 221, 54, 249, 193, 235, 196, 2, 221, 54, 51, 41, 235, 195, 51, + 41, 215, 146, 249, 193, 215, 147, 2, 221, 55, 24, 220, 5, 225, 63, 232, + 199, 24, 2, 62, 49, 232, 199, 167, 2, 62, 49, 51, 232, 199, 254, 27, 51, + 232, 199, 227, 24, 117, 235, 197, 232, 199, 254, 27, 117, 235, 197, 232, + 199, 227, 24, 220, 13, 233, 108, 227, 24, 220, 13, 233, 108, 254, 27, + 232, 199, 167, 226, 245, 232, 199, 254, 27, 232, 199, 24, 2, 231, 37, + 219, 79, 232, 199, 167, 2, 231, 37, 219, 79, 232, 199, 24, 2, 199, 248, + 101, 232, 199, 167, 2, 199, 248, 101, 232, 199, 24, 2, 51, 226, 247, 232, + 199, 24, 2, 215, 153, 232, 199, 24, 2, 51, 215, 153, 3, 214, 228, 2, 215, + 153, 232, 199, 167, 2, 51, 226, 247, 232, 199, 167, 2, 51, 215, 153, 212, + 153, 174, 247, 83, 253, 246, 212, 153, 174, 224, 40, 253, 246, 245, 61, + 5, 2, 62, 55, 240, 97, 2, 62, 49, 216, 169, 199, 252, 60, 2, 51, 71, 90, + 216, 169, 199, 252, 60, 2, 216, 169, 71, 90, 217, 43, 227, 34, 2, 62, 49, + 217, 43, 227, 34, 2, 223, 125, 247, 72, 220, 88, 230, 251, 220, 87, 249, + 139, 2, 62, 49, 245, 61, 2, 253, 132, 254, 57, 123, 211, 211, 2, 249, + 224, 254, 174, 253, 218, 123, 167, 123, 108, 245, 61, 5, 78, 94, 52, 94, + 5, 78, 245, 61, 52, 245, 61, 5, 78, 217, 43, 227, 33, 51, 249, 165, 245, + 62, 117, 249, 134, 245, 61, 220, 102, 133, 249, 134, 245, 61, 220, 102, + 245, 61, 5, 2, 117, 176, 78, 24, 117, 176, 55, 245, 57, 2, 243, 237, 176, + 49, 233, 39, 2, 249, 229, 235, 212, 242, 107, 2, 249, 229, 235, 212, 233, + 39, 2, 224, 158, 152, 49, 242, 107, 2, 224, 158, 152, 49, 233, 39, 167, + 220, 25, 123, 108, 242, 107, 167, 220, 25, 123, 108, 233, 39, 167, 220, + 25, 123, 211, 211, 2, 62, 235, 212, 242, 107, 167, 220, 25, 123, 211, + 211, 2, 62, 235, 212, 233, 39, 167, 220, 25, 123, 211, 211, 2, 62, 49, + 242, 107, 167, 220, 25, 123, 211, 211, 2, 62, 49, 233, 39, 167, 220, 25, + 123, 211, 211, 2, 62, 78, 223, 148, 242, 107, 167, 220, 25, 123, 211, + 211, 2, 62, 78, 233, 70, 233, 39, 167, 253, 219, 242, 107, 167, 253, 219, + 233, 39, 24, 220, 79, 228, 163, 123, 108, 242, 107, 24, 220, 79, 228, + 163, 123, 108, 233, 39, 24, 228, 163, 253, 219, 242, 107, 24, 228, 163, + 253, 219, 233, 39, 78, 246, 65, 123, 78, 242, 106, 242, 107, 78, 246, 65, + 123, 78, 233, 38, 233, 39, 78, 220, 88, 167, 245, 62, 242, 107, 78, 220, + 88, 167, 245, 62, 233, 39, 78, 220, 88, 78, 242, 106, 242, 107, 78, 220, + 88, 78, 233, 38, 233, 39, 78, 242, 107, 78, 246, 65, 245, 62, 242, 107, + 78, 233, 39, 78, 246, 65, 245, 62, 233, 39, 78, 220, 25, 123, 78, 242, + 107, 78, 220, 25, 245, 62, 242, 107, 78, 220, 25, 123, 78, 233, 39, 78, + 220, 25, 245, 62, 220, 25, 123, 211, 211, 167, 233, 38, 220, 25, 123, + 211, 211, 167, 242, 106, 220, 25, 123, 211, 211, 167, 233, 39, 2, 62, + 235, 212, 220, 25, 123, 211, 211, 167, 242, 107, 2, 62, 235, 212, 246, + 65, 123, 211, 211, 167, 233, 38, 246, 65, 123, 211, 211, 167, 242, 106, + 246, 65, 220, 25, 123, 211, 211, 167, 233, 38, 246, 65, 220, 25, 123, + 211, 211, 167, 242, 106, 220, 88, 167, 233, 38, 220, 88, 167, 242, 106, + 220, 88, 78, 233, 39, 78, 245, 61, 52, 220, 88, 78, 242, 107, 78, 245, + 61, 52, 51, 229, 173, 233, 38, 51, 229, 173, 242, 106, 51, 229, 173, 233, + 39, 2, 215, 153, 242, 107, 226, 245, 233, 38, 242, 107, 251, 207, 233, + 38, 233, 39, 249, 193, 251, 7, 249, 34, 242, 107, 249, 193, 251, 7, 249, + 34, 233, 39, 249, 193, 251, 7, 249, 35, 78, 220, 25, 245, 62, 242, 107, + 249, 193, 251, 7, 249, 35, 78, 220, 25, 245, 62, 220, 6, 217, 153, 233, + 106, 217, 153, 220, 6, 217, 154, 167, 123, 108, 233, 106, 217, 154, 167, + 123, 108, 245, 61, 5, 2, 251, 37, 49, 225, 83, 78, 220, 79, 245, 61, 52, + 219, 1, 78, 220, 79, 245, 61, 52, 225, 83, 78, 220, 79, 228, 163, 123, + 108, 219, 1, 78, 220, 79, 228, 163, 123, 108, 225, 83, 78, 245, 61, 52, + 219, 1, 78, 245, 61, 52, 225, 83, 78, 228, 163, 123, 108, 219, 1, 78, + 228, 163, 123, 108, 225, 83, 78, 254, 57, 123, 108, 219, 1, 78, 254, 57, + 123, 108, 225, 83, 78, 228, 163, 254, 57, 123, 108, 219, 1, 78, 228, 163, + 254, 57, 123, 108, 51, 225, 82, 51, 219, 0, 219, 9, 2, 247, 74, 218, 222, + 2, 247, 74, 219, 9, 2, 94, 5, 55, 218, 222, 2, 94, 5, 55, 219, 9, 2, 230, + 154, 5, 55, 218, 222, 2, 230, 154, 5, 55, 219, 9, 65, 167, 123, 211, 211, + 2, 62, 49, 218, 222, 65, 167, 123, 211, 211, 2, 62, 49, 219, 9, 65, 78, + 245, 61, 52, 218, 222, 65, 78, 245, 61, 52, 219, 9, 65, 78, 217, 43, 227, + 33, 218, 222, 65, 78, 217, 43, 227, 33, 219, 9, 65, 78, 254, 57, 123, + 108, 218, 222, 65, 78, 254, 57, 123, 108, 219, 9, 65, 78, 228, 163, 123, + 108, 218, 222, 65, 78, 228, 163, 123, 108, 41, 42, 227, 40, 92, 227, 33, + 41, 46, 227, 40, 92, 227, 33, 249, 193, 219, 8, 249, 193, 218, 221, 249, + 193, 219, 9, 167, 123, 108, 249, 193, 218, 222, 167, 123, 108, 219, 9, + 78, 218, 221, 218, 222, 78, 219, 8, 219, 9, 78, 219, 8, 218, 222, 78, + 218, 221, 218, 222, 251, 207, 219, 8, 218, 222, 251, 207, 24, 235, 68, + 251, 7, 248, 102, 2, 219, 8, 245, 127, 65, 227, 35, 246, 57, 225, 180, 2, + 217, 220, 216, 226, 216, 198, 235, 195, 243, 246, 228, 176, 220, 175, 42, + 218, 36, 220, 175, 119, 218, 36, 220, 175, 114, 218, 36, 226, 48, 2, 197, + 71, 252, 60, 216, 169, 46, 216, 57, 51, 71, 252, 60, 42, 216, 57, 71, + 252, 60, 51, 42, 216, 57, 51, 71, 252, 60, 51, 42, 216, 57, 184, 248, + 102, 243, 213, 42, 231, 127, 65, 51, 214, 216, 220, 175, 119, 218, 37, 2, + 226, 247, 220, 175, 114, 218, 37, 2, 215, 153, 220, 175, 114, 218, 37, + 78, 220, 175, 119, 218, 36, 51, 119, 218, 36, 51, 114, 218, 36, 51, 219, + 45, 228, 163, 52, 223, 202, 51, 219, 45, 228, 163, 52, 247, 92, 228, 163, + 247, 127, 2, 223, 202, 229, 182, 220, 23, 71, 232, 243, 2, 249, 229, 49, + 71, 232, 243, 2, 249, 229, 55, 119, 218, 37, 2, 249, 229, 55, 226, 136, + 2, 199, 90, 226, 136, 2, 217, 43, 227, 33, 216, 169, 71, 252, 60, 251, + 167, 223, 241, 216, 169, 71, 252, 60, 2, 199, 90, 216, 169, 249, 165, + 227, 33, 216, 169, 229, 173, 233, 38, 216, 169, 229, 173, 242, 106, 246, + 65, 220, 25, 233, 39, 167, 123, 108, 246, 65, 220, 25, 242, 107, 167, + 123, 108, 216, 169, 219, 232, 251, 167, 223, 241, 233, 108, 216, 169, 71, + 252, 60, 227, 33, 51, 219, 232, 227, 33, 67, 71, 134, 230, 97, 67, 71, + 134, 228, 167, 245, 176, 67, 68, 228, 167, 213, 250, 67, 68, 219, 215, + 245, 176, 67, 68, 219, 215, 213, 250, 67, 68, 42, 46, 67, 68, 132, 83, + 68, 215, 124, 83, 68, 246, 58, 83, 68, 228, 167, 245, 176, 83, 68, 228, + 167, 213, 250, 83, 68, 219, 215, 245, 176, 83, 68, 219, 215, 213, 250, + 83, 68, 42, 46, 83, 68, 114, 119, 83, 68, 95, 76, 2, 217, 30, 246, 57, + 95, 76, 2, 217, 30, 215, 123, 132, 76, 2, 217, 30, 246, 57, 132, 76, 2, + 217, 30, 215, 123, 41, 2, 216, 227, 151, 251, 144, 41, 2, 251, 101, 151, + 251, 144, 41, 2, 215, 131, 46, 247, 207, 151, 251, 144, 41, 2, 232, 163, + 42, 247, 207, 151, 251, 144, 247, 201, 2, 42, 151, 251, 144, 247, 201, 2, + 46, 151, 251, 144, 247, 201, 2, 216, 227, 151, 251, 144, 247, 201, 2, + 251, 101, 151, 251, 144, 246, 72, 219, 166, 83, 233, 108, 219, 166, 67, + 233, 108, 219, 166, 83, 214, 164, 3, 219, 166, 67, 214, 164, 3, 219, 166, + 83, 226, 65, 67, 226, 65, 67, 241, 178, 83, 241, 178, 199, 83, 241, 178, + 83, 233, 108, 249, 228, 83, 231, 147, 247, 200, 67, 231, 147, 247, 200, + 83, 231, 147, 232, 159, 67, 231, 147, 232, 159, 83, 3, 247, 200, 83, 3, + 232, 159, 67, 3, 232, 159, 83, 199, 245, 121, 67, 199, 245, 121, 83, 71, + 245, 121, 67, 71, 245, 121, 42, 76, 2, 3, 249, 228, 133, 132, 253, 162, + 42, 76, 2, 36, 225, 156, 184, 132, 219, 162, 68, 132, 216, 24, 76, 2, 71, + 90, 132, 216, 24, 76, 2, 51, 71, 90, 132, 216, 24, 76, 243, 213, 134, + 132, 216, 24, 216, 169, 248, 102, 68, 132, 76, 2, 246, 72, 219, 79, 132, + 76, 2, 218, 28, 2, 71, 90, 132, 76, 2, 218, 28, 2, 51, 71, 90, 132, 216, + 24, 76, 2, 218, 27, 132, 216, 24, 76, 2, 218, 28, 2, 71, 90, 132, 216, + 24, 76, 2, 218, 28, 2, 51, 71, 90, 132, 76, 217, 93, 213, 166, 214, 20, + 76, 225, 141, 247, 147, 233, 70, 245, 61, 5, 78, 132, 68, 223, 203, 217, + 43, 227, 34, 78, 132, 68, 132, 76, 78, 223, 203, 254, 57, 123, 108, 95, + 76, 217, 93, 242, 106, 95, 76, 217, 93, 218, 221, 132, 224, 169, 68, 95, + 224, 169, 68, 223, 203, 217, 43, 227, 34, 78, 95, 68, 95, 76, 78, 223, + 203, 254, 57, 123, 108, 217, 43, 227, 34, 78, 132, 68, 132, 76, 78, 254, + 57, 123, 108, 132, 76, 78, 223, 203, 217, 43, 227, 33, 95, 76, 78, 223, + 203, 217, 43, 227, 33, 67, 231, 147, 219, 95, 83, 3, 219, 95, 67, 3, 219, + 95, 83, 223, 144, 226, 65, 67, 223, 144, 226, 65, 107, 233, 108, 249, + 228, 107, 226, 248, 2, 226, 248, 235, 212, 107, 249, 229, 2, 249, 229, + 235, 212, 107, 249, 228, 107, 36, 222, 169, 136, 6, 1, 253, 75, 136, 6, + 1, 251, 46, 136, 6, 1, 214, 230, 136, 6, 1, 242, 161, 136, 6, 1, 247, 94, + 136, 6, 1, 213, 12, 136, 6, 1, 212, 61, 136, 6, 1, 245, 245, 136, 6, 1, + 212, 84, 136, 6, 1, 235, 146, 136, 6, 1, 70, 235, 146, 136, 6, 1, 72, + 136, 6, 1, 247, 112, 136, 6, 1, 234, 245, 136, 6, 1, 232, 215, 136, 6, 1, + 230, 101, 136, 6, 1, 230, 12, 136, 6, 1, 227, 51, 136, 6, 1, 225, 138, + 136, 6, 1, 223, 124, 136, 6, 1, 220, 11, 136, 6, 1, 216, 46, 136, 6, 1, + 215, 171, 136, 6, 1, 243, 216, 136, 6, 1, 241, 184, 136, 6, 1, 227, 3, + 136, 6, 1, 226, 96, 136, 6, 1, 220, 153, 136, 6, 1, 216, 125, 136, 6, 1, + 250, 12, 136, 6, 1, 221, 24, 136, 6, 1, 213, 18, 136, 6, 1, 213, 20, 136, + 6, 1, 213, 47, 136, 6, 1, 219, 185, 159, 136, 6, 1, 212, 203, 136, 6, 1, + 3, 212, 174, 136, 6, 1, 3, 212, 175, 2, 218, 27, 136, 6, 1, 212, 235, + 136, 6, 1, 235, 182, 3, 212, 174, 136, 6, 1, 251, 172, 212, 174, 136, 6, + 1, 235, 182, 251, 172, 212, 174, 136, 6, 1, 244, 51, 136, 6, 1, 235, 144, + 136, 6, 1, 220, 152, 136, 6, 1, 216, 160, 61, 136, 6, 1, 233, 98, 230, + 101, 136, 3, 1, 253, 75, 136, 3, 1, 251, 46, 136, 3, 1, 214, 230, 136, 3, + 1, 242, 161, 136, 3, 1, 247, 94, 136, 3, 1, 213, 12, 136, 3, 1, 212, 61, + 136, 3, 1, 245, 245, 136, 3, 1, 212, 84, 136, 3, 1, 235, 146, 136, 3, 1, + 70, 235, 146, 136, 3, 1, 72, 136, 3, 1, 247, 112, 136, 3, 1, 234, 245, + 136, 3, 1, 232, 215, 136, 3, 1, 230, 101, 136, 3, 1, 230, 12, 136, 3, 1, + 227, 51, 136, 3, 1, 225, 138, 136, 3, 1, 223, 124, 136, 3, 1, 220, 11, + 136, 3, 1, 216, 46, 136, 3, 1, 215, 171, 136, 3, 1, 243, 216, 136, 3, 1, + 241, 184, 136, 3, 1, 227, 3, 136, 3, 1, 226, 96, 136, 3, 1, 220, 153, + 136, 3, 1, 216, 125, 136, 3, 1, 250, 12, 136, 3, 1, 221, 24, 136, 3, 1, + 213, 18, 136, 3, 1, 213, 20, 136, 3, 1, 213, 47, 136, 3, 1, 219, 185, + 159, 136, 3, 1, 212, 203, 136, 3, 1, 3, 212, 174, 136, 3, 1, 3, 212, 175, + 2, 218, 27, 136, 3, 1, 212, 235, 136, 3, 1, 235, 182, 3, 212, 174, 136, + 3, 1, 251, 172, 212, 174, 136, 3, 1, 235, 182, 251, 172, 212, 174, 136, + 3, 1, 244, 51, 136, 3, 1, 235, 144, 136, 3, 1, 220, 152, 136, 3, 1, 216, + 160, 61, 136, 3, 1, 233, 98, 230, 101, 7, 6, 1, 233, 171, 2, 51, 134, 7, + 3, 1, 233, 171, 2, 51, 134, 7, 6, 1, 233, 171, 2, 231, 37, 217, 42, 7, 6, + 1, 226, 230, 2, 90, 7, 6, 1, 224, 113, 2, 218, 27, 7, 3, 1, 118, 2, 90, + 7, 3, 1, 218, 100, 2, 247, 207, 90, 7, 6, 1, 242, 42, 2, 247, 246, 7, 3, + 1, 242, 42, 2, 247, 246, 7, 6, 1, 235, 28, 2, 247, 246, 7, 3, 1, 235, 28, + 2, 247, 246, 7, 6, 1, 212, 153, 2, 247, 246, 7, 3, 1, 212, 153, 2, 247, + 246, 7, 6, 1, 254, 52, 7, 6, 1, 232, 110, 2, 101, 7, 6, 1, 216, 58, 61, + 7, 6, 1, 216, 58, 254, 52, 7, 3, 1, 215, 80, 2, 46, 101, 7, 6, 1, 214, + 83, 2, 101, 7, 3, 1, 214, 83, 2, 101, 7, 3, 1, 215, 80, 2, 249, 41, 7, 6, + 1, 151, 242, 41, 7, 3, 1, 151, 242, 41, 7, 3, 1, 218, 25, 226, 9, 7, 3, + 1, 191, 2, 228, 161, 7, 3, 1, 216, 58, 224, 113, 2, 218, 27, 7, 3, 1, + 157, 2, 115, 223, 131, 235, 212, 7, 1, 3, 6, 216, 58, 74, 7, 219, 10, 3, + 1, 235, 142, 59, 1, 6, 215, 79, 7, 6, 1, 223, 4, 2, 218, 195, 218, 27, 7, + 6, 1, 212, 153, 2, 218, 195, 218, 27, 79, 6, 1, 254, 73, 79, 3, 1, 254, + 73, 79, 6, 1, 214, 151, 79, 3, 1, 214, 151, 79, 6, 1, 243, 83, 79, 3, 1, + 243, 83, 79, 6, 1, 248, 136, 79, 3, 1, 248, 136, 79, 6, 1, 245, 151, 79, + 3, 1, 245, 151, 79, 6, 1, 219, 220, 79, 3, 1, 219, 220, 79, 6, 1, 212, + 94, 79, 3, 1, 212, 94, 79, 6, 1, 241, 231, 79, 3, 1, 241, 231, 79, 6, 1, + 217, 130, 79, 3, 1, 217, 130, 79, 6, 1, 240, 109, 79, 3, 1, 240, 109, 79, + 6, 1, 234, 232, 79, 3, 1, 234, 232, 79, 6, 1, 233, 96, 79, 3, 1, 233, 96, + 79, 6, 1, 231, 42, 79, 3, 1, 231, 42, 79, 6, 1, 229, 64, 79, 3, 1, 229, + 64, 79, 6, 1, 233, 242, 79, 3, 1, 233, 242, 79, 6, 1, 75, 79, 3, 1, 75, + 79, 6, 1, 225, 240, 79, 3, 1, 225, 240, 79, 6, 1, 223, 112, 79, 3, 1, + 223, 112, 79, 6, 1, 220, 91, 79, 3, 1, 220, 91, 79, 6, 1, 217, 248, 79, + 3, 1, 217, 248, 79, 6, 1, 215, 196, 79, 3, 1, 215, 196, 79, 6, 1, 244, + 90, 79, 3, 1, 244, 90, 79, 6, 1, 234, 118, 79, 3, 1, 234, 118, 79, 6, 1, + 225, 46, 79, 3, 1, 225, 46, 79, 6, 1, 227, 44, 79, 3, 1, 227, 44, 79, 6, + 1, 247, 205, 254, 78, 79, 3, 1, 247, 205, 254, 78, 79, 6, 1, 53, 79, 254, + 103, 79, 3, 1, 53, 79, 254, 103, 79, 6, 1, 249, 55, 245, 151, 79, 3, 1, + 249, 55, 245, 151, 79, 6, 1, 247, 205, 234, 232, 79, 3, 1, 247, 205, 234, + 232, 79, 6, 1, 247, 205, 229, 64, 79, 3, 1, 247, 205, 229, 64, 79, 6, 1, + 249, 55, 229, 64, 79, 3, 1, 249, 55, 229, 64, 79, 6, 1, 53, 79, 227, 44, + 79, 3, 1, 53, 79, 227, 44, 79, 6, 1, 222, 161, 79, 3, 1, 222, 161, 79, 6, + 1, 249, 68, 220, 235, 79, 3, 1, 249, 68, 220, 235, 79, 6, 1, 53, 79, 220, + 235, 79, 3, 1, 53, 79, 220, 235, 79, 6, 1, 53, 79, 245, 40, 79, 3, 1, 53, + 79, 245, 40, 79, 6, 1, 254, 90, 234, 123, 79, 3, 1, 254, 90, 234, 123, + 79, 6, 1, 247, 205, 241, 32, 79, 3, 1, 247, 205, 241, 32, 79, 6, 1, 53, + 79, 241, 32, 79, 3, 1, 53, 79, 241, 32, 79, 6, 1, 53, 79, 159, 79, 3, 1, + 53, 79, 159, 79, 6, 1, 233, 170, 159, 79, 3, 1, 233, 170, 159, 79, 6, 1, + 53, 79, 241, 201, 79, 3, 1, 53, 79, 241, 201, 79, 6, 1, 53, 79, 241, 234, + 79, 3, 1, 53, 79, 241, 234, 79, 6, 1, 53, 79, 243, 78, 79, 3, 1, 53, 79, + 243, 78, 79, 6, 1, 53, 79, 247, 115, 79, 3, 1, 53, 79, 247, 115, 79, 6, + 1, 53, 79, 220, 202, 79, 3, 1, 53, 79, 220, 202, 79, 6, 1, 53, 228, 63, + 220, 202, 79, 3, 1, 53, 228, 63, 220, 202, 79, 6, 1, 53, 228, 63, 229, + 113, 79, 3, 1, 53, 228, 63, 229, 113, 79, 6, 1, 53, 228, 63, 228, 10, 79, + 3, 1, 53, 228, 63, 228, 10, 79, 6, 1, 53, 228, 63, 214, 21, 79, 3, 1, 53, + 228, 63, 214, 21, 79, 16, 234, 250, 79, 16, 231, 43, 223, 112, 79, 16, + 225, 241, 223, 112, 79, 16, 219, 87, 79, 16, 217, 249, 223, 112, 79, 16, + 234, 119, 223, 112, 79, 16, 220, 203, 220, 91, 79, 6, 1, 249, 55, 220, + 235, 79, 3, 1, 249, 55, 220, 235, 79, 6, 1, 249, 55, 243, 78, 79, 3, 1, + 249, 55, 243, 78, 79, 37, 229, 65, 49, 79, 37, 219, 179, 253, 139, 79, + 37, 219, 179, 233, 45, 79, 53, 228, 63, 243, 200, 219, 69, 79, 53, 228, + 63, 247, 149, 224, 158, 77, 79, 53, 228, 63, 235, 234, 224, 158, 77, 79, + 53, 228, 63, 214, 218, 247, 124, 79, 243, 228, 122, 242, 9, 79, 243, 200, + 219, 69, 79, 230, 194, 247, 124, 100, 3, 1, 254, 32, 100, 3, 1, 252, 71, + 100, 3, 1, 243, 82, 100, 3, 1, 247, 82, 100, 3, 1, 245, 108, 100, 3, 1, + 214, 141, 100, 3, 1, 212, 82, 100, 3, 1, 218, 11, 100, 3, 1, 235, 251, + 100, 3, 1, 234, 239, 100, 3, 1, 233, 104, 100, 3, 1, 231, 248, 100, 3, 1, + 230, 15, 100, 3, 1, 227, 62, 100, 3, 1, 226, 145, 100, 3, 1, 212, 71, + 100, 3, 1, 224, 61, 100, 3, 1, 222, 159, 100, 3, 1, 218, 1, 100, 3, 1, + 215, 160, 100, 3, 1, 226, 16, 100, 3, 1, 234, 127, 100, 3, 1, 242, 217, + 100, 3, 1, 224, 217, 100, 3, 1, 220, 200, 100, 3, 1, 250, 34, 100, 3, 1, + 250, 195, 100, 3, 1, 235, 103, 100, 3, 1, 249, 233, 100, 3, 1, 250, 79, + 100, 3, 1, 213, 151, 100, 3, 1, 235, 113, 100, 3, 1, 242, 24, 100, 3, 1, + 241, 222, 100, 3, 1, 241, 160, 100, 3, 1, 214, 6, 100, 3, 1, 241, 243, + 100, 3, 1, 241, 51, 217, 62, 1, 186, 217, 62, 1, 213, 87, 217, 62, 1, + 213, 86, 217, 62, 1, 213, 76, 217, 62, 1, 213, 74, 217, 62, 1, 251, 209, + 254, 176, 213, 70, 217, 62, 1, 213, 70, 217, 62, 1, 213, 84, 217, 62, 1, + 213, 81, 217, 62, 1, 213, 83, 217, 62, 1, 213, 82, 217, 62, 1, 213, 3, + 217, 62, 1, 213, 78, 217, 62, 1, 213, 68, 217, 62, 1, 216, 79, 213, 68, + 217, 62, 1, 213, 65, 217, 62, 1, 213, 72, 217, 62, 1, 251, 209, 254, 176, + 213, 72, 217, 62, 1, 216, 79, 213, 72, 217, 62, 1, 213, 71, 217, 62, 1, + 213, 91, 217, 62, 1, 213, 66, 217, 62, 1, 216, 79, 213, 66, 217, 62, 1, + 213, 56, 217, 62, 1, 216, 79, 213, 56, 217, 62, 1, 212, 255, 217, 62, 1, + 213, 40, 217, 62, 1, 254, 112, 213, 40, 217, 62, 1, 216, 79, 213, 40, + 217, 62, 1, 213, 64, 217, 62, 1, 213, 63, 217, 62, 1, 213, 60, 217, 62, + 1, 216, 79, 213, 73, 217, 62, 1, 216, 79, 213, 58, 217, 62, 1, 213, 57, + 217, 62, 1, 212, 203, 217, 62, 1, 213, 54, 217, 62, 1, 213, 53, 217, 62, + 1, 213, 75, 217, 62, 1, 216, 79, 213, 75, 217, 62, 1, 253, 79, 213, 75, + 217, 62, 1, 213, 52, 217, 62, 1, 213, 50, 217, 62, 1, 213, 51, 217, 62, + 1, 213, 49, 217, 62, 1, 213, 48, 217, 62, 1, 213, 85, 217, 62, 1, 213, + 46, 217, 62, 1, 213, 45, 217, 62, 1, 213, 44, 217, 62, 1, 213, 43, 217, + 62, 1, 213, 41, 217, 62, 1, 217, 241, 213, 41, 217, 62, 1, 213, 39, 217, + 62, 59, 1, 233, 149, 77, 217, 62, 221, 58, 77, 217, 62, 249, 133, 235, + 66, 28, 4, 232, 207, 28, 4, 230, 230, 28, 4, 223, 110, 28, 4, 219, 241, + 28, 4, 220, 186, 28, 4, 251, 127, 28, 4, 216, 252, 28, 4, 249, 174, 28, + 4, 228, 183, 28, 4, 227, 252, 28, 4, 242, 156, 227, 120, 28, 4, 212, 15, + 28, 4, 247, 97, 28, 4, 248, 55, 28, 4, 235, 70, 28, 4, 217, 108, 28, 4, + 250, 22, 28, 4, 225, 252, 28, 4, 225, 149, 28, 4, 242, 231, 28, 4, 242, + 227, 28, 4, 242, 228, 28, 4, 242, 229, 28, 4, 219, 157, 28, 4, 219, 117, + 28, 4, 219, 128, 28, 4, 219, 156, 28, 4, 219, 132, 28, 4, 219, 133, 28, + 4, 219, 121, 28, 4, 250, 146, 28, 4, 250, 126, 28, 4, 250, 128, 28, 4, + 250, 145, 28, 4, 250, 143, 28, 4, 250, 144, 28, 4, 250, 127, 28, 4, 211, + 242, 28, 4, 211, 222, 28, 4, 211, 233, 28, 4, 211, 241, 28, 4, 211, 236, + 28, 4, 211, 237, 28, 4, 211, 225, 28, 4, 250, 142, 28, 4, 250, 129, 28, + 4, 250, 131, 28, 4, 250, 141, 28, 4, 250, 139, 28, 4, 250, 140, 28, 4, + 250, 130, 28, 4, 224, 125, 28, 4, 224, 115, 28, 4, 224, 121, 28, 4, 224, + 124, 28, 4, 224, 122, 28, 4, 224, 123, 28, 4, 224, 120, 28, 4, 233, 181, + 28, 4, 233, 173, 28, 4, 233, 176, 28, 4, 233, 180, 28, 4, 233, 177, 28, + 4, 233, 178, 28, 4, 233, 174, 28, 4, 213, 118, 28, 4, 213, 108, 28, 4, + 213, 114, 28, 4, 213, 117, 28, 4, 213, 115, 28, 4, 213, 116, 28, 4, 213, + 113, 28, 4, 242, 52, 28, 4, 242, 43, 28, 4, 242, 46, 28, 4, 242, 51, 28, + 4, 242, 48, 28, 4, 242, 49, 28, 4, 242, 45, 37, 33, 1, 251, 251, 37, 33, + 1, 214, 232, 37, 33, 1, 242, 212, 37, 33, 1, 248, 41, 37, 33, 1, 212, 67, + 37, 33, 1, 212, 87, 37, 33, 1, 181, 37, 33, 1, 245, 131, 37, 33, 1, 245, + 117, 37, 33, 1, 245, 108, 37, 33, 1, 75, 37, 33, 1, 226, 96, 37, 33, 1, + 245, 55, 37, 33, 1, 245, 45, 37, 33, 1, 217, 229, 37, 33, 1, 159, 37, 33, + 1, 216, 136, 37, 33, 1, 250, 67, 37, 33, 1, 221, 24, 37, 33, 1, 220, 245, + 37, 33, 1, 244, 51, 37, 33, 1, 245, 44, 37, 33, 1, 61, 37, 33, 1, 236, + 55, 37, 33, 1, 247, 113, 37, 33, 1, 230, 210, 215, 175, 37, 33, 1, 213, + 49, 37, 33, 1, 212, 203, 37, 33, 1, 235, 181, 61, 37, 33, 1, 232, 221, + 212, 174, 37, 33, 1, 251, 172, 212, 174, 37, 33, 1, 235, 181, 251, 172, + 212, 174, 46, 254, 19, 219, 5, 231, 217, 46, 254, 19, 246, 72, 219, 5, + 231, 217, 42, 219, 5, 125, 46, 219, 5, 125, 42, 246, 72, 219, 5, 125, 46, + 246, 72, 219, 5, 125, 224, 48, 235, 199, 231, 217, 224, 48, 246, 72, 235, + 199, 231, 217, 246, 72, 216, 199, 231, 217, 42, 216, 199, 125, 46, 216, + 199, 125, 224, 48, 219, 166, 42, 224, 48, 227, 64, 125, 46, 224, 48, 227, + 64, 125, 245, 166, 249, 97, 226, 141, 243, 247, 226, 141, 223, 202, 243, + 247, 226, 141, 240, 157, 246, 72, 227, 115, 246, 58, 254, 28, 215, 124, + 254, 28, 246, 72, 223, 144, 254, 18, 51, 227, 112, 240, 160, 235, 191, + 235, 198, 226, 186, 251, 81, 240, 161, 2, 247, 209, 217, 43, 2, 223, 131, + 49, 42, 115, 226, 133, 125, 46, 115, 226, 133, 125, 217, 43, 2, 62, 49, + 217, 43, 2, 62, 55, 42, 71, 252, 60, 2, 224, 152, 46, 71, 252, 60, 2, + 224, 152, 216, 227, 42, 151, 125, 216, 227, 46, 151, 125, 251, 101, 42, + 151, 125, 251, 101, 46, 151, 125, 42, 220, 113, 111, 125, 46, 220, 113, + 111, 125, 42, 51, 226, 131, 46, 51, 226, 131, 117, 176, 110, 122, 62, + 225, 26, 122, 62, 110, 117, 176, 225, 26, 91, 243, 237, 62, 225, 26, 244, + 50, 62, 77, 223, 202, 224, 158, 77, 71, 217, 42, 223, 131, 225, 144, 213, + 196, 221, 58, 231, 37, 247, 74, 9, 34, 223, 227, 9, 34, 249, 203, 9, 34, + 222, 95, 116, 9, 34, 222, 95, 109, 9, 34, 222, 95, 166, 9, 34, 226, 43, + 9, 34, 251, 89, 9, 34, 218, 40, 9, 34, 234, 42, 116, 9, 34, 234, 42, 109, + 9, 34, 247, 122, 9, 34, 222, 98, 9, 34, 3, 116, 9, 34, 3, 109, 9, 34, + 233, 121, 116, 9, 34, 233, 121, 109, 9, 34, 233, 121, 166, 9, 34, 233, + 121, 163, 9, 34, 219, 252, 9, 34, 217, 98, 9, 34, 219, 250, 116, 9, 34, + 219, 250, 109, 9, 34, 241, 212, 116, 9, 34, 241, 212, 109, 9, 34, 241, + 254, 9, 34, 224, 39, 9, 34, 250, 19, 9, 34, 218, 238, 9, 34, 230, 198, 9, + 34, 248, 39, 9, 34, 230, 190, 9, 34, 249, 218, 9, 34, 214, 25, 116, 9, + 34, 214, 25, 109, 9, 34, 244, 65, 9, 34, 226, 106, 116, 9, 34, 226, 106, + 109, 9, 34, 220, 86, 151, 216, 194, 216, 146, 9, 34, 249, 84, 9, 34, 247, + 90, 9, 34, 235, 135, 9, 34, 251, 122, 65, 249, 187, 9, 34, 244, 239, 9, + 34, 219, 181, 116, 9, 34, 219, 181, 109, 9, 34, 252, 73, 9, 34, 220, 93, + 9, 34, 250, 249, 220, 93, 9, 34, 229, 172, 116, 9, 34, 229, 172, 109, 9, + 34, 229, 172, 166, 9, 34, 229, 172, 163, 9, 34, 231, 111, 9, 34, 220, + 237, 9, 34, 224, 45, 9, 34, 245, 4, 9, 34, 227, 75, 9, 34, 251, 61, 116, + 9, 34, 251, 61, 109, 9, 34, 231, 151, 9, 34, 230, 193, 9, 34, 242, 117, + 116, 9, 34, 242, 117, 109, 9, 34, 242, 117, 166, 9, 34, 217, 60, 9, 34, + 249, 186, 9, 34, 213, 250, 116, 9, 34, 213, 250, 109, 9, 34, 250, 249, + 222, 89, 9, 34, 220, 86, 240, 235, 9, 34, 240, 235, 9, 34, 250, 249, 219, + 190, 9, 34, 250, 249, 220, 232, 9, 34, 244, 1, 9, 34, 250, 249, 250, 160, + 9, 34, 220, 86, 214, 41, 9, 34, 214, 42, 116, 9, 34, 214, 42, 109, 9, 34, + 249, 220, 9, 34, 250, 249, 242, 142, 9, 34, 184, 116, 9, 34, 184, 109, 9, + 34, 250, 249, 232, 190, 9, 34, 250, 249, 243, 64, 9, 34, 230, 189, 116, + 9, 34, 230, 189, 109, 9, 34, 224, 50, 9, 34, 251, 130, 9, 34, 250, 249, + 218, 7, 233, 76, 9, 34, 250, 249, 233, 77, 9, 34, 250, 249, 213, 224, 9, + 34, 250, 249, 244, 15, 9, 34, 245, 174, 116, 9, 34, 245, 174, 109, 9, 34, + 245, 174, 166, 9, 34, 250, 249, 245, 173, 9, 34, 241, 219, 9, 34, 250, + 249, 240, 232, 9, 34, 251, 119, 9, 34, 242, 198, 9, 34, 250, 249, 244, + 59, 9, 34, 250, 249, 251, 160, 9, 34, 250, 249, 222, 172, 9, 34, 220, 86, + 213, 243, 9, 34, 220, 86, 213, 32, 9, 34, 250, 249, 243, 214, 9, 34, 235, + 141, 245, 8, 9, 34, 250, 249, 245, 8, 9, 34, 235, 141, 216, 228, 9, 34, + 250, 249, 216, 228, 9, 34, 235, 141, 246, 50, 9, 34, 250, 249, 246, 50, + 9, 34, 216, 55, 9, 34, 235, 141, 216, 55, 9, 34, 250, 249, 216, 55, 57, + 34, 116, 57, 34, 232, 242, 57, 34, 247, 74, 57, 34, 220, 23, 57, 34, 222, + 94, 57, 34, 101, 57, 34, 109, 57, 34, 233, 9, 57, 34, 231, 248, 57, 34, + 233, 57, 57, 34, 245, 88, 57, 34, 195, 57, 34, 119, 251, 89, 57, 34, 249, + 86, 57, 34, 240, 104, 57, 34, 218, 40, 57, 34, 227, 40, 251, 89, 57, 34, + 234, 41, 57, 34, 225, 104, 57, 34, 213, 190, 57, 34, 219, 175, 57, 34, + 46, 227, 40, 251, 89, 57, 34, 241, 161, 245, 103, 57, 34, 217, 200, 57, + 34, 247, 122, 57, 34, 222, 98, 57, 34, 249, 203, 57, 34, 225, 65, 57, 34, + 254, 120, 57, 34, 230, 180, 57, 34, 245, 103, 57, 34, 245, 179, 57, 34, + 222, 118, 57, 34, 242, 150, 57, 34, 242, 151, 220, 9, 57, 34, 245, 7, 57, + 34, 251, 171, 57, 34, 213, 208, 57, 34, 250, 38, 57, 34, 223, 98, 57, 34, + 235, 247, 57, 34, 220, 7, 57, 34, 233, 120, 57, 34, 249, 95, 57, 34, 219, + 169, 57, 34, 230, 185, 57, 34, 223, 121, 57, 34, 213, 193, 57, 34, 227, + 56, 57, 34, 216, 61, 57, 34, 246, 35, 57, 34, 220, 175, 217, 98, 57, 34, + 246, 72, 249, 203, 57, 34, 184, 219, 48, 57, 34, 117, 241, 249, 57, 34, + 220, 180, 57, 34, 251, 95, 57, 34, 219, 249, 57, 34, 251, 65, 57, 34, + 219, 78, 57, 34, 241, 211, 57, 34, 242, 10, 57, 34, 247, 77, 57, 34, 241, + 254, 57, 34, 251, 81, 57, 34, 224, 39, 57, 34, 222, 106, 57, 34, 247, + 151, 57, 34, 253, 84, 57, 34, 219, 166, 57, 34, 228, 162, 57, 34, 218, + 238, 57, 34, 222, 129, 57, 34, 230, 198, 57, 34, 216, 193, 57, 34, 233, + 145, 57, 34, 219, 69, 57, 34, 248, 39, 57, 34, 214, 5, 57, 34, 247, 100, + 228, 162, 57, 34, 249, 154, 57, 34, 243, 194, 57, 34, 249, 214, 57, 34, + 219, 82, 57, 34, 214, 24, 57, 34, 244, 65, 57, 34, 249, 211, 57, 34, 244, + 129, 57, 34, 51, 213, 166, 57, 34, 151, 216, 194, 216, 146, 57, 34, 220, + 17, 57, 34, 244, 139, 57, 34, 249, 84, 57, 34, 247, 90, 57, 34, 225, 62, + 57, 34, 235, 135, 57, 34, 231, 131, 57, 34, 217, 41, 57, 34, 218, 190, + 57, 34, 233, 3, 57, 34, 215, 103, 57, 34, 244, 89, 57, 34, 251, 122, 65, + 249, 187, 57, 34, 220, 114, 57, 34, 246, 72, 217, 195, 57, 34, 213, 238, + 57, 34, 220, 31, 57, 34, 247, 139, 57, 34, 244, 239, 57, 34, 219, 193, + 57, 34, 68, 57, 34, 219, 71, 57, 34, 219, 180, 57, 34, 216, 212, 57, 34, + 242, 123, 57, 34, 250, 151, 57, 34, 219, 99, 57, 34, 252, 73, 57, 34, + 223, 184, 57, 34, 220, 93, 57, 34, 235, 130, 57, 34, 229, 171, 57, 34, + 220, 237, 57, 34, 244, 118, 57, 34, 227, 75, 57, 34, 254, 27, 57, 34, + 225, 162, 57, 34, 245, 183, 57, 34, 251, 60, 57, 34, 231, 151, 57, 34, + 230, 252, 57, 34, 221, 76, 57, 34, 253, 167, 57, 34, 230, 193, 57, 34, + 216, 232, 57, 34, 227, 31, 57, 34, 251, 124, 57, 34, 219, 67, 57, 34, + 249, 163, 57, 34, 242, 116, 57, 34, 217, 60, 57, 34, 235, 214, 57, 34, + 251, 134, 57, 34, 214, 42, 245, 103, 57, 34, 249, 186, 57, 34, 213, 249, + 57, 34, 222, 89, 57, 34, 240, 235, 57, 34, 219, 190, 57, 34, 214, 254, + 57, 34, 251, 248, 57, 34, 225, 205, 57, 34, 252, 92, 57, 34, 220, 232, + 57, 34, 224, 3, 57, 34, 223, 37, 57, 34, 244, 1, 57, 34, 251, 123, 57, + 34, 250, 160, 57, 34, 251, 149, 57, 34, 230, 195, 57, 34, 214, 41, 57, + 34, 249, 220, 57, 34, 213, 221, 57, 34, 247, 132, 57, 34, 214, 142, 57, + 34, 242, 142, 57, 34, 232, 190, 57, 34, 243, 64, 57, 34, 230, 188, 57, + 34, 220, 22, 57, 34, 220, 175, 218, 26, 251, 160, 57, 34, 224, 50, 57, + 34, 251, 130, 57, 34, 213, 185, 57, 34, 244, 158, 57, 34, 233, 76, 57, + 34, 218, 7, 233, 76, 57, 34, 233, 72, 57, 34, 219, 217, 57, 34, 233, 77, + 57, 34, 213, 224, 57, 34, 244, 15, 57, 34, 245, 173, 57, 34, 241, 219, + 57, 34, 243, 226, 57, 34, 240, 232, 57, 34, 251, 119, 57, 34, 218, 14, + 57, 34, 242, 16, 57, 34, 244, 82, 57, 34, 222, 197, 213, 221, 57, 34, + 250, 153, 57, 34, 242, 198, 57, 34, 244, 59, 57, 34, 251, 160, 57, 34, + 222, 172, 57, 34, 248, 25, 57, 34, 213, 243, 57, 34, 241, 194, 57, 34, + 213, 32, 57, 34, 231, 5, 57, 34, 251, 144, 57, 34, 245, 113, 57, 34, 243, + 214, 57, 34, 216, 167, 57, 34, 246, 37, 57, 34, 224, 33, 57, 34, 228, + 164, 57, 34, 245, 8, 57, 34, 216, 228, 57, 34, 246, 50, 57, 34, 216, 55, + 57, 34, 244, 17, 105, 247, 244, 137, 42, 211, 211, 223, 148, 105, 247, + 244, 137, 78, 211, 211, 55, 105, 247, 244, 137, 42, 211, 211, 231, 37, + 24, 223, 148, 105, 247, 244, 137, 78, 211, 211, 231, 37, 24, 55, 105, + 247, 244, 137, 243, 200, 218, 210, 105, 247, 244, 137, 218, 211, 243, + 213, 49, 105, 247, 244, 137, 218, 211, 243, 213, 55, 105, 247, 244, 137, + 218, 211, 243, 213, 233, 70, 105, 247, 244, 137, 218, 211, 243, 213, 215, + 131, 233, 70, 105, 247, 244, 137, 218, 211, 243, 213, 215, 131, 223, 148, + 105, 247, 244, 137, 218, 211, 243, 213, 232, 163, 233, 70, 105, 247, 244, + 137, 226, 246, 105, 219, 206, 105, 249, 157, 105, 243, 200, 219, 69, 247, + 129, 77, 235, 131, 235, 233, 219, 98, 87, 105, 235, 156, 77, 105, 249, + 189, 77, 105, 50, 212, 79, 42, 254, 19, 125, 46, 254, 19, 125, 42, 51, + 254, 19, 125, 46, 51, 254, 19, 125, 42, 249, 100, 125, 46, 249, 100, 125, + 42, 67, 249, 100, 125, 46, 67, 249, 100, 125, 42, 83, 233, 44, 125, 46, + 83, 233, 44, 125, 225, 117, 77, 243, 8, 77, 42, 216, 219, 220, 233, 125, + 46, 216, 219, 220, 233, 125, 42, 67, 233, 44, 125, 46, 67, 233, 44, 125, + 42, 67, 216, 219, 220, 233, 125, 46, 67, 216, 219, 220, 233, 125, 42, 67, + 41, 125, 46, 67, 41, 125, 214, 20, 248, 101, 223, 202, 51, 225, 72, 224, + 143, 77, 51, 225, 72, 224, 143, 77, 115, 51, 225, 72, 224, 143, 77, 225, + 117, 152, 244, 158, 241, 247, 228, 54, 116, 241, 247, 228, 54, 109, 241, + 247, 228, 54, 166, 241, 247, 228, 54, 163, 241, 247, 228, 54, 180, 241, + 247, 228, 54, 189, 241, 247, 228, 54, 198, 241, 247, 228, 54, 195, 241, + 247, 228, 54, 200, 105, 233, 29, 160, 77, 105, 223, 125, 160, 77, 105, + 247, 251, 160, 77, 105, 245, 87, 160, 77, 23, 220, 81, 62, 160, 77, 23, + 51, 62, 160, 77, 214, 16, 248, 101, 71, 234, 238, 223, 228, 77, 71, 234, + 238, 223, 228, 2, 214, 116, 219, 218, 77, 71, 234, 238, 223, 228, 152, + 215, 131, 242, 9, 71, 234, 238, 223, 228, 2, 214, 116, 219, 218, 152, + 215, 131, 242, 9, 71, 234, 238, 223, 228, 152, 232, 163, 242, 9, 36, 225, + 117, 77, 105, 201, 232, 243, 244, 115, 221, 58, 87, 241, 247, 228, 54, + 217, 200, 241, 247, 228, 54, 216, 38, 241, 247, 228, 54, 217, 115, 71, + 105, 235, 156, 77, 231, 203, 77, 226, 127, 254, 49, 77, 105, 43, 235, + 235, 105, 151, 244, 75, 219, 206, 142, 1, 3, 61, 142, 1, 61, 142, 1, 3, + 72, 142, 1, 72, 142, 1, 3, 69, 142, 1, 69, 142, 1, 3, 74, 142, 1, 74, + 142, 1, 3, 75, 142, 1, 75, 142, 1, 181, 142, 1, 243, 110, 142, 1, 234, + 101, 142, 1, 242, 190, 142, 1, 233, 238, 142, 1, 242, 92, 142, 1, 234, + 188, 142, 1, 243, 38, 142, 1, 234, 37, 142, 1, 242, 150, 142, 1, 222, + 202, 142, 1, 212, 109, 142, 1, 220, 117, 142, 1, 212, 37, 142, 1, 219, + 27, 142, 1, 212, 8, 142, 1, 222, 100, 142, 1, 212, 87, 142, 1, 219, 242, + 142, 1, 212, 16, 142, 1, 218, 52, 142, 1, 248, 164, 142, 1, 217, 71, 142, + 1, 247, 211, 142, 1, 3, 216, 82, 142, 1, 216, 82, 142, 1, 246, 33, 142, + 1, 217, 229, 142, 1, 248, 41, 142, 1, 108, 142, 1, 247, 99, 142, 1, 205, + 142, 1, 229, 64, 142, 1, 228, 92, 142, 1, 229, 187, 142, 1, 228, 185, + 142, 1, 159, 142, 1, 252, 107, 142, 1, 193, 142, 1, 241, 165, 142, 1, + 251, 184, 142, 1, 225, 240, 142, 1, 240, 212, 142, 1, 251, 54, 142, 1, + 225, 35, 142, 1, 241, 222, 142, 1, 251, 251, 142, 1, 226, 96, 142, 1, + 241, 54, 142, 1, 251, 128, 142, 1, 225, 150, 142, 1, 188, 142, 1, 231, + 42, 142, 1, 230, 172, 142, 1, 231, 156, 142, 1, 230, 231, 142, 1, 3, 186, + 142, 1, 186, 142, 1, 3, 212, 203, 142, 1, 212, 203, 142, 1, 3, 212, 235, + 142, 1, 212, 235, 142, 1, 203, 142, 1, 223, 188, 142, 1, 223, 51, 142, 1, + 224, 21, 142, 1, 223, 112, 142, 1, 3, 214, 49, 142, 1, 214, 49, 142, 1, + 213, 235, 142, 1, 214, 6, 142, 1, 213, 214, 142, 1, 204, 142, 1, 214, 99, + 142, 1, 3, 181, 142, 1, 3, 234, 188, 37, 234, 206, 214, 116, 219, 218, + 77, 37, 234, 206, 221, 75, 219, 218, 77, 234, 206, 214, 116, 219, 218, + 77, 234, 206, 221, 75, 219, 218, 77, 142, 235, 156, 77, 142, 214, 116, + 235, 156, 77, 142, 247, 173, 212, 216, 234, 206, 51, 240, 160, 56, 1, 3, + 61, 56, 1, 61, 56, 1, 3, 72, 56, 1, 72, 56, 1, 3, 69, 56, 1, 69, 56, 1, + 3, 74, 56, 1, 74, 56, 1, 3, 75, 56, 1, 75, 56, 1, 181, 56, 1, 243, 110, + 56, 1, 234, 101, 56, 1, 242, 190, 56, 1, 233, 238, 56, 1, 242, 92, 56, 1, + 234, 188, 56, 1, 243, 38, 56, 1, 234, 37, 56, 1, 242, 150, 56, 1, 222, + 202, 56, 1, 212, 109, 56, 1, 220, 117, 56, 1, 212, 37, 56, 1, 219, 27, + 56, 1, 212, 8, 56, 1, 222, 100, 56, 1, 212, 87, 56, 1, 219, 242, 56, 1, + 212, 16, 56, 1, 218, 52, 56, 1, 248, 164, 56, 1, 217, 71, 56, 1, 247, + 211, 56, 1, 3, 216, 82, 56, 1, 216, 82, 56, 1, 246, 33, 56, 1, 217, 229, + 56, 1, 248, 41, 56, 1, 108, 56, 1, 247, 99, 56, 1, 205, 56, 1, 229, 64, + 56, 1, 228, 92, 56, 1, 229, 187, 56, 1, 228, 185, 56, 1, 159, 56, 1, 252, + 107, 56, 1, 193, 56, 1, 241, 165, 56, 1, 251, 184, 56, 1, 225, 240, 56, + 1, 240, 212, 56, 1, 251, 54, 56, 1, 225, 35, 56, 1, 241, 222, 56, 1, 251, + 251, 56, 1, 226, 96, 56, 1, 241, 54, 56, 1, 251, 128, 56, 1, 225, 150, + 56, 1, 188, 56, 1, 231, 42, 56, 1, 230, 172, 56, 1, 231, 156, 56, 1, 230, + 231, 56, 1, 3, 186, 56, 1, 186, 56, 1, 3, 212, 203, 56, 1, 212, 203, 56, + 1, 3, 212, 235, 56, 1, 212, 235, 56, 1, 203, 56, 1, 223, 188, 56, 1, 223, + 51, 56, 1, 224, 21, 56, 1, 223, 112, 56, 1, 3, 214, 49, 56, 1, 214, 49, + 56, 1, 213, 235, 56, 1, 214, 6, 56, 1, 213, 214, 56, 1, 204, 56, 1, 214, + 99, 56, 1, 3, 181, 56, 1, 3, 234, 188, 56, 1, 215, 1, 56, 1, 214, 154, + 56, 1, 214, 232, 56, 1, 214, 119, 56, 231, 37, 247, 74, 234, 206, 225, + 57, 219, 218, 77, 56, 235, 156, 77, 56, 214, 116, 235, 156, 77, 56, 247, + 173, 234, 8, 202, 1, 253, 74, 202, 1, 226, 229, 202, 1, 183, 202, 1, 244, + 230, 202, 1, 249, 3, 202, 1, 218, 99, 202, 1, 204, 202, 1, 150, 202, 1, + 243, 177, 202, 1, 235, 27, 202, 1, 242, 41, 202, 1, 235, 142, 202, 1, + 224, 240, 202, 1, 213, 166, 202, 1, 212, 76, 202, 1, 250, 93, 202, 1, + 221, 26, 202, 1, 149, 202, 1, 212, 152, 202, 1, 250, 252, 202, 1, 197, + 202, 1, 61, 202, 1, 75, 202, 1, 74, 202, 1, 245, 154, 202, 1, 254, 108, + 202, 1, 245, 152, 202, 1, 253, 108, 202, 1, 227, 2, 202, 1, 254, 32, 202, + 1, 245, 108, 202, 1, 254, 24, 202, 1, 245, 96, 202, 1, 245, 55, 202, 1, + 72, 202, 1, 69, 202, 1, 235, 154, 202, 1, 215, 79, 202, 1, 229, 161, 202, + 1, 242, 154, 202, 1, 236, 29, 23, 1, 234, 67, 23, 1, 219, 150, 23, 1, + 234, 60, 23, 1, 229, 57, 23, 1, 229, 55, 23, 1, 229, 54, 23, 1, 217, 55, + 23, 1, 219, 139, 23, 1, 223, 179, 23, 1, 223, 174, 23, 1, 223, 171, 23, + 1, 223, 164, 23, 1, 223, 159, 23, 1, 223, 154, 23, 1, 223, 165, 23, 1, + 223, 177, 23, 1, 231, 30, 23, 1, 225, 227, 23, 1, 219, 147, 23, 1, 225, + 216, 23, 1, 220, 76, 23, 1, 219, 144, 23, 1, 236, 51, 23, 1, 249, 239, + 23, 1, 219, 154, 23, 1, 250, 43, 23, 1, 234, 116, 23, 1, 217, 126, 23, 1, + 226, 7, 23, 1, 241, 158, 23, 1, 61, 23, 1, 254, 148, 23, 1, 186, 23, 1, + 213, 80, 23, 1, 245, 76, 23, 1, 74, 23, 1, 213, 27, 23, 1, 213, 38, 23, + 1, 75, 23, 1, 214, 49, 23, 1, 214, 46, 23, 1, 227, 99, 23, 1, 212, 235, + 23, 1, 69, 23, 1, 213, 252, 23, 1, 214, 6, 23, 1, 213, 235, 23, 1, 212, + 203, 23, 1, 245, 22, 23, 1, 212, 255, 23, 1, 72, 23, 244, 72, 23, 1, 219, + 148, 23, 1, 229, 47, 23, 1, 229, 49, 23, 1, 229, 52, 23, 1, 223, 172, 23, + 1, 223, 153, 23, 1, 223, 161, 23, 1, 223, 166, 23, 1, 223, 151, 23, 1, + 231, 23, 23, 1, 231, 20, 23, 1, 231, 24, 23, 1, 234, 226, 23, 1, 225, + 222, 23, 1, 225, 208, 23, 1, 225, 214, 23, 1, 225, 211, 23, 1, 225, 225, + 23, 1, 225, 209, 23, 1, 234, 224, 23, 1, 234, 222, 23, 1, 220, 69, 23, 1, + 220, 67, 23, 1, 220, 59, 23, 1, 220, 64, 23, 1, 220, 74, 23, 1, 226, 160, + 23, 1, 219, 151, 23, 1, 213, 17, 23, 1, 213, 13, 23, 1, 213, 14, 23, 1, + 234, 225, 23, 1, 219, 152, 23, 1, 213, 23, 23, 1, 212, 229, 23, 1, 212, + 228, 23, 1, 212, 231, 23, 1, 212, 194, 23, 1, 212, 195, 23, 1, 212, 198, + 23, 1, 253, 204, 23, 1, 253, 198, 105, 254, 10, 232, 232, 77, 105, 254, + 10, 223, 203, 77, 105, 254, 10, 122, 77, 105, 254, 10, 117, 77, 105, 254, + 10, 133, 77, 105, 254, 10, 243, 237, 77, 105, 254, 10, 216, 227, 77, 105, + 254, 10, 231, 37, 77, 105, 254, 10, 251, 101, 77, 105, 254, 10, 244, 61, + 77, 105, 254, 10, 222, 95, 77, 105, 254, 10, 217, 122, 77, 105, 254, 10, + 243, 230, 77, 105, 254, 10, 241, 208, 77, 105, 254, 10, 245, 180, 77, + 105, 254, 10, 231, 249, 77, 202, 1, 251, 54, 202, 1, 212, 37, 202, 1, + 235, 110, 202, 1, 242, 92, 202, 1, 245, 165, 202, 1, 245, 93, 202, 1, + 227, 49, 202, 1, 227, 53, 202, 1, 235, 177, 202, 1, 254, 12, 202, 1, 235, + 221, 202, 1, 215, 139, 202, 1, 236, 11, 202, 1, 229, 142, 202, 1, 254, + 102, 202, 1, 253, 103, 202, 1, 254, 45, 202, 1, 227, 70, 202, 1, 227, 55, + 202, 1, 235, 218, 202, 40, 1, 226, 229, 202, 40, 1, 218, 99, 202, 40, 1, + 235, 27, 202, 40, 1, 242, 41, 202, 1, 242, 226, 202, 1, 233, 26, 202, 1, + 211, 249, 9, 219, 45, 218, 99, 9, 219, 45, 213, 245, 9, 219, 45, 213, + 146, 9, 219, 45, 251, 8, 9, 219, 45, 218, 199, 9, 219, 45, 240, 150, 9, + 219, 45, 240, 154, 9, 219, 45, 240, 218, 9, 219, 45, 240, 151, 9, 219, + 45, 218, 102, 9, 219, 45, 240, 153, 9, 219, 45, 240, 149, 9, 219, 45, + 240, 216, 9, 219, 45, 240, 152, 9, 219, 45, 240, 148, 9, 219, 45, 204, 9, + 219, 45, 242, 41, 9, 219, 45, 197, 9, 219, 45, 226, 229, 9, 219, 45, 219, + 208, 9, 219, 45, 249, 3, 9, 219, 45, 240, 155, 9, 219, 45, 241, 175, 9, + 219, 45, 218, 111, 9, 219, 45, 218, 178, 9, 219, 45, 219, 107, 9, 219, + 45, 221, 31, 9, 219, 45, 226, 98, 9, 219, 45, 224, 242, 9, 219, 45, 216, + 253, 9, 219, 45, 218, 101, 9, 219, 45, 218, 189, 9, 219, 45, 240, 162, 9, + 219, 45, 240, 147, 9, 219, 45, 226, 25, 9, 219, 45, 224, 240, 56, 1, 3, + 233, 238, 56, 1, 3, 220, 117, 56, 1, 3, 219, 27, 56, 1, 3, 108, 56, 1, 3, + 228, 92, 56, 1, 3, 159, 56, 1, 3, 241, 165, 56, 1, 3, 240, 212, 56, 1, 3, + 241, 222, 56, 1, 3, 241, 54, 56, 1, 3, 230, 172, 56, 1, 3, 203, 56, 1, 3, + 223, 188, 56, 1, 3, 223, 51, 56, 1, 3, 224, 21, 56, 1, 3, 223, 112, 86, + 23, 234, 67, 86, 23, 229, 57, 86, 23, 217, 55, 86, 23, 223, 179, 86, 23, + 231, 30, 86, 23, 225, 227, 86, 23, 220, 76, 86, 23, 236, 51, 86, 23, 249, + 239, 86, 23, 250, 43, 86, 23, 234, 116, 86, 23, 217, 126, 86, 23, 226, 7, + 86, 23, 241, 158, 86, 23, 234, 68, 61, 86, 23, 229, 58, 61, 86, 23, 217, + 56, 61, 86, 23, 223, 180, 61, 86, 23, 231, 31, 61, 86, 23, 225, 228, 61, + 86, 23, 220, 77, 61, 86, 23, 236, 52, 61, 86, 23, 249, 240, 61, 86, 23, + 250, 44, 61, 86, 23, 234, 117, 61, 86, 23, 217, 127, 61, 86, 23, 226, 8, + 61, 86, 23, 241, 159, 61, 86, 23, 249, 240, 69, 86, 234, 12, 137, 227, + 83, 86, 234, 12, 137, 157, 240, 212, 86, 143, 116, 86, 143, 109, 86, 143, + 166, 86, 143, 163, 86, 143, 180, 86, 143, 189, 86, 143, 198, 86, 143, + 195, 86, 143, 200, 86, 143, 217, 200, 86, 143, 230, 198, 86, 143, 244, + 65, 86, 143, 214, 24, 86, 143, 213, 201, 86, 143, 231, 106, 86, 143, 245, + 179, 86, 143, 218, 238, 86, 143, 219, 72, 86, 143, 241, 228, 86, 143, + 219, 238, 86, 143, 230, 24, 86, 143, 219, 192, 86, 143, 244, 71, 86, 143, + 249, 140, 86, 143, 233, 148, 86, 143, 223, 223, 86, 143, 250, 203, 86, + 143, 219, 30, 86, 143, 218, 220, 86, 143, 245, 86, 86, 143, 223, 215, 86, + 143, 254, 59, 86, 143, 244, 97, 86, 143, 223, 213, 86, 143, 221, 76, 86, + 143, 224, 20, 36, 143, 224, 157, 36, 143, 234, 89, 36, 143, 222, 116, 36, + 143, 234, 8, 36, 50, 217, 201, 227, 63, 83, 219, 166, 36, 50, 216, 39, + 227, 63, 83, 219, 166, 36, 50, 217, 116, 227, 63, 83, 219, 166, 36, 50, + 243, 241, 227, 63, 83, 219, 166, 36, 50, 244, 84, 227, 63, 83, 219, 166, + 36, 50, 220, 40, 227, 63, 83, 219, 166, 36, 50, 221, 38, 227, 63, 83, + 219, 166, 36, 50, 245, 142, 227, 63, 83, 219, 166, 226, 123, 52, 36, 50, + 216, 39, 116, 36, 50, 216, 39, 109, 36, 50, 216, 39, 166, 36, 50, 216, + 39, 163, 36, 50, 216, 39, 180, 36, 50, 216, 39, 189, 36, 50, 216, 39, + 198, 36, 50, 216, 39, 195, 36, 50, 216, 39, 200, 36, 50, 217, 115, 36, + 50, 217, 116, 116, 36, 50, 217, 116, 109, 36, 50, 217, 116, 166, 36, 50, + 217, 116, 163, 36, 50, 217, 116, 180, 36, 23, 234, 67, 36, 23, 229, 57, + 36, 23, 217, 55, 36, 23, 223, 179, 36, 23, 231, 30, 36, 23, 225, 227, 36, + 23, 220, 76, 36, 23, 236, 51, 36, 23, 249, 239, 36, 23, 250, 43, 36, 23, + 234, 116, 36, 23, 217, 126, 36, 23, 226, 7, 36, 23, 241, 158, 36, 23, + 234, 68, 61, 36, 23, 229, 58, 61, 36, 23, 217, 56, 61, 36, 23, 223, 180, + 61, 36, 23, 231, 31, 61, 36, 23, 225, 228, 61, 36, 23, 220, 77, 61, 36, + 23, 236, 52, 61, 36, 23, 249, 240, 61, 36, 23, 250, 44, 61, 36, 23, 234, + 117, 61, 36, 23, 217, 127, 61, 36, 23, 226, 8, 61, 36, 23, 241, 159, 61, + 36, 234, 12, 137, 250, 84, 36, 234, 12, 137, 235, 50, 36, 23, 236, 52, + 69, 234, 12, 219, 98, 87, 36, 143, 116, 36, 143, 109, 36, 143, 166, 36, + 143, 163, 36, 143, 180, 36, 143, 189, 36, 143, 198, 36, 143, 195, 36, + 143, 200, 36, 143, 217, 200, 36, 143, 230, 198, 36, 143, 244, 65, 36, + 143, 214, 24, 36, 143, 213, 201, 36, 143, 231, 106, 36, 143, 245, 179, + 36, 143, 218, 238, 36, 143, 219, 72, 36, 143, 241, 228, 36, 143, 219, + 238, 36, 143, 230, 24, 36, 143, 219, 192, 36, 143, 244, 71, 36, 143, 249, + 140, 36, 143, 233, 148, 36, 143, 222, 93, 36, 143, 231, 252, 36, 143, + 244, 106, 36, 143, 218, 250, 36, 143, 245, 1, 36, 143, 225, 68, 36, 143, + 253, 112, 36, 143, 235, 157, 36, 143, 223, 213, 36, 143, 249, 103, 36, + 143, 249, 94, 36, 143, 241, 151, 36, 143, 250, 108, 36, 143, 232, 165, + 36, 143, 233, 70, 36, 143, 223, 148, 36, 143, 231, 148, 36, 143, 223, + 237, 36, 143, 219, 30, 36, 143, 218, 220, 36, 143, 245, 86, 36, 143, 223, + 215, 36, 143, 254, 59, 36, 143, 229, 43, 36, 50, 217, 116, 189, 36, 50, + 217, 116, 198, 36, 50, 217, 116, 195, 36, 50, 217, 116, 200, 36, 50, 243, + 240, 36, 50, 243, 241, 116, 36, 50, 243, 241, 109, 36, 50, 243, 241, 166, + 36, 50, 243, 241, 163, 36, 50, 243, 241, 180, 36, 50, 243, 241, 189, 36, + 50, 243, 241, 198, 36, 50, 243, 241, 195, 36, 50, 243, 241, 200, 36, 50, + 244, 83, 105, 201, 16, 31, 235, 133, 105, 201, 16, 31, 244, 117, 105, + 201, 16, 31, 231, 223, 105, 201, 16, 31, 253, 217, 105, 201, 16, 31, 231, + 196, 105, 201, 16, 31, 235, 48, 105, 201, 16, 31, 235, 49, 105, 201, 16, + 31, 253, 104, 105, 201, 16, 31, 221, 56, 105, 201, 16, 31, 227, 104, 105, + 201, 16, 31, 228, 151, 105, 201, 16, 31, 248, 36, 41, 241, 175, 41, 245, + 51, 41, 245, 10, 232, 248, 233, 12, 52, 36, 56, 61, 36, 56, 72, 36, 56, + 69, 36, 56, 74, 36, 56, 75, 36, 56, 181, 36, 56, 234, 101, 36, 56, 233, + 238, 36, 56, 234, 188, 36, 56, 234, 37, 36, 56, 222, 202, 36, 56, 220, + 117, 36, 56, 219, 27, 36, 56, 222, 100, 36, 56, 219, 242, 36, 56, 218, + 52, 36, 56, 217, 71, 36, 56, 216, 82, 36, 56, 217, 229, 36, 56, 108, 36, + 56, 205, 36, 56, 229, 64, 36, 56, 228, 92, 36, 56, 229, 187, 36, 56, 228, + 185, 36, 56, 159, 36, 56, 241, 165, 36, 56, 240, 212, 36, 56, 241, 222, + 36, 56, 241, 54, 36, 56, 188, 36, 56, 231, 42, 36, 56, 230, 172, 36, 56, + 231, 156, 36, 56, 230, 231, 36, 56, 186, 36, 56, 212, 203, 36, 56, 212, + 235, 36, 56, 203, 36, 56, 223, 188, 36, 56, 223, 51, 36, 56, 224, 21, 36, + 56, 223, 112, 36, 56, 214, 49, 36, 56, 213, 235, 36, 56, 214, 6, 36, 56, + 213, 214, 41, 253, 238, 41, 253, 154, 41, 254, 6, 41, 254, 190, 41, 235, + 223, 41, 235, 193, 41, 215, 137, 41, 245, 31, 41, 245, 163, 41, 227, 52, + 41, 227, 46, 41, 234, 249, 41, 234, 219, 41, 234, 216, 41, 243, 68, 41, + 243, 77, 41, 242, 180, 41, 242, 176, 41, 233, 172, 41, 242, 169, 41, 234, + 81, 41, 234, 80, 41, 234, 79, 41, 234, 78, 41, 242, 67, 41, 242, 66, 41, + 233, 214, 41, 233, 216, 41, 234, 184, 41, 234, 10, 41, 234, 17, 41, 222, + 187, 41, 222, 153, 41, 220, 57, 41, 221, 61, 41, 221, 60, 41, 248, 161, + 41, 247, 243, 41, 247, 75, 41, 216, 243, 41, 230, 20, 41, 228, 152, 41, + 242, 14, 41, 226, 208, 41, 226, 207, 41, 252, 105, 41, 225, 237, 41, 225, + 201, 41, 225, 202, 41, 251, 157, 41, 240, 211, 41, 240, 207, 41, 251, 20, + 41, 240, 194, 41, 241, 199, 41, 226, 35, 41, 226, 69, 41, 241, 183, 41, + 226, 66, 41, 226, 82, 41, 251, 237, 41, 225, 140, 41, 251, 106, 41, 241, + 42, 41, 225, 130, 41, 241, 35, 41, 241, 37, 41, 232, 7, 41, 232, 3, 41, + 232, 11, 41, 231, 213, 41, 231, 238, 41, 231, 10, 41, 230, 245, 41, 230, + 244, 41, 231, 138, 41, 231, 135, 41, 231, 139, 41, 213, 90, 41, 213, 88, + 41, 212, 192, 41, 223, 123, 41, 223, 127, 41, 223, 28, 41, 223, 23, 41, + 223, 235, 41, 223, 232, 41, 214, 22, 105, 201, 16, 31, 240, 226, 212, 79, + 105, 201, 16, 31, 240, 226, 116, 105, 201, 16, 31, 240, 226, 109, 105, + 201, 16, 31, 240, 226, 166, 105, 201, 16, 31, 240, 226, 163, 105, 201, + 16, 31, 240, 226, 180, 105, 201, 16, 31, 240, 226, 189, 105, 201, 16, 31, + 240, 226, 198, 105, 201, 16, 31, 240, 226, 195, 105, 201, 16, 31, 240, + 226, 200, 105, 201, 16, 31, 240, 226, 217, 200, 105, 201, 16, 31, 240, + 226, 245, 124, 105, 201, 16, 31, 240, 226, 216, 41, 105, 201, 16, 31, + 240, 226, 217, 117, 105, 201, 16, 31, 240, 226, 243, 231, 105, 201, 16, + 31, 240, 226, 244, 87, 105, 201, 16, 31, 240, 226, 220, 47, 105, 201, 16, + 31, 240, 226, 221, 40, 105, 201, 16, 31, 240, 226, 245, 147, 105, 201, + 16, 31, 240, 226, 229, 28, 105, 201, 16, 31, 240, 226, 216, 38, 105, 201, + 16, 31, 240, 226, 216, 32, 105, 201, 16, 31, 240, 226, 216, 28, 105, 201, + 16, 31, 240, 226, 216, 29, 105, 201, 16, 31, 240, 226, 216, 34, 41, 240, + 217, 41, 248, 164, 41, 253, 108, 41, 134, 41, 226, 249, 41, 226, 99, 41, + 247, 101, 41, 247, 102, 219, 165, 41, 247, 102, 249, 49, 41, 235, 154, + 41, 245, 54, 230, 25, 241, 200, 41, 245, 54, 230, 25, 218, 120, 41, 245, + 54, 230, 25, 218, 24, 41, 245, 54, 230, 25, 231, 134, 41, 249, 96, 41, + 226, 214, 254, 34, 41, 205, 41, 230, 173, 61, 41, 188, 41, 181, 41, 234, + 191, 41, 231, 192, 41, 243, 56, 41, 250, 206, 41, 234, 190, 41, 226, 26, + 41, 229, 163, 41, 230, 173, 244, 230, 41, 230, 173, 243, 177, 41, 231, + 82, 41, 234, 140, 41, 240, 155, 41, 234, 103, 41, 231, 44, 41, 242, 192, + 41, 217, 73, 41, 230, 173, 150, 41, 230, 238, 41, 247, 109, 41, 234, 49, + 41, 244, 14, 41, 228, 200, 41, 230, 173, 183, 41, 230, 235, 41, 249, 176, + 41, 234, 43, 41, 230, 236, 219, 165, 41, 249, 177, 219, 165, 41, 232, + 110, 219, 165, 41, 234, 44, 219, 165, 41, 230, 236, 249, 49, 41, 249, + 177, 249, 49, 41, 232, 110, 249, 49, 41, 234, 44, 249, 49, 41, 232, 110, + 110, 197, 41, 232, 110, 110, 223, 4, 219, 165, 41, 193, 41, 234, 4, 41, + 230, 175, 41, 242, 127, 41, 224, 66, 41, 224, 67, 110, 197, 41, 224, 67, + 110, 223, 4, 219, 165, 41, 225, 47, 41, 228, 124, 41, 230, 173, 197, 41, + 230, 174, 41, 225, 4, 41, 228, 33, 41, 230, 173, 215, 79, 41, 230, 120, + 41, 233, 207, 41, 230, 121, 231, 138, 41, 225, 3, 41, 228, 32, 41, 230, + 173, 214, 82, 41, 230, 115, 41, 233, 205, 41, 230, 116, 231, 138, 41, + 235, 28, 227, 86, 41, 232, 110, 227, 86, 41, 254, 45, 41, 251, 87, 41, + 250, 147, 41, 250, 125, 41, 250, 253, 110, 234, 140, 41, 249, 175, 41, + 248, 88, 41, 242, 53, 41, 159, 41, 240, 218, 41, 235, 251, 41, 234, 56, + 41, 234, 44, 250, 182, 41, 233, 240, 41, 232, 211, 41, 232, 210, 41, 232, + 200, 41, 232, 122, 41, 231, 193, 220, 7, 41, 231, 9, 41, 230, 222, 41, + 226, 24, 41, 225, 153, 41, 225, 99, 41, 225, 97, 41, 219, 159, 41, 218, + 203, 41, 214, 8, 41, 215, 80, 110, 183, 41, 118, 110, 183, 105, 201, 16, + 31, 248, 92, 116, 105, 201, 16, 31, 248, 92, 109, 105, 201, 16, 31, 248, + 92, 166, 105, 201, 16, 31, 248, 92, 163, 105, 201, 16, 31, 248, 92, 180, + 105, 201, 16, 31, 248, 92, 189, 105, 201, 16, 31, 248, 92, 198, 105, 201, + 16, 31, 248, 92, 195, 105, 201, 16, 31, 248, 92, 200, 105, 201, 16, 31, + 248, 92, 217, 200, 105, 201, 16, 31, 248, 92, 245, 124, 105, 201, 16, 31, + 248, 92, 216, 41, 105, 201, 16, 31, 248, 92, 217, 117, 105, 201, 16, 31, + 248, 92, 243, 231, 105, 201, 16, 31, 248, 92, 244, 87, 105, 201, 16, 31, + 248, 92, 220, 47, 105, 201, 16, 31, 248, 92, 221, 40, 105, 201, 16, 31, + 248, 92, 245, 147, 105, 201, 16, 31, 248, 92, 229, 28, 105, 201, 16, 31, + 248, 92, 216, 38, 105, 201, 16, 31, 248, 92, 216, 32, 105, 201, 16, 31, + 248, 92, 216, 28, 105, 201, 16, 31, 248, 92, 216, 29, 105, 201, 16, 31, + 248, 92, 216, 34, 105, 201, 16, 31, 248, 92, 216, 35, 105, 201, 16, 31, + 248, 92, 216, 30, 105, 201, 16, 31, 248, 92, 216, 31, 105, 201, 16, 31, + 248, 92, 216, 37, 105, 201, 16, 31, 248, 92, 216, 33, 105, 201, 16, 31, + 248, 92, 217, 115, 105, 201, 16, 31, 248, 92, 217, 114, 41, 243, 94, 241, + 177, 31, 217, 149, 249, 80, 241, 207, 241, 177, 31, 217, 149, 224, 15, + 245, 179, 241, 177, 31, 247, 183, 253, 123, 217, 149, 251, 232, 241, 177, + 31, 212, 214, 244, 7, 241, 177, 31, 214, 43, 241, 177, 31, 249, 142, 241, + 177, 31, 217, 149, 253, 174, 241, 177, 31, 241, 46, 216, 249, 241, 177, + 31, 3, 218, 12, 241, 177, 31, 216, 195, 241, 177, 31, 226, 94, 241, 177, + 31, 219, 97, 241, 177, 31, 244, 108, 241, 177, 31, 242, 109, 225, 120, + 241, 177, 31, 230, 225, 241, 177, 31, 245, 85, 241, 177, 31, 244, 8, 241, + 177, 31, 213, 194, 227, 63, 217, 149, 248, 37, 241, 177, 31, 253, 221, + 241, 177, 31, 249, 124, 241, 177, 31, 251, 150, 217, 92, 241, 177, 31, + 242, 125, 241, 177, 31, 219, 177, 253, 237, 241, 177, 31, 223, 205, 241, + 177, 31, 235, 217, 241, 177, 31, 242, 109, 218, 12, 241, 177, 31, 230, + 181, 249, 98, 241, 177, 31, 242, 109, 225, 77, 241, 177, 31, 217, 149, + 254, 178, 214, 24, 241, 177, 31, 217, 149, 249, 201, 244, 65, 241, 177, + 31, 235, 230, 241, 177, 31, 246, 12, 241, 177, 31, 223, 208, 241, 177, + 31, 242, 109, 225, 104, 241, 177, 31, 225, 61, 241, 177, 31, 248, 106, + 65, 217, 149, 233, 2, 241, 177, 31, 217, 149, 244, 142, 241, 177, 31, + 227, 29, 241, 177, 31, 227, 108, 241, 177, 31, 248, 10, 241, 177, 31, + 248, 30, 241, 177, 31, 235, 243, 241, 177, 31, 251, 77, 241, 177, 31, + 249, 159, 211, 211, 231, 141, 241, 177, 31, 243, 63, 216, 249, 241, 177, + 31, 225, 12, 215, 125, 241, 177, 31, 227, 28, 241, 177, 31, 217, 149, + 213, 254, 241, 177, 31, 223, 198, 241, 177, 31, 217, 149, 250, 153, 241, + 177, 31, 217, 149, 253, 170, 217, 87, 241, 177, 31, 217, 149, 234, 185, + 219, 74, 230, 185, 241, 177, 31, 247, 239, 241, 177, 31, 217, 149, 231, + 215, 232, 8, 241, 177, 31, 254, 179, 241, 177, 31, 217, 149, 214, 38, + 241, 177, 31, 217, 149, 243, 23, 213, 224, 241, 177, 31, 217, 149, 235, + 55, 233, 131, 241, 177, 31, 247, 136, 241, 177, 31, 232, 249, 241, 177, + 31, 235, 220, 216, 145, 241, 177, 31, 3, 225, 77, 241, 177, 31, 254, 122, + 249, 151, 241, 177, 31, 251, 235, 249, 151, 8, 4, 235, 158, 8, 4, 235, + 151, 8, 4, 72, 8, 4, 235, 180, 8, 4, 236, 53, 8, 4, 236, 36, 8, 4, 236, + 55, 8, 4, 236, 54, 8, 4, 253, 122, 8, 4, 253, 85, 8, 4, 61, 8, 4, 253, + 239, 8, 4, 215, 135, 8, 4, 215, 138, 8, 4, 215, 136, 8, 4, 227, 8, 8, 4, + 226, 238, 8, 4, 75, 8, 4, 227, 41, 8, 4, 245, 2, 8, 4, 74, 8, 4, 213, + 183, 8, 4, 251, 151, 8, 4, 251, 148, 8, 4, 251, 184, 8, 4, 251, 161, 8, + 4, 251, 174, 8, 4, 251, 173, 8, 4, 251, 176, 8, 4, 251, 175, 8, 4, 252, + 41, 8, 4, 252, 33, 8, 4, 252, 107, 8, 4, 252, 61, 8, 4, 251, 30, 8, 4, + 251, 34, 8, 4, 251, 31, 8, 4, 251, 105, 8, 4, 251, 89, 8, 4, 251, 128, 8, + 4, 251, 110, 8, 4, 251, 198, 8, 4, 251, 251, 8, 4, 251, 210, 8, 4, 251, + 16, 8, 4, 251, 13, 8, 4, 251, 54, 8, 4, 251, 29, 8, 4, 251, 23, 8, 4, + 251, 27, 8, 4, 251, 1, 8, 4, 251, 0, 8, 4, 251, 6, 8, 4, 251, 4, 8, 4, + 251, 2, 8, 4, 251, 3, 8, 4, 225, 181, 8, 4, 225, 177, 8, 4, 225, 240, 8, + 4, 225, 191, 8, 4, 225, 207, 8, 4, 225, 234, 8, 4, 225, 230, 8, 4, 226, + 113, 8, 4, 226, 104, 8, 4, 193, 8, 4, 226, 149, 8, 4, 225, 21, 8, 4, 225, + 23, 8, 4, 225, 22, 8, 4, 225, 113, 8, 4, 225, 102, 8, 4, 225, 150, 8, 4, + 225, 125, 8, 4, 225, 8, 8, 4, 225, 5, 8, 4, 225, 35, 8, 4, 225, 20, 8, 4, + 225, 13, 8, 4, 225, 18, 8, 4, 224, 244, 8, 4, 224, 243, 8, 4, 224, 248, + 8, 4, 224, 247, 8, 4, 224, 245, 8, 4, 224, 246, 8, 4, 252, 16, 8, 4, 252, + 15, 8, 4, 252, 22, 8, 4, 252, 17, 8, 4, 252, 19, 8, 4, 252, 18, 8, 4, + 252, 21, 8, 4, 252, 20, 8, 4, 252, 28, 8, 4, 252, 27, 8, 4, 252, 31, 8, + 4, 252, 29, 8, 4, 252, 7, 8, 4, 252, 9, 8, 4, 252, 8, 8, 4, 252, 12, 8, + 4, 252, 11, 8, 4, 252, 14, 8, 4, 252, 13, 8, 4, 252, 23, 8, 4, 252, 26, + 8, 4, 252, 24, 8, 4, 252, 3, 8, 4, 252, 2, 8, 4, 252, 10, 8, 4, 252, 6, + 8, 4, 252, 4, 8, 4, 252, 5, 8, 4, 251, 255, 8, 4, 251, 254, 8, 4, 252, 1, + 8, 4, 252, 0, 8, 4, 229, 248, 8, 4, 229, 247, 8, 4, 229, 253, 8, 4, 229, + 249, 8, 4, 229, 250, 8, 4, 229, 252, 8, 4, 229, 251, 8, 4, 229, 255, 8, + 4, 229, 254, 8, 4, 230, 1, 8, 4, 230, 0, 8, 4, 229, 244, 8, 4, 229, 243, + 8, 4, 229, 246, 8, 4, 229, 245, 8, 4, 229, 238, 8, 4, 229, 237, 8, 4, + 229, 242, 8, 4, 229, 241, 8, 4, 229, 239, 8, 4, 229, 240, 8, 4, 229, 232, + 8, 4, 229, 231, 8, 4, 229, 236, 8, 4, 229, 235, 8, 4, 229, 233, 8, 4, + 229, 234, 8, 4, 241, 96, 8, 4, 241, 95, 8, 4, 241, 101, 8, 4, 241, 97, 8, + 4, 241, 98, 8, 4, 241, 100, 8, 4, 241, 99, 8, 4, 241, 104, 8, 4, 241, + 103, 8, 4, 241, 106, 8, 4, 241, 105, 8, 4, 241, 87, 8, 4, 241, 89, 8, 4, + 241, 88, 8, 4, 241, 92, 8, 4, 241, 91, 8, 4, 241, 94, 8, 4, 241, 93, 8, + 4, 241, 83, 8, 4, 241, 82, 8, 4, 241, 90, 8, 4, 241, 86, 8, 4, 241, 84, + 8, 4, 241, 85, 8, 4, 241, 77, 8, 4, 241, 81, 8, 4, 241, 80, 8, 4, 241, + 78, 8, 4, 241, 79, 8, 4, 230, 241, 8, 4, 230, 240, 8, 4, 231, 42, 8, 4, + 230, 247, 8, 4, 231, 16, 8, 4, 231, 34, 8, 4, 231, 32, 8, 4, 231, 202, 8, + 4, 231, 198, 8, 4, 188, 8, 4, 231, 235, 8, 4, 230, 144, 8, 4, 230, 143, + 8, 4, 230, 147, 8, 4, 230, 145, 8, 4, 230, 191, 8, 4, 230, 177, 8, 4, + 230, 231, 8, 4, 230, 196, 8, 4, 231, 93, 8, 4, 231, 156, 8, 4, 230, 125, + 8, 4, 230, 122, 8, 4, 230, 172, 8, 4, 230, 140, 8, 4, 230, 133, 8, 4, + 230, 138, 8, 4, 230, 100, 8, 4, 230, 99, 8, 4, 230, 105, 8, 4, 230, 102, + 8, 4, 244, 52, 8, 4, 244, 47, 8, 4, 244, 90, 8, 4, 244, 67, 8, 4, 244, + 135, 8, 4, 244, 126, 8, 4, 244, 164, 8, 4, 244, 138, 8, 4, 243, 229, 8, + 4, 244, 12, 8, 4, 243, 252, 8, 4, 243, 190, 8, 4, 243, 189, 8, 4, 243, + 205, 8, 4, 243, 195, 8, 4, 243, 193, 8, 4, 243, 194, 8, 4, 243, 180, 8, + 4, 243, 179, 8, 4, 243, 183, 8, 4, 243, 181, 8, 4, 214, 125, 8, 4, 214, + 120, 8, 4, 214, 154, 8, 4, 214, 134, 8, 4, 214, 146, 8, 4, 214, 143, 8, + 4, 214, 148, 8, 4, 214, 147, 8, 4, 214, 239, 8, 4, 214, 235, 8, 4, 215, + 1, 8, 4, 214, 250, 8, 4, 214, 106, 8, 4, 214, 102, 8, 4, 214, 119, 8, 4, + 214, 107, 8, 4, 214, 155, 8, 4, 214, 221, 8, 4, 214, 93, 8, 4, 214, 92, + 8, 4, 214, 99, 8, 4, 214, 96, 8, 4, 214, 94, 8, 4, 214, 95, 8, 4, 214, + 86, 8, 4, 214, 85, 8, 4, 214, 90, 8, 4, 214, 89, 8, 4, 214, 87, 8, 4, + 214, 88, 8, 4, 247, 130, 8, 4, 247, 118, 8, 4, 247, 211, 8, 4, 247, 155, + 8, 4, 247, 188, 8, 4, 247, 192, 8, 4, 247, 191, 8, 4, 248, 98, 8, 4, 248, + 93, 8, 4, 248, 164, 8, 4, 248, 117, 8, 4, 246, 17, 8, 4, 246, 18, 8, 4, + 247, 74, 8, 4, 246, 56, 8, 4, 247, 99, 8, 4, 247, 76, 8, 4, 247, 237, 8, + 4, 248, 41, 8, 4, 247, 252, 8, 4, 246, 8, 8, 4, 246, 6, 8, 4, 246, 33, 8, + 4, 246, 16, 8, 4, 246, 11, 8, 4, 246, 14, 8, 4, 217, 20, 8, 4, 217, 14, + 8, 4, 217, 71, 8, 4, 217, 29, 8, 4, 217, 63, 8, 4, 217, 65, 8, 4, 217, + 64, 8, 4, 217, 253, 8, 4, 217, 240, 8, 4, 218, 52, 8, 4, 218, 5, 8, 4, + 216, 66, 8, 4, 216, 65, 8, 4, 216, 68, 8, 4, 216, 67, 8, 4, 216, 218, 8, + 4, 216, 214, 8, 4, 108, 8, 4, 216, 226, 8, 4, 217, 166, 8, 4, 217, 229, + 8, 4, 217, 190, 8, 4, 216, 52, 8, 4, 216, 48, 8, 4, 216, 82, 8, 4, 216, + 64, 8, 4, 216, 53, 8, 4, 216, 62, 8, 4, 248, 58, 8, 4, 248, 57, 8, 4, + 248, 63, 8, 4, 248, 59, 8, 4, 248, 60, 8, 4, 248, 62, 8, 4, 248, 61, 8, + 4, 248, 79, 8, 4, 248, 78, 8, 4, 248, 86, 8, 4, 248, 80, 8, 4, 248, 48, + 8, 4, 248, 50, 8, 4, 248, 49, 8, 4, 248, 53, 8, 4, 248, 52, 8, 4, 248, + 56, 8, 4, 248, 54, 8, 4, 248, 71, 8, 4, 248, 74, 8, 4, 248, 72, 8, 4, + 248, 44, 8, 4, 248, 43, 8, 4, 248, 51, 8, 4, 248, 47, 8, 4, 248, 45, 8, + 4, 248, 46, 8, 4, 229, 206, 8, 4, 229, 205, 8, 4, 229, 213, 8, 4, 229, + 208, 8, 4, 229, 209, 8, 4, 229, 210, 8, 4, 229, 222, 8, 4, 229, 221, 8, + 4, 229, 228, 8, 4, 229, 223, 8, 4, 229, 198, 8, 4, 229, 197, 8, 4, 229, + 204, 8, 4, 229, 199, 8, 4, 229, 214, 8, 4, 229, 220, 8, 4, 229, 218, 8, + 4, 229, 190, 8, 4, 229, 189, 8, 4, 229, 195, 8, 4, 229, 193, 8, 4, 229, + 191, 8, 4, 229, 192, 8, 4, 241, 63, 8, 4, 241, 62, 8, 4, 241, 69, 8, 4, + 241, 64, 8, 4, 241, 66, 8, 4, 241, 65, 8, 4, 241, 68, 8, 4, 241, 67, 8, + 4, 241, 74, 8, 4, 241, 73, 8, 4, 241, 76, 8, 4, 241, 75, 8, 4, 241, 57, + 8, 4, 241, 58, 8, 4, 241, 60, 8, 4, 241, 59, 8, 4, 241, 61, 8, 4, 241, + 70, 8, 4, 241, 72, 8, 4, 241, 71, 8, 4, 241, 56, 8, 4, 229, 20, 8, 4, + 229, 18, 8, 4, 229, 64, 8, 4, 229, 23, 8, 4, 229, 46, 8, 4, 229, 60, 8, + 4, 229, 59, 8, 4, 230, 5, 8, 4, 205, 8, 4, 230, 17, 8, 4, 228, 42, 8, 4, + 228, 44, 8, 4, 228, 43, 8, 4, 228, 162, 8, 4, 228, 149, 8, 4, 228, 185, + 8, 4, 228, 171, 8, 4, 229, 165, 8, 4, 229, 187, 8, 4, 229, 176, 8, 4, + 228, 37, 8, 4, 228, 34, 8, 4, 228, 92, 8, 4, 228, 41, 8, 4, 228, 39, 8, + 4, 228, 40, 8, 4, 241, 127, 8, 4, 241, 126, 8, 4, 241, 132, 8, 4, 241, + 128, 8, 4, 241, 129, 8, 4, 241, 131, 8, 4, 241, 130, 8, 4, 241, 137, 8, + 4, 241, 136, 8, 4, 241, 139, 8, 4, 241, 138, 8, 4, 241, 119, 8, 4, 241, + 121, 8, 4, 241, 120, 8, 4, 241, 123, 8, 4, 241, 125, 8, 4, 241, 124, 8, + 4, 241, 133, 8, 4, 241, 135, 8, 4, 241, 134, 8, 4, 241, 115, 8, 4, 241, + 114, 8, 4, 241, 122, 8, 4, 241, 118, 8, 4, 241, 116, 8, 4, 241, 117, 8, + 4, 241, 109, 8, 4, 241, 108, 8, 4, 241, 113, 8, 4, 241, 112, 8, 4, 241, + 110, 8, 4, 241, 111, 8, 4, 232, 224, 8, 4, 232, 218, 8, 4, 233, 13, 8, 4, + 232, 231, 8, 4, 233, 5, 8, 4, 233, 4, 8, 4, 233, 8, 8, 4, 233, 6, 8, 4, + 233, 102, 8, 4, 233, 93, 8, 4, 233, 157, 8, 4, 233, 111, 8, 4, 232, 137, + 8, 4, 232, 136, 8, 4, 232, 139, 8, 4, 232, 138, 8, 4, 232, 171, 8, 4, + 232, 161, 8, 4, 232, 208, 8, 4, 232, 175, 8, 4, 233, 28, 8, 4, 233, 82, + 8, 4, 233, 41, 8, 4, 232, 132, 8, 4, 232, 131, 8, 4, 232, 156, 8, 4, 232, + 135, 8, 4, 232, 133, 8, 4, 232, 134, 8, 4, 232, 114, 8, 4, 232, 113, 8, + 4, 232, 121, 8, 4, 232, 117, 8, 4, 232, 115, 8, 4, 232, 116, 8, 4, 242, + 165, 8, 4, 242, 164, 8, 4, 242, 190, 8, 4, 242, 175, 8, 4, 242, 182, 8, + 4, 242, 181, 8, 4, 242, 184, 8, 4, 242, 183, 8, 4, 243, 65, 8, 4, 243, + 60, 8, 4, 243, 110, 8, 4, 243, 75, 8, 4, 242, 72, 8, 4, 242, 71, 8, 4, + 242, 74, 8, 4, 242, 73, 8, 4, 242, 130, 8, 4, 242, 128, 8, 4, 242, 150, + 8, 4, 242, 138, 8, 4, 243, 9, 8, 4, 243, 7, 8, 4, 243, 38, 8, 4, 243, 20, + 8, 4, 242, 62, 8, 4, 242, 61, 8, 4, 242, 92, 8, 4, 242, 70, 8, 4, 242, + 63, 8, 4, 242, 69, 8, 4, 234, 70, 8, 4, 234, 69, 8, 4, 234, 101, 8, 4, + 234, 84, 8, 4, 234, 94, 8, 4, 234, 97, 8, 4, 234, 95, 8, 4, 234, 207, 8, + 4, 234, 196, 8, 4, 181, 8, 4, 234, 233, 8, 4, 233, 221, 8, 4, 233, 226, + 8, 4, 233, 223, 8, 4, 234, 9, 8, 4, 234, 5, 8, 4, 234, 37, 8, 4, 234, 16, + 8, 4, 234, 162, 8, 4, 234, 146, 8, 4, 234, 188, 8, 4, 234, 165, 8, 4, + 233, 210, 8, 4, 233, 208, 8, 4, 233, 238, 8, 4, 233, 220, 8, 4, 233, 213, + 8, 4, 233, 217, 8, 4, 242, 247, 8, 4, 242, 246, 8, 4, 242, 251, 8, 4, + 242, 248, 8, 4, 242, 250, 8, 4, 242, 249, 8, 4, 243, 2, 8, 4, 243, 1, 8, + 4, 243, 5, 8, 4, 243, 3, 8, 4, 242, 238, 8, 4, 242, 237, 8, 4, 242, 240, + 8, 4, 242, 239, 8, 4, 242, 243, 8, 4, 242, 242, 8, 4, 242, 245, 8, 4, + 242, 244, 8, 4, 242, 253, 8, 4, 242, 252, 8, 4, 243, 0, 8, 4, 242, 254, + 8, 4, 242, 233, 8, 4, 242, 232, 8, 4, 242, 241, 8, 4, 242, 236, 8, 4, + 242, 234, 8, 4, 242, 235, 8, 4, 231, 60, 8, 4, 231, 61, 8, 4, 231, 79, 8, + 4, 231, 78, 8, 4, 231, 81, 8, 4, 231, 80, 8, 4, 231, 51, 8, 4, 231, 53, + 8, 4, 231, 52, 8, 4, 231, 56, 8, 4, 231, 55, 8, 4, 231, 58, 8, 4, 231, + 57, 8, 4, 231, 62, 8, 4, 231, 64, 8, 4, 231, 63, 8, 4, 231, 47, 8, 4, + 231, 46, 8, 4, 231, 54, 8, 4, 231, 50, 8, 4, 231, 48, 8, 4, 231, 49, 8, + 4, 240, 172, 8, 4, 240, 171, 8, 4, 240, 178, 8, 4, 240, 173, 8, 4, 240, + 175, 8, 4, 240, 174, 8, 4, 240, 177, 8, 4, 240, 176, 8, 4, 240, 183, 8, + 4, 240, 182, 8, 4, 240, 185, 8, 4, 240, 184, 8, 4, 240, 164, 8, 4, 240, + 163, 8, 4, 240, 166, 8, 4, 240, 165, 8, 4, 240, 168, 8, 4, 240, 167, 8, + 4, 240, 170, 8, 4, 240, 169, 8, 4, 240, 179, 8, 4, 240, 181, 8, 4, 240, + 180, 8, 4, 229, 110, 8, 4, 229, 112, 8, 4, 229, 111, 8, 4, 229, 150, 8, + 4, 229, 149, 8, 4, 229, 159, 8, 4, 229, 153, 8, 4, 229, 73, 8, 4, 229, + 72, 8, 4, 229, 74, 8, 4, 229, 82, 8, 4, 229, 79, 8, 4, 229, 90, 8, 4, + 229, 84, 8, 4, 229, 143, 8, 4, 229, 148, 8, 4, 229, 145, 8, 4, 241, 142, + 8, 4, 241, 152, 8, 4, 241, 160, 8, 4, 241, 234, 8, 4, 241, 227, 8, 4, + 159, 8, 4, 241, 245, 8, 4, 240, 196, 8, 4, 240, 195, 8, 4, 240, 198, 8, + 4, 240, 197, 8, 4, 240, 229, 8, 4, 240, 220, 8, 4, 241, 54, 8, 4, 241, + 34, 8, 4, 241, 179, 8, 4, 241, 222, 8, 4, 241, 190, 8, 4, 214, 27, 8, 4, + 214, 12, 8, 4, 214, 49, 8, 4, 214, 35, 8, 4, 213, 173, 8, 4, 213, 175, 8, + 4, 213, 174, 8, 4, 213, 191, 8, 4, 213, 214, 8, 4, 213, 197, 8, 4, 213, + 246, 8, 4, 214, 6, 8, 4, 213, 251, 8, 4, 212, 23, 8, 4, 212, 22, 8, 4, + 212, 37, 8, 4, 212, 25, 8, 4, 212, 30, 8, 4, 212, 32, 8, 4, 212, 31, 8, + 4, 212, 95, 8, 4, 212, 92, 8, 4, 212, 109, 8, 4, 212, 98, 8, 4, 212, 1, + 8, 4, 212, 3, 8, 4, 212, 2, 8, 4, 212, 12, 8, 4, 212, 11, 8, 4, 212, 16, + 8, 4, 212, 13, 8, 4, 212, 77, 8, 4, 212, 87, 8, 4, 212, 81, 8, 4, 211, + 253, 8, 4, 211, 252, 8, 4, 212, 8, 8, 4, 212, 0, 8, 4, 211, 254, 8, 4, + 211, 255, 8, 4, 211, 244, 8, 4, 211, 243, 8, 4, 211, 249, 8, 4, 211, 247, + 8, 4, 211, 245, 8, 4, 211, 246, 8, 4, 249, 221, 8, 4, 249, 217, 8, 4, + 249, 244, 8, 4, 249, 230, 8, 4, 249, 241, 8, 4, 249, 235, 8, 4, 249, 243, + 8, 4, 249, 242, 8, 4, 250, 156, 8, 4, 250, 150, 8, 4, 250, 219, 8, 4, + 250, 183, 8, 4, 249, 45, 8, 4, 249, 47, 8, 4, 249, 46, 8, 4, 249, 92, 8, + 4, 249, 83, 8, 4, 249, 175, 8, 4, 249, 108, 8, 4, 250, 94, 8, 4, 250, + 124, 8, 4, 250, 99, 8, 4, 249, 26, 8, 4, 249, 25, 8, 4, 249, 53, 8, 4, + 249, 43, 8, 4, 249, 31, 8, 4, 249, 42, 8, 4, 249, 6, 8, 4, 249, 5, 8, 4, + 249, 16, 8, 4, 249, 12, 8, 4, 249, 7, 8, 4, 249, 9, 8, 4, 211, 227, 8, 4, + 211, 226, 8, 4, 211, 233, 8, 4, 211, 228, 8, 4, 211, 230, 8, 4, 211, 229, + 8, 4, 211, 232, 8, 4, 211, 231, 8, 4, 211, 239, 8, 4, 211, 238, 8, 4, + 211, 242, 8, 4, 211, 240, 8, 4, 211, 223, 8, 4, 211, 225, 8, 4, 211, 224, + 8, 4, 211, 234, 8, 4, 211, 237, 8, 4, 211, 235, 8, 4, 211, 218, 8, 4, + 211, 222, 8, 4, 211, 221, 8, 4, 211, 219, 8, 4, 211, 220, 8, 4, 211, 213, + 8, 4, 211, 212, 8, 4, 211, 217, 8, 4, 211, 216, 8, 4, 211, 214, 8, 4, + 211, 215, 8, 4, 227, 224, 8, 4, 227, 223, 8, 4, 227, 229, 8, 4, 227, 225, + 8, 4, 227, 226, 8, 4, 227, 228, 8, 4, 227, 227, 8, 4, 227, 234, 8, 4, + 227, 233, 8, 4, 227, 237, 8, 4, 227, 236, 8, 4, 227, 217, 8, 4, 227, 218, + 8, 4, 227, 221, 8, 4, 227, 222, 8, 4, 227, 230, 8, 4, 227, 232, 8, 4, + 227, 212, 8, 4, 227, 220, 8, 4, 227, 216, 8, 4, 227, 213, 8, 4, 227, 214, + 8, 4, 227, 207, 8, 4, 227, 206, 8, 4, 227, 211, 8, 4, 227, 210, 8, 4, + 227, 208, 8, 4, 227, 209, 8, 4, 220, 55, 8, 4, 189, 8, 4, 220, 117, 8, 4, + 220, 58, 8, 4, 220, 109, 8, 4, 220, 112, 8, 4, 220, 110, 8, 4, 222, 142, + 8, 4, 222, 132, 8, 4, 222, 202, 8, 4, 222, 150, 8, 4, 218, 228, 8, 4, + 218, 230, 8, 4, 218, 229, 8, 4, 219, 221, 8, 4, 219, 210, 8, 4, 219, 242, + 8, 4, 219, 224, 8, 4, 221, 35, 8, 4, 222, 100, 8, 4, 221, 59, 8, 4, 218, + 206, 8, 4, 218, 204, 8, 4, 219, 27, 8, 4, 218, 227, 8, 4, 218, 209, 8, 4, + 218, 217, 8, 4, 218, 113, 8, 4, 218, 112, 8, 4, 218, 177, 8, 4, 218, 119, + 8, 4, 218, 114, 8, 4, 218, 118, 8, 4, 219, 123, 8, 4, 219, 122, 8, 4, + 219, 128, 8, 4, 219, 124, 8, 4, 219, 125, 8, 4, 219, 127, 8, 4, 219, 126, + 8, 4, 219, 135, 8, 4, 219, 134, 8, 4, 219, 157, 8, 4, 219, 136, 8, 4, + 219, 119, 8, 4, 219, 118, 8, 4, 219, 121, 8, 4, 219, 120, 8, 4, 219, 130, + 8, 4, 219, 133, 8, 4, 219, 131, 8, 4, 219, 115, 8, 4, 219, 114, 8, 4, + 219, 117, 8, 4, 219, 116, 8, 4, 219, 109, 8, 4, 219, 108, 8, 4, 219, 113, + 8, 4, 219, 112, 8, 4, 219, 110, 8, 4, 219, 111, 8, 4, 212, 70, 8, 4, 212, + 69, 8, 4, 212, 75, 8, 4, 212, 72, 8, 4, 212, 52, 8, 4, 212, 54, 8, 4, + 212, 53, 8, 4, 212, 57, 8, 4, 212, 56, 8, 4, 212, 60, 8, 4, 212, 58, 8, + 4, 212, 64, 8, 4, 212, 63, 8, 4, 212, 67, 8, 4, 212, 65, 8, 4, 212, 48, + 8, 4, 212, 47, 8, 4, 212, 55, 8, 4, 212, 51, 8, 4, 212, 49, 8, 4, 212, + 50, 8, 4, 212, 40, 8, 4, 212, 39, 8, 4, 212, 44, 8, 4, 212, 43, 8, 4, + 212, 41, 8, 4, 212, 42, 8, 4, 250, 72, 8, 4, 250, 69, 8, 4, 250, 92, 8, + 4, 250, 80, 8, 4, 250, 2, 8, 4, 250, 1, 8, 4, 250, 4, 8, 4, 250, 3, 8, 4, + 250, 16, 8, 4, 250, 15, 8, 4, 250, 23, 8, 4, 250, 18, 8, 4, 250, 52, 8, + 4, 250, 50, 8, 4, 250, 67, 8, 4, 250, 58, 8, 4, 249, 252, 8, 4, 250, 6, + 8, 4, 250, 0, 8, 4, 249, 253, 8, 4, 249, 255, 8, 4, 249, 246, 8, 4, 249, + 245, 8, 4, 249, 250, 8, 4, 249, 249, 8, 4, 249, 247, 8, 4, 249, 248, 8, + 4, 223, 80, 8, 4, 223, 81, 8, 4, 223, 67, 8, 4, 223, 68, 8, 4, 223, 71, + 8, 4, 223, 70, 8, 4, 223, 73, 8, 4, 223, 72, 8, 4, 223, 75, 8, 4, 223, + 74, 8, 4, 223, 79, 8, 4, 223, 76, 8, 4, 223, 63, 8, 4, 223, 62, 8, 4, + 223, 69, 8, 4, 223, 66, 8, 4, 223, 64, 8, 4, 223, 65, 8, 4, 223, 57, 8, + 4, 223, 56, 8, 4, 223, 61, 8, 4, 223, 60, 8, 4, 223, 58, 8, 4, 223, 59, + 8, 4, 228, 145, 8, 4, 228, 144, 8, 4, 228, 147, 8, 4, 228, 146, 8, 4, + 228, 137, 8, 4, 228, 139, 8, 4, 228, 138, 8, 4, 228, 141, 8, 4, 228, 140, + 8, 4, 228, 143, 8, 4, 228, 142, 8, 4, 228, 132, 8, 4, 228, 131, 8, 4, + 228, 136, 8, 4, 228, 135, 8, 4, 228, 133, 8, 4, 228, 134, 8, 4, 228, 126, + 8, 4, 228, 125, 8, 4, 228, 130, 8, 4, 228, 129, 8, 4, 228, 127, 8, 4, + 228, 128, 8, 4, 220, 251, 8, 4, 220, 247, 8, 4, 221, 24, 8, 4, 221, 6, 8, + 4, 220, 140, 8, 4, 220, 142, 8, 4, 220, 141, 8, 4, 220, 160, 8, 4, 220, + 157, 8, 4, 220, 187, 8, 4, 220, 178, 8, 4, 220, 222, 8, 4, 220, 215, 8, + 4, 220, 243, 8, 4, 220, 230, 8, 4, 220, 136, 8, 4, 220, 135, 8, 4, 220, + 150, 8, 4, 220, 139, 8, 4, 220, 137, 8, 4, 220, 138, 8, 4, 220, 120, 8, + 4, 220, 119, 8, 4, 220, 126, 8, 4, 220, 123, 8, 4, 220, 121, 8, 4, 220, + 122, 8, 4, 224, 33, 8, 4, 224, 28, 8, 4, 203, 8, 4, 224, 39, 8, 4, 223, + 31, 8, 4, 223, 33, 8, 4, 223, 32, 8, 4, 223, 90, 8, 4, 223, 83, 8, 4, + 223, 112, 8, 4, 223, 94, 8, 4, 223, 196, 8, 4, 224, 21, 8, 4, 223, 231, + 8, 4, 223, 24, 8, 4, 223, 22, 8, 4, 223, 51, 8, 4, 223, 30, 8, 4, 223, + 26, 8, 4, 223, 27, 8, 4, 223, 7, 8, 4, 223, 6, 8, 4, 223, 12, 8, 4, 223, + 10, 8, 4, 223, 8, 8, 4, 223, 9, 8, 4, 235, 101, 8, 4, 235, 100, 8, 4, + 235, 110, 8, 4, 235, 102, 8, 4, 235, 106, 8, 4, 235, 105, 8, 4, 235, 108, + 8, 4, 235, 107, 8, 4, 235, 44, 8, 4, 235, 43, 8, 4, 235, 46, 8, 4, 235, + 45, 8, 4, 235, 59, 8, 4, 235, 57, 8, 4, 235, 71, 8, 4, 235, 61, 8, 4, + 235, 38, 8, 4, 235, 36, 8, 4, 235, 54, 8, 4, 235, 42, 8, 4, 235, 39, 8, + 4, 235, 40, 8, 4, 235, 30, 8, 4, 235, 29, 8, 4, 235, 34, 8, 4, 235, 33, + 8, 4, 235, 31, 8, 4, 235, 32, 8, 4, 224, 191, 8, 4, 224, 189, 8, 4, 224, + 198, 8, 4, 224, 192, 8, 4, 224, 195, 8, 4, 224, 194, 8, 4, 224, 197, 8, + 4, 224, 196, 8, 4, 224, 144, 8, 4, 224, 141, 8, 4, 224, 146, 8, 4, 224, + 145, 8, 4, 224, 178, 8, 4, 224, 177, 8, 4, 224, 187, 8, 4, 224, 181, 8, + 4, 224, 136, 8, 4, 224, 132, 8, 4, 224, 175, 8, 4, 224, 140, 8, 4, 224, + 138, 8, 4, 224, 139, 8, 4, 224, 116, 8, 4, 224, 114, 8, 4, 224, 126, 8, + 4, 224, 119, 8, 4, 224, 117, 8, 4, 224, 118, 8, 4, 235, 90, 8, 4, 235, + 89, 8, 4, 235, 96, 8, 4, 235, 91, 8, 4, 235, 93, 8, 4, 235, 92, 8, 4, + 235, 95, 8, 4, 235, 94, 8, 4, 235, 81, 8, 4, 235, 83, 8, 4, 235, 82, 8, + 4, 235, 86, 8, 4, 235, 85, 8, 4, 235, 88, 8, 4, 235, 87, 8, 4, 235, 77, + 8, 4, 235, 76, 8, 4, 235, 84, 8, 4, 235, 80, 8, 4, 235, 78, 8, 4, 235, + 79, 8, 4, 235, 73, 8, 4, 235, 72, 8, 4, 235, 75, 8, 4, 235, 74, 8, 4, + 228, 249, 8, 4, 228, 248, 8, 4, 229, 0, 8, 4, 228, 250, 8, 4, 228, 252, + 8, 4, 228, 251, 8, 4, 228, 255, 8, 4, 228, 253, 8, 4, 228, 238, 8, 4, + 228, 239, 8, 4, 228, 244, 8, 4, 228, 243, 8, 4, 228, 247, 8, 4, 228, 245, + 8, 4, 228, 233, 8, 4, 228, 242, 8, 4, 228, 237, 8, 4, 228, 234, 8, 4, + 228, 235, 8, 4, 228, 228, 8, 4, 228, 227, 8, 4, 228, 232, 8, 4, 228, 231, + 8, 4, 228, 229, 8, 4, 228, 230, 8, 4, 228, 0, 8, 4, 227, 255, 8, 4, 228, + 10, 8, 4, 228, 4, 8, 4, 228, 7, 8, 4, 228, 6, 8, 4, 228, 9, 8, 4, 228, 8, + 8, 4, 227, 243, 8, 4, 227, 245, 8, 4, 227, 244, 8, 4, 227, 249, 8, 4, + 227, 248, 8, 4, 227, 253, 8, 4, 227, 250, 8, 4, 227, 241, 8, 4, 227, 240, + 8, 4, 227, 247, 8, 4, 227, 242, 8, 4, 213, 138, 8, 4, 213, 137, 8, 4, + 213, 145, 8, 4, 213, 140, 8, 4, 213, 142, 8, 4, 213, 141, 8, 4, 213, 144, + 8, 4, 213, 143, 8, 4, 213, 127, 8, 4, 213, 128, 8, 4, 213, 132, 8, 4, + 213, 131, 8, 4, 213, 136, 8, 4, 213, 134, 8, 4, 213, 109, 8, 4, 213, 107, + 8, 4, 213, 119, 8, 4, 213, 112, 8, 4, 213, 110, 8, 4, 213, 111, 8, 4, + 212, 241, 8, 4, 212, 239, 8, 4, 212, 255, 8, 4, 212, 242, 8, 4, 212, 249, + 8, 4, 212, 248, 8, 4, 212, 252, 8, 4, 212, 250, 8, 4, 212, 182, 8, 4, + 212, 181, 8, 4, 212, 185, 8, 4, 212, 183, 8, 4, 212, 215, 8, 4, 212, 212, + 8, 4, 212, 235, 8, 4, 212, 219, 8, 4, 212, 173, 8, 4, 212, 170, 8, 4, + 212, 203, 8, 4, 212, 180, 8, 4, 212, 176, 8, 4, 212, 177, 8, 4, 212, 155, + 8, 4, 212, 154, 8, 4, 212, 161, 8, 4, 212, 158, 8, 4, 212, 156, 8, 4, + 212, 157, 8, 34, 224, 178, 8, 34, 233, 13, 8, 34, 234, 70, 8, 34, 228, 4, + 8, 34, 249, 12, 8, 34, 219, 128, 8, 34, 242, 244, 8, 34, 243, 20, 8, 34, + 231, 42, 8, 34, 240, 172, 8, 34, 232, 116, 8, 34, 252, 3, 8, 34, 230, + 196, 8, 34, 212, 235, 8, 34, 225, 8, 8, 34, 240, 166, 8, 34, 217, 253, 8, + 34, 243, 110, 8, 34, 212, 0, 8, 34, 249, 6, 8, 34, 248, 46, 8, 34, 251, + 27, 8, 34, 242, 240, 8, 34, 227, 250, 8, 34, 216, 82, 8, 34, 227, 41, 8, + 34, 235, 77, 8, 34, 212, 12, 8, 34, 224, 244, 8, 34, 241, 94, 8, 34, 212, + 241, 8, 34, 214, 95, 8, 34, 220, 126, 8, 34, 214, 221, 8, 34, 212, 109, + 8, 34, 235, 71, 8, 34, 227, 216, 8, 34, 235, 75, 8, 34, 242, 130, 8, 34, + 235, 95, 8, 34, 213, 214, 8, 34, 246, 33, 8, 34, 220, 138, 8, 34, 233, 8, + 8, 34, 249, 16, 8, 34, 249, 46, 8, 34, 249, 230, 8, 34, 240, 169, 8, 34, + 220, 251, 8, 34, 211, 255, 8, 34, 220, 178, 8, 34, 250, 67, 8, 34, 211, + 230, 8, 34, 229, 252, 8, 34, 234, 188, 232, 225, 1, 252, 107, 232, 225, + 1, 193, 232, 225, 1, 226, 23, 232, 225, 1, 248, 164, 232, 225, 1, 218, + 52, 232, 225, 1, 217, 161, 232, 225, 1, 243, 110, 232, 225, 1, 181, 232, + 225, 1, 234, 138, 232, 225, 1, 235, 139, 232, 225, 1, 250, 219, 232, 225, + 1, 250, 92, 232, 225, 1, 245, 249, 232, 225, 1, 216, 141, 232, 225, 1, + 216, 133, 232, 225, 1, 188, 232, 225, 1, 205, 232, 225, 1, 233, 157, 232, + 225, 1, 222, 202, 232, 225, 1, 212, 75, 232, 225, 1, 212, 109, 232, 225, + 1, 229, 159, 232, 225, 1, 159, 232, 225, 1, 213, 153, 232, 225, 1, 241, + 174, 232, 225, 1, 244, 164, 232, 225, 1, 214, 49, 232, 225, 1, 221, 24, + 232, 225, 1, 186, 232, 225, 1, 242, 225, 232, 225, 1, 61, 232, 225, 1, + 254, 148, 232, 225, 1, 74, 232, 225, 1, 245, 22, 232, 225, 1, 72, 232, + 225, 1, 75, 232, 225, 1, 69, 232, 225, 1, 215, 183, 232, 225, 1, 215, + 178, 232, 225, 1, 227, 99, 232, 225, 1, 160, 230, 104, 217, 71, 232, 225, + 1, 160, 230, 46, 225, 150, 232, 225, 1, 160, 230, 104, 249, 15, 232, 225, + 1, 160, 230, 104, 251, 128, 232, 225, 1, 160, 230, 104, 205, 232, 225, 1, + 160, 230, 104, 235, 116, 232, 225, 225, 27, 249, 157, 232, 225, 225, 27, + 243, 200, 219, 69, 39, 4, 245, 165, 39, 4, 245, 162, 39, 4, 241, 204, 39, + 4, 214, 1, 39, 4, 214, 0, 39, 4, 226, 86, 39, 4, 251, 191, 39, 4, 251, + 242, 39, 4, 231, 179, 39, 4, 234, 0, 39, 4, 231, 73, 39, 4, 243, 51, 39, + 4, 244, 116, 39, 4, 214, 227, 39, 4, 217, 219, 39, 4, 217, 147, 39, 4, + 247, 224, 39, 4, 247, 221, 39, 4, 233, 74, 39, 4, 224, 1, 39, 4, 248, 28, + 39, 4, 229, 219, 39, 4, 222, 89, 39, 4, 220, 241, 39, 4, 212, 85, 39, 4, + 212, 66, 39, 4, 250, 116, 39, 4, 235, 125, 39, 4, 229, 7, 39, 4, 213, 35, + 39, 4, 234, 187, 39, 4, 229, 136, 39, 4, 243, 31, 39, 4, 231, 145, 39, 4, + 229, 184, 39, 4, 228, 16, 39, 4, 72, 39, 4, 235, 251, 39, 4, 241, 165, + 39, 4, 241, 146, 39, 4, 213, 235, 39, 4, 213, 226, 39, 4, 225, 240, 39, + 4, 251, 189, 39, 4, 251, 184, 39, 4, 231, 172, 39, 4, 233, 253, 39, 4, + 231, 70, 39, 4, 243, 47, 39, 4, 244, 90, 39, 4, 214, 154, 39, 4, 217, 71, + 39, 4, 217, 128, 39, 4, 247, 216, 39, 4, 247, 220, 39, 4, 233, 13, 39, 4, + 223, 188, 39, 4, 247, 211, 39, 4, 229, 213, 39, 4, 220, 117, 39, 4, 220, + 212, 39, 4, 212, 37, 39, 4, 212, 62, 39, 4, 249, 244, 39, 4, 235, 110, + 39, 4, 229, 0, 39, 4, 212, 255, 39, 4, 234, 101, 39, 4, 229, 128, 39, 4, + 242, 190, 39, 4, 231, 42, 39, 4, 229, 64, 39, 4, 228, 10, 39, 4, 61, 39, + 4, 254, 32, 39, 4, 229, 155, 39, 4, 159, 39, 4, 242, 1, 39, 4, 214, 49, + 39, 4, 214, 39, 39, 4, 193, 39, 4, 251, 195, 39, 4, 252, 107, 39, 4, 231, + 187, 39, 4, 234, 4, 39, 4, 234, 3, 39, 4, 231, 77, 39, 4, 243, 55, 39, 4, + 244, 164, 39, 4, 215, 1, 39, 4, 218, 52, 39, 4, 217, 161, 39, 4, 247, + 232, 39, 4, 247, 223, 39, 4, 233, 157, 39, 4, 203, 39, 4, 248, 164, 39, + 4, 229, 228, 39, 4, 222, 202, 39, 4, 221, 24, 39, 4, 212, 109, 39, 4, + 212, 75, 39, 4, 250, 219, 39, 4, 235, 139, 39, 4, 229, 16, 39, 4, 186, + 39, 4, 181, 39, 4, 234, 239, 39, 4, 229, 141, 39, 4, 243, 110, 39, 4, + 188, 39, 4, 205, 39, 4, 228, 23, 39, 4, 227, 49, 39, 4, 227, 45, 39, 4, + 241, 39, 39, 4, 213, 202, 39, 4, 213, 198, 39, 4, 225, 129, 39, 4, 251, + 187, 39, 4, 251, 118, 39, 4, 231, 167, 39, 4, 233, 251, 39, 4, 231, 66, + 39, 4, 243, 43, 39, 4, 244, 3, 39, 4, 214, 108, 39, 4, 216, 230, 39, 4, + 217, 106, 39, 4, 247, 214, 39, 4, 247, 218, 39, 4, 232, 180, 39, 4, 223, + 99, 39, 4, 247, 79, 39, 4, 229, 200, 39, 4, 219, 226, 39, 4, 220, 181, + 39, 4, 212, 14, 39, 4, 212, 59, 39, 4, 249, 113, 39, 4, 235, 62, 39, 4, + 228, 246, 39, 4, 212, 220, 39, 4, 234, 19, 39, 4, 229, 126, 39, 4, 242, + 140, 39, 4, 230, 202, 39, 4, 228, 175, 39, 4, 227, 251, 39, 4, 69, 39, 4, + 215, 160, 39, 4, 240, 212, 39, 4, 240, 202, 39, 4, 213, 183, 39, 4, 213, + 177, 39, 4, 225, 35, 39, 4, 251, 186, 39, 4, 251, 54, 39, 4, 231, 166, + 39, 4, 233, 249, 39, 4, 231, 65, 39, 4, 243, 42, 39, 4, 243, 205, 39, 4, + 214, 99, 39, 4, 216, 82, 39, 4, 217, 90, 39, 4, 247, 212, 39, 4, 247, + 217, 39, 4, 232, 156, 39, 4, 223, 51, 39, 4, 246, 33, 39, 4, 229, 195, + 39, 4, 219, 27, 39, 4, 220, 150, 39, 4, 212, 8, 39, 4, 212, 55, 39, 4, + 249, 53, 39, 4, 235, 54, 39, 4, 228, 242, 39, 4, 212, 203, 39, 4, 233, + 238, 39, 4, 229, 125, 39, 4, 242, 92, 39, 4, 230, 172, 39, 4, 228, 92, + 39, 4, 227, 247, 39, 4, 75, 39, 4, 227, 62, 39, 4, 229, 86, 39, 4, 241, + 54, 39, 4, 241, 42, 39, 4, 213, 214, 39, 4, 213, 203, 39, 4, 225, 150, + 39, 4, 251, 188, 39, 4, 251, 128, 39, 4, 231, 168, 39, 4, 233, 252, 39, + 4, 231, 68, 39, 4, 243, 45, 39, 4, 243, 44, 39, 4, 244, 12, 39, 4, 214, + 119, 39, 4, 108, 39, 4, 217, 109, 39, 4, 247, 215, 39, 4, 247, 219, 39, + 4, 232, 208, 39, 4, 223, 112, 39, 4, 247, 99, 39, 4, 229, 204, 39, 4, + 219, 242, 39, 4, 220, 187, 39, 4, 212, 16, 39, 4, 212, 60, 39, 4, 249, + 175, 39, 4, 235, 71, 39, 4, 228, 247, 39, 4, 212, 235, 39, 4, 234, 37, + 39, 4, 229, 127, 39, 4, 242, 150, 39, 4, 230, 231, 39, 4, 228, 185, 39, + 4, 227, 253, 39, 4, 74, 39, 4, 245, 108, 39, 4, 229, 146, 39, 4, 241, + 222, 39, 4, 241, 193, 39, 4, 214, 6, 39, 4, 213, 253, 39, 4, 226, 96, 39, + 4, 251, 192, 39, 4, 251, 251, 39, 4, 231, 180, 39, 4, 234, 1, 39, 4, 233, + 255, 39, 4, 231, 74, 39, 4, 243, 52, 39, 4, 243, 50, 39, 4, 244, 123, 39, + 4, 214, 232, 39, 4, 217, 229, 39, 4, 217, 148, 39, 4, 247, 225, 39, 4, + 247, 222, 39, 4, 233, 82, 39, 4, 224, 21, 39, 4, 248, 41, 39, 4, 229, + 220, 39, 4, 222, 100, 39, 4, 220, 243, 39, 4, 212, 87, 39, 4, 212, 67, + 39, 4, 250, 124, 39, 4, 235, 127, 39, 4, 229, 9, 39, 4, 213, 38, 39, 4, + 234, 188, 39, 4, 229, 137, 39, 4, 229, 133, 39, 4, 243, 38, 39, 4, 243, + 27, 39, 4, 231, 156, 39, 4, 229, 187, 39, 4, 228, 17, 39, 4, 229, 161, + 39, 4, 233, 46, 39, 249, 157, 39, 243, 200, 219, 69, 39, 224, 158, 77, + 39, 4, 229, 203, 244, 164, 39, 4, 229, 203, 181, 39, 4, 229, 203, 219, + 226, 39, 16, 244, 113, 39, 16, 234, 186, 39, 16, 217, 34, 39, 16, 229, + 39, 39, 16, 252, 66, 39, 16, 244, 163, 39, 16, 218, 49, 39, 16, 248, 121, + 39, 16, 247, 78, 39, 16, 233, 227, 39, 16, 216, 234, 39, 16, 247, 98, 39, + 16, 235, 63, 39, 21, 212, 79, 39, 21, 116, 39, 21, 109, 39, 21, 166, 39, + 21, 163, 39, 21, 180, 39, 21, 189, 39, 21, 198, 39, 21, 195, 39, 21, 200, + 39, 4, 229, 203, 188, 39, 4, 229, 203, 247, 99, 33, 6, 1, 212, 83, 33, 3, + 1, 212, 83, 33, 6, 1, 245, 245, 33, 3, 1, 245, 245, 33, 6, 1, 223, 202, + 245, 247, 33, 3, 1, 223, 202, 245, 247, 33, 6, 1, 235, 183, 33, 3, 1, + 235, 183, 33, 6, 1, 247, 113, 33, 3, 1, 247, 113, 33, 6, 1, 230, 210, + 215, 175, 33, 3, 1, 230, 210, 215, 175, 33, 6, 1, 251, 64, 227, 67, 33, + 3, 1, 251, 64, 227, 67, 33, 6, 1, 229, 169, 213, 22, 33, 3, 1, 229, 169, + 213, 22, 33, 6, 1, 213, 19, 2, 252, 102, 213, 22, 33, 3, 1, 213, 19, 2, + 252, 102, 213, 22, 33, 6, 1, 235, 181, 213, 49, 33, 3, 1, 235, 181, 213, + 49, 33, 6, 1, 223, 202, 212, 203, 33, 3, 1, 223, 202, 212, 203, 33, 6, 1, + 235, 181, 61, 33, 3, 1, 235, 181, 61, 33, 6, 1, 249, 193, 232, 221, 212, + 174, 33, 3, 1, 249, 193, 232, 221, 212, 174, 33, 6, 1, 251, 137, 212, + 174, 33, 3, 1, 251, 137, 212, 174, 33, 6, 1, 235, 181, 249, 193, 232, + 221, 212, 174, 33, 3, 1, 235, 181, 249, 193, 232, 221, 212, 174, 33, 6, + 1, 212, 237, 33, 3, 1, 212, 237, 33, 6, 1, 223, 202, 216, 136, 33, 3, 1, + 223, 202, 216, 136, 33, 6, 1, 219, 236, 248, 41, 33, 3, 1, 219, 236, 248, + 41, 33, 6, 1, 219, 236, 245, 131, 33, 3, 1, 219, 236, 245, 131, 33, 6, 1, + 219, 236, 245, 117, 33, 3, 1, 219, 236, 245, 117, 33, 6, 1, 230, 214, 75, + 33, 3, 1, 230, 214, 75, 33, 6, 1, 251, 163, 75, 33, 3, 1, 251, 163, 75, + 33, 6, 1, 51, 230, 214, 75, 33, 3, 1, 51, 230, 214, 75, 33, 1, 230, 156, + 75, 37, 33, 214, 84, 37, 33, 217, 201, 231, 4, 52, 37, 33, 240, 201, 231, + 4, 52, 37, 33, 217, 101, 231, 4, 52, 220, 21, 253, 132, 37, 33, 234, 198, + 37, 33, 226, 101, 33, 234, 198, 33, 226, 101, 33, 6, 1, 246, 1, 33, 3, 1, + 246, 1, 33, 6, 1, 245, 238, 33, 3, 1, 245, 238, 33, 6, 1, 212, 45, 33, 3, + 1, 212, 45, 33, 6, 1, 250, 140, 33, 3, 1, 250, 140, 33, 6, 1, 245, 237, + 33, 3, 1, 245, 237, 33, 6, 1, 217, 230, 2, 231, 37, 101, 33, 3, 1, 217, + 230, 2, 231, 37, 101, 33, 6, 1, 216, 43, 33, 3, 1, 216, 43, 33, 6, 1, + 216, 119, 33, 3, 1, 216, 119, 33, 6, 1, 216, 123, 33, 3, 1, 216, 123, 33, + 6, 1, 217, 235, 33, 3, 1, 217, 235, 33, 6, 1, 240, 190, 33, 3, 1, 240, + 190, 33, 6, 1, 220, 132, 33, 3, 1, 220, 132, 20, 1, 61, 20, 1, 181, 20, + 1, 69, 20, 1, 233, 238, 20, 1, 245, 165, 20, 1, 224, 1, 20, 1, 218, 35, + 20, 1, 75, 20, 1, 228, 10, 20, 1, 72, 20, 1, 233, 157, 20, 1, 193, 20, 1, + 223, 136, 20, 1, 223, 182, 20, 1, 233, 73, 20, 1, 231, 144, 20, 1, 218, + 49, 20, 1, 229, 226, 20, 1, 229, 14, 20, 1, 183, 20, 1, 218, 205, 20, 1, + 230, 172, 20, 1, 220, 207, 20, 1, 220, 117, 20, 1, 220, 217, 20, 1, 221, + 44, 20, 1, 233, 177, 20, 1, 234, 162, 20, 1, 228, 64, 20, 1, 228, 92, 20, + 1, 228, 241, 20, 1, 212, 217, 20, 1, 220, 150, 20, 1, 212, 178, 20, 1, + 186, 20, 1, 228, 120, 20, 1, 234, 148, 20, 1, 226, 27, 20, 1, 229, 7, 20, + 1, 228, 101, 20, 1, 225, 30, 20, 1, 213, 180, 20, 1, 226, 86, 20, 1, 244, + 116, 20, 1, 223, 51, 20, 1, 232, 156, 20, 1, 231, 42, 20, 1, 229, 64, 20, + 1, 223, 204, 20, 1, 224, 61, 20, 1, 234, 171, 20, 1, 229, 93, 20, 1, 229, + 141, 20, 1, 229, 159, 20, 1, 220, 187, 20, 1, 225, 33, 20, 1, 243, 205, + 20, 1, 244, 6, 20, 1, 214, 49, 20, 1, 205, 20, 1, 233, 13, 20, 1, 225, + 240, 20, 1, 232, 174, 20, 1, 234, 37, 20, 1, 231, 177, 20, 1, 223, 233, + 20, 1, 231, 122, 20, 1, 188, 20, 1, 217, 71, 20, 1, 234, 101, 20, 1, 230, + 231, 20, 1, 231, 185, 20, 1, 217, 183, 20, 1, 234, 4, 20, 1, 217, 200, + 20, 1, 228, 93, 20, 1, 222, 166, 20, 1, 244, 160, 20, 1, 234, 6, 20, 1, + 234, 33, 20, 37, 152, 234, 14, 20, 37, 152, 216, 74, 20, 229, 13, 20, + 243, 200, 219, 69, 20, 249, 164, 20, 249, 157, 20, 221, 70, 20, 224, 158, + 77, 59, 1, 250, 33, 160, 212, 245, 225, 193, 59, 1, 250, 33, 160, 213, + 59, 225, 193, 59, 1, 250, 33, 160, 212, 245, 221, 7, 59, 1, 250, 33, 160, + 213, 59, 221, 7, 59, 1, 250, 33, 160, 212, 245, 224, 175, 59, 1, 250, 33, + 160, 213, 59, 224, 175, 59, 1, 250, 33, 160, 212, 245, 223, 51, 59, 1, + 250, 33, 160, 213, 59, 223, 51, 59, 1, 244, 244, 246, 72, 160, 134, 59, + 1, 124, 246, 72, 160, 134, 59, 1, 231, 38, 246, 72, 160, 134, 59, 1, 115, + 246, 72, 160, 134, 59, 1, 244, 243, 246, 72, 160, 134, 59, 1, 244, 244, + 246, 72, 233, 63, 160, 134, 59, 1, 124, 246, 72, 233, 63, 160, 134, 59, + 1, 231, 38, 246, 72, 233, 63, 160, 134, 59, 1, 115, 246, 72, 233, 63, + 160, 134, 59, 1, 244, 243, 246, 72, 233, 63, 160, 134, 59, 1, 244, 244, + 233, 63, 160, 134, 59, 1, 124, 233, 63, 160, 134, 59, 1, 231, 38, 233, + 63, 160, 134, 59, 1, 115, 233, 63, 160, 134, 59, 1, 244, 243, 233, 63, + 160, 134, 59, 1, 62, 71, 134, 59, 1, 62, 220, 23, 59, 1, 62, 199, 134, + 59, 1, 232, 163, 46, 249, 100, 254, 18, 59, 1, 224, 48, 114, 68, 59, 1, + 224, 48, 119, 68, 59, 1, 224, 48, 244, 254, 77, 59, 1, 224, 48, 235, 191, + 244, 254, 77, 59, 1, 115, 235, 191, 244, 254, 77, 59, 1, 219, 51, 24, + 124, 216, 241, 59, 1, 219, 51, 24, 115, 216, 241, 7, 6, 1, 245, 156, 254, + 78, 7, 3, 1, 245, 156, 254, 78, 7, 6, 1, 245, 156, 254, 103, 7, 3, 1, + 245, 156, 254, 103, 7, 6, 1, 241, 191, 7, 3, 1, 241, 191, 7, 6, 1, 216, + 6, 7, 3, 1, 216, 6, 7, 6, 1, 216, 187, 7, 3, 1, 216, 187, 7, 6, 1, 249, + 51, 7, 3, 1, 249, 51, 7, 6, 1, 249, 52, 2, 249, 157, 7, 3, 1, 249, 52, 2, + 249, 157, 7, 1, 3, 6, 244, 230, 7, 1, 3, 6, 197, 7, 6, 1, 254, 232, 7, 3, + 1, 254, 232, 7, 6, 1, 253, 240, 7, 3, 1, 253, 240, 7, 6, 1, 253, 108, 7, + 3, 1, 253, 108, 7, 6, 1, 253, 92, 7, 3, 1, 253, 92, 7, 6, 1, 253, 93, 2, + 199, 134, 7, 3, 1, 253, 93, 2, 199, 134, 7, 6, 1, 253, 83, 7, 3, 1, 253, + 83, 7, 6, 1, 223, 202, 250, 253, 2, 247, 74, 7, 3, 1, 223, 202, 250, 253, + 2, 247, 74, 7, 6, 1, 235, 28, 2, 90, 7, 3, 1, 235, 28, 2, 90, 7, 6, 1, + 235, 28, 2, 247, 207, 90, 7, 3, 1, 235, 28, 2, 247, 207, 90, 7, 6, 1, + 235, 28, 2, 219, 45, 24, 247, 207, 90, 7, 3, 1, 235, 28, 2, 219, 45, 24, + 247, 207, 90, 7, 6, 1, 251, 63, 150, 7, 3, 1, 251, 63, 150, 7, 6, 1, 233, + 171, 2, 124, 90, 7, 3, 1, 233, 171, 2, 124, 90, 7, 6, 1, 157, 2, 184, + 219, 45, 226, 244, 7, 3, 1, 157, 2, 184, 219, 45, 226, 244, 7, 6, 1, 157, + 2, 232, 177, 7, 3, 1, 157, 2, 232, 177, 7, 6, 1, 227, 49, 7, 3, 1, 227, + 49, 7, 6, 1, 226, 230, 2, 219, 45, 217, 93, 247, 246, 7, 3, 1, 226, 230, + 2, 219, 45, 217, 93, 247, 246, 7, 6, 1, 226, 230, 2, 244, 22, 7, 3, 1, + 226, 230, 2, 244, 22, 7, 6, 1, 226, 230, 2, 219, 161, 218, 27, 7, 3, 1, + 226, 230, 2, 219, 161, 218, 27, 7, 6, 1, 224, 241, 2, 219, 45, 217, 93, + 247, 246, 7, 3, 1, 224, 241, 2, 219, 45, 217, 93, 247, 246, 7, 6, 1, 224, + 241, 2, 247, 207, 90, 7, 3, 1, 224, 241, 2, 247, 207, 90, 7, 6, 1, 224, + 113, 223, 88, 7, 3, 1, 224, 113, 223, 88, 7, 6, 1, 223, 41, 223, 88, 7, + 3, 1, 223, 41, 223, 88, 7, 6, 1, 215, 80, 2, 247, 207, 90, 7, 3, 1, 215, + 80, 2, 247, 207, 90, 7, 6, 1, 214, 90, 7, 3, 1, 214, 90, 7, 6, 1, 214, + 126, 212, 152, 7, 3, 1, 214, 126, 212, 152, 7, 6, 1, 217, 105, 2, 90, 7, + 3, 1, 217, 105, 2, 90, 7, 6, 1, 217, 105, 2, 219, 45, 217, 93, 247, 246, + 7, 3, 1, 217, 105, 2, 219, 45, 217, 93, 247, 246, 7, 6, 1, 214, 222, 7, + 3, 1, 214, 222, 7, 6, 1, 245, 30, 7, 3, 1, 245, 30, 7, 6, 1, 235, 169, 7, + 3, 1, 235, 169, 7, 6, 1, 249, 146, 7, 3, 1, 249, 146, 59, 1, 215, 104, 7, + 3, 1, 246, 24, 7, 3, 1, 232, 142, 7, 3, 1, 230, 150, 7, 3, 1, 228, 57, 7, + 3, 1, 223, 40, 7, 1, 3, 6, 223, 40, 7, 3, 1, 216, 72, 7, 3, 1, 215, 167, + 7, 6, 1, 235, 210, 249, 3, 7, 3, 1, 235, 210, 249, 3, 7, 6, 1, 235, 210, + 244, 230, 7, 3, 1, 235, 210, 244, 230, 7, 6, 1, 235, 210, 243, 177, 7, 6, + 1, 216, 58, 235, 210, 243, 177, 7, 3, 1, 216, 58, 235, 210, 243, 177, 7, + 6, 1, 216, 58, 150, 7, 3, 1, 216, 58, 150, 7, 6, 1, 235, 210, 149, 7, 3, + 1, 235, 210, 149, 7, 6, 1, 235, 210, 197, 7, 3, 1, 235, 210, 197, 7, 6, + 1, 235, 210, 218, 99, 7, 3, 1, 235, 210, 218, 99, 59, 1, 115, 249, 224, + 254, 174, 59, 1, 249, 164, 59, 1, 220, 175, 245, 61, 52, 7, 6, 1, 222, + 170, 7, 3, 1, 222, 170, 7, 6, 1, 216, 58, 242, 41, 7, 3, 1, 233, 171, 2, + 223, 207, 241, 38, 24, 251, 218, 7, 6, 1, 230, 98, 2, 247, 246, 7, 3, 1, + 230, 98, 2, 247, 246, 7, 6, 1, 243, 178, 2, 227, 112, 90, 7, 3, 1, 243, + 178, 2, 227, 112, 90, 7, 6, 1, 235, 28, 2, 227, 112, 90, 7, 3, 1, 235, + 28, 2, 227, 112, 90, 7, 6, 1, 230, 98, 2, 227, 112, 90, 7, 3, 1, 230, 98, + 2, 227, 112, 90, 7, 6, 1, 224, 113, 2, 227, 112, 90, 7, 3, 1, 224, 113, + 2, 227, 112, 90, 7, 6, 1, 223, 4, 2, 227, 112, 90, 7, 3, 1, 223, 4, 2, + 227, 112, 90, 7, 1, 3, 6, 216, 58, 183, 7, 245, 66, 1, 223, 202, 244, + 230, 7, 245, 66, 1, 223, 202, 226, 229, 7, 245, 66, 1, 235, 191, 183, 7, + 245, 66, 1, 240, 146, 232, 182, 7, 245, 66, 1, 253, 193, 183, 218, 175, + 230, 32, 1, 61, 218, 175, 230, 32, 1, 72, 218, 175, 230, 32, 5, 246, 3, + 218, 175, 230, 32, 1, 69, 218, 175, 230, 32, 1, 74, 218, 175, 230, 32, 1, + 75, 218, 175, 230, 32, 5, 241, 236, 218, 175, 230, 32, 1, 234, 37, 218, + 175, 230, 32, 1, 234, 113, 218, 175, 230, 32, 1, 242, 150, 218, 175, 230, + 32, 1, 242, 200, 218, 175, 230, 32, 5, 253, 242, 218, 175, 230, 32, 1, + 249, 175, 218, 175, 230, 32, 1, 250, 23, 218, 175, 230, 32, 1, 235, 71, + 218, 175, 230, 32, 1, 235, 111, 218, 175, 230, 32, 1, 216, 95, 218, 175, + 230, 32, 1, 216, 100, 218, 175, 230, 32, 1, 248, 56, 218, 175, 230, 32, + 1, 248, 65, 218, 175, 230, 32, 1, 108, 218, 175, 230, 32, 1, 217, 109, + 218, 175, 230, 32, 1, 247, 99, 218, 175, 230, 32, 1, 247, 215, 218, 175, + 230, 32, 1, 228, 185, 218, 175, 230, 32, 1, 225, 150, 218, 175, 230, 32, + 1, 225, 253, 218, 175, 230, 32, 1, 251, 128, 218, 175, 230, 32, 1, 251, + 188, 218, 175, 230, 32, 1, 230, 231, 218, 175, 230, 32, 1, 223, 112, 218, + 175, 230, 32, 1, 232, 208, 218, 175, 230, 32, 1, 223, 73, 218, 175, 230, + 32, 1, 219, 242, 218, 175, 230, 32, 1, 241, 54, 218, 175, 230, 32, 30, 5, + 61, 218, 175, 230, 32, 30, 5, 72, 218, 175, 230, 32, 30, 5, 69, 218, 175, + 230, 32, 30, 5, 74, 218, 175, 230, 32, 30, 5, 227, 49, 218, 175, 230, 32, + 225, 146, 231, 221, 218, 175, 230, 32, 225, 146, 231, 220, 218, 175, 230, + 32, 225, 146, 231, 219, 218, 175, 230, 32, 225, 146, 231, 218, 228, 167, + 235, 237, 243, 228, 122, 224, 166, 228, 167, 235, 237, 243, 228, 122, + 242, 9, 228, 167, 235, 237, 243, 228, 133, 224, 164, 228, 167, 235, 237, + 243, 228, 122, 220, 45, 228, 167, 235, 237, 243, 228, 122, 245, 145, 228, + 167, 235, 237, 243, 228, 133, 220, 44, 228, 167, 235, 237, 224, 167, 77, + 228, 167, 235, 237, 225, 172, 77, 228, 167, 235, 237, 223, 29, 77, 228, + 167, 235, 237, 224, 168, 77, 226, 20, 1, 181, 226, 20, 1, 234, 138, 226, + 20, 1, 243, 110, 226, 20, 1, 229, 159, 226, 20, 1, 250, 219, 226, 20, 1, + 250, 92, 226, 20, 1, 235, 139, 226, 20, 1, 228, 23, 226, 20, 1, 218, 52, + 226, 20, 1, 217, 161, 226, 20, 1, 248, 164, 226, 20, 1, 205, 226, 20, 1, + 193, 226, 20, 1, 226, 23, 226, 20, 1, 252, 107, 226, 20, 1, 188, 226, 20, + 1, 216, 141, 226, 20, 1, 216, 133, 226, 20, 1, 245, 249, 226, 20, 1, 214, + 49, 226, 20, 1, 212, 75, 226, 20, 1, 212, 109, 226, 20, 1, 3, 61, 226, + 20, 1, 186, 226, 20, 1, 203, 226, 20, 1, 233, 157, 226, 20, 1, 221, 24, + 226, 20, 1, 222, 202, 226, 20, 1, 159, 226, 20, 1, 61, 226, 20, 1, 72, + 226, 20, 1, 69, 226, 20, 1, 74, 226, 20, 1, 75, 226, 20, 1, 224, 232, + 226, 20, 1, 213, 153, 226, 20, 1, 244, 164, 226, 20, 1, 243, 5, 226, 20, + 1, 245, 165, 226, 20, 219, 18, 1, 214, 49, 226, 20, 219, 18, 1, 186, 226, + 20, 1, 216, 115, 226, 20, 1, 216, 105, 226, 20, 1, 248, 86, 226, 20, 1, + 228, 198, 226, 20, 1, 254, 50, 186, 226, 20, 1, 214, 115, 221, 24, 226, + 20, 1, 214, 116, 159, 226, 20, 1, 253, 138, 244, 164, 226, 20, 219, 18, + 1, 203, 226, 20, 218, 225, 1, 203, 226, 20, 1, 250, 187, 226, 20, 220, + 81, 241, 220, 77, 226, 20, 51, 241, 220, 77, 226, 20, 152, 221, 17, 226, + 20, 152, 51, 221, 17, 169, 5, 253, 242, 169, 5, 214, 128, 169, 1, 61, + 169, 1, 254, 232, 169, 1, 72, 169, 1, 236, 28, 169, 1, 69, 169, 1, 215, + 92, 169, 1, 161, 149, 169, 1, 161, 223, 82, 169, 1, 161, 150, 169, 1, + 161, 232, 214, 169, 1, 74, 169, 1, 245, 165, 169, 1, 254, 108, 169, 1, + 75, 169, 1, 227, 49, 169, 1, 253, 108, 169, 1, 181, 169, 1, 234, 138, + 169, 1, 243, 110, 169, 1, 242, 225, 169, 1, 229, 159, 169, 1, 250, 219, + 169, 1, 250, 92, 169, 1, 235, 139, 169, 1, 235, 115, 169, 1, 228, 23, + 169, 1, 216, 115, 169, 1, 216, 105, 169, 1, 248, 86, 169, 1, 248, 70, + 169, 1, 228, 198, 169, 1, 218, 52, 169, 1, 217, 161, 169, 1, 248, 164, + 169, 1, 247, 232, 169, 1, 205, 169, 1, 193, 169, 1, 226, 23, 169, 1, 252, + 107, 169, 1, 251, 195, 169, 1, 188, 169, 1, 186, 169, 1, 203, 169, 1, + 233, 157, 169, 1, 215, 1, 169, 1, 221, 24, 169, 1, 219, 157, 169, 1, 222, + 202, 169, 1, 159, 169, 1, 232, 213, 169, 249, 133, 5, 242, 25, 169, 30, + 5, 254, 232, 169, 30, 5, 72, 169, 30, 5, 236, 28, 169, 30, 5, 69, 169, + 30, 5, 215, 92, 169, 30, 5, 161, 149, 169, 30, 5, 161, 223, 82, 169, 30, + 5, 161, 150, 169, 30, 5, 161, 232, 214, 169, 30, 5, 74, 169, 30, 5, 245, + 165, 169, 30, 5, 254, 108, 169, 30, 5, 75, 169, 30, 5, 227, 49, 169, 30, + 5, 253, 108, 169, 5, 214, 133, 169, 248, 123, 169, 51, 248, 123, 169, 21, + 212, 79, 169, 21, 116, 169, 21, 109, 169, 21, 166, 169, 21, 163, 169, 21, + 180, 169, 21, 189, 169, 21, 198, 169, 21, 195, 169, 21, 200, 37, 82, 21, + 212, 79, 37, 82, 21, 116, 37, 82, 21, 109, 37, 82, 21, 166, 37, 82, 21, + 163, 37, 82, 21, 180, 37, 82, 21, 189, 37, 82, 21, 198, 37, 82, 21, 195, + 37, 82, 21, 200, 37, 82, 1, 61, 37, 82, 1, 69, 37, 82, 1, 181, 37, 82, 1, + 205, 37, 82, 1, 193, 37, 82, 1, 203, 37, 82, 1, 214, 154, 37, 82, 5, 253, + 91, 82, 5, 219, 205, 250, 187, 82, 5, 250, 188, 214, 133, 82, 5, 51, 250, + 188, 214, 133, 82, 5, 250, 188, 109, 82, 5, 250, 188, 166, 82, 5, 250, + 188, 253, 91, 82, 5, 225, 11, 82, 243, 76, 244, 72, 82, 250, 170, 82, + 241, 214, 234, 194, 233, 14, 21, 212, 79, 234, 194, 233, 14, 21, 116, + 234, 194, 233, 14, 21, 109, 234, 194, 233, 14, 21, 166, 234, 194, 233, + 14, 21, 163, 234, 194, 233, 14, 21, 180, 234, 194, 233, 14, 21, 189, 234, + 194, 233, 14, 21, 198, 234, 194, 233, 14, 21, 195, 234, 194, 233, 14, 21, + 200, 234, 194, 233, 14, 1, 181, 234, 194, 233, 14, 1, 234, 138, 234, 194, + 233, 14, 1, 243, 110, 234, 194, 233, 14, 1, 229, 159, 234, 194, 233, 14, + 1, 222, 202, 234, 194, 233, 14, 1, 221, 24, 234, 194, 233, 14, 1, 212, + 109, 234, 194, 233, 14, 1, 228, 23, 234, 194, 233, 14, 1, 218, 52, 234, + 194, 233, 14, 1, 240, 214, 234, 194, 233, 14, 1, 205, 234, 194, 233, 14, + 1, 193, 234, 194, 233, 14, 1, 226, 23, 234, 194, 233, 14, 1, 188, 234, + 194, 233, 14, 1, 248, 164, 234, 194, 233, 14, 1, 252, 107, 234, 194, 233, + 14, 1, 203, 234, 194, 233, 14, 1, 186, 234, 194, 233, 14, 1, 233, 157, + 234, 194, 233, 14, 1, 214, 49, 234, 194, 233, 14, 1, 217, 161, 234, 194, + 233, 14, 1, 159, 234, 194, 233, 14, 1, 215, 1, 234, 194, 233, 14, 1, 250, + 219, 234, 194, 233, 14, 1, 61, 234, 194, 233, 14, 1, 227, 99, 234, 194, + 233, 14, 1, 72, 234, 194, 233, 14, 1, 227, 49, 234, 194, 233, 14, 30, + 215, 183, 234, 194, 233, 14, 30, 74, 234, 194, 233, 14, 30, 69, 234, 194, + 233, 14, 30, 245, 165, 234, 194, 233, 14, 30, 75, 234, 194, 233, 14, 160, + 225, 163, 234, 194, 233, 14, 160, 250, 200, 234, 194, 233, 14, 160, 250, + 201, 225, 163, 234, 194, 233, 14, 5, 249, 20, 234, 194, 233, 14, 5, 220, + 125, 223, 243, 1, 181, 223, 243, 1, 243, 110, 223, 243, 1, 229, 159, 223, + 243, 1, 218, 52, 223, 243, 1, 248, 164, 223, 243, 1, 205, 223, 243, 1, + 193, 223, 243, 1, 252, 107, 223, 243, 1, 188, 223, 243, 1, 250, 219, 223, + 243, 1, 235, 139, 223, 243, 1, 228, 23, 223, 243, 1, 222, 202, 223, 243, + 1, 203, 223, 243, 1, 233, 157, 223, 243, 1, 186, 223, 243, 1, 214, 49, + 223, 243, 1, 159, 223, 243, 1, 231, 187, 223, 243, 1, 229, 141, 223, 243, + 1, 229, 228, 223, 243, 1, 227, 254, 223, 243, 1, 61, 223, 243, 30, 5, 72, + 223, 243, 30, 5, 69, 223, 243, 30, 5, 74, 223, 243, 30, 5, 254, 108, 223, + 243, 30, 5, 75, 223, 243, 30, 5, 253, 108, 223, 243, 30, 5, 245, 22, 223, + 243, 30, 5, 245, 189, 223, 243, 249, 133, 5, 229, 161, 223, 243, 249, + 133, 5, 204, 223, 243, 249, 133, 5, 149, 223, 243, 249, 133, 5, 242, 41, + 223, 243, 214, 133, 223, 243, 222, 92, 77, 23, 97, 217, 51, 23, 97, 217, + 50, 23, 97, 217, 48, 23, 97, 217, 53, 23, 97, 223, 174, 23, 97, 223, 158, + 23, 97, 223, 153, 23, 97, 223, 155, 23, 97, 223, 171, 23, 97, 223, 164, + 23, 97, 223, 157, 23, 97, 223, 176, 23, 97, 223, 159, 23, 97, 223, 178, + 23, 97, 223, 175, 23, 97, 231, 26, 23, 97, 231, 17, 23, 97, 231, 20, 23, + 97, 225, 212, 23, 97, 225, 223, 23, 97, 225, 224, 23, 97, 219, 142, 23, + 97, 236, 41, 23, 97, 236, 48, 23, 97, 219, 153, 23, 97, 219, 140, 23, 97, + 226, 6, 23, 97, 241, 153, 23, 97, 219, 137, 144, 5, 226, 155, 144, 5, + 250, 121, 144, 5, 233, 90, 144, 5, 213, 228, 144, 1, 61, 144, 1, 240, + 146, 234, 197, 144, 1, 72, 144, 1, 236, 28, 144, 1, 69, 144, 1, 226, 214, + 250, 97, 144, 1, 229, 160, 233, 52, 144, 1, 229, 160, 233, 53, 224, 34, + 144, 1, 74, 144, 1, 254, 108, 144, 1, 75, 144, 1, 181, 144, 1, 235, 17, + 222, 144, 144, 1, 235, 17, 230, 136, 144, 1, 243, 110, 144, 1, 243, 111, + 230, 136, 144, 1, 229, 159, 144, 1, 250, 219, 144, 1, 250, 220, 230, 136, + 144, 1, 235, 139, 144, 1, 228, 24, 230, 136, 144, 1, 235, 140, 232, 12, + 144, 1, 228, 23, 144, 1, 216, 115, 144, 1, 216, 116, 232, 12, 144, 1, + 248, 86, 144, 1, 248, 87, 232, 12, 144, 1, 230, 46, 230, 136, 144, 1, + 218, 52, 144, 1, 218, 53, 230, 136, 144, 1, 248, 164, 144, 1, 248, 165, + 232, 12, 144, 1, 205, 144, 1, 193, 144, 1, 226, 214, 230, 136, 144, 1, + 252, 107, 144, 1, 252, 108, 230, 136, 144, 1, 188, 144, 1, 186, 144, 1, + 203, 144, 1, 224, 77, 254, 115, 144, 1, 233, 157, 144, 1, 214, 49, 144, + 1, 222, 203, 230, 136, 144, 1, 222, 203, 232, 12, 144, 1, 222, 202, 144, + 1, 159, 144, 5, 250, 122, 217, 203, 144, 30, 5, 217, 254, 144, 30, 5, + 216, 246, 144, 30, 5, 213, 178, 144, 30, 5, 213, 179, 231, 133, 144, 30, + 5, 218, 248, 144, 30, 5, 218, 249, 231, 121, 144, 30, 5, 218, 16, 144, + 30, 5, 247, 146, 230, 135, 144, 30, 5, 226, 59, 144, 249, 133, 5, 234, + 164, 144, 249, 133, 5, 226, 71, 144, 249, 133, 5, 250, 207, 144, 226, + 167, 144, 42, 223, 221, 144, 46, 223, 221, 144, 226, 203, 254, 26, 144, + 226, 203, 232, 29, 144, 226, 203, 232, 146, 144, 226, 203, 213, 223, 144, + 226, 203, 226, 168, 144, 226, 203, 232, 234, 144, 226, 203, 232, 140, + 144, 226, 203, 254, 154, 144, 226, 203, 254, 155, 254, 154, 144, 226, + 203, 225, 183, 144, 216, 58, 226, 203, 225, 183, 144, 226, 164, 144, 21, + 212, 79, 144, 21, 116, 144, 21, 109, 144, 21, 166, 144, 21, 163, 144, 21, + 180, 144, 21, 189, 144, 21, 198, 144, 21, 195, 144, 21, 200, 144, 226, + 203, 217, 22, 216, 70, 144, 226, 203, 235, 165, 162, 1, 61, 162, 1, 72, + 162, 1, 69, 162, 1, 74, 162, 1, 254, 108, 162, 1, 75, 162, 1, 181, 162, + 1, 234, 138, 162, 1, 243, 110, 162, 1, 242, 225, 162, 1, 229, 75, 162, 1, + 229, 159, 162, 1, 250, 92, 162, 1, 250, 49, 162, 1, 235, 139, 162, 1, + 235, 115, 162, 1, 229, 66, 162, 1, 229, 68, 162, 1, 229, 67, 162, 1, 218, + 52, 162, 1, 217, 161, 162, 1, 248, 164, 162, 1, 247, 232, 162, 1, 228, + 62, 162, 1, 205, 162, 1, 248, 86, 162, 1, 193, 162, 1, 225, 100, 162, 1, + 226, 23, 162, 1, 252, 107, 162, 1, 251, 195, 162, 1, 230, 165, 162, 1, + 188, 162, 1, 252, 31, 162, 1, 186, 162, 1, 203, 162, 1, 233, 157, 162, 1, + 215, 1, 162, 1, 219, 157, 162, 1, 222, 202, 162, 1, 159, 162, 30, 5, 254, + 232, 162, 30, 5, 72, 162, 30, 5, 236, 28, 162, 30, 5, 245, 152, 162, 30, + 5, 69, 162, 30, 5, 227, 99, 162, 30, 5, 75, 162, 30, 5, 254, 108, 162, + 30, 5, 253, 108, 162, 30, 5, 215, 183, 162, 249, 133, 5, 186, 162, 249, + 133, 5, 203, 162, 249, 133, 5, 233, 157, 162, 249, 133, 5, 214, 49, 162, + 1, 40, 235, 27, 162, 1, 40, 243, 177, 162, 1, 40, 229, 161, 162, 249, + 133, 5, 40, 229, 161, 162, 1, 40, 250, 93, 162, 1, 40, 218, 99, 162, 1, + 40, 204, 162, 1, 40, 226, 229, 162, 1, 40, 213, 105, 162, 1, 40, 149, + 162, 1, 40, 150, 162, 1, 40, 219, 158, 162, 249, 133, 5, 40, 183, 162, + 249, 133, 5, 40, 242, 41, 162, 21, 212, 79, 162, 21, 116, 162, 21, 109, + 162, 21, 166, 162, 21, 163, 162, 21, 180, 162, 21, 189, 162, 21, 198, + 162, 21, 195, 162, 21, 200, 162, 225, 27, 219, 183, 162, 225, 27, 248, + 123, 162, 225, 27, 51, 248, 123, 162, 225, 27, 216, 169, 248, 123, 64, 1, + 234, 132, 243, 110, 64, 1, 234, 132, 250, 219, 64, 1, 234, 132, 250, 92, + 64, 1, 234, 132, 235, 139, 64, 1, 234, 132, 235, 115, 64, 1, 234, 132, + 228, 23, 64, 1, 234, 132, 216, 115, 64, 1, 234, 132, 216, 105, 64, 1, + 234, 132, 248, 86, 64, 1, 234, 132, 248, 70, 64, 1, 234, 132, 247, 232, + 64, 1, 234, 132, 205, 64, 1, 234, 132, 222, 202, 64, 1, 234, 132, 159, + 64, 1, 234, 132, 241, 174, 64, 1, 234, 132, 244, 164, 64, 59, 1, 234, + 132, 224, 2, 64, 1, 234, 132, 213, 153, 64, 1, 234, 132, 212, 109, 64, 1, + 234, 132, 203, 64, 232, 198, 234, 132, 227, 117, 64, 232, 198, 234, 132, + 224, 188, 64, 232, 198, 234, 132, 241, 107, 64, 16, 254, 98, 244, 253, + 64, 16, 254, 98, 116, 64, 16, 254, 98, 109, 64, 1, 254, 98, 203, 64, 5, + 226, 151, 234, 218, 216, 241, 38, 190, 1, 115, 234, 37, 38, 190, 1, 124, + 234, 37, 38, 190, 1, 115, 234, 113, 38, 190, 1, 124, 234, 113, 38, 190, + 1, 115, 234, 120, 38, 190, 1, 124, 234, 120, 38, 190, 1, 115, 242, 150, + 38, 190, 1, 124, 242, 150, 38, 190, 1, 115, 229, 90, 38, 190, 1, 124, + 229, 90, 38, 190, 1, 115, 249, 175, 38, 190, 1, 124, 249, 175, 38, 190, + 1, 115, 250, 23, 38, 190, 1, 124, 250, 23, 38, 190, 1, 115, 219, 242, 38, + 190, 1, 124, 219, 242, 38, 190, 1, 115, 227, 253, 38, 190, 1, 124, 227, + 253, 38, 190, 1, 115, 247, 99, 38, 190, 1, 124, 247, 99, 38, 190, 1, 115, + 108, 38, 190, 1, 124, 108, 38, 190, 1, 115, 217, 109, 38, 190, 1, 124, + 217, 109, 38, 190, 1, 115, 228, 185, 38, 190, 1, 124, 228, 185, 38, 190, + 1, 115, 251, 128, 38, 190, 1, 124, 251, 128, 38, 190, 1, 115, 225, 150, + 38, 190, 1, 124, 225, 150, 38, 190, 1, 115, 225, 253, 38, 190, 1, 124, + 225, 253, 38, 190, 1, 115, 244, 12, 38, 190, 1, 124, 244, 12, 38, 190, 1, + 115, 230, 231, 38, 190, 1, 124, 230, 231, 38, 190, 1, 115, 212, 235, 38, + 190, 1, 124, 212, 235, 38, 190, 1, 115, 223, 112, 38, 190, 1, 124, 223, + 112, 38, 190, 1, 115, 232, 208, 38, 190, 1, 124, 232, 208, 38, 190, 1, + 115, 214, 119, 38, 190, 1, 124, 214, 119, 38, 190, 1, 115, 241, 54, 38, + 190, 1, 124, 241, 54, 38, 190, 1, 115, 75, 38, 190, 1, 124, 75, 38, 190, + 232, 9, 234, 235, 38, 190, 30, 254, 232, 38, 190, 30, 72, 38, 190, 30, + 215, 183, 38, 190, 30, 69, 38, 190, 30, 74, 38, 190, 30, 75, 38, 190, + 232, 9, 234, 115, 38, 190, 30, 240, 111, 38, 190, 30, 215, 182, 38, 190, + 30, 215, 196, 38, 190, 30, 253, 106, 38, 190, 30, 253, 83, 38, 190, 30, + 254, 32, 38, 190, 30, 254, 45, 38, 190, 160, 232, 9, 245, 137, 38, 190, + 160, 232, 9, 228, 61, 38, 190, 160, 232, 9, 217, 109, 38, 190, 160, 232, + 9, 219, 228, 38, 190, 16, 234, 22, 38, 190, 16, 228, 61, 38, 190, 16, + 222, 168, 38, 190, 16, 241, 55, 241, 50, 38, 190, 16, 234, 31, 234, 30, + 28, 4, 216, 98, 28, 4, 216, 101, 28, 4, 216, 104, 28, 4, 216, 102, 28, 4, + 216, 103, 28, 4, 216, 100, 28, 4, 248, 64, 28, 4, 248, 66, 28, 4, 248, + 69, 28, 4, 248, 67, 28, 4, 248, 68, 28, 4, 248, 65, 28, 4, 245, 239, 28, + 4, 245, 242, 28, 4, 245, 248, 28, 4, 245, 246, 28, 4, 245, 247, 28, 4, + 245, 240, 28, 4, 250, 138, 28, 4, 250, 132, 28, 4, 250, 134, 28, 4, 250, + 137, 28, 4, 250, 135, 28, 4, 250, 136, 28, 4, 250, 133, 28, 4, 252, 31, + 28, 4, 252, 10, 28, 4, 252, 22, 28, 4, 252, 30, 28, 4, 252, 25, 28, 4, + 252, 26, 28, 4, 252, 14, 231, 140, 231, 194, 1, 234, 28, 231, 140, 231, + 194, 1, 222, 168, 231, 140, 231, 194, 1, 233, 133, 231, 140, 231, 194, 1, + 230, 241, 231, 140, 231, 194, 1, 193, 231, 140, 231, 194, 1, 205, 231, + 140, 231, 194, 1, 250, 39, 231, 140, 231, 194, 1, 217, 44, 231, 140, 231, + 194, 1, 234, 109, 231, 140, 231, 194, 1, 229, 80, 231, 140, 231, 194, 1, + 217, 103, 231, 140, 231, 194, 1, 214, 44, 231, 140, 231, 194, 1, 213, 58, + 231, 140, 231, 194, 1, 240, 206, 231, 140, 231, 194, 1, 215, 160, 231, + 140, 231, 194, 1, 72, 231, 140, 231, 194, 1, 226, 18, 231, 140, 231, 194, + 1, 253, 118, 231, 140, 231, 194, 1, 242, 143, 231, 140, 231, 194, 1, 235, + 114, 231, 140, 231, 194, 1, 224, 57, 231, 140, 231, 194, 1, 252, 107, + 231, 140, 231, 194, 1, 235, 103, 231, 140, 231, 194, 1, 247, 171, 231, + 140, 231, 194, 1, 242, 197, 231, 140, 231, 194, 1, 247, 213, 231, 140, + 231, 194, 1, 251, 194, 231, 140, 231, 194, 1, 234, 29, 232, 181, 231, + 140, 231, 194, 1, 233, 134, 232, 181, 231, 140, 231, 194, 1, 230, 242, + 232, 181, 231, 140, 231, 194, 1, 226, 214, 232, 181, 231, 140, 231, 194, + 1, 230, 46, 232, 181, 231, 140, 231, 194, 1, 217, 45, 232, 181, 231, 140, + 231, 194, 1, 229, 81, 232, 181, 231, 140, 231, 194, 1, 240, 146, 232, + 181, 231, 140, 231, 194, 30, 5, 227, 61, 231, 140, 231, 194, 30, 5, 235, + 249, 231, 140, 231, 194, 30, 5, 254, 31, 231, 140, 231, 194, 30, 5, 213, + 29, 231, 140, 231, 194, 30, 5, 219, 219, 231, 140, 231, 194, 30, 5, 215, + 157, 231, 140, 231, 194, 30, 5, 250, 60, 231, 140, 231, 194, 30, 5, 228, + 47, 231, 140, 231, 194, 250, 61, 231, 140, 231, 194, 232, 143, 235, 148, + 231, 140, 231, 194, 253, 216, 235, 148, 231, 140, 231, 194, 21, 212, 79, + 231, 140, 231, 194, 21, 116, 231, 140, 231, 194, 21, 109, 231, 140, 231, + 194, 21, 166, 231, 140, 231, 194, 21, 163, 231, 140, 231, 194, 21, 180, + 231, 140, 231, 194, 21, 189, 231, 140, 231, 194, 21, 198, 231, 140, 231, + 194, 21, 195, 231, 140, 231, 194, 21, 200, 23, 135, 227, 197, 23, 135, + 227, 202, 23, 135, 212, 234, 23, 135, 212, 233, 23, 135, 212, 232, 23, + 135, 215, 246, 23, 135, 215, 249, 23, 135, 212, 201, 23, 135, 212, 197, + 23, 135, 245, 21, 23, 135, 245, 19, 23, 135, 245, 20, 23, 135, 245, 17, + 23, 135, 240, 136, 23, 135, 240, 135, 23, 135, 240, 133, 23, 135, 240, + 134, 23, 135, 240, 139, 23, 135, 240, 132, 23, 135, 240, 131, 23, 135, + 240, 141, 23, 135, 253, 203, 23, 135, 253, 202, 23, 89, 229, 50, 23, 89, + 229, 56, 23, 89, 219, 139, 23, 89, 219, 138, 23, 89, 217, 50, 23, 89, + 217, 48, 23, 89, 217, 47, 23, 89, 217, 53, 23, 89, 217, 54, 23, 89, 217, + 46, 23, 89, 223, 158, 23, 89, 223, 173, 23, 89, 219, 145, 23, 89, 223, + 170, 23, 89, 223, 160, 23, 89, 223, 162, 23, 89, 223, 149, 23, 89, 223, + 150, 23, 89, 234, 223, 23, 89, 231, 25, 23, 89, 231, 19, 23, 89, 219, + 149, 23, 89, 231, 22, 23, 89, 231, 28, 23, 89, 225, 208, 23, 89, 225, + 217, 23, 89, 225, 221, 23, 89, 219, 147, 23, 89, 225, 211, 23, 89, 225, + 225, 23, 89, 225, 226, 23, 89, 220, 68, 23, 89, 220, 71, 23, 89, 219, + 143, 23, 89, 219, 141, 23, 89, 220, 66, 23, 89, 220, 74, 23, 89, 220, 75, + 23, 89, 220, 60, 23, 89, 220, 73, 23, 89, 226, 158, 23, 89, 226, 159, 23, + 89, 213, 15, 23, 89, 213, 16, 23, 89, 249, 237, 23, 89, 249, 236, 23, 89, + 219, 154, 23, 89, 226, 4, 23, 89, 226, 3, 9, 13, 238, 17, 9, 13, 238, 16, + 9, 13, 238, 15, 9, 13, 238, 14, 9, 13, 238, 13, 9, 13, 238, 12, 9, 13, + 238, 11, 9, 13, 238, 10, 9, 13, 238, 9, 9, 13, 238, 8, 9, 13, 238, 7, 9, + 13, 238, 6, 9, 13, 238, 5, 9, 13, 238, 4, 9, 13, 238, 3, 9, 13, 238, 2, + 9, 13, 238, 1, 9, 13, 238, 0, 9, 13, 237, 255, 9, 13, 237, 254, 9, 13, + 237, 253, 9, 13, 237, 252, 9, 13, 237, 251, 9, 13, 237, 250, 9, 13, 237, + 249, 9, 13, 237, 248, 9, 13, 237, 247, 9, 13, 237, 246, 9, 13, 237, 245, + 9, 13, 237, 244, 9, 13, 237, 243, 9, 13, 237, 242, 9, 13, 237, 241, 9, + 13, 237, 240, 9, 13, 237, 239, 9, 13, 237, 238, 9, 13, 237, 237, 9, 13, + 237, 236, 9, 13, 237, 235, 9, 13, 237, 234, 9, 13, 237, 233, 9, 13, 237, + 232, 9, 13, 237, 231, 9, 13, 237, 230, 9, 13, 237, 229, 9, 13, 237, 228, + 9, 13, 237, 227, 9, 13, 237, 226, 9, 13, 237, 225, 9, 13, 237, 224, 9, + 13, 237, 223, 9, 13, 237, 222, 9, 13, 237, 221, 9, 13, 237, 220, 9, 13, + 237, 219, 9, 13, 237, 218, 9, 13, 237, 217, 9, 13, 237, 216, 9, 13, 237, + 215, 9, 13, 237, 214, 9, 13, 237, 213, 9, 13, 237, 212, 9, 13, 237, 211, + 9, 13, 237, 210, 9, 13, 237, 209, 9, 13, 237, 208, 9, 13, 237, 207, 9, + 13, 237, 206, 9, 13, 237, 205, 9, 13, 237, 204, 9, 13, 237, 203, 9, 13, + 237, 202, 9, 13, 237, 201, 9, 13, 237, 200, 9, 13, 237, 199, 9, 13, 237, + 198, 9, 13, 237, 197, 9, 13, 237, 196, 9, 13, 237, 195, 9, 13, 237, 194, + 9, 13, 237, 193, 9, 13, 237, 192, 9, 13, 237, 191, 9, 13, 237, 190, 9, + 13, 237, 189, 9, 13, 237, 188, 9, 13, 237, 187, 9, 13, 237, 186, 9, 13, + 237, 185, 9, 13, 237, 184, 9, 13, 237, 183, 9, 13, 237, 182, 9, 13, 237, + 181, 9, 13, 237, 180, 9, 13, 237, 179, 9, 13, 237, 178, 9, 13, 237, 177, + 9, 13, 237, 176, 9, 13, 237, 175, 9, 13, 237, 174, 9, 13, 237, 173, 9, + 13, 237, 172, 9, 13, 237, 171, 9, 13, 237, 170, 9, 13, 237, 169, 9, 13, + 237, 168, 9, 13, 237, 167, 9, 13, 237, 166, 9, 13, 237, 165, 9, 13, 237, + 164, 9, 13, 237, 163, 9, 13, 237, 162, 9, 13, 237, 161, 9, 13, 237, 160, + 9, 13, 237, 159, 9, 13, 237, 158, 9, 13, 237, 157, 9, 13, 237, 156, 9, + 13, 237, 155, 9, 13, 237, 154, 9, 13, 237, 153, 9, 13, 237, 152, 9, 13, + 237, 151, 9, 13, 237, 150, 9, 13, 237, 149, 9, 13, 237, 148, 9, 13, 237, + 147, 9, 13, 237, 146, 9, 13, 237, 145, 9, 13, 237, 144, 9, 13, 237, 143, + 9, 13, 237, 142, 9, 13, 237, 141, 9, 13, 237, 140, 9, 13, 237, 139, 9, + 13, 237, 138, 9, 13, 237, 137, 9, 13, 237, 136, 9, 13, 237, 135, 9, 13, + 237, 134, 9, 13, 237, 133, 9, 13, 237, 132, 9, 13, 237, 131, 9, 13, 237, + 130, 9, 13, 237, 129, 9, 13, 237, 128, 9, 13, 237, 127, 9, 13, 237, 126, + 9, 13, 237, 125, 9, 13, 237, 124, 9, 13, 237, 123, 9, 13, 237, 122, 9, + 13, 237, 121, 9, 13, 237, 120, 9, 13, 237, 119, 9, 13, 237, 118, 9, 13, + 237, 117, 9, 13, 237, 116, 9, 13, 237, 115, 9, 13, 237, 114, 9, 13, 237, + 113, 9, 13, 237, 112, 9, 13, 237, 111, 9, 13, 237, 110, 9, 13, 237, 109, + 9, 13, 237, 108, 9, 13, 237, 107, 9, 13, 237, 106, 9, 13, 237, 105, 9, + 13, 237, 104, 9, 13, 237, 103, 9, 13, 237, 102, 9, 13, 237, 101, 9, 13, + 237, 100, 9, 13, 237, 99, 9, 13, 237, 98, 9, 13, 237, 97, 9, 13, 237, 96, + 9, 13, 237, 95, 9, 13, 237, 94, 9, 13, 237, 93, 9, 13, 237, 92, 9, 13, + 237, 91, 9, 13, 237, 90, 9, 13, 237, 89, 9, 13, 237, 88, 9, 13, 237, 87, + 9, 13, 237, 86, 9, 13, 237, 85, 9, 13, 237, 84, 9, 13, 237, 83, 9, 13, + 237, 82, 9, 13, 237, 81, 9, 13, 237, 80, 9, 13, 237, 79, 9, 13, 237, 78, + 9, 13, 237, 77, 9, 13, 237, 76, 9, 13, 237, 75, 9, 13, 237, 74, 9, 13, + 237, 73, 9, 13, 237, 72, 9, 13, 237, 71, 9, 13, 237, 70, 9, 13, 237, 69, + 9, 13, 237, 68, 9, 13, 237, 67, 9, 13, 237, 66, 9, 13, 237, 65, 9, 13, + 237, 64, 9, 13, 237, 63, 9, 13, 237, 62, 9, 13, 237, 61, 9, 13, 237, 60, + 9, 13, 237, 59, 9, 13, 237, 58, 9, 13, 237, 57, 9, 13, 237, 56, 9, 13, + 237, 55, 9, 13, 237, 54, 9, 13, 237, 53, 9, 13, 237, 52, 9, 13, 237, 51, + 9, 13, 237, 50, 9, 13, 237, 49, 9, 13, 237, 48, 9, 13, 237, 47, 9, 13, + 237, 46, 9, 13, 237, 45, 9, 13, 237, 44, 9, 13, 237, 43, 9, 13, 237, 42, + 9, 13, 237, 41, 9, 13, 237, 40, 9, 13, 237, 39, 9, 13, 237, 38, 9, 13, + 237, 37, 9, 13, 237, 36, 9, 13, 237, 35, 9, 13, 237, 34, 9, 13, 237, 33, + 9, 13, 237, 32, 9, 13, 237, 31, 9, 13, 237, 30, 9, 13, 237, 29, 9, 13, + 237, 28, 9, 13, 237, 27, 9, 13, 237, 26, 9, 13, 237, 25, 9, 13, 237, 24, + 9, 13, 237, 23, 9, 13, 237, 22, 9, 13, 237, 21, 9, 13, 237, 20, 9, 13, + 237, 19, 9, 13, 237, 18, 9, 13, 237, 17, 9, 13, 237, 16, 9, 13, 237, 15, + 9, 13, 237, 14, 9, 13, 237, 13, 9, 13, 237, 12, 9, 13, 237, 11, 9, 13, + 237, 10, 9, 13, 237, 9, 9, 13, 237, 8, 9, 13, 237, 7, 9, 13, 237, 6, 9, + 13, 237, 5, 9, 13, 237, 4, 9, 13, 237, 3, 9, 13, 237, 2, 9, 13, 237, 1, + 9, 13, 237, 0, 9, 13, 236, 255, 9, 13, 236, 254, 9, 13, 236, 253, 9, 13, + 236, 252, 9, 13, 236, 251, 9, 13, 236, 250, 9, 13, 236, 249, 9, 13, 236, + 248, 9, 13, 236, 247, 9, 13, 236, 246, 9, 13, 236, 245, 9, 13, 236, 244, + 9, 13, 236, 243, 9, 13, 236, 242, 9, 13, 236, 241, 9, 13, 236, 240, 9, + 13, 236, 239, 9, 13, 236, 238, 9, 13, 236, 237, 9, 13, 236, 236, 9, 13, + 236, 235, 9, 13, 236, 234, 9, 13, 236, 233, 9, 13, 236, 232, 9, 13, 236, + 231, 9, 13, 236, 230, 9, 13, 236, 229, 9, 13, 236, 228, 9, 13, 236, 227, + 9, 13, 236, 226, 9, 13, 236, 225, 9, 13, 236, 224, 9, 13, 236, 223, 9, + 13, 236, 222, 9, 13, 236, 221, 9, 13, 236, 220, 9, 13, 236, 219, 9, 13, + 236, 218, 9, 13, 236, 217, 9, 13, 236, 216, 9, 13, 236, 215, 9, 13, 236, + 214, 9, 13, 236, 213, 9, 13, 236, 212, 9, 13, 236, 211, 9, 13, 236, 210, + 9, 13, 236, 209, 9, 13, 236, 208, 9, 13, 236, 207, 9, 13, 236, 206, 9, + 13, 236, 205, 9, 13, 236, 204, 9, 13, 236, 203, 9, 13, 236, 202, 9, 13, + 236, 201, 9, 13, 236, 200, 9, 13, 236, 199, 9, 13, 236, 198, 9, 13, 236, + 197, 9, 13, 236, 196, 9, 13, 236, 195, 9, 13, 236, 194, 9, 13, 236, 193, + 9, 13, 236, 192, 9, 13, 236, 191, 9, 13, 236, 190, 9, 13, 236, 189, 9, + 13, 236, 188, 9, 13, 236, 187, 9, 13, 236, 186, 9, 13, 236, 185, 9, 13, + 236, 184, 9, 13, 236, 183, 9, 13, 236, 182, 9, 13, 236, 181, 9, 13, 236, + 180, 9, 13, 236, 179, 9, 13, 236, 178, 9, 13, 236, 177, 9, 13, 236, 176, + 9, 13, 236, 175, 9, 13, 236, 174, 9, 13, 236, 173, 9, 13, 236, 172, 9, + 13, 236, 171, 9, 13, 236, 170, 9, 13, 236, 169, 9, 13, 236, 168, 9, 13, + 236, 167, 9, 13, 236, 166, 9, 13, 236, 165, 9, 13, 236, 164, 9, 13, 236, + 163, 9, 13, 236, 162, 9, 13, 236, 161, 9, 13, 236, 160, 9, 13, 236, 159, + 9, 13, 236, 158, 9, 13, 236, 157, 9, 13, 236, 156, 9, 13, 236, 155, 9, + 13, 236, 154, 9, 13, 236, 153, 9, 13, 236, 152, 9, 13, 236, 151, 9, 13, + 236, 150, 9, 13, 236, 149, 9, 13, 236, 148, 9, 13, 236, 147, 9, 13, 236, + 146, 9, 13, 236, 145, 9, 13, 236, 144, 9, 13, 236, 143, 9, 13, 236, 142, + 9, 13, 236, 141, 9, 13, 236, 140, 9, 13, 236, 139, 9, 13, 236, 138, 9, + 13, 236, 137, 9, 13, 236, 136, 9, 13, 236, 135, 9, 13, 236, 134, 9, 13, + 236, 133, 9, 13, 236, 132, 9, 13, 236, 131, 9, 13, 236, 130, 9, 13, 236, + 129, 9, 13, 236, 128, 9, 13, 236, 127, 9, 13, 236, 126, 9, 13, 236, 125, + 9, 13, 236, 124, 9, 13, 236, 123, 9, 13, 236, 122, 9, 13, 236, 121, 9, + 13, 236, 120, 9, 13, 236, 119, 9, 13, 236, 118, 9, 13, 236, 117, 9, 13, + 236, 116, 9, 13, 236, 115, 9, 13, 236, 114, 9, 13, 236, 113, 9, 13, 236, + 112, 9, 13, 236, 111, 9, 13, 236, 110, 9, 13, 236, 109, 9, 13, 236, 108, + 9, 13, 236, 107, 9, 13, 236, 106, 9, 13, 236, 105, 9, 13, 236, 104, 9, + 13, 236, 103, 9, 13, 236, 102, 9, 13, 236, 101, 9, 13, 236, 100, 9, 13, + 236, 99, 9, 13, 236, 98, 9, 13, 236, 97, 9, 13, 236, 96, 9, 13, 236, 95, + 9, 13, 236, 94, 9, 13, 236, 93, 9, 13, 236, 92, 9, 13, 236, 91, 9, 13, + 236, 90, 9, 13, 236, 89, 9, 13, 236, 88, 9, 13, 236, 87, 9, 13, 236, 86, + 9, 13, 236, 85, 9, 13, 236, 84, 9, 13, 236, 83, 9, 13, 236, 82, 9, 13, + 236, 81, 9, 13, 236, 80, 9, 13, 236, 79, 9, 13, 236, 78, 9, 13, 236, 77, + 9, 13, 236, 76, 9, 13, 236, 75, 9, 13, 236, 74, 9, 13, 236, 73, 9, 13, + 236, 72, 9, 13, 236, 71, 9, 13, 236, 70, 9, 13, 236, 69, 9, 13, 236, 68, + 9, 13, 236, 67, 9, 13, 236, 66, 9, 13, 236, 65, 9, 13, 236, 64, 9, 13, + 236, 63, 9, 13, 236, 62, 9, 13, 236, 61, 9, 13, 236, 60, 7, 3, 26, 244, + 94, 7, 3, 26, 244, 90, 7, 3, 26, 244, 45, 7, 3, 26, 244, 93, 7, 3, 26, + 244, 92, 7, 3, 26, 184, 223, 4, 218, 99, 7, 3, 26, 219, 107, 141, 3, 26, + 231, 123, 228, 150, 141, 3, 26, 231, 123, 245, 169, 141, 3, 26, 231, 123, + 235, 224, 141, 3, 26, 214, 157, 228, 150, 141, 3, 26, 231, 123, 213, 148, + 93, 1, 212, 225, 2, 241, 144, 93, 225, 145, 235, 53, 214, 243, 93, 26, + 212, 253, 212, 225, 212, 225, 226, 112, 93, 1, 254, 48, 253, 78, 93, 1, + 213, 232, 254, 78, 93, 1, 213, 232, 248, 134, 93, 1, 213, 232, 241, 222, + 93, 1, 213, 232, 234, 254, 93, 1, 213, 232, 233, 118, 93, 1, 213, 232, + 40, 231, 129, 93, 1, 213, 232, 223, 219, 93, 1, 213, 232, 217, 245, 93, + 1, 254, 48, 94, 52, 93, 1, 220, 201, 2, 220, 201, 247, 74, 93, 1, 220, + 201, 2, 220, 85, 247, 74, 93, 1, 220, 201, 2, 248, 151, 24, 220, 201, + 247, 74, 93, 1, 220, 201, 2, 248, 151, 24, 220, 85, 247, 74, 93, 1, 106, + 2, 226, 112, 93, 1, 106, 2, 224, 220, 93, 1, 106, 2, 231, 234, 93, 1, + 251, 206, 2, 248, 150, 93, 1, 242, 178, 2, 248, 150, 93, 1, 248, 135, 2, + 248, 150, 93, 1, 241, 223, 2, 231, 234, 93, 1, 214, 237, 2, 248, 150, 93, + 1, 212, 91, 2, 248, 150, 93, 1, 217, 184, 2, 248, 150, 93, 1, 212, 225, + 2, 248, 150, 93, 1, 40, 234, 255, 2, 248, 150, 93, 1, 234, 255, 2, 248, + 150, 93, 1, 233, 119, 2, 248, 150, 93, 1, 231, 130, 2, 248, 150, 93, 1, + 228, 51, 2, 248, 150, 93, 1, 222, 165, 2, 248, 150, 93, 1, 40, 226, 97, + 2, 248, 150, 93, 1, 226, 97, 2, 248, 150, 93, 1, 216, 138, 2, 248, 150, + 93, 1, 224, 185, 2, 248, 150, 93, 1, 223, 220, 2, 248, 150, 93, 1, 220, + 201, 2, 248, 150, 93, 1, 217, 246, 2, 248, 150, 93, 1, 214, 237, 2, 241, + 47, 93, 1, 251, 206, 2, 224, 59, 93, 1, 234, 255, 2, 224, 59, 93, 1, 226, + 97, 2, 224, 59, 93, 26, 106, 233, 118, 12, 1, 106, 214, 31, 48, 17, 12, + 1, 106, 214, 31, 40, 17, 12, 1, 251, 241, 48, 17, 12, 1, 251, 241, 40, + 17, 12, 1, 251, 241, 70, 17, 12, 1, 251, 241, 138, 17, 12, 1, 226, 81, + 48, 17, 12, 1, 226, 81, 40, 17, 12, 1, 226, 81, 70, 17, 12, 1, 226, 81, + 138, 17, 12, 1, 251, 229, 48, 17, 12, 1, 251, 229, 40, 17, 12, 1, 251, + 229, 70, 17, 12, 1, 251, 229, 138, 17, 12, 1, 216, 108, 48, 17, 12, 1, + 216, 108, 40, 17, 12, 1, 216, 108, 70, 17, 12, 1, 216, 108, 138, 17, 12, + 1, 217, 214, 48, 17, 12, 1, 217, 214, 40, 17, 12, 1, 217, 214, 70, 17, + 12, 1, 217, 214, 138, 17, 12, 1, 216, 110, 48, 17, 12, 1, 216, 110, 40, + 17, 12, 1, 216, 110, 70, 17, 12, 1, 216, 110, 138, 17, 12, 1, 214, 226, + 48, 17, 12, 1, 214, 226, 40, 17, 12, 1, 214, 226, 70, 17, 12, 1, 214, + 226, 138, 17, 12, 1, 226, 79, 48, 17, 12, 1, 226, 79, 40, 17, 12, 1, 226, + 79, 70, 17, 12, 1, 226, 79, 138, 17, 12, 1, 245, 255, 48, 17, 12, 1, 245, + 255, 40, 17, 12, 1, 245, 255, 70, 17, 12, 1, 245, 255, 138, 17, 12, 1, + 228, 15, 48, 17, 12, 1, 228, 15, 40, 17, 12, 1, 228, 15, 70, 17, 12, 1, + 228, 15, 138, 17, 12, 1, 217, 234, 48, 17, 12, 1, 217, 234, 40, 17, 12, + 1, 217, 234, 70, 17, 12, 1, 217, 234, 138, 17, 12, 1, 217, 232, 48, 17, + 12, 1, 217, 232, 40, 17, 12, 1, 217, 232, 70, 17, 12, 1, 217, 232, 138, + 17, 12, 1, 248, 84, 48, 17, 12, 1, 248, 84, 40, 17, 12, 1, 248, 147, 48, + 17, 12, 1, 248, 147, 40, 17, 12, 1, 246, 26, 48, 17, 12, 1, 246, 26, 40, + 17, 12, 1, 248, 82, 48, 17, 12, 1, 248, 82, 40, 17, 12, 1, 235, 122, 48, + 17, 12, 1, 235, 122, 40, 17, 12, 1, 223, 78, 48, 17, 12, 1, 223, 78, 40, + 17, 12, 1, 234, 181, 48, 17, 12, 1, 234, 181, 40, 17, 12, 1, 234, 181, + 70, 17, 12, 1, 234, 181, 138, 17, 12, 1, 243, 98, 48, 17, 12, 1, 243, 98, + 40, 17, 12, 1, 243, 98, 70, 17, 12, 1, 243, 98, 138, 17, 12, 1, 242, 83, + 48, 17, 12, 1, 242, 83, 40, 17, 12, 1, 242, 83, 70, 17, 12, 1, 242, 83, + 138, 17, 12, 1, 229, 89, 48, 17, 12, 1, 229, 89, 40, 17, 12, 1, 229, 89, + 70, 17, 12, 1, 229, 89, 138, 17, 12, 1, 228, 174, 242, 195, 48, 17, 12, + 1, 228, 174, 242, 195, 40, 17, 12, 1, 223, 116, 48, 17, 12, 1, 223, 116, + 40, 17, 12, 1, 223, 116, 70, 17, 12, 1, 223, 116, 138, 17, 12, 1, 241, + 203, 2, 73, 78, 48, 17, 12, 1, 241, 203, 2, 73, 78, 40, 17, 12, 1, 241, + 203, 242, 148, 48, 17, 12, 1, 241, 203, 242, 148, 40, 17, 12, 1, 241, + 203, 242, 148, 70, 17, 12, 1, 241, 203, 242, 148, 138, 17, 12, 1, 241, + 203, 247, 96, 48, 17, 12, 1, 241, 203, 247, 96, 40, 17, 12, 1, 241, 203, + 247, 96, 70, 17, 12, 1, 241, 203, 247, 96, 138, 17, 12, 1, 73, 252, 53, + 48, 17, 12, 1, 73, 252, 53, 40, 17, 12, 1, 73, 252, 53, 2, 192, 78, 48, + 17, 12, 1, 73, 252, 53, 2, 192, 78, 40, 17, 12, 16, 62, 49, 12, 16, 62, + 55, 12, 16, 117, 176, 49, 12, 16, 117, 176, 55, 12, 16, 133, 176, 49, 12, + 16, 133, 176, 55, 12, 16, 133, 176, 225, 141, 246, 58, 49, 12, 16, 133, + 176, 225, 141, 246, 58, 55, 12, 16, 243, 237, 176, 49, 12, 16, 243, 237, + 176, 55, 12, 16, 51, 71, 252, 60, 55, 12, 16, 117, 176, 214, 166, 49, 12, + 16, 117, 176, 214, 166, 55, 12, 16, 223, 130, 12, 16, 3, 218, 30, 49, 12, + 16, 3, 218, 30, 55, 12, 1, 229, 162, 48, 17, 12, 1, 229, 162, 40, 17, 12, + 1, 229, 162, 70, 17, 12, 1, 229, 162, 138, 17, 12, 1, 111, 48, 17, 12, 1, + 111, 40, 17, 12, 1, 227, 100, 48, 17, 12, 1, 227, 100, 40, 17, 12, 1, + 212, 204, 48, 17, 12, 1, 212, 204, 40, 17, 12, 1, 111, 2, 192, 78, 48, + 17, 12, 1, 214, 233, 48, 17, 12, 1, 214, 233, 40, 17, 12, 1, 234, 82, + 227, 100, 48, 17, 12, 1, 234, 82, 227, 100, 40, 17, 12, 1, 234, 82, 212, + 204, 48, 17, 12, 1, 234, 82, 212, 204, 40, 17, 12, 1, 191, 48, 17, 12, 1, + 191, 40, 17, 12, 1, 191, 70, 17, 12, 1, 191, 138, 17, 12, 1, 215, 177, + 234, 192, 234, 82, 106, 210, 70, 17, 12, 1, 215, 177, 234, 192, 234, 82, + 106, 210, 138, 17, 12, 26, 73, 2, 192, 78, 2, 106, 48, 17, 12, 26, 73, 2, + 192, 78, 2, 106, 40, 17, 12, 26, 73, 2, 192, 78, 2, 254, 149, 48, 17, 12, + 26, 73, 2, 192, 78, 2, 254, 149, 40, 17, 12, 26, 73, 2, 192, 78, 2, 214, + 15, 48, 17, 12, 26, 73, 2, 192, 78, 2, 214, 15, 40, 17, 12, 26, 73, 2, + 192, 78, 2, 111, 48, 17, 12, 26, 73, 2, 192, 78, 2, 111, 40, 17, 12, 26, + 73, 2, 192, 78, 2, 227, 100, 48, 17, 12, 26, 73, 2, 192, 78, 2, 227, 100, + 40, 17, 12, 26, 73, 2, 192, 78, 2, 212, 204, 48, 17, 12, 26, 73, 2, 192, + 78, 2, 212, 204, 40, 17, 12, 26, 73, 2, 192, 78, 2, 191, 48, 17, 12, 26, + 73, 2, 192, 78, 2, 191, 40, 17, 12, 26, 73, 2, 192, 78, 2, 191, 70, 17, + 12, 26, 215, 177, 234, 82, 73, 2, 192, 78, 2, 106, 210, 48, 17, 12, 26, + 215, 177, 234, 82, 73, 2, 192, 78, 2, 106, 210, 40, 17, 12, 26, 215, 177, + 234, 82, 73, 2, 192, 78, 2, 106, 210, 70, 17, 12, 1, 244, 136, 73, 48, + 17, 12, 1, 244, 136, 73, 40, 17, 12, 1, 244, 136, 73, 70, 17, 12, 1, 244, + 136, 73, 138, 17, 12, 26, 73, 2, 192, 78, 2, 145, 48, 17, 12, 26, 73, 2, + 192, 78, 2, 121, 48, 17, 12, 26, 73, 2, 192, 78, 2, 63, 48, 17, 12, 26, + 73, 2, 192, 78, 2, 106, 210, 48, 17, 12, 26, 73, 2, 192, 78, 2, 73, 48, + 17, 12, 26, 251, 231, 2, 145, 48, 17, 12, 26, 251, 231, 2, 121, 48, 17, + 12, 26, 251, 231, 2, 234, 136, 48, 17, 12, 26, 251, 231, 2, 63, 48, 17, + 12, 26, 251, 231, 2, 106, 210, 48, 17, 12, 26, 251, 231, 2, 73, 48, 17, + 12, 26, 217, 216, 2, 145, 48, 17, 12, 26, 217, 216, 2, 121, 48, 17, 12, + 26, 217, 216, 2, 234, 136, 48, 17, 12, 26, 217, 216, 2, 63, 48, 17, 12, + 26, 217, 216, 2, 106, 210, 48, 17, 12, 26, 217, 216, 2, 73, 48, 17, 12, + 26, 217, 146, 2, 145, 48, 17, 12, 26, 217, 146, 2, 63, 48, 17, 12, 26, + 217, 146, 2, 106, 210, 48, 17, 12, 26, 217, 146, 2, 73, 48, 17, 12, 26, + 145, 2, 121, 48, 17, 12, 26, 145, 2, 63, 48, 17, 12, 26, 121, 2, 145, 48, + 17, 12, 26, 121, 2, 63, 48, 17, 12, 26, 234, 136, 2, 145, 48, 17, 12, 26, + 234, 136, 2, 121, 48, 17, 12, 26, 234, 136, 2, 63, 48, 17, 12, 26, 222, + 86, 2, 145, 48, 17, 12, 26, 222, 86, 2, 121, 48, 17, 12, 26, 222, 86, 2, + 234, 136, 48, 17, 12, 26, 222, 86, 2, 63, 48, 17, 12, 26, 222, 196, 2, + 121, 48, 17, 12, 26, 222, 196, 2, 63, 48, 17, 12, 26, 248, 160, 2, 145, + 48, 17, 12, 26, 248, 160, 2, 121, 48, 17, 12, 26, 248, 160, 2, 234, 136, + 48, 17, 12, 26, 248, 160, 2, 63, 48, 17, 12, 26, 218, 30, 2, 121, 48, 17, + 12, 26, 218, 30, 2, 63, 48, 17, 12, 26, 212, 105, 2, 63, 48, 17, 12, 26, + 254, 104, 2, 145, 48, 17, 12, 26, 254, 104, 2, 63, 48, 17, 12, 26, 242, + 221, 2, 145, 48, 17, 12, 26, 242, 221, 2, 63, 48, 17, 12, 26, 244, 112, + 2, 145, 48, 17, 12, 26, 244, 112, 2, 121, 48, 17, 12, 26, 244, 112, 2, + 234, 136, 48, 17, 12, 26, 244, 112, 2, 63, 48, 17, 12, 26, 244, 112, 2, + 106, 210, 48, 17, 12, 26, 244, 112, 2, 73, 48, 17, 12, 26, 224, 226, 2, + 121, 48, 17, 12, 26, 224, 226, 2, 63, 48, 17, 12, 26, 224, 226, 2, 106, + 210, 48, 17, 12, 26, 224, 226, 2, 73, 48, 17, 12, 26, 234, 255, 2, 106, + 48, 17, 12, 26, 234, 255, 2, 145, 48, 17, 12, 26, 234, 255, 2, 121, 48, + 17, 12, 26, 234, 255, 2, 234, 136, 48, 17, 12, 26, 234, 255, 2, 233, 127, + 48, 17, 12, 26, 234, 255, 2, 63, 48, 17, 12, 26, 234, 255, 2, 106, 210, + 48, 17, 12, 26, 234, 255, 2, 73, 48, 17, 12, 26, 233, 127, 2, 145, 48, + 17, 12, 26, 233, 127, 2, 121, 48, 17, 12, 26, 233, 127, 2, 234, 136, 48, + 17, 12, 26, 233, 127, 2, 63, 48, 17, 12, 26, 233, 127, 2, 106, 210, 48, + 17, 12, 26, 233, 127, 2, 73, 48, 17, 12, 26, 63, 2, 145, 48, 17, 12, 26, + 63, 2, 121, 48, 17, 12, 26, 63, 2, 234, 136, 48, 17, 12, 26, 63, 2, 63, + 48, 17, 12, 26, 63, 2, 106, 210, 48, 17, 12, 26, 63, 2, 73, 48, 17, 12, + 26, 228, 174, 2, 145, 48, 17, 12, 26, 228, 174, 2, 121, 48, 17, 12, 26, + 228, 174, 2, 234, 136, 48, 17, 12, 26, 228, 174, 2, 63, 48, 17, 12, 26, + 228, 174, 2, 106, 210, 48, 17, 12, 26, 228, 174, 2, 73, 48, 17, 12, 26, + 241, 203, 2, 145, 48, 17, 12, 26, 241, 203, 2, 63, 48, 17, 12, 26, 241, + 203, 2, 106, 210, 48, 17, 12, 26, 241, 203, 2, 73, 48, 17, 12, 26, 73, 2, + 145, 48, 17, 12, 26, 73, 2, 121, 48, 17, 12, 26, 73, 2, 234, 136, 48, 17, + 12, 26, 73, 2, 63, 48, 17, 12, 26, 73, 2, 106, 210, 48, 17, 12, 26, 73, + 2, 73, 48, 17, 12, 26, 217, 156, 2, 218, 223, 106, 48, 17, 12, 26, 223, + 246, 2, 218, 223, 106, 48, 17, 12, 26, 106, 210, 2, 218, 223, 106, 48, + 17, 12, 26, 221, 16, 2, 248, 128, 48, 17, 12, 26, 221, 16, 2, 234, 209, + 48, 17, 12, 26, 221, 16, 2, 244, 134, 48, 17, 12, 26, 221, 16, 2, 248, + 130, 48, 17, 12, 26, 221, 16, 2, 234, 211, 48, 17, 12, 26, 221, 16, 2, + 218, 223, 106, 48, 17, 12, 26, 73, 2, 192, 78, 2, 223, 246, 40, 17, 12, + 26, 73, 2, 192, 78, 2, 212, 102, 40, 17, 12, 26, 73, 2, 192, 78, 2, 63, + 40, 17, 12, 26, 73, 2, 192, 78, 2, 228, 174, 40, 17, 12, 26, 73, 2, 192, + 78, 2, 106, 210, 40, 17, 12, 26, 73, 2, 192, 78, 2, 73, 40, 17, 12, 26, + 251, 231, 2, 223, 246, 40, 17, 12, 26, 251, 231, 2, 212, 102, 40, 17, 12, + 26, 251, 231, 2, 63, 40, 17, 12, 26, 251, 231, 2, 228, 174, 40, 17, 12, + 26, 251, 231, 2, 106, 210, 40, 17, 12, 26, 251, 231, 2, 73, 40, 17, 12, + 26, 217, 216, 2, 223, 246, 40, 17, 12, 26, 217, 216, 2, 212, 102, 40, 17, + 12, 26, 217, 216, 2, 63, 40, 17, 12, 26, 217, 216, 2, 228, 174, 40, 17, + 12, 26, 217, 216, 2, 106, 210, 40, 17, 12, 26, 217, 216, 2, 73, 40, 17, + 12, 26, 217, 146, 2, 223, 246, 40, 17, 12, 26, 217, 146, 2, 212, 102, 40, + 17, 12, 26, 217, 146, 2, 63, 40, 17, 12, 26, 217, 146, 2, 228, 174, 40, + 17, 12, 26, 217, 146, 2, 106, 210, 40, 17, 12, 26, 217, 146, 2, 73, 40, + 17, 12, 26, 244, 112, 2, 106, 210, 40, 17, 12, 26, 244, 112, 2, 73, 40, + 17, 12, 26, 224, 226, 2, 106, 210, 40, 17, 12, 26, 224, 226, 2, 73, 40, + 17, 12, 26, 234, 255, 2, 106, 40, 17, 12, 26, 234, 255, 2, 233, 127, 40, + 17, 12, 26, 234, 255, 2, 63, 40, 17, 12, 26, 234, 255, 2, 106, 210, 40, + 17, 12, 26, 234, 255, 2, 73, 40, 17, 12, 26, 233, 127, 2, 63, 40, 17, 12, + 26, 233, 127, 2, 106, 210, 40, 17, 12, 26, 233, 127, 2, 73, 40, 17, 12, + 26, 63, 2, 106, 40, 17, 12, 26, 63, 2, 63, 40, 17, 12, 26, 228, 174, 2, + 223, 246, 40, 17, 12, 26, 228, 174, 2, 212, 102, 40, 17, 12, 26, 228, + 174, 2, 63, 40, 17, 12, 26, 228, 174, 2, 228, 174, 40, 17, 12, 26, 228, + 174, 2, 106, 210, 40, 17, 12, 26, 228, 174, 2, 73, 40, 17, 12, 26, 106, + 210, 2, 218, 223, 106, 40, 17, 12, 26, 73, 2, 223, 246, 40, 17, 12, 26, + 73, 2, 212, 102, 40, 17, 12, 26, 73, 2, 63, 40, 17, 12, 26, 73, 2, 228, + 174, 40, 17, 12, 26, 73, 2, 106, 210, 40, 17, 12, 26, 73, 2, 73, 40, 17, + 12, 26, 73, 2, 192, 78, 2, 145, 70, 17, 12, 26, 73, 2, 192, 78, 2, 121, + 70, 17, 12, 26, 73, 2, 192, 78, 2, 234, 136, 70, 17, 12, 26, 73, 2, 192, + 78, 2, 63, 70, 17, 12, 26, 73, 2, 192, 78, 2, 241, 203, 70, 17, 12, 26, + 251, 231, 2, 145, 70, 17, 12, 26, 251, 231, 2, 121, 70, 17, 12, 26, 251, + 231, 2, 234, 136, 70, 17, 12, 26, 251, 231, 2, 63, 70, 17, 12, 26, 251, + 231, 2, 241, 203, 70, 17, 12, 26, 217, 216, 2, 145, 70, 17, 12, 26, 217, + 216, 2, 121, 70, 17, 12, 26, 217, 216, 2, 234, 136, 70, 17, 12, 26, 217, + 216, 2, 63, 70, 17, 12, 26, 217, 216, 2, 241, 203, 70, 17, 12, 26, 217, + 146, 2, 63, 70, 17, 12, 26, 145, 2, 121, 70, 17, 12, 26, 145, 2, 63, 70, + 17, 12, 26, 121, 2, 145, 70, 17, 12, 26, 121, 2, 63, 70, 17, 12, 26, 234, + 136, 2, 145, 70, 17, 12, 26, 234, 136, 2, 63, 70, 17, 12, 26, 222, 86, 2, + 145, 70, 17, 12, 26, 222, 86, 2, 121, 70, 17, 12, 26, 222, 86, 2, 234, + 136, 70, 17, 12, 26, 222, 86, 2, 63, 70, 17, 12, 26, 222, 196, 2, 121, + 70, 17, 12, 26, 222, 196, 2, 234, 136, 70, 17, 12, 26, 222, 196, 2, 63, + 70, 17, 12, 26, 248, 160, 2, 145, 70, 17, 12, 26, 248, 160, 2, 121, 70, + 17, 12, 26, 248, 160, 2, 234, 136, 70, 17, 12, 26, 248, 160, 2, 63, 70, + 17, 12, 26, 218, 30, 2, 121, 70, 17, 12, 26, 212, 105, 2, 63, 70, 17, 12, + 26, 254, 104, 2, 145, 70, 17, 12, 26, 254, 104, 2, 63, 70, 17, 12, 26, + 242, 221, 2, 145, 70, 17, 12, 26, 242, 221, 2, 63, 70, 17, 12, 26, 244, + 112, 2, 145, 70, 17, 12, 26, 244, 112, 2, 121, 70, 17, 12, 26, 244, 112, + 2, 234, 136, 70, 17, 12, 26, 244, 112, 2, 63, 70, 17, 12, 26, 224, 226, + 2, 121, 70, 17, 12, 26, 224, 226, 2, 63, 70, 17, 12, 26, 234, 255, 2, + 145, 70, 17, 12, 26, 234, 255, 2, 121, 70, 17, 12, 26, 234, 255, 2, 234, + 136, 70, 17, 12, 26, 234, 255, 2, 233, 127, 70, 17, 12, 26, 234, 255, 2, + 63, 70, 17, 12, 26, 233, 127, 2, 145, 70, 17, 12, 26, 233, 127, 2, 121, + 70, 17, 12, 26, 233, 127, 2, 234, 136, 70, 17, 12, 26, 233, 127, 2, 63, + 70, 17, 12, 26, 233, 127, 2, 241, 203, 70, 17, 12, 26, 63, 2, 145, 70, + 17, 12, 26, 63, 2, 121, 70, 17, 12, 26, 63, 2, 234, 136, 70, 17, 12, 26, + 63, 2, 63, 70, 17, 12, 26, 228, 174, 2, 145, 70, 17, 12, 26, 228, 174, 2, + 121, 70, 17, 12, 26, 228, 174, 2, 234, 136, 70, 17, 12, 26, 228, 174, 2, + 63, 70, 17, 12, 26, 228, 174, 2, 241, 203, 70, 17, 12, 26, 241, 203, 2, + 145, 70, 17, 12, 26, 241, 203, 2, 63, 70, 17, 12, 26, 241, 203, 2, 218, + 223, 106, 70, 17, 12, 26, 73, 2, 145, 70, 17, 12, 26, 73, 2, 121, 70, 17, + 12, 26, 73, 2, 234, 136, 70, 17, 12, 26, 73, 2, 63, 70, 17, 12, 26, 73, + 2, 241, 203, 70, 17, 12, 26, 73, 2, 192, 78, 2, 63, 138, 17, 12, 26, 73, + 2, 192, 78, 2, 241, 203, 138, 17, 12, 26, 251, 231, 2, 63, 138, 17, 12, + 26, 251, 231, 2, 241, 203, 138, 17, 12, 26, 217, 216, 2, 63, 138, 17, 12, + 26, 217, 216, 2, 241, 203, 138, 17, 12, 26, 217, 146, 2, 63, 138, 17, 12, + 26, 217, 146, 2, 241, 203, 138, 17, 12, 26, 222, 86, 2, 63, 138, 17, 12, + 26, 222, 86, 2, 241, 203, 138, 17, 12, 26, 220, 240, 2, 63, 138, 17, 12, + 26, 220, 240, 2, 241, 203, 138, 17, 12, 26, 234, 255, 2, 233, 127, 138, + 17, 12, 26, 234, 255, 2, 63, 138, 17, 12, 26, 233, 127, 2, 63, 138, 17, + 12, 26, 228, 174, 2, 63, 138, 17, 12, 26, 228, 174, 2, 241, 203, 138, 17, + 12, 26, 73, 2, 63, 138, 17, 12, 26, 73, 2, 241, 203, 138, 17, 12, 26, + 221, 16, 2, 244, 134, 138, 17, 12, 26, 221, 16, 2, 248, 130, 138, 17, 12, + 26, 221, 16, 2, 234, 211, 138, 17, 12, 26, 218, 30, 2, 106, 210, 48, 17, + 12, 26, 218, 30, 2, 73, 48, 17, 12, 26, 254, 104, 2, 106, 210, 48, 17, + 12, 26, 254, 104, 2, 73, 48, 17, 12, 26, 242, 221, 2, 106, 210, 48, 17, + 12, 26, 242, 221, 2, 73, 48, 17, 12, 26, 222, 86, 2, 106, 210, 48, 17, + 12, 26, 222, 86, 2, 73, 48, 17, 12, 26, 220, 240, 2, 106, 210, 48, 17, + 12, 26, 220, 240, 2, 73, 48, 17, 12, 26, 121, 2, 106, 210, 48, 17, 12, + 26, 121, 2, 73, 48, 17, 12, 26, 145, 2, 106, 210, 48, 17, 12, 26, 145, 2, + 73, 48, 17, 12, 26, 234, 136, 2, 106, 210, 48, 17, 12, 26, 234, 136, 2, + 73, 48, 17, 12, 26, 222, 196, 2, 106, 210, 48, 17, 12, 26, 222, 196, 2, + 73, 48, 17, 12, 26, 248, 160, 2, 106, 210, 48, 17, 12, 26, 248, 160, 2, + 73, 48, 17, 12, 26, 220, 240, 2, 145, 48, 17, 12, 26, 220, 240, 2, 121, + 48, 17, 12, 26, 220, 240, 2, 234, 136, 48, 17, 12, 26, 220, 240, 2, 63, + 48, 17, 12, 26, 220, 240, 2, 223, 246, 48, 17, 12, 26, 222, 86, 2, 223, + 246, 48, 17, 12, 26, 222, 196, 2, 223, 246, 48, 17, 12, 26, 248, 160, 2, + 223, 246, 48, 17, 12, 26, 218, 30, 2, 106, 210, 40, 17, 12, 26, 218, 30, + 2, 73, 40, 17, 12, 26, 254, 104, 2, 106, 210, 40, 17, 12, 26, 254, 104, + 2, 73, 40, 17, 12, 26, 242, 221, 2, 106, 210, 40, 17, 12, 26, 242, 221, + 2, 73, 40, 17, 12, 26, 222, 86, 2, 106, 210, 40, 17, 12, 26, 222, 86, 2, + 73, 40, 17, 12, 26, 220, 240, 2, 106, 210, 40, 17, 12, 26, 220, 240, 2, + 73, 40, 17, 12, 26, 121, 2, 106, 210, 40, 17, 12, 26, 121, 2, 73, 40, 17, + 12, 26, 145, 2, 106, 210, 40, 17, 12, 26, 145, 2, 73, 40, 17, 12, 26, + 234, 136, 2, 106, 210, 40, 17, 12, 26, 234, 136, 2, 73, 40, 17, 12, 26, + 222, 196, 2, 106, 210, 40, 17, 12, 26, 222, 196, 2, 73, 40, 17, 12, 26, + 248, 160, 2, 106, 210, 40, 17, 12, 26, 248, 160, 2, 73, 40, 17, 12, 26, + 220, 240, 2, 145, 40, 17, 12, 26, 220, 240, 2, 121, 40, 17, 12, 26, 220, + 240, 2, 234, 136, 40, 17, 12, 26, 220, 240, 2, 63, 40, 17, 12, 26, 220, + 240, 2, 223, 246, 40, 17, 12, 26, 222, 86, 2, 223, 246, 40, 17, 12, 26, + 222, 196, 2, 223, 246, 40, 17, 12, 26, 248, 160, 2, 223, 246, 40, 17, 12, + 26, 220, 240, 2, 145, 70, 17, 12, 26, 220, 240, 2, 121, 70, 17, 12, 26, + 220, 240, 2, 234, 136, 70, 17, 12, 26, 220, 240, 2, 63, 70, 17, 12, 26, + 222, 86, 2, 241, 203, 70, 17, 12, 26, 220, 240, 2, 241, 203, 70, 17, 12, + 26, 218, 30, 2, 63, 70, 17, 12, 26, 222, 86, 2, 145, 138, 17, 12, 26, + 222, 86, 2, 121, 138, 17, 12, 26, 222, 86, 2, 234, 136, 138, 17, 12, 26, + 220, 240, 2, 145, 138, 17, 12, 26, 220, 240, 2, 121, 138, 17, 12, 26, + 220, 240, 2, 234, 136, 138, 17, 12, 26, 218, 30, 2, 63, 138, 17, 12, 26, + 212, 105, 2, 63, 138, 17, 12, 26, 106, 2, 244, 132, 40, 17, 12, 26, 106, + 2, 244, 132, 48, 17, 227, 13, 42, 226, 131, 227, 13, 46, 226, 131, 12, + 26, 217, 216, 2, 145, 2, 63, 70, 17, 12, 26, 217, 216, 2, 121, 2, 145, + 40, 17, 12, 26, 217, 216, 2, 121, 2, 145, 70, 17, 12, 26, 217, 216, 2, + 121, 2, 63, 70, 17, 12, 26, 217, 216, 2, 234, 136, 2, 63, 70, 17, 12, 26, + 217, 216, 2, 63, 2, 145, 70, 17, 12, 26, 217, 216, 2, 63, 2, 121, 70, 17, + 12, 26, 217, 216, 2, 63, 2, 234, 136, 70, 17, 12, 26, 145, 2, 63, 2, 121, + 40, 17, 12, 26, 145, 2, 63, 2, 121, 70, 17, 12, 26, 121, 2, 63, 2, 73, + 40, 17, 12, 26, 121, 2, 63, 2, 106, 210, 40, 17, 12, 26, 222, 86, 2, 121, + 2, 145, 70, 17, 12, 26, 222, 86, 2, 145, 2, 121, 70, 17, 12, 26, 222, 86, + 2, 145, 2, 106, 210, 40, 17, 12, 26, 222, 86, 2, 63, 2, 121, 40, 17, 12, + 26, 222, 86, 2, 63, 2, 121, 70, 17, 12, 26, 222, 86, 2, 63, 2, 145, 70, + 17, 12, 26, 222, 86, 2, 63, 2, 63, 40, 17, 12, 26, 222, 86, 2, 63, 2, 63, + 70, 17, 12, 26, 222, 196, 2, 121, 2, 121, 40, 17, 12, 26, 222, 196, 2, + 121, 2, 121, 70, 17, 12, 26, 222, 196, 2, 63, 2, 63, 40, 17, 12, 26, 220, + 240, 2, 121, 2, 63, 40, 17, 12, 26, 220, 240, 2, 121, 2, 63, 70, 17, 12, + 26, 220, 240, 2, 145, 2, 73, 40, 17, 12, 26, 220, 240, 2, 63, 2, 234, + 136, 40, 17, 12, 26, 220, 240, 2, 63, 2, 234, 136, 70, 17, 12, 26, 220, + 240, 2, 63, 2, 63, 40, 17, 12, 26, 220, 240, 2, 63, 2, 63, 70, 17, 12, + 26, 248, 160, 2, 121, 2, 106, 210, 40, 17, 12, 26, 248, 160, 2, 234, 136, + 2, 63, 40, 17, 12, 26, 248, 160, 2, 234, 136, 2, 63, 70, 17, 12, 26, 218, + 30, 2, 63, 2, 121, 40, 17, 12, 26, 218, 30, 2, 63, 2, 121, 70, 17, 12, + 26, 218, 30, 2, 63, 2, 63, 70, 17, 12, 26, 218, 30, 2, 63, 2, 73, 40, 17, + 12, 26, 254, 104, 2, 145, 2, 63, 40, 17, 12, 26, 254, 104, 2, 63, 2, 63, + 40, 17, 12, 26, 254, 104, 2, 63, 2, 63, 70, 17, 12, 26, 254, 104, 2, 63, + 2, 106, 210, 40, 17, 12, 26, 242, 221, 2, 63, 2, 63, 40, 17, 12, 26, 242, + 221, 2, 63, 2, 73, 40, 17, 12, 26, 242, 221, 2, 63, 2, 106, 210, 40, 17, + 12, 26, 244, 112, 2, 234, 136, 2, 63, 40, 17, 12, 26, 244, 112, 2, 234, + 136, 2, 63, 70, 17, 12, 26, 224, 226, 2, 63, 2, 121, 40, 17, 12, 26, 224, + 226, 2, 63, 2, 63, 40, 17, 12, 26, 233, 127, 2, 121, 2, 63, 40, 17, 12, + 26, 233, 127, 2, 121, 2, 73, 40, 17, 12, 26, 233, 127, 2, 121, 2, 106, + 210, 40, 17, 12, 26, 233, 127, 2, 145, 2, 145, 70, 17, 12, 26, 233, 127, + 2, 145, 2, 145, 40, 17, 12, 26, 233, 127, 2, 234, 136, 2, 63, 40, 17, 12, + 26, 233, 127, 2, 234, 136, 2, 63, 70, 17, 12, 26, 233, 127, 2, 63, 2, + 121, 40, 17, 12, 26, 233, 127, 2, 63, 2, 121, 70, 17, 12, 26, 63, 2, 121, + 2, 145, 70, 17, 12, 26, 63, 2, 121, 2, 63, 70, 17, 12, 26, 63, 2, 121, 2, + 73, 40, 17, 12, 26, 63, 2, 145, 2, 121, 70, 17, 12, 26, 63, 2, 145, 2, + 63, 70, 17, 12, 26, 63, 2, 234, 136, 2, 145, 70, 17, 12, 26, 63, 2, 234, + 136, 2, 63, 70, 17, 12, 26, 63, 2, 145, 2, 234, 136, 70, 17, 12, 26, 241, + 203, 2, 63, 2, 145, 70, 17, 12, 26, 241, 203, 2, 63, 2, 63, 70, 17, 12, + 26, 228, 174, 2, 121, 2, 63, 70, 17, 12, 26, 228, 174, 2, 121, 2, 106, + 210, 40, 17, 12, 26, 228, 174, 2, 145, 2, 63, 40, 17, 12, 26, 228, 174, + 2, 145, 2, 63, 70, 17, 12, 26, 228, 174, 2, 145, 2, 106, 210, 40, 17, 12, + 26, 228, 174, 2, 63, 2, 73, 40, 17, 12, 26, 228, 174, 2, 63, 2, 106, 210, + 40, 17, 12, 26, 73, 2, 63, 2, 63, 40, 17, 12, 26, 73, 2, 63, 2, 63, 70, + 17, 12, 26, 251, 231, 2, 234, 136, 2, 73, 40, 17, 12, 26, 217, 216, 2, + 145, 2, 73, 40, 17, 12, 26, 217, 216, 2, 145, 2, 106, 210, 40, 17, 12, + 26, 217, 216, 2, 234, 136, 2, 73, 40, 17, 12, 26, 217, 216, 2, 234, 136, + 2, 106, 210, 40, 17, 12, 26, 217, 216, 2, 63, 2, 73, 40, 17, 12, 26, 217, + 216, 2, 63, 2, 106, 210, 40, 17, 12, 26, 145, 2, 63, 2, 73, 40, 17, 12, + 26, 145, 2, 121, 2, 106, 210, 40, 17, 12, 26, 145, 2, 63, 2, 106, 210, + 40, 17, 12, 26, 222, 86, 2, 234, 136, 2, 106, 210, 40, 17, 12, 26, 222, + 196, 2, 121, 2, 73, 40, 17, 12, 26, 220, 240, 2, 121, 2, 73, 40, 17, 12, + 26, 248, 160, 2, 121, 2, 73, 40, 17, 12, 26, 233, 127, 2, 145, 2, 73, 40, + 17, 12, 26, 233, 127, 2, 63, 2, 73, 40, 17, 12, 26, 73, 2, 121, 2, 73, + 40, 17, 12, 26, 73, 2, 145, 2, 73, 40, 17, 12, 26, 73, 2, 63, 2, 73, 40, + 17, 12, 26, 63, 2, 63, 2, 73, 40, 17, 12, 26, 224, 226, 2, 63, 2, 73, 40, + 17, 12, 26, 228, 174, 2, 121, 2, 73, 40, 17, 12, 26, 224, 226, 2, 63, 2, + 121, 70, 17, 12, 26, 233, 127, 2, 121, 2, 63, 70, 17, 12, 26, 254, 104, + 2, 63, 2, 73, 40, 17, 12, 26, 234, 255, 2, 63, 2, 73, 40, 17, 12, 26, + 228, 174, 2, 145, 2, 121, 70, 17, 12, 26, 63, 2, 234, 136, 2, 73, 40, 17, + 12, 26, 233, 127, 2, 145, 2, 63, 70, 17, 12, 26, 234, 255, 2, 63, 2, 63, + 40, 17, 12, 26, 233, 127, 2, 145, 2, 63, 40, 17, 12, 26, 228, 174, 2, + 145, 2, 121, 40, 17, 12, 26, 145, 2, 121, 2, 73, 40, 17, 12, 26, 121, 2, + 145, 2, 73, 40, 17, 12, 26, 63, 2, 145, 2, 73, 40, 17, 12, 26, 244, 112, + 2, 63, 2, 73, 40, 17, 12, 26, 251, 231, 2, 121, 2, 73, 40, 17, 12, 26, + 234, 255, 2, 63, 2, 63, 70, 17, 12, 26, 254, 104, 2, 145, 2, 63, 70, 17, + 12, 26, 222, 196, 2, 63, 2, 63, 70, 17, 12, 26, 222, 86, 2, 234, 136, 2, + 73, 40, 17, 12, 26, 228, 174, 2, 145, 2, 73, 40, 17, 12, 26, 222, 175, + 215, 102, 253, 153, 234, 13, 219, 70, 5, 48, 17, 12, 26, 224, 222, 215, + 102, 253, 153, 234, 13, 219, 70, 5, 48, 17, 12, 26, 254, 62, 48, 17, 12, + 26, 254, 91, 48, 17, 12, 26, 230, 223, 48, 17, 12, 26, 222, 176, 48, 17, + 12, 26, 224, 35, 48, 17, 12, 26, 254, 80, 48, 17, 12, 26, 214, 33, 48, + 17, 12, 26, 222, 175, 48, 17, 12, 26, 222, 174, 254, 80, 214, 32, 12, 26, + 235, 134, 223, 187, 52, 12, 26, 251, 153, 253, 209, 253, 210, 43, 222, + 76, 43, 221, 221, 43, 221, 153, 43, 221, 142, 43, 221, 131, 43, 221, 120, + 43, 221, 109, 43, 221, 98, 43, 221, 87, 43, 222, 75, 43, 222, 64, 43, + 222, 53, 43, 222, 42, 43, 222, 31, 43, 222, 20, 43, 222, 9, 225, 74, 243, + 245, 31, 71, 249, 157, 225, 74, 243, 245, 31, 71, 105, 249, 157, 225, 74, + 243, 245, 31, 71, 105, 243, 200, 219, 69, 225, 74, 243, 245, 31, 71, 249, + 164, 225, 74, 243, 245, 31, 71, 221, 70, 225, 74, 243, 245, 31, 71, 244, + 254, 77, 225, 74, 243, 245, 31, 71, 224, 158, 77, 225, 74, 243, 245, 31, + 71, 42, 67, 233, 44, 125, 225, 74, 243, 245, 31, 71, 46, 67, 233, 44, + 251, 83, 225, 74, 243, 245, 31, 71, 199, 245, 120, 37, 26, 42, 242, 9, + 37, 26, 46, 242, 9, 37, 51, 217, 43, 42, 242, 9, 37, 51, 217, 43, 46, + 242, 9, 37, 232, 38, 42, 242, 9, 37, 232, 38, 46, 242, 9, 37, 249, 137, + 232, 37, 225, 74, 243, 245, 31, 71, 117, 62, 233, 80, 225, 74, 243, 245, + 31, 71, 245, 118, 248, 101, 225, 74, 243, 245, 31, 71, 245, 109, 248, + 101, 225, 74, 243, 245, 31, 71, 115, 232, 242, 225, 74, 243, 245, 31, 71, + 214, 16, 115, 232, 242, 225, 74, 243, 245, 31, 71, 42, 226, 131, 225, 74, + 243, 245, 31, 71, 46, 226, 131, 225, 74, 243, 245, 31, 71, 42, 249, 40, + 125, 225, 74, 243, 245, 31, 71, 46, 249, 40, 125, 225, 74, 243, 245, 31, + 71, 42, 216, 219, 220, 233, 125, 225, 74, 243, 245, 31, 71, 46, 216, 219, + 220, 233, 125, 225, 74, 243, 245, 31, 71, 42, 83, 233, 44, 125, 225, 74, + 243, 245, 31, 71, 46, 83, 233, 44, 125, 225, 74, 243, 245, 31, 71, 42, + 51, 254, 19, 125, 225, 74, 243, 245, 31, 71, 46, 51, 254, 19, 125, 225, + 74, 243, 245, 31, 71, 42, 254, 19, 125, 225, 74, 243, 245, 31, 71, 46, + 254, 19, 125, 225, 74, 243, 245, 31, 71, 42, 249, 100, 125, 225, 74, 243, + 245, 31, 71, 46, 249, 100, 125, 225, 74, 243, 245, 31, 71, 42, 67, 249, + 100, 125, 225, 74, 243, 245, 31, 71, 46, 67, 249, 100, 125, 221, 52, 247, + 74, 67, 221, 52, 247, 74, 225, 74, 243, 245, 31, 71, 42, 41, 125, 225, + 74, 243, 245, 31, 71, 46, 41, 125, 248, 100, 226, 243, 250, 106, 226, + 243, 214, 16, 226, 243, 51, 214, 16, 226, 243, 248, 100, 115, 232, 242, + 250, 106, 115, 232, 242, 214, 16, 115, 232, 242, 3, 249, 157, 3, 105, + 249, 157, 3, 243, 200, 219, 69, 3, 221, 70, 3, 249, 164, 3, 224, 158, 77, + 3, 244, 254, 77, 3, 245, 118, 248, 101, 3, 42, 226, 131, 3, 46, 226, 131, + 3, 42, 249, 40, 125, 3, 46, 249, 40, 125, 3, 42, 216, 219, 220, 233, 125, + 3, 46, 216, 219, 220, 233, 125, 3, 50, 52, 3, 254, 35, 3, 253, 132, 3, + 94, 52, 3, 240, 159, 3, 233, 39, 52, 3, 242, 107, 52, 3, 245, 61, 52, 3, + 223, 203, 219, 231, 3, 247, 86, 52, 3, 226, 57, 52, 3, 249, 156, 253, + 122, 12, 244, 132, 48, 17, 12, 217, 251, 2, 244, 132, 49, 12, 248, 128, + 48, 17, 12, 218, 28, 243, 227, 12, 234, 209, 48, 17, 12, 244, 134, 48, + 17, 12, 244, 134, 138, 17, 12, 248, 130, 48, 17, 12, 248, 130, 138, 17, + 12, 234, 211, 48, 17, 12, 234, 211, 138, 17, 12, 221, 16, 48, 17, 12, + 221, 16, 138, 17, 12, 218, 247, 48, 17, 12, 218, 247, 138, 17, 12, 1, + 192, 48, 17, 12, 1, 106, 2, 232, 33, 78, 48, 17, 12, 1, 106, 2, 232, 33, + 78, 40, 17, 12, 1, 106, 2, 192, 78, 48, 17, 12, 1, 106, 2, 192, 78, 40, + 17, 12, 1, 214, 15, 2, 192, 78, 48, 17, 12, 1, 214, 15, 2, 192, 78, 40, + 17, 12, 1, 106, 2, 192, 251, 220, 48, 17, 12, 1, 106, 2, 192, 251, 220, + 40, 17, 12, 1, 73, 2, 192, 78, 48, 17, 12, 1, 73, 2, 192, 78, 40, 17, 12, + 1, 73, 2, 192, 78, 70, 17, 12, 1, 73, 2, 192, 78, 138, 17, 12, 1, 106, + 48, 17, 12, 1, 106, 40, 17, 12, 1, 251, 231, 48, 17, 12, 1, 251, 231, 40, + 17, 12, 1, 251, 231, 70, 17, 12, 1, 251, 231, 138, 17, 12, 1, 217, 216, + 231, 228, 48, 17, 12, 1, 217, 216, 231, 228, 40, 17, 12, 1, 217, 216, 48, + 17, 12, 1, 217, 216, 40, 17, 12, 1, 217, 216, 70, 17, 12, 1, 217, 216, + 138, 17, 12, 1, 217, 146, 48, 17, 12, 1, 217, 146, 40, 17, 12, 1, 217, + 146, 70, 17, 12, 1, 217, 146, 138, 17, 12, 1, 145, 48, 17, 12, 1, 145, + 40, 17, 12, 1, 145, 70, 17, 12, 1, 145, 138, 17, 12, 1, 121, 48, 17, 12, + 1, 121, 40, 17, 12, 1, 121, 70, 17, 12, 1, 121, 138, 17, 12, 1, 234, 136, + 48, 17, 12, 1, 234, 136, 40, 17, 12, 1, 234, 136, 70, 17, 12, 1, 234, + 136, 138, 17, 12, 1, 248, 141, 48, 17, 12, 1, 248, 141, 40, 17, 12, 1, + 217, 156, 48, 17, 12, 1, 217, 156, 40, 17, 12, 1, 223, 246, 48, 17, 12, + 1, 223, 246, 40, 17, 12, 1, 212, 102, 48, 17, 12, 1, 212, 102, 40, 17, + 12, 1, 222, 86, 48, 17, 12, 1, 222, 86, 40, 17, 12, 1, 222, 86, 70, 17, + 12, 1, 222, 86, 138, 17, 12, 1, 220, 240, 48, 17, 12, 1, 220, 240, 40, + 17, 12, 1, 220, 240, 70, 17, 12, 1, 220, 240, 138, 17, 12, 1, 222, 196, + 48, 17, 12, 1, 222, 196, 40, 17, 12, 1, 222, 196, 70, 17, 12, 1, 222, + 196, 138, 17, 12, 1, 248, 160, 48, 17, 12, 1, 248, 160, 40, 17, 12, 1, + 248, 160, 70, 17, 12, 1, 248, 160, 138, 17, 12, 1, 218, 30, 48, 17, 12, + 1, 218, 30, 40, 17, 12, 1, 218, 30, 70, 17, 12, 1, 218, 30, 138, 17, 12, + 1, 212, 105, 48, 17, 12, 1, 212, 105, 40, 17, 12, 1, 212, 105, 70, 17, + 12, 1, 212, 105, 138, 17, 12, 1, 254, 104, 48, 17, 12, 1, 254, 104, 40, + 17, 12, 1, 254, 104, 70, 17, 12, 1, 254, 104, 138, 17, 12, 1, 242, 221, + 48, 17, 12, 1, 242, 221, 40, 17, 12, 1, 242, 221, 70, 17, 12, 1, 242, + 221, 138, 17, 12, 1, 244, 112, 48, 17, 12, 1, 244, 112, 40, 17, 12, 1, + 244, 112, 70, 17, 12, 1, 244, 112, 138, 17, 12, 1, 224, 226, 48, 17, 12, + 1, 224, 226, 40, 17, 12, 1, 224, 226, 70, 17, 12, 1, 224, 226, 138, 17, + 12, 1, 234, 255, 48, 17, 12, 1, 234, 255, 40, 17, 12, 1, 234, 255, 70, + 17, 12, 1, 234, 255, 138, 17, 12, 1, 233, 127, 48, 17, 12, 1, 233, 127, + 40, 17, 12, 1, 233, 127, 70, 17, 12, 1, 233, 127, 138, 17, 12, 1, 63, 48, + 17, 12, 1, 63, 40, 17, 12, 1, 63, 70, 17, 12, 1, 63, 138, 17, 12, 1, 228, + 174, 48, 17, 12, 1, 228, 174, 40, 17, 12, 1, 228, 174, 70, 17, 12, 1, + 228, 174, 138, 17, 12, 1, 241, 203, 48, 17, 12, 1, 241, 203, 40, 17, 12, + 1, 241, 203, 70, 17, 12, 1, 241, 203, 138, 17, 12, 1, 214, 15, 48, 17, + 12, 1, 214, 15, 40, 17, 12, 1, 106, 210, 48, 17, 12, 1, 106, 210, 40, 17, + 12, 1, 73, 48, 17, 12, 1, 73, 40, 17, 12, 1, 73, 70, 17, 12, 1, 73, 138, + 17, 12, 26, 233, 127, 2, 106, 2, 232, 33, 78, 48, 17, 12, 26, 233, 127, + 2, 106, 2, 232, 33, 78, 40, 17, 12, 26, 233, 127, 2, 106, 2, 192, 78, 48, + 17, 12, 26, 233, 127, 2, 106, 2, 192, 78, 40, 17, 12, 26, 233, 127, 2, + 106, 2, 192, 251, 220, 48, 17, 12, 26, 233, 127, 2, 106, 2, 192, 251, + 220, 40, 17, 12, 26, 233, 127, 2, 106, 48, 17, 12, 26, 233, 127, 2, 106, + 40, 17, 212, 80, 213, 230, 228, 184, 219, 206, 120, 244, 254, 77, 120, + 224, 143, 77, 120, 50, 52, 120, 247, 86, 52, 120, 226, 57, 52, 120, 254, + 35, 120, 253, 226, 120, 42, 226, 131, 120, 46, 226, 131, 120, 253, 132, + 120, 94, 52, 120, 249, 157, 120, 240, 159, 120, 243, 200, 219, 69, 120, + 219, 231, 120, 21, 212, 79, 120, 21, 116, 120, 21, 109, 120, 21, 166, + 120, 21, 163, 120, 21, 180, 120, 21, 189, 120, 21, 198, 120, 21, 195, + 120, 21, 200, 120, 249, 164, 120, 221, 70, 120, 233, 39, 52, 120, 245, + 61, 52, 120, 242, 107, 52, 120, 224, 158, 77, 120, 249, 156, 253, 122, + 120, 7, 6, 1, 61, 120, 7, 6, 1, 253, 74, 120, 7, 6, 1, 250, 252, 120, 7, + 6, 1, 249, 3, 120, 7, 6, 1, 74, 120, 7, 6, 1, 244, 230, 120, 7, 6, 1, + 243, 177, 120, 7, 6, 1, 242, 41, 120, 7, 6, 1, 72, 120, 7, 6, 1, 235, + 142, 120, 7, 6, 1, 235, 27, 120, 7, 6, 1, 150, 120, 7, 6, 1, 183, 120, 7, + 6, 1, 204, 120, 7, 6, 1, 75, 120, 7, 6, 1, 226, 229, 120, 7, 6, 1, 224, + 240, 120, 7, 6, 1, 149, 120, 7, 6, 1, 197, 120, 7, 6, 1, 218, 99, 120, 7, + 6, 1, 69, 120, 7, 6, 1, 215, 79, 120, 7, 6, 1, 214, 82, 120, 7, 6, 1, + 213, 166, 120, 7, 6, 1, 213, 105, 120, 7, 6, 1, 212, 152, 120, 42, 41, + 125, 120, 223, 203, 219, 231, 120, 46, 41, 125, 120, 249, 224, 254, 174, + 120, 115, 232, 242, 120, 242, 114, 254, 174, 120, 7, 3, 1, 61, 120, 7, 3, + 1, 253, 74, 120, 7, 3, 1, 250, 252, 120, 7, 3, 1, 249, 3, 120, 7, 3, 1, + 74, 120, 7, 3, 1, 244, 230, 120, 7, 3, 1, 243, 177, 120, 7, 3, 1, 242, + 41, 120, 7, 3, 1, 72, 120, 7, 3, 1, 235, 142, 120, 7, 3, 1, 235, 27, 120, + 7, 3, 1, 150, 120, 7, 3, 1, 183, 120, 7, 3, 1, 204, 120, 7, 3, 1, 75, + 120, 7, 3, 1, 226, 229, 120, 7, 3, 1, 224, 240, 120, 7, 3, 1, 149, 120, + 7, 3, 1, 197, 120, 7, 3, 1, 218, 99, 120, 7, 3, 1, 69, 120, 7, 3, 1, 215, + 79, 120, 7, 3, 1, 214, 82, 120, 7, 3, 1, 213, 166, 120, 7, 3, 1, 213, + 105, 120, 7, 3, 1, 212, 152, 120, 42, 249, 40, 125, 120, 71, 232, 242, + 120, 46, 249, 40, 125, 120, 217, 42, 120, 42, 67, 226, 131, 120, 46, 67, + 226, 131, 98, 105, 243, 200, 219, 69, 98, 42, 249, 100, 125, 98, 46, 249, + 100, 125, 98, 105, 249, 157, 98, 56, 231, 37, 247, 74, 98, 56, 1, 213, + 214, 98, 56, 1, 3, 61, 98, 56, 1, 3, 72, 98, 56, 1, 3, 69, 98, 56, 1, 3, + 74, 98, 56, 1, 3, 75, 98, 56, 1, 3, 186, 98, 56, 1, 3, 212, 203, 98, 56, + 1, 3, 212, 235, 98, 56, 1, 3, 216, 82, 98, 234, 206, 225, 57, 219, 218, + 77, 98, 56, 1, 61, 98, 56, 1, 72, 98, 56, 1, 69, 98, 56, 1, 74, 98, 56, + 1, 75, 98, 56, 1, 181, 98, 56, 1, 234, 101, 98, 56, 1, 233, 238, 98, 56, + 1, 234, 188, 98, 56, 1, 234, 37, 98, 56, 1, 222, 202, 98, 56, 1, 220, + 117, 98, 56, 1, 219, 27, 98, 56, 1, 222, 100, 98, 56, 1, 219, 242, 98, + 56, 1, 218, 52, 98, 56, 1, 217, 71, 98, 56, 1, 216, 82, 98, 56, 1, 217, + 229, 98, 56, 1, 108, 98, 56, 1, 205, 98, 56, 1, 229, 64, 98, 56, 1, 228, + 92, 98, 56, 1, 229, 187, 98, 56, 1, 228, 185, 98, 56, 1, 159, 98, 56, 1, + 241, 165, 98, 56, 1, 240, 212, 98, 56, 1, 241, 222, 98, 56, 1, 241, 54, + 98, 56, 1, 188, 98, 56, 1, 231, 42, 98, 56, 1, 230, 172, 98, 56, 1, 231, + 156, 98, 56, 1, 230, 231, 98, 56, 1, 186, 98, 56, 1, 212, 203, 98, 56, 1, + 212, 235, 98, 56, 1, 203, 98, 56, 1, 223, 188, 98, 56, 1, 223, 51, 98, + 56, 1, 224, 21, 98, 56, 1, 223, 112, 98, 56, 1, 214, 49, 98, 56, 1, 204, + 98, 56, 214, 116, 219, 218, 77, 98, 56, 221, 75, 219, 218, 77, 98, 23, + 244, 72, 98, 23, 1, 234, 67, 98, 23, 1, 219, 150, 98, 23, 1, 234, 60, 98, + 23, 1, 229, 57, 98, 23, 1, 229, 55, 98, 23, 1, 229, 54, 98, 23, 1, 217, + 55, 98, 23, 1, 219, 139, 98, 23, 1, 223, 179, 98, 23, 1, 223, 174, 98, + 23, 1, 223, 171, 98, 23, 1, 223, 164, 98, 23, 1, 223, 159, 98, 23, 1, + 223, 154, 98, 23, 1, 223, 165, 98, 23, 1, 223, 177, 98, 23, 1, 231, 30, + 98, 23, 1, 225, 227, 98, 23, 1, 219, 147, 98, 23, 1, 225, 216, 98, 23, 1, + 220, 76, 98, 23, 1, 219, 144, 98, 23, 1, 236, 51, 98, 23, 1, 249, 239, + 98, 23, 1, 219, 154, 98, 23, 1, 250, 43, 98, 23, 1, 234, 116, 98, 23, 1, + 217, 126, 98, 23, 1, 226, 7, 98, 23, 1, 241, 158, 98, 23, 1, 61, 98, 23, + 1, 254, 148, 98, 23, 1, 186, 98, 23, 1, 213, 80, 98, 23, 1, 245, 76, 98, + 23, 1, 74, 98, 23, 1, 213, 27, 98, 23, 1, 213, 38, 98, 23, 1, 75, 98, 23, + 1, 214, 49, 98, 23, 1, 214, 46, 98, 23, 1, 227, 99, 98, 23, 1, 212, 235, + 98, 23, 1, 69, 98, 23, 1, 213, 252, 98, 23, 1, 214, 6, 98, 23, 1, 213, + 235, 98, 23, 1, 212, 203, 98, 23, 1, 245, 22, 98, 23, 1, 212, 255, 98, + 23, 1, 72, 120, 250, 110, 52, 120, 225, 108, 52, 120, 228, 163, 52, 120, + 232, 37, 120, 251, 63, 134, 120, 213, 31, 52, 120, 213, 204, 52, 98, 243, + 243, 177, 214, 216, 98, 132, 68, 98, 215, 124, 68, 98, 95, 68, 98, 246, + 58, 68, 98, 83, 219, 166, 98, 67, 249, 228, 235, 201, 254, 10, 254, 29, + 235, 201, 254, 10, 221, 57, 235, 201, 254, 10, 217, 189, 227, 113, 223, + 224, 250, 78, 223, 224, 250, 78, 58, 54, 4, 253, 58, 61, 58, 54, 4, 253, + 27, 74, 58, 54, 4, 253, 36, 72, 58, 54, 4, 253, 4, 75, 58, 54, 4, 253, + 54, 69, 58, 54, 4, 253, 73, 248, 164, 58, 54, 4, 253, 20, 248, 41, 58, + 54, 4, 253, 60, 247, 211, 58, 54, 4, 253, 50, 247, 99, 58, 54, 4, 253, + 14, 246, 33, 58, 54, 4, 253, 8, 235, 139, 58, 54, 4, 253, 19, 235, 127, + 58, 54, 4, 253, 29, 235, 71, 58, 54, 4, 253, 0, 235, 54, 58, 54, 4, 252, + 244, 181, 58, 54, 4, 253, 21, 234, 188, 58, 54, 4, 252, 254, 234, 101, + 58, 54, 4, 252, 251, 234, 37, 58, 54, 4, 252, 240, 233, 238, 58, 54, 4, + 252, 241, 188, 58, 54, 4, 253, 51, 231, 156, 58, 54, 4, 252, 248, 231, + 42, 58, 54, 4, 253, 49, 230, 231, 58, 54, 4, 253, 41, 230, 172, 58, 54, + 4, 253, 62, 205, 58, 54, 4, 253, 40, 229, 187, 58, 54, 4, 253, 34, 229, + 64, 58, 54, 4, 253, 13, 228, 185, 58, 54, 4, 253, 10, 228, 92, 58, 54, 4, + 253, 69, 193, 58, 54, 4, 252, 249, 226, 96, 58, 54, 4, 253, 26, 225, 240, + 58, 54, 4, 253, 53, 225, 150, 58, 54, 4, 253, 15, 225, 35, 58, 54, 4, + 253, 48, 224, 232, 58, 54, 4, 252, 243, 224, 213, 58, 54, 4, 253, 43, + 224, 198, 58, 54, 4, 253, 32, 224, 187, 58, 54, 4, 253, 5, 203, 58, 54, + 4, 253, 37, 224, 21, 58, 54, 4, 253, 12, 223, 188, 58, 54, 4, 253, 71, + 223, 112, 58, 54, 4, 253, 38, 223, 51, 58, 54, 4, 253, 33, 222, 202, 58, + 54, 4, 253, 56, 222, 100, 58, 54, 4, 253, 24, 220, 117, 58, 54, 4, 253, + 52, 219, 242, 58, 54, 4, 253, 7, 219, 27, 58, 54, 4, 253, 6, 218, 52, 58, + 54, 4, 253, 67, 217, 229, 58, 54, 4, 253, 28, 217, 71, 58, 54, 4, 253, + 65, 108, 58, 54, 4, 252, 252, 216, 82, 58, 54, 4, 253, 11, 214, 49, 58, + 54, 4, 252, 246, 214, 6, 58, 54, 4, 253, 25, 213, 235, 58, 54, 4, 253, + 23, 213, 214, 58, 54, 4, 253, 47, 212, 109, 58, 54, 4, 252, 247, 212, 87, + 58, 54, 4, 253, 44, 212, 16, 58, 54, 4, 253, 39, 254, 234, 58, 54, 4, + 253, 22, 254, 233, 58, 54, 4, 252, 237, 253, 108, 58, 54, 4, 252, 250, + 246, 1, 58, 54, 4, 252, 233, 246, 0, 58, 54, 4, 253, 17, 228, 31, 58, 54, + 4, 253, 35, 225, 34, 58, 54, 4, 253, 3, 225, 37, 58, 54, 4, 252, 245, + 224, 76, 58, 54, 4, 253, 31, 224, 75, 58, 54, 4, 252, 253, 223, 111, 58, + 54, 4, 252, 255, 218, 50, 58, 54, 4, 252, 235, 216, 43, 58, 54, 4, 252, + 232, 109, 58, 54, 16, 253, 46, 58, 54, 16, 253, 45, 58, 54, 16, 253, 42, + 58, 54, 16, 253, 30, 58, 54, 16, 253, 18, 58, 54, 16, 253, 16, 58, 54, + 16, 253, 9, 58, 54, 16, 253, 2, 58, 54, 16, 253, 1, 58, 54, 16, 252, 242, + 58, 54, 16, 252, 239, 58, 54, 16, 252, 238, 58, 54, 16, 252, 236, 58, 54, + 16, 252, 234, 58, 54, 102, 252, 231, 231, 248, 58, 54, 102, 252, 230, + 213, 208, 58, 54, 102, 252, 229, 248, 25, 58, 54, 102, 252, 228, 245, 58, + 58, 54, 102, 252, 227, 231, 222, 58, 54, 102, 252, 226, 219, 101, 58, 54, + 102, 252, 225, 245, 4, 58, 54, 102, 252, 224, 224, 45, 58, 54, 102, 252, + 223, 220, 242, 58, 54, 102, 252, 222, 241, 221, 58, 54, 102, 252, 221, + 219, 212, 58, 54, 102, 252, 220, 251, 126, 58, 54, 102, 252, 219, 249, + 84, 58, 54, 102, 252, 218, 251, 44, 58, 54, 102, 252, 217, 213, 243, 58, + 54, 102, 252, 216, 252, 56, 58, 54, 102, 252, 215, 227, 71, 58, 54, 102, + 252, 214, 219, 186, 58, 54, 102, 252, 213, 249, 11, 58, 54, 230, 212, + 252, 212, 234, 229, 58, 54, 230, 212, 252, 211, 234, 237, 58, 54, 102, + 252, 210, 227, 84, 58, 54, 102, 252, 209, 213, 221, 58, 54, 102, 252, + 208, 58, 54, 230, 212, 252, 207, 253, 188, 58, 54, 230, 212, 252, 206, + 231, 116, 58, 54, 102, 252, 205, 251, 62, 58, 54, 102, 252, 204, 242, + 142, 58, 54, 102, 252, 203, 58, 54, 102, 252, 202, 213, 199, 58, 54, 102, + 252, 201, 58, 54, 102, 252, 200, 58, 54, 102, 252, 199, 240, 235, 58, 54, + 102, 252, 198, 58, 54, 102, 252, 197, 58, 54, 102, 252, 196, 58, 54, 230, + 212, 252, 194, 216, 56, 58, 54, 102, 252, 193, 58, 54, 102, 252, 192, 58, + 54, 102, 252, 191, 249, 187, 58, 54, 102, 252, 190, 58, 54, 102, 252, + 189, 58, 54, 102, 252, 188, 243, 69, 58, 54, 102, 252, 187, 253, 175, 58, + 54, 102, 252, 186, 58, 54, 102, 252, 185, 58, 54, 102, 252, 184, 58, 54, + 102, 252, 183, 58, 54, 102, 252, 182, 58, 54, 102, 252, 181, 58, 54, 102, + 252, 180, 58, 54, 102, 252, 179, 58, 54, 102, 252, 178, 58, 54, 102, 252, + 177, 230, 204, 58, 54, 102, 252, 176, 58, 54, 102, 252, 175, 216, 193, + 58, 54, 102, 252, 174, 58, 54, 102, 252, 173, 58, 54, 102, 252, 172, 58, + 54, 102, 252, 171, 58, 54, 102, 252, 170, 58, 54, 102, 252, 169, 58, 54, + 102, 252, 168, 58, 54, 102, 252, 167, 58, 54, 102, 252, 166, 58, 54, 102, + 252, 165, 58, 54, 102, 252, 164, 58, 54, 102, 252, 163, 241, 195, 58, 54, + 102, 252, 142, 243, 253, 58, 54, 102, 252, 139, 252, 36, 58, 54, 102, + 252, 134, 219, 193, 58, 54, 102, 252, 133, 68, 58, 54, 102, 252, 132, 58, + 54, 102, 252, 131, 218, 181, 58, 54, 102, 252, 130, 58, 54, 102, 252, + 129, 58, 54, 102, 252, 128, 213, 239, 250, 75, 58, 54, 102, 252, 127, + 250, 75, 58, 54, 102, 252, 126, 250, 76, 243, 225, 58, 54, 102, 252, 125, + 213, 241, 58, 54, 102, 252, 124, 58, 54, 102, 252, 123, 58, 54, 230, 212, + 252, 122, 247, 150, 58, 54, 102, 252, 121, 58, 54, 102, 252, 120, 58, 54, + 102, 252, 118, 58, 54, 102, 252, 117, 58, 54, 102, 252, 116, 58, 54, 102, + 252, 115, 248, 104, 58, 54, 102, 252, 114, 58, 54, 102, 252, 113, 58, 54, + 102, 252, 112, 58, 54, 102, 252, 111, 58, 54, 102, 252, 110, 58, 54, 102, + 214, 163, 252, 195, 58, 54, 102, 214, 163, 252, 162, 58, 54, 102, 214, + 163, 252, 161, 58, 54, 102, 214, 163, 252, 160, 58, 54, 102, 214, 163, + 252, 159, 58, 54, 102, 214, 163, 252, 158, 58, 54, 102, 214, 163, 252, + 157, 58, 54, 102, 214, 163, 252, 156, 58, 54, 102, 214, 163, 252, 155, + 58, 54, 102, 214, 163, 252, 154, 58, 54, 102, 214, 163, 252, 153, 58, 54, + 102, 214, 163, 252, 152, 58, 54, 102, 214, 163, 252, 151, 58, 54, 102, + 214, 163, 252, 150, 58, 54, 102, 214, 163, 252, 149, 58, 54, 102, 214, + 163, 252, 148, 58, 54, 102, 214, 163, 252, 147, 58, 54, 102, 214, 163, + 252, 146, 58, 54, 102, 214, 163, 252, 145, 58, 54, 102, 214, 163, 252, + 144, 58, 54, 102, 214, 163, 252, 143, 58, 54, 102, 214, 163, 252, 141, + 58, 54, 102, 214, 163, 252, 140, 58, 54, 102, 214, 163, 252, 138, 58, 54, + 102, 214, 163, 252, 137, 58, 54, 102, 214, 163, 252, 136, 58, 54, 102, + 214, 163, 252, 135, 58, 54, 102, 214, 163, 252, 119, 58, 54, 102, 214, + 163, 252, 109, 254, 141, 213, 196, 221, 58, 232, 242, 254, 141, 213, 196, + 221, 58, 247, 74, 254, 141, 250, 66, 77, 254, 141, 50, 116, 254, 141, 50, + 109, 254, 141, 50, 166, 254, 141, 50, 163, 254, 141, 50, 180, 254, 141, + 50, 189, 254, 141, 50, 198, 254, 141, 50, 195, 254, 141, 50, 200, 254, + 141, 50, 217, 200, 254, 141, 50, 216, 38, 254, 141, 50, 217, 115, 254, + 141, 50, 243, 240, 254, 141, 50, 244, 83, 254, 141, 50, 220, 39, 254, + 141, 50, 221, 37, 254, 141, 50, 245, 141, 254, 141, 50, 229, 26, 254, + 141, 50, 122, 240, 200, 254, 141, 50, 117, 240, 200, 254, 141, 50, 133, + 240, 200, 254, 141, 50, 243, 237, 240, 200, 254, 141, 50, 244, 50, 240, + 200, 254, 141, 50, 220, 53, 240, 200, 254, 141, 50, 221, 43, 240, 200, + 254, 141, 50, 245, 150, 240, 200, 254, 141, 50, 229, 31, 240, 200, 254, + 141, 50, 122, 217, 100, 254, 141, 50, 117, 217, 100, 254, 141, 50, 133, + 217, 100, 254, 141, 50, 243, 237, 217, 100, 254, 141, 50, 244, 50, 217, + 100, 254, 141, 50, 220, 53, 217, 100, 254, 141, 50, 221, 43, 217, 100, + 254, 141, 50, 245, 150, 217, 100, 254, 141, 50, 229, 31, 217, 100, 254, + 141, 50, 217, 201, 217, 100, 254, 141, 50, 216, 39, 217, 100, 254, 141, + 50, 217, 116, 217, 100, 254, 141, 50, 243, 241, 217, 100, 254, 141, 50, + 244, 84, 217, 100, 254, 141, 50, 220, 40, 217, 100, 254, 141, 50, 221, + 38, 217, 100, 254, 141, 50, 245, 142, 217, 100, 254, 141, 50, 229, 27, + 217, 100, 254, 141, 213, 255, 252, 48, 215, 144, 254, 141, 213, 255, 244, + 61, 219, 4, 254, 141, 213, 255, 222, 95, 219, 4, 254, 141, 213, 255, 217, + 122, 219, 4, 254, 141, 213, 255, 243, 230, 219, 4, 254, 141, 246, 36, + 231, 155, 244, 61, 219, 4, 254, 141, 232, 228, 231, 155, 244, 61, 219, 4, + 254, 141, 231, 155, 222, 95, 219, 4, 254, 141, 231, 155, 217, 122, 219, + 4, 25, 254, 167, 253, 110, 122, 224, 166, 25, 254, 167, 253, 110, 122, + 242, 9, 25, 254, 167, 253, 110, 122, 246, 54, 25, 254, 167, 253, 110, + 180, 25, 254, 167, 253, 110, 244, 83, 25, 254, 167, 253, 110, 244, 50, + 240, 200, 25, 254, 167, 253, 110, 244, 50, 217, 100, 25, 254, 167, 253, + 110, 244, 84, 217, 100, 25, 254, 167, 253, 110, 244, 50, 218, 18, 25, + 254, 167, 253, 110, 217, 201, 218, 18, 25, 254, 167, 253, 110, 244, 84, + 218, 18, 25, 254, 167, 253, 110, 122, 240, 201, 218, 18, 25, 254, 167, + 253, 110, 244, 50, 240, 201, 218, 18, 25, 254, 167, 253, 110, 122, 217, + 101, 218, 18, 25, 254, 167, 253, 110, 244, 50, 217, 101, 218, 18, 25, + 254, 167, 253, 110, 244, 50, 219, 90, 25, 254, 167, 253, 110, 217, 201, + 219, 90, 25, 254, 167, 253, 110, 244, 84, 219, 90, 25, 254, 167, 253, + 110, 122, 240, 201, 219, 90, 25, 254, 167, 253, 110, 244, 50, 240, 201, + 219, 90, 25, 254, 167, 253, 110, 122, 217, 101, 219, 90, 25, 254, 167, + 253, 110, 217, 201, 217, 101, 219, 90, 25, 254, 167, 253, 110, 244, 84, + 217, 101, 219, 90, 25, 254, 167, 253, 110, 217, 201, 230, 234, 25, 254, + 167, 241, 189, 122, 225, 164, 25, 254, 167, 217, 134, 116, 25, 254, 167, + 241, 186, 116, 25, 254, 167, 245, 67, 109, 25, 254, 167, 217, 134, 109, + 25, 254, 167, 249, 8, 117, 246, 53, 25, 254, 167, 245, 67, 117, 246, 53, + 25, 254, 167, 216, 161, 180, 25, 254, 167, 216, 161, 217, 200, 25, 254, + 167, 216, 161, 217, 201, 254, 50, 17, 25, 254, 167, 241, 186, 217, 200, + 25, 254, 167, 231, 108, 217, 200, 25, 254, 167, 217, 134, 217, 200, 25, + 254, 167, 217, 134, 217, 115, 25, 254, 167, 216, 161, 244, 83, 25, 254, + 167, 216, 161, 244, 84, 254, 50, 17, 25, 254, 167, 241, 186, 244, 83, 25, + 254, 167, 217, 134, 244, 83, 25, 254, 167, 217, 134, 122, 240, 200, 25, + 254, 167, 217, 134, 133, 240, 200, 25, 254, 167, 245, 67, 244, 50, 240, + 200, 25, 254, 167, 216, 161, 244, 50, 240, 200, 25, 254, 167, 217, 134, + 244, 50, 240, 200, 25, 254, 167, 250, 159, 244, 50, 240, 200, 25, 254, + 167, 230, 4, 244, 50, 240, 200, 25, 254, 167, 217, 134, 122, 217, 100, + 25, 254, 167, 217, 134, 244, 50, 217, 100, 25, 254, 167, 248, 8, 244, 50, + 230, 234, 25, 254, 167, 219, 58, 244, 84, 230, 234, 25, 122, 151, 52, 25, + 122, 151, 5, 254, 50, 17, 25, 117, 217, 120, 52, 25, 133, 224, 165, 52, + 25, 213, 36, 52, 25, 218, 19, 52, 25, 246, 55, 52, 25, 227, 110, 52, 25, + 117, 227, 109, 52, 25, 133, 227, 109, 52, 25, 243, 237, 227, 109, 52, 25, + 244, 50, 227, 109, 52, 25, 231, 102, 52, 25, 233, 179, 252, 48, 52, 25, + 232, 223, 52, 25, 226, 255, 52, 25, 213, 147, 52, 25, 253, 158, 52, 25, + 253, 171, 52, 25, 242, 120, 52, 25, 216, 144, 252, 48, 52, 25, 212, 80, + 52, 223, 100, 221, 34, 52, 223, 100, 215, 155, 52, 223, 100, 221, 62, 52, + 223, 100, 221, 32, 52, 223, 100, 247, 165, 221, 32, 52, 223, 100, 220, + 94, 52, 223, 100, 248, 4, 52, 223, 100, 224, 151, 52, 223, 100, 221, 50, + 52, 223, 100, 246, 15, 52, 223, 100, 253, 153, 52, 223, 100, 250, 105, + 52, 226, 19, 247, 143, 5, 226, 88, 226, 19, 247, 143, 5, 225, 158, 241, + 219, 226, 19, 247, 143, 5, 217, 252, 241, 219, 226, 19, 247, 143, 5, 250, + 179, 226, 19, 247, 143, 5, 250, 38, 226, 19, 247, 143, 5, 213, 208, 226, + 19, 247, 143, 5, 241, 195, 226, 19, 247, 143, 5, 243, 61, 226, 19, 247, + 143, 5, 217, 70, 226, 19, 247, 143, 5, 68, 226, 19, 247, 143, 5, 251, 95, + 226, 19, 247, 143, 5, 220, 209, 226, 19, 247, 143, 5, 249, 181, 226, 19, + 247, 143, 5, 231, 247, 226, 19, 247, 143, 5, 231, 199, 226, 19, 247, 143, + 5, 222, 134, 226, 19, 247, 143, 5, 233, 9, 226, 19, 247, 143, 5, 251, + 113, 226, 19, 247, 143, 5, 250, 163, 225, 167, 226, 19, 247, 143, 5, 247, + 87, 226, 19, 247, 143, 5, 249, 161, 226, 19, 247, 143, 5, 220, 15, 226, + 19, 247, 143, 5, 249, 162, 226, 19, 247, 143, 5, 251, 239, 226, 19, 247, + 143, 5, 220, 196, 226, 19, 247, 143, 5, 240, 235, 226, 19, 247, 143, 5, + 241, 163, 226, 19, 247, 143, 5, 251, 41, 233, 60, 226, 19, 247, 143, 5, + 250, 156, 226, 19, 247, 143, 5, 224, 45, 226, 19, 247, 143, 5, 245, 186, + 226, 19, 247, 143, 5, 246, 61, 226, 19, 247, 143, 5, 216, 69, 226, 19, + 247, 143, 5, 251, 242, 226, 19, 247, 143, 5, 225, 168, 216, 193, 226, 19, + 247, 143, 5, 214, 140, 226, 19, 247, 143, 5, 226, 146, 226, 19, 247, 143, + 5, 223, 92, 226, 19, 247, 143, 5, 232, 252, 226, 19, 247, 143, 5, 226, + 239, 252, 101, 226, 19, 247, 143, 5, 244, 17, 226, 19, 247, 143, 5, 242, + 115, 226, 19, 247, 143, 5, 219, 59, 226, 19, 247, 143, 5, 3, 253, 84, + 226, 19, 247, 143, 5, 214, 16, 252, 67, 226, 19, 247, 143, 5, 37, 227, + 112, 90, 232, 120, 1, 61, 232, 120, 1, 74, 232, 120, 1, 253, 74, 232, + 120, 1, 251, 196, 232, 120, 1, 243, 177, 232, 120, 1, 249, 3, 232, 120, + 1, 72, 232, 120, 1, 214, 82, 232, 120, 1, 212, 152, 232, 120, 1, 217, + 163, 232, 120, 1, 235, 142, 232, 120, 1, 235, 27, 232, 120, 1, 224, 240, + 232, 120, 1, 150, 232, 120, 1, 183, 232, 120, 1, 204, 232, 120, 1, 230, + 235, 232, 120, 1, 228, 199, 232, 120, 1, 69, 232, 120, 1, 226, 229, 232, + 120, 1, 234, 56, 232, 120, 1, 149, 232, 120, 1, 197, 232, 120, 1, 218, + 99, 232, 120, 1, 216, 118, 232, 120, 1, 254, 32, 232, 120, 1, 245, 108, + 232, 120, 1, 242, 41, 232, 120, 1, 213, 166, 250, 169, 1, 61, 250, 169, + 1, 226, 215, 250, 169, 1, 249, 3, 250, 169, 1, 150, 250, 169, 1, 215, 90, + 250, 169, 1, 149, 250, 169, 1, 233, 86, 250, 169, 1, 254, 234, 250, 169, + 1, 224, 240, 250, 169, 1, 253, 74, 250, 169, 1, 183, 250, 169, 1, 75, + 250, 169, 1, 248, 166, 250, 169, 1, 218, 99, 250, 169, 1, 221, 26, 250, + 169, 1, 221, 25, 250, 169, 1, 197, 250, 169, 1, 250, 251, 250, 169, 1, + 69, 250, 169, 1, 228, 199, 250, 169, 1, 213, 166, 250, 169, 1, 204, 250, + 169, 1, 216, 117, 250, 169, 1, 226, 229, 250, 169, 1, 219, 158, 250, 169, + 1, 72, 250, 169, 1, 74, 250, 169, 1, 215, 87, 250, 169, 1, 235, 27, 250, + 169, 1, 235, 18, 250, 169, 1, 229, 230, 250, 169, 1, 215, 92, 250, 169, + 1, 243, 177, 250, 169, 1, 243, 112, 250, 169, 1, 219, 107, 250, 169, 1, + 219, 106, 250, 169, 1, 229, 161, 250, 169, 1, 236, 28, 250, 169, 1, 250, + 250, 250, 169, 1, 216, 118, 250, 169, 1, 215, 89, 250, 169, 1, 223, 82, + 250, 169, 1, 231, 192, 250, 169, 1, 231, 191, 250, 169, 1, 231, 190, 250, + 169, 1, 231, 189, 250, 169, 1, 233, 85, 250, 169, 1, 245, 190, 250, 169, + 1, 215, 88, 53, 32, 1, 61, 53, 32, 1, 251, 251, 53, 32, 1, 234, 188, 53, + 32, 1, 248, 41, 53, 32, 1, 74, 53, 32, 1, 214, 232, 53, 32, 1, 212, 87, + 53, 32, 1, 241, 222, 53, 32, 1, 217, 148, 53, 32, 1, 72, 53, 32, 1, 181, + 53, 32, 1, 245, 131, 53, 32, 1, 245, 117, 53, 32, 1, 245, 108, 53, 32, 1, + 245, 40, 53, 32, 1, 75, 53, 32, 1, 226, 96, 53, 32, 1, 220, 243, 53, 32, + 1, 233, 238, 53, 32, 1, 245, 55, 53, 32, 1, 245, 45, 53, 32, 1, 217, 229, + 53, 32, 1, 69, 53, 32, 1, 245, 134, 53, 32, 1, 226, 12, 53, 32, 1, 234, + 125, 53, 32, 1, 245, 159, 53, 32, 1, 245, 47, 53, 32, 1, 250, 67, 53, 32, + 1, 236, 28, 53, 32, 1, 215, 92, 53, 32, 228, 54, 116, 53, 32, 228, 54, + 180, 53, 32, 228, 54, 217, 200, 53, 32, 228, 54, 244, 83, 242, 129, 1, + 254, 111, 242, 129, 1, 252, 82, 242, 129, 1, 242, 187, 242, 129, 1, 248, + 148, 242, 129, 1, 254, 107, 242, 129, 1, 224, 223, 242, 129, 1, 235, 153, + 242, 129, 1, 242, 20, 242, 129, 1, 217, 111, 242, 129, 1, 245, 140, 242, + 129, 1, 233, 211, 242, 129, 1, 233, 136, 242, 129, 1, 231, 242, 242, 129, + 1, 230, 6, 242, 129, 1, 235, 120, 242, 129, 1, 215, 107, 242, 129, 1, + 226, 196, 242, 129, 1, 229, 26, 242, 129, 1, 224, 56, 242, 129, 1, 222, + 136, 242, 129, 1, 217, 212, 242, 129, 1, 213, 219, 242, 129, 1, 244, 146, + 242, 129, 1, 236, 32, 242, 129, 1, 240, 191, 242, 129, 1, 227, 7, 242, + 129, 1, 229, 31, 240, 200, 215, 179, 1, 254, 56, 215, 179, 1, 251, 203, + 215, 179, 1, 243, 84, 215, 179, 1, 234, 138, 215, 179, 1, 248, 5, 215, + 179, 1, 241, 54, 215, 179, 1, 213, 214, 215, 179, 1, 212, 78, 215, 179, + 1, 240, 228, 215, 179, 1, 217, 183, 215, 179, 1, 212, 224, 215, 179, 1, + 234, 254, 215, 179, 1, 220, 200, 215, 179, 1, 233, 122, 215, 179, 1, 231, + 129, 215, 179, 1, 247, 229, 215, 179, 1, 228, 50, 215, 179, 1, 212, 8, + 215, 179, 1, 222, 163, 215, 179, 1, 254, 103, 215, 179, 1, 225, 35, 215, + 179, 1, 222, 194, 215, 179, 1, 224, 180, 215, 179, 1, 224, 36, 215, 179, + 1, 217, 152, 215, 179, 1, 242, 220, 215, 179, 1, 108, 215, 179, 1, 72, + 215, 179, 1, 69, 215, 179, 1, 219, 117, 215, 179, 213, 196, 247, 124, 53, + 226, 45, 5, 61, 53, 226, 45, 5, 72, 53, 226, 45, 5, 69, 53, 226, 45, 5, + 181, 53, 226, 45, 5, 233, 238, 53, 226, 45, 5, 243, 110, 53, 226, 45, 5, + 242, 92, 53, 226, 45, 5, 213, 153, 53, 226, 45, 5, 250, 219, 53, 226, 45, + 5, 235, 139, 53, 226, 45, 5, 235, 110, 53, 226, 45, 5, 218, 52, 53, 226, + 45, 5, 216, 82, 53, 226, 45, 5, 248, 164, 53, 226, 45, 5, 247, 211, 53, + 226, 45, 5, 246, 33, 53, 226, 45, 5, 217, 161, 53, 226, 45, 5, 193, 53, + 226, 45, 5, 252, 107, 53, 226, 45, 5, 244, 164, 53, 226, 45, 5, 205, 53, + 226, 45, 5, 228, 92, 53, 226, 45, 5, 188, 53, 226, 45, 5, 231, 42, 53, + 226, 45, 5, 230, 172, 53, 226, 45, 5, 186, 53, 226, 45, 5, 215, 1, 53, + 226, 45, 5, 214, 154, 53, 226, 45, 5, 203, 53, 226, 45, 5, 223, 51, 53, + 226, 45, 5, 233, 157, 53, 226, 45, 5, 222, 202, 53, 226, 45, 5, 212, 109, + 53, 226, 45, 5, 221, 24, 53, 226, 45, 5, 219, 157, 53, 226, 45, 5, 159, + 53, 226, 45, 5, 253, 102, 53, 226, 45, 5, 253, 101, 53, 226, 45, 5, 253, + 100, 53, 226, 45, 5, 213, 130, 53, 226, 45, 5, 248, 145, 53, 226, 45, 5, + 248, 144, 53, 226, 45, 5, 252, 88, 53, 226, 45, 5, 251, 14, 53, 226, 45, + 213, 196, 247, 124, 53, 226, 45, 50, 116, 53, 226, 45, 50, 109, 53, 226, + 45, 50, 217, 200, 53, 226, 45, 50, 216, 38, 53, 226, 45, 50, 240, 200, + 171, 6, 1, 184, 72, 171, 6, 1, 184, 74, 171, 6, 1, 184, 61, 171, 6, 1, + 184, 254, 114, 171, 6, 1, 184, 75, 171, 6, 1, 184, 227, 49, 171, 6, 1, + 220, 175, 72, 171, 6, 1, 220, 175, 74, 171, 6, 1, 220, 175, 61, 171, 6, + 1, 220, 175, 254, 114, 171, 6, 1, 220, 175, 75, 171, 6, 1, 220, 175, 227, + 49, 171, 6, 1, 253, 83, 171, 6, 1, 226, 240, 171, 6, 1, 213, 183, 171, 6, + 1, 213, 35, 171, 6, 1, 242, 41, 171, 6, 1, 226, 86, 171, 6, 1, 251, 242, + 171, 6, 1, 217, 219, 171, 6, 1, 248, 28, 171, 6, 1, 250, 64, 171, 6, 1, + 235, 125, 171, 6, 1, 234, 195, 171, 6, 1, 243, 59, 171, 6, 1, 245, 159, + 171, 6, 1, 214, 227, 171, 6, 1, 245, 25, 171, 6, 1, 217, 147, 171, 6, 1, + 245, 45, 171, 6, 1, 212, 85, 171, 6, 1, 245, 40, 171, 6, 1, 212, 66, 171, + 6, 1, 245, 55, 171, 6, 1, 245, 131, 171, 6, 1, 245, 117, 171, 6, 1, 245, + 108, 171, 6, 1, 245, 96, 171, 6, 1, 227, 85, 171, 6, 1, 245, 5, 171, 3, + 1, 184, 72, 171, 3, 1, 184, 74, 171, 3, 1, 184, 61, 171, 3, 1, 184, 254, + 114, 171, 3, 1, 184, 75, 171, 3, 1, 184, 227, 49, 171, 3, 1, 220, 175, + 72, 171, 3, 1, 220, 175, 74, 171, 3, 1, 220, 175, 61, 171, 3, 1, 220, + 175, 254, 114, 171, 3, 1, 220, 175, 75, 171, 3, 1, 220, 175, 227, 49, + 171, 3, 1, 253, 83, 171, 3, 1, 226, 240, 171, 3, 1, 213, 183, 171, 3, 1, + 213, 35, 171, 3, 1, 242, 41, 171, 3, 1, 226, 86, 171, 3, 1, 251, 242, + 171, 3, 1, 217, 219, 171, 3, 1, 248, 28, 171, 3, 1, 250, 64, 171, 3, 1, + 235, 125, 171, 3, 1, 234, 195, 171, 3, 1, 243, 59, 171, 3, 1, 245, 159, + 171, 3, 1, 214, 227, 171, 3, 1, 245, 25, 171, 3, 1, 217, 147, 171, 3, 1, + 245, 45, 171, 3, 1, 212, 85, 171, 3, 1, 245, 40, 171, 3, 1, 212, 66, 171, + 3, 1, 245, 55, 171, 3, 1, 245, 131, 171, 3, 1, 245, 117, 171, 3, 1, 245, + 108, 171, 3, 1, 245, 96, 171, 3, 1, 227, 85, 171, 3, 1, 245, 5, 220, 249, + 1, 226, 84, 220, 249, 1, 216, 218, 220, 249, 1, 234, 100, 220, 249, 1, + 244, 116, 220, 249, 1, 217, 125, 220, 249, 1, 219, 242, 220, 249, 1, 218, + 214, 220, 249, 1, 249, 254, 220, 249, 1, 213, 37, 220, 249, 1, 240, 199, + 220, 249, 1, 251, 183, 220, 249, 1, 248, 40, 220, 249, 1, 243, 96, 220, + 249, 1, 214, 104, 220, 249, 1, 217, 129, 220, 249, 1, 212, 14, 220, 249, + 1, 231, 154, 220, 249, 1, 235, 52, 220, 249, 1, 213, 212, 220, 249, 1, + 242, 29, 220, 249, 1, 232, 195, 220, 249, 1, 231, 2, 220, 249, 1, 236, + 35, 220, 249, 1, 245, 158, 220, 249, 1, 253, 146, 220, 249, 1, 254, 152, + 220, 249, 1, 227, 62, 220, 249, 1, 213, 199, 220, 249, 1, 226, 254, 220, + 249, 1, 254, 114, 220, 249, 1, 223, 109, 220, 249, 1, 228, 50, 220, 249, + 1, 245, 173, 220, 249, 1, 254, 119, 220, 249, 1, 240, 104, 220, 249, 1, + 215, 134, 220, 249, 1, 227, 118, 220, 249, 1, 227, 42, 220, 249, 1, 227, + 84, 220, 249, 1, 253, 86, 220, 249, 1, 253, 189, 220, 249, 1, 227, 24, + 220, 249, 1, 254, 100, 220, 249, 1, 245, 49, 220, 249, 1, 253, 168, 220, + 249, 1, 245, 183, 220, 249, 1, 240, 110, 220, 249, 1, 213, 4, 227, 9, 1, + 254, 78, 227, 9, 1, 252, 107, 227, 9, 1, 218, 52, 227, 9, 1, 235, 139, + 227, 9, 1, 213, 153, 227, 9, 1, 234, 138, 227, 9, 1, 248, 27, 227, 9, 1, + 203, 227, 9, 1, 222, 202, 227, 9, 1, 220, 206, 227, 9, 1, 247, 232, 227, + 9, 1, 250, 148, 227, 9, 1, 243, 110, 227, 9, 1, 244, 164, 227, 9, 1, 224, + 230, 227, 9, 1, 235, 13, 227, 9, 1, 233, 152, 227, 9, 1, 231, 13, 227, 9, + 1, 228, 35, 227, 9, 1, 214, 14, 227, 9, 1, 159, 227, 9, 1, 186, 227, 9, + 1, 61, 227, 9, 1, 74, 227, 9, 1, 72, 227, 9, 1, 75, 227, 9, 1, 69, 227, + 9, 1, 254, 232, 227, 9, 1, 245, 165, 227, 9, 1, 227, 49, 227, 9, 21, 212, + 79, 227, 9, 21, 116, 227, 9, 21, 109, 227, 9, 21, 166, 227, 9, 21, 163, + 227, 9, 21, 180, 227, 9, 21, 189, 227, 9, 21, 198, 227, 9, 21, 195, 227, + 9, 21, 200, 249, 10, 4, 61, 249, 10, 4, 74, 249, 10, 4, 72, 249, 10, 4, + 75, 249, 10, 4, 69, 249, 10, 4, 235, 139, 249, 10, 4, 235, 71, 249, 10, + 4, 181, 249, 10, 4, 234, 188, 249, 10, 4, 234, 101, 249, 10, 4, 234, 37, + 249, 10, 4, 233, 238, 249, 10, 4, 233, 157, 249, 10, 4, 233, 82, 249, 10, + 4, 233, 13, 249, 10, 4, 232, 208, 249, 10, 4, 232, 156, 249, 10, 4, 188, + 249, 10, 4, 231, 156, 249, 10, 4, 231, 42, 249, 10, 4, 230, 231, 249, 10, + 4, 230, 172, 249, 10, 4, 205, 249, 10, 4, 229, 187, 249, 10, 4, 229, 64, + 249, 10, 4, 228, 185, 249, 10, 4, 228, 92, 249, 10, 4, 193, 249, 10, 4, + 226, 96, 249, 10, 4, 225, 240, 249, 10, 4, 225, 150, 249, 10, 4, 225, 35, + 249, 10, 4, 203, 249, 10, 4, 224, 21, 249, 10, 4, 223, 188, 249, 10, 4, + 223, 112, 249, 10, 4, 223, 51, 249, 10, 4, 222, 202, 249, 10, 4, 222, + 100, 249, 10, 4, 220, 117, 249, 10, 4, 219, 242, 249, 10, 4, 219, 27, + 249, 10, 4, 218, 52, 249, 10, 4, 217, 229, 249, 10, 4, 217, 71, 249, 10, + 4, 108, 249, 10, 4, 216, 82, 249, 10, 4, 214, 49, 249, 10, 4, 214, 6, + 249, 10, 4, 213, 235, 249, 10, 4, 213, 214, 249, 10, 4, 213, 153, 249, + 10, 4, 213, 150, 249, 10, 4, 212, 109, 249, 10, 4, 212, 16, 235, 253, + 253, 197, 1, 254, 76, 235, 253, 253, 197, 1, 251, 202, 235, 253, 253, + 197, 1, 242, 177, 235, 253, 253, 197, 1, 248, 133, 235, 253, 253, 197, 1, + 241, 222, 235, 253, 253, 197, 1, 214, 14, 235, 253, 253, 197, 1, 212, 90, + 235, 253, 253, 197, 1, 241, 180, 235, 253, 253, 197, 1, 217, 179, 235, + 253, 253, 197, 1, 212, 223, 235, 253, 253, 197, 1, 234, 230, 235, 253, + 253, 197, 1, 233, 117, 235, 253, 253, 197, 1, 231, 129, 235, 253, 253, + 197, 1, 228, 50, 235, 253, 253, 197, 1, 222, 164, 235, 253, 253, 197, 1, + 253, 78, 235, 253, 253, 197, 1, 226, 96, 235, 253, 253, 197, 1, 222, 193, + 235, 253, 253, 197, 1, 224, 179, 235, 253, 253, 197, 1, 223, 219, 235, + 253, 253, 197, 1, 220, 200, 235, 253, 253, 197, 1, 217, 243, 235, 253, + 253, 197, 222, 92, 52, 235, 253, 253, 197, 50, 116, 235, 253, 253, 197, + 50, 109, 235, 253, 253, 197, 50, 166, 235, 253, 253, 197, 50, 217, 200, + 235, 253, 253, 197, 50, 216, 38, 235, 253, 253, 197, 50, 122, 240, 200, + 235, 253, 253, 197, 50, 122, 217, 100, 235, 253, 253, 197, 50, 217, 201, + 217, 100, 225, 251, 1, 254, 74, 225, 251, 1, 251, 205, 225, 251, 1, 243, + 85, 225, 251, 1, 248, 7, 225, 251, 1, 241, 222, 225, 251, 1, 214, 21, + 225, 251, 1, 212, 103, 225, 251, 1, 241, 182, 225, 251, 1, 217, 183, 225, + 251, 1, 212, 224, 225, 251, 1, 234, 254, 225, 251, 1, 233, 123, 225, 251, + 1, 231, 129, 225, 251, 1, 228, 50, 225, 251, 1, 221, 64, 225, 251, 1, + 254, 103, 225, 251, 1, 226, 96, 225, 251, 1, 222, 194, 225, 251, 1, 224, + 184, 225, 251, 1, 223, 91, 225, 251, 1, 220, 200, 225, 251, 1, 217, 248, + 225, 251, 50, 116, 225, 251, 50, 217, 200, 225, 251, 50, 216, 38, 225, + 251, 50, 122, 240, 200, 225, 251, 50, 109, 225, 251, 50, 166, 225, 251, + 213, 196, 221, 57, 232, 119, 1, 61, 232, 119, 1, 253, 74, 232, 119, 1, + 243, 177, 232, 119, 1, 249, 3, 232, 119, 1, 74, 232, 119, 1, 215, 79, + 232, 119, 1, 72, 232, 119, 1, 213, 105, 232, 119, 1, 235, 27, 232, 119, + 1, 150, 232, 119, 1, 183, 232, 119, 1, 204, 232, 119, 1, 75, 232, 119, 1, + 149, 232, 119, 1, 219, 158, 232, 119, 1, 218, 99, 232, 119, 1, 69, 232, + 119, 1, 244, 230, 232, 119, 1, 224, 240, 232, 119, 1, 197, 232, 119, 1, + 216, 118, 232, 119, 1, 254, 32, 232, 119, 1, 245, 108, 232, 119, 1, 232, + 121, 232, 119, 1, 228, 199, 232, 119, 1, 250, 252, 232, 119, 216, 180, + 77, 234, 126, 1, 61, 234, 126, 30, 5, 72, 234, 126, 30, 5, 69, 234, 126, + 30, 5, 161, 149, 234, 126, 30, 5, 74, 234, 126, 30, 5, 75, 234, 126, 30, + 233, 47, 77, 234, 126, 5, 51, 223, 131, 55, 234, 126, 5, 253, 242, 234, + 126, 5, 214, 128, 234, 126, 1, 181, 234, 126, 1, 234, 138, 234, 126, 1, + 243, 110, 234, 126, 1, 242, 225, 234, 126, 1, 250, 219, 234, 126, 1, 250, + 92, 234, 126, 1, 235, 139, 234, 126, 1, 228, 23, 234, 126, 1, 216, 115, + 234, 126, 1, 216, 105, 234, 126, 1, 248, 86, 234, 126, 1, 248, 70, 234, + 126, 1, 228, 198, 234, 126, 1, 218, 52, 234, 126, 1, 217, 161, 234, 126, + 1, 248, 164, 234, 126, 1, 247, 232, 234, 126, 1, 205, 234, 126, 1, 193, + 234, 126, 1, 226, 23, 234, 126, 1, 252, 107, 234, 126, 1, 251, 195, 234, + 126, 1, 188, 234, 126, 1, 186, 234, 126, 1, 203, 234, 126, 1, 233, 157, + 234, 126, 1, 215, 1, 234, 126, 1, 221, 24, 234, 126, 1, 219, 157, 234, + 126, 1, 222, 202, 234, 126, 1, 212, 109, 234, 126, 1, 159, 234, 126, 1, + 234, 55, 234, 126, 1, 216, 87, 234, 126, 5, 252, 60, 49, 234, 126, 5, + 250, 154, 234, 126, 5, 62, 55, 234, 126, 214, 133, 234, 126, 21, 116, + 234, 126, 21, 109, 234, 126, 21, 166, 234, 126, 21, 163, 234, 126, 50, + 217, 200, 234, 126, 50, 216, 38, 234, 126, 50, 122, 240, 200, 234, 126, + 50, 122, 217, 100, 234, 126, 225, 27, 247, 74, 234, 126, 225, 27, 3, 249, + 228, 234, 126, 225, 27, 249, 228, 234, 126, 225, 27, 249, 77, 134, 234, + 126, 225, 27, 231, 243, 234, 126, 225, 27, 232, 170, 234, 126, 225, 27, + 248, 123, 234, 126, 225, 27, 51, 248, 123, 234, 126, 225, 27, 232, 236, + 53, 219, 215, 253, 208, 1, 241, 222, 53, 219, 215, 253, 208, 1, 233, 117, + 53, 219, 215, 253, 208, 1, 241, 180, 53, 219, 215, 253, 208, 1, 231, 129, + 53, 219, 215, 253, 208, 1, 224, 179, 53, 219, 215, 253, 208, 1, 214, 14, + 53, 219, 215, 253, 208, 1, 220, 200, 53, 219, 215, 253, 208, 1, 223, 219, + 53, 219, 215, 253, 208, 1, 251, 202, 53, 219, 215, 253, 208, 1, 217, 243, + 53, 219, 215, 253, 208, 1, 222, 142, 53, 219, 215, 253, 208, 1, 234, 230, + 53, 219, 215, 253, 208, 1, 228, 50, 53, 219, 215, 253, 208, 1, 234, 122, + 53, 219, 215, 253, 208, 1, 222, 193, 53, 219, 215, 253, 208, 1, 222, 164, + 53, 219, 215, 253, 208, 1, 244, 123, 53, 219, 215, 253, 208, 1, 254, 78, + 53, 219, 215, 253, 208, 1, 253, 77, 53, 219, 215, 253, 208, 1, 247, 230, + 53, 219, 215, 253, 208, 1, 242, 177, 53, 219, 215, 253, 208, 1, 248, 133, + 53, 219, 215, 253, 208, 1, 242, 214, 53, 219, 215, 253, 208, 1, 217, 179, + 53, 219, 215, 253, 208, 1, 212, 89, 53, 219, 215, 253, 208, 1, 247, 227, + 53, 219, 215, 253, 208, 1, 212, 223, 53, 219, 215, 253, 208, 1, 217, 150, + 53, 219, 215, 253, 208, 1, 217, 131, 53, 219, 215, 253, 208, 50, 116, 53, + 219, 215, 253, 208, 50, 244, 83, 53, 219, 215, 253, 208, 128, 235, 235, + 253, 88, 1, 61, 253, 88, 1, 254, 232, 253, 88, 1, 253, 240, 253, 88, 1, + 254, 191, 253, 88, 1, 254, 32, 253, 88, 1, 254, 192, 253, 88, 1, 254, + 148, 253, 88, 1, 254, 144, 253, 88, 1, 74, 253, 88, 1, 245, 165, 253, 88, + 1, 75, 253, 88, 1, 227, 49, 253, 88, 1, 72, 253, 88, 1, 236, 28, 253, 88, + 1, 69, 253, 88, 1, 215, 92, 253, 88, 1, 234, 188, 253, 88, 1, 213, 150, + 253, 88, 1, 213, 116, 253, 88, 1, 213, 125, 253, 88, 1, 243, 38, 253, 88, + 1, 243, 0, 253, 88, 1, 242, 212, 253, 88, 1, 250, 124, 253, 88, 1, 235, + 127, 253, 88, 1, 217, 229, 253, 88, 1, 217, 148, 253, 88, 1, 248, 41, + 253, 88, 1, 247, 225, 253, 88, 1, 216, 112, 253, 88, 1, 226, 96, 253, 88, + 1, 244, 123, 253, 88, 1, 251, 251, 253, 88, 1, 251, 192, 253, 88, 1, 229, + 148, 253, 88, 1, 229, 70, 253, 88, 1, 229, 71, 253, 88, 1, 229, 187, 253, + 88, 1, 228, 17, 253, 88, 1, 228, 197, 253, 88, 1, 231, 156, 253, 88, 1, + 241, 102, 253, 88, 1, 212, 159, 253, 88, 1, 213, 38, 253, 88, 1, 214, + 232, 253, 88, 1, 224, 21, 253, 88, 1, 233, 82, 253, 88, 1, 222, 100, 253, + 88, 1, 212, 87, 253, 88, 1, 220, 243, 253, 88, 1, 212, 67, 253, 88, 1, + 220, 124, 253, 88, 1, 219, 129, 253, 88, 1, 241, 222, 253, 88, 254, 181, + 77, 217, 32, 117, 176, 110, 122, 62, 225, 26, 3, 117, 176, 110, 122, 62, + 225, 26, 233, 108, 117, 176, 110, 122, 62, 225, 26, 233, 108, 122, 62, + 110, 117, 176, 225, 26, 233, 108, 117, 223, 129, 110, 122, 223, 131, 225, + 26, 233, 108, 122, 223, 131, 110, 117, 223, 129, 225, 26, 235, 215, 226, + 126, 1, 254, 76, 235, 215, 226, 126, 1, 251, 202, 235, 215, 226, 126, 1, + 242, 177, 235, 215, 226, 126, 1, 248, 133, 235, 215, 226, 126, 1, 241, + 222, 235, 215, 226, 126, 1, 214, 14, 235, 215, 226, 126, 1, 212, 90, 235, + 215, 226, 126, 1, 241, 180, 235, 215, 226, 126, 1, 217, 179, 235, 215, + 226, 126, 1, 212, 223, 235, 215, 226, 126, 1, 234, 230, 235, 215, 226, + 126, 1, 233, 117, 235, 215, 226, 126, 1, 231, 129, 235, 215, 226, 126, 1, + 228, 50, 235, 215, 226, 126, 1, 222, 164, 235, 215, 226, 126, 1, 253, 78, + 235, 215, 226, 126, 1, 226, 96, 235, 215, 226, 126, 1, 222, 193, 235, + 215, 226, 126, 1, 224, 179, 235, 215, 226, 126, 1, 223, 219, 235, 215, + 226, 126, 1, 220, 200, 235, 215, 226, 126, 1, 217, 243, 235, 215, 226, + 126, 50, 116, 235, 215, 226, 126, 50, 109, 235, 215, 226, 126, 50, 166, + 235, 215, 226, 126, 50, 163, 235, 215, 226, 126, 50, 217, 200, 235, 215, + 226, 126, 50, 216, 38, 235, 215, 226, 126, 50, 122, 240, 200, 235, 215, + 226, 126, 50, 122, 217, 100, 235, 215, 226, 198, 1, 254, 76, 235, 215, + 226, 198, 1, 251, 202, 235, 215, 226, 198, 1, 242, 177, 235, 215, 226, + 198, 1, 248, 133, 235, 215, 226, 198, 1, 241, 222, 235, 215, 226, 198, 1, + 214, 13, 235, 215, 226, 198, 1, 212, 90, 235, 215, 226, 198, 1, 241, 180, + 235, 215, 226, 198, 1, 217, 179, 235, 215, 226, 198, 1, 212, 223, 235, + 215, 226, 198, 1, 234, 230, 235, 215, 226, 198, 1, 233, 117, 235, 215, + 226, 198, 1, 231, 128, 235, 215, 226, 198, 1, 228, 50, 235, 215, 226, + 198, 1, 222, 164, 235, 215, 226, 198, 1, 226, 96, 235, 215, 226, 198, 1, + 222, 193, 235, 215, 226, 198, 1, 220, 200, 235, 215, 226, 198, 1, 217, + 243, 235, 215, 226, 198, 50, 116, 235, 215, 226, 198, 50, 109, 235, 215, + 226, 198, 50, 166, 235, 215, 226, 198, 50, 163, 235, 215, 226, 198, 50, + 217, 200, 235, 215, 226, 198, 50, 216, 38, 235, 215, 226, 198, 50, 122, + 240, 200, 235, 215, 226, 198, 50, 122, 217, 100, 53, 185, 1, 227, 16, 61, + 53, 185, 1, 213, 28, 61, 53, 185, 1, 213, 28, 254, 148, 53, 185, 1, 227, + 16, 72, 53, 185, 1, 213, 28, 72, 53, 185, 1, 213, 28, 74, 53, 185, 1, + 227, 16, 75, 53, 185, 1, 227, 16, 227, 99, 53, 185, 1, 213, 28, 227, 99, + 53, 185, 1, 227, 16, 254, 185, 53, 185, 1, 213, 28, 254, 185, 53, 185, 1, + 227, 16, 254, 147, 53, 185, 1, 213, 28, 254, 147, 53, 185, 1, 227, 16, + 254, 121, 53, 185, 1, 213, 28, 254, 121, 53, 185, 1, 227, 16, 254, 142, + 53, 185, 1, 213, 28, 254, 142, 53, 185, 1, 227, 16, 254, 160, 53, 185, 1, + 213, 28, 254, 160, 53, 185, 1, 227, 16, 254, 146, 53, 185, 1, 227, 16, + 244, 236, 53, 185, 1, 213, 28, 244, 236, 53, 185, 1, 227, 16, 253, 83, + 53, 185, 1, 213, 28, 253, 83, 53, 185, 1, 227, 16, 254, 129, 53, 185, 1, + 213, 28, 254, 129, 53, 185, 1, 227, 16, 254, 140, 53, 185, 1, 213, 28, + 254, 140, 53, 185, 1, 227, 16, 227, 98, 53, 185, 1, 213, 28, 227, 98, 53, + 185, 1, 227, 16, 254, 86, 53, 185, 1, 213, 28, 254, 86, 53, 185, 1, 227, + 16, 254, 139, 53, 185, 1, 227, 16, 245, 119, 53, 185, 1, 227, 16, 245, + 117, 53, 185, 1, 227, 16, 254, 32, 53, 185, 1, 227, 16, 254, 137, 53, + 185, 1, 213, 28, 254, 137, 53, 185, 1, 227, 16, 245, 90, 53, 185, 1, 213, + 28, 245, 90, 53, 185, 1, 227, 16, 245, 105, 53, 185, 1, 213, 28, 245, + 105, 53, 185, 1, 227, 16, 245, 77, 53, 185, 1, 213, 28, 245, 77, 53, 185, + 1, 213, 28, 254, 24, 53, 185, 1, 227, 16, 245, 96, 53, 185, 1, 213, 28, + 254, 136, 53, 185, 1, 227, 16, 245, 70, 53, 185, 1, 227, 16, 227, 41, 53, + 185, 1, 227, 16, 240, 106, 53, 185, 1, 227, 16, 245, 171, 53, 185, 1, + 213, 28, 245, 171, 53, 185, 1, 227, 16, 253, 215, 53, 185, 1, 213, 28, + 253, 215, 53, 185, 1, 227, 16, 235, 179, 53, 185, 1, 213, 28, 235, 179, + 53, 185, 1, 227, 16, 227, 25, 53, 185, 1, 213, 28, 227, 25, 53, 185, 1, + 227, 16, 253, 211, 53, 185, 1, 213, 28, 253, 211, 53, 185, 1, 227, 16, + 254, 135, 53, 185, 1, 227, 16, 253, 152, 53, 185, 1, 227, 16, 254, 133, + 53, 185, 1, 227, 16, 253, 146, 53, 185, 1, 213, 28, 253, 146, 53, 185, 1, + 227, 16, 245, 40, 53, 185, 1, 213, 28, 245, 40, 53, 185, 1, 227, 16, 253, + 122, 53, 185, 1, 213, 28, 253, 122, 53, 185, 1, 227, 16, 254, 130, 53, + 185, 1, 213, 28, 254, 130, 53, 185, 1, 227, 16, 227, 8, 53, 185, 1, 227, + 16, 252, 45, 223, 38, 21, 116, 223, 38, 21, 109, 223, 38, 21, 166, 223, + 38, 21, 163, 223, 38, 21, 180, 223, 38, 21, 189, 223, 38, 21, 198, 223, + 38, 21, 195, 223, 38, 21, 200, 223, 38, 50, 217, 200, 223, 38, 50, 216, + 38, 223, 38, 50, 217, 115, 223, 38, 50, 243, 240, 223, 38, 50, 244, 83, + 223, 38, 50, 220, 39, 223, 38, 50, 221, 37, 223, 38, 50, 245, 141, 223, + 38, 50, 229, 26, 223, 38, 50, 122, 240, 200, 223, 38, 50, 117, 240, 200, + 223, 38, 50, 133, 240, 200, 223, 38, 50, 243, 237, 240, 200, 223, 38, 50, + 244, 50, 240, 200, 223, 38, 50, 220, 53, 240, 200, 223, 38, 50, 221, 43, + 240, 200, 223, 38, 50, 245, 150, 240, 200, 223, 38, 50, 229, 31, 240, + 200, 223, 38, 243, 228, 122, 242, 9, 223, 38, 243, 228, 122, 224, 166, + 223, 38, 243, 228, 122, 217, 121, 223, 38, 243, 228, 117, 217, 119, 112, + 5, 250, 187, 112, 5, 253, 242, 112, 5, 214, 128, 112, 5, 235, 104, 112, + 5, 215, 132, 112, 1, 61, 112, 1, 254, 232, 112, 1, 72, 112, 1, 236, 28, + 112, 1, 69, 112, 1, 215, 92, 112, 1, 161, 149, 112, 1, 161, 223, 82, 112, + 1, 161, 150, 112, 1, 161, 232, 214, 112, 1, 74, 112, 1, 254, 108, 112, 1, + 75, 112, 1, 253, 108, 112, 1, 181, 112, 1, 234, 138, 112, 1, 243, 110, + 112, 1, 242, 225, 112, 1, 229, 159, 112, 1, 250, 219, 112, 1, 250, 92, + 112, 1, 235, 139, 112, 1, 235, 115, 112, 1, 228, 23, 112, 1, 216, 115, + 112, 1, 216, 105, 112, 1, 248, 86, 112, 1, 248, 70, 112, 1, 228, 198, + 112, 1, 218, 52, 112, 1, 217, 161, 112, 1, 248, 164, 112, 1, 247, 232, + 112, 1, 205, 112, 1, 193, 112, 1, 226, 23, 112, 1, 252, 107, 112, 1, 251, + 195, 112, 1, 188, 112, 1, 186, 112, 1, 203, 112, 1, 233, 157, 112, 1, + 215, 1, 112, 1, 221, 24, 112, 1, 219, 157, 112, 1, 222, 202, 112, 1, 159, + 112, 1, 232, 213, 112, 1, 53, 178, 232, 212, 112, 1, 53, 178, 223, 81, + 112, 1, 53, 178, 228, 189, 112, 30, 5, 254, 232, 112, 30, 5, 251, 193, + 254, 232, 112, 30, 5, 72, 112, 30, 5, 236, 28, 112, 30, 5, 69, 112, 30, + 5, 215, 92, 112, 30, 5, 161, 149, 112, 30, 5, 161, 223, 82, 112, 30, 5, + 161, 150, 112, 30, 5, 161, 232, 214, 112, 30, 5, 74, 112, 30, 5, 254, + 108, 112, 30, 5, 75, 112, 30, 5, 253, 108, 112, 214, 133, 112, 248, 123, + 112, 51, 248, 123, 112, 225, 27, 247, 74, 112, 225, 27, 51, 247, 74, 112, + 225, 27, 232, 242, 112, 225, 27, 249, 77, 134, 112, 225, 27, 232, 170, + 112, 50, 116, 112, 50, 109, 112, 50, 166, 112, 50, 163, 112, 50, 180, + 112, 50, 189, 112, 50, 198, 112, 50, 195, 112, 50, 200, 112, 50, 217, + 200, 112, 50, 216, 38, 112, 50, 217, 115, 112, 50, 243, 240, 112, 50, + 244, 83, 112, 50, 220, 39, 112, 50, 221, 37, 112, 50, 245, 141, 112, 50, + 229, 26, 112, 50, 122, 240, 200, 112, 50, 122, 217, 100, 112, 21, 212, + 79, 112, 21, 116, 112, 21, 109, 112, 21, 166, 112, 21, 163, 112, 21, 180, + 112, 21, 189, 112, 21, 198, 112, 21, 195, 112, 21, 200, 208, 5, 250, 187, + 208, 5, 253, 242, 208, 5, 214, 128, 208, 1, 61, 208, 1, 254, 232, 208, 1, + 72, 208, 1, 236, 28, 208, 1, 69, 208, 1, 215, 92, 208, 1, 74, 208, 1, + 254, 108, 208, 1, 75, 208, 1, 253, 108, 208, 1, 181, 208, 1, 234, 138, + 208, 1, 243, 110, 208, 1, 242, 225, 208, 1, 229, 159, 208, 1, 250, 219, + 208, 1, 250, 92, 208, 1, 235, 139, 208, 1, 235, 115, 208, 1, 228, 23, + 208, 1, 216, 115, 208, 1, 216, 105, 208, 1, 248, 86, 208, 1, 248, 75, + 208, 1, 248, 70, 208, 1, 223, 192, 208, 1, 228, 198, 208, 1, 218, 52, + 208, 1, 217, 161, 208, 1, 248, 164, 208, 1, 247, 232, 208, 1, 205, 208, + 1, 193, 208, 1, 226, 23, 208, 1, 252, 107, 208, 1, 251, 195, 208, 1, 188, + 208, 1, 186, 208, 1, 203, 208, 1, 233, 157, 208, 1, 215, 1, 208, 1, 221, + 24, 208, 1, 219, 157, 208, 1, 222, 202, 208, 1, 159, 208, 30, 5, 254, + 232, 208, 30, 5, 72, 208, 30, 5, 236, 28, 208, 30, 5, 69, 208, 30, 5, + 215, 92, 208, 30, 5, 74, 208, 30, 5, 254, 108, 208, 30, 5, 75, 208, 30, + 5, 253, 108, 208, 5, 214, 133, 208, 5, 228, 60, 208, 254, 181, 52, 208, + 245, 80, 52, 208, 50, 52, 208, 222, 92, 77, 208, 51, 222, 92, 77, 208, + 248, 123, 208, 51, 248, 123, 15, 5, 61, 15, 5, 118, 29, 61, 15, 5, 118, + 29, 252, 94, 15, 5, 118, 29, 243, 81, 217, 192, 15, 5, 118, 29, 159, 15, + 5, 118, 29, 236, 30, 15, 5, 118, 29, 233, 139, 242, 75, 15, 5, 118, 29, + 230, 131, 15, 5, 118, 29, 222, 190, 15, 5, 254, 234, 15, 5, 254, 185, 15, + 5, 254, 186, 29, 253, 144, 15, 5, 254, 186, 29, 246, 22, 242, 75, 15, 5, + 254, 186, 29, 243, 94, 15, 5, 254, 186, 29, 243, 81, 217, 192, 15, 5, + 254, 186, 29, 159, 15, 5, 254, 186, 29, 236, 31, 242, 75, 15, 5, 254, + 186, 29, 236, 4, 15, 5, 254, 186, 29, 233, 140, 15, 5, 254, 186, 29, 220, + 228, 15, 5, 254, 186, 29, 111, 94, 111, 94, 69, 15, 5, 254, 186, 242, 75, + 15, 5, 254, 183, 15, 5, 254, 184, 29, 252, 79, 15, 5, 254, 184, 29, 243, + 81, 217, 192, 15, 5, 254, 184, 29, 231, 157, 94, 245, 108, 15, 5, 254, + 184, 29, 221, 22, 15, 5, 254, 184, 29, 218, 22, 15, 5, 254, 160, 15, 5, + 254, 94, 15, 5, 254, 95, 29, 245, 50, 15, 5, 254, 95, 29, 220, 190, 94, + 242, 166, 15, 5, 254, 86, 15, 5, 254, 87, 29, 254, 86, 15, 5, 254, 87, + 29, 247, 168, 15, 5, 254, 87, 29, 242, 166, 15, 5, 254, 87, 29, 159, 15, + 5, 254, 87, 29, 235, 3, 15, 5, 254, 87, 29, 234, 101, 15, 5, 254, 87, 29, + 220, 243, 15, 5, 254, 87, 29, 215, 100, 15, 5, 254, 83, 15, 5, 254, 76, + 15, 5, 254, 41, 15, 5, 254, 42, 29, 220, 243, 15, 5, 254, 32, 15, 5, 254, + 33, 110, 254, 32, 15, 5, 254, 33, 133, 217, 38, 15, 5, 254, 33, 94, 230, + 35, 227, 30, 254, 33, 94, 230, 34, 15, 5, 254, 33, 94, 230, 35, 219, 165, + 15, 5, 254, 5, 15, 5, 253, 235, 15, 5, 253, 205, 15, 5, 253, 206, 29, + 233, 217, 15, 5, 253, 179, 15, 5, 253, 151, 15, 5, 253, 146, 15, 5, 253, + 147, 212, 33, 217, 192, 15, 5, 253, 147, 235, 7, 217, 192, 15, 5, 253, + 147, 110, 253, 147, 216, 78, 110, 216, 78, 216, 78, 110, 216, 78, 226, + 149, 15, 5, 253, 147, 110, 253, 147, 110, 253, 146, 15, 5, 253, 147, 110, + 253, 147, 110, 253, 147, 249, 65, 253, 147, 110, 253, 147, 110, 253, 146, + 15, 5, 253, 144, 15, 5, 253, 141, 15, 5, 252, 107, 15, 5, 252, 94, 15, 5, + 252, 89, 15, 5, 252, 86, 15, 5, 252, 80, 15, 5, 252, 81, 110, 252, 80, + 15, 5, 252, 79, 15, 5, 134, 15, 5, 252, 59, 15, 5, 251, 184, 15, 5, 251, + 185, 29, 61, 15, 5, 251, 185, 29, 243, 72, 15, 5, 251, 185, 29, 236, 31, + 242, 75, 15, 5, 251, 54, 15, 5, 251, 55, 110, 251, 55, 254, 185, 15, 5, + 251, 55, 110, 251, 55, 215, 160, 15, 5, 251, 55, 249, 65, 251, 54, 15, 5, + 251, 38, 15, 5, 251, 39, 110, 251, 38, 15, 5, 251, 27, 15, 5, 251, 26, + 15, 5, 248, 164, 15, 5, 248, 155, 15, 5, 248, 156, 234, 75, 29, 118, 94, + 231, 210, 15, 5, 248, 156, 234, 75, 29, 254, 41, 15, 5, 248, 156, 234, + 75, 29, 252, 79, 15, 5, 248, 156, 234, 75, 29, 251, 184, 15, 5, 248, 156, + 234, 75, 29, 243, 110, 15, 5, 248, 156, 234, 75, 29, 243, 111, 94, 231, + 210, 15, 5, 248, 156, 234, 75, 29, 242, 190, 15, 5, 248, 156, 234, 75, + 29, 242, 173, 15, 5, 248, 156, 234, 75, 29, 242, 84, 15, 5, 248, 156, + 234, 75, 29, 159, 15, 5, 248, 156, 234, 75, 29, 235, 177, 15, 5, 248, + 156, 234, 75, 29, 235, 178, 94, 232, 156, 15, 5, 248, 156, 234, 75, 29, + 234, 247, 15, 5, 248, 156, 234, 75, 29, 233, 157, 15, 5, 248, 156, 234, + 75, 29, 232, 156, 15, 5, 248, 156, 234, 75, 29, 232, 157, 94, 231, 209, + 15, 5, 248, 156, 234, 75, 29, 232, 142, 15, 5, 248, 156, 234, 75, 29, + 229, 187, 15, 5, 248, 156, 234, 75, 29, 226, 150, 94, 226, 149, 15, 5, + 248, 156, 234, 75, 29, 220, 117, 15, 5, 248, 156, 234, 75, 29, 218, 22, + 15, 5, 248, 156, 234, 75, 29, 215, 198, 94, 242, 173, 15, 5, 248, 156, + 234, 75, 29, 215, 100, 15, 5, 248, 132, 15, 5, 248, 111, 15, 5, 248, 110, + 15, 5, 248, 109, 15, 5, 247, 211, 15, 5, 247, 194, 15, 5, 247, 169, 15, + 5, 247, 170, 29, 220, 243, 15, 5, 247, 168, 15, 5, 247, 158, 15, 5, 247, + 159, 234, 213, 111, 242, 76, 247, 139, 15, 5, 247, 139, 15, 5, 246, 33, + 15, 5, 246, 34, 110, 246, 33, 15, 5, 246, 34, 242, 75, 15, 5, 246, 34, + 220, 225, 15, 5, 246, 31, 15, 5, 246, 32, 29, 245, 37, 15, 5, 246, 30, + 15, 5, 246, 29, 15, 5, 246, 28, 15, 5, 246, 27, 15, 5, 246, 23, 15, 5, + 246, 21, 15, 5, 246, 22, 242, 75, 15, 5, 246, 22, 242, 76, 242, 75, 15, + 5, 246, 20, 15, 5, 246, 13, 15, 5, 74, 15, 5, 191, 29, 226, 149, 15, 5, + 191, 110, 191, 228, 51, 110, 228, 50, 15, 5, 245, 190, 15, 5, 245, 191, + 29, 118, 94, 242, 30, 94, 248, 164, 15, 5, 245, 191, 29, 243, 72, 15, 5, + 245, 191, 29, 231, 42, 15, 5, 245, 191, 29, 222, 179, 15, 5, 245, 191, + 29, 220, 243, 15, 5, 245, 191, 29, 69, 15, 5, 245, 167, 15, 5, 245, 157, + 15, 5, 245, 131, 15, 5, 245, 108, 15, 5, 245, 109, 29, 243, 80, 15, 5, + 245, 109, 29, 243, 81, 217, 192, 15, 5, 245, 109, 29, 231, 156, 15, 5, + 245, 109, 249, 65, 245, 108, 15, 5, 245, 109, 227, 30, 245, 108, 15, 5, + 245, 109, 219, 165, 15, 5, 245, 52, 15, 5, 245, 50, 15, 5, 245, 37, 15, + 5, 244, 234, 15, 5, 244, 235, 29, 61, 15, 5, 244, 235, 29, 118, 94, 233, + 128, 15, 5, 244, 235, 29, 118, 94, 233, 129, 29, 233, 128, 15, 5, 244, + 235, 29, 254, 32, 15, 5, 244, 235, 29, 252, 94, 15, 5, 244, 235, 29, 246, + 22, 242, 75, 15, 5, 244, 235, 29, 246, 22, 242, 76, 242, 75, 15, 5, 244, + 235, 29, 159, 15, 5, 244, 235, 29, 242, 30, 242, 75, 15, 5, 244, 235, 29, + 236, 31, 242, 75, 15, 5, 244, 235, 29, 234, 212, 15, 5, 244, 235, 29, + 234, 213, 219, 165, 15, 5, 244, 235, 29, 233, 236, 15, 5, 244, 235, 29, + 233, 157, 15, 5, 244, 235, 29, 233, 129, 29, 233, 128, 15, 5, 244, 235, + 29, 233, 13, 15, 5, 244, 235, 29, 232, 156, 15, 5, 244, 235, 29, 215, + 197, 15, 5, 244, 235, 29, 215, 188, 15, 5, 243, 110, 15, 5, 243, 111, + 242, 75, 15, 5, 243, 108, 15, 5, 243, 109, 29, 118, 94, 248, 165, 94, + 159, 15, 5, 243, 109, 29, 118, 94, 159, 15, 5, 243, 109, 29, 118, 94, + 236, 30, 15, 5, 243, 109, 29, 254, 184, 217, 193, 94, 218, 41, 15, 5, + 243, 109, 29, 254, 32, 15, 5, 243, 109, 29, 253, 146, 15, 5, 243, 109, + 29, 253, 145, 94, 243, 94, 15, 5, 243, 109, 29, 252, 94, 15, 5, 243, 109, + 29, 252, 60, 94, 203, 15, 5, 243, 109, 29, 251, 27, 15, 5, 243, 109, 29, + 251, 28, 94, 203, 15, 5, 243, 109, 29, 248, 164, 15, 5, 243, 109, 29, + 247, 211, 15, 5, 243, 109, 29, 247, 170, 29, 220, 243, 15, 5, 243, 109, + 29, 246, 31, 15, 5, 243, 109, 29, 245, 131, 15, 5, 243, 109, 29, 245, + 132, 94, 233, 157, 15, 5, 243, 109, 29, 245, 108, 15, 5, 243, 109, 29, + 245, 109, 29, 243, 81, 217, 192, 15, 5, 243, 109, 29, 243, 81, 217, 192, + 15, 5, 243, 109, 29, 243, 72, 15, 5, 243, 109, 29, 242, 190, 15, 5, 243, + 109, 29, 242, 188, 15, 5, 243, 109, 29, 242, 189, 94, 61, 15, 5, 243, + 109, 29, 242, 174, 94, 219, 27, 15, 5, 243, 109, 29, 242, 30, 94, 232, + 157, 94, 245, 37, 15, 5, 243, 109, 29, 242, 12, 15, 5, 243, 109, 29, 242, + 13, 94, 233, 157, 15, 5, 243, 109, 29, 241, 166, 94, 233, 13, 15, 5, 243, + 109, 29, 240, 208, 15, 5, 243, 109, 29, 236, 31, 242, 75, 15, 5, 243, + 109, 29, 235, 164, 94, 240, 213, 94, 253, 146, 15, 5, 243, 109, 29, 234, + 247, 15, 5, 243, 109, 29, 234, 212, 15, 5, 243, 109, 29, 234, 98, 15, 5, + 243, 109, 29, 234, 99, 94, 233, 128, 15, 5, 243, 109, 29, 233, 237, 94, + 254, 32, 15, 5, 243, 109, 29, 233, 157, 15, 5, 243, 109, 29, 231, 157, + 94, 245, 108, 15, 5, 243, 109, 29, 231, 42, 15, 5, 243, 109, 29, 228, 50, + 15, 5, 243, 109, 29, 228, 51, 110, 228, 50, 15, 5, 243, 109, 29, 193, 15, + 5, 243, 109, 29, 222, 179, 15, 5, 243, 109, 29, 222, 147, 15, 5, 243, + 109, 29, 220, 243, 15, 5, 243, 109, 29, 220, 244, 94, 216, 62, 15, 5, + 243, 109, 29, 220, 210, 15, 5, 243, 109, 29, 218, 244, 15, 5, 243, 109, + 29, 218, 22, 15, 5, 243, 109, 29, 69, 15, 5, 243, 109, 29, 215, 188, 15, + 5, 243, 109, 29, 215, 189, 94, 246, 33, 15, 5, 243, 109, 110, 243, 108, + 15, 5, 243, 103, 15, 5, 243, 104, 249, 65, 243, 103, 15, 5, 243, 101, 15, + 5, 243, 102, 110, 243, 102, 243, 73, 110, 243, 72, 15, 5, 243, 94, 15, 5, + 243, 95, 243, 102, 110, 243, 102, 243, 73, 110, 243, 72, 15, 5, 243, 93, + 15, 5, 243, 91, 15, 5, 243, 82, 15, 5, 243, 80, 15, 5, 243, 81, 217, 192, + 15, 5, 243, 81, 110, 243, 80, 15, 5, 243, 81, 249, 65, 243, 80, 15, 5, + 243, 72, 15, 5, 243, 71, 15, 5, 243, 66, 15, 5, 243, 12, 15, 5, 243, 13, + 29, 233, 217, 15, 5, 242, 190, 15, 5, 242, 191, 29, 74, 15, 5, 242, 191, + 29, 69, 15, 5, 242, 191, 249, 65, 242, 190, 15, 5, 242, 188, 15, 5, 242, + 189, 110, 242, 188, 15, 5, 242, 189, 249, 65, 242, 188, 15, 5, 242, 185, + 15, 5, 242, 173, 15, 5, 242, 174, 242, 75, 15, 5, 242, 171, 15, 5, 242, + 172, 29, 118, 94, 236, 30, 15, 5, 242, 172, 29, 243, 81, 217, 192, 15, 5, + 242, 172, 29, 236, 30, 15, 5, 242, 172, 29, 232, 157, 94, 236, 30, 15, 5, + 242, 172, 29, 193, 15, 5, 242, 168, 15, 5, 242, 166, 15, 5, 242, 167, + 249, 65, 242, 166, 15, 5, 242, 167, 29, 252, 94, 15, 5, 242, 167, 29, + 218, 22, 15, 5, 242, 167, 217, 192, 15, 5, 242, 92, 15, 5, 242, 93, 249, + 65, 242, 92, 15, 5, 242, 90, 15, 5, 242, 91, 29, 234, 247, 15, 5, 242, + 91, 29, 234, 248, 29, 236, 31, 242, 75, 15, 5, 242, 91, 29, 228, 50, 15, + 5, 242, 91, 29, 222, 180, 94, 216, 77, 15, 5, 242, 91, 242, 75, 15, 5, + 242, 84, 15, 5, 242, 85, 29, 118, 94, 233, 217, 15, 5, 242, 85, 29, 233, + 217, 15, 5, 242, 85, 110, 242, 85, 232, 149, 15, 5, 242, 79, 15, 5, 242, + 77, 15, 5, 242, 78, 29, 220, 243, 15, 5, 242, 69, 15, 5, 242, 68, 15, 5, + 242, 65, 15, 5, 242, 64, 15, 5, 159, 15, 5, 242, 30, 217, 192, 15, 5, + 242, 30, 242, 75, 15, 5, 242, 12, 15, 5, 241, 165, 15, 5, 241, 166, 29, + 253, 146, 15, 5, 241, 166, 29, 253, 144, 15, 5, 241, 166, 29, 252, 94, + 15, 5, 241, 166, 29, 247, 139, 15, 5, 241, 166, 29, 243, 101, 15, 5, 241, + 166, 29, 234, 90, 15, 5, 241, 166, 29, 228, 50, 15, 5, 241, 166, 29, 220, + 243, 15, 5, 241, 166, 29, 69, 15, 5, 240, 212, 15, 5, 240, 208, 15, 5, + 240, 209, 29, 254, 32, 15, 5, 240, 209, 29, 242, 12, 15, 5, 240, 209, 29, + 234, 212, 15, 5, 240, 209, 29, 232, 226, 15, 5, 240, 209, 29, 215, 188, + 15, 5, 240, 205, 15, 5, 72, 15, 5, 240, 146, 61, 15, 5, 240, 108, 15, 5, + 236, 58, 15, 5, 236, 59, 110, 236, 59, 251, 27, 15, 5, 236, 59, 110, 236, + 59, 219, 165, 15, 5, 236, 33, 15, 5, 236, 30, 15, 5, 236, 31, 247, 194, + 15, 5, 236, 31, 223, 188, 15, 5, 236, 31, 110, 236, 31, 220, 194, 110, + 220, 194, 215, 189, 110, 215, 188, 15, 5, 236, 31, 242, 75, 15, 5, 236, + 22, 15, 5, 236, 23, 29, 243, 81, 217, 192, 15, 5, 236, 21, 15, 5, 236, + 11, 15, 5, 236, 12, 29, 218, 22, 15, 5, 236, 12, 249, 65, 236, 11, 15, 5, + 236, 12, 227, 30, 236, 11, 15, 5, 236, 12, 219, 165, 15, 5, 236, 4, 15, + 5, 235, 251, 15, 5, 235, 177, 15, 5, 235, 163, 15, 5, 181, 15, 5, 235, + 17, 29, 61, 15, 5, 235, 17, 29, 254, 160, 15, 5, 235, 17, 29, 254, 161, + 94, 233, 236, 15, 5, 235, 17, 29, 253, 144, 15, 5, 235, 17, 29, 252, 94, + 15, 5, 235, 17, 29, 252, 79, 15, 5, 235, 17, 29, 134, 15, 5, 235, 17, 29, + 251, 184, 15, 5, 235, 17, 29, 245, 50, 15, 5, 235, 17, 29, 245, 37, 15, + 5, 235, 17, 29, 243, 110, 15, 5, 235, 17, 29, 243, 94, 15, 5, 235, 17, + 29, 243, 81, 217, 192, 15, 5, 235, 17, 29, 243, 72, 15, 5, 235, 17, 29, + 243, 73, 94, 221, 23, 94, 61, 15, 5, 235, 17, 29, 242, 190, 15, 5, 235, + 17, 29, 242, 173, 15, 5, 235, 17, 29, 242, 167, 94, 222, 147, 15, 5, 235, + 17, 29, 242, 167, 249, 65, 242, 166, 15, 5, 235, 17, 29, 242, 92, 15, 5, + 235, 17, 29, 242, 68, 15, 5, 235, 17, 29, 236, 30, 15, 5, 235, 17, 29, + 236, 11, 15, 5, 235, 17, 29, 234, 247, 15, 5, 235, 17, 29, 234, 101, 15, + 5, 235, 17, 29, 234, 98, 15, 5, 235, 17, 29, 233, 13, 15, 5, 235, 17, 29, + 232, 156, 15, 5, 235, 17, 29, 231, 156, 15, 5, 235, 17, 29, 231, 157, 94, + 246, 33, 15, 5, 235, 17, 29, 231, 157, 94, 242, 190, 15, 5, 235, 17, 29, + 231, 157, 94, 217, 229, 15, 5, 235, 17, 29, 231, 42, 15, 5, 235, 17, 29, + 231, 43, 94, 228, 45, 15, 5, 235, 17, 29, 229, 187, 15, 5, 235, 17, 29, + 228, 50, 15, 5, 235, 17, 29, 225, 240, 15, 5, 235, 17, 29, 223, 51, 15, + 5, 235, 17, 29, 222, 202, 15, 5, 235, 17, 29, 222, 147, 15, 5, 235, 17, + 29, 221, 24, 15, 5, 235, 17, 29, 220, 243, 15, 5, 235, 17, 29, 220, 210, + 15, 5, 235, 17, 29, 220, 150, 15, 5, 235, 17, 29, 220, 108, 15, 5, 235, + 17, 29, 218, 252, 15, 5, 235, 17, 29, 218, 1, 15, 5, 235, 17, 29, 69, 15, + 5, 235, 17, 29, 215, 197, 15, 5, 235, 17, 29, 215, 188, 15, 5, 235, 17, + 29, 215, 163, 29, 193, 15, 5, 235, 17, 29, 215, 100, 15, 5, 235, 17, 29, + 212, 37, 15, 5, 235, 15, 15, 5, 235, 16, 249, 65, 235, 15, 15, 5, 235, 8, + 15, 5, 235, 5, 15, 5, 235, 3, 15, 5, 235, 2, 15, 5, 235, 0, 15, 5, 235, + 1, 110, 235, 0, 15, 5, 234, 247, 15, 5, 234, 248, 29, 236, 31, 242, 75, + 15, 5, 234, 243, 15, 5, 234, 244, 29, 252, 94, 15, 5, 234, 244, 249, 65, + 234, 243, 15, 5, 234, 241, 15, 5, 234, 240, 15, 5, 234, 212, 15, 5, 234, + 213, 233, 141, 29, 111, 110, 233, 141, 29, 69, 15, 5, 234, 213, 110, 234, + 213, 233, 141, 29, 111, 110, 233, 141, 29, 69, 15, 5, 234, 163, 15, 5, + 234, 101, 15, 5, 234, 102, 29, 252, 94, 15, 5, 234, 102, 29, 69, 15, 5, + 234, 102, 29, 215, 188, 15, 5, 234, 98, 15, 5, 234, 90, 15, 5, 234, 77, + 15, 5, 234, 76, 15, 5, 234, 74, 15, 5, 234, 75, 110, 234, 74, 15, 5, 233, + 238, 15, 5, 233, 239, 110, 241, 166, 29, 253, 145, 233, 239, 110, 241, + 166, 29, 253, 144, 15, 5, 233, 236, 15, 5, 233, 234, 15, 5, 233, 235, + 214, 244, 17, 15, 5, 233, 233, 15, 5, 233, 230, 15, 5, 233, 231, 242, 75, + 15, 5, 233, 229, 15, 5, 233, 217, 15, 5, 233, 218, 227, 30, 233, 217, 15, + 5, 233, 212, 15, 5, 233, 194, 15, 5, 233, 157, 15, 5, 233, 140, 15, 5, + 233, 141, 29, 61, 15, 5, 233, 141, 29, 118, 94, 248, 165, 94, 159, 15, 5, + 233, 141, 29, 118, 94, 243, 72, 15, 5, 233, 141, 29, 118, 94, 233, 128, + 15, 5, 233, 141, 29, 254, 86, 15, 5, 233, 141, 29, 254, 32, 15, 5, 233, + 141, 29, 253, 147, 212, 33, 217, 192, 15, 5, 233, 141, 29, 252, 94, 15, + 5, 233, 141, 29, 251, 184, 15, 5, 233, 141, 29, 248, 111, 15, 5, 233, + 141, 29, 245, 108, 15, 5, 233, 141, 29, 243, 110, 15, 5, 233, 141, 29, + 243, 72, 15, 5, 233, 141, 29, 242, 84, 15, 5, 233, 141, 29, 242, 85, 94, + 242, 84, 15, 5, 233, 141, 29, 159, 15, 5, 233, 141, 29, 242, 12, 15, 5, + 233, 141, 29, 241, 166, 29, 228, 50, 15, 5, 233, 141, 29, 236, 31, 242, + 75, 15, 5, 233, 141, 29, 236, 11, 15, 5, 233, 141, 29, 236, 12, 94, 159, + 15, 5, 233, 141, 29, 236, 12, 94, 232, 156, 15, 5, 233, 141, 29, 234, + 101, 15, 5, 233, 141, 29, 234, 90, 15, 5, 233, 141, 29, 233, 236, 15, 5, + 233, 141, 29, 233, 230, 15, 5, 233, 141, 29, 233, 231, 94, 241, 166, 94, + 61, 15, 5, 233, 141, 29, 233, 140, 15, 5, 233, 141, 29, 232, 226, 15, 5, + 233, 141, 29, 232, 156, 15, 5, 233, 141, 29, 232, 144, 15, 5, 233, 141, + 29, 231, 156, 15, 5, 233, 141, 29, 231, 157, 94, 245, 108, 15, 5, 233, + 141, 29, 230, 131, 15, 5, 233, 141, 29, 229, 187, 15, 5, 233, 141, 29, + 220, 244, 94, 218, 244, 15, 5, 233, 141, 29, 220, 190, 94, 242, 167, 94, + 245, 50, 15, 5, 233, 141, 29, 220, 190, 94, 242, 167, 217, 192, 15, 5, + 233, 141, 29, 220, 148, 15, 5, 233, 141, 29, 220, 149, 94, 220, 148, 15, + 5, 233, 141, 29, 218, 244, 15, 5, 233, 141, 29, 218, 33, 15, 5, 233, 141, + 29, 218, 22, 15, 5, 233, 141, 29, 217, 230, 94, 118, 94, 219, 28, 94, + 205, 15, 5, 233, 141, 29, 69, 15, 5, 233, 141, 29, 111, 94, 61, 15, 5, + 233, 141, 29, 111, 94, 111, 94, 69, 15, 5, 233, 141, 29, 215, 198, 94, + 253, 146, 15, 5, 233, 141, 29, 215, 188, 15, 5, 233, 141, 29, 215, 100, + 15, 5, 233, 141, 219, 165, 15, 5, 233, 138, 15, 5, 233, 139, 29, 220, + 243, 15, 5, 233, 139, 29, 220, 244, 94, 218, 244, 15, 5, 233, 139, 242, + 75, 15, 5, 233, 139, 242, 76, 110, 233, 139, 242, 76, 220, 243, 15, 5, + 233, 135, 15, 5, 233, 128, 15, 5, 233, 129, 29, 233, 128, 15, 5, 233, + 126, 15, 5, 233, 127, 29, 233, 217, 15, 5, 233, 127, 29, 233, 218, 94, + 223, 51, 15, 5, 233, 13, 15, 5, 232, 254, 15, 5, 232, 245, 15, 5, 232, + 226, 15, 5, 232, 156, 15, 5, 232, 157, 29, 252, 94, 15, 5, 232, 154, 15, + 5, 232, 155, 29, 254, 86, 15, 5, 232, 155, 29, 252, 94, 15, 5, 232, 155, + 29, 245, 37, 15, 5, 232, 155, 29, 245, 38, 217, 192, 15, 5, 232, 155, 29, + 243, 81, 217, 192, 15, 5, 232, 155, 29, 241, 166, 29, 252, 94, 15, 5, + 232, 155, 29, 236, 11, 15, 5, 232, 155, 29, 235, 5, 15, 5, 232, 155, 29, + 235, 3, 15, 5, 232, 155, 29, 235, 4, 94, 253, 146, 15, 5, 232, 155, 29, + 234, 101, 15, 5, 232, 155, 29, 233, 158, 94, 253, 146, 15, 5, 232, 155, + 29, 233, 140, 15, 5, 232, 155, 29, 231, 157, 94, 245, 108, 15, 5, 232, + 155, 29, 229, 187, 15, 5, 232, 155, 29, 228, 92, 15, 5, 232, 155, 29, + 220, 118, 94, 253, 146, 15, 5, 232, 155, 29, 220, 100, 94, 251, 54, 15, + 5, 232, 155, 29, 216, 77, 15, 5, 232, 155, 217, 192, 15, 5, 232, 155, + 249, 65, 232, 154, 15, 5, 232, 155, 227, 30, 232, 154, 15, 5, 232, 155, + 219, 165, 15, 5, 232, 155, 220, 225, 15, 5, 232, 153, 15, 5, 232, 149, + 15, 5, 232, 150, 110, 232, 149, 15, 5, 232, 150, 227, 30, 232, 149, 15, + 5, 232, 150, 220, 225, 15, 5, 232, 147, 15, 5, 232, 144, 15, 5, 232, 142, + 15, 5, 232, 143, 110, 232, 142, 15, 5, 232, 143, 110, 232, 143, 243, 73, + 110, 243, 72, 15, 5, 188, 15, 5, 232, 43, 29, 218, 22, 15, 5, 232, 43, + 242, 75, 15, 5, 232, 42, 15, 5, 232, 15, 15, 5, 231, 229, 15, 5, 231, + 210, 15, 5, 231, 209, 15, 5, 231, 156, 15, 5, 231, 112, 15, 5, 231, 42, + 15, 5, 231, 1, 15, 5, 230, 172, 15, 5, 230, 173, 110, 230, 172, 15, 5, + 230, 163, 15, 5, 230, 164, 242, 75, 15, 5, 230, 148, 15, 5, 230, 134, 15, + 5, 230, 131, 15, 5, 230, 132, 29, 61, 15, 5, 230, 132, 29, 233, 217, 15, + 5, 230, 132, 29, 212, 109, 15, 5, 230, 132, 110, 230, 131, 15, 5, 230, + 132, 110, 230, 132, 29, 118, 94, 205, 15, 5, 230, 132, 249, 65, 230, 131, + 15, 5, 230, 129, 15, 5, 230, 130, 29, 61, 15, 5, 230, 130, 29, 118, 94, + 247, 211, 15, 5, 230, 130, 29, 247, 211, 15, 5, 230, 130, 242, 75, 15, 5, + 205, 15, 5, 230, 45, 15, 5, 230, 34, 15, 5, 230, 35, 235, 190, 15, 5, + 230, 35, 29, 220, 151, 217, 192, 15, 5, 230, 35, 227, 30, 230, 34, 15, 5, + 230, 33, 15, 5, 230, 28, 228, 36, 15, 5, 230, 27, 15, 5, 230, 26, 15, 5, + 229, 187, 15, 5, 229, 188, 29, 61, 15, 5, 229, 188, 29, 215, 188, 15, 5, + 229, 188, 220, 225, 15, 5, 229, 64, 15, 5, 229, 65, 29, 74, 15, 5, 229, + 63, 15, 5, 229, 34, 15, 5, 229, 35, 29, 243, 81, 217, 192, 15, 5, 229, + 35, 29, 243, 73, 94, 243, 81, 217, 192, 15, 5, 229, 32, 15, 5, 229, 33, + 29, 254, 32, 15, 5, 229, 33, 29, 253, 146, 15, 5, 229, 33, 29, 253, 147, + 94, 253, 146, 15, 5, 229, 33, 29, 242, 84, 15, 5, 229, 33, 29, 231, 157, + 94, 243, 81, 217, 192, 15, 5, 229, 33, 29, 229, 187, 15, 5, 229, 33, 29, + 228, 50, 15, 5, 229, 33, 29, 220, 243, 15, 5, 229, 33, 29, 220, 244, 94, + 118, 254, 32, 15, 5, 229, 33, 29, 220, 244, 94, 253, 146, 15, 5, 229, 33, + 29, 220, 244, 94, 253, 147, 94, 253, 146, 15, 5, 229, 33, 29, 215, 198, + 94, 253, 146, 15, 5, 229, 33, 29, 215, 100, 15, 5, 229, 21, 15, 5, 228, + 92, 15, 5, 228, 65, 15, 5, 228, 50, 15, 5, 228, 51, 233, 139, 29, 243, + 72, 15, 5, 228, 51, 233, 139, 29, 231, 210, 15, 5, 228, 51, 233, 139, 29, + 222, 179, 15, 5, 228, 51, 233, 139, 29, 222, 180, 110, 228, 51, 233, 139, + 29, 222, 179, 15, 5, 228, 51, 233, 139, 29, 215, 100, 15, 5, 228, 51, + 217, 192, 15, 5, 228, 51, 110, 228, 50, 15, 5, 228, 51, 249, 65, 228, 50, + 15, 5, 228, 51, 249, 65, 228, 51, 233, 139, 110, 233, 138, 15, 5, 228, + 45, 15, 5, 228, 46, 254, 184, 29, 253, 141, 15, 5, 228, 46, 254, 184, 29, + 251, 184, 15, 5, 228, 46, 254, 184, 29, 246, 29, 15, 5, 228, 46, 254, + 184, 29, 242, 84, 15, 5, 228, 46, 254, 184, 29, 236, 31, 242, 75, 15, 5, + 228, 46, 254, 184, 29, 235, 3, 15, 5, 228, 46, 254, 184, 29, 233, 157, + 15, 5, 228, 46, 254, 184, 29, 229, 187, 15, 5, 228, 46, 254, 184, 29, + 220, 97, 15, 5, 228, 46, 254, 184, 29, 215, 197, 15, 5, 228, 46, 234, 75, + 29, 251, 184, 15, 5, 228, 46, 234, 75, 29, 251, 185, 69, 15, 5, 193, 15, + 5, 226, 204, 15, 5, 226, 174, 15, 5, 226, 149, 15, 5, 226, 37, 15, 5, + 225, 240, 15, 5, 225, 241, 29, 61, 15, 5, 225, 241, 29, 254, 185, 15, 5, + 225, 241, 29, 251, 184, 15, 5, 225, 241, 29, 251, 54, 15, 5, 225, 241, + 29, 74, 15, 5, 225, 241, 29, 72, 15, 5, 225, 241, 29, 240, 108, 15, 5, + 225, 241, 29, 69, 15, 5, 225, 241, 29, 215, 197, 15, 5, 225, 241, 249, + 65, 225, 240, 15, 5, 225, 185, 15, 5, 225, 186, 29, 234, 243, 15, 5, 225, + 186, 29, 215, 188, 15, 5, 225, 186, 29, 212, 109, 15, 5, 225, 186, 227, + 30, 225, 185, 15, 5, 203, 15, 5, 224, 72, 15, 5, 223, 188, 15, 5, 223, + 51, 15, 5, 222, 202, 15, 5, 222, 191, 228, 36, 15, 5, 222, 190, 15, 5, + 222, 191, 29, 61, 15, 5, 222, 191, 29, 246, 33, 15, 5, 222, 191, 29, 246, + 31, 15, 5, 222, 191, 29, 159, 15, 5, 222, 191, 29, 234, 247, 15, 5, 222, + 191, 29, 233, 217, 15, 5, 222, 191, 29, 232, 142, 15, 5, 222, 191, 29, + 231, 42, 15, 5, 222, 191, 29, 228, 50, 15, 5, 222, 191, 29, 222, 179, 15, + 5, 222, 191, 29, 220, 210, 15, 5, 222, 191, 29, 218, 41, 15, 5, 222, 191, + 29, 215, 197, 15, 5, 222, 191, 29, 215, 194, 15, 5, 222, 191, 29, 215, + 167, 15, 5, 222, 191, 29, 215, 121, 15, 5, 222, 191, 29, 215, 100, 15, 5, + 222, 191, 110, 222, 190, 15, 5, 222, 191, 242, 75, 15, 5, 222, 179, 15, + 5, 222, 180, 233, 141, 29, 253, 144, 15, 5, 222, 155, 15, 5, 222, 147, + 15, 5, 221, 24, 15, 5, 221, 22, 15, 5, 221, 23, 29, 61, 15, 5, 221, 23, + 29, 252, 94, 15, 5, 221, 23, 29, 242, 166, 15, 5, 221, 23, 29, 229, 187, + 15, 5, 221, 23, 29, 220, 148, 15, 5, 221, 23, 29, 216, 62, 15, 5, 221, + 23, 29, 69, 15, 5, 221, 23, 29, 111, 94, 61, 15, 5, 221, 21, 15, 5, 221, + 19, 15, 5, 221, 1, 15, 5, 220, 243, 15, 5, 220, 244, 240, 212, 15, 5, + 220, 244, 110, 220, 244, 243, 102, 110, 243, 102, 243, 73, 110, 243, 72, + 15, 5, 220, 244, 110, 220, 244, 218, 42, 110, 218, 42, 243, 73, 110, 243, + 72, 15, 5, 220, 236, 15, 5, 220, 231, 15, 5, 220, 228, 15, 5, 220, 227, + 15, 5, 220, 224, 15, 5, 220, 210, 15, 5, 220, 211, 29, 61, 15, 5, 220, + 211, 29, 236, 11, 15, 5, 220, 204, 15, 5, 220, 205, 29, 61, 15, 5, 220, + 205, 29, 252, 80, 15, 5, 220, 205, 29, 251, 38, 15, 5, 220, 205, 29, 247, + 158, 15, 5, 220, 205, 29, 243, 72, 15, 5, 220, 205, 29, 236, 30, 15, 5, + 220, 205, 29, 236, 31, 242, 75, 15, 5, 220, 205, 29, 233, 212, 15, 5, + 220, 205, 29, 232, 144, 15, 5, 220, 205, 29, 230, 163, 15, 5, 220, 205, + 29, 222, 179, 15, 5, 220, 198, 15, 5, 220, 193, 15, 5, 220, 194, 217, + 192, 15, 5, 220, 194, 110, 220, 194, 251, 28, 110, 251, 27, 15, 5, 220, + 189, 15, 5, 220, 150, 15, 5, 220, 151, 110, 235, 191, 220, 150, 15, 5, + 220, 148, 15, 5, 220, 147, 15, 5, 220, 117, 15, 5, 220, 118, 242, 75, 15, + 5, 220, 108, 15, 5, 220, 106, 15, 5, 220, 107, 110, 220, 107, 220, 148, + 15, 5, 220, 99, 15, 5, 220, 97, 15, 5, 219, 27, 15, 5, 219, 28, 110, 219, + 27, 15, 5, 218, 255, 15, 5, 218, 254, 15, 5, 218, 252, 15, 5, 218, 244, + 15, 5, 218, 243, 15, 5, 218, 217, 15, 5, 218, 216, 15, 5, 218, 52, 15, 5, + 218, 53, 253, 132, 15, 5, 218, 53, 29, 241, 165, 15, 5, 218, 53, 29, 231, + 42, 15, 5, 218, 53, 242, 75, 15, 5, 218, 41, 15, 5, 218, 42, 110, 218, + 42, 229, 65, 110, 229, 65, 247, 140, 110, 247, 139, 15, 5, 218, 42, 219, + 165, 15, 5, 218, 33, 15, 5, 126, 29, 251, 184, 15, 5, 126, 29, 242, 84, + 15, 5, 126, 29, 220, 243, 15, 5, 126, 29, 220, 150, 15, 5, 126, 29, 216, + 77, 15, 5, 126, 29, 215, 188, 15, 5, 218, 22, 15, 5, 218, 1, 15, 5, 217, + 229, 15, 5, 217, 230, 242, 75, 15, 5, 217, 71, 15, 5, 217, 72, 217, 192, + 15, 5, 217, 44, 15, 5, 217, 25, 15, 5, 217, 26, 29, 218, 22, 15, 5, 217, + 26, 110, 217, 25, 15, 5, 217, 26, 110, 217, 26, 243, 102, 110, 243, 102, + 243, 73, 110, 243, 72, 15, 5, 216, 82, 15, 5, 216, 77, 15, 5, 216, 75, + 15, 5, 216, 72, 15, 5, 216, 62, 15, 5, 216, 63, 110, 216, 63, 212, 110, + 110, 212, 109, 15, 5, 69, 15, 5, 111, 242, 84, 15, 5, 111, 111, 69, 15, + 5, 111, 110, 111, 226, 214, 110, 226, 214, 243, 73, 110, 243, 72, 15, 5, + 111, 110, 111, 218, 218, 110, 218, 217, 15, 5, 111, 110, 111, 111, 223, + 202, 110, 111, 223, 201, 15, 5, 215, 197, 15, 5, 215, 194, 15, 5, 215, + 188, 15, 5, 215, 189, 233, 212, 15, 5, 215, 189, 29, 252, 94, 15, 5, 215, + 189, 29, 231, 42, 15, 5, 215, 189, 29, 111, 94, 111, 94, 69, 15, 5, 215, + 189, 29, 111, 94, 111, 94, 111, 242, 75, 15, 5, 215, 189, 242, 75, 15, 5, + 215, 189, 220, 225, 15, 5, 215, 189, 220, 226, 29, 252, 94, 15, 5, 215, + 184, 15, 5, 215, 167, 15, 5, 215, 168, 29, 233, 140, 15, 5, 215, 168, 29, + 231, 157, 94, 248, 164, 15, 5, 215, 168, 29, 221, 22, 15, 5, 215, 168, + 29, 69, 15, 5, 215, 166, 15, 5, 215, 162, 15, 5, 215, 163, 29, 234, 212, + 15, 5, 215, 163, 29, 193, 15, 5, 215, 160, 15, 5, 215, 161, 242, 75, 15, + 5, 215, 121, 15, 5, 215, 122, 249, 65, 215, 121, 15, 5, 215, 122, 220, + 225, 15, 5, 215, 119, 15, 5, 215, 120, 29, 118, 94, 159, 15, 5, 215, 120, + 29, 118, 94, 205, 15, 5, 215, 120, 29, 254, 86, 15, 5, 215, 120, 29, 159, + 15, 5, 215, 120, 29, 228, 50, 15, 5, 215, 120, 29, 215, 197, 15, 5, 215, + 120, 29, 215, 198, 94, 253, 146, 15, 5, 215, 120, 29, 215, 198, 94, 251, + 184, 15, 5, 215, 118, 15, 5, 215, 115, 15, 5, 215, 114, 15, 5, 215, 110, + 15, 5, 215, 111, 29, 61, 15, 5, 215, 111, 29, 253, 141, 15, 5, 215, 111, + 29, 134, 15, 5, 215, 111, 29, 246, 23, 15, 5, 215, 111, 29, 243, 110, 15, + 5, 215, 111, 29, 243, 94, 15, 5, 215, 111, 29, 243, 81, 217, 192, 15, 5, + 215, 111, 29, 243, 72, 15, 5, 215, 111, 29, 242, 92, 15, 5, 215, 111, 29, + 159, 15, 5, 215, 111, 29, 236, 30, 15, 5, 215, 111, 29, 236, 11, 15, 5, + 215, 111, 29, 235, 163, 15, 5, 215, 111, 29, 234, 101, 15, 5, 215, 111, + 29, 232, 142, 15, 5, 215, 111, 29, 231, 1, 15, 5, 215, 111, 29, 193, 15, + 5, 215, 111, 29, 220, 243, 15, 5, 215, 111, 29, 220, 106, 15, 5, 215, + 111, 29, 216, 82, 15, 5, 215, 111, 29, 111, 94, 242, 84, 15, 5, 215, 111, + 29, 215, 188, 15, 5, 215, 111, 29, 215, 108, 15, 5, 215, 108, 15, 5, 215, + 109, 29, 69, 15, 5, 215, 100, 15, 5, 215, 101, 29, 61, 15, 5, 215, 101, + 29, 233, 238, 15, 5, 215, 101, 29, 233, 217, 15, 5, 215, 101, 29, 218, + 22, 15, 5, 215, 96, 15, 5, 215, 99, 15, 5, 215, 97, 15, 5, 215, 93, 15, + 5, 215, 82, 15, 5, 215, 83, 29, 234, 212, 15, 5, 215, 81, 15, 5, 212, + 109, 15, 5, 212, 110, 217, 192, 15, 5, 212, 110, 91, 29, 233, 217, 15, 5, + 212, 106, 15, 5, 212, 99, 15, 5, 212, 86, 15, 5, 212, 37, 15, 5, 212, 38, + 110, 212, 37, 15, 5, 212, 36, 15, 5, 212, 34, 15, 5, 212, 35, 235, 7, + 217, 192, 15, 5, 212, 29, 15, 5, 212, 21, 15, 5, 212, 8, 15, 5, 212, 6, + 15, 5, 212, 7, 29, 61, 15, 5, 212, 5, 15, 5, 212, 4, 15, 128, 5, 117, + 253, 146, 15, 128, 5, 133, 253, 146, 15, 128, 5, 243, 237, 253, 146, 15, + 128, 5, 244, 50, 253, 146, 15, 128, 5, 220, 53, 253, 146, 15, 128, 5, + 221, 43, 253, 146, 15, 128, 5, 245, 150, 253, 146, 15, 128, 5, 229, 31, + 253, 146, 15, 128, 5, 133, 247, 139, 15, 128, 5, 243, 237, 247, 139, 15, + 128, 5, 244, 50, 247, 139, 15, 128, 5, 220, 53, 247, 139, 15, 128, 5, + 221, 43, 247, 139, 15, 128, 5, 245, 150, 247, 139, 15, 128, 5, 229, 31, + 247, 139, 15, 128, 5, 243, 237, 69, 15, 128, 5, 244, 50, 69, 15, 128, 5, + 220, 53, 69, 15, 128, 5, 221, 43, 69, 15, 128, 5, 245, 150, 69, 15, 128, + 5, 229, 31, 69, 15, 128, 5, 122, 243, 14, 15, 128, 5, 117, 243, 14, 15, + 128, 5, 133, 243, 14, 15, 128, 5, 243, 237, 243, 14, 15, 128, 5, 244, 50, + 243, 14, 15, 128, 5, 220, 53, 243, 14, 15, 128, 5, 221, 43, 243, 14, 15, + 128, 5, 245, 150, 243, 14, 15, 128, 5, 229, 31, 243, 14, 15, 128, 5, 122, + 243, 11, 15, 128, 5, 117, 243, 11, 15, 128, 5, 133, 243, 11, 15, 128, 5, + 243, 237, 243, 11, 15, 128, 5, 244, 50, 243, 11, 15, 128, 5, 117, 221, 1, + 15, 128, 5, 133, 221, 1, 15, 128, 5, 133, 221, 2, 214, 244, 17, 15, 128, + 5, 243, 237, 221, 1, 15, 128, 5, 244, 50, 221, 1, 15, 128, 5, 220, 53, + 221, 1, 15, 128, 5, 221, 43, 221, 1, 15, 128, 5, 245, 150, 221, 1, 15, + 128, 5, 229, 31, 221, 1, 15, 128, 5, 122, 220, 252, 15, 128, 5, 117, 220, + 252, 15, 128, 5, 133, 220, 252, 15, 128, 5, 133, 220, 253, 214, 244, 17, + 15, 128, 5, 243, 237, 220, 252, 15, 128, 5, 244, 50, 220, 252, 15, 128, + 5, 221, 2, 29, 243, 95, 94, 247, 139, 15, 128, 5, 221, 2, 29, 243, 95, + 94, 231, 1, 15, 128, 5, 122, 251, 24, 15, 128, 5, 117, 251, 24, 15, 128, + 5, 133, 251, 24, 15, 128, 5, 133, 251, 25, 214, 244, 17, 15, 128, 5, 243, + 237, 251, 24, 15, 128, 5, 244, 50, 251, 24, 15, 128, 5, 133, 214, 244, + 243, 245, 245, 39, 15, 128, 5, 133, 214, 244, 243, 245, 245, 36, 15, 128, + 5, 243, 237, 214, 244, 243, 245, 232, 246, 15, 128, 5, 243, 237, 214, + 244, 243, 245, 232, 244, 15, 128, 5, 243, 237, 214, 244, 243, 245, 232, + 247, 61, 15, 128, 5, 243, 237, 214, 244, 243, 245, 232, 247, 253, 74, 15, + 128, 5, 220, 53, 214, 244, 243, 245, 253, 143, 15, 128, 5, 221, 43, 214, + 244, 243, 245, 236, 3, 15, 128, 5, 221, 43, 214, 244, 243, 245, 236, 5, + 61, 15, 128, 5, 221, 43, 214, 244, 243, 245, 236, 5, 253, 74, 15, 128, 5, + 245, 150, 214, 244, 243, 245, 215, 95, 15, 128, 5, 245, 150, 214, 244, + 243, 245, 215, 94, 15, 128, 5, 229, 31, 214, 244, 243, 245, 236, 19, 15, + 128, 5, 229, 31, 214, 244, 243, 245, 236, 18, 15, 128, 5, 229, 31, 214, + 244, 243, 245, 236, 17, 15, 128, 5, 229, 31, 214, 244, 243, 245, 236, 20, + 61, 15, 128, 5, 117, 253, 147, 217, 192, 15, 128, 5, 133, 253, 147, 217, + 192, 15, 128, 5, 243, 237, 253, 147, 217, 192, 15, 128, 5, 244, 50, 253, + 147, 217, 192, 15, 128, 5, 220, 53, 253, 147, 217, 192, 15, 128, 5, 122, + 252, 69, 15, 128, 5, 117, 252, 69, 15, 128, 5, 133, 252, 69, 15, 128, 5, + 243, 237, 252, 69, 15, 128, 5, 243, 237, 252, 70, 214, 244, 17, 15, 128, + 5, 244, 50, 252, 69, 15, 128, 5, 244, 50, 252, 70, 214, 244, 17, 15, 128, + 5, 229, 41, 15, 128, 5, 229, 42, 15, 128, 5, 122, 245, 35, 15, 128, 5, + 117, 245, 35, 15, 128, 5, 122, 217, 122, 247, 139, 15, 128, 5, 117, 217, + 120, 247, 139, 15, 128, 5, 244, 50, 220, 42, 247, 139, 15, 128, 5, 122, + 217, 122, 214, 244, 243, 245, 61, 15, 128, 5, 117, 217, 120, 214, 244, + 243, 245, 61, 15, 128, 5, 122, 245, 146, 253, 146, 15, 128, 5, 122, 224, + 167, 253, 146, 15, 128, 5, 53, 253, 135, 122, 220, 43, 15, 128, 5, 53, + 253, 135, 122, 224, 166, 15, 225, 27, 5, 53, 253, 135, 213, 196, 247, + 124, 15, 225, 27, 5, 71, 249, 164, 15, 225, 27, 5, 247, 207, 249, 164, + 15, 225, 27, 5, 247, 207, 216, 179, 10, 11, 255, 58, 10, 11, 255, 57, 10, + 11, 255, 56, 10, 11, 255, 55, 10, 11, 255, 54, 10, 11, 255, 53, 10, 11, + 255, 52, 10, 11, 255, 51, 10, 11, 255, 50, 10, 11, 255, 49, 10, 11, 255, + 48, 10, 11, 255, 47, 10, 11, 255, 46, 10, 11, 255, 45, 10, 11, 255, 44, + 10, 11, 255, 43, 10, 11, 255, 42, 10, 11, 255, 41, 10, 11, 255, 40, 10, + 11, 255, 39, 10, 11, 255, 38, 10, 11, 255, 37, 10, 11, 255, 36, 10, 11, + 255, 35, 10, 11, 255, 34, 10, 11, 255, 33, 10, 11, 255, 32, 10, 11, 255, + 31, 10, 11, 255, 30, 10, 11, 255, 29, 10, 11, 255, 28, 10, 11, 255, 27, + 10, 11, 255, 26, 10, 11, 255, 25, 10, 11, 255, 24, 10, 11, 255, 23, 10, + 11, 255, 22, 10, 11, 255, 21, 10, 11, 255, 20, 10, 11, 255, 19, 10, 11, + 255, 18, 10, 11, 255, 17, 10, 11, 255, 16, 10, 11, 255, 15, 10, 11, 255, + 14, 10, 11, 255, 13, 10, 11, 255, 12, 10, 11, 255, 11, 10, 11, 255, 10, + 10, 11, 255, 9, 10, 11, 255, 8, 10, 11, 255, 7, 10, 11, 255, 6, 10, 11, + 255, 5, 10, 11, 255, 4, 10, 11, 255, 3, 10, 11, 255, 2, 10, 11, 255, 1, + 10, 11, 255, 0, 10, 11, 254, 255, 10, 11, 254, 254, 10, 11, 254, 253, 10, + 11, 254, 252, 10, 11, 254, 251, 10, 11, 254, 250, 10, 11, 254, 249, 10, + 11, 254, 248, 10, 11, 254, 247, 10, 11, 254, 246, 10, 11, 254, 245, 10, + 11, 254, 244, 10, 11, 254, 243, 10, 11, 254, 242, 10, 11, 254, 241, 10, + 11, 254, 240, 10, 11, 254, 239, 10, 11, 254, 238, 10, 11, 254, 237, 10, + 11, 254, 236, 10, 11, 254, 235, 10, 11, 253, 72, 10, 11, 253, 70, 10, 11, + 253, 68, 10, 11, 253, 66, 10, 11, 253, 64, 10, 11, 253, 63, 10, 11, 253, + 61, 10, 11, 253, 59, 10, 11, 253, 57, 10, 11, 253, 55, 10, 11, 250, 248, + 10, 11, 250, 247, 10, 11, 250, 246, 10, 11, 250, 245, 10, 11, 250, 244, + 10, 11, 250, 243, 10, 11, 250, 242, 10, 11, 250, 241, 10, 11, 250, 240, + 10, 11, 250, 239, 10, 11, 250, 238, 10, 11, 250, 237, 10, 11, 250, 236, + 10, 11, 250, 235, 10, 11, 250, 234, 10, 11, 250, 233, 10, 11, 250, 232, + 10, 11, 250, 231, 10, 11, 250, 230, 10, 11, 250, 229, 10, 11, 250, 228, + 10, 11, 250, 227, 10, 11, 250, 226, 10, 11, 250, 225, 10, 11, 250, 224, + 10, 11, 250, 223, 10, 11, 250, 222, 10, 11, 250, 221, 10, 11, 249, 2, 10, + 11, 249, 1, 10, 11, 249, 0, 10, 11, 248, 255, 10, 11, 248, 254, 10, 11, + 248, 253, 10, 11, 248, 252, 10, 11, 248, 251, 10, 11, 248, 250, 10, 11, + 248, 249, 10, 11, 248, 248, 10, 11, 248, 247, 10, 11, 248, 246, 10, 11, + 248, 245, 10, 11, 248, 244, 10, 11, 248, 243, 10, 11, 248, 242, 10, 11, + 248, 241, 10, 11, 248, 240, 10, 11, 248, 239, 10, 11, 248, 238, 10, 11, + 248, 237, 10, 11, 248, 236, 10, 11, 248, 235, 10, 11, 248, 234, 10, 11, + 248, 233, 10, 11, 248, 232, 10, 11, 248, 231, 10, 11, 248, 230, 10, 11, + 248, 229, 10, 11, 248, 228, 10, 11, 248, 227, 10, 11, 248, 226, 10, 11, + 248, 225, 10, 11, 248, 224, 10, 11, 248, 223, 10, 11, 248, 222, 10, 11, + 248, 221, 10, 11, 248, 220, 10, 11, 248, 219, 10, 11, 248, 218, 10, 11, + 248, 217, 10, 11, 248, 216, 10, 11, 248, 215, 10, 11, 248, 214, 10, 11, + 248, 213, 10, 11, 248, 212, 10, 11, 248, 211, 10, 11, 248, 210, 10, 11, + 248, 209, 10, 11, 248, 208, 10, 11, 248, 207, 10, 11, 248, 206, 10, 11, + 248, 205, 10, 11, 248, 204, 10, 11, 248, 203, 10, 11, 248, 202, 10, 11, + 248, 201, 10, 11, 248, 200, 10, 11, 248, 199, 10, 11, 248, 198, 10, 11, + 248, 197, 10, 11, 248, 196, 10, 11, 248, 195, 10, 11, 248, 194, 10, 11, + 248, 193, 10, 11, 248, 192, 10, 11, 248, 191, 10, 11, 248, 190, 10, 11, + 248, 189, 10, 11, 248, 188, 10, 11, 248, 187, 10, 11, 248, 186, 10, 11, + 248, 185, 10, 11, 248, 184, 10, 11, 248, 183, 10, 11, 248, 182, 10, 11, + 248, 181, 10, 11, 248, 180, 10, 11, 248, 179, 10, 11, 248, 178, 10, 11, + 248, 177, 10, 11, 248, 176, 10, 11, 248, 175, 10, 11, 248, 174, 10, 11, + 248, 173, 10, 11, 248, 172, 10, 11, 248, 171, 10, 11, 248, 170, 10, 11, + 248, 169, 10, 11, 248, 168, 10, 11, 248, 167, 10, 11, 245, 235, 10, 11, + 245, 234, 10, 11, 245, 233, 10, 11, 245, 232, 10, 11, 245, 231, 10, 11, + 245, 230, 10, 11, 245, 229, 10, 11, 245, 228, 10, 11, 245, 227, 10, 11, + 245, 226, 10, 11, 245, 225, 10, 11, 245, 224, 10, 11, 245, 223, 10, 11, + 245, 222, 10, 11, 245, 221, 10, 11, 245, 220, 10, 11, 245, 219, 10, 11, + 245, 218, 10, 11, 245, 217, 10, 11, 245, 216, 10, 11, 245, 215, 10, 11, + 245, 214, 10, 11, 245, 213, 10, 11, 245, 212, 10, 11, 245, 211, 10, 11, + 245, 210, 10, 11, 245, 209, 10, 11, 245, 208, 10, 11, 245, 207, 10, 11, + 245, 206, 10, 11, 245, 205, 10, 11, 245, 204, 10, 11, 245, 203, 10, 11, + 245, 202, 10, 11, 245, 201, 10, 11, 245, 200, 10, 11, 245, 199, 10, 11, + 245, 198, 10, 11, 245, 197, 10, 11, 245, 196, 10, 11, 245, 195, 10, 11, + 245, 194, 10, 11, 245, 193, 10, 11, 245, 192, 10, 11, 244, 229, 10, 11, + 244, 228, 10, 11, 244, 227, 10, 11, 244, 226, 10, 11, 244, 225, 10, 11, + 244, 224, 10, 11, 244, 223, 10, 11, 244, 222, 10, 11, 244, 221, 10, 11, + 244, 220, 10, 11, 244, 219, 10, 11, 244, 218, 10, 11, 244, 217, 10, 11, + 244, 216, 10, 11, 244, 215, 10, 11, 244, 214, 10, 11, 244, 213, 10, 11, + 244, 212, 10, 11, 244, 211, 10, 11, 244, 210, 10, 11, 244, 209, 10, 11, + 244, 208, 10, 11, 244, 207, 10, 11, 244, 206, 10, 11, 244, 205, 10, 11, + 244, 204, 10, 11, 244, 203, 10, 11, 244, 202, 10, 11, 244, 201, 10, 11, + 244, 200, 10, 11, 244, 199, 10, 11, 244, 198, 10, 11, 244, 197, 10, 11, + 244, 196, 10, 11, 244, 195, 10, 11, 244, 194, 10, 11, 244, 193, 10, 11, + 244, 192, 10, 11, 244, 191, 10, 11, 244, 190, 10, 11, 244, 189, 10, 11, + 244, 188, 10, 11, 244, 187, 10, 11, 244, 186, 10, 11, 244, 185, 10, 11, + 244, 184, 10, 11, 244, 183, 10, 11, 244, 182, 10, 11, 244, 181, 10, 11, + 244, 180, 10, 11, 244, 179, 10, 11, 244, 178, 10, 11, 244, 177, 10, 11, + 244, 176, 10, 11, 244, 175, 10, 11, 244, 174, 10, 11, 244, 173, 10, 11, + 244, 172, 10, 11, 244, 171, 10, 11, 244, 170, 10, 11, 244, 169, 10, 11, + 244, 168, 10, 11, 244, 167, 10, 11, 244, 166, 10, 11, 244, 165, 10, 11, + 243, 176, 10, 11, 243, 175, 10, 11, 243, 174, 10, 11, 243, 173, 10, 11, + 243, 172, 10, 11, 243, 171, 10, 11, 243, 170, 10, 11, 243, 169, 10, 11, + 243, 168, 10, 11, 243, 167, 10, 11, 243, 166, 10, 11, 243, 165, 10, 11, + 243, 164, 10, 11, 243, 163, 10, 11, 243, 162, 10, 11, 243, 161, 10, 11, + 243, 160, 10, 11, 243, 159, 10, 11, 243, 158, 10, 11, 243, 157, 10, 11, + 243, 156, 10, 11, 243, 155, 10, 11, 243, 154, 10, 11, 243, 153, 10, 11, + 243, 152, 10, 11, 243, 151, 10, 11, 243, 150, 10, 11, 243, 149, 10, 11, + 243, 148, 10, 11, 243, 147, 10, 11, 243, 146, 10, 11, 243, 145, 10, 11, + 243, 144, 10, 11, 243, 143, 10, 11, 243, 142, 10, 11, 243, 141, 10, 11, + 243, 140, 10, 11, 243, 139, 10, 11, 243, 138, 10, 11, 243, 137, 10, 11, + 243, 136, 10, 11, 243, 135, 10, 11, 243, 134, 10, 11, 243, 133, 10, 11, + 243, 132, 10, 11, 243, 131, 10, 11, 243, 130, 10, 11, 243, 129, 10, 11, + 243, 128, 10, 11, 243, 127, 10, 11, 243, 126, 10, 11, 243, 125, 10, 11, + 243, 124, 10, 11, 243, 123, 10, 11, 243, 122, 10, 11, 243, 121, 10, 11, + 243, 120, 10, 11, 243, 119, 10, 11, 243, 118, 10, 11, 243, 117, 10, 11, + 243, 116, 10, 11, 243, 115, 10, 11, 243, 114, 10, 11, 243, 113, 10, 11, + 242, 39, 10, 11, 242, 38, 10, 11, 242, 37, 10, 11, 242, 36, 10, 11, 242, + 35, 10, 11, 242, 34, 10, 11, 242, 33, 10, 11, 242, 32, 10, 11, 242, 31, + 10, 11, 240, 130, 10, 11, 240, 129, 10, 11, 240, 128, 10, 11, 240, 127, + 10, 11, 240, 126, 10, 11, 240, 125, 10, 11, 240, 124, 10, 11, 240, 123, + 10, 11, 240, 122, 10, 11, 240, 121, 10, 11, 240, 120, 10, 11, 240, 119, + 10, 11, 240, 118, 10, 11, 240, 117, 10, 11, 240, 116, 10, 11, 240, 115, + 10, 11, 240, 114, 10, 11, 240, 113, 10, 11, 240, 112, 10, 11, 235, 26, + 10, 11, 235, 25, 10, 11, 235, 24, 10, 11, 235, 23, 10, 11, 235, 22, 10, + 11, 235, 21, 10, 11, 235, 20, 10, 11, 235, 19, 10, 11, 233, 168, 10, 11, + 233, 167, 10, 11, 233, 166, 10, 11, 233, 165, 10, 11, 233, 164, 10, 11, + 233, 163, 10, 11, 233, 162, 10, 11, 233, 161, 10, 11, 233, 160, 10, 11, + 233, 159, 10, 11, 232, 109, 10, 11, 232, 108, 10, 11, 232, 107, 10, 11, + 232, 106, 10, 11, 232, 105, 10, 11, 232, 104, 10, 11, 232, 103, 10, 11, + 232, 102, 10, 11, 232, 101, 10, 11, 232, 100, 10, 11, 232, 99, 10, 11, + 232, 98, 10, 11, 232, 97, 10, 11, 232, 96, 10, 11, 232, 95, 10, 11, 232, + 94, 10, 11, 232, 93, 10, 11, 232, 92, 10, 11, 232, 91, 10, 11, 232, 90, + 10, 11, 232, 89, 10, 11, 232, 88, 10, 11, 232, 87, 10, 11, 232, 86, 10, + 11, 232, 85, 10, 11, 232, 84, 10, 11, 232, 83, 10, 11, 232, 82, 10, 11, + 232, 81, 10, 11, 232, 80, 10, 11, 232, 79, 10, 11, 232, 78, 10, 11, 232, + 77, 10, 11, 232, 76, 10, 11, 232, 75, 10, 11, 232, 74, 10, 11, 232, 73, + 10, 11, 232, 72, 10, 11, 232, 71, 10, 11, 232, 70, 10, 11, 232, 69, 10, + 11, 232, 68, 10, 11, 232, 67, 10, 11, 232, 66, 10, 11, 232, 65, 10, 11, + 232, 64, 10, 11, 232, 63, 10, 11, 232, 62, 10, 11, 232, 61, 10, 11, 232, + 60, 10, 11, 232, 59, 10, 11, 232, 58, 10, 11, 232, 57, 10, 11, 232, 56, + 10, 11, 232, 55, 10, 11, 232, 54, 10, 11, 232, 53, 10, 11, 232, 52, 10, + 11, 232, 51, 10, 11, 232, 50, 10, 11, 232, 49, 10, 11, 232, 48, 10, 11, + 232, 47, 10, 11, 232, 46, 10, 11, 232, 45, 10, 11, 232, 44, 10, 11, 230, + 95, 10, 11, 230, 94, 10, 11, 230, 93, 10, 11, 230, 92, 10, 11, 230, 91, + 10, 11, 230, 90, 10, 11, 230, 89, 10, 11, 230, 88, 10, 11, 230, 87, 10, + 11, 230, 86, 10, 11, 230, 85, 10, 11, 230, 84, 10, 11, 230, 83, 10, 11, + 230, 82, 10, 11, 230, 81, 10, 11, 230, 80, 10, 11, 230, 79, 10, 11, 230, + 78, 10, 11, 230, 77, 10, 11, 230, 76, 10, 11, 230, 75, 10, 11, 230, 74, + 10, 11, 230, 73, 10, 11, 230, 72, 10, 11, 230, 71, 10, 11, 230, 70, 10, + 11, 230, 69, 10, 11, 230, 68, 10, 11, 230, 67, 10, 11, 230, 66, 10, 11, + 230, 65, 10, 11, 230, 64, 10, 11, 230, 63, 10, 11, 230, 62, 10, 11, 230, + 61, 10, 11, 230, 60, 10, 11, 230, 59, 10, 11, 230, 58, 10, 11, 230, 57, + 10, 11, 230, 56, 10, 11, 230, 55, 10, 11, 230, 54, 10, 11, 230, 53, 10, + 11, 230, 52, 10, 11, 230, 51, 10, 11, 230, 50, 10, 11, 230, 49, 10, 11, + 230, 48, 10, 11, 230, 47, 10, 11, 228, 222, 10, 11, 228, 221, 10, 11, + 228, 220, 10, 11, 228, 219, 10, 11, 228, 218, 10, 11, 228, 217, 10, 11, + 228, 216, 10, 11, 228, 215, 10, 11, 228, 214, 10, 11, 228, 213, 10, 11, + 228, 212, 10, 11, 228, 211, 10, 11, 228, 210, 10, 11, 228, 209, 10, 11, + 228, 208, 10, 11, 228, 207, 10, 11, 228, 206, 10, 11, 228, 205, 10, 11, + 228, 204, 10, 11, 228, 203, 10, 11, 228, 202, 10, 11, 228, 201, 10, 11, + 228, 91, 10, 11, 228, 90, 10, 11, 228, 89, 10, 11, 228, 88, 10, 11, 228, + 87, 10, 11, 228, 86, 10, 11, 228, 85, 10, 11, 228, 84, 10, 11, 228, 83, + 10, 11, 228, 82, 10, 11, 228, 81, 10, 11, 228, 80, 10, 11, 228, 79, 10, + 11, 228, 78, 10, 11, 228, 77, 10, 11, 228, 76, 10, 11, 228, 75, 10, 11, + 228, 74, 10, 11, 228, 73, 10, 11, 228, 72, 10, 11, 228, 71, 10, 11, 228, + 70, 10, 11, 228, 69, 10, 11, 228, 68, 10, 11, 228, 67, 10, 11, 228, 66, + 10, 11, 227, 196, 10, 11, 227, 195, 10, 11, 227, 194, 10, 11, 227, 193, + 10, 11, 227, 192, 10, 11, 227, 191, 10, 11, 227, 190, 10, 11, 227, 189, + 10, 11, 227, 188, 10, 11, 227, 187, 10, 11, 227, 186, 10, 11, 227, 185, + 10, 11, 227, 184, 10, 11, 227, 183, 10, 11, 227, 182, 10, 11, 227, 181, + 10, 11, 227, 180, 10, 11, 227, 179, 10, 11, 227, 178, 10, 11, 227, 177, + 10, 11, 227, 176, 10, 11, 227, 175, 10, 11, 227, 174, 10, 11, 227, 173, + 10, 11, 227, 172, 10, 11, 227, 171, 10, 11, 227, 170, 10, 11, 227, 169, + 10, 11, 227, 168, 10, 11, 227, 167, 10, 11, 227, 166, 10, 11, 227, 165, + 10, 11, 227, 164, 10, 11, 227, 163, 10, 11, 227, 162, 10, 11, 227, 161, + 10, 11, 227, 160, 10, 11, 227, 159, 10, 11, 227, 158, 10, 11, 227, 157, + 10, 11, 227, 156, 10, 11, 227, 155, 10, 11, 227, 154, 10, 11, 227, 153, + 10, 11, 227, 152, 10, 11, 227, 151, 10, 11, 227, 150, 10, 11, 227, 149, + 10, 11, 227, 148, 10, 11, 227, 147, 10, 11, 227, 146, 10, 11, 227, 145, + 10, 11, 227, 144, 10, 11, 227, 143, 10, 11, 227, 142, 10, 11, 227, 141, + 10, 11, 227, 140, 10, 11, 227, 139, 10, 11, 227, 138, 10, 11, 227, 137, + 10, 11, 227, 136, 10, 11, 227, 135, 10, 11, 227, 134, 10, 11, 227, 133, + 10, 11, 227, 132, 10, 11, 227, 131, 10, 11, 227, 130, 10, 11, 227, 129, + 10, 11, 227, 128, 10, 11, 227, 127, 10, 11, 227, 126, 10, 11, 227, 125, + 10, 11, 227, 124, 10, 11, 227, 123, 10, 11, 227, 122, 10, 11, 226, 228, + 10, 11, 226, 227, 10, 11, 226, 226, 10, 11, 226, 225, 10, 11, 226, 224, + 10, 11, 226, 223, 10, 11, 226, 222, 10, 11, 226, 221, 10, 11, 226, 220, + 10, 11, 226, 219, 10, 11, 226, 218, 10, 11, 226, 217, 10, 11, 226, 216, + 10, 11, 224, 239, 10, 11, 224, 238, 10, 11, 224, 237, 10, 11, 224, 236, + 10, 11, 224, 235, 10, 11, 224, 234, 10, 11, 224, 233, 10, 11, 224, 111, + 10, 11, 224, 110, 10, 11, 224, 109, 10, 11, 224, 108, 10, 11, 224, 107, + 10, 11, 224, 106, 10, 11, 224, 105, 10, 11, 224, 104, 10, 11, 224, 103, + 10, 11, 224, 102, 10, 11, 224, 101, 10, 11, 224, 100, 10, 11, 224, 99, + 10, 11, 224, 98, 10, 11, 224, 97, 10, 11, 224, 96, 10, 11, 224, 95, 10, + 11, 224, 94, 10, 11, 224, 93, 10, 11, 224, 92, 10, 11, 224, 91, 10, 11, + 224, 90, 10, 11, 224, 89, 10, 11, 224, 88, 10, 11, 224, 87, 10, 11, 224, + 86, 10, 11, 224, 85, 10, 11, 224, 84, 10, 11, 224, 83, 10, 11, 224, 82, + 10, 11, 224, 81, 10, 11, 224, 80, 10, 11, 224, 79, 10, 11, 224, 78, 10, + 11, 223, 1, 10, 11, 223, 0, 10, 11, 222, 255, 10, 11, 222, 254, 10, 11, + 222, 253, 10, 11, 222, 252, 10, 11, 222, 251, 10, 11, 222, 250, 10, 11, + 222, 249, 10, 11, 222, 248, 10, 11, 222, 247, 10, 11, 222, 246, 10, 11, + 222, 245, 10, 11, 222, 244, 10, 11, 222, 243, 10, 11, 222, 242, 10, 11, + 222, 241, 10, 11, 222, 240, 10, 11, 222, 239, 10, 11, 222, 238, 10, 11, + 222, 237, 10, 11, 222, 236, 10, 11, 222, 235, 10, 11, 222, 234, 10, 11, + 222, 233, 10, 11, 222, 232, 10, 11, 222, 231, 10, 11, 222, 230, 10, 11, + 222, 229, 10, 11, 222, 228, 10, 11, 222, 227, 10, 11, 222, 226, 10, 11, + 222, 225, 10, 11, 222, 224, 10, 11, 222, 223, 10, 11, 222, 222, 10, 11, + 222, 221, 10, 11, 222, 220, 10, 11, 222, 219, 10, 11, 222, 218, 10, 11, + 222, 217, 10, 11, 222, 216, 10, 11, 222, 215, 10, 11, 222, 214, 10, 11, + 222, 213, 10, 11, 222, 212, 10, 11, 222, 211, 10, 11, 222, 210, 10, 11, + 222, 209, 10, 11, 222, 208, 10, 11, 222, 207, 10, 11, 222, 206, 10, 11, + 222, 205, 10, 11, 222, 204, 10, 11, 218, 97, 10, 11, 218, 96, 10, 11, + 218, 95, 10, 11, 218, 94, 10, 11, 218, 93, 10, 11, 218, 92, 10, 11, 218, + 91, 10, 11, 218, 90, 10, 11, 218, 89, 10, 11, 218, 88, 10, 11, 218, 87, + 10, 11, 218, 86, 10, 11, 218, 85, 10, 11, 218, 84, 10, 11, 218, 83, 10, + 11, 218, 82, 10, 11, 218, 81, 10, 11, 218, 80, 10, 11, 218, 79, 10, 11, + 218, 78, 10, 11, 218, 77, 10, 11, 218, 76, 10, 11, 218, 75, 10, 11, 218, + 74, 10, 11, 218, 73, 10, 11, 218, 72, 10, 11, 218, 71, 10, 11, 218, 70, + 10, 11, 218, 69, 10, 11, 218, 68, 10, 11, 218, 67, 10, 11, 218, 66, 10, + 11, 218, 65, 10, 11, 218, 64, 10, 11, 218, 63, 10, 11, 218, 62, 10, 11, + 218, 61, 10, 11, 218, 60, 10, 11, 218, 59, 10, 11, 218, 58, 10, 11, 218, + 57, 10, 11, 218, 56, 10, 11, 218, 55, 10, 11, 218, 54, 10, 11, 215, 245, + 10, 11, 215, 244, 10, 11, 215, 243, 10, 11, 215, 242, 10, 11, 215, 241, + 10, 11, 215, 240, 10, 11, 215, 239, 10, 11, 215, 238, 10, 11, 215, 237, + 10, 11, 215, 236, 10, 11, 215, 235, 10, 11, 215, 234, 10, 11, 215, 233, + 10, 11, 215, 232, 10, 11, 215, 231, 10, 11, 215, 230, 10, 11, 215, 229, + 10, 11, 215, 228, 10, 11, 215, 227, 10, 11, 215, 226, 10, 11, 215, 225, + 10, 11, 215, 224, 10, 11, 215, 223, 10, 11, 215, 222, 10, 11, 215, 221, + 10, 11, 215, 220, 10, 11, 215, 219, 10, 11, 215, 218, 10, 11, 215, 217, + 10, 11, 215, 216, 10, 11, 215, 215, 10, 11, 215, 214, 10, 11, 215, 213, + 10, 11, 215, 212, 10, 11, 215, 211, 10, 11, 215, 210, 10, 11, 215, 209, + 10, 11, 215, 208, 10, 11, 215, 207, 10, 11, 215, 206, 10, 11, 215, 205, + 10, 11, 215, 204, 10, 11, 215, 203, 10, 11, 215, 202, 10, 11, 215, 201, + 10, 11, 215, 200, 10, 11, 215, 199, 10, 11, 215, 78, 10, 11, 215, 77, 10, + 11, 215, 76, 10, 11, 215, 75, 10, 11, 215, 74, 10, 11, 215, 73, 10, 11, + 215, 72, 10, 11, 215, 71, 10, 11, 215, 70, 10, 11, 215, 69, 10, 11, 215, + 68, 10, 11, 215, 67, 10, 11, 215, 66, 10, 11, 215, 65, 10, 11, 215, 64, + 10, 11, 215, 63, 10, 11, 215, 62, 10, 11, 215, 61, 10, 11, 215, 60, 10, + 11, 215, 59, 10, 11, 215, 58, 10, 11, 215, 57, 10, 11, 215, 56, 10, 11, + 215, 55, 10, 11, 215, 54, 10, 11, 215, 53, 10, 11, 215, 52, 10, 11, 215, + 51, 10, 11, 215, 50, 10, 11, 215, 49, 10, 11, 215, 48, 10, 11, 215, 47, + 10, 11, 215, 46, 10, 11, 215, 45, 10, 11, 215, 44, 10, 11, 215, 43, 10, + 11, 215, 42, 10, 11, 215, 41, 10, 11, 215, 40, 10, 11, 215, 39, 10, 11, + 215, 38, 10, 11, 215, 37, 10, 11, 215, 36, 10, 11, 215, 35, 10, 11, 215, + 34, 10, 11, 215, 33, 10, 11, 215, 32, 10, 11, 215, 31, 10, 11, 215, 30, + 10, 11, 215, 29, 10, 11, 215, 28, 10, 11, 215, 27, 10, 11, 215, 26, 10, + 11, 215, 25, 10, 11, 215, 24, 10, 11, 215, 23, 10, 11, 215, 22, 10, 11, + 215, 21, 10, 11, 215, 20, 10, 11, 215, 19, 10, 11, 215, 18, 10, 11, 215, + 17, 10, 11, 215, 16, 10, 11, 215, 15, 10, 11, 215, 14, 10, 11, 215, 13, + 10, 11, 215, 12, 10, 11, 215, 11, 10, 11, 215, 10, 10, 11, 215, 9, 10, + 11, 215, 8, 10, 11, 215, 7, 10, 11, 215, 6, 10, 11, 215, 5, 10, 11, 215, + 4, 10, 11, 215, 3, 10, 11, 215, 2, 10, 11, 214, 81, 10, 11, 214, 80, 10, + 11, 214, 79, 10, 11, 214, 78, 10, 11, 214, 77, 10, 11, 214, 76, 10, 11, + 214, 75, 10, 11, 214, 74, 10, 11, 214, 73, 10, 11, 214, 72, 10, 11, 214, + 71, 10, 11, 214, 70, 10, 11, 214, 69, 10, 11, 214, 68, 10, 11, 214, 67, + 10, 11, 214, 66, 10, 11, 214, 65, 10, 11, 214, 64, 10, 11, 214, 63, 10, + 11, 214, 62, 10, 11, 214, 61, 10, 11, 214, 60, 10, 11, 214, 59, 10, 11, + 214, 58, 10, 11, 214, 57, 10, 11, 214, 56, 10, 11, 214, 55, 10, 11, 214, + 54, 10, 11, 214, 53, 10, 11, 214, 52, 10, 11, 214, 51, 10, 11, 214, 50, + 10, 11, 213, 165, 10, 11, 213, 164, 10, 11, 213, 163, 10, 11, 213, 162, + 10, 11, 213, 161, 10, 11, 213, 160, 10, 11, 213, 159, 10, 11, 213, 158, + 10, 11, 213, 157, 10, 11, 213, 156, 10, 11, 213, 155, 10, 11, 213, 154, + 10, 11, 213, 103, 10, 11, 213, 102, 10, 11, 213, 101, 10, 11, 213, 100, + 10, 11, 213, 99, 10, 11, 213, 98, 10, 11, 213, 97, 10, 11, 213, 96, 10, + 11, 213, 95, 10, 11, 212, 151, 10, 11, 212, 150, 10, 11, 212, 149, 10, + 11, 212, 148, 10, 11, 212, 147, 10, 11, 212, 146, 10, 11, 212, 145, 10, + 11, 212, 144, 10, 11, 212, 143, 10, 11, 212, 142, 10, 11, 212, 141, 10, + 11, 212, 140, 10, 11, 212, 139, 10, 11, 212, 138, 10, 11, 212, 137, 10, + 11, 212, 136, 10, 11, 212, 135, 10, 11, 212, 134, 10, 11, 212, 133, 10, + 11, 212, 132, 10, 11, 212, 131, 10, 11, 212, 130, 10, 11, 212, 129, 10, + 11, 212, 128, 10, 11, 212, 127, 10, 11, 212, 126, 10, 11, 212, 125, 10, + 11, 212, 124, 10, 11, 212, 123, 10, 11, 212, 122, 10, 11, 212, 121, 10, + 11, 212, 120, 10, 11, 212, 119, 10, 11, 212, 118, 10, 11, 212, 117, 10, + 11, 212, 116, 10, 11, 212, 115, 10, 11, 212, 114, 10, 11, 212, 113, 10, + 11, 212, 112, 10, 11, 212, 111, 10, 11, 254, 231, 10, 11, 254, 230, 10, + 11, 254, 229, 10, 11, 254, 228, 10, 11, 254, 227, 10, 11, 254, 226, 10, + 11, 254, 225, 10, 11, 254, 224, 10, 11, 254, 223, 10, 11, 254, 222, 10, + 11, 254, 221, 10, 11, 254, 220, 10, 11, 254, 219, 10, 11, 254, 218, 10, + 11, 254, 217, 10, 11, 254, 216, 10, 11, 254, 215, 10, 11, 254, 214, 10, + 11, 254, 213, 10, 11, 254, 212, 10, 11, 254, 211, 10, 11, 254, 210, 10, + 11, 254, 209, 10, 11, 254, 208, 10, 11, 254, 207, 10, 11, 254, 206, 10, + 11, 254, 205, 10, 11, 254, 204, 10, 11, 254, 203, 10, 11, 254, 202, 10, + 11, 254, 201, 10, 11, 254, 200, 10, 11, 254, 199, 10, 11, 254, 198, 20, + 1, 153, 229, 98, 231, 83, 20, 1, 153, 243, 46, 244, 5, 20, 1, 153, 225, + 131, 231, 84, 225, 189, 20, 1, 153, 225, 131, 231, 84, 225, 190, 20, 1, + 153, 230, 44, 231, 83, 20, 1, 153, 220, 146, 20, 1, 153, 217, 19, 231, + 83, 20, 1, 153, 227, 238, 231, 83, 20, 1, 153, 220, 199, 226, 214, 229, + 0, 20, 1, 153, 225, 131, 226, 214, 229, 1, 225, 189, 20, 1, 153, 225, + 131, 226, 214, 229, 1, 225, 190, 20, 1, 153, 232, 23, 20, 1, 153, 216, + 83, 232, 24, 20, 1, 153, 229, 154, 20, 1, 153, 232, 20, 20, 1, 153, 231, + 239, 20, 1, 153, 230, 119, 20, 1, 153, 221, 45, 20, 1, 153, 228, 96, 20, + 1, 153, 234, 155, 20, 1, 153, 228, 225, 20, 1, 153, 218, 205, 20, 1, 153, + 229, 97, 20, 1, 153, 233, 110, 20, 1, 153, 233, 36, 233, 210, 20, 1, 153, + 228, 103, 231, 91, 20, 1, 153, 232, 27, 20, 1, 153, 226, 119, 20, 1, 153, + 242, 207, 20, 1, 153, 226, 177, 20, 1, 153, 230, 221, 229, 130, 20, 1, + 153, 227, 219, 231, 94, 20, 1, 153, 111, 212, 179, 230, 38, 20, 1, 153, + 242, 208, 20, 1, 153, 228, 103, 228, 104, 20, 1, 153, 220, 56, 20, 1, + 153, 231, 76, 20, 1, 153, 231, 97, 20, 1, 153, 230, 200, 20, 1, 153, 234, + 253, 20, 1, 153, 226, 214, 233, 71, 20, 1, 153, 229, 229, 233, 71, 20, 1, + 153, 226, 34, 20, 1, 153, 232, 21, 20, 1, 153, 229, 38, 20, 1, 153, 225, + 20, 20, 1, 153, 216, 80, 20, 1, 153, 232, 152, 20, 1, 153, 219, 227, 20, + 1, 153, 217, 169, 20, 1, 153, 232, 18, 20, 1, 153, 234, 162, 20, 1, 153, + 229, 225, 20, 1, 153, 233, 222, 20, 1, 153, 230, 201, 20, 1, 153, 220, + 143, 20, 1, 153, 232, 191, 20, 1, 153, 244, 62, 20, 1, 153, 223, 101, 20, + 1, 153, 233, 250, 20, 1, 153, 219, 223, 20, 1, 153, 231, 236, 225, 231, + 20, 1, 153, 220, 192, 20, 1, 153, 228, 102, 20, 1, 153, 220, 177, 228, + 113, 212, 187, 20, 1, 153, 228, 1, 230, 218, 20, 1, 153, 226, 209, 20, 1, + 153, 228, 226, 20, 1, 153, 215, 141, 20, 1, 153, 229, 133, 20, 1, 153, + 232, 17, 20, 1, 153, 229, 12, 20, 1, 153, 231, 182, 20, 1, 153, 228, 12, + 20, 1, 153, 217, 173, 20, 1, 153, 219, 221, 20, 1, 153, 226, 210, 20, 1, + 153, 228, 117, 20, 1, 153, 232, 25, 20, 1, 153, 228, 10, 20, 1, 153, 234, + 221, 20, 1, 153, 228, 120, 20, 1, 153, 214, 227, 20, 1, 153, 232, 156, + 20, 1, 153, 229, 180, 20, 1, 153, 230, 16, 20, 1, 153, 231, 181, 20, 1, + 226, 14, 228, 115, 20, 1, 226, 14, 216, 83, 232, 22, 20, 1, 226, 14, 220, + 111, 20, 1, 226, 14, 221, 49, 216, 82, 20, 1, 226, 14, 232, 193, 228, 99, + 20, 1, 226, 14, 231, 188, 232, 26, 20, 1, 226, 14, 234, 96, 20, 1, 226, + 14, 213, 6, 20, 1, 226, 14, 231, 183, 20, 1, 226, 14, 234, 242, 20, 1, + 226, 14, 226, 83, 20, 1, 226, 14, 213, 77, 233, 71, 20, 1, 226, 14, 233, + 127, 228, 113, 228, 20, 20, 1, 226, 14, 228, 97, 220, 218, 20, 1, 226, + 14, 229, 196, 229, 15, 20, 1, 226, 14, 242, 205, 20, 1, 226, 14, 225, + 181, 20, 1, 226, 14, 216, 83, 228, 111, 20, 1, 226, 14, 220, 223, 229, + 10, 20, 1, 226, 14, 220, 219, 20, 1, 226, 14, 231, 84, 217, 172, 20, 1, + 226, 14, 231, 170, 231, 184, 20, 1, 226, 14, 228, 11, 228, 99, 20, 1, + 226, 14, 234, 151, 20, 1, 226, 14, 242, 206, 20, 1, 226, 14, 234, 147, + 20, 1, 226, 14, 233, 151, 20, 1, 226, 14, 226, 121, 20, 1, 226, 14, 214, + 159, 20, 1, 226, 14, 229, 99, 230, 117, 20, 1, 226, 14, 229, 132, 231, + 166, 20, 1, 226, 14, 213, 181, 20, 1, 226, 14, 222, 182, 20, 1, 226, 14, + 218, 45, 20, 1, 226, 14, 231, 96, 20, 1, 226, 14, 229, 117, 20, 1, 226, + 14, 229, 118, 233, 107, 20, 1, 226, 14, 231, 86, 20, 1, 226, 14, 218, + 253, 20, 1, 226, 14, 231, 174, 20, 1, 226, 14, 230, 203, 20, 1, 226, 14, + 228, 21, 20, 1, 226, 14, 225, 24, 20, 1, 226, 14, 231, 95, 229, 134, 20, + 1, 226, 14, 244, 95, 20, 1, 226, 14, 231, 161, 20, 1, 226, 14, 244, 116, + 20, 1, 226, 14, 234, 159, 20, 1, 226, 14, 232, 43, 229, 4, 20, 1, 226, + 14, 232, 43, 228, 236, 20, 1, 226, 14, 233, 35, 20, 1, 226, 14, 229, 140, + 20, 1, 226, 14, 228, 122, 20, 1, 226, 14, 188, 20, 1, 226, 14, 234, 83, + 20, 1, 226, 14, 229, 87, 20, 1, 131, 229, 98, 232, 24, 20, 1, 131, 227, + 237, 20, 1, 131, 212, 187, 20, 1, 131, 214, 37, 20, 1, 131, 229, 133, 20, + 1, 131, 229, 217, 20, 1, 131, 229, 105, 20, 1, 131, 242, 215, 20, 1, 131, + 231, 178, 20, 1, 131, 243, 53, 20, 1, 131, 228, 3, 230, 239, 231, 98, 20, + 1, 131, 228, 95, 231, 169, 20, 1, 131, 231, 175, 20, 1, 131, 225, 187, + 20, 1, 131, 229, 202, 20, 1, 131, 231, 186, 250, 215, 20, 1, 131, 234, + 149, 20, 1, 131, 242, 216, 20, 1, 131, 234, 156, 20, 1, 131, 212, 204, + 230, 146, 20, 1, 131, 227, 231, 20, 1, 131, 231, 163, 20, 1, 131, 228, + 121, 20, 1, 131, 231, 169, 20, 1, 131, 213, 7, 20, 1, 131, 234, 2, 20, 1, + 131, 235, 14, 20, 1, 131, 221, 44, 20, 1, 131, 229, 211, 20, 1, 131, 218, + 43, 20, 1, 131, 228, 240, 20, 1, 131, 217, 19, 212, 189, 20, 1, 131, 219, + 23, 20, 1, 131, 229, 124, 228, 20, 20, 1, 131, 214, 158, 20, 1, 131, 230, + 19, 20, 1, 131, 232, 43, 234, 158, 20, 1, 131, 228, 104, 20, 1, 131, 229, + 119, 20, 1, 131, 233, 111, 20, 1, 131, 231, 171, 20, 1, 131, 231, 75, 20, + 1, 131, 228, 98, 20, 1, 131, 217, 168, 20, 1, 131, 229, 121, 20, 1, 131, + 243, 204, 20, 1, 131, 229, 216, 20, 1, 131, 228, 123, 20, 1, 131, 228, + 119, 20, 1, 131, 251, 36, 20, 1, 131, 214, 160, 20, 1, 131, 231, 176, 20, + 1, 131, 223, 51, 20, 1, 131, 229, 14, 20, 1, 131, 233, 126, 20, 1, 131, + 217, 17, 20, 1, 131, 228, 105, 229, 87, 20, 1, 131, 229, 6, 20, 1, 131, + 234, 162, 20, 1, 131, 229, 125, 20, 1, 131, 232, 17, 20, 1, 131, 231, + 164, 20, 1, 131, 232, 156, 20, 1, 131, 233, 210, 20, 1, 131, 229, 12, 20, + 1, 131, 229, 87, 20, 1, 131, 213, 172, 20, 1, 131, 229, 122, 20, 1, 131, + 228, 108, 20, 1, 131, 228, 100, 20, 1, 131, 233, 224, 228, 226, 20, 1, + 131, 228, 106, 20, 1, 131, 229, 224, 20, 1, 131, 232, 43, 228, 111, 20, + 1, 131, 213, 91, 20, 1, 131, 229, 223, 20, 1, 131, 220, 145, 20, 1, 131, + 221, 47, 20, 1, 131, 231, 172, 20, 1, 131, 232, 24, 20, 1, 131, 231, 182, + 20, 1, 131, 234, 150, 20, 1, 131, 231, 173, 20, 1, 131, 234, 154, 20, 1, + 131, 231, 186, 225, 235, 20, 1, 131, 212, 171, 20, 1, 131, 229, 2, 20, 1, + 131, 231, 33, 20, 1, 131, 230, 170, 20, 1, 131, 220, 195, 20, 1, 131, + 234, 172, 233, 94, 20, 1, 131, 234, 172, 244, 128, 20, 1, 131, 229, 152, + 20, 1, 131, 230, 16, 20, 1, 131, 232, 229, 20, 1, 131, 225, 197, 20, 1, + 131, 226, 74, 20, 1, 131, 217, 183, 20, 1, 103, 231, 162, 20, 1, 103, + 214, 35, 20, 1, 103, 229, 0, 20, 1, 103, 231, 83, 20, 1, 103, 228, 254, + 20, 1, 103, 233, 7, 20, 1, 103, 229, 3, 20, 1, 103, 228, 118, 20, 1, 103, + 229, 139, 20, 1, 103, 228, 20, 20, 1, 103, 213, 182, 20, 1, 103, 229, 95, + 20, 1, 103, 220, 241, 20, 1, 103, 229, 106, 20, 1, 103, 234, 157, 20, 1, + 103, 217, 170, 20, 1, 103, 220, 221, 20, 1, 103, 229, 11, 20, 1, 103, + 218, 253, 20, 1, 103, 234, 162, 20, 1, 103, 213, 79, 20, 1, 103, 233, + 225, 20, 1, 103, 222, 150, 20, 1, 103, 231, 88, 20, 1, 103, 229, 215, 20, + 1, 103, 231, 251, 20, 1, 103, 231, 94, 20, 1, 103, 221, 46, 20, 1, 103, + 213, 30, 20, 1, 103, 229, 5, 20, 1, 103, 234, 153, 231, 165, 20, 1, 103, + 229, 102, 20, 1, 103, 216, 82, 20, 1, 103, 242, 224, 20, 1, 103, 229, 92, + 20, 1, 103, 244, 96, 20, 1, 103, 229, 219, 20, 1, 103, 231, 67, 20, 1, + 103, 233, 31, 20, 1, 103, 229, 201, 20, 1, 103, 230, 217, 20, 1, 103, + 231, 71, 20, 1, 103, 225, 6, 20, 1, 103, 231, 69, 20, 1, 103, 231, 85, + 20, 1, 103, 232, 142, 20, 1, 103, 228, 110, 20, 1, 103, 231, 185, 20, 1, + 103, 233, 202, 20, 1, 103, 228, 12, 20, 1, 103, 217, 173, 20, 1, 103, + 219, 221, 20, 1, 103, 212, 171, 20, 1, 103, 234, 154, 20, 1, 103, 224, + 60, 20, 1, 103, 217, 218, 20, 1, 103, 229, 103, 20, 1, 103, 231, 90, 20, + 1, 103, 228, 109, 20, 1, 103, 234, 152, 20, 1, 103, 225, 191, 20, 1, 103, + 226, 28, 20, 1, 103, 227, 246, 20, 1, 103, 233, 35, 20, 1, 103, 229, 140, + 20, 1, 103, 231, 87, 20, 1, 103, 229, 114, 20, 1, 103, 212, 184, 20, 1, + 103, 226, 149, 20, 1, 103, 212, 183, 20, 1, 103, 229, 224, 20, 1, 103, + 228, 99, 20, 1, 103, 219, 25, 20, 1, 103, 233, 229, 20, 1, 103, 229, 129, + 20, 1, 103, 229, 100, 20, 1, 103, 216, 66, 20, 1, 103, 231, 98, 20, 1, + 103, 233, 219, 20, 1, 103, 228, 107, 20, 1, 103, 217, 171, 20, 1, 103, + 232, 19, 20, 1, 103, 229, 138, 20, 1, 103, 233, 30, 20, 1, 103, 229, 120, + 20, 1, 103, 228, 112, 20, 1, 103, 228, 240, 20, 1, 103, 242, 209, 20, 1, + 103, 233, 238, 20, 1, 103, 223, 234, 227, 75, 20, 1, 103, 218, 35, 20, 1, + 103, 216, 223, 20, 1, 103, 228, 10, 20, 1, 103, 223, 136, 20, 1, 103, + 233, 73, 20, 1, 103, 231, 144, 20, 1, 103, 183, 20, 1, 103, 218, 205, 20, + 1, 103, 230, 172, 20, 1, 103, 220, 207, 20, 1, 103, 220, 217, 20, 1, 103, + 233, 177, 20, 1, 103, 228, 92, 20, 1, 103, 220, 150, 20, 1, 103, 228, + 101, 20, 1, 103, 226, 86, 20, 1, 103, 229, 64, 20, 1, 103, 220, 176, 20, + 1, 103, 225, 19, 20, 1, 103, 230, 117, 20, 1, 103, 232, 174, 20, 1, 103, + 223, 234, 230, 166, 20, 1, 103, 217, 71, 20, 1, 103, 228, 93, 20, 1, 103, + 231, 186, 198, 20, 1, 103, 222, 148, 20, 1, 103, 244, 163, 20, 1, 80, + 229, 223, 20, 1, 80, 216, 229, 20, 1, 80, 231, 175, 20, 1, 80, 233, 111, + 20, 1, 80, 214, 109, 20, 1, 80, 232, 178, 20, 1, 80, 226, 213, 20, 1, 80, + 219, 230, 20, 1, 80, 224, 37, 20, 1, 80, 228, 114, 20, 1, 80, 229, 194, + 20, 1, 80, 225, 33, 20, 1, 80, 218, 13, 20, 1, 80, 229, 108, 20, 1, 80, + 233, 254, 20, 1, 80, 213, 175, 20, 1, 80, 222, 89, 20, 1, 80, 229, 130, + 20, 1, 80, 226, 210, 20, 1, 80, 216, 230, 20, 1, 80, 233, 223, 20, 1, 80, + 232, 192, 20, 1, 80, 228, 117, 20, 1, 80, 229, 84, 20, 1, 80, 232, 25, + 20, 1, 80, 229, 101, 20, 1, 80, 229, 83, 20, 1, 80, 228, 116, 20, 1, 80, + 223, 134, 20, 1, 80, 229, 2, 20, 1, 80, 226, 85, 20, 1, 80, 222, 200, 20, + 1, 80, 229, 115, 20, 1, 80, 231, 77, 20, 1, 80, 242, 203, 20, 1, 80, 229, + 104, 20, 1, 80, 229, 13, 20, 1, 80, 231, 235, 20, 1, 80, 232, 176, 20, 1, + 80, 229, 135, 20, 1, 80, 229, 207, 20, 1, 80, 218, 34, 228, 99, 20, 1, + 80, 221, 48, 20, 1, 80, 225, 29, 20, 1, 80, 229, 227, 219, 235, 20, 1, + 80, 229, 123, 228, 20, 20, 1, 80, 212, 251, 20, 1, 80, 242, 204, 20, 1, + 80, 216, 81, 20, 1, 80, 213, 10, 20, 1, 80, 225, 150, 20, 1, 80, 216, 71, + 20, 1, 80, 234, 160, 20, 1, 80, 219, 24, 20, 1, 80, 217, 172, 20, 1, 80, + 214, 161, 20, 1, 80, 213, 247, 20, 1, 80, 233, 154, 20, 1, 80, 225, 35, + 20, 1, 80, 218, 44, 20, 1, 80, 242, 223, 20, 1, 80, 229, 144, 20, 1, 80, + 220, 220, 20, 1, 80, 231, 72, 20, 1, 80, 231, 179, 20, 1, 80, 227, 235, + 20, 1, 80, 228, 223, 20, 1, 80, 243, 49, 20, 1, 80, 216, 72, 20, 1, 80, + 233, 232, 20, 1, 80, 213, 57, 20, 1, 80, 228, 11, 249, 209, 20, 1, 80, + 212, 241, 20, 1, 80, 231, 89, 20, 1, 80, 229, 212, 20, 1, 80, 225, 232, + 20, 1, 80, 212, 188, 20, 1, 80, 233, 32, 20, 1, 80, 243, 204, 20, 1, 80, + 243, 48, 20, 1, 80, 229, 94, 20, 1, 80, 234, 162, 20, 1, 80, 232, 28, 20, + 1, 80, 229, 107, 20, 1, 80, 242, 210, 20, 1, 80, 244, 164, 20, 1, 80, + 228, 94, 20, 1, 80, 226, 29, 20, 1, 80, 213, 8, 20, 1, 80, 229, 131, 20, + 1, 80, 228, 11, 251, 200, 20, 1, 80, 227, 215, 20, 1, 80, 225, 127, 20, + 1, 80, 231, 33, 20, 1, 80, 243, 202, 20, 1, 80, 230, 38, 20, 1, 80, 230, + 170, 20, 1, 80, 242, 209, 20, 1, 80, 243, 206, 72, 20, 1, 80, 230, 118, + 20, 1, 80, 225, 32, 20, 1, 80, 229, 96, 20, 1, 80, 233, 210, 20, 1, 80, + 225, 229, 20, 1, 80, 228, 102, 20, 1, 80, 213, 9, 20, 1, 80, 229, 116, + 20, 1, 80, 226, 214, 226, 62, 20, 1, 80, 243, 206, 250, 203, 20, 1, 80, + 244, 6, 20, 1, 80, 229, 7, 20, 1, 80, 61, 20, 1, 80, 216, 223, 20, 1, 80, + 75, 20, 1, 80, 72, 20, 1, 80, 233, 109, 20, 1, 80, 226, 214, 225, 157, + 20, 1, 80, 218, 49, 20, 1, 80, 218, 2, 20, 1, 80, 229, 227, 230, 106, + 240, 221, 20, 1, 80, 220, 195, 20, 1, 80, 213, 5, 20, 1, 80, 229, 77, 20, + 1, 80, 212, 193, 20, 1, 80, 212, 218, 218, 185, 20, 1, 80, 212, 218, 249, + 86, 20, 1, 80, 212, 178, 20, 1, 80, 212, 186, 20, 1, 80, 234, 148, 20, 1, + 80, 226, 27, 20, 1, 80, 229, 8, 245, 65, 20, 1, 80, 225, 30, 20, 1, 80, + 213, 180, 20, 1, 80, 244, 116, 20, 1, 80, 214, 227, 20, 1, 80, 232, 156, + 20, 1, 80, 231, 42, 20, 1, 80, 223, 204, 20, 1, 80, 224, 61, 20, 1, 80, + 229, 76, 20, 1, 80, 229, 159, 20, 1, 80, 220, 187, 20, 1, 80, 220, 176, + 20, 1, 80, 243, 206, 223, 236, 20, 1, 80, 205, 20, 1, 80, 225, 240, 20, + 1, 80, 232, 174, 20, 1, 80, 234, 37, 20, 1, 80, 231, 122, 20, 1, 80, 188, + 20, 1, 80, 231, 232, 20, 1, 80, 217, 174, 20, 1, 80, 234, 101, 20, 1, 80, + 230, 220, 20, 1, 80, 217, 200, 20, 1, 80, 244, 137, 20, 1, 80, 242, 199, + 20, 1, 226, 13, 181, 20, 1, 226, 13, 69, 20, 1, 226, 13, 233, 238, 20, 1, + 226, 13, 245, 165, 20, 1, 226, 13, 224, 1, 20, 1, 226, 13, 218, 35, 20, + 1, 226, 13, 228, 10, 20, 1, 226, 13, 233, 157, 20, 1, 226, 13, 223, 136, + 20, 1, 226, 13, 223, 182, 20, 1, 226, 13, 231, 144, 20, 1, 226, 13, 218, + 49, 20, 1, 226, 13, 229, 226, 20, 1, 226, 13, 229, 14, 20, 1, 226, 13, + 183, 20, 1, 226, 13, 218, 205, 20, 1, 226, 13, 220, 207, 20, 1, 226, 13, + 220, 117, 20, 1, 226, 13, 221, 44, 20, 1, 226, 13, 233, 177, 20, 1, 226, + 13, 234, 162, 20, 1, 226, 13, 228, 64, 20, 1, 226, 13, 228, 92, 20, 1, + 226, 13, 228, 241, 20, 1, 226, 13, 212, 217, 20, 1, 226, 13, 220, 150, + 20, 1, 226, 13, 186, 20, 1, 226, 13, 228, 120, 20, 1, 226, 13, 226, 27, + 20, 1, 226, 13, 228, 101, 20, 1, 226, 13, 213, 180, 20, 1, 226, 13, 226, + 86, 20, 1, 226, 13, 223, 51, 20, 1, 226, 13, 229, 64, 20, 1, 226, 13, + 223, 204, 20, 1, 226, 13, 234, 171, 20, 1, 226, 13, 229, 93, 20, 1, 226, + 13, 229, 141, 20, 1, 226, 13, 220, 187, 20, 1, 226, 13, 225, 33, 20, 1, + 226, 13, 244, 6, 20, 1, 226, 13, 214, 49, 20, 1, 226, 13, 233, 13, 20, 1, + 226, 13, 232, 174, 20, 1, 226, 13, 234, 37, 20, 1, 226, 13, 231, 177, 20, + 1, 226, 13, 223, 233, 20, 1, 226, 13, 188, 20, 1, 226, 13, 230, 231, 20, + 1, 226, 13, 231, 185, 20, 1, 226, 13, 217, 183, 20, 1, 226, 13, 234, 4, + 20, 1, 226, 13, 222, 166, 20, 1, 226, 13, 214, 98, 56, 1, 253, 193, 74, + 142, 1, 253, 193, 213, 38, 47, 27, 16, 225, 39, 47, 27, 16, 248, 103, 47, + 27, 16, 226, 50, 47, 27, 16, 226, 237, 245, 135, 47, 27, 16, 226, 237, + 247, 153, 47, 27, 16, 214, 248, 245, 135, 47, 27, 16, 214, 248, 247, 153, + 47, 27, 16, 234, 202, 47, 27, 16, 218, 115, 47, 27, 16, 226, 137, 47, 27, + 16, 212, 208, 47, 27, 16, 212, 209, 247, 153, 47, 27, 16, 233, 243, 47, + 27, 16, 253, 236, 245, 135, 47, 27, 16, 244, 249, 245, 135, 47, 27, 16, + 217, 211, 47, 27, 16, 234, 167, 47, 27, 16, 253, 227, 47, 27, 16, 253, + 228, 247, 153, 47, 27, 16, 218, 121, 47, 27, 16, 217, 112, 47, 27, 16, + 227, 72, 253, 191, 47, 27, 16, 242, 135, 253, 191, 47, 27, 16, 225, 38, + 47, 27, 16, 250, 85, 47, 27, 16, 214, 238, 47, 27, 16, 235, 162, 253, + 191, 47, 27, 16, 234, 169, 253, 191, 47, 27, 16, 234, 168, 253, 191, 47, + 27, 16, 222, 131, 47, 27, 16, 226, 128, 47, 27, 16, 219, 86, 253, 230, + 47, 27, 16, 226, 236, 253, 191, 47, 27, 16, 214, 247, 253, 191, 47, 27, + 16, 253, 231, 253, 191, 47, 27, 16, 253, 225, 47, 27, 16, 234, 46, 47, + 27, 16, 223, 199, 47, 27, 16, 225, 238, 253, 191, 47, 27, 16, 217, 36, + 47, 27, 16, 254, 30, 47, 27, 16, 222, 78, 47, 27, 16, 218, 124, 253, 191, + 47, 27, 16, 218, 124, 231, 107, 219, 84, 47, 27, 16, 226, 231, 253, 191, + 47, 27, 16, 217, 143, 47, 27, 16, 233, 51, 47, 27, 16, 245, 252, 47, 27, + 16, 216, 185, 47, 27, 16, 217, 185, 47, 27, 16, 233, 246, 47, 27, 16, + 253, 236, 244, 249, 229, 177, 47, 27, 16, 243, 207, 253, 191, 47, 27, 16, + 236, 7, 47, 27, 16, 216, 157, 253, 191, 47, 27, 16, 234, 205, 216, 156, + 47, 27, 16, 226, 75, 47, 27, 16, 225, 43, 47, 27, 16, 234, 20, 47, 27, + 16, 250, 17, 253, 191, 47, 27, 16, 224, 38, 47, 27, 16, 226, 140, 253, + 191, 47, 27, 16, 226, 138, 253, 191, 47, 27, 16, 240, 102, 47, 27, 16, + 230, 23, 47, 27, 16, 226, 32, 47, 27, 16, 234, 21, 254, 58, 47, 27, 16, + 216, 157, 254, 58, 47, 27, 16, 219, 63, 47, 27, 16, 242, 101, 47, 27, 16, + 235, 162, 229, 177, 47, 27, 16, 227, 72, 229, 177, 47, 27, 16, 226, 237, + 229, 177, 47, 27, 16, 226, 31, 47, 27, 16, 234, 7, 47, 27, 16, 226, 30, + 47, 27, 16, 233, 245, 47, 27, 16, 226, 76, 229, 177, 47, 27, 16, 234, + 168, 229, 178, 254, 7, 47, 27, 16, 234, 169, 229, 178, 254, 7, 47, 27, + 16, 212, 206, 47, 27, 16, 253, 228, 229, 177, 47, 27, 16, 253, 229, 218, + 122, 229, 177, 47, 27, 16, 212, 207, 47, 27, 16, 233, 244, 47, 27, 16, + 245, 130, 47, 27, 16, 250, 86, 47, 27, 16, 231, 11, 235, 161, 47, 27, 16, + 214, 248, 229, 177, 47, 27, 16, 225, 238, 229, 177, 47, 27, 16, 225, 44, + 229, 177, 47, 27, 16, 227, 69, 47, 27, 16, 253, 251, 47, 27, 16, 232, + 118, 47, 27, 16, 226, 138, 229, 177, 47, 27, 16, 226, 140, 229, 177, 47, + 27, 16, 245, 26, 226, 139, 47, 27, 16, 233, 175, 47, 27, 16, 253, 252, + 47, 27, 16, 216, 157, 229, 177, 47, 27, 16, 245, 133, 47, 27, 16, 218, + 124, 229, 177, 47, 27, 16, 218, 116, 47, 27, 16, 250, 17, 229, 177, 47, + 27, 16, 245, 69, 47, 27, 16, 222, 79, 229, 177, 47, 27, 16, 213, 139, + 234, 46, 47, 27, 16, 216, 154, 47, 27, 16, 225, 45, 47, 27, 16, 216, 158, + 47, 27, 16, 216, 155, 47, 27, 16, 225, 42, 47, 27, 16, 216, 153, 47, 27, + 16, 225, 41, 47, 27, 16, 242, 134, 47, 27, 16, 253, 185, 47, 27, 16, 245, + 26, 253, 185, 47, 27, 16, 226, 231, 229, 177, 47, 27, 16, 217, 142, 245, + 34, 47, 27, 16, 217, 142, 244, 248, 47, 27, 16, 217, 144, 253, 232, 47, + 27, 16, 217, 137, 234, 251, 253, 224, 47, 27, 16, 234, 204, 47, 27, 16, + 245, 97, 47, 27, 16, 213, 2, 234, 201, 47, 27, 16, 213, 2, 254, 7, 47, + 27, 16, 219, 85, 47, 27, 16, 234, 47, 254, 7, 47, 27, 16, 247, 154, 253, + 191, 47, 27, 16, 233, 247, 253, 191, 47, 27, 16, 233, 247, 254, 58, 47, + 27, 16, 233, 247, 229, 177, 47, 27, 16, 253, 231, 229, 177, 47, 27, 16, + 253, 233, 47, 27, 16, 247, 153, 47, 27, 16, 216, 168, 47, 27, 16, 217, + 177, 47, 27, 16, 234, 11, 47, 27, 16, 233, 56, 245, 92, 250, 8, 47, 27, + 16, 233, 56, 245, 253, 250, 9, 47, 27, 16, 233, 56, 216, 170, 250, 9, 47, + 27, 16, 233, 56, 217, 187, 250, 9, 47, 27, 16, 233, 56, 236, 2, 250, 8, + 47, 27, 16, 242, 135, 229, 178, 254, 7, 47, 27, 16, 242, 135, 226, 129, + 253, 181, 47, 27, 16, 242, 135, 226, 129, 247, 236, 47, 27, 16, 247, 177, + 47, 27, 16, 247, 178, 226, 129, 253, 182, 234, 201, 47, 27, 16, 247, 178, + 226, 129, 253, 182, 254, 7, 47, 27, 16, 247, 178, 226, 129, 247, 236, 47, + 27, 16, 216, 174, 47, 27, 16, 253, 186, 47, 27, 16, 236, 9, 47, 27, 16, + 247, 198, 47, 27, 16, 254, 116, 225, 134, 253, 187, 47, 27, 16, 254, 116, + 253, 184, 47, 27, 16, 254, 116, 253, 187, 47, 27, 16, 254, 116, 231, 101, + 47, 27, 16, 254, 116, 231, 110, 47, 27, 16, 254, 116, 242, 136, 47, 27, + 16, 254, 116, 242, 133, 47, 27, 16, 254, 116, 225, 134, 242, 136, 47, 27, + 16, 231, 214, 225, 50, 240, 100, 47, 27, 16, 231, 214, 254, 60, 225, 50, + 240, 100, 47, 27, 16, 231, 214, 247, 235, 240, 100, 47, 27, 16, 231, 214, + 254, 60, 247, 235, 240, 100, 47, 27, 16, 231, 214, 216, 163, 240, 100, + 47, 27, 16, 231, 214, 216, 175, 47, 27, 16, 231, 214, 217, 181, 240, 100, + 47, 27, 16, 231, 214, 217, 181, 233, 59, 240, 100, 47, 27, 16, 231, 214, + 233, 59, 240, 100, 47, 27, 16, 231, 214, 225, 171, 240, 100, 47, 27, 16, + 235, 167, 217, 204, 240, 101, 47, 27, 16, 253, 229, 217, 204, 240, 101, + 47, 27, 16, 244, 140, 217, 178, 47, 27, 16, 244, 140, 230, 213, 47, 27, + 16, 244, 140, 247, 182, 47, 27, 16, 231, 214, 214, 242, 240, 100, 47, 27, + 16, 231, 214, 225, 49, 240, 100, 47, 27, 16, 231, 214, 225, 171, 217, + 181, 240, 100, 47, 27, 16, 242, 131, 230, 98, 253, 232, 47, 27, 16, 242, + 131, 230, 98, 247, 152, 47, 27, 16, 245, 106, 234, 251, 243, 207, 214, + 105, 47, 27, 16, 236, 8, 47, 27, 16, 236, 6, 47, 27, 16, 243, 207, 253, + 192, 247, 234, 240, 99, 47, 27, 16, 243, 207, 247, 196, 193, 47, 27, 16, + 243, 207, 247, 196, 230, 23, 47, 27, 16, 243, 207, 230, 18, 240, 100, 47, + 27, 16, 243, 207, 247, 196, 247, 211, 47, 27, 16, 243, 207, 220, 30, 247, + 195, 247, 211, 47, 27, 16, 243, 207, 247, 196, 234, 188, 47, 27, 16, 243, + 207, 247, 196, 212, 16, 47, 27, 16, 243, 207, 247, 196, 229, 65, 234, + 201, 47, 27, 16, 243, 207, 247, 196, 229, 65, 254, 7, 47, 27, 16, 243, + 207, 231, 254, 250, 10, 247, 182, 47, 27, 16, 243, 207, 231, 254, 250, + 10, 230, 213, 47, 27, 16, 244, 91, 220, 30, 250, 10, 214, 241, 47, 27, + 16, 243, 207, 220, 30, 250, 10, 218, 125, 47, 27, 16, 243, 207, 229, 179, + 47, 27, 16, 250, 11, 211, 248, 47, 27, 16, 250, 11, 234, 45, 47, 27, 16, + 250, 11, 219, 197, 47, 27, 16, 243, 207, 240, 146, 213, 1, 217, 182, 47, + 27, 16, 243, 207, 245, 107, 253, 253, 47, 27, 16, 213, 1, 216, 164, 47, + 27, 16, 247, 190, 216, 164, 47, 27, 16, 247, 190, 217, 182, 47, 27, 16, + 247, 190, 253, 234, 245, 253, 247, 93, 47, 27, 16, 247, 190, 230, 211, + 217, 186, 247, 93, 47, 27, 16, 247, 190, 247, 174, 245, 3, 247, 93, 47, + 27, 16, 247, 190, 216, 172, 227, 77, 247, 93, 47, 27, 16, 213, 1, 253, + 234, 245, 253, 247, 93, 47, 27, 16, 213, 1, 230, 211, 217, 186, 247, 93, + 47, 27, 16, 213, 1, 247, 174, 245, 3, 247, 93, 47, 27, 16, 213, 1, 216, + 172, 227, 77, 247, 93, 47, 27, 16, 243, 25, 247, 189, 47, 27, 16, 243, + 25, 213, 0, 47, 27, 16, 247, 197, 253, 234, 231, 12, 47, 27, 16, 247, + 197, 253, 234, 231, 137, 47, 27, 16, 247, 197, 247, 153, 47, 27, 16, 247, + 197, 217, 135, 47, 27, 16, 220, 89, 217, 135, 47, 27, 16, 220, 89, 217, + 136, 247, 138, 47, 27, 16, 220, 89, 217, 136, 216, 165, 47, 27, 16, 220, + 89, 217, 136, 217, 175, 47, 27, 16, 220, 89, 253, 159, 47, 27, 16, 220, + 89, 253, 160, 247, 138, 47, 27, 16, 220, 89, 253, 160, 216, 165, 47, 27, + 16, 220, 89, 253, 160, 217, 175, 47, 27, 16, 247, 175, 243, 6, 47, 27, + 16, 247, 181, 227, 2, 47, 27, 16, 219, 77, 47, 27, 16, 253, 178, 193, 47, + 27, 16, 253, 178, 214, 105, 47, 27, 16, 253, 178, 243, 110, 47, 27, 16, + 253, 178, 247, 211, 47, 27, 16, 253, 178, 234, 188, 47, 27, 16, 253, 178, + 212, 16, 47, 27, 16, 253, 178, 229, 64, 47, 27, 16, 234, 168, 229, 178, + 231, 109, 47, 27, 16, 234, 169, 229, 178, 231, 109, 47, 27, 16, 234, 168, + 229, 178, 234, 201, 47, 27, 16, 234, 169, 229, 178, 234, 201, 47, 27, 16, + 234, 47, 234, 201, 47, 27, 16, 242, 135, 229, 178, 234, 201, 27, 16, 220, + 81, 252, 55, 27, 16, 51, 252, 55, 27, 16, 40, 252, 55, 27, 16, 223, 203, + 40, 252, 55, 27, 16, 248, 100, 252, 55, 27, 16, 220, 175, 252, 55, 27, + 16, 42, 223, 228, 52, 27, 16, 46, 223, 228, 52, 27, 16, 223, 228, 247, + 72, 27, 16, 248, 141, 222, 82, 27, 16, 248, 165, 250, 181, 27, 16, 222, + 82, 27, 16, 249, 171, 27, 16, 223, 226, 244, 80, 27, 16, 223, 226, 244, + 79, 27, 16, 223, 226, 244, 78, 27, 16, 244, 100, 27, 16, 244, 101, 55, + 27, 16, 251, 76, 77, 27, 16, 250, 210, 27, 16, 251, 86, 27, 16, 125, 27, + 16, 227, 59, 219, 102, 27, 16, 216, 23, 219, 102, 27, 16, 217, 96, 219, + 102, 27, 16, 243, 236, 219, 102, 27, 16, 244, 49, 219, 102, 27, 16, 220, + 52, 219, 102, 27, 16, 220, 50, 243, 220, 27, 16, 243, 234, 243, 220, 27, + 16, 243, 178, 249, 207, 27, 16, 243, 178, 249, 208, 227, 4, 254, 51, 27, + 16, 243, 178, 249, 208, 227, 4, 252, 42, 27, 16, 250, 253, 249, 207, 27, + 16, 244, 231, 249, 207, 27, 16, 244, 231, 249, 208, 227, 4, 254, 51, 27, + 16, 244, 231, 249, 208, 227, 4, 252, 42, 27, 16, 246, 38, 249, 206, 27, + 16, 246, 38, 249, 205, 27, 16, 230, 155, 231, 155, 223, 213, 27, 16, 51, + 220, 254, 27, 16, 51, 244, 34, 27, 16, 244, 35, 215, 134, 27, 16, 244, + 35, 246, 60, 27, 16, 230, 9, 215, 134, 27, 16, 230, 9, 246, 60, 27, 16, + 220, 255, 215, 134, 27, 16, 220, 255, 246, 60, 27, 16, 224, 167, 160, + 220, 254, 27, 16, 224, 167, 160, 244, 34, 27, 16, 249, 155, 217, 40, 27, + 16, 249, 27, 217, 40, 27, 16, 227, 4, 254, 51, 27, 16, 227, 4, 252, 42, + 27, 16, 224, 149, 254, 51, 27, 16, 224, 149, 252, 42, 27, 16, 230, 158, + 223, 213, 27, 16, 213, 236, 223, 213, 27, 16, 151, 223, 213, 27, 16, 224, + 167, 223, 213, 27, 16, 245, 146, 223, 213, 27, 16, 220, 46, 223, 213, 27, + 16, 217, 113, 223, 213, 27, 16, 220, 38, 223, 213, 27, 16, 122, 240, 201, + 216, 36, 223, 213, 27, 16, 213, 167, 228, 154, 27, 16, 94, 228, 154, 27, + 16, 249, 229, 213, 167, 228, 154, 27, 16, 41, 228, 155, 213, 238, 27, 16, + 41, 228, 155, 251, 144, 27, 16, 216, 184, 228, 155, 114, 213, 238, 27, + 16, 216, 184, 228, 155, 114, 251, 144, 27, 16, 216, 184, 228, 155, 42, + 213, 238, 27, 16, 216, 184, 228, 155, 42, 251, 144, 27, 16, 216, 184, + 228, 155, 46, 213, 238, 27, 16, 216, 184, 228, 155, 46, 251, 144, 27, 16, + 216, 184, 228, 155, 119, 213, 238, 27, 16, 216, 184, 228, 155, 119, 251, + 144, 27, 16, 216, 184, 228, 155, 114, 46, 213, 238, 27, 16, 216, 184, + 228, 155, 114, 46, 251, 144, 27, 16, 230, 199, 228, 155, 213, 238, 27, + 16, 230, 199, 228, 155, 251, 144, 27, 16, 216, 181, 228, 155, 119, 213, + 238, 27, 16, 216, 181, 228, 155, 119, 251, 144, 27, 16, 226, 132, 228, + 154, 27, 16, 214, 113, 228, 154, 27, 16, 228, 155, 251, 144, 27, 16, 228, + 59, 228, 154, 27, 16, 249, 178, 228, 155, 213, 238, 27, 16, 249, 178, + 228, 155, 251, 144, 27, 16, 251, 74, 27, 16, 213, 236, 228, 158, 27, 16, + 151, 228, 158, 27, 16, 224, 167, 228, 158, 27, 16, 245, 146, 228, 158, + 27, 16, 220, 46, 228, 158, 27, 16, 217, 113, 228, 158, 27, 16, 220, 38, + 228, 158, 27, 16, 122, 240, 201, 216, 36, 228, 158, 27, 16, 37, 219, 79, + 27, 16, 37, 219, 172, 219, 79, 27, 16, 37, 216, 192, 27, 16, 37, 216, + 191, 27, 16, 37, 216, 190, 27, 16, 244, 70, 216, 192, 27, 16, 244, 70, + 216, 191, 27, 16, 244, 70, 216, 190, 27, 16, 37, 253, 105, 247, 74, 27, + 16, 37, 244, 41, 27, 16, 37, 244, 40, 27, 16, 37, 244, 39, 27, 16, 37, + 244, 38, 27, 16, 37, 244, 37, 27, 16, 251, 234, 251, 250, 27, 16, 245, + 101, 251, 250, 27, 16, 251, 234, 217, 65, 27, 16, 245, 101, 217, 65, 27, + 16, 251, 234, 220, 8, 27, 16, 245, 101, 220, 8, 27, 16, 251, 234, 225, + 247, 27, 16, 245, 101, 225, 247, 27, 16, 37, 254, 174, 27, 16, 37, 219, + 104, 27, 16, 37, 217, 191, 27, 16, 37, 219, 105, 27, 16, 37, 231, 225, + 27, 16, 37, 231, 224, 27, 16, 37, 254, 173, 27, 16, 37, 232, 167, 27, 16, + 253, 169, 215, 134, 27, 16, 253, 169, 246, 60, 27, 16, 37, 247, 89, 27, + 16, 37, 223, 128, 27, 16, 37, 244, 27, 27, 16, 37, 220, 4, 27, 16, 37, + 251, 215, 27, 16, 37, 51, 216, 232, 27, 16, 37, 216, 169, 216, 232, 27, + 16, 223, 132, 27, 16, 219, 20, 27, 16, 212, 152, 27, 16, 225, 239, 27, + 16, 231, 92, 27, 16, 243, 242, 27, 16, 249, 78, 27, 16, 248, 29, 27, 16, + 242, 126, 228, 159, 220, 23, 27, 16, 242, 126, 228, 159, 228, 186, 220, + 23, 27, 16, 216, 213, 27, 16, 216, 59, 27, 16, 235, 191, 216, 59, 27, 16, + 216, 60, 220, 23, 27, 16, 216, 60, 215, 134, 27, 16, 227, 15, 219, 44, + 27, 16, 227, 15, 219, 41, 27, 16, 227, 15, 219, 40, 27, 16, 227, 15, 219, + 39, 27, 16, 227, 15, 219, 38, 27, 16, 227, 15, 219, 37, 27, 16, 227, 15, + 219, 36, 27, 16, 227, 15, 219, 35, 27, 16, 227, 15, 219, 34, 27, 16, 227, + 15, 219, 43, 27, 16, 227, 15, 219, 42, 27, 16, 241, 229, 27, 16, 229, + 186, 27, 16, 245, 101, 65, 219, 73, 27, 16, 248, 22, 220, 23, 27, 16, 37, + 119, 251, 95, 27, 16, 37, 114, 251, 95, 27, 16, 37, 241, 239, 27, 16, 37, + 219, 251, 225, 175, 27, 16, 226, 91, 77, 27, 16, 226, 91, 114, 77, 27, + 16, 151, 226, 91, 77, 27, 16, 242, 158, 215, 134, 27, 16, 242, 158, 246, + 60, 27, 16, 2, 244, 69, 27, 16, 248, 125, 27, 16, 248, 126, 254, 63, 27, + 16, 231, 197, 27, 16, 232, 182, 27, 16, 251, 71, 27, 16, 221, 74, 213, + 238, 27, 16, 221, 74, 251, 144, 27, 16, 230, 253, 27, 16, 230, 254, 251, + 144, 27, 16, 221, 68, 213, 238, 27, 16, 221, 68, 251, 144, 27, 16, 243, + 192, 213, 238, 27, 16, 243, 192, 251, 144, 27, 16, 232, 183, 226, 55, + 223, 213, 27, 16, 232, 183, 236, 0, 223, 213, 27, 16, 251, 72, 223, 213, + 27, 16, 221, 74, 223, 213, 27, 16, 230, 254, 223, 213, 27, 16, 221, 68, + 223, 213, 27, 16, 217, 202, 226, 53, 249, 48, 225, 58, 226, 54, 27, 16, + 217, 202, 226, 53, 249, 48, 225, 58, 235, 255, 27, 16, 217, 202, 226, 53, + 249, 48, 225, 58, 226, 55, 247, 163, 27, 16, 217, 202, 235, 254, 249, 48, + 225, 58, 226, 54, 27, 16, 217, 202, 235, 254, 249, 48, 225, 58, 235, 255, + 27, 16, 217, 202, 235, 254, 249, 48, 225, 58, 236, 0, 247, 163, 27, 16, + 217, 202, 235, 254, 249, 48, 225, 58, 236, 0, 247, 162, 27, 16, 217, 202, + 235, 254, 249, 48, 225, 58, 236, 0, 247, 161, 27, 16, 249, 73, 27, 16, + 242, 103, 250, 253, 249, 207, 27, 16, 242, 103, 244, 231, 249, 207, 27, + 16, 41, 253, 74, 27, 16, 214, 132, 27, 16, 225, 148, 27, 16, 249, 198, + 27, 16, 222, 121, 27, 16, 249, 202, 27, 16, 216, 220, 27, 16, 225, 122, + 27, 16, 225, 123, 244, 29, 27, 16, 222, 122, 244, 29, 27, 16, 216, 221, + 223, 210, 27, 16, 226, 39, 219, 11, 25, 214, 118, 174, 218, 174, 25, 214, + 118, 174, 218, 163, 25, 214, 118, 174, 218, 153, 25, 214, 118, 174, 218, + 146, 25, 214, 118, 174, 218, 138, 25, 214, 118, 174, 218, 132, 25, 214, + 118, 174, 218, 131, 25, 214, 118, 174, 218, 130, 25, 214, 118, 174, 218, + 129, 25, 214, 118, 174, 218, 173, 25, 214, 118, 174, 218, 172, 25, 214, + 118, 174, 218, 171, 25, 214, 118, 174, 218, 170, 25, 214, 118, 174, 218, + 169, 25, 214, 118, 174, 218, 168, 25, 214, 118, 174, 218, 167, 25, 214, + 118, 174, 218, 166, 25, 214, 118, 174, 218, 165, 25, 214, 118, 174, 218, + 164, 25, 214, 118, 174, 218, 162, 25, 214, 118, 174, 218, 161, 25, 214, + 118, 174, 218, 160, 25, 214, 118, 174, 218, 159, 25, 214, 118, 174, 218, + 158, 25, 214, 118, 174, 218, 137, 25, 214, 118, 174, 218, 136, 25, 214, + 118, 174, 218, 135, 25, 214, 118, 174, 218, 134, 25, 214, 118, 174, 218, + 133, 25, 235, 211, 174, 218, 174, 25, 235, 211, 174, 218, 163, 25, 235, + 211, 174, 218, 146, 25, 235, 211, 174, 218, 138, 25, 235, 211, 174, 218, + 131, 25, 235, 211, 174, 218, 130, 25, 235, 211, 174, 218, 172, 25, 235, + 211, 174, 218, 171, 25, 235, 211, 174, 218, 170, 25, 235, 211, 174, 218, + 169, 25, 235, 211, 174, 218, 166, 25, 235, 211, 174, 218, 165, 25, 235, + 211, 174, 218, 164, 25, 235, 211, 174, 218, 159, 25, 235, 211, 174, 218, + 158, 25, 235, 211, 174, 218, 157, 25, 235, 211, 174, 218, 156, 25, 235, + 211, 174, 218, 155, 25, 235, 211, 174, 218, 154, 25, 235, 211, 174, 218, + 152, 25, 235, 211, 174, 218, 151, 25, 235, 211, 174, 218, 150, 25, 235, + 211, 174, 218, 149, 25, 235, 211, 174, 218, 148, 25, 235, 211, 174, 218, + 147, 25, 235, 211, 174, 218, 145, 25, 235, 211, 174, 218, 144, 25, 235, + 211, 174, 218, 143, 25, 235, 211, 174, 218, 142, 25, 235, 211, 174, 218, + 141, 25, 235, 211, 174, 218, 140, 25, 235, 211, 174, 218, 139, 25, 235, + 211, 174, 218, 137, 25, 235, 211, 174, 218, 136, 25, 235, 211, 174, 218, + 135, 25, 235, 211, 174, 218, 134, 25, 235, 211, 174, 218, 133, 37, 25, + 27, 216, 166, 37, 25, 27, 217, 176, 37, 25, 27, 226, 63, 25, 27, 233, 55, + 230, 212, 31, 245, 179, 247, 176, 31, 241, 206, 245, 179, 247, 176, 31, + 240, 204, 245, 179, 247, 176, 31, 245, 178, 241, 207, 247, 176, 31, 245, + 178, 240, 203, 247, 176, 31, 245, 179, 170, 31, 250, 108, 170, 31, 243, + 200, 249, 228, 170, 31, 230, 246, 170, 31, 252, 50, 170, 31, 234, 185, + 220, 7, 170, 31, 249, 118, 170, 31, 253, 148, 170, 31, 227, 29, 170, 31, + 251, 80, 226, 254, 170, 31, 248, 24, 167, 247, 131, 170, 31, 247, 128, + 170, 31, 212, 213, 170, 31, 235, 243, 170, 31, 226, 72, 170, 31, 224, 20, + 170, 31, 249, 128, 170, 31, 241, 46, 252, 101, 170, 31, 214, 43, 170, 31, + 244, 8, 170, 31, 254, 151, 170, 31, 223, 239, 170, 31, 223, 217, 170, 31, + 245, 177, 170, 31, 235, 56, 170, 31, 249, 123, 170, 31, 245, 100, 170, + 31, 246, 7, 170, 31, 250, 81, 170, 31, 248, 33, 170, 31, 22, 223, 216, + 170, 31, 226, 205, 170, 31, 233, 58, 170, 31, 249, 191, 170, 31, 234, 86, + 170, 31, 243, 62, 170, 31, 219, 52, 170, 31, 225, 16, 170, 31, 243, 199, + 170, 31, 223, 218, 170, 31, 233, 95, 167, 230, 227, 170, 31, 223, 214, + 170, 31, 242, 144, 211, 211, 231, 141, 170, 31, 245, 102, 170, 31, 219, + 64, 170, 31, 242, 105, 170, 31, 245, 94, 170, 31, 226, 108, 170, 31, 223, + 122, 170, 31, 244, 28, 170, 31, 214, 240, 167, 214, 28, 170, 31, 249, + 132, 170, 31, 231, 154, 170, 31, 245, 27, 170, 31, 215, 143, 170, 31, + 247, 164, 170, 31, 249, 193, 230, 180, 170, 31, 242, 87, 170, 31, 243, + 63, 235, 251, 170, 31, 231, 204, 170, 31, 254, 170, 170, 31, 245, 115, + 170, 31, 246, 63, 170, 31, 214, 26, 170, 31, 220, 78, 170, 31, 235, 219, + 170, 31, 247, 249, 170, 31, 248, 105, 170, 31, 247, 160, 170, 31, 244, + 252, 170, 31, 221, 36, 170, 31, 219, 68, 170, 31, 241, 241, 170, 31, 249, + 151, 170, 31, 249, 188, 170, 31, 244, 145, 170, 31, 254, 117, 170, 31, + 249, 150, 170, 31, 227, 63, 217, 149, 214, 219, 170, 31, 247, 184, 170, + 31, 233, 147, 170, 31, 243, 239, 249, 88, 223, 103, 215, 145, 21, 116, + 249, 88, 223, 103, 215, 145, 21, 109, 249, 88, 223, 103, 215, 145, 21, + 166, 249, 88, 223, 103, 215, 145, 21, 163, 249, 88, 223, 103, 215, 145, + 21, 180, 249, 88, 223, 103, 215, 145, 21, 189, 249, 88, 223, 103, 215, + 145, 21, 198, 249, 88, 223, 103, 215, 145, 21, 195, 249, 88, 223, 103, + 215, 145, 21, 200, 249, 88, 223, 103, 217, 196, 21, 116, 249, 88, 223, + 103, 217, 196, 21, 109, 249, 88, 223, 103, 217, 196, 21, 166, 249, 88, + 223, 103, 217, 196, 21, 163, 249, 88, 223, 103, 217, 196, 21, 180, 249, + 88, 223, 103, 217, 196, 21, 189, 249, 88, 223, 103, 217, 196, 21, 198, + 249, 88, 223, 103, 217, 196, 21, 195, 249, 88, 223, 103, 217, 196, 21, + 200, 14, 22, 6, 61, 14, 22, 6, 253, 74, 14, 22, 6, 250, 252, 14, 22, 6, + 249, 3, 14, 22, 6, 74, 14, 22, 6, 244, 230, 14, 22, 6, 243, 177, 14, 22, + 6, 242, 41, 14, 22, 6, 72, 14, 22, 6, 235, 142, 14, 22, 6, 235, 27, 14, + 22, 6, 150, 14, 22, 6, 183, 14, 22, 6, 204, 14, 22, 6, 75, 14, 22, 6, + 226, 229, 14, 22, 6, 224, 240, 14, 22, 6, 149, 14, 22, 6, 197, 14, 22, 6, + 218, 99, 14, 22, 6, 69, 14, 22, 6, 215, 79, 14, 22, 6, 214, 82, 14, 22, + 6, 213, 166, 14, 22, 6, 213, 105, 14, 22, 6, 212, 152, 14, 22, 3, 61, 14, + 22, 3, 253, 74, 14, 22, 3, 250, 252, 14, 22, 3, 249, 3, 14, 22, 3, 74, + 14, 22, 3, 244, 230, 14, 22, 3, 243, 177, 14, 22, 3, 242, 41, 14, 22, 3, + 72, 14, 22, 3, 235, 142, 14, 22, 3, 235, 27, 14, 22, 3, 150, 14, 22, 3, + 183, 14, 22, 3, 204, 14, 22, 3, 75, 14, 22, 3, 226, 229, 14, 22, 3, 224, + 240, 14, 22, 3, 149, 14, 22, 3, 197, 14, 22, 3, 218, 99, 14, 22, 3, 69, + 14, 22, 3, 215, 79, 14, 22, 3, 214, 82, 14, 22, 3, 213, 166, 14, 22, 3, + 213, 105, 14, 22, 3, 212, 152, 14, 32, 6, 61, 14, 32, 6, 253, 74, 14, 32, + 6, 250, 252, 14, 32, 6, 249, 3, 14, 32, 6, 74, 14, 32, 6, 244, 230, 14, + 32, 6, 243, 177, 14, 32, 6, 242, 41, 14, 32, 6, 72, 14, 32, 6, 235, 142, + 14, 32, 6, 235, 27, 14, 32, 6, 150, 14, 32, 6, 183, 14, 32, 6, 204, 14, + 32, 6, 75, 14, 32, 6, 226, 229, 14, 32, 6, 224, 240, 14, 32, 6, 149, 14, + 32, 6, 197, 14, 32, 6, 218, 99, 14, 32, 6, 69, 14, 32, 6, 215, 79, 14, + 32, 6, 214, 82, 14, 32, 6, 213, 166, 14, 32, 6, 213, 105, 14, 32, 6, 212, + 152, 14, 32, 3, 61, 14, 32, 3, 253, 74, 14, 32, 3, 250, 252, 14, 32, 3, + 249, 3, 14, 32, 3, 74, 14, 32, 3, 244, 230, 14, 32, 3, 243, 177, 14, 32, + 3, 72, 14, 32, 3, 235, 142, 14, 32, 3, 235, 27, 14, 32, 3, 150, 14, 32, + 3, 183, 14, 32, 3, 204, 14, 32, 3, 75, 14, 32, 3, 226, 229, 14, 32, 3, + 224, 240, 14, 32, 3, 149, 14, 32, 3, 197, 14, 32, 3, 218, 99, 14, 32, 3, + 69, 14, 32, 3, 215, 79, 14, 32, 3, 214, 82, 14, 32, 3, 213, 166, 14, 32, + 3, 213, 105, 14, 32, 3, 212, 152, 14, 22, 32, 6, 61, 14, 22, 32, 6, 253, + 74, 14, 22, 32, 6, 250, 252, 14, 22, 32, 6, 249, 3, 14, 22, 32, 6, 74, + 14, 22, 32, 6, 244, 230, 14, 22, 32, 6, 243, 177, 14, 22, 32, 6, 242, 41, + 14, 22, 32, 6, 72, 14, 22, 32, 6, 235, 142, 14, 22, 32, 6, 235, 27, 14, + 22, 32, 6, 150, 14, 22, 32, 6, 183, 14, 22, 32, 6, 204, 14, 22, 32, 6, + 75, 14, 22, 32, 6, 226, 229, 14, 22, 32, 6, 224, 240, 14, 22, 32, 6, 149, + 14, 22, 32, 6, 197, 14, 22, 32, 6, 218, 99, 14, 22, 32, 6, 69, 14, 22, + 32, 6, 215, 79, 14, 22, 32, 6, 214, 82, 14, 22, 32, 6, 213, 166, 14, 22, + 32, 6, 213, 105, 14, 22, 32, 6, 212, 152, 14, 22, 32, 3, 61, 14, 22, 32, + 3, 253, 74, 14, 22, 32, 3, 250, 252, 14, 22, 32, 3, 249, 3, 14, 22, 32, + 3, 74, 14, 22, 32, 3, 244, 230, 14, 22, 32, 3, 243, 177, 14, 22, 32, 3, + 242, 41, 14, 22, 32, 3, 72, 14, 22, 32, 3, 235, 142, 14, 22, 32, 3, 235, + 27, 14, 22, 32, 3, 150, 14, 22, 32, 3, 183, 14, 22, 32, 3, 204, 14, 22, + 32, 3, 75, 14, 22, 32, 3, 226, 229, 14, 22, 32, 3, 224, 240, 14, 22, 32, + 3, 149, 14, 22, 32, 3, 197, 14, 22, 32, 3, 218, 99, 14, 22, 32, 3, 69, + 14, 22, 32, 3, 215, 79, 14, 22, 32, 3, 214, 82, 14, 22, 32, 3, 213, 166, + 14, 22, 32, 3, 213, 105, 14, 22, 32, 3, 212, 152, 14, 113, 6, 61, 14, + 113, 6, 250, 252, 14, 113, 6, 249, 3, 14, 113, 6, 243, 177, 14, 113, 6, + 235, 142, 14, 113, 6, 235, 27, 14, 113, 6, 204, 14, 113, 6, 75, 14, 113, + 6, 226, 229, 14, 113, 6, 224, 240, 14, 113, 6, 197, 14, 113, 6, 218, 99, + 14, 113, 6, 69, 14, 113, 6, 215, 79, 14, 113, 6, 214, 82, 14, 113, 6, + 213, 166, 14, 113, 6, 213, 105, 14, 113, 6, 212, 152, 14, 113, 3, 61, 14, + 113, 3, 253, 74, 14, 113, 3, 250, 252, 14, 113, 3, 249, 3, 14, 113, 3, + 244, 230, 14, 113, 3, 242, 41, 14, 113, 3, 72, 14, 113, 3, 235, 142, 14, + 113, 3, 235, 27, 14, 113, 3, 150, 14, 113, 3, 183, 14, 113, 3, 204, 14, + 113, 3, 226, 229, 14, 113, 3, 224, 240, 14, 113, 3, 149, 14, 113, 3, 197, + 14, 113, 3, 218, 99, 14, 113, 3, 69, 14, 113, 3, 215, 79, 14, 113, 3, + 214, 82, 14, 113, 3, 213, 166, 14, 113, 3, 213, 105, 14, 113, 3, 212, + 152, 14, 22, 113, 6, 61, 14, 22, 113, 6, 253, 74, 14, 22, 113, 6, 250, + 252, 14, 22, 113, 6, 249, 3, 14, 22, 113, 6, 74, 14, 22, 113, 6, 244, + 230, 14, 22, 113, 6, 243, 177, 14, 22, 113, 6, 242, 41, 14, 22, 113, 6, + 72, 14, 22, 113, 6, 235, 142, 14, 22, 113, 6, 235, 27, 14, 22, 113, 6, + 150, 14, 22, 113, 6, 183, 14, 22, 113, 6, 204, 14, 22, 113, 6, 75, 14, + 22, 113, 6, 226, 229, 14, 22, 113, 6, 224, 240, 14, 22, 113, 6, 149, 14, + 22, 113, 6, 197, 14, 22, 113, 6, 218, 99, 14, 22, 113, 6, 69, 14, 22, + 113, 6, 215, 79, 14, 22, 113, 6, 214, 82, 14, 22, 113, 6, 213, 166, 14, + 22, 113, 6, 213, 105, 14, 22, 113, 6, 212, 152, 14, 22, 113, 3, 61, 14, + 22, 113, 3, 253, 74, 14, 22, 113, 3, 250, 252, 14, 22, 113, 3, 249, 3, + 14, 22, 113, 3, 74, 14, 22, 113, 3, 244, 230, 14, 22, 113, 3, 243, 177, + 14, 22, 113, 3, 242, 41, 14, 22, 113, 3, 72, 14, 22, 113, 3, 235, 142, + 14, 22, 113, 3, 235, 27, 14, 22, 113, 3, 150, 14, 22, 113, 3, 183, 14, + 22, 113, 3, 204, 14, 22, 113, 3, 75, 14, 22, 113, 3, 226, 229, 14, 22, + 113, 3, 224, 240, 14, 22, 113, 3, 149, 14, 22, 113, 3, 197, 14, 22, 113, + 3, 218, 99, 14, 22, 113, 3, 69, 14, 22, 113, 3, 215, 79, 14, 22, 113, 3, + 214, 82, 14, 22, 113, 3, 213, 166, 14, 22, 113, 3, 213, 105, 14, 22, 113, + 3, 212, 152, 14, 129, 6, 61, 14, 129, 6, 253, 74, 14, 129, 6, 249, 3, 14, + 129, 6, 74, 14, 129, 6, 244, 230, 14, 129, 6, 243, 177, 14, 129, 6, 235, + 142, 14, 129, 6, 235, 27, 14, 129, 6, 150, 14, 129, 6, 183, 14, 129, 6, + 204, 14, 129, 6, 75, 14, 129, 6, 226, 229, 14, 129, 6, 224, 240, 14, 129, + 6, 197, 14, 129, 6, 218, 99, 14, 129, 6, 69, 14, 129, 6, 215, 79, 14, + 129, 6, 214, 82, 14, 129, 6, 213, 166, 14, 129, 6, 213, 105, 14, 129, 3, + 61, 14, 129, 3, 253, 74, 14, 129, 3, 250, 252, 14, 129, 3, 249, 3, 14, + 129, 3, 74, 14, 129, 3, 244, 230, 14, 129, 3, 243, 177, 14, 129, 3, 242, + 41, 14, 129, 3, 72, 14, 129, 3, 235, 142, 14, 129, 3, 235, 27, 14, 129, + 3, 150, 14, 129, 3, 183, 14, 129, 3, 204, 14, 129, 3, 75, 14, 129, 3, + 226, 229, 14, 129, 3, 224, 240, 14, 129, 3, 149, 14, 129, 3, 197, 14, + 129, 3, 218, 99, 14, 129, 3, 69, 14, 129, 3, 215, 79, 14, 129, 3, 214, + 82, 14, 129, 3, 213, 166, 14, 129, 3, 213, 105, 14, 129, 3, 212, 152, 14, + 187, 6, 61, 14, 187, 6, 253, 74, 14, 187, 6, 249, 3, 14, 187, 6, 74, 14, + 187, 6, 244, 230, 14, 187, 6, 243, 177, 14, 187, 6, 72, 14, 187, 6, 235, + 142, 14, 187, 6, 235, 27, 14, 187, 6, 150, 14, 187, 6, 183, 14, 187, 6, + 75, 14, 187, 6, 197, 14, 187, 6, 218, 99, 14, 187, 6, 69, 14, 187, 6, + 215, 79, 14, 187, 6, 214, 82, 14, 187, 6, 213, 166, 14, 187, 6, 213, 105, + 14, 187, 3, 61, 14, 187, 3, 253, 74, 14, 187, 3, 250, 252, 14, 187, 3, + 249, 3, 14, 187, 3, 74, 14, 187, 3, 244, 230, 14, 187, 3, 243, 177, 14, + 187, 3, 242, 41, 14, 187, 3, 72, 14, 187, 3, 235, 142, 14, 187, 3, 235, + 27, 14, 187, 3, 150, 14, 187, 3, 183, 14, 187, 3, 204, 14, 187, 3, 75, + 14, 187, 3, 226, 229, 14, 187, 3, 224, 240, 14, 187, 3, 149, 14, 187, 3, + 197, 14, 187, 3, 218, 99, 14, 187, 3, 69, 14, 187, 3, 215, 79, 14, 187, + 3, 214, 82, 14, 187, 3, 213, 166, 14, 187, 3, 213, 105, 14, 187, 3, 212, + 152, 14, 22, 129, 6, 61, 14, 22, 129, 6, 253, 74, 14, 22, 129, 6, 250, + 252, 14, 22, 129, 6, 249, 3, 14, 22, 129, 6, 74, 14, 22, 129, 6, 244, + 230, 14, 22, 129, 6, 243, 177, 14, 22, 129, 6, 242, 41, 14, 22, 129, 6, + 72, 14, 22, 129, 6, 235, 142, 14, 22, 129, 6, 235, 27, 14, 22, 129, 6, + 150, 14, 22, 129, 6, 183, 14, 22, 129, 6, 204, 14, 22, 129, 6, 75, 14, + 22, 129, 6, 226, 229, 14, 22, 129, 6, 224, 240, 14, 22, 129, 6, 149, 14, + 22, 129, 6, 197, 14, 22, 129, 6, 218, 99, 14, 22, 129, 6, 69, 14, 22, + 129, 6, 215, 79, 14, 22, 129, 6, 214, 82, 14, 22, 129, 6, 213, 166, 14, + 22, 129, 6, 213, 105, 14, 22, 129, 6, 212, 152, 14, 22, 129, 3, 61, 14, + 22, 129, 3, 253, 74, 14, 22, 129, 3, 250, 252, 14, 22, 129, 3, 249, 3, + 14, 22, 129, 3, 74, 14, 22, 129, 3, 244, 230, 14, 22, 129, 3, 243, 177, + 14, 22, 129, 3, 242, 41, 14, 22, 129, 3, 72, 14, 22, 129, 3, 235, 142, + 14, 22, 129, 3, 235, 27, 14, 22, 129, 3, 150, 14, 22, 129, 3, 183, 14, + 22, 129, 3, 204, 14, 22, 129, 3, 75, 14, 22, 129, 3, 226, 229, 14, 22, + 129, 3, 224, 240, 14, 22, 129, 3, 149, 14, 22, 129, 3, 197, 14, 22, 129, + 3, 218, 99, 14, 22, 129, 3, 69, 14, 22, 129, 3, 215, 79, 14, 22, 129, 3, + 214, 82, 14, 22, 129, 3, 213, 166, 14, 22, 129, 3, 213, 105, 14, 22, 129, + 3, 212, 152, 14, 35, 6, 61, 14, 35, 6, 253, 74, 14, 35, 6, 250, 252, 14, + 35, 6, 249, 3, 14, 35, 6, 74, 14, 35, 6, 244, 230, 14, 35, 6, 243, 177, + 14, 35, 6, 242, 41, 14, 35, 6, 72, 14, 35, 6, 235, 142, 14, 35, 6, 235, + 27, 14, 35, 6, 150, 14, 35, 6, 183, 14, 35, 6, 204, 14, 35, 6, 75, 14, + 35, 6, 226, 229, 14, 35, 6, 224, 240, 14, 35, 6, 149, 14, 35, 6, 197, 14, + 35, 6, 218, 99, 14, 35, 6, 69, 14, 35, 6, 215, 79, 14, 35, 6, 214, 82, + 14, 35, 6, 213, 166, 14, 35, 6, 213, 105, 14, 35, 6, 212, 152, 14, 35, 3, + 61, 14, 35, 3, 253, 74, 14, 35, 3, 250, 252, 14, 35, 3, 249, 3, 14, 35, + 3, 74, 14, 35, 3, 244, 230, 14, 35, 3, 243, 177, 14, 35, 3, 242, 41, 14, + 35, 3, 72, 14, 35, 3, 235, 142, 14, 35, 3, 235, 27, 14, 35, 3, 150, 14, + 35, 3, 183, 14, 35, 3, 204, 14, 35, 3, 75, 14, 35, 3, 226, 229, 14, 35, + 3, 224, 240, 14, 35, 3, 149, 14, 35, 3, 197, 14, 35, 3, 218, 99, 14, 35, + 3, 69, 14, 35, 3, 215, 79, 14, 35, 3, 214, 82, 14, 35, 3, 213, 166, 14, + 35, 3, 213, 105, 14, 35, 3, 212, 152, 14, 35, 22, 6, 61, 14, 35, 22, 6, + 253, 74, 14, 35, 22, 6, 250, 252, 14, 35, 22, 6, 249, 3, 14, 35, 22, 6, + 74, 14, 35, 22, 6, 244, 230, 14, 35, 22, 6, 243, 177, 14, 35, 22, 6, 242, + 41, 14, 35, 22, 6, 72, 14, 35, 22, 6, 235, 142, 14, 35, 22, 6, 235, 27, + 14, 35, 22, 6, 150, 14, 35, 22, 6, 183, 14, 35, 22, 6, 204, 14, 35, 22, + 6, 75, 14, 35, 22, 6, 226, 229, 14, 35, 22, 6, 224, 240, 14, 35, 22, 6, + 149, 14, 35, 22, 6, 197, 14, 35, 22, 6, 218, 99, 14, 35, 22, 6, 69, 14, + 35, 22, 6, 215, 79, 14, 35, 22, 6, 214, 82, 14, 35, 22, 6, 213, 166, 14, + 35, 22, 6, 213, 105, 14, 35, 22, 6, 212, 152, 14, 35, 22, 3, 61, 14, 35, + 22, 3, 253, 74, 14, 35, 22, 3, 250, 252, 14, 35, 22, 3, 249, 3, 14, 35, + 22, 3, 74, 14, 35, 22, 3, 244, 230, 14, 35, 22, 3, 243, 177, 14, 35, 22, + 3, 242, 41, 14, 35, 22, 3, 72, 14, 35, 22, 3, 235, 142, 14, 35, 22, 3, + 235, 27, 14, 35, 22, 3, 150, 14, 35, 22, 3, 183, 14, 35, 22, 3, 204, 14, + 35, 22, 3, 75, 14, 35, 22, 3, 226, 229, 14, 35, 22, 3, 224, 240, 14, 35, + 22, 3, 149, 14, 35, 22, 3, 197, 14, 35, 22, 3, 218, 99, 14, 35, 22, 3, + 69, 14, 35, 22, 3, 215, 79, 14, 35, 22, 3, 214, 82, 14, 35, 22, 3, 213, + 166, 14, 35, 22, 3, 213, 105, 14, 35, 22, 3, 212, 152, 14, 35, 32, 6, 61, + 14, 35, 32, 6, 253, 74, 14, 35, 32, 6, 250, 252, 14, 35, 32, 6, 249, 3, + 14, 35, 32, 6, 74, 14, 35, 32, 6, 244, 230, 14, 35, 32, 6, 243, 177, 14, + 35, 32, 6, 242, 41, 14, 35, 32, 6, 72, 14, 35, 32, 6, 235, 142, 14, 35, + 32, 6, 235, 27, 14, 35, 32, 6, 150, 14, 35, 32, 6, 183, 14, 35, 32, 6, + 204, 14, 35, 32, 6, 75, 14, 35, 32, 6, 226, 229, 14, 35, 32, 6, 224, 240, + 14, 35, 32, 6, 149, 14, 35, 32, 6, 197, 14, 35, 32, 6, 218, 99, 14, 35, + 32, 6, 69, 14, 35, 32, 6, 215, 79, 14, 35, 32, 6, 214, 82, 14, 35, 32, 6, + 213, 166, 14, 35, 32, 6, 213, 105, 14, 35, 32, 6, 212, 152, 14, 35, 32, + 3, 61, 14, 35, 32, 3, 253, 74, 14, 35, 32, 3, 250, 252, 14, 35, 32, 3, + 249, 3, 14, 35, 32, 3, 74, 14, 35, 32, 3, 244, 230, 14, 35, 32, 3, 243, + 177, 14, 35, 32, 3, 242, 41, 14, 35, 32, 3, 72, 14, 35, 32, 3, 235, 142, + 14, 35, 32, 3, 235, 27, 14, 35, 32, 3, 150, 14, 35, 32, 3, 183, 14, 35, + 32, 3, 204, 14, 35, 32, 3, 75, 14, 35, 32, 3, 226, 229, 14, 35, 32, 3, + 224, 240, 14, 35, 32, 3, 149, 14, 35, 32, 3, 197, 14, 35, 32, 3, 218, 99, + 14, 35, 32, 3, 69, 14, 35, 32, 3, 215, 79, 14, 35, 32, 3, 214, 82, 14, + 35, 32, 3, 213, 166, 14, 35, 32, 3, 213, 105, 14, 35, 32, 3, 212, 152, + 14, 35, 22, 32, 6, 61, 14, 35, 22, 32, 6, 253, 74, 14, 35, 22, 32, 6, + 250, 252, 14, 35, 22, 32, 6, 249, 3, 14, 35, 22, 32, 6, 74, 14, 35, 22, + 32, 6, 244, 230, 14, 35, 22, 32, 6, 243, 177, 14, 35, 22, 32, 6, 242, 41, + 14, 35, 22, 32, 6, 72, 14, 35, 22, 32, 6, 235, 142, 14, 35, 22, 32, 6, + 235, 27, 14, 35, 22, 32, 6, 150, 14, 35, 22, 32, 6, 183, 14, 35, 22, 32, + 6, 204, 14, 35, 22, 32, 6, 75, 14, 35, 22, 32, 6, 226, 229, 14, 35, 22, + 32, 6, 224, 240, 14, 35, 22, 32, 6, 149, 14, 35, 22, 32, 6, 197, 14, 35, + 22, 32, 6, 218, 99, 14, 35, 22, 32, 6, 69, 14, 35, 22, 32, 6, 215, 79, + 14, 35, 22, 32, 6, 214, 82, 14, 35, 22, 32, 6, 213, 166, 14, 35, 22, 32, + 6, 213, 105, 14, 35, 22, 32, 6, 212, 152, 14, 35, 22, 32, 3, 61, 14, 35, + 22, 32, 3, 253, 74, 14, 35, 22, 32, 3, 250, 252, 14, 35, 22, 32, 3, 249, + 3, 14, 35, 22, 32, 3, 74, 14, 35, 22, 32, 3, 244, 230, 14, 35, 22, 32, 3, + 243, 177, 14, 35, 22, 32, 3, 242, 41, 14, 35, 22, 32, 3, 72, 14, 35, 22, + 32, 3, 235, 142, 14, 35, 22, 32, 3, 235, 27, 14, 35, 22, 32, 3, 150, 14, + 35, 22, 32, 3, 183, 14, 35, 22, 32, 3, 204, 14, 35, 22, 32, 3, 75, 14, + 35, 22, 32, 3, 226, 229, 14, 35, 22, 32, 3, 224, 240, 14, 35, 22, 32, 3, + 149, 14, 35, 22, 32, 3, 197, 14, 35, 22, 32, 3, 218, 99, 14, 35, 22, 32, + 3, 69, 14, 35, 22, 32, 3, 215, 79, 14, 35, 22, 32, 3, 214, 82, 14, 35, + 22, 32, 3, 213, 166, 14, 35, 22, 32, 3, 213, 105, 14, 35, 22, 32, 3, 212, + 152, 14, 230, 208, 6, 61, 14, 230, 208, 6, 253, 74, 14, 230, 208, 6, 250, + 252, 14, 230, 208, 6, 249, 3, 14, 230, 208, 6, 74, 14, 230, 208, 6, 244, + 230, 14, 230, 208, 6, 243, 177, 14, 230, 208, 6, 242, 41, 14, 230, 208, + 6, 72, 14, 230, 208, 6, 235, 142, 14, 230, 208, 6, 235, 27, 14, 230, 208, + 6, 150, 14, 230, 208, 6, 183, 14, 230, 208, 6, 204, 14, 230, 208, 6, 75, + 14, 230, 208, 6, 226, 229, 14, 230, 208, 6, 224, 240, 14, 230, 208, 6, + 149, 14, 230, 208, 6, 197, 14, 230, 208, 6, 218, 99, 14, 230, 208, 6, 69, + 14, 230, 208, 6, 215, 79, 14, 230, 208, 6, 214, 82, 14, 230, 208, 6, 213, + 166, 14, 230, 208, 6, 213, 105, 14, 230, 208, 6, 212, 152, 14, 230, 208, + 3, 61, 14, 230, 208, 3, 253, 74, 14, 230, 208, 3, 250, 252, 14, 230, 208, + 3, 249, 3, 14, 230, 208, 3, 74, 14, 230, 208, 3, 244, 230, 14, 230, 208, + 3, 243, 177, 14, 230, 208, 3, 242, 41, 14, 230, 208, 3, 72, 14, 230, 208, + 3, 235, 142, 14, 230, 208, 3, 235, 27, 14, 230, 208, 3, 150, 14, 230, + 208, 3, 183, 14, 230, 208, 3, 204, 14, 230, 208, 3, 75, 14, 230, 208, 3, + 226, 229, 14, 230, 208, 3, 224, 240, 14, 230, 208, 3, 149, 14, 230, 208, + 3, 197, 14, 230, 208, 3, 218, 99, 14, 230, 208, 3, 69, 14, 230, 208, 3, + 215, 79, 14, 230, 208, 3, 214, 82, 14, 230, 208, 3, 213, 166, 14, 230, + 208, 3, 213, 105, 14, 230, 208, 3, 212, 152, 14, 32, 3, 247, 73, 72, 14, + 32, 3, 247, 73, 235, 142, 14, 22, 6, 254, 52, 14, 22, 6, 251, 203, 14, + 22, 6, 243, 83, 14, 22, 6, 248, 5, 14, 22, 6, 245, 63, 14, 22, 6, 212, + 78, 14, 22, 6, 245, 28, 14, 22, 6, 217, 132, 14, 22, 6, 235, 183, 14, 22, + 6, 234, 227, 14, 22, 6, 233, 122, 14, 22, 6, 230, 172, 14, 22, 6, 228, + 92, 14, 22, 6, 213, 145, 14, 22, 6, 227, 65, 14, 22, 6, 225, 240, 14, 22, + 6, 223, 190, 14, 22, 6, 217, 133, 87, 14, 22, 6, 220, 103, 14, 22, 6, + 217, 248, 14, 22, 6, 215, 128, 14, 22, 6, 226, 9, 14, 22, 6, 250, 47, 14, + 22, 6, 225, 46, 14, 22, 6, 227, 67, 14, 22, 230, 39, 14, 22, 3, 254, 52, + 14, 22, 3, 251, 203, 14, 22, 3, 243, 83, 14, 22, 3, 248, 5, 14, 22, 3, + 245, 63, 14, 22, 3, 212, 78, 14, 22, 3, 245, 28, 14, 22, 3, 217, 132, 14, + 22, 3, 235, 183, 14, 22, 3, 234, 227, 14, 22, 3, 233, 122, 14, 22, 3, + 230, 172, 14, 22, 3, 228, 92, 14, 22, 3, 213, 145, 14, 22, 3, 227, 65, + 14, 22, 3, 225, 240, 14, 22, 3, 223, 190, 14, 22, 3, 40, 220, 103, 14, + 22, 3, 220, 103, 14, 22, 3, 217, 248, 14, 22, 3, 215, 128, 14, 22, 3, + 226, 9, 14, 22, 3, 250, 47, 14, 22, 3, 225, 46, 14, 22, 3, 227, 67, 14, + 22, 226, 125, 247, 185, 14, 22, 245, 64, 87, 14, 22, 217, 133, 87, 14, + 22, 234, 228, 87, 14, 22, 226, 10, 87, 14, 22, 223, 191, 87, 14, 22, 225, + 241, 87, 14, 32, 6, 254, 52, 14, 32, 6, 251, 203, 14, 32, 6, 243, 83, 14, + 32, 6, 248, 5, 14, 32, 6, 245, 63, 14, 32, 6, 212, 78, 14, 32, 6, 245, + 28, 14, 32, 6, 217, 132, 14, 32, 6, 235, 183, 14, 32, 6, 234, 227, 14, + 32, 6, 233, 122, 14, 32, 6, 230, 172, 14, 32, 6, 228, 92, 14, 32, 6, 213, + 145, 14, 32, 6, 227, 65, 14, 32, 6, 225, 240, 14, 32, 6, 223, 190, 14, + 32, 6, 217, 133, 87, 14, 32, 6, 220, 103, 14, 32, 6, 217, 248, 14, 32, 6, + 215, 128, 14, 32, 6, 226, 9, 14, 32, 6, 250, 47, 14, 32, 6, 225, 46, 14, + 32, 6, 227, 67, 14, 32, 230, 39, 14, 32, 3, 254, 52, 14, 32, 3, 251, 203, + 14, 32, 3, 243, 83, 14, 32, 3, 248, 5, 14, 32, 3, 245, 63, 14, 32, 3, + 212, 78, 14, 32, 3, 245, 28, 14, 32, 3, 217, 132, 14, 32, 3, 235, 183, + 14, 32, 3, 234, 227, 14, 32, 3, 233, 122, 14, 32, 3, 230, 172, 14, 32, 3, + 228, 92, 14, 32, 3, 213, 145, 14, 32, 3, 227, 65, 14, 32, 3, 225, 240, + 14, 32, 3, 223, 190, 14, 32, 3, 40, 220, 103, 14, 32, 3, 220, 103, 14, + 32, 3, 217, 248, 14, 32, 3, 215, 128, 14, 32, 3, 226, 9, 14, 32, 3, 250, + 47, 14, 32, 3, 225, 46, 14, 32, 3, 227, 67, 14, 32, 226, 125, 247, 185, + 14, 32, 245, 64, 87, 14, 32, 217, 133, 87, 14, 32, 234, 228, 87, 14, 32, + 226, 10, 87, 14, 32, 223, 191, 87, 14, 32, 225, 241, 87, 14, 22, 32, 6, + 254, 52, 14, 22, 32, 6, 251, 203, 14, 22, 32, 6, 243, 83, 14, 22, 32, 6, + 248, 5, 14, 22, 32, 6, 245, 63, 14, 22, 32, 6, 212, 78, 14, 22, 32, 6, + 245, 28, 14, 22, 32, 6, 217, 132, 14, 22, 32, 6, 235, 183, 14, 22, 32, 6, + 234, 227, 14, 22, 32, 6, 233, 122, 14, 22, 32, 6, 230, 172, 14, 22, 32, + 6, 228, 92, 14, 22, 32, 6, 213, 145, 14, 22, 32, 6, 227, 65, 14, 22, 32, + 6, 225, 240, 14, 22, 32, 6, 223, 190, 14, 22, 32, 6, 217, 133, 87, 14, + 22, 32, 6, 220, 103, 14, 22, 32, 6, 217, 248, 14, 22, 32, 6, 215, 128, + 14, 22, 32, 6, 226, 9, 14, 22, 32, 6, 250, 47, 14, 22, 32, 6, 225, 46, + 14, 22, 32, 6, 227, 67, 14, 22, 32, 230, 39, 14, 22, 32, 3, 254, 52, 14, + 22, 32, 3, 251, 203, 14, 22, 32, 3, 243, 83, 14, 22, 32, 3, 248, 5, 14, + 22, 32, 3, 245, 63, 14, 22, 32, 3, 212, 78, 14, 22, 32, 3, 245, 28, 14, + 22, 32, 3, 217, 132, 14, 22, 32, 3, 235, 183, 14, 22, 32, 3, 234, 227, + 14, 22, 32, 3, 233, 122, 14, 22, 32, 3, 230, 172, 14, 22, 32, 3, 228, 92, + 14, 22, 32, 3, 213, 145, 14, 22, 32, 3, 227, 65, 14, 22, 32, 3, 225, 240, + 14, 22, 32, 3, 223, 190, 14, 22, 32, 3, 40, 220, 103, 14, 22, 32, 3, 220, + 103, 14, 22, 32, 3, 217, 248, 14, 22, 32, 3, 215, 128, 14, 22, 32, 3, + 226, 9, 14, 22, 32, 3, 250, 47, 14, 22, 32, 3, 225, 46, 14, 22, 32, 3, + 227, 67, 14, 22, 32, 226, 125, 247, 185, 14, 22, 32, 245, 64, 87, 14, 22, + 32, 217, 133, 87, 14, 22, 32, 234, 228, 87, 14, 22, 32, 226, 10, 87, 14, + 22, 32, 223, 191, 87, 14, 22, 32, 225, 241, 87, 14, 35, 22, 6, 254, 52, + 14, 35, 22, 6, 251, 203, 14, 35, 22, 6, 243, 83, 14, 35, 22, 6, 248, 5, + 14, 35, 22, 6, 245, 63, 14, 35, 22, 6, 212, 78, 14, 35, 22, 6, 245, 28, + 14, 35, 22, 6, 217, 132, 14, 35, 22, 6, 235, 183, 14, 35, 22, 6, 234, + 227, 14, 35, 22, 6, 233, 122, 14, 35, 22, 6, 230, 172, 14, 35, 22, 6, + 228, 92, 14, 35, 22, 6, 213, 145, 14, 35, 22, 6, 227, 65, 14, 35, 22, 6, + 225, 240, 14, 35, 22, 6, 223, 190, 14, 35, 22, 6, 217, 133, 87, 14, 35, + 22, 6, 220, 103, 14, 35, 22, 6, 217, 248, 14, 35, 22, 6, 215, 128, 14, + 35, 22, 6, 226, 9, 14, 35, 22, 6, 250, 47, 14, 35, 22, 6, 225, 46, 14, + 35, 22, 6, 227, 67, 14, 35, 22, 230, 39, 14, 35, 22, 3, 254, 52, 14, 35, + 22, 3, 251, 203, 14, 35, 22, 3, 243, 83, 14, 35, 22, 3, 248, 5, 14, 35, + 22, 3, 245, 63, 14, 35, 22, 3, 212, 78, 14, 35, 22, 3, 245, 28, 14, 35, + 22, 3, 217, 132, 14, 35, 22, 3, 235, 183, 14, 35, 22, 3, 234, 227, 14, + 35, 22, 3, 233, 122, 14, 35, 22, 3, 230, 172, 14, 35, 22, 3, 228, 92, 14, + 35, 22, 3, 213, 145, 14, 35, 22, 3, 227, 65, 14, 35, 22, 3, 225, 240, 14, + 35, 22, 3, 223, 190, 14, 35, 22, 3, 40, 220, 103, 14, 35, 22, 3, 220, + 103, 14, 35, 22, 3, 217, 248, 14, 35, 22, 3, 215, 128, 14, 35, 22, 3, + 226, 9, 14, 35, 22, 3, 250, 47, 14, 35, 22, 3, 225, 46, 14, 35, 22, 3, + 227, 67, 14, 35, 22, 226, 125, 247, 185, 14, 35, 22, 245, 64, 87, 14, 35, + 22, 217, 133, 87, 14, 35, 22, 234, 228, 87, 14, 35, 22, 226, 10, 87, 14, + 35, 22, 223, 191, 87, 14, 35, 22, 225, 241, 87, 14, 35, 22, 32, 6, 254, + 52, 14, 35, 22, 32, 6, 251, 203, 14, 35, 22, 32, 6, 243, 83, 14, 35, 22, + 32, 6, 248, 5, 14, 35, 22, 32, 6, 245, 63, 14, 35, 22, 32, 6, 212, 78, + 14, 35, 22, 32, 6, 245, 28, 14, 35, 22, 32, 6, 217, 132, 14, 35, 22, 32, + 6, 235, 183, 14, 35, 22, 32, 6, 234, 227, 14, 35, 22, 32, 6, 233, 122, + 14, 35, 22, 32, 6, 230, 172, 14, 35, 22, 32, 6, 228, 92, 14, 35, 22, 32, + 6, 213, 145, 14, 35, 22, 32, 6, 227, 65, 14, 35, 22, 32, 6, 225, 240, 14, + 35, 22, 32, 6, 223, 190, 14, 35, 22, 32, 6, 217, 133, 87, 14, 35, 22, 32, + 6, 220, 103, 14, 35, 22, 32, 6, 217, 248, 14, 35, 22, 32, 6, 215, 128, + 14, 35, 22, 32, 6, 226, 9, 14, 35, 22, 32, 6, 250, 47, 14, 35, 22, 32, 6, + 225, 46, 14, 35, 22, 32, 6, 227, 67, 14, 35, 22, 32, 230, 39, 14, 35, 22, + 32, 3, 254, 52, 14, 35, 22, 32, 3, 251, 203, 14, 35, 22, 32, 3, 243, 83, + 14, 35, 22, 32, 3, 248, 5, 14, 35, 22, 32, 3, 245, 63, 14, 35, 22, 32, 3, + 212, 78, 14, 35, 22, 32, 3, 245, 28, 14, 35, 22, 32, 3, 217, 132, 14, 35, + 22, 32, 3, 235, 183, 14, 35, 22, 32, 3, 234, 227, 14, 35, 22, 32, 3, 233, + 122, 14, 35, 22, 32, 3, 230, 172, 14, 35, 22, 32, 3, 228, 92, 14, 35, 22, + 32, 3, 213, 145, 14, 35, 22, 32, 3, 227, 65, 14, 35, 22, 32, 3, 225, 240, + 14, 35, 22, 32, 3, 223, 190, 14, 35, 22, 32, 3, 40, 220, 103, 14, 35, 22, + 32, 3, 220, 103, 14, 35, 22, 32, 3, 217, 248, 14, 35, 22, 32, 3, 215, + 128, 14, 35, 22, 32, 3, 226, 9, 14, 35, 22, 32, 3, 250, 47, 14, 35, 22, + 32, 3, 225, 46, 14, 35, 22, 32, 3, 227, 67, 14, 35, 22, 32, 226, 125, + 247, 185, 14, 35, 22, 32, 245, 64, 87, 14, 35, 22, 32, 217, 133, 87, 14, + 35, 22, 32, 234, 228, 87, 14, 35, 22, 32, 226, 10, 87, 14, 35, 22, 32, + 223, 191, 87, 14, 35, 22, 32, 225, 241, 87, 14, 22, 6, 247, 179, 14, 22, + 3, 247, 179, 14, 22, 21, 212, 79, 14, 22, 21, 116, 14, 22, 21, 109, 14, + 22, 21, 166, 14, 22, 21, 163, 14, 22, 21, 180, 14, 22, 21, 189, 14, 22, + 21, 198, 14, 22, 21, 195, 14, 22, 21, 200, 14, 187, 21, 212, 79, 14, 187, + 21, 116, 14, 187, 21, 109, 14, 187, 21, 166, 14, 187, 21, 163, 14, 187, + 21, 180, 14, 187, 21, 189, 14, 187, 21, 198, 14, 187, 21, 195, 14, 187, + 21, 200, 14, 35, 21, 212, 79, 14, 35, 21, 116, 14, 35, 21, 109, 14, 35, + 21, 166, 14, 35, 21, 163, 14, 35, 21, 180, 14, 35, 21, 189, 14, 35, 21, + 198, 14, 35, 21, 195, 14, 35, 21, 200, 14, 35, 22, 21, 212, 79, 14, 35, + 22, 21, 116, 14, 35, 22, 21, 109, 14, 35, 22, 21, 166, 14, 35, 22, 21, + 163, 14, 35, 22, 21, 180, 14, 35, 22, 21, 189, 14, 35, 22, 21, 198, 14, + 35, 22, 21, 195, 14, 35, 22, 21, 200, 14, 230, 208, 21, 212, 79, 14, 230, + 208, 21, 116, 14, 230, 208, 21, 109, 14, 230, 208, 21, 166, 14, 230, 208, + 21, 163, 14, 230, 208, 21, 180, 14, 230, 208, 21, 189, 14, 230, 208, 21, + 198, 14, 230, 208, 21, 195, 14, 230, 208, 21, 200, 232, 10, 85, 245, 176, + 213, 224, 232, 10, 85, 219, 215, 213, 224, 232, 10, 85, 213, 250, 213, + 224, 232, 10, 85, 228, 167, 213, 224, 232, 10, 85, 224, 4, 246, 50, 232, + 10, 85, 242, 104, 246, 50, 232, 10, 85, 67, 246, 50, 232, 10, 85, 122, + 65, 250, 77, 232, 10, 85, 117, 65, 250, 77, 232, 10, 85, 133, 65, 250, + 77, 232, 10, 85, 243, 237, 65, 250, 77, 232, 10, 85, 244, 50, 65, 250, + 77, 232, 10, 85, 220, 53, 65, 250, 77, 232, 10, 85, 221, 43, 65, 250, 77, + 232, 10, 85, 245, 150, 65, 250, 77, 232, 10, 85, 229, 31, 65, 250, 77, + 232, 10, 85, 122, 65, 252, 72, 232, 10, 85, 117, 65, 252, 72, 232, 10, + 85, 133, 65, 252, 72, 232, 10, 85, 243, 237, 65, 252, 72, 232, 10, 85, + 244, 50, 65, 252, 72, 232, 10, 85, 220, 53, 65, 252, 72, 232, 10, 85, + 221, 43, 65, 252, 72, 232, 10, 85, 245, 150, 65, 252, 72, 232, 10, 85, + 229, 31, 65, 252, 72, 232, 10, 85, 122, 65, 249, 227, 232, 10, 85, 117, + 65, 249, 227, 232, 10, 85, 133, 65, 249, 227, 232, 10, 85, 243, 237, 65, + 249, 227, 232, 10, 85, 244, 50, 65, 249, 227, 232, 10, 85, 220, 53, 65, + 249, 227, 232, 10, 85, 221, 43, 65, 249, 227, 232, 10, 85, 245, 150, 65, + 249, 227, 232, 10, 85, 229, 31, 65, 249, 227, 232, 10, 85, 225, 159, 232, + 10, 85, 227, 22, 232, 10, 85, 252, 73, 232, 10, 85, 250, 7, 232, 10, 85, + 219, 171, 232, 10, 85, 218, 240, 232, 10, 85, 253, 95, 232, 10, 85, 213, + 217, 232, 10, 85, 235, 65, 232, 10, 85, 252, 101, 127, 85, 199, 252, 101, + 127, 85, 241, 30, 127, 85, 241, 29, 127, 85, 241, 28, 127, 85, 241, 27, + 127, 85, 241, 26, 127, 85, 241, 25, 127, 85, 241, 24, 127, 85, 241, 23, + 127, 85, 241, 22, 127, 85, 241, 21, 127, 85, 241, 20, 127, 85, 241, 19, + 127, 85, 241, 18, 127, 85, 241, 17, 127, 85, 241, 16, 127, 85, 241, 15, + 127, 85, 241, 14, 127, 85, 241, 13, 127, 85, 241, 12, 127, 85, 241, 11, + 127, 85, 241, 10, 127, 85, 241, 9, 127, 85, 241, 8, 127, 85, 241, 7, 127, + 85, 241, 6, 127, 85, 241, 5, 127, 85, 241, 4, 127, 85, 241, 3, 127, 85, + 241, 2, 127, 85, 241, 1, 127, 85, 241, 0, 127, 85, 240, 255, 127, 85, + 240, 254, 127, 85, 240, 253, 127, 85, 240, 252, 127, 85, 240, 251, 127, + 85, 240, 250, 127, 85, 240, 249, 127, 85, 240, 248, 127, 85, 240, 247, + 127, 85, 240, 246, 127, 85, 240, 245, 127, 85, 240, 244, 127, 85, 240, + 243, 127, 85, 240, 242, 127, 85, 240, 241, 127, 85, 240, 240, 127, 85, + 240, 239, 127, 85, 240, 238, 127, 85, 71, 252, 101, 127, 85, 214, 215, + 127, 85, 214, 214, 127, 85, 214, 213, 127, 85, 214, 212, 127, 85, 214, + 211, 127, 85, 214, 210, 127, 85, 214, 209, 127, 85, 214, 208, 127, 85, + 214, 207, 127, 85, 214, 206, 127, 85, 214, 205, 127, 85, 214, 204, 127, + 85, 214, 203, 127, 85, 214, 202, 127, 85, 214, 201, 127, 85, 214, 200, + 127, 85, 214, 199, 127, 85, 214, 198, 127, 85, 214, 197, 127, 85, 214, + 196, 127, 85, 214, 195, 127, 85, 214, 194, 127, 85, 214, 193, 127, 85, + 214, 192, 127, 85, 214, 191, 127, 85, 214, 190, 127, 85, 214, 189, 127, + 85, 214, 188, 127, 85, 214, 187, 127, 85, 214, 186, 127, 85, 214, 185, + 127, 85, 214, 184, 127, 85, 214, 183, 127, 85, 214, 182, 127, 85, 214, + 181, 127, 85, 214, 180, 127, 85, 214, 179, 127, 85, 214, 178, 127, 85, + 214, 177, 127, 85, 214, 176, 127, 85, 214, 175, 127, 85, 214, 174, 127, + 85, 214, 173, 127, 85, 214, 172, 127, 85, 214, 171, 127, 85, 214, 170, + 127, 85, 214, 169, 127, 85, 214, 168, 127, 85, 214, 167, 225, 165, 250, + 175, 252, 101, 225, 165, 250, 175, 254, 169, 65, 219, 203, 225, 165, 250, + 175, 117, 65, 219, 203, 225, 165, 250, 175, 133, 65, 219, 203, 225, 165, + 250, 175, 243, 237, 65, 219, 203, 225, 165, 250, 175, 244, 50, 65, 219, + 203, 225, 165, 250, 175, 220, 53, 65, 219, 203, 225, 165, 250, 175, 221, + 43, 65, 219, 203, 225, 165, 250, 175, 245, 150, 65, 219, 203, 225, 165, + 250, 175, 229, 31, 65, 219, 203, 225, 165, 250, 175, 217, 201, 65, 219, + 203, 225, 165, 250, 175, 235, 137, 65, 219, 203, 225, 165, 250, 175, 234, + 40, 65, 219, 203, 225, 165, 250, 175, 224, 160, 65, 219, 203, 225, 165, + 250, 175, 234, 88, 65, 219, 203, 225, 165, 250, 175, 254, 169, 65, 241, + 209, 225, 165, 250, 175, 117, 65, 241, 209, 225, 165, 250, 175, 133, 65, + 241, 209, 225, 165, 250, 175, 243, 237, 65, 241, 209, 225, 165, 250, 175, + 244, 50, 65, 241, 209, 225, 165, 250, 175, 220, 53, 65, 241, 209, 225, + 165, 250, 175, 221, 43, 65, 241, 209, 225, 165, 250, 175, 245, 150, 65, + 241, 209, 225, 165, 250, 175, 229, 31, 65, 241, 209, 225, 165, 250, 175, + 217, 201, 65, 241, 209, 225, 165, 250, 175, 235, 137, 65, 241, 209, 225, + 165, 250, 175, 234, 40, 65, 241, 209, 225, 165, 250, 175, 224, 160, 65, + 241, 209, 225, 165, 250, 175, 234, 88, 65, 241, 209, 225, 165, 250, 175, + 254, 169, 65, 247, 199, 225, 165, 250, 175, 117, 65, 247, 199, 225, 165, + 250, 175, 133, 65, 247, 199, 225, 165, 250, 175, 243, 237, 65, 247, 199, + 225, 165, 250, 175, 244, 50, 65, 247, 199, 225, 165, 250, 175, 220, 53, + 65, 247, 199, 225, 165, 250, 175, 221, 43, 65, 247, 199, 225, 165, 250, + 175, 245, 150, 65, 247, 199, 225, 165, 250, 175, 229, 31, 65, 247, 199, + 225, 165, 250, 175, 217, 201, 65, 247, 199, 225, 165, 250, 175, 235, 137, + 65, 247, 199, 225, 165, 250, 175, 234, 40, 65, 247, 199, 225, 165, 250, + 175, 224, 160, 65, 247, 199, 225, 165, 250, 175, 234, 88, 65, 247, 199, + 225, 165, 250, 175, 83, 235, 65, 225, 165, 250, 175, 254, 169, 65, 249, + 179, 225, 165, 250, 175, 117, 65, 249, 179, 225, 165, 250, 175, 133, 65, + 249, 179, 225, 165, 250, 175, 243, 237, 65, 249, 179, 225, 165, 250, 175, + 244, 50, 65, 249, 179, 225, 165, 250, 175, 220, 53, 65, 249, 179, 225, + 165, 250, 175, 221, 43, 65, 249, 179, 225, 165, 250, 175, 245, 150, 65, + 249, 179, 225, 165, 250, 175, 229, 31, 65, 249, 179, 225, 165, 250, 175, + 217, 201, 65, 249, 179, 225, 165, 250, 175, 235, 137, 65, 249, 179, 225, + 165, 250, 175, 234, 40, 65, 249, 179, 225, 165, 250, 175, 224, 160, 65, + 249, 179, 225, 165, 250, 175, 234, 88, 65, 249, 179, 225, 165, 250, 175, + 67, 235, 65, 21, 212, 80, 243, 200, 219, 69, 21, 212, 80, 249, 157, 21, + 122, 249, 157, 21, 117, 249, 157, 21, 133, 249, 157, 21, 243, 237, 249, + 157, 21, 244, 50, 249, 157, 21, 220, 53, 249, 157, 21, 221, 43, 249, 157, + 21, 245, 150, 249, 157, 21, 229, 31, 249, 157, 86, 7, 6, 1, 61, 86, 7, 6, + 1, 253, 74, 86, 7, 6, 1, 250, 252, 86, 7, 6, 1, 249, 3, 86, 7, 6, 1, 74, + 86, 7, 6, 1, 244, 230, 86, 7, 6, 1, 243, 177, 86, 7, 6, 1, 242, 41, 86, + 7, 6, 1, 72, 86, 7, 6, 1, 235, 142, 86, 7, 6, 1, 235, 27, 86, 7, 6, 1, + 150, 86, 7, 6, 1, 183, 86, 7, 6, 1, 204, 86, 7, 6, 1, 75, 86, 7, 6, 1, + 226, 229, 86, 7, 6, 1, 224, 240, 86, 7, 6, 1, 149, 86, 7, 6, 1, 197, 86, + 7, 6, 1, 218, 99, 86, 7, 6, 1, 69, 86, 7, 6, 1, 215, 79, 86, 7, 6, 1, + 214, 82, 86, 7, 6, 1, 213, 166, 86, 7, 6, 1, 213, 105, 86, 7, 6, 1, 212, + 152, 216, 219, 220, 233, 251, 84, 7, 6, 1, 197, 36, 32, 7, 6, 1, 250, + 252, 36, 32, 7, 6, 1, 149, 36, 250, 125, 36, 213, 168, 91, 7, 6, 1, 61, + 91, 7, 6, 1, 253, 74, 91, 7, 6, 1, 250, 252, 91, 7, 6, 1, 249, 3, 91, 7, + 6, 1, 74, 91, 7, 6, 1, 244, 230, 91, 7, 6, 1, 243, 177, 91, 7, 6, 1, 242, + 41, 91, 7, 6, 1, 72, 91, 7, 6, 1, 235, 142, 91, 7, 6, 1, 235, 27, 91, 7, + 6, 1, 150, 91, 7, 6, 1, 183, 91, 7, 6, 1, 204, 91, 7, 6, 1, 75, 91, 7, 6, + 1, 226, 229, 91, 7, 6, 1, 224, 240, 91, 7, 6, 1, 149, 91, 7, 6, 1, 197, + 91, 7, 6, 1, 218, 99, 91, 7, 6, 1, 69, 91, 7, 6, 1, 215, 79, 91, 7, 6, 1, + 214, 82, 91, 7, 6, 1, 213, 166, 91, 7, 6, 1, 213, 105, 91, 7, 6, 1, 212, + 152, 91, 240, 193, 91, 230, 120, 91, 222, 102, 91, 219, 158, 91, 225, 98, + 91, 214, 7, 146, 36, 7, 6, 1, 61, 146, 36, 7, 6, 1, 253, 74, 146, 36, 7, + 6, 1, 250, 252, 146, 36, 7, 6, 1, 249, 3, 146, 36, 7, 6, 1, 74, 146, 36, + 7, 6, 1, 244, 230, 146, 36, 7, 6, 1, 243, 177, 146, 36, 7, 6, 1, 242, 41, + 146, 36, 7, 6, 1, 72, 146, 36, 7, 6, 1, 235, 142, 146, 36, 7, 6, 1, 235, + 27, 146, 36, 7, 6, 1, 150, 146, 36, 7, 6, 1, 183, 146, 36, 7, 6, 1, 204, + 146, 36, 7, 6, 1, 75, 146, 36, 7, 6, 1, 226, 229, 146, 36, 7, 6, 1, 224, + 240, 146, 36, 7, 6, 1, 149, 146, 36, 7, 6, 1, 197, 146, 36, 7, 6, 1, 218, + 99, 146, 36, 7, 6, 1, 69, 146, 36, 7, 6, 1, 215, 79, 146, 36, 7, 6, 1, + 214, 82, 146, 36, 7, 6, 1, 213, 166, 146, 36, 7, 6, 1, 213, 105, 146, 36, + 7, 6, 1, 212, 152, 146, 91, 7, 6, 1, 61, 146, 91, 7, 6, 1, 253, 74, 146, + 91, 7, 6, 1, 250, 252, 146, 91, 7, 6, 1, 249, 3, 146, 91, 7, 6, 1, 74, + 146, 91, 7, 6, 1, 244, 230, 146, 91, 7, 6, 1, 243, 177, 146, 91, 7, 6, 1, + 242, 41, 146, 91, 7, 6, 1, 72, 146, 91, 7, 6, 1, 235, 142, 146, 91, 7, 6, + 1, 235, 27, 146, 91, 7, 6, 1, 150, 146, 91, 7, 6, 1, 183, 146, 91, 7, 6, + 1, 204, 146, 91, 7, 6, 1, 75, 146, 91, 7, 6, 1, 226, 229, 146, 91, 7, 6, + 1, 224, 240, 146, 91, 7, 6, 1, 149, 146, 91, 7, 6, 1, 197, 146, 91, 7, 6, + 1, 218, 99, 146, 91, 7, 6, 1, 69, 146, 91, 7, 6, 1, 215, 79, 146, 91, 7, + 6, 1, 214, 82, 146, 91, 7, 6, 1, 213, 166, 146, 91, 7, 6, 1, 213, 105, + 146, 91, 7, 6, 1, 212, 152, 249, 68, 146, 91, 7, 6, 1, 226, 229, 146, 91, + 240, 106, 146, 91, 193, 146, 91, 222, 202, 146, 91, 254, 185, 146, 91, + 214, 7, 41, 247, 116, 91, 249, 216, 91, 249, 109, 91, 243, 222, 91, 240, + 98, 91, 229, 168, 91, 229, 161, 91, 227, 80, 91, 219, 222, 91, 114, 2, + 244, 254, 77, 91, 214, 100, 223, 253, 235, 236, 16, 1, 61, 223, 253, 235, + 236, 16, 1, 253, 74, 223, 253, 235, 236, 16, 1, 250, 252, 223, 253, 235, + 236, 16, 1, 249, 3, 223, 253, 235, 236, 16, 1, 74, 223, 253, 235, 236, + 16, 1, 244, 230, 223, 253, 235, 236, 16, 1, 243, 177, 223, 253, 235, 236, + 16, 1, 242, 41, 223, 253, 235, 236, 16, 1, 72, 223, 253, 235, 236, 16, 1, + 235, 142, 223, 253, 235, 236, 16, 1, 235, 27, 223, 253, 235, 236, 16, 1, + 150, 223, 253, 235, 236, 16, 1, 183, 223, 253, 235, 236, 16, 1, 204, 223, + 253, 235, 236, 16, 1, 75, 223, 253, 235, 236, 16, 1, 226, 229, 223, 253, + 235, 236, 16, 1, 224, 240, 223, 253, 235, 236, 16, 1, 149, 223, 253, 235, + 236, 16, 1, 197, 223, 253, 235, 236, 16, 1, 218, 99, 223, 253, 235, 236, + 16, 1, 69, 223, 253, 235, 236, 16, 1, 215, 79, 223, 253, 235, 236, 16, 1, + 214, 82, 223, 253, 235, 236, 16, 1, 213, 166, 223, 253, 235, 236, 16, 1, + 213, 105, 223, 253, 235, 236, 16, 1, 212, 152, 41, 142, 241, 49, 91, 56, + 234, 27, 91, 56, 222, 202, 91, 9, 215, 148, 238, 43, 91, 9, 215, 148, + 238, 47, 91, 9, 215, 148, 238, 55, 91, 56, 248, 41, 91, 9, 215, 148, 238, + 62, 91, 9, 215, 148, 238, 49, 91, 9, 215, 148, 238, 21, 91, 9, 215, 148, + 238, 48, 91, 9, 215, 148, 238, 61, 91, 9, 215, 148, 238, 35, 91, 9, 215, + 148, 238, 28, 91, 9, 215, 148, 238, 37, 91, 9, 215, 148, 238, 58, 91, 9, + 215, 148, 238, 44, 91, 9, 215, 148, 238, 60, 91, 9, 215, 148, 238, 36, + 91, 9, 215, 148, 238, 59, 91, 9, 215, 148, 238, 22, 91, 9, 215, 148, 238, + 27, 91, 9, 215, 148, 238, 20, 91, 9, 215, 148, 238, 50, 91, 9, 215, 148, + 238, 52, 91, 9, 215, 148, 238, 30, 91, 9, 215, 148, 238, 41, 91, 9, 215, + 148, 238, 39, 91, 9, 215, 148, 238, 65, 91, 9, 215, 148, 238, 64, 91, 9, + 215, 148, 238, 18, 91, 9, 215, 148, 238, 45, 91, 9, 215, 148, 238, 63, + 91, 9, 215, 148, 238, 54, 91, 9, 215, 148, 238, 40, 91, 9, 215, 148, 238, + 19, 91, 9, 215, 148, 238, 42, 91, 9, 215, 148, 238, 24, 91, 9, 215, 148, + 238, 23, 91, 9, 215, 148, 238, 53, 91, 9, 215, 148, 238, 31, 91, 9, 215, + 148, 238, 33, 91, 9, 215, 148, 238, 34, 91, 9, 215, 148, 238, 26, 91, 9, + 215, 148, 238, 57, 91, 9, 215, 148, 238, 51, 216, 219, 220, 233, 251, 84, + 9, 215, 148, 238, 32, 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 64, + 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 62, 216, 219, 220, 233, + 251, 84, 9, 215, 148, 238, 46, 216, 219, 220, 233, 251, 84, 9, 215, 148, + 238, 29, 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 42, 216, 219, + 220, 233, 251, 84, 9, 215, 148, 238, 25, 216, 219, 220, 233, 251, 84, 9, + 215, 148, 238, 56, 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 38, 36, + 143, 254, 150, 36, 143, 254, 172, 249, 14, 244, 11, 249, 193, 215, 164, + 229, 44, 2, 219, 92, 218, 233, 110, 230, 184, 218, 232, 249, 219, 253, + 123, 246, 9, 218, 231, 110, 251, 47, 224, 49, 251, 68, 253, 123, 229, 43, + 214, 25, 214, 19, 214, 112, 231, 8, 214, 9, 245, 180, 242, 157, 245, 12, + 245, 180, 242, 157, 254, 37, 245, 180, 242, 157, 253, 140, 242, 157, 2, + 231, 115, 156, 230, 199, 87, 214, 11, 249, 77, 230, 199, 87, 244, 61, + 224, 167, 230, 199, 87, 214, 11, 242, 186, 230, 199, 87, 243, 200, 230, + 199, 87, 214, 36, 242, 186, 230, 199, 87, 233, 103, 224, 167, 230, 199, + 87, 214, 36, 249, 77, 230, 199, 87, 249, 77, 230, 198, 156, 230, 199, 2, + 244, 158, 244, 61, 224, 167, 230, 199, 2, 244, 158, 233, 103, 224, 167, + 230, 199, 2, 244, 158, 243, 200, 230, 199, 2, 244, 158, 218, 239, 2, 244, + 158, 242, 155, 219, 95, 220, 179, 219, 95, 250, 53, 222, 87, 245, 6, 216, + 193, 248, 35, 216, 193, 226, 186, 216, 193, 250, 213, 216, 73, 250, 55, + 251, 133, 223, 93, 241, 164, 218, 236, 251, 133, 245, 184, 65, 232, 0, + 245, 184, 65, 223, 184, 241, 188, 243, 237, 233, 78, 249, 183, 231, 233, + 233, 77, 244, 144, 233, 77, 233, 78, 244, 16, 235, 252, 213, 224, 230, + 128, 216, 245, 253, 107, 242, 119, 231, 131, 214, 23, 218, 8, 233, 50, + 252, 68, 225, 194, 224, 4, 253, 223, 242, 104, 253, 223, 226, 92, 226, + 93, 250, 56, 219, 54, 242, 6, 220, 18, 65, 225, 176, 231, 152, 227, 63, + 251, 119, 225, 109, 233, 60, 223, 185, 249, 82, 223, 185, 252, 78, 249, + 112, 223, 184, 249, 36, 24, 223, 184, 219, 81, 251, 93, 219, 202, 251, + 78, 243, 221, 243, 217, 223, 108, 218, 191, 225, 111, 248, 120, 227, 101, + 218, 208, 243, 218, 220, 155, 244, 60, 250, 209, 2, 218, 184, 247, 242, + 219, 236, 240, 105, 249, 81, 220, 250, 240, 104, 240, 105, 249, 81, 246, + 62, 249, 111, 250, 21, 134, 250, 186, 232, 194, 249, 30, 241, 41, 225, + 113, 220, 164, 251, 213, 251, 89, 225, 114, 65, 244, 2, 249, 110, 243, + 249, 24, 234, 41, 217, 227, 213, 216, 241, 252, 222, 183, 251, 103, 24, + 249, 43, 213, 222, 242, 160, 249, 172, 242, 160, 216, 151, 246, 45, 251, + 238, 230, 163, 249, 200, 251, 238, 230, 162, 252, 104, 251, 102, 223, + 186, 213, 189, 225, 75, 251, 158, 250, 208, 235, 136, 250, 14, 216, 193, + 244, 130, 250, 13, 244, 63, 244, 64, 219, 200, 252, 77, 226, 122, 225, + 124, 249, 143, 252, 78, 218, 10, 216, 193, 249, 68, 244, 36, 225, 195, + 248, 32, 235, 131, 247, 85, 250, 164, 219, 53, 213, 225, 250, 35, 230, + 199, 214, 144, 250, 96, 222, 117, 222, 141, 242, 124, 250, 183, 250, 165, + 240, 232, 244, 99, 213, 241, 223, 102, 249, 173, 244, 55, 225, 136, 24, + 244, 59, 231, 40, 230, 178, 250, 198, 249, 232, 241, 216, 253, 156, 226, + 189, 216, 227, 241, 234, 249, 222, 217, 195, 217, 67, 249, 213, 251, 125, + 226, 52, 253, 155, 214, 150, 243, 86, 247, 149, 241, 142, 220, 12, 232, + 39, 251, 168, 243, 87, 247, 192, 251, 92, 244, 21, 225, 165, 250, 173, + 27, 228, 158, 230, 155, 27, 228, 153, 222, 130, 242, 80, 27, 234, 143, + 216, 148, 214, 135, 27, 222, 111, 223, 35, 220, 191, 2, 222, 143, 217, + 197, 224, 68, 24, 252, 78, 220, 33, 24, 220, 33, 251, 112, 252, 43, 24, + 241, 36, 250, 57, 244, 42, 219, 247, 223, 36, 218, 212, 216, 152, 240, + 233, 224, 69, 254, 38, 244, 0, 223, 47, 244, 0, 218, 186, 240, 222, 251, + 48, 240, 222, 2, 243, 70, 227, 95, 251, 48, 235, 131, 225, 119, 227, 94, + 245, 11, 225, 119, 227, 94, 240, 231, 252, 64, 253, 97, 217, 205, 232, + 39, 240, 227, 232, 166, 240, 227, 249, 115, 219, 65, 222, 116, 247, 250, + 219, 65, 244, 148, 235, 147, 233, 113, 235, 131, 250, 158, 245, 11, 250, + 158, 224, 33, 230, 182, 226, 238, 214, 25, 251, 52, 249, 84, 217, 60, + 233, 42, 224, 70, 250, 156, 246, 50, 249, 75, 213, 244, 219, 254, 219, + 252, 240, 232, 224, 45, 242, 146, 220, 237, 230, 215, 223, 96, 250, 45, + 247, 90, 225, 205, 251, 126, 245, 126, 227, 103, 219, 184, 220, 232, 251, + 51, 254, 3, 241, 40, 233, 144, 251, 236, 244, 59, 216, 151, 244, 59, 251, + 132, 216, 55, 241, 232, 250, 46, 252, 104, 250, 46, 243, 212, 252, 104, + 250, 46, 251, 160, 226, 70, 234, 35, 225, 128, 246, 42, 250, 199, 252, + 95, 250, 199, 247, 84, 230, 183, 244, 158, 249, 85, 244, 158, 217, 61, + 244, 158, 224, 71, 244, 158, 250, 157, 244, 158, 246, 51, 244, 158, 219, + 173, 213, 244, 240, 233, 244, 158, 230, 216, 244, 158, 247, 91, 244, 158, + 225, 206, 244, 158, 243, 215, 244, 158, 242, 3, 244, 158, 213, 211, 244, + 158, 251, 247, 244, 158, 226, 172, 244, 158, 225, 206, 228, 164, 226, + 106, 225, 67, 244, 237, 245, 183, 228, 164, 230, 180, 216, 232, 67, 114, + 225, 141, 252, 99, 235, 239, 67, 119, 225, 141, 252, 99, 235, 239, 67, + 42, 225, 141, 252, 99, 235, 239, 67, 46, 225, 141, 252, 99, 235, 239, + 244, 53, 241, 255, 52, 214, 17, 241, 255, 52, 227, 81, 241, 255, 52, 217, + 89, 114, 52, 217, 89, 119, 52, 249, 212, 241, 250, 52, 227, 40, 241, 250, + 52, 249, 63, 213, 207, 241, 234, 244, 238, 229, 185, 218, 98, 235, 126, + 246, 47, 234, 91, 251, 170, 213, 207, 249, 186, 225, 14, 241, 253, 225, + 110, 231, 240, 220, 184, 253, 119, 220, 184, 241, 150, 220, 184, 213, + 207, 222, 156, 213, 207, 251, 111, 243, 254, 251, 19, 235, 252, 220, 95, + 251, 18, 235, 252, 220, 95, 251, 88, 242, 170, 231, 248, 213, 208, 244, + 142, 231, 249, 24, 213, 209, 241, 46, 241, 249, 117, 231, 123, 241, 46, + 241, 249, 117, 213, 206, 241, 46, 241, 249, 225, 133, 227, 93, 213, 209, + 2, 251, 35, 245, 181, 251, 69, 2, 214, 223, 226, 44, 2, 251, 135, 242, + 16, 231, 249, 2, 242, 89, 225, 241, 231, 237, 231, 249, 2, 216, 61, 227, + 74, 231, 248, 227, 74, 213, 208, 252, 103, 249, 129, 213, 192, 225, 70, + 235, 131, 227, 89, 235, 131, 242, 145, 242, 198, 252, 104, 254, 22, 244, + 242, 254, 69, 254, 70, 230, 206, 236, 1, 220, 28, 235, 229, 247, 241, + 226, 43, 242, 86, 248, 124, 232, 230, 230, 30, 225, 132, 244, 159, 231, + 205, 242, 15, 252, 58, 225, 135, 218, 117, 225, 198, 234, 73, 77, 232, + 166, 233, 34, 223, 130, 243, 30, 219, 71, 234, 72, 251, 97, 249, 87, 2, + 241, 211, 214, 3, 251, 245, 241, 211, 251, 63, 241, 211, 117, 241, 209, + 219, 198, 241, 211, 242, 98, 241, 211, 241, 212, 2, 68, 251, 131, 241, + 211, 242, 104, 241, 211, 213, 33, 241, 211, 225, 15, 241, 211, 241, 212, + 2, 223, 186, 223, 197, 241, 209, 241, 212, 248, 32, 247, 201, 221, 5, 2, + 118, 62, 235, 212, 245, 129, 177, 251, 45, 254, 21, 87, 251, 120, 220, + 20, 87, 249, 166, 87, 219, 178, 218, 193, 87, 246, 40, 248, 102, 87, 225, + 199, 65, 225, 129, 244, 30, 251, 181, 247, 117, 87, 219, 191, 252, 77, + 217, 102, 252, 77, 67, 244, 20, 240, 201, 225, 139, 87, 230, 219, 252, + 90, 249, 39, 244, 255, 107, 247, 86, 52, 249, 79, 250, 174, 252, 63, 2, + 213, 31, 52, 252, 63, 2, 247, 86, 52, 252, 63, 2, 245, 14, 52, 252, 63, + 2, 225, 108, 52, 230, 219, 2, 213, 220, 250, 74, 2, 215, 124, 216, 189, + 24, 213, 31, 52, 222, 97, 226, 42, 249, 147, 251, 67, 230, 255, 244, 25, + 247, 137, 227, 27, 247, 142, 246, 4, 244, 76, 244, 9, 227, 40, 244, 76, + 244, 9, 226, 201, 2, 249, 41, 226, 201, 244, 151, 215, 134, 250, 204, + 217, 226, 250, 204, 250, 175, 235, 239, 250, 74, 2, 215, 124, 216, 188, + 250, 74, 2, 246, 58, 216, 188, 252, 60, 250, 73, 249, 199, 225, 10, 223, + 87, 225, 10, 226, 147, 219, 61, 223, 42, 216, 180, 223, 42, 251, 116, + 218, 39, 233, 75, 228, 156, 228, 157, 2, 248, 31, 249, 86, 249, 193, 251, + 117, 227, 40, 251, 117, 242, 104, 251, 117, 251, 131, 251, 117, 227, 23, + 251, 117, 251, 114, 230, 25, 252, 93, 222, 105, 231, 124, 217, 210, 224, + 16, 226, 199, 244, 127, 232, 39, 222, 140, 254, 0, 225, 31, 254, 157, + 232, 168, 250, 63, 231, 136, 226, 253, 216, 196, 235, 248, 216, 196, 226, + 206, 245, 236, 87, 235, 245, 245, 78, 245, 79, 2, 246, 58, 76, 49, 249, + 193, 232, 6, 2, 232, 162, 244, 42, 249, 193, 232, 6, 2, 224, 48, 244, 42, + 227, 40, 232, 6, 2, 224, 48, 244, 42, 227, 40, 232, 6, 2, 232, 162, 244, + 42, 225, 116, 225, 117, 240, 235, 229, 166, 230, 229, 225, 249, 230, 229, + 225, 250, 2, 95, 76, 253, 123, 233, 70, 214, 153, 230, 228, 230, 229, + 225, 250, 227, 96, 228, 186, 230, 229, 225, 248, 254, 1, 2, 252, 49, 250, + 198, 214, 150, 250, 198, 217, 207, 224, 63, 214, 149, 216, 25, 95, 253, + 162, 249, 195, 95, 24, 132, 227, 40, 249, 229, 253, 162, 249, 195, 95, + 24, 132, 227, 40, 249, 229, 253, 163, 2, 36, 122, 226, 244, 249, 195, + 246, 58, 24, 215, 124, 227, 40, 249, 229, 253, 162, 253, 255, 246, 58, + 24, 215, 124, 227, 40, 249, 229, 253, 162, 115, 251, 66, 87, 124, 251, + 66, 87, 219, 195, 2, 250, 192, 90, 219, 194, 219, 195, 2, 122, 219, 218, + 214, 19, 219, 195, 2, 133, 219, 218, 214, 18, 252, 35, 245, 129, 225, + 161, 233, 66, 232, 16, 242, 160, 223, 144, 232, 16, 242, 160, 232, 204, + 2, 235, 222, 226, 74, 249, 193, 232, 204, 2, 234, 144, 234, 144, 232, + 203, 227, 40, 232, 203, 251, 221, 251, 222, 2, 250, 192, 90, 251, 115, + 232, 233, 87, 224, 64, 251, 15, 252, 102, 2, 132, 76, 49, 245, 101, 2, + 132, 76, 49, 227, 63, 2, 244, 254, 152, 2, 42, 46, 76, 49, 219, 225, 2, + 95, 76, 49, 216, 227, 2, 215, 124, 76, 49, 228, 186, 122, 215, 154, 245, + 148, 87, 234, 142, 217, 200, 235, 216, 16, 31, 7, 6, 233, 33, 235, 216, + 16, 31, 7, 3, 233, 33, 235, 216, 16, 31, 228, 55, 235, 216, 16, 31, 218, + 128, 235, 216, 16, 31, 7, 233, 33, 244, 65, 245, 129, 216, 222, 213, 187, + 242, 4, 228, 38, 24, 251, 121, 241, 52, 225, 182, 231, 39, 217, 208, 249, + 54, 252, 78, 220, 53, 225, 143, 219, 96, 2, 231, 37, 247, 74, 235, 131, + 16, 31, 251, 233, 216, 178, 245, 114, 83, 41, 251, 15, 67, 41, 251, 15, + 233, 108, 224, 4, 249, 228, 233, 108, 251, 131, 249, 228, 233, 108, 227, + 23, 247, 200, 233, 108, 251, 131, 247, 200, 3, 227, 23, 247, 200, 3, 251, + 131, 247, 200, 215, 133, 224, 4, 216, 183, 246, 59, 224, 4, 216, 183, + 215, 133, 3, 224, 4, 216, 183, 246, 59, 3, 224, 4, 216, 183, 249, 197, + 244, 159, 122, 227, 106, 249, 197, 244, 159, 117, 227, 106, 249, 197, + 244, 159, 133, 227, 106, 249, 197, 244, 159, 243, 237, 227, 106, 249, + 197, 244, 159, 244, 50, 227, 106, 249, 197, 244, 159, 220, 53, 227, 106, + 249, 197, 244, 159, 221, 43, 227, 106, 249, 197, 244, 159, 245, 150, 227, + 106, 249, 197, 244, 159, 229, 31, 227, 106, 249, 197, 244, 159, 217, 201, + 227, 106, 249, 197, 244, 159, 245, 125, 227, 106, 249, 197, 244, 159, + 216, 42, 227, 106, 249, 197, 244, 159, 227, 58, 249, 197, 244, 159, 216, + 22, 249, 197, 244, 159, 217, 94, 249, 197, 244, 159, 243, 233, 249, 197, + 244, 159, 244, 48, 249, 197, 244, 159, 220, 49, 249, 197, 244, 159, 221, + 42, 249, 197, 244, 159, 245, 149, 249, 197, 244, 159, 229, 30, 249, 197, + 244, 159, 217, 199, 249, 197, 244, 159, 245, 123, 249, 197, 244, 159, + 216, 40, 230, 187, 243, 201, 216, 247, 216, 215, 219, 88, 65, 233, 11, + 220, 96, 65, 235, 132, 230, 176, 242, 102, 244, 159, 2, 220, 2, 244, 237, + 244, 159, 2, 217, 222, 65, 235, 56, 220, 2, 244, 159, 2, 227, 40, 230, + 180, 220, 2, 244, 159, 2, 227, 40, 230, 181, 24, 220, 2, 244, 237, 220, + 2, 244, 159, 2, 227, 40, 230, 181, 24, 249, 168, 218, 192, 220, 2, 244, + 159, 2, 227, 40, 230, 181, 24, 217, 58, 244, 237, 220, 2, 244, 159, 2, + 242, 8, 220, 2, 244, 159, 2, 240, 234, 213, 218, 244, 158, 220, 2, 244, + 159, 2, 220, 2, 244, 237, 244, 159, 222, 135, 248, 13, 244, 2, 223, 238, + 244, 158, 220, 2, 244, 159, 2, 241, 210, 244, 237, 220, 2, 244, 159, 2, + 218, 234, 220, 1, 244, 158, 229, 169, 244, 158, 215, 158, 244, 158, 244, + 159, 2, 249, 168, 218, 192, 226, 67, 244, 158, 249, 141, 244, 158, 244, + 159, 217, 91, 118, 234, 72, 234, 71, 244, 159, 2, 249, 193, 244, 237, + 244, 159, 2, 219, 31, 216, 233, 24, 213, 218, 244, 239, 244, 159, 2, 219, + 31, 216, 233, 24, 217, 58, 244, 237, 247, 144, 244, 158, 254, 17, 244, + 158, 225, 107, 244, 158, 249, 56, 244, 158, 226, 46, 244, 158, 244, 159, + 2, 232, 179, 65, 216, 162, 247, 144, 251, 17, 223, 238, 244, 158, 244, + 121, 244, 158, 214, 4, 244, 158, 220, 19, 244, 158, 217, 24, 244, 158, + 232, 169, 249, 56, 244, 158, 244, 159, 2, 227, 40, 230, 181, 24, 249, + 168, 218, 192, 244, 159, 222, 109, 235, 252, 244, 122, 253, 129, 244, + 158, 244, 18, 244, 158, 247, 117, 244, 158, 244, 159, 213, 216, 230, 180, + 244, 159, 2, 231, 149, 231, 207, 242, 102, 250, 157, 244, 159, 2, 220, 2, + 244, 237, 250, 157, 244, 159, 2, 217, 222, 65, 235, 56, 220, 2, 250, 157, + 244, 159, 2, 227, 40, 230, 180, 220, 2, 250, 157, 244, 159, 2, 241, 210, + 244, 237, 250, 157, 244, 159, 2, 213, 184, 220, 3, 234, 71, 250, 157, + 244, 159, 2, 249, 193, 244, 237, 225, 107, 250, 157, 244, 158, 249, 56, + 250, 157, 244, 158, 214, 4, 250, 157, 244, 158, 244, 159, 2, 228, 186, + 242, 139, 243, 10, 244, 159, 2, 227, 81, 243, 10, 226, 44, 251, 94, 248, + 26, 222, 88, 230, 215, 241, 213, 230, 215, 219, 196, 230, 215, 241, 244, + 226, 44, 224, 47, 122, 241, 254, 226, 44, 224, 47, 251, 104, 241, 250, + 235, 252, 250, 113, 226, 44, 243, 208, 226, 44, 2, 225, 107, 244, 158, + 226, 44, 2, 244, 10, 241, 249, 223, 104, 241, 198, 219, 83, 232, 202, + 224, 53, 250, 176, 241, 148, 216, 205, 241, 148, 216, 206, 2, 251, 43, + 228, 164, 216, 205, 231, 99, 177, 224, 54, 219, 89, 216, 203, 216, 204, + 250, 176, 251, 21, 227, 60, 251, 21, 216, 159, 251, 22, 219, 69, 231, 0, + 254, 39, 244, 66, 245, 95, 225, 133, 250, 176, 227, 60, 225, 133, 250, + 176, 217, 239, 227, 60, 217, 239, 253, 96, 227, 60, 253, 96, 224, 11, + 214, 224, 248, 9, 216, 150, 253, 157, 232, 172, 216, 211, 230, 209, 230, + 186, 224, 52, 218, 207, 224, 52, 230, 186, 250, 214, 254, 134, 216, 202, + 220, 196, 223, 84, 219, 189, 199, 216, 209, 233, 2, 71, 216, 209, 233, 2, + 249, 129, 52, 225, 133, 250, 161, 223, 197, 233, 2, 216, 180, 244, 43, + 227, 63, 225, 118, 247, 77, 228, 186, 245, 84, 52, 220, 0, 87, 228, 186, + 220, 0, 87, 225, 9, 232, 222, 235, 252, 235, 155, 225, 173, 87, 247, 100, + 228, 163, 232, 222, 87, 225, 112, 214, 25, 87, 228, 177, 214, 25, 87, + 251, 180, 228, 186, 251, 179, 251, 178, 230, 186, 251, 178, 226, 88, 228, + 186, 226, 87, 250, 37, 249, 64, 231, 120, 87, 213, 205, 87, 223, 211, + 252, 104, 87, 216, 248, 214, 25, 249, 190, 220, 158, 252, 38, 252, 36, + 226, 115, 249, 116, 249, 28, 252, 87, 249, 215, 42, 232, 148, 104, 16, + 31, 224, 148, 104, 16, 31, 254, 100, 104, 16, 31, 244, 65, 104, 16, 31, + 245, 179, 104, 16, 31, 214, 24, 104, 16, 31, 253, 213, 104, 16, 31, 253, + 214, 223, 255, 104, 16, 31, 253, 214, 223, 254, 104, 16, 31, 253, 214, + 214, 124, 104, 16, 31, 253, 214, 214, 123, 104, 16, 31, 214, 138, 104, + 16, 31, 214, 137, 104, 16, 31, 214, 136, 104, 16, 31, 218, 245, 104, 16, + 31, 226, 1, 218, 245, 104, 16, 31, 83, 218, 245, 104, 16, 31, 231, 119, + 219, 16, 104, 16, 31, 231, 119, 219, 15, 104, 16, 31, 231, 119, 219, 14, + 104, 16, 31, 249, 231, 104, 16, 31, 222, 172, 104, 16, 31, 229, 19, 104, + 16, 31, 214, 122, 104, 16, 31, 214, 121, 104, 16, 31, 223, 105, 222, 172, + 104, 16, 31, 223, 105, 222, 171, 104, 16, 31, 242, 142, 104, 16, 31, 220, + 92, 104, 16, 31, 235, 175, 227, 20, 104, 16, 31, 235, 175, 227, 19, 104, + 16, 31, 249, 74, 65, 235, 174, 104, 16, 31, 223, 251, 65, 235, 174, 104, + 16, 31, 249, 107, 227, 20, 104, 16, 31, 235, 173, 227, 20, 104, 16, 31, + 219, 17, 65, 249, 106, 104, 16, 31, 249, 74, 65, 249, 106, 104, 16, 31, + 249, 74, 65, 249, 105, 104, 16, 31, 249, 107, 253, 250, 104, 16, 31, 222, + 173, 65, 249, 107, 253, 250, 104, 16, 31, 219, 17, 65, 222, 173, 65, 249, + 106, 104, 16, 31, 214, 220, 104, 16, 31, 217, 37, 227, 20, 104, 16, 31, + 233, 81, 227, 20, 104, 16, 31, 253, 249, 227, 20, 104, 16, 31, 219, 17, + 65, 253, 248, 104, 16, 31, 222, 173, 65, 253, 248, 104, 16, 31, 219, 17, + 65, 222, 173, 65, 253, 248, 104, 16, 31, 214, 139, 65, 253, 248, 104, 16, + 31, 223, 251, 65, 253, 248, 104, 16, 31, 223, 251, 65, 253, 247, 104, 16, + 31, 223, 250, 104, 16, 31, 223, 249, 104, 16, 31, 223, 248, 104, 16, 31, + 223, 247, 104, 16, 31, 254, 66, 104, 16, 31, 254, 65, 104, 16, 31, 231, + 226, 104, 16, 31, 222, 178, 104, 16, 31, 253, 161, 104, 16, 31, 224, 18, + 104, 16, 31, 224, 17, 104, 16, 31, 253, 99, 104, 16, 31, 251, 152, 227, + 20, 104, 16, 31, 218, 0, 104, 16, 31, 217, 255, 104, 16, 31, 224, 153, + 232, 251, 104, 16, 31, 251, 109, 104, 16, 31, 251, 108, 104, 16, 31, 251, + 107, 104, 16, 31, 254, 47, 104, 16, 31, 227, 84, 104, 16, 31, 219, 180, + 104, 16, 31, 217, 35, 104, 16, 31, 242, 77, 104, 16, 31, 214, 12, 104, + 16, 31, 225, 106, 104, 16, 31, 250, 202, 104, 16, 31, 216, 50, 104, 16, + 31, 250, 178, 230, 192, 104, 16, 31, 222, 120, 65, 235, 58, 104, 16, 31, + 250, 211, 104, 16, 31, 216, 177, 104, 16, 31, 219, 93, 216, 177, 104, 16, + 31, 232, 201, 104, 16, 31, 219, 240, 104, 16, 31, 215, 113, 104, 16, 31, + 240, 233, 246, 19, 104, 16, 31, 253, 142, 104, 16, 31, 225, 114, 253, + 142, 104, 16, 31, 251, 70, 104, 16, 31, 225, 105, 251, 70, 104, 16, 31, + 254, 44, 104, 16, 31, 219, 57, 218, 226, 219, 56, 104, 16, 31, 219, 57, + 218, 226, 219, 55, 104, 16, 31, 219, 13, 104, 16, 31, 225, 80, 104, 16, + 31, 247, 133, 104, 16, 31, 247, 135, 104, 16, 31, 247, 134, 104, 16, 31, + 225, 17, 104, 16, 31, 225, 7, 104, 16, 31, 249, 62, 104, 16, 31, 249, 61, + 104, 16, 31, 249, 60, 104, 16, 31, 249, 59, 104, 16, 31, 249, 58, 104, + 16, 31, 254, 77, 104, 16, 31, 252, 39, 65, 231, 212, 104, 16, 31, 252, + 39, 65, 214, 249, 104, 16, 31, 223, 209, 104, 16, 31, 240, 225, 104, 16, + 31, 229, 43, 104, 16, 31, 248, 91, 104, 16, 31, 230, 204, 104, 16, 31, + 151, 246, 49, 104, 16, 31, 151, 227, 0, 9, 13, 240, 95, 9, 13, 240, 94, + 9, 13, 240, 93, 9, 13, 240, 92, 9, 13, 240, 91, 9, 13, 240, 90, 9, 13, + 240, 89, 9, 13, 240, 88, 9, 13, 240, 87, 9, 13, 240, 86, 9, 13, 240, 85, + 9, 13, 240, 84, 9, 13, 240, 83, 9, 13, 240, 82, 9, 13, 240, 81, 9, 13, + 240, 80, 9, 13, 240, 79, 9, 13, 240, 78, 9, 13, 240, 77, 9, 13, 240, 76, + 9, 13, 240, 75, 9, 13, 240, 74, 9, 13, 240, 73, 9, 13, 240, 72, 9, 13, + 240, 71, 9, 13, 240, 70, 9, 13, 240, 69, 9, 13, 240, 68, 9, 13, 240, 67, + 9, 13, 240, 66, 9, 13, 240, 65, 9, 13, 240, 64, 9, 13, 240, 63, 9, 13, + 240, 62, 9, 13, 240, 61, 9, 13, 240, 60, 9, 13, 240, 59, 9, 13, 240, 58, + 9, 13, 240, 57, 9, 13, 240, 56, 9, 13, 240, 55, 9, 13, 240, 54, 9, 13, + 240, 53, 9, 13, 240, 52, 9, 13, 240, 51, 9, 13, 240, 50, 9, 13, 240, 49, + 9, 13, 240, 48, 9, 13, 240, 47, 9, 13, 240, 46, 9, 13, 240, 45, 9, 13, + 240, 44, 9, 13, 240, 43, 9, 13, 240, 42, 9, 13, 240, 41, 9, 13, 240, 40, + 9, 13, 240, 39, 9, 13, 240, 38, 9, 13, 240, 37, 9, 13, 240, 36, 9, 13, + 240, 35, 9, 13, 240, 34, 9, 13, 240, 33, 9, 13, 240, 32, 9, 13, 240, 31, + 9, 13, 240, 30, 9, 13, 240, 29, 9, 13, 240, 28, 9, 13, 240, 27, 9, 13, + 240, 26, 9, 13, 240, 25, 9, 13, 240, 24, 9, 13, 240, 23, 9, 13, 240, 22, + 9, 13, 240, 21, 9, 13, 240, 20, 9, 13, 240, 19, 9, 13, 240, 18, 9, 13, + 240, 17, 9, 13, 240, 16, 9, 13, 240, 15, 9, 13, 240, 14, 9, 13, 240, 13, + 9, 13, 240, 12, 9, 13, 240, 11, 9, 13, 240, 10, 9, 13, 240, 9, 9, 13, + 240, 8, 9, 13, 240, 7, 9, 13, 240, 6, 9, 13, 240, 5, 9, 13, 240, 4, 9, + 13, 240, 3, 9, 13, 240, 2, 9, 13, 240, 1, 9, 13, 240, 0, 9, 13, 239, 255, + 9, 13, 239, 254, 9, 13, 239, 253, 9, 13, 239, 252, 9, 13, 239, 251, 9, + 13, 239, 250, 9, 13, 239, 249, 9, 13, 239, 248, 9, 13, 239, 247, 9, 13, + 239, 246, 9, 13, 239, 245, 9, 13, 239, 244, 9, 13, 239, 243, 9, 13, 239, + 242, 9, 13, 239, 241, 9, 13, 239, 240, 9, 13, 239, 239, 9, 13, 239, 238, + 9, 13, 239, 237, 9, 13, 239, 236, 9, 13, 239, 235, 9, 13, 239, 234, 9, + 13, 239, 233, 9, 13, 239, 232, 9, 13, 239, 231, 9, 13, 239, 230, 9, 13, + 239, 229, 9, 13, 239, 228, 9, 13, 239, 227, 9, 13, 239, 226, 9, 13, 239, + 225, 9, 13, 239, 224, 9, 13, 239, 223, 9, 13, 239, 222, 9, 13, 239, 221, + 9, 13, 239, 220, 9, 13, 239, 219, 9, 13, 239, 218, 9, 13, 239, 217, 9, + 13, 239, 216, 9, 13, 239, 215, 9, 13, 239, 214, 9, 13, 239, 213, 9, 13, + 239, 212, 9, 13, 239, 211, 9, 13, 239, 210, 9, 13, 239, 209, 9, 13, 239, + 208, 9, 13, 239, 207, 9, 13, 239, 206, 9, 13, 239, 205, 9, 13, 239, 204, + 9, 13, 239, 203, 9, 13, 239, 202, 9, 13, 239, 201, 9, 13, 239, 200, 9, + 13, 239, 199, 9, 13, 239, 198, 9, 13, 239, 197, 9, 13, 239, 196, 9, 13, + 239, 195, 9, 13, 239, 194, 9, 13, 239, 193, 9, 13, 239, 192, 9, 13, 239, + 191, 9, 13, 239, 190, 9, 13, 239, 189, 9, 13, 239, 188, 9, 13, 239, 187, + 9, 13, 239, 186, 9, 13, 239, 185, 9, 13, 239, 184, 9, 13, 239, 183, 9, + 13, 239, 182, 9, 13, 239, 181, 9, 13, 239, 180, 9, 13, 239, 179, 9, 13, + 239, 178, 9, 13, 239, 177, 9, 13, 239, 176, 9, 13, 239, 175, 9, 13, 239, + 174, 9, 13, 239, 173, 9, 13, 239, 172, 9, 13, 239, 171, 9, 13, 239, 170, + 9, 13, 239, 169, 9, 13, 239, 168, 9, 13, 239, 167, 9, 13, 239, 166, 9, + 13, 239, 165, 9, 13, 239, 164, 9, 13, 239, 163, 9, 13, 239, 162, 9, 13, + 239, 161, 9, 13, 239, 160, 9, 13, 239, 159, 9, 13, 239, 158, 9, 13, 239, + 157, 9, 13, 239, 156, 9, 13, 239, 155, 9, 13, 239, 154, 9, 13, 239, 153, + 9, 13, 239, 152, 9, 13, 239, 151, 9, 13, 239, 150, 9, 13, 239, 149, 9, + 13, 239, 148, 9, 13, 239, 147, 9, 13, 239, 146, 9, 13, 239, 145, 9, 13, + 239, 144, 9, 13, 239, 143, 9, 13, 239, 142, 9, 13, 239, 141, 9, 13, 239, + 140, 9, 13, 239, 139, 9, 13, 239, 138, 9, 13, 239, 137, 9, 13, 239, 136, + 9, 13, 239, 135, 9, 13, 239, 134, 9, 13, 239, 133, 9, 13, 239, 132, 9, + 13, 239, 131, 9, 13, 239, 130, 9, 13, 239, 129, 9, 13, 239, 128, 9, 13, + 239, 127, 9, 13, 239, 126, 9, 13, 239, 125, 9, 13, 239, 124, 9, 13, 239, + 123, 9, 13, 239, 122, 9, 13, 239, 121, 9, 13, 239, 120, 9, 13, 239, 119, + 9, 13, 239, 118, 9, 13, 239, 117, 9, 13, 239, 116, 9, 13, 239, 115, 9, + 13, 239, 114, 9, 13, 239, 113, 9, 13, 239, 112, 9, 13, 239, 111, 9, 13, + 239, 110, 9, 13, 239, 109, 9, 13, 239, 108, 9, 13, 239, 107, 9, 13, 239, + 106, 9, 13, 239, 105, 9, 13, 239, 104, 9, 13, 239, 103, 9, 13, 239, 102, + 9, 13, 239, 101, 9, 13, 239, 100, 9, 13, 239, 99, 9, 13, 239, 98, 9, 13, + 239, 97, 9, 13, 239, 96, 9, 13, 239, 95, 9, 13, 239, 94, 9, 13, 239, 93, + 9, 13, 239, 92, 9, 13, 239, 91, 9, 13, 239, 90, 9, 13, 239, 89, 9, 13, + 239, 88, 9, 13, 239, 87, 9, 13, 239, 86, 9, 13, 239, 85, 9, 13, 239, 84, + 9, 13, 239, 83, 9, 13, 239, 82, 9, 13, 239, 81, 9, 13, 239, 80, 9, 13, + 239, 79, 9, 13, 239, 78, 9, 13, 239, 77, 9, 13, 239, 76, 9, 13, 239, 75, + 9, 13, 239, 74, 9, 13, 239, 73, 9, 13, 239, 72, 9, 13, 239, 71, 9, 13, + 239, 70, 9, 13, 239, 69, 9, 13, 239, 68, 9, 13, 239, 67, 9, 13, 239, 66, + 9, 13, 239, 65, 9, 13, 239, 64, 9, 13, 239, 63, 9, 13, 239, 62, 9, 13, + 239, 61, 9, 13, 239, 60, 9, 13, 239, 59, 9, 13, 239, 58, 9, 13, 239, 57, + 9, 13, 239, 56, 9, 13, 239, 55, 9, 13, 239, 54, 9, 13, 239, 53, 9, 13, + 239, 52, 9, 13, 239, 51, 9, 13, 239, 50, 9, 13, 239, 49, 9, 13, 239, 48, + 9, 13, 239, 47, 9, 13, 239, 46, 9, 13, 239, 45, 9, 13, 239, 44, 9, 13, + 239, 43, 9, 13, 239, 42, 9, 13, 239, 41, 9, 13, 239, 40, 9, 13, 239, 39, + 9, 13, 239, 38, 9, 13, 239, 37, 9, 13, 239, 36, 9, 13, 239, 35, 9, 13, + 239, 34, 9, 13, 239, 33, 9, 13, 239, 32, 9, 13, 239, 31, 9, 13, 239, 30, + 9, 13, 239, 29, 9, 13, 239, 28, 9, 13, 239, 27, 9, 13, 239, 26, 9, 13, + 239, 25, 9, 13, 239, 24, 9, 13, 239, 23, 9, 13, 239, 22, 9, 13, 239, 21, + 9, 13, 239, 20, 9, 13, 239, 19, 9, 13, 239, 18, 9, 13, 239, 17, 9, 13, + 239, 16, 9, 13, 239, 15, 9, 13, 239, 14, 9, 13, 239, 13, 9, 13, 239, 12, + 9, 13, 239, 11, 9, 13, 239, 10, 9, 13, 239, 9, 9, 13, 239, 8, 9, 13, 239, + 7, 9, 13, 239, 6, 9, 13, 239, 5, 9, 13, 239, 4, 9, 13, 239, 3, 9, 13, + 239, 2, 9, 13, 239, 1, 9, 13, 239, 0, 9, 13, 238, 255, 9, 13, 238, 254, + 9, 13, 238, 253, 9, 13, 238, 252, 9, 13, 238, 251, 9, 13, 238, 250, 9, + 13, 238, 249, 9, 13, 238, 248, 9, 13, 238, 247, 9, 13, 238, 246, 9, 13, + 238, 245, 9, 13, 238, 244, 9, 13, 238, 243, 9, 13, 238, 242, 9, 13, 238, + 241, 9, 13, 238, 240, 9, 13, 238, 239, 9, 13, 238, 238, 9, 13, 238, 237, + 9, 13, 238, 236, 9, 13, 238, 235, 9, 13, 238, 234, 9, 13, 238, 233, 9, + 13, 238, 232, 9, 13, 238, 231, 9, 13, 238, 230, 9, 13, 238, 229, 9, 13, + 238, 228, 9, 13, 238, 227, 9, 13, 238, 226, 9, 13, 238, 225, 9, 13, 238, + 224, 9, 13, 238, 223, 9, 13, 238, 222, 9, 13, 238, 221, 9, 13, 238, 220, + 9, 13, 238, 219, 9, 13, 238, 218, 9, 13, 238, 217, 9, 13, 238, 216, 9, + 13, 238, 215, 9, 13, 238, 214, 9, 13, 238, 213, 9, 13, 238, 212, 9, 13, + 238, 211, 9, 13, 238, 210, 9, 13, 238, 209, 9, 13, 238, 208, 9, 13, 238, + 207, 9, 13, 238, 206, 9, 13, 238, 205, 9, 13, 238, 204, 9, 13, 238, 203, + 9, 13, 238, 202, 9, 13, 238, 201, 9, 13, 238, 200, 9, 13, 238, 199, 9, + 13, 238, 198, 9, 13, 238, 197, 9, 13, 238, 196, 9, 13, 238, 195, 9, 13, + 238, 194, 9, 13, 238, 193, 9, 13, 238, 192, 9, 13, 238, 191, 9, 13, 238, + 190, 9, 13, 238, 189, 9, 13, 238, 188, 9, 13, 238, 187, 9, 13, 238, 186, + 9, 13, 238, 185, 9, 13, 238, 184, 9, 13, 238, 183, 9, 13, 238, 182, 9, + 13, 238, 181, 9, 13, 238, 180, 9, 13, 238, 179, 9, 13, 238, 178, 9, 13, + 238, 177, 9, 13, 238, 176, 9, 13, 238, 175, 9, 13, 238, 174, 9, 13, 238, + 173, 9, 13, 238, 172, 9, 13, 238, 171, 9, 13, 238, 170, 9, 13, 238, 169, + 9, 13, 238, 168, 9, 13, 238, 167, 9, 13, 238, 166, 9, 13, 238, 165, 9, + 13, 238, 164, 9, 13, 238, 163, 9, 13, 238, 162, 9, 13, 238, 161, 9, 13, + 238, 160, 9, 13, 238, 159, 9, 13, 238, 158, 9, 13, 238, 157, 9, 13, 238, + 156, 9, 13, 238, 155, 9, 13, 238, 154, 9, 13, 238, 153, 9, 13, 238, 152, + 9, 13, 238, 151, 9, 13, 238, 150, 9, 13, 238, 149, 9, 13, 238, 148, 9, + 13, 238, 147, 9, 13, 238, 146, 9, 13, 238, 145, 9, 13, 238, 144, 9, 13, + 238, 143, 9, 13, 238, 142, 9, 13, 238, 141, 9, 13, 238, 140, 9, 13, 238, + 139, 9, 13, 238, 138, 9, 13, 238, 137, 9, 13, 238, 136, 9, 13, 238, 135, + 9, 13, 238, 134, 9, 13, 238, 133, 9, 13, 238, 132, 9, 13, 238, 131, 9, + 13, 238, 130, 9, 13, 238, 129, 9, 13, 238, 128, 9, 13, 238, 127, 9, 13, + 238, 126, 9, 13, 238, 125, 9, 13, 238, 124, 9, 13, 238, 123, 9, 13, 238, + 122, 9, 13, 238, 121, 9, 13, 238, 120, 9, 13, 238, 119, 9, 13, 238, 118, + 9, 13, 238, 117, 9, 13, 238, 116, 9, 13, 238, 115, 9, 13, 238, 114, 9, + 13, 238, 113, 9, 13, 238, 112, 9, 13, 238, 111, 9, 13, 238, 110, 9, 13, + 238, 109, 9, 13, 238, 108, 9, 13, 238, 107, 9, 13, 238, 106, 9, 13, 238, + 105, 9, 13, 238, 104, 9, 13, 238, 103, 9, 13, 238, 102, 9, 13, 238, 101, + 9, 13, 238, 100, 9, 13, 238, 99, 9, 13, 238, 98, 9, 13, 238, 97, 9, 13, + 238, 96, 9, 13, 238, 95, 9, 13, 238, 94, 9, 13, 238, 93, 9, 13, 238, 92, + 9, 13, 238, 91, 9, 13, 238, 90, 9, 13, 238, 89, 9, 13, 238, 88, 9, 13, + 238, 87, 9, 13, 238, 86, 9, 13, 238, 85, 9, 13, 238, 84, 9, 13, 238, 83, + 9, 13, 238, 82, 9, 13, 238, 81, 9, 13, 238, 80, 9, 13, 238, 79, 9, 13, + 238, 78, 9, 13, 238, 77, 9, 13, 238, 76, 9, 13, 238, 75, 9, 13, 238, 74, + 9, 13, 238, 73, 9, 13, 238, 72, 9, 13, 238, 71, 9, 13, 238, 70, 9, 13, + 238, 69, 9, 13, 238, 68, 9, 13, 238, 67, 9, 13, 238, 66, 233, 114, 218, + 33, 126, 219, 206, 126, 244, 254, 77, 126, 224, 143, 77, 126, 50, 52, + 126, 247, 86, 52, 126, 226, 57, 52, 126, 254, 35, 126, 253, 226, 126, 42, + 226, 131, 126, 46, 226, 131, 126, 253, 132, 126, 94, 52, 126, 249, 157, + 126, 240, 159, 126, 243, 200, 219, 69, 126, 219, 231, 126, 21, 212, 79, + 126, 21, 116, 126, 21, 109, 126, 21, 166, 126, 21, 163, 126, 21, 180, + 126, 21, 189, 126, 21, 198, 126, 21, 195, 126, 21, 200, 126, 249, 164, + 126, 221, 70, 126, 233, 39, 52, 126, 245, 61, 52, 126, 242, 107, 52, 126, + 224, 158, 77, 126, 249, 156, 253, 122, 126, 7, 6, 1, 61, 126, 7, 6, 1, + 253, 74, 126, 7, 6, 1, 250, 252, 126, 7, 6, 1, 249, 3, 126, 7, 6, 1, 74, + 126, 7, 6, 1, 244, 230, 126, 7, 6, 1, 243, 177, 126, 7, 6, 1, 242, 41, + 126, 7, 6, 1, 72, 126, 7, 6, 1, 235, 142, 126, 7, 6, 1, 235, 27, 126, 7, + 6, 1, 150, 126, 7, 6, 1, 183, 126, 7, 6, 1, 204, 126, 7, 6, 1, 75, 126, + 7, 6, 1, 226, 229, 126, 7, 6, 1, 224, 240, 126, 7, 6, 1, 149, 126, 7, 6, + 1, 197, 126, 7, 6, 1, 218, 99, 126, 7, 6, 1, 69, 126, 7, 6, 1, 215, 79, + 126, 7, 6, 1, 214, 82, 126, 7, 6, 1, 213, 166, 126, 7, 6, 1, 213, 105, + 126, 7, 6, 1, 212, 152, 126, 42, 41, 125, 126, 223, 203, 219, 231, 126, + 46, 41, 125, 126, 249, 224, 254, 174, 126, 115, 232, 242, 126, 242, 114, + 254, 174, 126, 7, 3, 1, 61, 126, 7, 3, 1, 253, 74, 126, 7, 3, 1, 250, + 252, 126, 7, 3, 1, 249, 3, 126, 7, 3, 1, 74, 126, 7, 3, 1, 244, 230, 126, + 7, 3, 1, 243, 177, 126, 7, 3, 1, 242, 41, 126, 7, 3, 1, 72, 126, 7, 3, 1, + 235, 142, 126, 7, 3, 1, 235, 27, 126, 7, 3, 1, 150, 126, 7, 3, 1, 183, + 126, 7, 3, 1, 204, 126, 7, 3, 1, 75, 126, 7, 3, 1, 226, 229, 126, 7, 3, + 1, 224, 240, 126, 7, 3, 1, 149, 126, 7, 3, 1, 197, 126, 7, 3, 1, 218, 99, + 126, 7, 3, 1, 69, 126, 7, 3, 1, 215, 79, 126, 7, 3, 1, 214, 82, 126, 7, + 3, 1, 213, 166, 126, 7, 3, 1, 213, 105, 126, 7, 3, 1, 212, 152, 126, 42, + 249, 40, 125, 126, 71, 232, 242, 126, 46, 249, 40, 125, 126, 217, 42, + 250, 194, 218, 33, 43, 221, 254, 43, 221, 243, 43, 221, 232, 43, 221, + 220, 43, 221, 209, 43, 221, 198, 43, 221, 187, 43, 221, 176, 43, 221, + 165, 43, 221, 157, 43, 221, 156, 43, 221, 155, 43, 221, 154, 43, 221, + 152, 43, 221, 151, 43, 221, 150, 43, 221, 149, 43, 221, 148, 43, 221, + 147, 43, 221, 146, 43, 221, 145, 43, 221, 144, 43, 221, 143, 43, 221, + 141, 43, 221, 140, 43, 221, 139, 43, 221, 138, 43, 221, 137, 43, 221, + 136, 43, 221, 135, 43, 221, 134, 43, 221, 133, 43, 221, 132, 43, 221, + 130, 43, 221, 129, 43, 221, 128, 43, 221, 127, 43, 221, 126, 43, 221, + 125, 43, 221, 124, 43, 221, 123, 43, 221, 122, 43, 221, 121, 43, 221, + 119, 43, 221, 118, 43, 221, 117, 43, 221, 116, 43, 221, 115, 43, 221, + 114, 43, 221, 113, 43, 221, 112, 43, 221, 111, 43, 221, 110, 43, 221, + 108, 43, 221, 107, 43, 221, 106, 43, 221, 105, 43, 221, 104, 43, 221, + 103, 43, 221, 102, 43, 221, 101, 43, 221, 100, 43, 221, 99, 43, 221, 97, + 43, 221, 96, 43, 221, 95, 43, 221, 94, 43, 221, 93, 43, 221, 92, 43, 221, + 91, 43, 221, 90, 43, 221, 89, 43, 221, 88, 43, 221, 86, 43, 221, 85, 43, + 221, 84, 43, 221, 83, 43, 221, 82, 43, 221, 81, 43, 221, 80, 43, 221, 79, + 43, 221, 78, 43, 221, 77, 43, 222, 74, 43, 222, 73, 43, 222, 72, 43, 222, + 71, 43, 222, 70, 43, 222, 69, 43, 222, 68, 43, 222, 67, 43, 222, 66, 43, + 222, 65, 43, 222, 63, 43, 222, 62, 43, 222, 61, 43, 222, 60, 43, 222, 59, + 43, 222, 58, 43, 222, 57, 43, 222, 56, 43, 222, 55, 43, 222, 54, 43, 222, + 52, 43, 222, 51, 43, 222, 50, 43, 222, 49, 43, 222, 48, 43, 222, 47, 43, + 222, 46, 43, 222, 45, 43, 222, 44, 43, 222, 43, 43, 222, 41, 43, 222, 40, + 43, 222, 39, 43, 222, 38, 43, 222, 37, 43, 222, 36, 43, 222, 35, 43, 222, + 34, 43, 222, 33, 43, 222, 32, 43, 222, 30, 43, 222, 29, 43, 222, 28, 43, + 222, 27, 43, 222, 26, 43, 222, 25, 43, 222, 24, 43, 222, 23, 43, 222, 22, + 43, 222, 21, 43, 222, 19, 43, 222, 18, 43, 222, 17, 43, 222, 16, 43, 222, + 15, 43, 222, 14, 43, 222, 13, 43, 222, 12, 43, 222, 11, 43, 222, 10, 43, + 222, 8, 43, 222, 7, 43, 222, 6, 43, 222, 5, 43, 222, 4, 43, 222, 3, 43, + 222, 2, 43, 222, 1, 43, 222, 0, 43, 221, 255, 43, 221, 253, 43, 221, 252, + 43, 221, 251, 43, 221, 250, 43, 221, 249, 43, 221, 248, 43, 221, 247, 43, + 221, 246, 43, 221, 245, 43, 221, 244, 43, 221, 242, 43, 221, 241, 43, + 221, 240, 43, 221, 239, 43, 221, 238, 43, 221, 237, 43, 221, 236, 43, + 221, 235, 43, 221, 234, 43, 221, 233, 43, 221, 231, 43, 221, 230, 43, + 221, 229, 43, 221, 228, 43, 221, 227, 43, 221, 226, 43, 221, 225, 43, + 221, 224, 43, 221, 223, 43, 221, 222, 43, 221, 219, 43, 221, 218, 43, + 221, 217, 43, 221, 216, 43, 221, 215, 43, 221, 214, 43, 221, 213, 43, + 221, 212, 43, 221, 211, 43, 221, 210, 43, 221, 208, 43, 221, 207, 43, + 221, 206, 43, 221, 205, 43, 221, 204, 43, 221, 203, 43, 221, 202, 43, + 221, 201, 43, 221, 200, 43, 221, 199, 43, 221, 197, 43, 221, 196, 43, + 221, 195, 43, 221, 194, 43, 221, 193, 43, 221, 192, 43, 221, 191, 43, + 221, 190, 43, 221, 189, 43, 221, 188, 43, 221, 186, 43, 221, 185, 43, + 221, 184, 43, 221, 183, 43, 221, 182, 43, 221, 181, 43, 221, 180, 43, + 221, 179, 43, 221, 178, 43, 221, 177, 43, 221, 175, 43, 221, 174, 43, + 221, 173, 43, 221, 172, 43, 221, 171, 43, 221, 170, 43, 221, 169, 43, + 221, 168, 43, 221, 167, 43, 221, 166, 43, 221, 164, 43, 221, 163, 43, + 221, 162, 43, 221, 161, 43, 221, 160, 43, 221, 159, 43, 221, 158, }; static unsigned char phrasebook_offset1[] = { @@ -11934,27 +13142,29 @@ static unsigned char phrasebook_offset1[] = { 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 17, 126, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 123, 124, 125, 126, 127, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 127, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 128, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 17, 146, 147, 148, 149, 150, 17, 17, 17, 17, 17, 17, 151, 17, - 152, 17, 153, 17, 154, 17, 155, 17, 17, 17, 156, 17, 17, 17, 17, 157, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 17, 147, 148, 149, 150, 151, 17, 17, 17, 17, 17, 17, 152, 17, + 153, 17, 154, 17, 155, 17, 156, 17, 17, 17, 157, 17, 17, 17, 158, 159, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 158, 159, 160, 161, 162, 163, - 164, 17, 165, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 160, 161, 162, 163, 164, + 165, 166, 17, 167, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 177, + 178, 179, 180, 181, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, @@ -11962,16 +13172,18 @@ static unsigned char phrasebook_offset1[] = { 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 182, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 183, 184, 185, 186, 187, 17, 188, + 17, 189, 190, 191, 192, 193, 194, 195, 196, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 197, 198, 199, 200, 201, 17, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 175, 176, 177, 178, 179, 17, 180, 17, 181, 182, - 183, 184, 185, 186, 187, 188, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 189, 190, 191, 192, 193, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, @@ -11996,11 +13208,12 @@ static unsigned char phrasebook_offset1[] = { 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 211, 212, 213, + 214, 215, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 194, 195, 196, 197, 198, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, @@ -12309,12 +13522,12 @@ static unsigned char phrasebook_offset1[] = { 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 216, 17, 217, 218, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 199, 17, 200, 201, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, @@ -12395,11 +13608,6 @@ static unsigned char phrasebook_offset1[] = { 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, }; static unsigned int phrasebook_offset2[] = { @@ -12412,1270 +13620,1244 @@ static unsigned int phrasebook_offset2[] = { 270, 275, 279, 283, 287, 291, 296, 301, 305, 309, 314, 318, 323, 328, 333, 338, 343, 347, 350, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 360, 365, - 368, 371, 374, 377, 380, 383, 385, 388, 394, 402, 404, 408, 411, 413, - 416, 419, 422, 425, 429, 432, 435, 439, 441, 444, 450, 458, 465, 472, - 479, 484, 491, 497, 504, 511, 518, 526, 531, 539, 546, 552, 559, 566, - 574, 581, 589, 597, 602, 610, 617, 623, 630, 637, 644, 647, 653, 660, - 666, 673, 680, 687, 692, 698, 705, 711, 718, 725, 732, 740, 745, 753, - 760, 766, 773, 780, 788, 795, 803, 811, 816, 824, 831, 837, 844, 851, - 858, 861, 867, 874, 880, 887, 894, 901, 906, 914, 921, 928, 935, 942, - 949, 956, 963, 970, 978, 986, 994, 1002, 1010, 1018, 1026, 1034, 1041, - 1048, 1055, 1062, 1069, 1076, 1083, 1090, 1097, 1104, 1111, 1118, 1126, - 1134, 1142, 1150, 1158, 1166, 1174, 1182, 1190, 1198, 1205, 1212, 1220, - 1228, 1236, 1244, 1252, 1260, 1268, 1276, 1284, 1290, 1295, 1300, 1308, - 1316, 1324, 1332, 1337, 1344, 1351, 1359, 1367, 1375, 1383, 1393, 1403, - 1410, 1417, 1424, 1431, 1439, 1447, 1455, 1463, 1474, 1479, 1484, 1491, - 1498, 1505, 1512, 1519, 1526, 1531, 1536, 1543, 1550, 1558, 1566, 1574, - 1582, 1589, 1596, 1604, 1612, 1620, 1628, 1636, 1644, 1652, 1660, 1668, - 1676, 1683, 1690, 1697, 1704, 1711, 1718, 1725, 1732, 1740, 1748, 1755, - 1762, 1769, 1776, 1784, 1792, 1800, 1808, 1816, 1823, 1830, 1838, 1846, - 1854, 1862, 1867, 1873, 1879, 1886, 1893, 1898, 1903, 1909, 1916, 1923, - 1930, 1937, 1945, 1953, 1959, 1964, 1969, 1975, 1982, 1989, 1996, 2001, - 2006, 2011, 2018, 2025, 2032, 2039, 2046, 2051, 2059, 2069, 2078, 2085, - 2092, 2097, 2102, 2109, 2116, 2120, 2125, 2130, 2135, 2142, 2151, 2158, - 2165, 2174, 2181, 2188, 2193, 2200, 2207, 2214, 2221, 2228, 2233, 2240, - 2247, 2255, 2260, 2265, 2270, 2280, 2284, 2290, 2296, 2302, 2308, 2316, - 2329, 2337, 2342, 2352, 2357, 2362, 2372, 2377, 2384, 2391, 2399, 2407, - 2414, 2421, 2428, 2435, 2445, 2455, 2464, 2473, 2483, 2493, 2503, 2513, - 2518, 2528, 2538, 2548, 2558, 2566, 2574, 2581, 2588, 2596, 2604, 2612, - 2620, 2627, 2634, 2644, 2654, 2662, 2670, 2678, 2683, 2693, 2698, 2705, - 2712, 2717, 2722, 2730, 2738, 2748, 2758, 2765, 2772, 2780, 2788, 2796, - 2804, 2813, 2822, 2830, 2838, 2847, 2856, 2865, 2874, 2884, 2894, 2902, - 2910, 2919, 2928, 2937, 2946, 2956, 2966, 2974, 2982, 2991, 3000, 3009, - 3018, 3027, 3036, 3041, 3046, 3054, 3062, 3072, 3080, 3085, 3090, 3097, - 3104, 3111, 3118, 3125, 3132, 3142, 3152, 3162, 3172, 3179, 3186, 3196, - 3206, 3214, 3222, 3230, 3238, 3246, 3253, 3260, 3267, 3273, 3280, 3287, - 3294, 3303, 3313, 3323, 3330, 3337, 3343, 3348, 3354, 3360, 3366, 3373, - 3380, 3391, 3401, 3408, 3415, 3422, 3429, 3434, 3439, 3445, 3451, 3457, - 3465, 3473, 3480, 3485, 3490, 3497, 3503, 3510, 3519, 3528, 3537, 3544, - 3550, 3556, 3561, 3568, 3574, 3581, 3588, 3595, 3600, 3605, 3615, 3623, - 3632, 3637, 3642, 3652, 3659, 3667, 3676, 3681, 3687, 3693, 3700, 3705, - 3710, 3720, 3728, 3737, 3745, 3753, 3762, 3767, 3774, 3781, 3786, 3797, - 3805, 3813, 3819, 3828, 3833, 3838, 3845, 3851, 3857, 3863, 3869, 3878, - 3886, 3891, 3899, 3905, 3913, 3921, 3927, 3933, 3939, 3947, 3955, 3961, - 3969, 3975, 3980, 3987, 3995, 4004, 4011, 4018, 4028, 4035, 4042, 4052, - 4059, 4066, 4073, 4079, 4085, 4094, 4106, 4111, 4118, 4123, 4127, 4132, - 4140, 4147, 4152, 4157, 4161, 4166, 4171, 4175, 4180, 4186, 4192, 4198, - 4205, 4210, 4215, 4220, 4225, 4231, 4233, 4238, 4242, 4248, 4254, 4260, - 4265, 4272, 4279, 4285, 4292, 4300, 4308, 4313, 4318, 4322, 4327, 4329, - 4331, 4334, 4336, 4339, 4344, 4349, 4355, 4360, 4364, 4368, 4373, 4381, - 4387, 4392, 4398, 4403, 4409, 4417, 4425, 4429, 4433, 4438, 4444, 4450, - 4456, 4462, 4467, 4475, 4484, 4493, 4498, 4504, 4511, 4518, 4525, 4532, - 4536, 4542, 4547, 4552, 4557, 4562, 4565, 4568, 4571, 4574, 4577, 4580, - 4584, 4588, 4594, 4597, 4602, 4608, 4614, 4617, 4622, 4627, 4631, 4636, - 4642, 4648, 4654, 4659, 4664, 4669, 4672, 4678, 4683, 4688, 4692, 4697, - 4703, 4709, 4712, 4716, 4720, 4724, 4727, 4730, 4735, 4739, 4746, 4750, - 4756, 4760, 4766, 4770, 4774, 4778, 4783, 4788, 4794, 4799, 4806, 4812, - 4818, 4824, 4827, 4831, 4835, 4839, 4843, 4848, 4853, 4857, 4861, 4867, - 4871, 4875, 4880, 4886, 4891, 4896, 4900, 4906, 4911, 4916, 4921, 4926, - 4932, 4935, 4939, 4944, 4949, 4958, 4964, 4969, 4973, 4978, 4982, 4987, - 4991, 4995, 5000, 5004, 5010, 5015, 5020, 5025, 5030, 5035, 5040, 5046, - 5052, 5058, 5063, 5068, 5074, 5080, 5086, 5091, 5096, 5103, 5110, 5114, - 5120, 5127, 0, 0, 5134, 5137, 5145, 5154, 5164, 0, 0, 0, 0, 0, 5168, - 5171, 5176, 5184, 5189, 5197, 5205, 0, 5213, 0, 5221, 5229, 5237, 5248, - 5253, 5258, 5263, 5268, 5273, 5278, 5283, 5288, 5293, 5298, 5303, 5308, - 5313, 5318, 5323, 5328, 0, 5333, 5338, 5343, 5348, 5353, 5358, 5363, - 5368, 5376, 5384, 5392, 5400, 5408, 5416, 5427, 5432, 5437, 5442, 5447, - 5452, 5457, 5462, 5467, 5472, 5477, 5482, 5487, 5492, 5497, 5502, 5507, - 5512, 5518, 5523, 5528, 5533, 5538, 5543, 5548, 5553, 5561, 5569, 5577, - 5585, 5593, 5598, 5602, 5606, 5613, 5623, 5633, 5637, 5641, 5645, 5651, - 5658, 5662, 5667, 5671, 5676, 5680, 5685, 5689, 5694, 5699, 5704, 5709, - 5714, 5719, 5724, 5729, 5734, 5739, 5744, 5749, 5754, 5759, 5764, 5768, - 5772, 5778, 5782, 5787, 5793, 5800, 5805, 5810, 5817, 5822, 5827, 5833, - 5841, 5850, 5860, 5868, 5873, 5878, 5883, 5890, 5895, 5901, 5906, 5911, - 5916, 5921, 5926, 5931, 5939, 5945, 5950, 5954, 5959, 5964, 5969, 5974, - 5979, 5984, 5989, 5993, 5999, 6003, 6008, 6013, 6018, 6022, 6027, 6032, - 6037, 6042, 6046, 6051, 6055, 6060, 6065, 6070, 6075, 6081, 6086, 6092, - 6096, 6101, 6105, 6109, 6114, 6119, 6124, 6129, 6134, 6139, 6144, 6148, - 6154, 6158, 6163, 6168, 6173, 6177, 6182, 6187, 6192, 6197, 6201, 6206, - 6210, 6215, 6220, 6225, 6230, 6236, 6241, 6247, 6251, 6256, 6260, 6268, - 6273, 6278, 6283, 6290, 6295, 6301, 6306, 6311, 6316, 6321, 6326, 6331, - 6339, 6345, 6350, 6355, 6360, 6365, 6370, 6376, 6382, 6389, 6396, 6405, - 6414, 6421, 6428, 6437, 6446, 6451, 6456, 6461, 6466, 6471, 6476, 6481, - 6486, 6497, 6508, 6513, 6518, 6525, 6532, 6540, 6548, 6553, 6558, 6563, - 6568, 6572, 6576, 6580, 6585, 6590, 6594, 6601, 6606, 6616, 6626, 6632, - 6638, 6646, 6654, 6662, 6670, 6677, 6684, 6693, 6702, 6710, 6718, 6726, - 6734, 6741, 6748, 6755, 6762, 6768, 6774, 6780, 6786, 6794, 6802, 6809, - 6816, 6825, 6834, 6840, 6846, 6854, 6862, 6870, 6878, 6884, 6890, 6898, - 6906, 6914, 6922, 6929, 6936, 6944, 6952, 6960, 6968, 6973, 6978, 6985, - 6992, 7002, 7012, 7016, 7024, 7032, 7038, 7044, 7052, 7060, 7067, 7074, - 7082, 7090, 7097, 7104, 7112, 7120, 7125, 7132, 7139, 7146, 7153, 7159, - 7165, 7173, 7181, 7186, 7191, 7199, 7207, 7215, 7223, 7231, 7239, 7246, - 7253, 7261, 7269, 7277, 7285, 7292, 7299, 7305, 7311, 7320, 7329, 7336, - 7343, 7350, 7357, 7364, 7371, 7378, 7385, 7393, 7401, 7409, 7417, 7425, - 7433, 7442, 7451, 7458, 7465, 7472, 7479, 7486, 7493, 7500, 7507, 7514, - 7521, 7528, 7535, 7542, 7549, 7556, 7563, 7570, 7577, 7584, 7591, 7597, - 7603, 7610, 7617, 7622, 7627, 7632, 7637, 7642, 7647, 7652, 7657, 7662, - 7667, 7673, 7679, 7688, 7697, 7706, 7715, 7723, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7731, 7736, 7741, 7746, 7751, 7756, 7761, 7766, 7771, 7775, - 7780, 7785, 7790, 7795, 7800, 7805, 7810, 7815, 7820, 7825, 7830, 7835, - 7840, 7845, 7850, 7855, 7860, 7865, 7869, 7874, 7879, 7884, 7889, 7894, - 7899, 7904, 7909, 7914, 0, 0, 7919, 7926, 7929, 7933, 7937, 7940, 7944, - 0, 7948, 7953, 7958, 7963, 7968, 7973, 7978, 7983, 7988, 7992, 7997, - 8002, 8007, 8012, 8017, 8022, 8027, 8032, 8037, 8042, 8047, 8052, 8057, - 8062, 8067, 8072, 8077, 8082, 8086, 8091, 8096, 8101, 8106, 8111, 8116, - 8121, 8126, 8131, 8136, 0, 8143, 8148, 0, 0, 0, 0, 0, 0, 8151, 8156, - 8161, 8166, 8173, 8180, 8185, 8190, 8195, 8200, 8205, 8210, 8215, 8222, - 8227, 8234, 8241, 8246, 8253, 8258, 8263, 8268, 8275, 8280, 8285, 8292, - 8301, 8306, 8311, 8316, 8321, 8327, 8332, 8339, 8346, 8353, 8358, 8363, - 8368, 8373, 8378, 8383, 8393, 8398, 8406, 8411, 8416, 8421, 8426, 8433, - 8440, 8447, 8453, 8459, 8466, 0, 0, 0, 0, 0, 0, 0, 0, 8473, 8477, 8481, - 8485, 8489, 8493, 8497, 8501, 8505, 8509, 8513, 8518, 8522, 8526, 8531, - 8535, 8540, 8544, 8548, 8552, 8557, 8561, 8566, 8570, 8574, 8578, 8582, - 0, 0, 0, 0, 0, 8586, 8593, 8601, 8608, 8613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8618, 8621, 8625, 8630, 0, 0, 8634, 8640, 8646, 8649, 8656, 8665, - 8668, 8671, 8676, 8682, 8686, 8694, 8700, 8706, 8714, 8718, 8723, 8734, - 8739, 8743, 8747, 8751, 0, 0, 8754, 8761, 0, 8765, 8769, 8776, 8782, - 8789, 8795, 8801, 8805, 8809, 8815, 8819, 8823, 8827, 8831, 8835, 8839, - 8843, 8847, 8851, 8855, 8859, 8863, 8867, 8871, 8875, 8879, 8883, 8891, - 8899, 8909, 8918, 8927, 8930, 8934, 8938, 8942, 8946, 8950, 8954, 8958, - 8962, 8967, 8971, 8974, 8977, 8980, 8983, 8986, 8989, 8992, 8995, 8999, - 9002, 9005, 9010, 9015, 9021, 9024, 9031, 9040, 9045, 9049, 0, 9056, - 9061, 9065, 9069, 9073, 9077, 9081, 9085, 9089, 9093, 9097, 9101, 9106, - 9111, 9118, 9124, 9130, 9136, 9141, 9149, 9157, 9162, 9168, 9174, 9180, - 9186, 9190, 9194, 9198, 9205, 9215, 9219, 9223, 9227, 9233, 9241, 9245, - 9249, 9256, 9260, 9264, 9268, 9275, 9282, 9294, 9298, 9302, 9306, 9316, - 9325, 9329, 9337, 9344, 9351, 9360, 9371, 9379, 9383, 9392, 9403, 9411, - 9424, 9432, 9440, 9448, 9456, 9462, 9471, 9478, 9482, 9490, 9494, 9501, - 9509, 9513, 9519, 9526, 9533, 9537, 9545, 9549, 9556, 9560, 9568, 9572, - 9580, 9588, 9595, 9603, 9611, 9618, 9624, 9628, 9635, 9643, 9649, 9656, - 9663, 9669, 9678, 9686, 9693, 9699, 9703, 9706, 9710, 9716, 9724, 9728, - 9734, 9740, 9747, 9754, 9757, 9764, 9769, 9777, 9782, 9786, 9799, 9812, - 9818, 9825, 9830, 9836, 9841, 9847, 9857, 9864, 9873, 9883, 9889, 9894, - 9899, 9903, 9907, 9912, 9917, 9923, 9931, 9939, 9950, 9955, 9964, 9973, - 9980, 9986, 9992, 9998, 10004, 10010, 10016, 10022, 10028, 10034, 10041, - 10048, 10055, 10061, 10069, 10078, 10084, 10091, 10098, 10103, 10108, - 10112, 10119, 10126, 10135, 10144, 10147, 10152, 10157, 0, 10162, 10166, - 10170, 10176, 10180, 10184, 10190, 10194, 10202, 10206, 10210, 10214, - 10218, 10222, 10228, 10232, 10238, 10242, 10246, 10250, 10254, 10258, - 10263, 10266, 10270, 10275, 10279, 10283, 10287, 10291, 10295, 10301, - 10307, 10313, 10317, 10321, 10326, 10330, 10334, 10339, 10343, 10347, - 10354, 10361, 10365, 10369, 10374, 10378, 10382, 10385, 10390, 10393, - 10396, 10401, 10406, 10410, 10414, 10420, 10426, 10429, 0, 0, 10432, - 10438, 10444, 10450, 10460, 10472, 10484, 10501, 10513, 10524, 10532, - 10539, 10550, 10565, 10576, 10582, 10591, 10599, 10611, 10621, 10629, - 10641, 10648, 10656, 10668, 10674, 10680, 10688, 10696, 10704, 10710, - 10720, 10727, 10737, 10747, 10760, 10774, 10788, 10798, 10809, 10820, - 10833, 10846, 10860, 10872, 10884, 10897, 10910, 10922, 10935, 10944, - 10952, 10957, 10962, 10967, 10972, 10977, 10982, 10987, 10992, 10997, - 11002, 11007, 11012, 11017, 11022, 11027, 11032, 11037, 11042, 11047, - 11052, 11057, 11062, 11067, 11072, 11077, 11082, 11087, 11092, 11097, - 11102, 11107, 11112, 11116, 11121, 11126, 11131, 11136, 11141, 11145, - 11149, 11153, 11157, 11161, 11165, 11169, 11173, 11177, 11181, 11185, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11190, 11195, 11199, 11203, 11207, - 11211, 11215, 11219, 11223, 11227, 11231, 11235, 11240, 11244, 11248, - 11252, 11257, 11261, 11266, 11270, 11275, 11279, 11284, 11289, 11294, - 11299, 11303, 11308, 11313, 11318, 11323, 11327, 11332, 11339, 11343, - 11348, 11352, 11356, 11361, 11365, 11372, 11379, 11386, 11392, 11400, - 11408, 11417, 11425, 11432, 11439, 11447, 11453, 11459, 11465, 11471, - 11478, 11483, 11487, 11492, 0, 0, 0, 0, 0, 11496, 11500, 11504, 11508, - 11512, 11516, 11520, 11524, 11528, 11532, 11536, 11540, 11544, 11548, - 11552, 11556, 11560, 11564, 11568, 11572, 11576, 11580, 11584, 11588, - 11592, 11596, 11600, 11607, 11613, 11618, 11622, 11629, 11635, 11640, - 11646, 11651, 11655, 11661, 11667, 11672, 11676, 11680, 11685, 11689, - 11693, 11698, 0, 0, 11702, 11707, 11712, 11717, 11722, 11727, 11732, - 11736, 11743, 11748, 11753, 11758, 11763, 11768, 11775, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 368, 371, 374, 377, 380, 383, 385, 388, 394, 402, 405, 409, 412, 414, + 417, 420, 423, 426, 430, 433, 436, 440, 442, 445, 451, 459, 466, 473, + 480, 485, 492, 498, 505, 512, 519, 527, 532, 540, 547, 553, 560, 567, + 575, 582, 590, 598, 603, 611, 618, 624, 631, 638, 645, 648, 654, 661, + 667, 674, 681, 688, 693, 699, 706, 712, 719, 726, 733, 741, 746, 754, + 761, 767, 774, 781, 789, 796, 804, 812, 817, 825, 832, 838, 845, 852, + 859, 862, 868, 875, 881, 888, 895, 902, 907, 915, 922, 929, 936, 943, + 950, 957, 964, 971, 979, 987, 995, 1003, 1011, 1019, 1027, 1035, 1042, + 1049, 1056, 1063, 1070, 1077, 1084, 1091, 1098, 1105, 1112, 1119, 1127, + 1135, 1143, 1151, 1159, 1167, 1175, 1183, 1191, 1199, 1206, 1213, 1221, + 1229, 1237, 1245, 1253, 1261, 1269, 1277, 1285, 1291, 1296, 1301, 1309, + 1317, 1325, 1333, 1338, 1345, 1352, 1360, 1368, 1376, 1384, 1394, 1404, + 1411, 1418, 1425, 1432, 1440, 1448, 1456, 1464, 1475, 1480, 1485, 1492, + 1499, 1506, 1513, 1520, 1527, 1532, 1537, 1544, 1551, 1559, 1567, 1575, + 1583, 1590, 1597, 1605, 1613, 1621, 1629, 1637, 1645, 1653, 1661, 1669, + 1677, 1684, 1691, 1698, 1705, 1712, 1719, 1726, 1733, 1741, 1749, 1756, + 1763, 1770, 1777, 1785, 1793, 1801, 1809, 1817, 1824, 1831, 1839, 1847, + 1855, 1863, 1868, 1874, 1880, 1887, 1894, 1899, 1904, 1910, 1917, 1924, + 1931, 1938, 1946, 1954, 1961, 1967, 1972, 1978, 1985, 1992, 1999, 2004, + 2009, 2014, 2021, 2028, 2035, 2042, 2049, 2055, 2063, 2073, 2082, 2089, + 2096, 2101, 2106, 2113, 2120, 2124, 2129, 2134, 2139, 2147, 2156, 2163, + 2170, 2179, 2186, 2193, 2198, 2205, 2212, 2219, 2226, 2233, 2238, 2245, + 2252, 2260, 2265, 2270, 2275, 2285, 2289, 2295, 2301, 2307, 2313, 2321, + 2334, 2342, 2347, 2357, 2362, 2367, 2377, 2382, 2389, 2396, 2404, 2412, + 2419, 2426, 2433, 2440, 2450, 2460, 2469, 2478, 2488, 2498, 2508, 2518, + 2524, 2534, 2544, 2554, 2564, 2572, 2580, 2587, 2594, 2602, 2610, 2618, + 2626, 2633, 2640, 2650, 2660, 2668, 2676, 2684, 2689, 2699, 2704, 2711, + 2718, 2723, 2728, 2736, 2744, 2754, 2764, 2771, 2778, 2787, 2796, 2804, + 2812, 2821, 2830, 2838, 2846, 2855, 2864, 2873, 2882, 2892, 2902, 2910, + 2918, 2927, 2936, 2945, 2954, 2964, 2974, 2982, 2990, 2999, 3008, 3017, + 3026, 3035, 3044, 3049, 3054, 3062, 3070, 3080, 3088, 3093, 3098, 3105, + 3112, 3119, 3126, 3133, 3140, 3150, 3160, 3170, 3180, 3187, 3194, 3204, + 3214, 3222, 3230, 3238, 3246, 3254, 3261, 3268, 3275, 3281, 3288, 3295, + 3302, 3311, 3321, 3331, 3338, 3345, 3351, 3356, 3363, 3369, 3375, 3382, + 3389, 3400, 3410, 3417, 3424, 3431, 3438, 3444, 3449, 3456, 3462, 3468, + 3476, 3484, 3491, 3497, 3502, 3509, 3515, 3523, 3533, 3543, 3552, 3559, + 3565, 3571, 3576, 3583, 3590, 3597, 3604, 3611, 3616, 3621, 3631, 3639, + 3648, 3653, 3659, 3670, 3677, 3685, 3694, 3699, 3705, 3711, 3718, 3723, + 3729, 3740, 3749, 3758, 3766, 3774, 3784, 3789, 3796, 3803, 3808, 3820, + 3829, 3837, 3844, 3853, 3858, 3863, 3870, 3877, 3884, 3891, 3897, 3906, + 3914, 3919, 3927, 3933, 3941, 3949, 3955, 3961, 3967, 3975, 3983, 3989, + 3997, 4004, 4009, 4016, 4024, 4034, 4041, 4048, 4058, 4065, 4072, 4082, + 4089, 4096, 4103, 4109, 4115, 4125, 4138, 4143, 4150, 4155, 4159, 4165, + 4174, 4181, 4186, 4191, 4195, 4200, 4206, 4210, 4216, 4222, 4228, 4234, + 4242, 4247, 4252, 4257, 4262, 4268, 4270, 4275, 4279, 4285, 4291, 4297, + 4302, 4309, 4316, 4322, 4329, 4337, 4345, 4350, 4355, 4359, 4364, 4366, + 4368, 4371, 4373, 4376, 4381, 4386, 4392, 4397, 4401, 4405, 4410, 4419, + 4425, 4430, 4436, 4441, 4447, 4455, 4463, 4467, 4471, 4476, 4482, 4488, + 4494, 4500, 4505, 4513, 4522, 4531, 4536, 4542, 4549, 4556, 4563, 4570, + 4574, 4580, 4585, 4590, 4595, 4600, 4603, 4606, 4609, 4612, 4615, 4618, + 4622, 4626, 4632, 4635, 4640, 4646, 4652, 4655, 4660, 4666, 4670, 4676, + 4682, 4688, 4694, 4699, 4704, 4709, 4712, 4718, 4723, 4728, 4732, 4737, + 4743, 4749, 4752, 4756, 4760, 4764, 4767, 4770, 4775, 4779, 4786, 4790, + 4796, 4800, 4806, 4810, 4814, 4818, 4823, 4828, 4835, 4841, 4848, 4854, + 4860, 4866, 4869, 4873, 4877, 4881, 4885, 4890, 4895, 4899, 4903, 4909, + 4913, 4917, 4922, 4928, 4933, 4939, 4943, 4950, 4955, 4960, 4965, 4970, + 4976, 4979, 4983, 4988, 4993, 5002, 5008, 5013, 5017, 5022, 5026, 5031, + 5035, 5039, 5044, 5048, 5054, 5059, 5064, 5069, 5074, 5079, 5084, 5090, + 5096, 5102, 5107, 5112, 5118, 5124, 5130, 5135, 5140, 5147, 5154, 5158, + 5164, 5171, 0, 0, 5178, 5181, 5190, 5199, 5210, 0, 0, 0, 0, 0, 5214, + 5217, 5222, 5230, 5235, 5243, 5251, 0, 5259, 0, 5267, 5275, 5283, 5294, + 5299, 5304, 5309, 5314, 5319, 5324, 5329, 5334, 5339, 5344, 5349, 5354, + 5359, 5364, 5369, 5374, 0, 5379, 5384, 5389, 5394, 5399, 5404, 5409, + 5414, 5422, 5430, 5438, 5446, 5454, 5462, 5473, 5478, 5483, 5488, 5493, + 5498, 5503, 5508, 5513, 5518, 5523, 5528, 5533, 5538, 5543, 5548, 5553, + 5558, 5564, 5569, 5574, 5579, 5584, 5589, 5594, 5599, 5607, 5615, 5623, + 5631, 5639, 5644, 5648, 5652, 5659, 5669, 5679, 5683, 5687, 5691, 5697, + 5704, 5708, 5713, 5717, 5722, 5726, 5731, 5735, 5740, 5745, 5750, 5755, + 5760, 5765, 5770, 5775, 5780, 5785, 5790, 5795, 5800, 5805, 5810, 5814, + 5818, 5824, 5828, 5833, 5839, 5847, 5852, 5857, 5864, 5869, 5874, 5881, + 5890, 5899, 5910, 5918, 5923, 5928, 5933, 5940, 5945, 5951, 5956, 5961, + 5966, 5971, 5976, 5981, 5989, 5995, 6000, 6004, 6009, 6014, 6019, 6024, + 6029, 6034, 6039, 6043, 6049, 6053, 6058, 6063, 6068, 6072, 6077, 6082, + 6087, 6092, 6096, 6101, 6105, 6110, 6115, 6120, 6125, 6131, 6136, 6142, + 6146, 6151, 6155, 6159, 6164, 6169, 6174, 6179, 6184, 6189, 6194, 6198, + 6204, 6208, 6213, 6218, 6223, 6227, 6232, 6237, 6242, 6247, 6251, 6256, + 6260, 6265, 6270, 6275, 6280, 6286, 6291, 6297, 6301, 6306, 6310, 6318, + 6323, 6328, 6333, 6340, 6345, 6351, 6356, 6361, 6366, 6371, 6376, 6381, + 6389, 6395, 6400, 6405, 6410, 6415, 6420, 6426, 6432, 6439, 6446, 6455, + 6464, 6471, 6478, 6487, 6496, 6501, 6506, 6511, 6516, 6521, 6526, 6531, + 6536, 6547, 6558, 6563, 6568, 6575, 6582, 6590, 6598, 6603, 6608, 6613, + 6618, 6622, 6626, 6630, 6635, 6641, 6645, 6652, 6657, 6667, 6677, 6683, + 6689, 6697, 6705, 6713, 6721, 6728, 6735, 6744, 6753, 6761, 6769, 6777, + 6785, 6793, 6801, 6809, 6817, 6824, 6831, 6837, 6843, 6851, 6859, 6866, + 6873, 6882, 6891, 6897, 6903, 6911, 6919, 6927, 6935, 6941, 6947, 6955, + 6963, 6971, 6979, 6986, 6993, 7001, 7009, 7017, 7025, 7030, 7035, 7042, + 7049, 7059, 7069, 7073, 7081, 7089, 7096, 7103, 7111, 7119, 7126, 7133, + 7141, 7149, 7156, 7163, 7171, 7179, 7184, 7191, 7198, 7205, 7212, 7218, + 7224, 7232, 7240, 7245, 7250, 7258, 7266, 7274, 7282, 7290, 7298, 7305, + 7312, 7320, 7328, 7336, 7344, 7351, 7358, 7364, 7370, 7379, 7388, 7395, + 7402, 7409, 7416, 7423, 7430, 7437, 7444, 7452, 7460, 7468, 7476, 7484, + 7492, 7502, 7512, 7519, 7526, 7533, 7540, 7547, 7554, 7561, 7568, 7575, + 7582, 7589, 7596, 7603, 7610, 7617, 7624, 7631, 7638, 7645, 7652, 7659, + 7666, 7673, 7680, 7685, 7690, 7695, 7700, 7705, 7710, 7715, 7720, 7725, + 7730, 7736, 7742, 7751, 7760, 7769, 7778, 7786, 7794, 7802, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7810, 7815, 7820, 7825, 7830, 7835, 7840, 7845, 7850, + 7854, 7859, 7864, 7869, 7874, 7879, 7884, 7889, 7894, 7899, 7904, 7909, + 7914, 7919, 7924, 7929, 7934, 7939, 7944, 7948, 7953, 7958, 7963, 7968, + 7973, 7978, 7983, 7988, 7993, 0, 0, 7998, 8005, 8008, 8012, 8016, 8019, + 8023, 0, 8027, 8032, 8037, 8042, 8047, 8052, 8057, 8062, 8067, 8071, + 8076, 8081, 8086, 8091, 8096, 8101, 8106, 8111, 8116, 8121, 8126, 8131, + 8136, 8141, 8146, 8151, 8156, 8161, 8165, 8170, 8175, 8180, 8185, 8190, + 8195, 8200, 8205, 8210, 8215, 0, 8222, 8227, 0, 0, 0, 0, 0, 0, 8230, + 8235, 8240, 8245, 8252, 8259, 8264, 8269, 8274, 8279, 8284, 8289, 8294, + 8301, 8306, 8313, 8320, 8325, 8332, 8337, 8342, 8347, 8354, 8359, 8364, + 8371, 8380, 8385, 8390, 8395, 8400, 8406, 8411, 8418, 8425, 8432, 8437, + 8442, 8447, 8452, 8457, 8462, 8472, 8477, 8485, 8490, 8495, 8500, 8505, + 8512, 8519, 8526, 8532, 8538, 8545, 0, 0, 0, 0, 0, 0, 0, 0, 8552, 8556, + 8560, 8564, 8568, 8572, 8576, 8580, 8584, 8588, 8592, 8597, 8601, 8605, + 8610, 8614, 8619, 8623, 8627, 8631, 8636, 8640, 8645, 8649, 8653, 8657, + 8661, 0, 0, 0, 0, 0, 8665, 8672, 8680, 8687, 8692, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8697, 8700, 8704, 8709, 0, 0, 8713, 8719, 8725, 8728, 8735, + 8744, 8747, 8750, 8755, 8761, 8765, 8773, 8779, 8785, 8793, 8797, 8802, + 8813, 8818, 8822, 8826, 8830, 0, 0, 8833, 8840, 8844, 8850, 8854, 8861, + 8867, 8874, 8880, 8886, 8890, 8894, 8900, 8904, 8908, 8912, 8916, 8920, + 8924, 8928, 8932, 8936, 8940, 8944, 8948, 8952, 8956, 8960, 8964, 8968, + 8976, 8984, 8994, 9003, 9012, 9015, 9019, 9023, 9027, 9031, 9035, 9039, + 9043, 9047, 9052, 9056, 9059, 9062, 9065, 9068, 9071, 9074, 9077, 9080, + 9084, 9087, 9090, 9095, 9100, 9106, 9109, 9116, 9125, 9130, 9135, 9142, + 9147, 9152, 9156, 9160, 9164, 9168, 9172, 9176, 9180, 9184, 9188, 9192, + 9197, 9202, 9209, 9215, 9221, 9227, 9232, 9240, 9248, 9253, 9259, 9265, + 9271, 9277, 9281, 9285, 9289, 9296, 9306, 9310, 9314, 9318, 9324, 9332, + 9336, 9340, 9347, 9351, 9355, 9359, 9366, 9373, 9385, 9389, 9393, 9397, + 9407, 9416, 9420, 9428, 9435, 9442, 9451, 9462, 9470, 9474, 9483, 9494, + 9502, 9515, 9523, 9531, 9539, 9547, 9553, 9562, 9569, 9573, 9581, 9585, + 9592, 9600, 9604, 9610, 9617, 9624, 9628, 9636, 9640, 9647, 9651, 9659, + 9663, 9671, 9679, 9686, 9694, 9702, 9709, 9715, 9719, 9726, 9734, 9740, + 9747, 9754, 9760, 9769, 9777, 9784, 9790, 9794, 9797, 9801, 9807, 9815, + 9819, 9825, 9831, 9838, 9845, 9848, 9855, 9860, 9868, 9873, 9877, 9890, + 9903, 9909, 9916, 9921, 9927, 9932, 9938, 9948, 9955, 9964, 9974, 9980, + 9985, 9990, 9994, 9998, 10003, 10008, 10014, 10022, 10030, 10041, 10046, + 10055, 10064, 10071, 10077, 10083, 10089, 10095, 10101, 10107, 10113, + 10119, 10125, 10132, 10139, 10146, 10152, 10160, 10169, 10175, 10182, + 10189, 10194, 10199, 10203, 10210, 10217, 10226, 10235, 10238, 10243, + 10248, 0, 10253, 10257, 10261, 10267, 10271, 10275, 10281, 10285, 10293, + 10297, 10301, 10305, 10309, 10313, 10319, 10323, 10329, 10333, 10337, + 10341, 10345, 10349, 10354, 10357, 10361, 10367, 10371, 10375, 10379, + 10383, 10387, 10393, 10399, 10405, 10409, 10413, 10418, 10422, 10426, + 10431, 10435, 10439, 10446, 10453, 10457, 10461, 10466, 10470, 10474, + 10477, 10482, 10485, 10488, 10493, 10498, 10502, 10506, 10512, 10518, + 10521, 0, 0, 10524, 10530, 10536, 10542, 10552, 10564, 10576, 10593, + 10605, 10616, 10624, 10631, 10642, 10657, 10668, 10674, 10683, 10691, + 10703, 10713, 10721, 10733, 10740, 10748, 10760, 10766, 10772, 10780, + 10788, 10796, 10802, 10812, 10819, 10829, 10839, 10852, 10866, 10880, + 10890, 10901, 10912, 10925, 10938, 10952, 10964, 10976, 10989, 11002, + 11014, 11027, 11036, 11044, 11049, 11054, 11059, 11064, 11069, 11074, + 11079, 11084, 11089, 11094, 11099, 11104, 11109, 11114, 11119, 11124, + 11129, 11134, 11139, 11144, 11149, 11154, 11159, 11164, 11169, 11174, + 11179, 11184, 11189, 11194, 11199, 11204, 11208, 11213, 11218, 11223, + 11228, 11233, 11237, 11241, 11245, 11249, 11253, 11257, 11261, 11265, + 11269, 11273, 11277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11282, + 11287, 11291, 11295, 11299, 11303, 11307, 11311, 11315, 11319, 11323, + 11327, 11332, 11336, 11340, 11344, 11349, 11353, 11358, 11362, 11367, + 11371, 11376, 11381, 11386, 11391, 11395, 11400, 11405, 11410, 11415, + 11419, 11424, 11431, 11435, 11440, 11444, 11448, 11453, 11457, 11464, + 11471, 11478, 11484, 11492, 11500, 11509, 11517, 11524, 11531, 11539, + 11545, 11551, 11557, 11563, 11570, 11575, 11579, 11584, 0, 0, 0, 0, 0, + 11588, 11593, 11598, 11603, 11608, 11613, 11618, 11623, 11628, 11633, + 11638, 11643, 11648, 11653, 11658, 11663, 11668, 11673, 11678, 11683, + 11688, 11693, 11698, 11703, 11708, 11713, 11718, 11726, 11733, 11739, + 11744, 11752, 11759, 11765, 11772, 11778, 11783, 11790, 11797, 11803, + 11808, 11813, 11819, 11824, 11829, 11835, 0, 0, 11840, 11846, 11852, + 11858, 11864, 11870, 11876, 11881, 11889, 11895, 11901, 11907, 11913, + 11919, 11927, 0, 11933, 11938, 11943, 11948, 11953, 11958, 11963, 11968, + 11973, 11978, 11983, 11988, 11993, 11998, 12003, 12008, 12013, 12018, + 12023, 12028, 12033, 12038, 12043, 12048, 12053, 12058, 12063, 12068, 0, + 0, 12073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11780, 11786, - 11790, 11794, 11798, 11803, 11806, 11810, 11813, 11817, 11820, 11824, - 11828, 11832, 11837, 11842, 11845, 11849, 11854, 11859, 11862, 11866, - 11869, 11873, 11877, 11881, 11885, 11889, 11893, 11897, 11901, 11905, - 11909, 11913, 11917, 11921, 11925, 11929, 11933, 11937, 11941, 11944, - 11948, 11951, 11955, 11959, 11963, 11966, 11969, 11972, 11976, 11980, - 11984, 11988, 11992, 11996, 12000, 12004, 0, 0, 12007, 12011, 12015, - 12020, 12024, 12029, 12033, 12038, 12043, 12049, 12055, 12061, 12065, - 12070, 12076, 12082, 12086, 12091, 12095, 0, 12101, 12104, 12110, 12116, - 12121, 12126, 0, 0, 12133, 12137, 12141, 12145, 12149, 12153, 12157, - 12161, 12165, 12170, 12175, 12180, 12186, 12189, 12193, 12197, 12200, - 12203, 12206, 12209, 12212, 12215, 12218, 12221, 12224, 12228, 12235, 0, - 0, 0, 0, 0, 0, 12240, 12244, 12248, 12252, 12256, 12262, 12266, 0, 12270, - 12274, 12278, 0, 12282, 12285, 12289, 12292, 12296, 12299, 12303, 12307, - 0, 0, 12311, 12314, 0, 0, 12318, 12321, 12325, 12328, 12332, 12336, - 12340, 12344, 12348, 12352, 12356, 12360, 12364, 12368, 12372, 12376, - 12380, 12384, 12388, 12392, 12396, 12400, 0, 12403, 12406, 12410, 12414, - 12418, 12421, 12424, 0, 12427, 0, 0, 0, 12431, 12435, 12439, 12443, 0, 0, - 12446, 12450, 12454, 12459, 12463, 12468, 12472, 12477, 12482, 0, 0, - 12488, 12492, 0, 0, 12497, 12501, 12506, 12510, 0, 0, 0, 0, 0, 0, 0, 0, - 12516, 0, 0, 0, 0, 12522, 12526, 0, 12530, 12534, 12539, 12544, 12549, 0, - 0, 12555, 12559, 12562, 12565, 12568, 12571, 12574, 12577, 12580, 12583, - 12586, 12595, 12604, 12608, 12612, 12618, 12624, 12630, 12636, 12650, - 12657, 12660, 0, 0, 0, 0, 0, 12664, 12670, 12674, 0, 12678, 12681, 12685, - 12688, 12692, 12695, 0, 0, 0, 0, 12699, 12703, 0, 0, 12707, 12711, 12715, - 12718, 12722, 12726, 12730, 12734, 12738, 12742, 12746, 12750, 12754, - 12758, 12762, 12766, 12770, 12774, 12778, 12782, 12786, 12790, 0, 12793, - 12796, 12800, 12804, 12808, 12811, 12814, 0, 12817, 12821, 0, 12825, - 12829, 0, 12833, 12837, 0, 0, 12840, 0, 12844, 12849, 12853, 12858, - 12862, 0, 0, 0, 0, 12867, 12872, 0, 0, 12877, 12882, 12887, 0, 0, 0, - 12891, 0, 0, 0, 0, 0, 0, 0, 12895, 12899, 12903, 12907, 0, 12911, 0, 0, - 0, 0, 0, 0, 0, 12915, 12919, 12922, 12925, 12928, 12931, 12934, 12937, - 12940, 12943, 12946, 12949, 12952, 12955, 12958, 12963, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12967, 12971, 12975, 0, 12979, 12982, 12986, 12989, 12993, - 12996, 13000, 13004, 13008, 0, 13013, 13016, 13020, 0, 13025, 13028, - 13032, 13035, 13039, 13043, 13047, 13051, 13055, 13059, 13063, 13067, - 13071, 13075, 13079, 13083, 13087, 13091, 13095, 13099, 13103, 13107, 0, - 13110, 13113, 13117, 13121, 13125, 13128, 13131, 0, 13134, 13138, 0, - 13142, 13146, 13150, 13154, 13158, 0, 0, 13161, 13165, 13169, 13174, - 13178, 13183, 13187, 13192, 13197, 13203, 0, 13209, 13213, 13218, 0, - 13224, 13228, 13233, 0, 0, 13237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 13240, 13245, 13250, 13255, 0, 0, 13261, 13265, 13268, 13271, - 13274, 13277, 13280, 13283, 13286, 13289, 0, 13292, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 13296, 13300, 13304, 0, 13308, 13311, 13315, - 13318, 13322, 13325, 13329, 13333, 0, 0, 13337, 13340, 0, 0, 13344, - 13347, 13351, 13354, 13358, 13362, 13366, 13370, 13374, 13378, 13382, - 13386, 13390, 13394, 13398, 13402, 13406, 13410, 13414, 13418, 13422, - 13426, 0, 13429, 13432, 13436, 13440, 13444, 13447, 13450, 0, 13453, - 13457, 0, 13461, 13465, 13469, 13473, 13477, 0, 0, 13480, 13484, 13488, - 13493, 13497, 13502, 13506, 13511, 13516, 0, 0, 13522, 13526, 0, 0, - 13531, 13535, 13540, 0, 0, 0, 0, 0, 0, 0, 0, 13544, 13550, 0, 0, 0, 0, - 13556, 13560, 0, 13564, 13568, 13573, 13578, 13583, 0, 0, 13589, 13593, - 13596, 13599, 13602, 13605, 13608, 13611, 13614, 13617, 13620, 13623, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13627, 13631, 0, 13635, - 13638, 13642, 13645, 13649, 13652, 0, 0, 0, 13656, 13659, 13663, 0, - 13667, 13670, 13674, 13678, 0, 0, 0, 13681, 13685, 0, 13689, 0, 13693, - 13697, 0, 0, 0, 13701, 13705, 0, 0, 0, 13709, 13712, 13716, 0, 0, 0, - 13719, 13722, 13725, 13728, 13732, 13736, 13740, 13744, 13748, 13752, - 13756, 13760, 0, 0, 0, 0, 13763, 13768, 13772, 13777, 13781, 0, 0, 0, - 13786, 13790, 13795, 0, 13800, 13804, 13809, 13814, 0, 0, 13818, 0, 0, 0, - 0, 0, 0, 13821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13827, 13831, - 13834, 13837, 13840, 13843, 13846, 13849, 13852, 13855, 13858, 13862, - 13867, 13872, 13876, 13880, 13884, 13888, 13892, 13897, 13901, 0, 0, 0, - 0, 0, 0, 13904, 13908, 13912, 0, 13916, 13919, 13923, 13926, 13930, - 13933, 13937, 13941, 0, 13945, 13948, 13952, 0, 13956, 13959, 13963, - 13967, 13970, 13974, 13978, 13982, 13986, 13990, 13994, 13998, 14002, - 14006, 14010, 14014, 14018, 14022, 14026, 14030, 14034, 14038, 14042, 0, - 14045, 14048, 14052, 14056, 14060, 14063, 14066, 14069, 14073, 14077, 0, - 14081, 14085, 14089, 14093, 14097, 0, 0, 0, 14100, 14104, 14109, 14113, - 14118, 14122, 14127, 14132, 0, 14138, 14142, 14147, 0, 14152, 14156, - 14161, 14166, 0, 0, 0, 0, 0, 0, 0, 14170, 14174, 0, 14180, 14184, 0, 0, - 0, 0, 0, 0, 14188, 14193, 14198, 14203, 0, 0, 14209, 14213, 14216, 14219, - 14222, 14225, 14228, 14231, 14234, 14237, 0, 0, 0, 0, 0, 0, 0, 0, 14240, - 14253, 14265, 14277, 14289, 14301, 14313, 14325, 0, 0, 14329, 14333, 0, - 14337, 14340, 14344, 14347, 14351, 14354, 14358, 14362, 0, 14366, 14369, - 14373, 0, 14377, 14380, 14384, 14388, 14391, 14395, 14399, 14403, 14407, - 14411, 14415, 14419, 14423, 14427, 14431, 14435, 14439, 14443, 14447, - 14451, 14455, 14459, 14463, 0, 14466, 14469, 14473, 14477, 14481, 14484, - 14487, 14490, 14494, 14498, 0, 14502, 14506, 14510, 14514, 14518, 0, 0, - 14521, 14525, 14529, 14534, 14538, 14543, 14547, 14552, 14557, 0, 14563, - 14567, 14572, 0, 14577, 14581, 14586, 14591, 0, 0, 0, 0, 0, 0, 0, 14595, - 14599, 0, 0, 0, 0, 0, 0, 0, 14605, 0, 14609, 14614, 14619, 14624, 0, 0, - 14630, 14634, 14637, 14640, 14643, 14646, 14649, 14652, 14655, 14658, 0, - 14661, 14665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14669, 14673, - 0, 14677, 14680, 14684, 14687, 14691, 14694, 14698, 14702, 0, 14706, - 14709, 14713, 0, 14717, 14720, 14724, 14728, 14731, 14735, 14739, 14743, - 14747, 14751, 14755, 14759, 14763, 14767, 14771, 14775, 14779, 14783, - 14787, 14791, 14795, 14799, 14803, 0, 14806, 14809, 14813, 14817, 14821, - 14824, 14827, 14830, 14834, 14838, 14842, 14846, 14850, 14854, 14858, - 14862, 0, 0, 0, 14865, 14869, 14874, 14878, 14883, 14887, 14892, 14897, - 0, 14903, 14907, 14912, 0, 14917, 14921, 14926, 14931, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 14935, 0, 0, 0, 0, 0, 0, 0, 0, 14941, 14946, 14951, 14956, 0, 0, - 14962, 14966, 14969, 14972, 14975, 14978, 14981, 14984, 14987, 14990, - 14993, 14997, 15002, 15007, 15013, 15019, 0, 0, 0, 15025, 15029, 15035, - 15040, 15046, 15051, 15057, 0, 0, 15063, 15067, 0, 15071, 15075, 15079, - 15083, 15087, 15091, 15095, 15099, 15103, 15107, 15111, 15115, 15119, - 15123, 15127, 15131, 15135, 15139, 0, 0, 0, 15143, 15149, 15155, 15161, - 15167, 15173, 15179, 15185, 15191, 15197, 15203, 15209, 15217, 15223, - 15229, 15235, 15241, 15247, 15253, 15259, 15265, 15271, 15277, 15283, 0, - 15289, 15295, 15301, 15307, 15313, 15319, 15323, 15329, 15333, 0, 15337, - 0, 0, 15343, 15347, 15353, 15359, 15365, 15369, 15375, 0, 0, 0, 15379, 0, - 0, 0, 0, 15383, 15388, 15395, 15402, 15409, 15416, 0, 15423, 0, 15430, - 15435, 15440, 15447, 15454, 15463, 15474, 15483, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15488, 15495, 15502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15507, 15513, 15519, 15525, 15531, 15537, 15543, 15549, - 15555, 15561, 15567, 15573, 15579, 15585, 15591, 15596, 15602, 15608, - 15614, 15620, 15626, 15631, 15637, 15643, 15649, 15655, 15661, 15667, - 15673, 15679, 15685, 15691, 15697, 15702, 15708, 15714, 15718, 15724, - 15728, 15734, 15740, 15746, 15752, 15758, 15764, 15769, 15775, 15779, - 15784, 15790, 15796, 15802, 15807, 15813, 15819, 15825, 15830, 15836, 0, - 0, 0, 0, 15840, 15846, 15851, 15857, 15862, 15870, 15878, 15882, 15886, - 15890, 15896, 15902, 15908, 15914, 15918, 15922, 15926, 15930, 15934, - 15937, 15940, 15943, 15946, 15949, 15952, 15955, 15958, 15961, 15965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15969, 15973, 0, 15979, 0, 0, 15985, - 15989, 0, 15993, 0, 0, 15999, 0, 0, 0, 0, 0, 0, 16003, 16007, 16010, - 16016, 0, 16022, 16026, 16030, 16034, 16040, 16046, 16052, 0, 16058, - 16062, 16066, 0, 16072, 0, 16078, 0, 0, 16082, 16088, 0, 16094, 16097, - 16103, 16106, 16110, 16117, 16122, 16127, 16131, 16136, 16141, 16146, - 16150, 0, 16155, 16162, 16168, 0, 0, 16174, 16178, 16183, 16187, 16192, - 0, 16197, 0, 16202, 16208, 16214, 16220, 16226, 16230, 0, 0, 16233, - 16237, 16240, 16243, 16246, 16249, 16252, 16255, 16258, 16261, 0, 0, - 16264, 16269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16274, 16278, 16289, 16304, - 16319, 16329, 16340, 16353, 16364, 16370, 16378, 16388, 16394, 16402, - 16406, 16412, 16418, 16426, 16436, 16444, 16457, 16463, 16471, 16479, - 16491, 16498, 16506, 16514, 16522, 16530, 16538, 16546, 16556, 16560, - 16563, 16566, 16569, 16572, 16575, 16578, 16581, 16584, 16587, 16591, - 16595, 16599, 16603, 16607, 16611, 16615, 16619, 16623, 16628, 16634, - 16644, 16658, 16668, 16674, 16680, 16688, 16696, 16704, 16712, 16718, - 16724, 16727, 16731, 16735, 16739, 16743, 16747, 16751, 0, 16755, 16759, - 16763, 16767, 16771, 16775, 16779, 16783, 16787, 16791, 16795, 16798, - 16801, 16805, 16809, 16813, 16816, 16820, 16824, 16828, 16832, 16836, - 16840, 16844, 16848, 16851, 16854, 16858, 16862, 16866, 16870, 16873, - 16876, 16880, 16885, 16889, 0, 0, 0, 0, 16893, 16898, 16902, 16907, - 16911, 16916, 16921, 16927, 16932, 16938, 16942, 16947, 16951, 16956, - 16966, 16972, 16977, 16983, 16993, 16999, 17003, 17007, 17013, 17019, - 17027, 17033, 17041, 0, 0, 0, 0, 17049, 17054, 17060, 17066, 17072, - 17078, 17084, 17090, 0, 17096, 17102, 17108, 17114, 17120, 17126, 17132, - 17138, 17144, 17150, 17156, 17161, 17166, 17172, 17178, 17184, 17189, - 17195, 17201, 17207, 17213, 17219, 17225, 17231, 17237, 17242, 17247, - 17253, 17259, 17265, 17271, 17276, 17281, 17287, 17295, 17302, 0, 17309, - 17316, 17329, 17336, 17343, 17351, 17359, 17365, 17371, 17377, 17387, - 17392, 17398, 17408, 17418, 0, 17428, 17438, 17446, 17458, 17470, 17476, - 17490, 17505, 17510, 17515, 17523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17531, 17534, 17538, 17542, 17546, 17550, 17554, 17558, 17562, - 17566, 17570, 17574, 17578, 17582, 17586, 17590, 17594, 17598, 17602, - 17606, 17610, 17613, 17616, 17620, 17624, 17628, 17631, 17634, 17637, - 17641, 17645, 17649, 17652, 17656, 17659, 17664, 17667, 17671, 17674, - 17678, 17681, 17686, 17689, 17693, 17700, 17705, 17709, 17714, 17718, - 17723, 17727, 17732, 17739, 17745, 17750, 17754, 17758, 17762, 17766, - 17770, 17776, 17782, 17789, 17795, 17801, 17805, 17808, 17811, 17814, - 17817, 17820, 17823, 17826, 17829, 17832, 17838, 17842, 17846, 17850, - 17854, 17858, 17862, 17866, 17870, 17875, 17879, 17884, 17889, 17895, - 17900, 17906, 17912, 17918, 17924, 17930, 17938, 17946, 17955, 17963, - 17972, 17981, 17992, 18002, 18012, 18023, 18034, 18044, 18054, 18064, - 18074, 18084, 18094, 18104, 18114, 18122, 18129, 18135, 18142, 18147, - 18153, 18159, 18165, 18171, 18177, 18183, 18188, 18194, 18200, 18206, - 18212, 18217, 18226, 18233, 18239, 18246, 18254, 18260, 18266, 18272, - 18278, 18286, 18294, 18304, 18312, 18320, 18326, 18331, 18336, 18341, - 18346, 18351, 18356, 18361, 18366, 18371, 18377, 18383, 18389, 18396, - 18401, 18407, 18412, 18417, 18422, 18427, 18432, 18437, 18442, 18447, - 18452, 18457, 18462, 18467, 18472, 18477, 18482, 18487, 18492, 18497, - 18502, 18507, 18512, 18517, 18522, 18527, 18532, 18537, 18542, 18547, - 18552, 18557, 18562, 18567, 18572, 18577, 18582, 18587, 18592, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 18597, 18601, 18605, 18609, 18613, 18617, 18621, - 18625, 18629, 18633, 18637, 18641, 18645, 18649, 18653, 18657, 18661, - 18665, 18669, 18673, 18677, 18681, 18685, 18689, 18693, 18697, 18701, - 18705, 18709, 18713, 18717, 18721, 18725, 18729, 18733, 18737, 18741, - 18745, 18749, 18753, 18757, 18761, 18766, 18770, 18775, 0, 0, 0, 18780, - 18784, 18788, 18792, 18796, 18800, 18804, 18808, 18812, 18816, 18820, - 18824, 18828, 18832, 18836, 18840, 18844, 18848, 18852, 18856, 18860, - 18864, 18868, 18872, 18876, 18880, 18884, 18888, 18892, 18896, 18900, - 18904, 18908, 18912, 18916, 18920, 18924, 18928, 18932, 18936, 18940, - 18944, 18948, 18952, 18956, 18960, 18964, 18968, 18972, 18976, 18980, - 18984, 18988, 18992, 18996, 19000, 19004, 19008, 19012, 19016, 19020, - 19024, 19028, 19032, 19036, 19040, 19044, 19048, 19052, 19056, 19060, - 19064, 19068, 19072, 19076, 19080, 19084, 19088, 19092, 19096, 19100, - 19104, 19108, 19112, 19116, 19120, 19124, 19128, 19132, 19136, 19140, - 19144, 19148, 19152, 19156, 19160, 19164, 19168, 19171, 19175, 19178, - 19182, 19186, 19189, 19193, 19197, 19200, 19204, 19208, 19212, 19216, - 19219, 19223, 19227, 19231, 19235, 19239, 19243, 19246, 19250, 19254, - 19258, 19262, 19266, 19270, 19274, 19278, 19282, 19286, 19290, 19294, - 19298, 19302, 19306, 19310, 19314, 19318, 19322, 19326, 19330, 19334, - 19338, 19342, 19346, 19350, 19354, 19358, 19362, 19366, 19370, 19374, - 19378, 19382, 19386, 19390, 19394, 19398, 19402, 19406, 19410, 19414, - 19418, 19422, 19426, 19430, 19434, 19438, 19442, 19446, 19450, 19454, - 19458, 19462, 19466, 19470, 19474, 19478, 19482, 19486, 19490, 19494, - 19498, 19502, 19506, 19510, 19514, 19518, 19522, 19526, 19530, 19534, - 19538, 19542, 19546, 19550, 19554, 19558, 19562, 19566, 19570, 19574, - 19578, 19582, 19586, 19590, 19594, 19598, 19602, 19606, 19610, 19614, - 19618, 19622, 19626, 19630, 19634, 19638, 19642, 19646, 19650, 19654, - 19658, 19662, 19666, 19670, 19674, 19678, 19682, 19686, 19690, 19694, - 19698, 19702, 19706, 19710, 19714, 19718, 19722, 19726, 19730, 19734, - 19738, 19742, 19746, 19750, 19754, 19758, 19762, 19766, 19770, 19774, - 19778, 19782, 19786, 19790, 19794, 19798, 19801, 19805, 19809, 19813, - 19817, 19821, 19825, 19829, 19833, 19837, 19841, 19845, 19849, 19853, - 19857, 19861, 19865, 19869, 19873, 19877, 19881, 19885, 19889, 19893, - 19896, 19900, 19904, 19908, 19912, 19916, 19920, 19924, 19928, 19932, - 19936, 19940, 19944, 19948, 19952, 19956, 19959, 19963, 19967, 19971, - 19975, 19979, 19983, 19987, 19991, 19995, 19999, 20003, 20007, 20011, - 20015, 20019, 20023, 20027, 20031, 20035, 20039, 20043, 20047, 20051, - 20055, 20059, 20063, 20067, 20071, 20075, 20079, 20083, 0, 20087, 20091, - 20095, 20099, 0, 0, 20103, 20107, 20111, 20115, 20119, 20123, 20127, 0, - 20131, 0, 20135, 20139, 20143, 20147, 0, 0, 20151, 20155, 20159, 20163, - 20167, 20171, 20175, 20179, 20183, 20187, 20191, 20195, 20199, 20203, - 20207, 20211, 20215, 20219, 20223, 20227, 20231, 20235, 20239, 20242, - 20246, 20250, 20254, 20258, 20262, 20266, 20270, 20274, 20278, 20282, - 20286, 20290, 20294, 20298, 20302, 20306, 20310, 0, 20314, 20318, 20322, - 20326, 0, 0, 20330, 20333, 20337, 20341, 20345, 20349, 20353, 20357, - 20361, 20365, 20369, 20373, 20377, 20381, 20385, 20389, 20393, 20398, - 20403, 20408, 20414, 20420, 20425, 20430, 20436, 20439, 20443, 20447, - 20451, 20455, 20459, 20463, 20467, 0, 20471, 20475, 20479, 20483, 0, 0, - 20487, 20491, 20495, 20499, 20503, 20507, 20511, 0, 20515, 0, 20519, - 20523, 20527, 20531, 0, 0, 20535, 20539, 20543, 20547, 20551, 20555, - 20559, 20563, 20567, 20572, 20577, 20582, 20588, 20594, 20599, 0, 20604, - 20608, 20612, 20616, 20620, 20624, 20628, 20632, 20636, 20640, 20644, - 20648, 20652, 20656, 20660, 20664, 20668, 20671, 20675, 20679, 20683, - 20687, 20691, 20695, 20699, 20703, 20707, 20711, 20715, 20719, 20723, - 20727, 20731, 20735, 20739, 20743, 20747, 20751, 20755, 20759, 20763, - 20767, 20771, 20775, 20779, 20783, 20787, 20791, 20795, 20799, 20803, - 20807, 20811, 20815, 20819, 20823, 20827, 0, 20831, 20835, 20839, 20843, - 0, 0, 20847, 20851, 20855, 20859, 20863, 20867, 20871, 20875, 20879, - 20883, 20887, 20891, 20895, 20899, 20903, 20907, 20911, 20915, 20919, - 20923, 20927, 20931, 20935, 20939, 20943, 20947, 20951, 20955, 20959, - 20963, 20967, 20971, 20975, 20979, 20983, 20987, 20991, 20995, 20999, - 21003, 21007, 21011, 21015, 21019, 21023, 21027, 21031, 21035, 21039, - 21043, 21047, 21051, 21055, 21059, 21063, 21067, 21071, 21074, 21078, - 21082, 21086, 21090, 21094, 21098, 21102, 21106, 21110, 0, 0, 0, 0, - 21114, 21119, 21123, 21126, 21131, 21134, 21137, 21140, 21145, 21149, - 21154, 21157, 21160, 21163, 21166, 21169, 21172, 21175, 21178, 21181, - 21185, 21189, 21193, 21197, 21201, 21205, 21209, 21213, 21217, 21221, 0, - 0, 0, 21227, 21233, 21237, 21241, 21245, 21251, 21255, 21259, 21263, - 21269, 21273, 21277, 21281, 21287, 21291, 21295, 21299, 21305, 21311, - 21317, 21325, 21331, 21337, 21343, 21349, 21355, 0, 0, 0, 0, 0, 0, 21361, - 21364, 21367, 21370, 21373, 21376, 21380, 21384, 21387, 21391, 21395, - 21399, 21403, 21407, 21410, 21414, 21418, 21422, 21426, 21430, 21434, - 21438, 21442, 21446, 21450, 21454, 21457, 21461, 21465, 21469, 21473, - 21476, 21480, 21484, 21488, 21492, 21496, 21500, 21504, 21508, 21512, - 21516, 21520, 21524, 21528, 21532, 21535, 21539, 21543, 21547, 21551, - 21555, 21559, 21563, 21567, 21571, 21575, 21579, 21583, 21587, 21591, - 21595, 21599, 21603, 21607, 21611, 21615, 21619, 21623, 21627, 21631, - 21635, 21639, 21643, 21647, 21651, 21655, 21659, 21663, 21667, 21670, - 21674, 21678, 21682, 21686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21690, - 21694, 21697, 21701, 21704, 21708, 21711, 21715, 21721, 21726, 21730, - 21733, 21737, 21741, 21746, 21750, 21755, 21759, 21764, 21768, 21773, - 21777, 21782, 21788, 21792, 21797, 21801, 21806, 21812, 21816, 21822, - 21828, 21832, 21837, 21845, 21853, 21860, 21865, 21870, 21879, 21886, - 21893, 21898, 21904, 21908, 21912, 21916, 21920, 21924, 21928, 21932, - 21936, 21940, 21944, 21950, 21955, 21960, 21963, 21967, 21971, 21976, - 21980, 21985, 21989, 21994, 21998, 22003, 22007, 22012, 22016, 22021, - 22025, 22030, 22036, 22040, 22045, 22050, 22054, 22058, 22062, 22066, - 22069, 22073, 22079, 22084, 22089, 22093, 22097, 22101, 22106, 22110, - 22115, 22119, 22124, 22127, 22131, 22135, 22140, 22144, 22149, 22153, - 22158, 22164, 22168, 22172, 22176, 22180, 22184, 22188, 22192, 22196, - 22200, 22204, 22208, 22214, 22217, 22221, 22225, 22230, 22234, 22239, - 22243, 22248, 22252, 22257, 22261, 22266, 22270, 22275, 22279, 22284, - 22290, 22294, 22298, 22304, 22310, 22316, 22322, 22326, 22330, 22334, - 22338, 22342, 22346, 22352, 22356, 22360, 22364, 22369, 22373, 22378, - 22382, 22387, 22391, 22396, 22400, 22405, 22409, 22414, 22418, 22423, - 22429, 22433, 22439, 22443, 22447, 22451, 22455, 22459, 22463, 22469, - 22472, 22476, 22480, 22485, 22489, 22494, 22498, 22503, 22507, 22512, - 22516, 22521, 22525, 22530, 22534, 22539, 22545, 22548, 22552, 22556, - 22561, 22566, 22570, 22574, 22578, 22582, 22586, 22590, 22596, 22599, - 22603, 22607, 22612, 22616, 22621, 22625, 22630, 22636, 22639, 22644, - 22648, 22652, 22656, 22660, 22664, 22668, 22672, 22678, 22682, 22686, - 22690, 22695, 22699, 22704, 22708, 22713, 22717, 22722, 22726, 22731, - 22735, 22740, 22744, 22749, 22752, 22756, 22760, 22764, 22768, 22772, - 22776, 22780, 22784, 22790, 22794, 22798, 22802, 22807, 22811, 22816, - 22820, 22825, 22829, 22834, 22838, 22843, 22847, 22852, 22856, 22861, - 22867, 22870, 22875, 22879, 22884, 22890, 22896, 22902, 22908, 22914, - 22920, 22926, 22930, 22934, 22938, 22942, 22946, 22950, 22954, 22958, - 22963, 22967, 22972, 22976, 22981, 22985, 22990, 22994, 22999, 23003, - 23008, 23012, 23017, 23021, 23025, 23029, 23033, 23037, 23041, 23045, - 23051, 23054, 23058, 23062, 23067, 23071, 23076, 23080, 23085, 23089, - 23094, 23098, 23103, 23107, 23112, 23116, 23121, 23127, 23131, 23137, - 23142, 23148, 23152, 23158, 23163, 23167, 23171, 23175, 23179, 23183, - 23188, 23191, 23195, 23200, 23204, 23209, 23212, 23216, 23220, 23224, - 23228, 23232, 23236, 23240, 23244, 23248, 23252, 23256, 23261, 23265, - 23269, 23275, 23279, 23285, 23289, 23295, 23299, 23303, 23307, 23311, - 23315, 23320, 23324, 23328, 23332, 23336, 23340, 23344, 23348, 23352, - 23356, 23360, 23366, 23372, 23378, 23384, 23390, 23395, 23401, 23407, - 23413, 23417, 23421, 23425, 23429, 23433, 23437, 23441, 23445, 23449, - 23453, 23457, 23461, 23465, 23470, 23475, 23480, 23484, 23488, 23492, - 23496, 23500, 23504, 23508, 23512, 23516, 23520, 23526, 23532, 23538, - 23544, 23550, 23556, 23562, 23568, 23574, 23578, 23582, 23586, 23590, - 23594, 23598, 23602, 23608, 23614, 23620, 23626, 23632, 23638, 23644, - 23650, 23656, 23661, 23666, 23671, 23676, 23682, 23688, 23694, 23700, - 23706, 23712, 23718, 23723, 23729, 23735, 23741, 23746, 23752, 23758, - 23764, 23769, 23774, 23779, 23784, 23789, 23794, 23799, 23804, 23809, - 23814, 23819, 23824, 23828, 23833, 23838, 23843, 23848, 23853, 23858, - 23863, 23868, 23873, 23878, 23883, 23888, 23893, 23898, 23903, 23908, - 23913, 23918, 23923, 23928, 23933, 23938, 23943, 23948, 23953, 23958, - 23963, 23968, 23973, 23977, 23982, 23987, 23992, 23997, 24002, 24007, - 24012, 24017, 24022, 24027, 24032, 24037, 24042, 24047, 24052, 24057, - 24062, 24067, 24072, 24077, 24082, 24087, 24092, 24097, 24102, 24106, - 24111, 24116, 24121, 24126, 24131, 24135, 24140, 24145, 24150, 24155, - 24160, 24164, 24169, 24175, 24180, 24185, 24190, 24195, 24201, 24206, - 24211, 24216, 24221, 24226, 24231, 24236, 24241, 24246, 24251, 24256, - 24261, 24266, 24271, 24276, 24281, 24286, 24291, 24296, 24301, 24306, - 24311, 24316, 24321, 24326, 24331, 24336, 24341, 24346, 24351, 24356, - 24361, 24366, 24371, 24376, 24381, 24386, 24391, 24396, 24401, 24406, - 24411, 24416, 24421, 24427, 24432, 24437, 24442, 24447, 24452, 24457, - 24462, 24467, 24472, 24477, 24482, 24487, 24492, 24497, 24502, 24507, - 24512, 24517, 24522, 24527, 24532, 24537, 24542, 24547, 24552, 24557, - 24562, 24567, 24572, 24577, 24582, 24587, 24592, 24597, 24602, 24607, - 24612, 24617, 24623, 24627, 24631, 24635, 24639, 24643, 24647, 24651, - 24655, 24661, 24667, 24673, 24679, 24685, 24691, 24697, 24704, 24710, - 24715, 24720, 24725, 24730, 24735, 24740, 24745, 24750, 24755, 24760, - 24765, 24770, 24775, 24780, 24785, 24790, 24795, 24800, 24805, 24810, - 24815, 24820, 24825, 24830, 24835, 24840, 24845, 24850, 0, 0, 0, 24856, - 24866, 24870, 24877, 24881, 24885, 24889, 24897, 24901, 24906, 24911, - 24916, 24920, 24925, 24930, 24933, 24937, 24941, 24950, 24954, 24958, - 24964, 24968, 24972, 24980, 24984, 24992, 24998, 25004, 25010, 25016, - 25025, 25030, 25034, 25043, 25046, 25052, 25056, 25062, 25067, 25073, - 25081, 25087, 25092, 25099, 25104, 25108, 25112, 25122, 25128, 25132, - 25142, 25148, 25152, 25156, 25163, 25170, 25175, 25180, 25189, 25193, - 25197, 25201, 25209, 25216, 25220, 25224, 25228, 25232, 25236, 25240, - 25244, 25248, 25252, 25256, 25260, 25265, 25270, 25275, 25279, 25283, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25287, 25291, 25295, 25299, - 25303, 25308, 25313, 25318, 25323, 25327, 25331, 25336, 25340, 0, 25344, - 25349, 25354, 25359, 25363, 25368, 25373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 25378, 25382, 25386, 25390, 25394, 25399, 25404, 25409, 25414, 25418, - 25422, 25427, 25431, 25435, 25439, 25444, 25449, 25454, 25458, 25463, - 25468, 25473, 25479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25484, 25488, 25492, - 25496, 25500, 25505, 25510, 25515, 25520, 25524, 25528, 25533, 25537, - 25541, 25545, 25550, 25555, 25560, 25564, 25569, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25574, 25578, 25582, 25586, 25590, 25595, 25600, 25605, - 25610, 25614, 25618, 25623, 25627, 0, 25631, 25636, 25641, 0, 25646, - 25651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25656, 25659, 25663, 25667, - 25671, 25675, 25679, 25683, 25687, 25691, 25695, 25699, 25703, 25707, - 25711, 25715, 25719, 25723, 25726, 25730, 25734, 25738, 25742, 25746, - 25750, 25754, 25758, 25762, 25766, 25770, 25774, 25778, 25782, 25785, - 25789, 25793, 25799, 25805, 25811, 25817, 25823, 25829, 25835, 25841, - 25847, 25853, 25859, 25865, 25871, 25877, 25886, 25895, 25901, 25907, - 25913, 25918, 25922, 25927, 25932, 25937, 25941, 25946, 25951, 25956, - 25960, 25965, 25969, 25974, 25979, 25984, 25989, 25993, 25997, 26001, - 26005, 26009, 26013, 26017, 26021, 26025, 26029, 26035, 26039, 26043, - 26047, 26051, 26055, 26063, 26069, 26073, 26079, 26083, 26089, 26093, 0, - 0, 26097, 26101, 26104, 26107, 26110, 26113, 26116, 26119, 26122, 26125, - 0, 0, 0, 0, 0, 0, 26128, 26136, 26144, 26152, 26160, 26168, 26176, 26184, - 26192, 26200, 0, 0, 0, 0, 0, 0, 26208, 26211, 26214, 26217, 26222, 26225, - 26230, 26237, 26245, 26250, 26257, 26260, 26267, 26274, 26281, 0, 26285, - 26289, 26292, 26295, 26298, 26301, 26304, 26307, 26310, 26313, 0, 0, 0, - 0, 0, 0, 26316, 26319, 26322, 26325, 26328, 26331, 26335, 26339, 26343, - 26346, 26350, 26354, 26357, 26361, 26365, 26368, 26372, 26376, 26380, - 26384, 26388, 26392, 26396, 26399, 26402, 26406, 26410, 26413, 26417, - 26421, 26425, 26429, 26433, 26437, 26441, 26445, 26452, 26457, 26462, - 26467, 26472, 26478, 26484, 26490, 26496, 26501, 26507, 26513, 26518, - 26524, 26530, 26536, 26542, 26548, 26553, 26559, 26564, 26570, 26576, - 26582, 26588, 26594, 26599, 26604, 26610, 26616, 26621, 26627, 26632, - 26638, 26643, 26648, 26654, 26660, 26666, 26672, 26678, 26684, 26690, - 26696, 26702, 26708, 26714, 26720, 26725, 26730, 26735, 26741, 0, 0, 0, - 0, 0, 0, 0, 0, 26747, 26756, 26765, 26773, 26781, 26791, 26799, 26808, - 26815, 26822, 26829, 26837, 26845, 26853, 26861, 26869, 26877, 26885, - 26893, 26900, 26908, 26916, 26924, 26932, 26940, 26950, 26960, 26970, - 26980, 26990, 27000, 27010, 27020, 27030, 27040, 27050, 27060, 27070, - 27080, 27088, 27096, 27106, 27114, 0, 0, 0, 0, 0, 27124, 27128, 27132, - 27136, 27140, 27144, 27148, 27152, 27156, 27160, 27164, 27168, 27172, - 27176, 27180, 27184, 27188, 27192, 27196, 27200, 27204, 27208, 27212, - 27216, 27222, 27226, 27232, 27236, 27242, 27246, 27252, 27256, 27260, - 27264, 27268, 27272, 27276, 27282, 27288, 27294, 27300, 27305, 27310, - 27315, 27321, 27327, 27333, 27339, 27346, 27352, 27357, 27362, 27366, - 27370, 27374, 27378, 27382, 27386, 27390, 27396, 27402, 27408, 27413, - 27420, 27425, 27430, 27436, 27441, 27448, 27455, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 27461, 27466, 27469, 27473, 27477, 27481, 27485, 27489, 27493, - 27497, 27501, 27505, 27509, 27513, 27517, 27521, 27524, 27527, 27531, - 27535, 27539, 27542, 27545, 27548, 27552, 27556, 27560, 27564, 27568, 0, - 0, 0, 27571, 27575, 27579, 27583, 27588, 27593, 27598, 27603, 27607, - 27611, 27616, 27621, 0, 0, 0, 0, 27627, 27631, 27636, 27641, 27646, - 27650, 27654, 27658, 27662, 27667, 27671, 27675, 0, 0, 0, 0, 27679, 0, 0, - 0, 27683, 27687, 27691, 27695, 27698, 27701, 27704, 27707, 27710, 27713, - 27716, 27719, 27722, 27727, 27733, 27739, 27745, 27751, 27756, 27762, - 27768, 27774, 27779, 27785, 27790, 27796, 27802, 27807, 27813, 27819, - 27825, 27830, 27835, 27840, 27846, 27852, 27857, 27863, 27868, 27874, - 27879, 27885, 0, 0, 27891, 27897, 27903, 27909, 27915, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 27921, 27928, 27935, 27941, 27948, 27955, 27961, 27968, - 27975, 27982, 27989, 27995, 28002, 28009, 28015, 28022, 28029, 28035, - 28042, 28049, 28055, 28061, 28068, 28074, 28080, 28087, 28093, 28100, - 28107, 28114, 28121, 28128, 28135, 28141, 28148, 28155, 28161, 28168, - 28175, 28182, 28189, 28196, 28203, 28210, 0, 0, 0, 0, 28217, 28225, - 28232, 28239, 28245, 28252, 28258, 28265, 28271, 28278, 28285, 28292, - 28299, 28306, 28313, 28320, 28327, 28334, 28341, 28348, 28354, 28360, - 28367, 28374, 28381, 28387, 0, 0, 0, 0, 0, 0, 28393, 28399, 28404, 28409, - 28414, 28419, 28424, 28429, 28434, 28439, 28444, 0, 0, 0, 28450, 28456, - 28462, 28466, 28472, 28478, 28484, 28490, 28496, 28502, 28508, 28514, - 28520, 28526, 28532, 28538, 28544, 28550, 28556, 28560, 28566, 28572, - 28578, 28584, 28590, 28596, 28602, 28608, 28614, 28620, 28626, 28632, - 28638, 28644, 28650, 28654, 28659, 28664, 28669, 28673, 28678, 28682, - 28687, 28692, 28697, 28701, 28706, 28711, 28716, 28721, 28726, 28730, - 28734, 28739, 28744, 28749, 28753, 28757, 28762, 28767, 28772, 28777, 0, - 0, 28783, 28787, 28794, 28799, 28805, 28811, 28816, 28822, 28828, 28833, - 28839, 28845, 28851, 28857, 28863, 28868, 28873, 28879, 28884, 28890, - 28895, 28901, 28907, 28913, 28919, 28923, 28928, 28933, 28939, 28945, - 28950, 28956, 28962, 28966, 28971, 28976, 28980, 28985, 28990, 28995, - 29000, 29006, 29012, 29018, 29023, 29028, 29032, 29037, 29041, 29046, - 29050, 29055, 29060, 29065, 29070, 29077, 29084, 29092, 29103, 29112, - 29120, 29127, 29138, 29144, 29151, 0, 29158, 29163, 29168, 29176, 29182, - 29190, 29195, 29201, 29207, 29213, 29218, 29224, 29229, 29236, 29242, - 29247, 29253, 29259, 29265, 29272, 29279, 29286, 29291, 29296, 29303, - 29310, 29317, 29324, 29331, 0, 0, 29338, 29345, 29352, 29358, 29364, - 29370, 29376, 29382, 29388, 29394, 29400, 0, 0, 0, 0, 0, 0, 29406, 29412, - 29417, 29422, 29427, 29432, 29437, 29442, 29447, 29452, 0, 0, 0, 0, 0, 0, - 29457, 29462, 29467, 29472, 29477, 29482, 29487, 29495, 29502, 29507, - 29512, 29517, 29522, 29527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12077, 12083, + 12087, 12091, 12095, 12100, 12103, 12107, 12110, 12114, 12117, 12121, + 12125, 12129, 12134, 12139, 12142, 12146, 12151, 12156, 12159, 12163, + 12166, 12170, 12174, 12178, 12182, 12186, 12190, 12194, 12198, 12202, + 12206, 12210, 12214, 12218, 12222, 12226, 12230, 12234, 12238, 12241, + 12245, 12248, 12252, 12256, 12260, 12263, 12266, 12269, 12273, 12277, + 12281, 12285, 12289, 12293, 12297, 12301, 12304, 12309, 12314, 12318, + 12322, 12327, 12331, 12336, 12340, 12345, 12350, 12356, 12362, 12368, + 12372, 12377, 12383, 12389, 12393, 12398, 12402, 12408, 12413, 12416, + 12422, 12428, 12433, 12438, 12445, 12450, 12455, 12459, 12463, 12467, + 12471, 12475, 12479, 12483, 12487, 12492, 12497, 12502, 12508, 12511, + 12515, 12519, 12522, 12525, 12528, 12531, 12534, 12537, 12540, 12543, + 12546, 12550, 12557, 12562, 12566, 12570, 12574, 12578, 0, 12582, 12586, + 12590, 12594, 12598, 12604, 12608, 0, 12612, 12616, 12620, 0, 12624, + 12627, 12631, 12634, 12638, 12641, 12645, 12649, 0, 0, 12653, 12656, 0, + 0, 12660, 12663, 12667, 12670, 12674, 12678, 12682, 12686, 12690, 12694, + 12698, 12702, 12706, 12710, 12714, 12718, 12722, 12726, 12730, 12734, + 12738, 12742, 0, 12745, 12748, 12752, 12756, 12760, 12763, 12766, 0, + 12769, 0, 0, 0, 12773, 12777, 12781, 12785, 0, 0, 12788, 12792, 12796, + 12801, 12805, 12810, 12814, 12819, 12824, 0, 0, 12830, 12834, 0, 0, + 12839, 12843, 12848, 12852, 0, 0, 0, 0, 0, 0, 0, 0, 12858, 0, 0, 0, 0, + 12864, 12868, 0, 12872, 12876, 12881, 12886, 12891, 0, 0, 12897, 12901, + 12904, 12907, 12910, 12913, 12916, 12919, 12922, 12925, 12928, 12937, + 12946, 12950, 12954, 12960, 12966, 12972, 12978, 12992, 12999, 13002, 0, + 0, 0, 0, 0, 13006, 13012, 13016, 0, 13020, 13023, 13027, 13030, 13034, + 13037, 0, 0, 0, 0, 13041, 13045, 0, 0, 13049, 13053, 13057, 13060, 13064, + 13068, 13072, 13076, 13080, 13084, 13088, 13092, 13096, 13100, 13104, + 13108, 13112, 13116, 13120, 13124, 13128, 13132, 0, 13135, 13138, 13142, + 13146, 13150, 13153, 13156, 0, 13159, 13163, 0, 13167, 13171, 0, 13175, + 13179, 0, 0, 13182, 0, 13186, 13191, 13195, 13200, 13204, 0, 0, 0, 0, + 13209, 13214, 0, 0, 13219, 13224, 13229, 0, 0, 0, 13233, 0, 0, 0, 0, 0, + 0, 0, 13237, 13241, 13245, 13249, 0, 13253, 0, 0, 0, 0, 0, 0, 0, 13257, + 13261, 13264, 13267, 13270, 13273, 13276, 13279, 13282, 13285, 13288, + 13291, 13294, 13297, 13300, 13305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13309, 13313, 13317, 0, 13321, 13324, 13328, 13331, 13335, 13338, 13342, + 13346, 13350, 0, 13355, 13358, 13362, 0, 13367, 13370, 13374, 13377, + 13381, 13385, 13389, 13393, 13397, 13401, 13405, 13409, 13413, 13417, + 13421, 13425, 13429, 13433, 13437, 13441, 13445, 13449, 0, 13452, 13455, + 13459, 13463, 13467, 13470, 13473, 0, 13476, 13480, 0, 13484, 13488, + 13492, 13496, 13500, 0, 0, 13503, 13507, 13511, 13516, 13520, 13525, + 13529, 13534, 13539, 13545, 0, 13551, 13555, 13560, 0, 13566, 13570, + 13575, 0, 0, 13579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13582, + 13587, 13592, 13597, 0, 0, 13603, 13607, 13610, 13613, 13616, 13619, + 13622, 13625, 13628, 13631, 0, 13634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13638, 13642, 13646, 0, 13650, 13653, 13657, 13660, 13664, + 13667, 13671, 13675, 0, 0, 13679, 13682, 0, 0, 13686, 13689, 13693, + 13696, 13700, 13704, 13708, 13712, 13716, 13720, 13724, 13728, 13732, + 13736, 13740, 13744, 13748, 13752, 13756, 13760, 13764, 13768, 0, 13771, + 13774, 13778, 13782, 13786, 13789, 13792, 0, 13795, 13799, 0, 13803, + 13807, 13811, 13815, 13819, 0, 0, 13822, 13826, 13830, 13835, 13839, + 13844, 13848, 13853, 13858, 0, 0, 13864, 13868, 0, 0, 13873, 13877, + 13882, 0, 0, 0, 0, 0, 0, 0, 0, 13886, 13892, 0, 0, 0, 0, 13898, 13902, 0, + 13906, 13910, 13915, 13920, 13925, 0, 0, 13931, 13935, 13938, 13941, + 13944, 13947, 13950, 13953, 13956, 13959, 13962, 13965, 13969, 13975, + 13981, 13987, 13993, 13999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14005, 14009, + 0, 14013, 14016, 14020, 14023, 14027, 14030, 0, 0, 0, 14034, 14037, + 14041, 0, 14045, 14048, 14052, 14056, 0, 0, 0, 14059, 14063, 0, 14067, 0, + 14071, 14075, 0, 0, 0, 14079, 14083, 0, 0, 0, 14087, 14090, 14094, 0, 0, + 0, 14097, 14100, 14103, 14106, 14110, 14114, 14118, 14122, 14126, 14130, + 14134, 14138, 0, 0, 0, 0, 14141, 14146, 14150, 14155, 14159, 0, 0, 0, + 14164, 14168, 14173, 0, 14178, 14182, 14187, 14192, 0, 0, 14196, 0, 0, 0, + 0, 0, 0, 14199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14205, 14209, + 14212, 14215, 14218, 14221, 14224, 14227, 14230, 14233, 14236, 14240, + 14245, 14250, 14254, 14258, 14262, 14266, 14270, 14275, 14279, 0, 0, 0, + 0, 0, 0, 14282, 14286, 14290, 0, 14294, 14297, 14301, 14304, 14308, + 14311, 14315, 14319, 0, 14323, 14326, 14330, 0, 14334, 14337, 14341, + 14345, 14348, 14352, 14356, 14360, 14364, 14368, 14372, 14376, 14380, + 14384, 14388, 14392, 14396, 14400, 14404, 14408, 14412, 14416, 14420, 0, + 14423, 14426, 14430, 14434, 14438, 14441, 14444, 14447, 14451, 14455, 0, + 14459, 14463, 14467, 14471, 14475, 0, 0, 0, 14478, 14482, 14487, 14491, + 14496, 14500, 14505, 14510, 0, 14516, 14520, 14525, 0, 14530, 14534, + 14539, 14544, 0, 0, 0, 0, 0, 0, 0, 14548, 14552, 0, 14558, 14562, 0, 0, + 0, 0, 0, 0, 14566, 14571, 14576, 14581, 0, 0, 14587, 14591, 14594, 14597, + 14600, 14603, 14606, 14609, 14612, 14615, 0, 0, 0, 0, 0, 0, 0, 0, 14618, + 14631, 14643, 14655, 14667, 14679, 14691, 14703, 0, 0, 14707, 14711, 0, + 14715, 14718, 14722, 14725, 14729, 14732, 14736, 14740, 0, 14744, 14747, + 14751, 0, 14755, 14758, 14762, 14766, 14769, 14773, 14777, 14781, 14785, + 14789, 14793, 14797, 14801, 14805, 14809, 14813, 14817, 14821, 14825, + 14829, 14833, 14837, 14841, 0, 14844, 14847, 14851, 14855, 14859, 14862, + 14865, 14868, 14872, 14876, 0, 14880, 14884, 14888, 14892, 14896, 0, 0, + 14899, 14903, 14907, 14912, 14916, 14921, 14925, 14930, 14935, 0, 14941, + 14945, 14950, 0, 14955, 14959, 14964, 14969, 0, 0, 0, 0, 0, 0, 0, 14973, + 14977, 0, 0, 0, 0, 0, 0, 0, 14983, 0, 14987, 14992, 14997, 15002, 0, 0, + 15008, 15012, 15015, 15018, 15021, 15024, 15027, 15030, 15033, 15036, 0, + 15039, 15043, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15047, 15051, + 0, 15055, 15058, 15062, 15065, 15069, 15072, 15076, 15080, 0, 15084, + 15087, 15091, 0, 15095, 15098, 15102, 15106, 15109, 15113, 15117, 15121, + 15125, 15129, 15133, 15137, 15141, 15145, 15149, 15153, 15157, 15161, + 15165, 15169, 15173, 15177, 15181, 15184, 15188, 15191, 15195, 15199, + 15203, 15206, 15209, 15212, 15216, 15220, 15224, 15228, 15232, 15236, + 15240, 15244, 15247, 0, 0, 15251, 15255, 15260, 15264, 15269, 15273, + 15278, 15283, 0, 15289, 15293, 15298, 0, 15303, 15307, 15312, 15317, + 15321, 0, 0, 0, 0, 0, 0, 0, 0, 15326, 0, 0, 0, 0, 0, 0, 0, 0, 15332, + 15337, 15342, 15347, 0, 0, 15353, 15357, 15360, 15363, 15366, 15369, + 15372, 15375, 15378, 15381, 15384, 15388, 15393, 15398, 15404, 15410, 0, + 0, 0, 15416, 15420, 15426, 15431, 15437, 15442, 15448, 0, 0, 15454, + 15458, 0, 15462, 15466, 15470, 15474, 15478, 15482, 15486, 15490, 15494, + 15498, 15502, 15506, 15510, 15514, 15518, 15522, 15526, 15530, 0, 0, 0, + 15534, 15540, 15546, 15552, 15558, 15564, 15570, 15576, 15582, 15588, + 15594, 15600, 15608, 15614, 15620, 15626, 15632, 15638, 15644, 15650, + 15656, 15662, 15668, 15674, 0, 15680, 15686, 15692, 15698, 15704, 15710, + 15714, 15720, 15724, 0, 15728, 0, 0, 15734, 15738, 15744, 15750, 15756, + 15760, 15766, 0, 0, 0, 15770, 0, 0, 0, 0, 15774, 15779, 15786, 15793, + 15800, 15807, 0, 15814, 0, 15821, 15826, 15831, 15838, 15845, 15854, + 15865, 15874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15879, 15886, 15893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15898, 15904, + 15910, 15916, 15922, 15928, 15934, 15940, 15946, 15952, 15958, 15964, + 15970, 15976, 15982, 15988, 15994, 16000, 16006, 16012, 16018, 16024, + 16030, 16036, 16042, 16048, 16054, 16060, 16066, 16072, 16078, 16084, + 16090, 16095, 16101, 16107, 16111, 16117, 16121, 16127, 16133, 16139, + 16145, 16151, 16157, 16162, 16168, 16172, 16177, 16183, 16189, 16195, + 16200, 16206, 16212, 16218, 16223, 16229, 0, 0, 0, 0, 16233, 16239, + 16244, 16250, 16255, 16263, 16271, 16275, 16279, 16283, 16289, 16295, + 16301, 16307, 16311, 16315, 16319, 16323, 16327, 16330, 16333, 16336, + 16339, 16342, 16345, 16348, 16351, 16354, 16358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16362, 16367, 0, 16374, 0, 0, 16381, 16386, 0, 16391, 0, + 0, 16398, 0, 0, 0, 0, 0, 0, 16403, 16408, 16412, 16419, 0, 16426, 16431, + 16436, 16441, 16448, 16455, 16462, 0, 16469, 16474, 16479, 0, 16486, 0, + 16493, 0, 0, 16498, 16505, 0, 16512, 16516, 16523, 16527, 16532, 16540, + 16546, 16552, 16557, 16563, 16569, 16575, 16580, 0, 16586, 16594, 16601, + 0, 0, 16608, 16613, 16619, 16624, 16630, 0, 16636, 0, 16642, 16649, + 16656, 16663, 16670, 16675, 0, 0, 16679, 16684, 16688, 16692, 16696, + 16700, 16704, 16708, 16712, 16716, 0, 0, 16720, 16726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29532, 29538, - 29544, 29548, 29552, 29556, 29560, 29566, 29570, 29576, 29580, 29586, - 29592, 29600, 29606, 29614, 29618, 29622, 29626, 29632, 29635, 29640, - 29644, 29650, 29654, 29658, 29664, 29668, 29674, 29678, 29684, 29692, - 29700, 29708, 29714, 29718, 29724, 29728, 29734, 29737, 29740, 29746, - 29750, 29756, 29759, 29762, 29765, 29769, 29773, 29779, 29785, 29789, - 29792, 29796, 29801, 29806, 29813, 29818, 29825, 29832, 29841, 29848, - 29857, 29862, 29869, 29876, 29885, 29890, 29897, 29902, 29908, 29914, - 29920, 29926, 29932, 29938, 0, 0, 0, 0, 29944, 29948, 29951, 29954, - 29957, 29960, 29963, 29966, 29969, 29972, 29975, 29978, 29981, 29984, - 29989, 29994, 29999, 30002, 30007, 30012, 30017, 30022, 30029, 30034, - 30039, 30044, 30049, 30056, 30062, 30068, 30074, 30080, 30086, 30095, - 30104, 30110, 30116, 30125, 30134, 30143, 30152, 30161, 30170, 30179, - 30188, 0, 0, 0, 30197, 30202, 30207, 30212, 30216, 30220, 30224, 30229, - 30233, 30237, 30242, 30246, 30251, 30256, 30261, 30266, 30271, 30276, - 30281, 30286, 30291, 30295, 30299, 30304, 30309, 30314, 30318, 30322, - 30326, 30331, 30336, 30341, 30346, 30350, 30357, 30364, 30371, 30377, - 30383, 30389, 30395, 30401, 30407, 0, 0, 0, 30412, 30417, 30422, 30427, - 30431, 30435, 30439, 30443, 30447, 30451, 30455, 30459, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 16732, 16736, 16747, 16762, 16777, 16787, 16798, 16811, + 16822, 16828, 16836, 16846, 16852, 16860, 16864, 16870, 16876, 16884, + 16894, 16902, 16915, 16921, 16929, 16937, 16949, 16956, 16964, 16972, + 16980, 16988, 16996, 17004, 17014, 17018, 17021, 17024, 17027, 17030, + 17033, 17036, 17039, 17042, 17045, 17049, 17053, 17057, 17061, 17065, + 17069, 17073, 17077, 17081, 17086, 17092, 17102, 17116, 17126, 17132, + 17138, 17146, 17154, 17162, 17170, 17176, 17182, 17185, 17189, 17193, + 17197, 17201, 17205, 17209, 0, 17213, 17217, 17221, 17225, 17229, 17233, + 17237, 17241, 17245, 17249, 17253, 17256, 17259, 17263, 17267, 17271, + 17274, 17278, 17282, 17286, 17290, 17294, 17298, 17302, 17306, 17309, + 17312, 17316, 17320, 17324, 17328, 17331, 17334, 17338, 17343, 17347, 0, + 0, 0, 0, 17351, 17356, 17360, 17365, 17369, 17374, 17379, 17385, 17390, + 17396, 17400, 17405, 17409, 17414, 17424, 17430, 17436, 17443, 17453, + 17459, 17463, 17467, 17473, 17479, 17487, 17493, 17501, 17509, 17517, + 17527, 17535, 17545, 17550, 17556, 17562, 17568, 17574, 17580, 17586, 0, + 17592, 17598, 17604, 17610, 17616, 17622, 17628, 17634, 17640, 17646, + 17652, 17657, 17662, 17668, 17674, 17680, 17685, 17691, 17697, 17703, + 17709, 17715, 17721, 17727, 17733, 17738, 17743, 17749, 17755, 17761, + 17767, 17772, 17777, 17783, 17791, 17798, 0, 17805, 17812, 17825, 17832, + 17839, 17847, 17855, 17861, 17867, 17873, 17883, 17888, 17894, 17904, + 17914, 0, 17924, 17934, 17942, 17954, 17966, 17972, 17986, 18001, 18006, + 18011, 18019, 18027, 18035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18043, + 18046, 18050, 18054, 18058, 18062, 18066, 18070, 18074, 18078, 18082, + 18086, 18090, 18094, 18098, 18102, 18106, 18110, 18114, 18118, 18122, + 18125, 18128, 18132, 18136, 18140, 18143, 18146, 18149, 18153, 18157, + 18161, 18164, 18168, 18171, 18176, 18179, 18183, 18186, 18190, 18193, + 18198, 18201, 18205, 18212, 18217, 18221, 18226, 18230, 18235, 18239, + 18244, 18251, 18257, 18262, 18266, 18270, 18274, 18278, 18282, 18288, + 18294, 18301, 18307, 18313, 18317, 18320, 18323, 18326, 18329, 18332, + 18335, 18338, 18341, 18344, 18350, 18354, 18358, 18362, 18366, 18370, + 18374, 18378, 18382, 18387, 18391, 18396, 18401, 18407, 18412, 18418, + 18424, 18430, 18436, 18442, 18450, 18458, 18467, 18475, 18484, 18493, + 18504, 18514, 18524, 18535, 18546, 18556, 18566, 18576, 18586, 18596, + 18606, 18616, 18626, 18634, 18641, 18647, 18654, 18659, 18665, 18671, + 18677, 18683, 18689, 18695, 18700, 18706, 18712, 18718, 18724, 18729, + 18738, 18745, 18751, 18758, 18766, 18772, 18778, 18784, 18790, 18798, + 18806, 18816, 18824, 18832, 18838, 18843, 18848, 18853, 18858, 18863, + 18868, 18873, 18878, 18883, 18889, 18895, 18901, 18908, 18913, 18919, + 18924, 18929, 18934, 18939, 18944, 18949, 18954, 18959, 18964, 18969, + 18974, 18979, 18984, 18989, 18994, 18999, 19004, 19009, 19014, 19019, + 19024, 19029, 19034, 19039, 19044, 19049, 19054, 19059, 19064, 19069, + 19074, 19079, 19084, 19089, 19094, 19099, 19104, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19109, 19113, 19117, 19121, 19125, 19129, 19133, 19137, 19141, + 19145, 19149, 19153, 19157, 19161, 19165, 19169, 19173, 19177, 19181, + 19185, 19189, 19193, 19197, 19201, 19205, 19209, 19213, 19217, 19221, + 19225, 19229, 19233, 19237, 19241, 19245, 19249, 19253, 19257, 19261, + 19265, 19269, 19273, 19279, 19283, 19288, 0, 0, 0, 19293, 19297, 19301, + 19305, 19309, 19313, 19317, 19321, 19325, 19329, 19333, 19337, 19341, + 19345, 19349, 19353, 19357, 19361, 19365, 19369, 19373, 19377, 19381, + 19385, 19389, 19393, 19397, 19401, 19405, 19409, 19413, 19417, 19421, + 19425, 19429, 19433, 19437, 19441, 19445, 19449, 19453, 19457, 19461, + 19465, 19469, 19473, 19477, 19481, 19485, 19489, 19493, 19497, 19501, + 19505, 19509, 19513, 19517, 19521, 19525, 19529, 19533, 19537, 19541, + 19545, 19549, 19553, 19557, 19561, 19565, 19569, 19573, 19577, 19581, + 19585, 19589, 19593, 19597, 19601, 19605, 19609, 19613, 19617, 19621, + 19625, 19629, 19633, 19637, 19641, 19645, 19649, 19653, 19657, 19661, + 19665, 19669, 19673, 19677, 19681, 19684, 19688, 19691, 19695, 19699, + 19702, 19706, 19710, 19713, 19717, 19721, 19725, 19729, 19732, 19736, + 19740, 19744, 19748, 19752, 19756, 19759, 19763, 19767, 19771, 19775, + 19779, 19783, 19787, 19791, 19795, 19799, 19803, 19807, 19811, 19815, + 19819, 19823, 19827, 19831, 19835, 19839, 19843, 19847, 19851, 19855, + 19859, 19863, 19867, 19871, 19875, 19879, 19883, 19887, 19891, 19895, + 19899, 19903, 19907, 19911, 19915, 19919, 19923, 19927, 19931, 19935, + 19939, 19943, 19947, 19951, 19955, 19959, 19963, 19967, 19971, 19975, + 19979, 19983, 19987, 19991, 19995, 19999, 20003, 20007, 20011, 20015, + 20019, 20023, 20027, 20031, 20035, 20039, 20043, 20047, 20051, 20055, + 20059, 20063, 20067, 20071, 20075, 20079, 20083, 20087, 20091, 20095, + 20099, 20103, 20107, 20111, 20115, 20119, 20123, 20127, 20131, 20135, + 20139, 20143, 20147, 20151, 20155, 20159, 20163, 20167, 20171, 20175, + 20179, 20183, 20187, 20191, 20195, 20199, 20203, 20207, 20211, 20215, + 20219, 20223, 20227, 20231, 20235, 20239, 20243, 20247, 20251, 20255, + 20259, 20263, 20267, 20271, 20275, 20279, 20283, 20287, 20291, 20295, + 20299, 20303, 20307, 20311, 20314, 20318, 20322, 20326, 20330, 20334, + 20338, 20342, 20346, 20350, 20354, 20358, 20362, 20366, 20370, 20374, + 20378, 20382, 20386, 20390, 20394, 20398, 20402, 20406, 20409, 20413, + 20417, 20421, 20425, 20429, 20433, 20437, 20441, 20445, 20449, 20453, + 20457, 20461, 20465, 20469, 20472, 20476, 20480, 20484, 20488, 20492, + 20496, 20500, 20504, 20508, 20512, 20516, 20520, 20524, 20528, 20532, + 20536, 20540, 20544, 20548, 20552, 20556, 20560, 20564, 20568, 20572, + 20576, 20580, 20584, 20588, 20592, 20596, 0, 20600, 20604, 20608, 20612, + 0, 0, 20616, 20620, 20624, 20628, 20632, 20636, 20640, 0, 20644, 0, + 20648, 20652, 20656, 20660, 0, 0, 20664, 20668, 20672, 20676, 20680, + 20684, 20688, 20692, 20696, 20700, 20704, 20708, 20712, 20716, 20720, + 20724, 20728, 20732, 20736, 20740, 20744, 20748, 20752, 20755, 20759, + 20763, 20767, 20771, 20775, 20779, 20783, 20787, 20791, 20795, 20799, + 20803, 20807, 20811, 20815, 20819, 20823, 0, 20827, 20831, 20835, 20839, + 0, 0, 20843, 20846, 20850, 20854, 20858, 20862, 20866, 20870, 20874, + 20878, 20882, 20886, 20890, 20894, 20898, 20902, 20906, 20911, 20916, + 20921, 20927, 20933, 20938, 20943, 20949, 20952, 20956, 20960, 20964, + 20968, 20972, 20976, 20980, 0, 20984, 20988, 20992, 20996, 0, 0, 21000, + 21004, 21008, 21012, 21016, 21020, 21024, 0, 21028, 0, 21032, 21036, + 21040, 21044, 0, 0, 21048, 21052, 21056, 21060, 21064, 21068, 21072, + 21076, 21080, 21085, 21090, 21095, 21101, 21107, 21112, 0, 21117, 21121, + 21125, 21129, 21133, 21137, 21141, 21145, 21149, 21153, 21157, 21161, + 21165, 21169, 21173, 21177, 21181, 21184, 21188, 21192, 21196, 21200, + 21204, 21208, 21212, 21216, 21220, 21224, 21228, 21232, 21236, 21240, + 21244, 21248, 21252, 21256, 21260, 21264, 21268, 21272, 21276, 21280, + 21284, 21288, 21292, 21296, 21300, 21304, 21308, 21312, 21316, 21320, + 21324, 21328, 21332, 21336, 21340, 0, 21344, 21348, 21352, 21356, 0, 0, + 21360, 21364, 21368, 21372, 21376, 21380, 21384, 21388, 21392, 21396, + 21400, 21404, 21408, 21412, 21416, 21420, 21424, 21428, 21432, 21436, + 21440, 21444, 21448, 21452, 21456, 21460, 21464, 21468, 21472, 21476, + 21480, 21484, 21488, 21492, 21496, 21500, 21504, 21508, 21512, 21516, + 21520, 21524, 21528, 21532, 21536, 21540, 21544, 21548, 21552, 21556, + 21560, 21564, 21568, 21572, 21576, 21580, 21584, 21587, 21591, 21595, + 21599, 21603, 21607, 21611, 21615, 21619, 21623, 0, 0, 21627, 21636, + 21642, 21647, 21651, 21654, 21659, 21662, 21665, 21668, 21673, 21677, + 21682, 21685, 21688, 21691, 21694, 21697, 21700, 21703, 21706, 21709, + 21713, 21717, 21721, 21725, 21729, 21733, 21737, 21741, 21745, 21749, 0, + 0, 0, 21755, 21761, 21765, 21769, 21773, 21779, 21783, 21787, 21791, + 21797, 21801, 21805, 21809, 21815, 21819, 21823, 21827, 21833, 21839, + 21845, 21853, 21859, 21865, 21871, 21877, 21883, 0, 0, 0, 0, 0, 0, 21889, + 21892, 21895, 21898, 21901, 21904, 21908, 21912, 21915, 21919, 21923, + 21927, 21931, 21935, 21938, 21942, 21946, 21950, 21954, 21958, 21962, + 21966, 21970, 21974, 21978, 21982, 21985, 21989, 21993, 21997, 22001, + 22004, 22008, 22012, 22016, 22020, 22024, 22028, 22032, 22036, 22040, + 22044, 22048, 22052, 22056, 22060, 22063, 22067, 22071, 22075, 22079, + 22083, 22087, 22091, 22095, 22099, 22103, 22107, 22111, 22115, 22119, + 22123, 22127, 22131, 22135, 22139, 22143, 22147, 22151, 22155, 22159, + 22163, 22167, 22171, 22175, 22179, 22183, 22187, 22191, 22195, 22198, + 22202, 22206, 22210, 22214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22218, + 22222, 22225, 22229, 22232, 22236, 22239, 22243, 22249, 22254, 22258, + 22261, 22265, 22269, 22274, 22278, 22283, 22287, 22292, 22296, 22301, + 22305, 22310, 22316, 22320, 22325, 22329, 22334, 22340, 22344, 22350, + 22356, 22360, 22365, 22373, 22381, 22388, 22393, 22398, 22407, 22414, + 22421, 22426, 22432, 22436, 22440, 22444, 22448, 22452, 22456, 22460, + 22464, 22468, 22472, 22478, 22483, 22488, 22491, 22495, 22499, 22504, + 22508, 22513, 22517, 22522, 22526, 22531, 22535, 22540, 22544, 22549, + 22553, 22558, 22564, 22568, 22573, 22578, 22582, 22586, 22590, 22594, + 22597, 22601, 22607, 22612, 22617, 22621, 22625, 22629, 22634, 22638, + 22643, 22647, 22652, 22655, 22659, 22663, 22668, 22672, 22677, 22681, + 22686, 22692, 22696, 22700, 22704, 22708, 22712, 22716, 22720, 22724, + 22728, 22732, 22736, 22742, 22745, 22749, 22753, 22758, 22762, 22767, + 22771, 22776, 22780, 22785, 22789, 22794, 22798, 22803, 22807, 22812, + 22818, 22822, 22826, 22832, 22838, 22844, 22850, 22854, 22858, 22862, + 22866, 22870, 22874, 22880, 22884, 22888, 22892, 22897, 22901, 22906, + 22910, 22915, 22919, 22924, 22928, 22933, 22937, 22942, 22946, 22951, + 22957, 22961, 22967, 22971, 22975, 22979, 22983, 22987, 22991, 22997, + 23000, 23004, 23008, 23013, 23017, 23022, 23026, 23031, 23035, 23040, + 23044, 23049, 23053, 23058, 23062, 23067, 23073, 23076, 23080, 23084, + 23089, 23094, 23098, 23102, 23106, 23110, 23114, 23118, 23124, 23127, + 23131, 23135, 23140, 23144, 23149, 23153, 23158, 23164, 23167, 23172, + 23176, 23180, 23184, 23188, 23192, 23196, 23200, 23206, 23210, 23214, + 23218, 23223, 23227, 23232, 23236, 23241, 23245, 23250, 23254, 23259, + 23263, 23268, 23272, 23277, 23280, 23284, 23288, 23292, 23296, 23300, + 23304, 23308, 23312, 23318, 23322, 23326, 23330, 23335, 23339, 23344, + 23348, 23353, 23357, 23362, 23366, 23371, 23375, 23380, 23384, 23389, + 23395, 23398, 23403, 23407, 23412, 23418, 23424, 23430, 23436, 23442, + 23448, 23454, 23458, 23462, 23466, 23470, 23474, 23478, 23482, 23486, + 23491, 23495, 23500, 23504, 23509, 23513, 23518, 23522, 23527, 23531, + 23536, 23540, 23545, 23549, 23553, 23557, 23561, 23565, 23569, 23573, + 23579, 23582, 23586, 23590, 23595, 23599, 23604, 23608, 23613, 23617, + 23622, 23626, 23631, 23635, 23640, 23644, 23649, 23655, 23659, 23665, + 23670, 23676, 23680, 23686, 23691, 23695, 23699, 23703, 23707, 23711, + 23716, 23719, 23723, 23728, 23732, 23737, 23740, 23744, 23748, 23752, + 23756, 23760, 23764, 23768, 23772, 23776, 23780, 23784, 23789, 23793, + 23797, 23803, 23807, 23813, 23817, 23823, 23827, 23831, 23835, 23839, + 23843, 23848, 23852, 23856, 23860, 23864, 23868, 23872, 23876, 23880, + 23884, 23888, 23894, 23900, 23906, 23912, 23918, 23923, 23929, 23935, + 23941, 23945, 23949, 23953, 23957, 23961, 23965, 23969, 23973, 23977, + 23981, 23985, 23989, 23993, 23998, 24003, 24008, 24012, 24016, 24020, + 24024, 24028, 24032, 24036, 24040, 24044, 24048, 24054, 24060, 24066, + 24072, 24078, 24084, 24090, 24096, 24102, 24106, 24110, 24114, 24118, + 24122, 24126, 24130, 24136, 24142, 24148, 24154, 24160, 24166, 24172, + 24178, 24184, 24189, 24194, 24199, 24204, 24210, 24216, 24222, 24228, + 24234, 24240, 24246, 24251, 24257, 24263, 24269, 24274, 24280, 24286, + 24292, 24297, 24302, 24307, 24312, 24317, 24322, 24327, 24332, 24337, + 24342, 24347, 24352, 24356, 24361, 24366, 24371, 24376, 24381, 24386, + 24391, 24396, 24401, 24406, 24411, 24416, 24421, 24426, 24431, 24436, + 24441, 24446, 24451, 24456, 24461, 24466, 24471, 24476, 24481, 24486, + 24491, 24496, 24501, 24505, 24510, 24515, 24520, 24525, 24530, 24535, + 24540, 24545, 24550, 24555, 24560, 24565, 24570, 24575, 24580, 24585, + 24590, 24595, 24600, 24605, 24610, 24615, 24620, 24625, 24630, 24634, + 24639, 24644, 24649, 24654, 24659, 24663, 24668, 24673, 24678, 24683, + 24688, 24692, 24697, 24703, 24708, 24713, 24718, 24723, 24729, 24734, + 24739, 24744, 24749, 24754, 24759, 24764, 24769, 24774, 24779, 24784, + 24789, 24794, 24799, 24804, 24809, 24814, 24819, 24824, 24829, 24834, + 24839, 24844, 24849, 24854, 24859, 24864, 24869, 24874, 24879, 24884, + 24889, 24894, 24899, 24904, 24909, 24914, 24919, 24924, 24929, 24934, + 24939, 24944, 24949, 24955, 24960, 24965, 24970, 24975, 24980, 24985, + 24990, 24995, 25000, 25005, 25010, 25015, 25020, 25025, 25030, 25035, + 25040, 25045, 25050, 25055, 25060, 25065, 25070, 25075, 25080, 25085, + 25090, 25095, 25100, 25105, 25110, 25115, 25120, 25125, 25130, 25135, + 25140, 25145, 25151, 25155, 25159, 25163, 25167, 25171, 25175, 25179, + 25183, 25189, 25195, 25201, 25207, 25213, 25219, 25225, 25232, 25238, + 25243, 25248, 25253, 25258, 25263, 25268, 25273, 25278, 25283, 25288, + 25293, 25298, 25303, 25308, 25313, 25318, 25323, 25328, 25333, 25338, + 25343, 25348, 25353, 25358, 25363, 25368, 25373, 25378, 0, 0, 0, 25385, + 25395, 25399, 25406, 25410, 25414, 25418, 25426, 25430, 25435, 25440, + 25445, 25449, 25454, 25459, 25462, 25466, 25470, 25479, 25483, 25487, + 25493, 25497, 25501, 25509, 25513, 25521, 25527, 25533, 25539, 25545, + 25554, 25559, 25563, 25572, 25575, 25581, 25585, 25591, 25596, 25602, + 25610, 25616, 25621, 25628, 25633, 25637, 25641, 25651, 25657, 25661, + 25671, 25677, 25681, 25685, 25692, 25699, 25704, 25709, 25718, 25722, + 25726, 25730, 25738, 25745, 25749, 25753, 25757, 25761, 25765, 25769, + 25773, 25777, 25781, 25785, 25789, 25794, 25799, 25804, 25808, 25812, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25816, 25820, 25824, 25828, + 25832, 25837, 25842, 25847, 25852, 25856, 25860, 25865, 25869, 0, 25873, + 25878, 25883, 25888, 25892, 25897, 25902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 25907, 25911, 25915, 25919, 25923, 25928, 25933, 25938, 25943, 25947, + 25951, 25956, 25960, 25964, 25968, 25973, 25978, 25983, 25987, 25992, + 25997, 26002, 26008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26013, 26017, 26021, + 26025, 26029, 26034, 26039, 26044, 26049, 26053, 26057, 26062, 26066, + 26070, 26074, 26079, 26084, 26089, 26093, 26098, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26103, 26107, 26111, 26115, 26119, 26124, 26129, 26134, + 26139, 26143, 26147, 26152, 26156, 0, 26160, 26165, 26170, 0, 26175, + 26180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26185, 26188, 26192, 26196, + 26200, 26204, 26208, 26212, 26216, 26220, 26224, 26228, 26232, 26236, + 26240, 26244, 26248, 26252, 26255, 26259, 26263, 26267, 26271, 26275, + 26279, 26283, 26287, 26291, 26295, 26299, 26303, 26307, 26311, 26314, + 26318, 26322, 26328, 26334, 26340, 26346, 26352, 26358, 26364, 26370, + 26376, 26382, 26388, 26394, 26400, 26406, 26415, 26424, 26430, 26436, + 26442, 26447, 26451, 26456, 26461, 26466, 26470, 26475, 26480, 26485, + 26489, 26494, 26498, 26503, 26508, 26513, 26518, 26522, 26526, 26530, + 26534, 26538, 26542, 26546, 26550, 26554, 26558, 26564, 26568, 26572, + 26576, 26580, 26584, 26592, 26598, 26602, 26608, 26612, 26618, 26622, 0, + 0, 26626, 26630, 26633, 26636, 26639, 26642, 26645, 26648, 26651, 26654, + 0, 0, 0, 0, 0, 0, 26657, 26665, 26673, 26681, 26689, 26697, 26705, 26713, + 26721, 26729, 0, 0, 0, 0, 0, 0, 26737, 26740, 26743, 26746, 26751, 26754, + 26759, 26766, 26774, 26779, 26786, 26789, 26796, 26803, 26810, 0, 26814, + 26818, 26821, 26824, 26827, 26830, 26833, 26836, 26839, 26842, 0, 0, 0, + 0, 0, 0, 26845, 26848, 26851, 26854, 26857, 26860, 26864, 26868, 26872, + 26875, 26879, 26883, 26886, 26890, 26894, 26897, 26901, 26905, 26909, + 26913, 26917, 26921, 26925, 26928, 26931, 26935, 26939, 26942, 26946, + 26950, 26954, 26958, 26962, 26966, 26970, 26974, 26981, 26986, 26991, + 26996, 27001, 27007, 27013, 27019, 27025, 27030, 27036, 27042, 27047, + 27053, 27059, 27065, 27071, 27077, 27082, 27088, 27093, 27099, 27105, + 27111, 27117, 27123, 27128, 27133, 27139, 27145, 27150, 27156, 27161, + 27167, 27172, 27177, 27183, 27189, 27195, 27201, 27207, 27213, 27219, + 27225, 27231, 27237, 27243, 27249, 27254, 27259, 27264, 27270, 0, 0, 0, + 0, 0, 0, 0, 0, 27276, 27285, 27294, 27302, 27310, 27320, 27328, 27337, + 27344, 27351, 27358, 27366, 27374, 27382, 27390, 27398, 27406, 27414, + 27422, 27429, 27437, 27445, 27453, 27461, 27469, 27479, 27489, 27499, + 27509, 27519, 27529, 27539, 27549, 27559, 27569, 27579, 27589, 27599, + 27609, 27617, 27625, 27635, 27643, 0, 0, 0, 0, 0, 27653, 27657, 27661, + 27665, 27669, 27673, 27677, 27681, 27685, 27689, 27693, 27697, 27701, + 27705, 27709, 27713, 27717, 27721, 27725, 27729, 27733, 27737, 27741, + 27745, 27751, 27755, 27761, 27765, 27771, 27775, 27781, 27785, 27789, + 27793, 27797, 27801, 27805, 27811, 27817, 27823, 27829, 27834, 27839, + 27844, 27850, 27856, 27862, 27868, 27875, 27881, 27886, 27891, 27895, + 27899, 27903, 27907, 27911, 27915, 27919, 27925, 27931, 27937, 27942, + 27949, 27954, 27959, 27965, 27970, 27977, 27984, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27990, 27995, 27998, 28002, 28006, 28010, 28014, 28018, 28022, + 28026, 28030, 28034, 28038, 28042, 28046, 28050, 28053, 28056, 28060, + 28064, 28068, 28071, 28074, 28077, 28081, 28085, 28089, 28093, 28097, 0, + 0, 0, 28100, 28104, 28108, 28112, 28117, 28122, 28127, 28132, 28136, + 28140, 28145, 28150, 0, 0, 0, 0, 28156, 28160, 28165, 28170, 28175, + 28179, 28183, 28187, 28191, 28196, 28200, 28204, 0, 0, 0, 0, 28208, 0, 0, + 0, 28212, 28216, 28220, 28224, 28227, 28230, 28233, 28236, 28239, 28242, + 28245, 28248, 28251, 28256, 28262, 28268, 28274, 28280, 28285, 28291, + 28297, 28303, 28308, 28314, 28319, 28325, 28331, 28336, 28342, 28348, + 28354, 28359, 28364, 28369, 28375, 28381, 28386, 28392, 28397, 28403, + 28408, 28414, 0, 0, 28420, 28426, 28432, 28438, 28444, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 28450, 28457, 28464, 28470, 28477, 28484, 28490, 28497, + 28504, 28511, 28518, 28524, 28531, 28538, 28544, 28551, 28558, 28564, + 28571, 28578, 28584, 28590, 28597, 28603, 28609, 28616, 28622, 28629, + 28636, 28643, 28650, 28657, 28664, 28670, 28677, 28684, 28690, 28697, + 28704, 28711, 28718, 28725, 28732, 28739, 0, 0, 0, 0, 28746, 28754, + 28761, 28768, 28774, 28781, 28787, 28794, 28800, 28807, 28814, 28821, + 28828, 28835, 28842, 28849, 28856, 28863, 28870, 28877, 28883, 28889, + 28896, 28903, 28910, 28916, 0, 0, 0, 0, 0, 0, 28922, 28928, 28933, 28938, + 28943, 28948, 28953, 28958, 28963, 28968, 28973, 0, 0, 0, 28979, 28985, + 28991, 28995, 29001, 29007, 29013, 29019, 29025, 29031, 29037, 29043, + 29049, 29055, 29061, 29067, 29073, 29079, 29085, 29089, 29095, 29101, + 29107, 29113, 29119, 29125, 29131, 29137, 29143, 29149, 29155, 29161, + 29167, 29173, 29179, 29183, 29188, 29193, 29198, 29202, 29207, 29211, + 29216, 29221, 29226, 29230, 29235, 29240, 29245, 29250, 29255, 29259, + 29263, 29268, 29273, 29278, 29282, 29286, 29291, 29296, 29301, 29306, 0, + 0, 29312, 29316, 29323, 29328, 29334, 29340, 29345, 29351, 29357, 29362, + 29368, 29374, 29380, 29386, 29392, 29397, 29402, 29408, 29413, 29419, + 29424, 29430, 29436, 29442, 29448, 29452, 29457, 29462, 29468, 29474, + 29479, 29485, 29491, 29495, 29500, 29505, 29509, 29514, 29519, 29524, + 29529, 29535, 29541, 29547, 29552, 29557, 29561, 29566, 29570, 29575, + 29579, 29584, 29589, 29594, 29599, 29606, 29613, 29621, 29632, 29641, + 29649, 29656, 29667, 29673, 29680, 0, 29687, 29692, 29697, 29705, 29711, + 29719, 29724, 29730, 29736, 29742, 29747, 29753, 29758, 29765, 29771, + 29776, 29782, 29788, 29794, 29801, 29808, 29815, 29820, 29825, 29832, + 29839, 29846, 29853, 29860, 0, 0, 29867, 29874, 29881, 29887, 29893, + 29899, 29905, 29911, 29917, 29923, 29929, 0, 0, 0, 0, 0, 0, 29935, 29941, + 29946, 29951, 29956, 29961, 29966, 29971, 29976, 29981, 0, 0, 0, 0, 0, 0, + 29986, 29991, 29996, 30001, 30006, 30011, 30016, 30025, 30032, 30037, + 30042, 30047, 30052, 30057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30463, 30466, 30470, - 30474, 30478, 30482, 30486, 30490, 30494, 30498, 30502, 30506, 30510, - 30514, 30517, 30520, 30524, 30528, 30532, 30536, 30540, 30544, 30547, - 30551, 30555, 30559, 30563, 30566, 30569, 30573, 30576, 30580, 30584, - 30588, 30592, 30596, 30599, 30604, 30609, 30614, 30618, 30622, 30627, - 30631, 30636, 30640, 30646, 30651, 30656, 30661, 30667, 30672, 30678, - 30684, 30690, 30694, 0, 0, 0, 30698, 30703, 30712, 30717, 30724, 30729, - 30733, 30736, 30739, 30742, 30745, 30748, 30751, 30754, 30757, 0, 0, 0, - 30760, 30764, 30768, 30772, 30779, 30785, 30791, 30797, 30803, 30809, - 30815, 30821, 30827, 30833, 30840, 30847, 30854, 30861, 30868, 30875, - 30882, 30889, 30896, 30903, 30910, 30917, 30924, 30931, 30938, 30945, - 30952, 30959, 30966, 30973, 30980, 30987, 30994, 31001, 31008, 31015, - 31022, 31029, 31036, 31043, 31051, 31059, 31067, 31073, 31079, 31085, - 31093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30062, 30068, + 30074, 30078, 30082, 30086, 30090, 30096, 30100, 30106, 30110, 30116, + 30122, 30130, 30136, 30144, 30148, 30152, 30156, 30162, 30165, 30171, + 30175, 30181, 30185, 30189, 30195, 30199, 30205, 30209, 30215, 30223, + 30231, 30239, 30245, 30249, 30255, 30259, 30265, 30268, 30271, 30277, + 30281, 30287, 30290, 30293, 30296, 30300, 30304, 30310, 30316, 30320, + 30323, 30327, 30332, 30337, 30344, 30349, 30356, 30363, 30372, 30379, + 30388, 30393, 30400, 30407, 30416, 30421, 30428, 30433, 30439, 30445, + 30451, 30457, 30463, 30469, 0, 0, 0, 0, 30475, 30479, 30482, 30485, + 30488, 30491, 30494, 30497, 30500, 30503, 30506, 30509, 30512, 30515, + 30520, 30525, 30530, 30533, 30538, 30543, 30548, 30553, 30560, 30565, + 30570, 30575, 30580, 30587, 30593, 30599, 30605, 30611, 30617, 30626, + 30635, 30641, 30647, 30656, 30665, 30674, 30683, 30692, 30701, 30710, + 30719, 0, 0, 0, 30728, 30733, 30738, 30743, 30747, 30751, 30755, 30760, + 30764, 30768, 30773, 30777, 30782, 30787, 30792, 30797, 30802, 30807, + 30812, 30817, 30822, 30826, 30830, 30835, 30840, 30845, 30849, 30853, + 30857, 30862, 30867, 30872, 30877, 30881, 30888, 30895, 30902, 30908, + 30914, 30920, 30926, 30932, 30938, 0, 0, 0, 30943, 30948, 30953, 30958, + 30962, 30966, 30970, 30974, 30978, 30982, 30986, 30990, 0, 0, 0, 0, 0, 0, + 30994, 30998, 31004, 31008, 31014, 31020, 31025, 31032, 31036, 31042, + 31046, 31052, 31057, 31064, 31071, 31076, 31083, 31088, 31093, 31097, + 31103, 31107, 31113, 31120, 31127, 31132, 31139, 31146, 31150, 31156, + 31161, 31166, 31173, 31178, 31183, 31188, 31193, 31197, 31201, 31206, + 31211, 31218, 31224, 31229, 31236, 31241, 31248, 31253, 31263, 31270, + 31277, 31281, 0, 0, 0, 0, 0, 0, 0, 0, 31285, 31294, 31301, 31308, 31315, + 31318, 31322, 31326, 31330, 31334, 31338, 31342, 31346, 31350, 31354, + 31358, 31362, 31366, 31369, 31372, 31376, 31380, 31384, 31388, 31392, + 31396, 31399, 31403, 31407, 31411, 31415, 31418, 31421, 31425, 31428, + 31432, 31436, 31440, 31444, 31448, 31451, 31456, 31461, 31466, 31470, + 31474, 31479, 31483, 31488, 31492, 31498, 31503, 31508, 31513, 31519, + 31524, 31530, 31536, 31542, 31546, 0, 0, 0, 31550, 31555, 31564, 31569, + 31576, 31581, 31585, 31588, 31591, 31594, 31597, 31600, 31603, 31606, + 31609, 0, 0, 0, 31612, 31616, 31620, 31624, 31631, 31637, 31643, 31649, + 31655, 31661, 31667, 31673, 31679, 31685, 31692, 31699, 31706, 31713, + 31720, 31727, 31734, 31741, 31748, 31755, 31762, 31769, 31776, 31783, + 31790, 31797, 31804, 31811, 31818, 31825, 31832, 31839, 31846, 31853, + 31860, 31867, 31874, 31881, 31888, 31895, 31903, 31911, 31919, 31925, + 31931, 31937, 31945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31102, 31107, 31112, 31117, 31122, 31131, - 31142, 31151, 31162, 31168, 31181, 31187, 31194, 31201, 31206, 31212, - 31218, 31229, 31238, 31245, 31252, 31260, 31267, 31275, 31285, 31295, - 31302, 31309, 31316, 31326, 31331, 31339, 31345, 31353, 31362, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31367, 31372, 31378, 31384, 31392, 31398, - 31404, 31410, 31415, 31422, 31427, 31433, 31439, 31447, 31452, 31458, - 31463, 31470, 31476, 31484, 31492, 31498, 31504, 31511, 31518, 31524, - 31530, 31536, 31542, 31547, 31553, 31561, 31568, 31574, 31580, 31586, - 31592, 31600, 31604, 31610, 31616, 31622, 31628, 31634, 31640, 31644, - 31649, 31654, 31661, 31666, 31670, 31675, 31680, 31685, 31689, 31694, - 31699, 31703, 31707, 31711, 31716, 31720, 31725, 31730, 31734, 31739, - 31743, 31748, 31752, 31757, 31762, 31768, 31773, 31778, 31782, 31787, - 31793, 31800, 31805, 31810, 31815, 31819, 31824, 31828, 31834, 31841, - 31848, 31853, 31858, 31862, 31868, 31873, 31878, 31883, 31888, 31894, - 31899, 31905, 31910, 31916, 31922, 31928, 31935, 31942, 31949, 31956, - 31963, 31970, 31975, 31984, 31994, 32004, 32014, 32024, 32034, 32044, - 32057, 32067, 32077, 32087, 32093, 32098, 32105, 32113, 32121, 32128, - 32135, 32142, 32149, 32157, 32166, 32175, 32184, 32193, 32202, 32211, - 32220, 32229, 32238, 32247, 32256, 32265, 32274, 32283, 32291, 32300, - 32311, 32319, 32329, 32340, 32349, 32358, 32368, 32377, 32385, 32394, - 32400, 32405, 32413, 32418, 32425, 32430, 32439, 32445, 32451, 32458, - 32463, 32468, 32476, 32484, 32493, 32502, 32507, 32514, 32524, 32532, - 32541, 32546, 32552, 32557, 32564, 32569, 32578, 32583, 32588, 32593, - 32600, 32606, 32611, 32620, 32628, 32633, 32638, 32645, 32652, 32656, - 32660, 32663, 32666, 32669, 32672, 32675, 32678, 32685, 32688, 32691, - 32696, 32700, 32704, 32708, 32712, 32716, 32726, 32732, 32738, 32744, - 32752, 32760, 32766, 32772, 32779, 32785, 32790, 32796, 32802, 32807, - 32813, 32819, 32827, 32832, 32838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32844, 32850, 32855, 32864, 32872, 32880, - 32887, 32894, 32901, 32908, 32916, 32924, 32934, 32944, 32952, 32960, - 32968, 32976, 32985, 32994, 33002, 33010, 33019, 33028, 33038, 33048, - 33057, 33066, 33074, 33082, 33090, 33098, 33108, 33118, 33126, 33134, - 33142, 33150, 33158, 33166, 33174, 33182, 33190, 33198, 33206, 33214, - 33223, 33232, 33241, 33250, 33260, 33270, 33277, 33284, 33292, 33300, - 33309, 33318, 33326, 33334, 33346, 33358, 33367, 33376, 33385, 33394, - 33401, 33408, 33416, 33424, 33432, 33440, 33448, 33456, 33464, 33472, - 33481, 33490, 33499, 33508, 33517, 33526, 33536, 33546, 33556, 33566, - 33575, 33584, 33591, 33598, 33606, 33614, 33622, 33630, 33638, 33646, - 33658, 33670, 33679, 33688, 33696, 33704, 33712, 33720, 33731, 33742, - 33753, 33764, 33776, 33788, 33796, 33804, 33812, 33820, 33829, 33838, - 33847, 33856, 33864, 33872, 33880, 33888, 33896, 33904, 33913, 33922, - 33932, 33942, 33950, 33958, 33966, 33974, 33982, 33990, 33997, 34004, - 34012, 34020, 34028, 34036, 34044, 34052, 34060, 34068, 34076, 34084, - 34092, 34100, 34108, 34116, 34124, 34132, 34141, 34150, 34159, 34167, - 34176, 34185, 34194, 34203, 34213, 34222, 34228, 34233, 34240, 34247, - 34255, 34263, 34272, 34281, 34291, 34301, 34312, 34323, 34333, 34343, - 34353, 34363, 34372, 34381, 34391, 34401, 34412, 34423, 34433, 34443, - 34453, 34463, 34470, 34477, 34485, 34493, 34500, 34507, 34516, 34525, - 34535, 34545, 34556, 34567, 34577, 34587, 34597, 34607, 34616, 34625, - 34633, 34641, 34648, 34655, 34663, 34671, 34680, 34689, 34699, 34709, - 34720, 34731, 34741, 34751, 34761, 34771, 34780, 34789, 34799, 34809, - 34820, 34831, 34841, 34851, 34861, 34871, 34878, 34885, 34893, 34901, - 34910, 34919, 34929, 34939, 34950, 34961, 34971, 34981, 34991, 35001, - 35009, 35017, 35025, 35033, 35042, 35051, 35059, 35067, 35074, 35081, - 35088, 35095, 35103, 35111, 35119, 35127, 35137, 35147, 35157, 35167, - 35177, 35187, 35195, 35203, 35213, 35223, 35233, 35243, 35253, 35263, - 35271, 35279, 35289, 35299, 35309, 0, 0, 35319, 35327, 35335, 35345, - 35355, 35365, 0, 0, 35375, 35383, 35391, 35401, 35411, 35421, 35431, - 35441, 35451, 35459, 35467, 35477, 35487, 35497, 35507, 35517, 35527, - 35535, 35543, 35553, 35563, 35573, 35583, 35593, 35603, 35611, 35619, - 35629, 35639, 35649, 35659, 35669, 35679, 35687, 35695, 35705, 35715, - 35725, 0, 0, 35735, 35743, 35751, 35761, 35771, 35781, 0, 0, 35791, - 35799, 35807, 35817, 35827, 35837, 35847, 35857, 0, 35867, 0, 35875, 0, - 35885, 0, 35895, 35905, 35913, 35921, 35931, 35941, 35951, 35961, 35971, - 35981, 35989, 35997, 36007, 36017, 36027, 36037, 36047, 36057, 36065, - 36073, 36081, 36089, 36097, 36105, 36113, 36121, 36129, 36137, 36145, - 36153, 36161, 0, 0, 36169, 36179, 36189, 36202, 36215, 36228, 36241, - 36254, 36267, 36277, 36287, 36300, 36313, 36326, 36339, 36352, 36365, - 36375, 36385, 36398, 36411, 36424, 36437, 36450, 36463, 36473, 36483, - 36496, 36509, 36522, 36535, 36548, 36561, 36571, 36581, 36594, 36607, - 36620, 36633, 36646, 36659, 36669, 36679, 36692, 36705, 36718, 36731, - 36744, 36757, 36765, 36773, 36784, 36792, 0, 36803, 36811, 36822, 36830, - 36838, 36846, 36854, 36862, 36865, 36868, 36871, 36874, 36880, 36891, - 36899, 0, 36910, 36918, 36929, 36937, 36945, 36953, 36961, 36969, 36974, - 36979, 36984, 36992, 37000, 37011, 0, 0, 37022, 37030, 37041, 37049, - 37057, 37065, 0, 37073, 37078, 37083, 37088, 37096, 37104, 37115, 37126, - 37134, 37142, 37150, 37161, 37169, 37177, 37185, 37193, 37201, 37207, - 37213, 0, 0, 37216, 37227, 37235, 0, 37246, 37254, 37265, 37273, 37281, - 37289, 37297, 37305, 37308, 0, 37311, 37315, 37319, 37323, 37327, 37331, - 37335, 37339, 37343, 37347, 37351, 37355, 37361, 37367, 37373, 37376, - 37379, 37381, 37385, 37389, 37393, 37397, 37399, 37403, 37407, 37413, - 37419, 37426, 37433, 37438, 37443, 37449, 37455, 37457, 37460, 37462, - 37466, 37470, 37474, 37477, 37481, 37485, 37489, 37493, 37497, 37503, - 37507, 37511, 37517, 37522, 37529, 37531, 37534, 37538, 37541, 37545, - 37550, 37552, 37561, 37570, 37573, 37577, 37579, 37581, 37583, 37586, - 37592, 37594, 37598, 37602, 37609, 37616, 37620, 37625, 37630, 37635, - 37639, 37643, 37647, 37650, 37653, 37657, 37664, 37669, 37673, 37677, - 37682, 37686, 37690, 37695, 37700, 37704, 37708, 37712, 37714, 37719, - 37724, 37728, 37732, 37736, 37740, 0, 0, 0, 0, 0, 37744, 37750, 37756, - 37763, 37770, 37775, 37780, 37784, 0, 0, 37790, 37793, 37796, 37799, - 37802, 37805, 37808, 37812, 37816, 37821, 37826, 37831, 37837, 37841, - 37844, 37847, 37850, 37853, 37856, 37859, 37862, 37865, 37868, 37872, - 37876, 37881, 37886, 0, 37891, 37897, 37903, 37909, 37916, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 37923, 37926, 37929, 37932, 37937, 37940, 37943, 37946, - 37949, 37952, 37955, 37959, 37962, 37965, 37968, 37971, 37974, 37979, - 37982, 37985, 37988, 37991, 37994, 37999, 38002, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38005, 38010, 38015, 38022, - 38030, 38035, 38040, 38044, 38048, 38053, 38060, 38067, 38071, 38076, - 38081, 38086, 38091, 38098, 38103, 38108, 38113, 38122, 38129, 38135, - 38139, 38144, 38150, 38155, 38162, 38170, 38178, 38182, 38186, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38190, 38194, 38201, 38205, 38209, - 38214, 38218, 38222, 38226, 38228, 38232, 38236, 38240, 38245, 38249, - 38253, 38261, 38264, 38268, 38271, 38274, 38280, 38283, 38286, 38292, - 38296, 38300, 38304, 38307, 38311, 38314, 38318, 38320, 38323, 38326, - 38330, 38332, 38336, 38339, 38342, 38347, 38352, 38358, 38361, 38364, - 38368, 38373, 38376, 38379, 38382, 38386, 38390, 38393, 38396, 38398, - 38401, 38404, 38407, 38411, 38416, 38419, 38423, 38427, 38431, 38435, - 38440, 38445, 38449, 38453, 38458, 38463, 38468, 38472, 38476, 38481, - 38485, 38488, 38491, 38493, 38497, 38502, 38509, 38516, 38523, 38530, - 38537, 38544, 38551, 38558, 38566, 38573, 38581, 38588, 38595, 38603, - 38611, 38616, 38621, 38626, 38631, 38636, 38641, 38646, 38651, 38656, - 38661, 38667, 38673, 38679, 38685, 38692, 38700, 38707, 38713, 38719, - 38725, 38731, 38737, 38743, 38749, 38755, 38761, 38768, 38775, 38782, - 38789, 38797, 38806, 38814, 38825, 38833, 38841, 38849, 38855, 38864, - 38873, 38881, 38890, 0, 0, 0, 0, 0, 0, 38898, 38900, 38903, 38905, 38908, - 38911, 38914, 38919, 38924, 38929, 38934, 38938, 38942, 38946, 38950, - 38955, 38961, 38966, 38972, 38977, 38982, 38987, 38993, 38998, 39004, - 39010, 39014, 39018, 39023, 39028, 39033, 39038, 39043, 39051, 39059, - 39067, 39075, 39082, 39090, 39097, 39104, 39112, 39122, 39129, 39136, - 39143, 39150, 39158, 39166, 39173, 39180, 39188, 39196, 39201, 39209, - 39214, 39219, 39225, 39230, 39236, 39243, 39250, 39255, 39261, 39266, - 39269, 39273, 39276, 39280, 39284, 39288, 39294, 39300, 39306, 39312, - 39316, 39320, 39324, 39328, 39334, 39340, 39344, 39349, 39353, 39358, - 39362, 39366, 39369, 39373, 39376, 39380, 39387, 39395, 39406, 39417, - 39422, 39431, 39438, 39446, 39454, 39458, 39464, 39472, 39476, 39481, - 39486, 39492, 39498, 39504, 39511, 39515, 39519, 39524, 39527, 39529, - 39533, 39537, 39544, 39548, 39550, 39552, 39556, 39563, 39568, 39574, - 39583, 39590, 39595, 39599, 39603, 39607, 39610, 39613, 39616, 39620, - 39624, 39628, 39632, 39636, 39639, 39643, 39647, 39650, 39652, 39655, - 39657, 39661, 39665, 39667, 39672, 39675, 39679, 39683, 39687, 39689, - 39691, 39693, 39696, 39700, 39704, 39708, 39712, 39716, 39722, 39728, - 39730, 39732, 39734, 39736, 39739, 39741, 39745, 39747, 39751, 39754, - 39759, 39763, 39767, 39770, 39774, 39778, 39783, 39787, 39796, 39806, - 39810, 39815, 39821, 39825, 39829, 39832, 39837, 39841, 39847, 39851, - 39862, 39870, 39874, 39878, 39884, 39888, 39891, 39893, 39896, 39900, - 39904, 39910, 39914, 39918, 39921, 39924, 39928, 39933, 39938, 39943, - 39948, 39953, 39960, 39967, 39971, 39975, 39977, 39981, 39984, 39987, - 39995, 40003, 40009, 40015, 40024, 40033, 40038, 40043, 40051, 40059, - 40061, 40063, 40068, 40073, 40079, 40085, 40090, 40095, 40099, 40103, - 40109, 40115, 40121, 40127, 40137, 40147, 40154, 40161, 40163, 40167, - 40171, 40176, 40181, 40188, 40195, 40198, 40201, 40204, 40207, 40210, - 40215, 40219, 40224, 40229, 40232, 40235, 40238, 40241, 40244, 40248, - 40251, 40254, 40257, 40260, 40262, 40264, 40266, 40268, 40276, 40284, - 40289, 40292, 40297, 40307, 40313, 40319, 40325, 40333, 40341, 40352, - 40356, 40360, 40362, 40368, 40370, 40372, 40374, 40376, 40382, 40385, - 40391, 40397, 40401, 40405, 40409, 40412, 40416, 40420, 40422, 40431, - 40440, 40445, 40450, 40455, 40461, 40467, 40470, 40473, 40476, 40479, - 40481, 40486, 40491, 40496, 40502, 40508, 40515, 40522, 40527, 40532, - 40537, 40542, 40550, 40558, 40566, 40574, 40582, 40590, 40598, 40606, - 40614, 40622, 40629, 40640, 40649, 40663, 40666, 40671, 40677, 40683, - 40690, 40704, 40719, 40725, 40731, 40738, 40744, 40752, 40758, 40771, - 40785, 40790, 40796, 40803, 40806, 40809, 40811, 40814, 40817, 40819, - 40821, 40825, 40828, 40831, 40834, 40837, 40842, 40847, 40852, 40857, - 40860, 40863, 40865, 40867, 40869, 40873, 40877, 40881, 40887, 40890, - 40892, 40894, 40899, 40904, 40909, 40914, 40919, 40924, 40926, 40928, - 40937, 40941, 40948, 40957, 40959, 40964, 40969, 40976, 40980, 40982, - 40986, 40988, 40992, 40996, 41000, 41002, 41004, 41006, 41011, 41018, - 41025, 41032, 41039, 41046, 41053, 41060, 41067, 41073, 41079, 41086, - 41093, 41100, 41107, 41113, 41119, 41126, 41133, 41140, 41148, 41155, - 41163, 41170, 41178, 41185, 41193, 41201, 41208, 41216, 41223, 41231, - 41238, 41246, 41253, 41260, 41267, 41274, 41281, 41289, 41296, 41303, - 41310, 41318, 41325, 41332, 41339, 41346, 41354, 41362, 41369, 41376, - 41382, 41389, 41394, 41401, 41408, 41416, 41423, 41431, 41439, 41444, - 41449, 41454, 41461, 41468, 41475, 41482, 41487, 41491, 41500, 41506, - 41509, 41517, 41520, 41525, 41530, 41533, 41536, 41544, 41547, 41552, - 41555, 41562, 41567, 41575, 41578, 41581, 41584, 41589, 41594, 41597, - 41600, 41608, 41611, 41616, 41623, 41627, 41631, 41636, 41641, 41647, - 41652, 41658, 41664, 41669, 41675, 41683, 41689, 41697, 41705, 41711, - 41719, 41727, 41736, 41744, 41750, 41758, 41767, 41775, 41779, 41784, - 41797, 41810, 41814, 41818, 41822, 41826, 41836, 41840, 41845, 41850, - 41855, 41860, 41865, 41870, 41880, 41890, 41898, 41908, 41918, 41926, - 41936, 41946, 41954, 41964, 41974, 41982, 41990, 42000, 42010, 42013, - 42016, 42019, 42024, 42028, 42034, 42041, 42048, 42056, 42063, 42067, - 42071, 42075, 42079, 42081, 42085, 42089, 42094, 42099, 42106, 42113, - 42116, 42123, 42125, 42127, 42131, 42135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42140, 42144, 42151, 42158, 42165, - 42172, 42176, 42180, 42184, 42188, 42193, 42199, 42204, 42210, 42216, - 42222, 42228, 42236, 42243, 42250, 42257, 42264, 42270, 42276, 42285, - 42289, 42296, 42300, 42304, 42310, 42316, 42322, 42328, 42332, 42336, - 42339, 42343, 42347, 42354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42361, 42364, 42368, 42372, 42378, 42384, - 42390, 42398, 42405, 42409, 42417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 42422, 42425, 42428, 42431, 42434, 42437, 42440, - 42443, 42446, 42449, 42453, 42457, 42461, 42465, 42469, 42473, 42477, - 42481, 42485, 42489, 42493, 42496, 42499, 42502, 42505, 42508, 42511, - 42514, 42517, 42520, 42524, 42528, 42532, 42536, 42540, 42544, 42548, - 42552, 42556, 42560, 42564, 42570, 42576, 42582, 42589, 42596, 42603, - 42610, 42617, 42624, 42631, 42638, 42645, 42652, 42659, 42666, 42673, - 42680, 42687, 42694, 42701, 42706, 42712, 42718, 42724, 42729, 42735, - 42741, 42747, 42752, 42758, 42764, 42769, 42774, 42779, 42784, 42790, - 42796, 42801, 42806, 42812, 42817, 42823, 42829, 42835, 42841, 42847, - 42852, 42858, 42864, 42870, 42875, 42881, 42887, 42893, 42898, 42904, - 42910, 42915, 42920, 42925, 42930, 42936, 42942, 42947, 42952, 42958, - 42963, 42969, 42975, 42981, 42987, 42993, 42998, 43004, 43010, 43016, - 43021, 43027, 43033, 43039, 43044, 43050, 43056, 43061, 43066, 43071, - 43076, 43082, 43088, 43093, 43098, 43104, 43109, 43115, 43121, 43127, - 43133, 43139, 43143, 43149, 43155, 43161, 43167, 43173, 43179, 43185, - 43191, 43197, 43203, 43207, 43211, 43215, 43219, 43223, 43227, 43231, - 43235, 43239, 43244, 43250, 43255, 43260, 43265, 43270, 43279, 43288, - 43297, 43306, 43315, 43324, 43333, 43342, 43349, 43357, 43365, 43372, - 43379, 43387, 43395, 43402, 43409, 43417, 43425, 43432, 43439, 43447, - 43455, 43462, 43469, 43477, 43486, 43495, 43503, 43512, 43521, 43528, - 43535, 43543, 43552, 43561, 43569, 43578, 43587, 43594, 43601, 43610, - 43619, 43627, 43635, 43644, 43653, 43660, 43667, 43676, 43685, 43693, - 43701, 43710, 43719, 43726, 43733, 43742, 43751, 43759, 43768, 43777, - 43785, 43795, 43805, 43815, 43825, 43834, 43843, 43852, 43861, 43868, - 43876, 43884, 43892, 43900, 43905, 43910, 43919, 43927, 43934, 43943, - 43951, 43958, 43967, 43975, 43982, 43991, 43999, 44006, 44015, 44023, - 44030, 44039, 44047, 44054, 44063, 44071, 44078, 44087, 44095, 44102, - 44111, 44119, 44126, 44135, 44144, 44153, 44162, 44175, 44188, 44195, - 44200, 44205, 44210, 44215, 44220, 44225, 44230, 44235, 44243, 44251, - 44259, 44267, 44272, 44279, 44286, 44293, 44298, 44306, 44313, 44321, - 44325, 44332, 44338, 44345, 44349, 44355, 44361, 44367, 44371, 44374, - 44378, 44382, 44389, 44395, 44401, 44407, 44413, 44427, 44437, 44451, - 44465, 44471, 44481, 44495, 44498, 44501, 44508, 44516, 44521, 44526, - 44534, 44545, 44556, 44564, 44568, 44572, 44575, 44578, 44582, 44586, - 44589, 44592, 44597, 44602, 44608, 44614, 44619, 44624, 44630, 44636, - 44641, 44646, 44651, 44656, 44662, 44668, 44673, 44678, 44684, 44690, - 44695, 44700, 44703, 44706, 44715, 44717, 44719, 44722, 44726, 44732, - 44734, 44737, 44744, 44751, 44759, 44767, 44777, 44791, 44796, 44801, - 44805, 44810, 44818, 44826, 44835, 44844, 44853, 44862, 44867, 44872, - 44878, 44884, 44890, 44896, 44899, 44905, 44911, 44921, 44931, 44939, - 44947, 44956, 44965, 44969, 44977, 44985, 44993, 45001, 45010, 45019, - 45028, 45037, 45042, 45047, 45052, 45057, 45062, 45068, 45074, 45079, - 45085, 45087, 45089, 45091, 45093, 45096, 45099, 45101, 45103, 45105, - 45109, 45113, 45115, 45117, 45120, 45123, 45127, 45133, 45139, 45141, - 45148, 45152, 45157, 45162, 45164, 45173, 45179, 45185, 45191, 45197, - 45203, 45209, 45214, 45217, 45220, 45223, 45225, 45227, 45231, 45235, - 45240, 45245, 45250, 45253, 45257, 45262, 45265, 45269, 45274, 45279, - 45284, 45289, 45294, 45299, 45304, 45309, 45314, 45319, 45324, 45329, - 45335, 45341, 45347, 45349, 45352, 45354, 45357, 45359, 45361, 45363, - 45365, 45367, 45369, 45371, 45373, 45375, 45377, 45379, 45381, 45383, - 45385, 45387, 45389, 45391, 45396, 45401, 45406, 45411, 45416, 45421, - 45426, 45431, 45436, 45441, 45446, 45451, 45456, 45461, 45466, 45471, - 45476, 45481, 45486, 45491, 45495, 45499, 45503, 45509, 45515, 45520, - 45525, 45530, 45535, 45540, 45545, 45553, 45561, 45569, 45577, 45585, - 45593, 45601, 45609, 45615, 45620, 45625, 45630, 45633, 45637, 45641, - 45645, 45649, 45653, 45657, 45664, 45671, 45679, 45687, 45692, 45697, - 45704, 45711, 45718, 45725, 45728, 45731, 45736, 45738, 45742, 45747, - 45749, 45751, 45753, 45755, 45760, 45763, 45765, 45770, 45777, 45784, - 45787, 45791, 45796, 45801, 45809, 45815, 45820, 45831, 45837, 45843, - 45848, 45853, 45859, 45862, 45865, 45870, 45872, 45876, 45878, 45880, - 45882, 45884, 45886, 45888, 45893, 45895, 45897, 45899, 45901, 45905, - 45907, 45910, 45915, 45920, 45925, 45930, 45936, 45942, 45944, 45947, - 45954, 45960, 45966, 45973, 45977, 0, 45981, 45983, 45987, 45993, 45998, - 46000, 46004, 46013, 46021, 46029, 46035, 46041, 46046, 46052, 46057, - 46060, 46074, 46077, 46082, 0, 46087, 0, 0, 0, 0, 46096, 46103, 46107, - 46109, 46111, 46115, 46121, 46126, 46132, 46134, 46140, 46142, 46148, - 46150, 46152, 46157, 46159, 46163, 46168, 46170, 46175, 46180, 46184, - 46191, 0, 46201, 46207, 46210, 46216, 0, 46219, 46224, 46228, 46230, 0, - 0, 46232, 46236, 46240, 46245, 46247, 46252, 46255, 46258, 46261, 46265, - 46269, 46274, 46278, 46283, 46288, 46292, 46298, 46305, 46308, 46314, - 46319, 46323, 46328, 46334, 46340, 46347, 46353, 46360, 0, 46367, 46374, - 46378, 46385, 46391, 46396, 46402, 46406, 46411, 46414, 46420, 46426, - 46433, 46441, 46448, 46457, 46467, 46474, 46480, 46484, 46492, 46497, - 46506, 46509, 46512, 46521, 46532, 46539, 46541, 46547, 46552, 46554, - 46557, 46561, 46569, 0, 46578, 0, 46583, 46591, 46599, 46607, 0, 0, 0, - 46615, 46623, 46628, 46631, 46635, 46638, 46649, 46659, 46669, 0, 0, - 46678, 46687, 46693, 46701, 46705, 46713, 46717, 46725, 46732, 46739, - 46748, 46757, 46767, 46777, 46787, 46797, 46806, 46815, 46825, 46835, - 46844, 46853, 46860, 46867, 46874, 46881, 46888, 46895, 46902, 46909, - 46916, 46924, 46930, 46936, 46942, 46948, 46954, 46960, 46966, 46972, - 46978, 46985, 46993, 47001, 47009, 47017, 47025, 47033, 47041, 47049, - 47057, 47066, 0, 0, 0, 47071, 47077, 47080, 47086, 47092, 47097, 47101, - 47106, 47112, 47119, 47122, 47129, 47136, 47140, 47149, 47158, 47163, - 47169, 47174, 47179, 47186, 47193, 47201, 47209, 0, 47218, 47227, 47232, - 47236, 47243, 47247, 47254, 47262, 47267, 47275, 47279, 47284, 47288, - 47293, 0, 47297, 47302, 47311, 47313, 47317, 47321, 47328, 47335, 47340, - 47348, 47354, 0, 47360, 0, 0, 0, 47363, 47371, 47375, 47382, 47390, - 47398, 47403, 47408, 47414, 47419, 47424, 47430, 47435, 47438, 47442, - 47446, 47453, 47462, 47467, 47476, 47485, 47491, 47497, 47502, 47507, - 47512, 47517, 47523, 47529, 47537, 47545, 47551, 47557, 47562, 47567, - 47574, 47581, 47587, 47590, 47593, 47597, 47601, 47605, 47610, 47616, - 47622, 47629, 47636, 47641, 47645, 47649, 47653, 47657, 47661, 47665, - 47669, 47673, 47677, 47681, 47685, 47689, 47693, 47697, 47701, 47705, - 47709, 47713, 47717, 47721, 47725, 47729, 47733, 47737, 47741, 47745, - 47749, 47753, 47757, 47761, 47765, 47769, 47773, 47777, 47781, 47785, - 47789, 47793, 47797, 47801, 47805, 47809, 47813, 47817, 47821, 47825, - 47829, 47833, 47837, 47841, 47845, 47849, 47853, 47857, 47861, 47865, - 47869, 47873, 47877, 47881, 47885, 47889, 47893, 47897, 47901, 47905, - 47909, 47913, 47917, 47921, 47925, 47929, 47933, 47937, 47941, 47945, - 47949, 47953, 47957, 47961, 47965, 47969, 47973, 47977, 47981, 47985, - 47989, 47993, 47997, 48001, 48005, 48009, 48013, 48017, 48021, 48025, - 48029, 48033, 48037, 48041, 48045, 48049, 48053, 48057, 48061, 48065, - 48069, 48073, 48077, 48081, 48085, 48089, 48093, 48097, 48101, 48105, - 48109, 48113, 48117, 48121, 48125, 48129, 48133, 48137, 48141, 48145, - 48149, 48153, 48157, 48161, 48165, 48169, 48173, 48177, 48181, 48185, - 48189, 48193, 48197, 48201, 48205, 48209, 48213, 48217, 48221, 48225, - 48229, 48233, 48237, 48241, 48245, 48249, 48253, 48257, 48261, 48265, - 48269, 48273, 48277, 48281, 48285, 48289, 48293, 48297, 48301, 48305, - 48309, 48313, 48317, 48321, 48325, 48329, 48333, 48337, 48341, 48345, - 48349, 48353, 48357, 48361, 48365, 48369, 48373, 48377, 48381, 48385, - 48389, 48393, 48397, 48401, 48405, 48409, 48413, 48417, 48421, 48425, - 48429, 48433, 48437, 48441, 48445, 48449, 48453, 48457, 48461, 48465, - 48469, 48473, 48477, 48481, 48485, 48489, 48493, 48497, 48501, 48505, - 48509, 48513, 48517, 48521, 48525, 48529, 48533, 48537, 48541, 48545, - 48549, 48553, 48557, 48561, 48565, 48569, 48573, 48577, 48581, 48585, - 48589, 48593, 48597, 48601, 48605, 48609, 48613, 48617, 48621, 48625, - 48629, 48633, 48637, 48641, 48645, 48649, 48653, 48657, 48661, 48665, - 48672, 48680, 48686, 48692, 48699, 48706, 48712, 48718, 48724, 48730, - 48735, 48740, 48745, 48750, 48756, 48762, 48770, 48777, 48782, 48787, - 48795, 48804, 48811, 48821, 48832, 48835, 48838, 48842, 48846, 48852, - 48858, 48868, 48878, 48888, 48898, 48905, 48912, 48919, 48926, 48937, - 48948, 48959, 48970, 48980, 48990, 49002, 49014, 49025, 49036, 49048, - 49060, 49069, 49079, 49089, 49100, 49111, 49118, 49125, 49132, 49139, - 49149, 49159, 49167, 49175, 49182, 49189, 49196, 49203, 49210, 49215, - 49220, 49226, 49234, 49244, 49252, 49260, 49268, 49276, 49284, 49292, - 49300, 49308, 49316, 49324, 49333, 49342, 49350, 49358, 49367, 49376, - 49385, 49394, 49404, 49414, 49423, 49432, 49442, 49452, 49466, 49483, - 49497, 49514, 49528, 49542, 49556, 49570, 49580, 49591, 49601, 49612, - 49629, 49646, 49654, 49660, 49667, 49674, 49681, 49688, 49693, 49699, - 49704, 49709, 49715, 49720, 49725, 49730, 49735, 49740, 49747, 49752, - 49759, 49764, 49769, 49773, 49777, 49784, 49791, 49798, 49805, 49812, - 49819, 49832, 49845, 49858, 49871, 49879, 49887, 49893, 49899, 49906, - 49913, 49920, 49927, 49931, 49936, 49944, 49952, 49960, 49967, 49971, - 49979, 49987, 49990, 49993, 49998, 50004, 50012, 50020, 50040, 50060, - 50080, 50100, 50120, 50140, 50160, 50180, 50185, 50192, 50201, 50209, - 50217, 50222, 50225, 50228, 50233, 50236, 50255, 50262, 50268, 50274, - 50278, 50281, 50284, 50287, 50298, 50310, 50317, 50324, 50327, 50331, - 50334, 50339, 50344, 50349, 50355, 50364, 50371, 50378, 50386, 50393, - 50400, 50403, 50409, 50415, 50418, 50421, 50426, 50431, 50437, 50443, - 50447, 50452, 50459, 50463, 50469, 50473, 50477, 50485, 50497, 50505, - 50509, 50511, 50520, 50529, 50535, 50538, 50544, 50550, 50555, 50560, - 50565, 50570, 50575, 50580, 50582, 50588, 50593, 50600, 50604, 50610, - 50613, 50617, 50624, 50631, 50633, 50635, 50641, 50647, 50653, 50662, - 50671, 50678, 50685, 50691, 50697, 50702, 50707, 50712, 50718, 50724, - 50729, 50736, 50740, 50744, 50757, 50770, 50781, 50790, 50796, 50803, - 50808, 50813, 50818, 50823, 50828, 50830, 50837, 50844, 50851, 50858, - 50865, 50873, 50879, 50884, 50890, 50896, 50902, 50909, 50915, 50923, - 50931, 50939, 50947, 50954, 50960, 50966, 50975, 50979, 50988, 50997, - 51006, 51014, 51018, 51024, 51031, 51038, 51042, 51048, 51055, 51060, - 51065, 51071, 51076, 51081, 51088, 51095, 51100, 51105, 51113, 51121, - 51131, 51141, 51148, 51155, 51159, 51163, 51175, 51181, 51187, 51192, - 51197, 51204, 51211, 51217, 51223, 51232, 51240, 51248, 51255, 51262, - 51269, 51275, 51282, 51288, 51295, 51302, 51309, 51316, 51322, 51327, - 51336, 51346, 51353, 51362, 51368, 51373, 51378, 51387, 51393, 51399, - 51405, 51413, 51418, 51425, 51432, 51443, 51450, 51457, 51464, 51471, - 51478, 51485, 51492, 51503, 51514, 51524, 51534, 51546, 51558, 51563, - 51568, 51576, 51584, 51590, 51596, 51605, 51614, 51622, 51630, 51638, - 51646, 51656, 51666, 51680, 51694, 51701, 51708, 51719, 51730, 51737, - 51744, 51753, 51762, 51767, 51772, 51781, 51790, 51795, 51800, 51808, - 51814, 51820, 51828, 51836, 51849, 51862, 51866, 51870, 51877, 51884, - 51891, 51899, 51907, 51915, 51923, 51929, 51935, 51941, 51947, 51954, - 51961, 51969, 51977, 51980, 51983, 51988, 51993, 51999, 52005, 52012, - 52019, 52028, 52037, 52044, 52051, 52059, 52067, 52075, 52083, 52090, - 52097, 52104, 52111, 52115, 52119, 52126, 52133, 52138, 52143, 52148, - 52153, 52159, 52173, 52180, 52187, 52191, 52193, 52195, 52200, 52205, - 52210, 52214, 52222, 52229, 52236, 52244, 52256, 52264, 52272, 52283, - 52287, 52291, 52295, 52300, 52311, 52318, 52325, 52332, 52337, 52344, - 52353, 52361, 52367, 52373, 52379, 52388, 52397, 52405, 52414, 52419, - 52422, 52427, 52433, 52439, 52445, 52451, 52455, 52458, 52462, 52466, - 52472, 52478, 52484, 52490, 52494, 52498, 52505, 52512, 52519, 52526, - 52533, 52540, 52550, 52560, 52567, 52574, 52582, 52590, 52594, 52599, - 52604, 52610, 52616, 52619, 52622, 52625, 52628, 52632, 52637, 52642, - 52647, 52652, 52657, 52661, 52665, 52669, 52673, 52677, 52681, 52685, - 52691, 52695, 52701, 52706, 52713, 52721, 52728, 52736, 52743, 52751, - 52760, 52767, 52777, 52788, 52794, 52803, 52809, 52818, 52827, 52833, - 52839, 52843, 52847, 52856, 52865, 52872, 52879, 52888, 0, 0, 0, 52897, - 52902, 52906, 52910, 52915, 52920, 52925, 52933, 52941, 52944, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31954, 31959, 31964, 31969, + 31974, 31983, 31994, 32003, 32014, 32020, 32033, 32039, 32046, 32053, + 32058, 32064, 32070, 32081, 32090, 32097, 32104, 32113, 32120, 32129, + 32139, 32149, 32156, 32163, 32170, 32180, 32185, 32193, 32199, 32207, + 32216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32221, 32226, 32232, 32239, + 32247, 32253, 32259, 32265, 32270, 32278, 32284, 32290, 32296, 32304, + 32309, 32316, 32321, 32328, 32334, 32342, 32350, 32357, 32363, 32370, + 32377, 32383, 32390, 32397, 32403, 32408, 32414, 32422, 32430, 32436, + 32442, 32448, 32454, 32462, 32466, 32472, 32478, 32484, 32490, 32496, + 32502, 32506, 32511, 32516, 32523, 32528, 32532, 32538, 32543, 32548, + 32552, 32557, 32562, 32566, 32570, 32574, 32580, 32584, 32589, 32594, + 32598, 32603, 32607, 32612, 32616, 32622, 32627, 32634, 32639, 32644, + 32648, 32653, 32659, 32667, 32672, 32678, 32683, 32687, 32692, 32696, + 32702, 32709, 32716, 32721, 32726, 32730, 32736, 32742, 32747, 32752, + 32757, 32763, 32768, 32774, 32779, 32785, 32791, 32797, 32804, 32811, + 32818, 32825, 32832, 32839, 32844, 32853, 32863, 32873, 32883, 32893, + 32903, 32913, 32926, 32936, 32946, 32956, 32963, 32968, 32975, 32983, + 32991, 32998, 33005, 33012, 33019, 33027, 33036, 33045, 33054, 33063, + 33072, 33081, 33090, 33099, 33108, 33117, 33126, 33135, 33144, 33153, + 33161, 33170, 33181, 33189, 33199, 33211, 33220, 33229, 33239, 33248, + 33256, 33265, 33272, 33277, 33285, 33290, 33298, 33303, 33312, 33318, + 33325, 33332, 33337, 33342, 33350, 33358, 33367, 33376, 33381, 33388, + 33399, 33407, 33416, 33421, 33427, 33432, 33439, 33444, 33453, 33458, + 33463, 33468, 33475, 33482, 33487, 33496, 33504, 33509, 33514, 33521, + 33528, 33532, 33536, 33539, 33542, 33545, 33548, 33551, 33554, 33561, + 33564, 33567, 33572, 33576, 33580, 33584, 33588, 33592, 33602, 33608, + 33614, 33620, 33628, 33636, 33642, 33648, 33655, 33661, 33666, 33672, + 33678, 33683, 33689, 33695, 33703, 33708, 33714, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33720, 33727, 33734, 33739, 33748, + 33756, 33764, 33771, 33778, 33785, 33792, 33800, 33808, 33818, 33828, + 33836, 33844, 33852, 33860, 33869, 33878, 33886, 33894, 33903, 33912, + 33922, 33932, 33941, 33950, 33958, 33966, 33974, 33982, 33992, 34002, + 34010, 34018, 34026, 34034, 34042, 34050, 34058, 34066, 34074, 34082, + 34090, 34098, 34107, 34116, 34125, 34134, 34144, 34154, 34161, 34168, + 34176, 34184, 34193, 34202, 34210, 34218, 34230, 34242, 34251, 34260, + 34269, 34278, 34285, 34292, 34300, 34308, 34316, 34324, 34332, 34340, + 34348, 34356, 34365, 34374, 34383, 34392, 34401, 34410, 34420, 34430, + 34440, 34450, 34459, 34468, 34475, 34482, 34490, 34498, 34506, 34514, + 34522, 34530, 34542, 34554, 34563, 34572, 34580, 34588, 34596, 34604, + 34615, 34626, 34637, 34648, 34660, 34672, 34680, 34688, 34696, 34704, + 34713, 34722, 34731, 34740, 34748, 34756, 34764, 34772, 34780, 34788, + 34797, 34806, 34816, 34826, 34834, 34842, 34850, 34858, 34866, 34874, + 34881, 34888, 34896, 34904, 34912, 34920, 34928, 34936, 34944, 34952, + 34960, 34968, 34976, 34984, 34992, 35000, 35008, 35016, 35025, 35034, + 35043, 35051, 35060, 35069, 35078, 35087, 35097, 35106, 35112, 35117, + 35124, 35131, 35139, 35147, 35156, 35165, 35175, 35185, 35196, 35207, + 35217, 35227, 35237, 35247, 35256, 35265, 35275, 35285, 35296, 35307, + 35317, 35327, 35337, 35347, 35354, 35361, 35369, 35377, 35384, 35391, + 35400, 35409, 35419, 35429, 35440, 35451, 35461, 35471, 35481, 35491, + 35500, 35509, 35517, 35525, 35532, 35539, 35547, 35555, 35564, 35573, + 35583, 35593, 35604, 35615, 35625, 35635, 35645, 35655, 35664, 35673, + 35683, 35693, 35704, 35715, 35725, 35735, 35745, 35755, 35762, 35769, + 35777, 35785, 35794, 35803, 35813, 35823, 35834, 35845, 35855, 35865, + 35875, 35885, 35893, 35901, 35909, 35917, 35926, 35935, 35943, 35951, + 35958, 35965, 35972, 35979, 35987, 35995, 36003, 36011, 36022, 36032, + 36043, 36053, 36064, 36074, 36082, 36090, 36101, 36111, 36122, 36132, + 36143, 36153, 36161, 36169, 36180, 36190, 36201, 0, 0, 36211, 36219, + 36227, 36238, 36248, 36259, 0, 0, 36269, 36277, 36285, 36296, 36306, + 36317, 36327, 36338, 36348, 36356, 36364, 36375, 36385, 36396, 36406, + 36417, 36427, 36435, 36443, 36454, 36464, 36475, 36485, 36496, 36506, + 36514, 36522, 36533, 36543, 36554, 36564, 36575, 36585, 36593, 36601, + 36612, 36622, 36633, 0, 0, 36643, 36651, 36659, 36670, 36680, 36691, 0, + 0, 36701, 36709, 36717, 36728, 36738, 36749, 36759, 36770, 0, 36780, 0, + 36788, 0, 36798, 0, 36808, 36818, 36826, 36834, 36845, 36855, 36866, + 36876, 36887, 36897, 36905, 36913, 36924, 36934, 36945, 36955, 36966, + 36976, 36984, 36992, 37000, 37008, 37016, 37024, 37032, 37040, 37048, + 37056, 37064, 37072, 37080, 0, 0, 37088, 37099, 37109, 37123, 37136, + 37150, 37163, 37177, 37190, 37201, 37211, 37225, 37238, 37252, 37265, + 37279, 37292, 37303, 37313, 37327, 37340, 37354, 37367, 37381, 37394, + 37405, 37415, 37429, 37442, 37456, 37469, 37483, 37496, 37507, 37517, + 37531, 37544, 37558, 37571, 37585, 37598, 37609, 37619, 37633, 37646, + 37660, 37673, 37687, 37700, 37708, 37716, 37727, 37735, 0, 37746, 37754, + 37765, 37773, 37781, 37789, 37797, 37805, 37808, 37811, 37814, 37817, + 37823, 37834, 37842, 0, 37853, 37861, 37872, 37880, 37888, 37896, 37904, + 37912, 37918, 37924, 37930, 37938, 37946, 37957, 0, 0, 37968, 37976, + 37987, 37995, 38003, 38011, 0, 38019, 38024, 38029, 38034, 38042, 38050, + 38061, 38072, 38080, 38088, 38096, 38107, 38115, 38123, 38131, 38139, + 38147, 38153, 38159, 0, 0, 38162, 38173, 38181, 0, 38192, 38200, 38211, + 38219, 38227, 38235, 38243, 38251, 38254, 0, 38257, 38261, 38265, 38269, + 38273, 38277, 38281, 38285, 38289, 38293, 38297, 38301, 38307, 38313, + 38319, 38322, 38325, 38327, 38331, 38335, 38339, 38343, 38345, 38349, + 38353, 38359, 38365, 38372, 38379, 38384, 38389, 38395, 38401, 38403, + 38406, 38408, 38412, 38416, 38420, 38423, 38427, 38431, 38435, 38439, + 38443, 38449, 38453, 38457, 38463, 38468, 38475, 38477, 38480, 38484, + 38488, 38493, 38499, 38501, 38510, 38519, 38522, 38526, 38528, 38530, + 38532, 38535, 38541, 38543, 38547, 38551, 38558, 38565, 38569, 38574, + 38579, 38584, 38589, 38593, 38597, 38600, 38604, 38608, 38615, 38620, + 38624, 38628, 38633, 38637, 38641, 38646, 38651, 38655, 38659, 38663, + 38665, 38670, 38675, 38679, 38683, 38687, 38691, 0, 0, 0, 0, 0, 38695, + 38701, 38707, 38714, 38721, 38726, 38731, 38735, 0, 0, 38741, 38744, + 38747, 38750, 38753, 38756, 38759, 38763, 38767, 38772, 38777, 38782, + 38788, 38792, 38795, 38798, 38801, 38804, 38807, 38810, 38813, 38816, + 38819, 38823, 38827, 38832, 38837, 0, 38842, 38848, 38854, 38860, 38867, + 38874, 38881, 38888, 38894, 38900, 38906, 38913, 38919, 0, 0, 0, 38926, + 38929, 38932, 38935, 38940, 38943, 38946, 38949, 38952, 38955, 38958, + 38962, 38965, 38968, 38971, 38974, 38977, 38982, 38985, 38988, 38991, + 38994, 38997, 39002, 39005, 39008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39013, 39018, 39023, 39030, 39038, 39043, + 39048, 39052, 39056, 39061, 39068, 39075, 39079, 39084, 39089, 39094, + 39099, 39106, 39111, 39116, 39121, 39130, 39137, 39144, 39148, 39153, + 39159, 39164, 39171, 39179, 39187, 39191, 39195, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 39199, 39203, 39211, 39215, 39219, 39224, 39228, + 39232, 39236, 39238, 39242, 39246, 39250, 39255, 39259, 39263, 39271, + 39274, 39278, 39281, 39284, 39290, 39293, 39296, 39302, 39306, 39310, + 39314, 39317, 39321, 39324, 39328, 39330, 39333, 39336, 39340, 39342, + 39346, 39349, 39352, 39357, 39362, 39369, 39372, 39375, 39379, 39384, + 39387, 39390, 39393, 39397, 39402, 39405, 39408, 39410, 39413, 39416, + 39419, 39423, 39428, 39431, 39435, 39439, 39443, 39447, 39452, 39458, + 39463, 39468, 39474, 39479, 39484, 39488, 39492, 39497, 39501, 39505, + 39508, 39510, 39515, 39521, 39528, 39535, 39542, 39549, 39556, 39563, + 39570, 39577, 39585, 39592, 39600, 39607, 39614, 39622, 39630, 39635, + 39640, 39645, 39650, 39655, 39660, 39665, 39670, 39675, 39680, 39686, + 39692, 39698, 39704, 39711, 39719, 39726, 39732, 39738, 39744, 39750, + 39756, 39762, 39768, 39774, 39780, 39787, 39794, 39801, 39808, 39816, + 39825, 39833, 39844, 39852, 39860, 39869, 39876, 39885, 39894, 39902, + 39911, 0, 0, 0, 0, 0, 0, 39919, 39921, 39924, 39926, 39929, 39932, 39935, + 39940, 39945, 39950, 39955, 39959, 39963, 39967, 39971, 39976, 39982, + 39987, 39993, 39998, 40003, 40008, 40014, 40019, 40025, 40031, 40035, + 40039, 40044, 40049, 40054, 40059, 40064, 40072, 40080, 40088, 40096, + 40103, 40111, 40118, 40125, 40134, 40146, 40153, 40160, 40167, 40174, + 40182, 40190, 40197, 40204, 40212, 40220, 40225, 40233, 40238, 40243, + 40249, 40254, 40260, 40267, 40274, 40279, 40285, 40290, 40293, 40297, + 40300, 40304, 40308, 40312, 40318, 40324, 40330, 40336, 40340, 40344, + 40348, 40352, 40358, 40364, 40368, 40373, 40377, 40382, 40387, 40392, + 40395, 40399, 40402, 40406, 40413, 40421, 40432, 40443, 40448, 40457, + 40464, 40473, 40482, 40486, 40492, 40500, 40504, 40509, 40514, 40520, + 40526, 40532, 40539, 40543, 40547, 40552, 40555, 40557, 40561, 40565, + 40573, 40577, 40579, 40581, 40585, 40593, 40598, 40604, 40614, 40621, + 40626, 40630, 40634, 40638, 40641, 40644, 40647, 40651, 40655, 40659, + 40663, 40667, 40670, 40674, 40678, 40681, 40683, 40686, 40688, 40692, + 40696, 40698, 40704, 40707, 40712, 40716, 40720, 40722, 40724, 40726, + 40729, 40733, 40737, 40741, 40745, 40749, 40755, 40761, 40763, 40765, + 40767, 40769, 40772, 40774, 40778, 40780, 40784, 40788, 40793, 40797, + 40801, 40805, 40809, 40813, 40819, 40823, 40833, 40843, 40847, 40853, + 40859, 40863, 40867, 40870, 40875, 40879, 40885, 40889, 40901, 40909, + 40913, 40917, 40923, 40927, 40930, 40932, 40935, 40939, 40943, 40950, + 40954, 40958, 40962, 40965, 40970, 40975, 40980, 40985, 40990, 40995, + 41003, 41011, 41015, 41019, 41021, 41026, 41030, 41034, 41042, 41050, + 41056, 41062, 41071, 41080, 41085, 41090, 41098, 41106, 41108, 41110, + 41115, 41120, 41126, 41132, 41138, 41144, 41148, 41152, 41159, 41166, + 41172, 41178, 41188, 41198, 41206, 41214, 41216, 41220, 41224, 41229, + 41234, 41241, 41248, 41251, 41254, 41257, 41260, 41263, 41268, 41272, + 41277, 41282, 41285, 41288, 41291, 41294, 41297, 41301, 41304, 41307, + 41310, 41313, 41315, 41317, 41319, 41321, 41329, 41337, 41343, 41347, + 41353, 41363, 41369, 41375, 41381, 41389, 41397, 41408, 41412, 41416, + 41418, 41424, 41426, 41428, 41430, 41432, 41438, 41441, 41447, 41453, + 41457, 41461, 41465, 41468, 41472, 41476, 41478, 41487, 41496, 41501, + 41506, 41512, 41518, 41524, 41527, 41530, 41533, 41536, 41538, 41543, + 41548, 41553, 41559, 41565, 41573, 41581, 41587, 41593, 41599, 41605, + 41614, 41623, 41632, 41641, 41650, 41659, 41668, 41677, 41686, 41695, + 41703, 41715, 41725, 41740, 41743, 41748, 41754, 41760, 41767, 41781, + 41796, 41802, 41808, 41815, 41821, 41829, 41835, 41848, 41862, 41867, + 41873, 41880, 41883, 41886, 41888, 41891, 41894, 41896, 41898, 41902, + 41905, 41908, 41911, 41914, 41919, 41924, 41929, 41934, 41939, 41942, + 41944, 41946, 41948, 41952, 41956, 41960, 41966, 41971, 41973, 41975, + 41980, 41985, 41990, 41995, 42000, 42005, 42007, 42009, 42018, 42022, + 42030, 42039, 42041, 42046, 42051, 42059, 42063, 42065, 42069, 42071, + 42075, 42079, 42083, 42085, 42087, 42089, 42094, 42101, 42108, 42115, + 42122, 42129, 42136, 42143, 42150, 42156, 42162, 42169, 42176, 42183, + 42190, 42196, 42202, 42209, 42216, 42223, 42231, 42238, 42246, 42253, + 42261, 42268, 42276, 42284, 42291, 42299, 42306, 42314, 42321, 42329, + 42336, 42343, 42350, 42357, 42364, 42372, 42379, 42386, 42393, 42401, + 42408, 42415, 42422, 42429, 42437, 42445, 42452, 42459, 42465, 42472, + 42477, 42484, 42491, 42500, 42507, 42515, 42523, 42528, 42533, 42538, + 42545, 42552, 42559, 42566, 42571, 42576, 42585, 42591, 42594, 42602, + 42605, 42610, 42615, 42618, 42621, 42629, 42632, 42637, 42640, 42647, + 42652, 42660, 42663, 42666, 42669, 42674, 42679, 42682, 42685, 42693, + 42696, 42701, 42708, 42712, 42716, 42721, 42726, 42732, 42737, 42743, + 42749, 42754, 42760, 42768, 42774, 42782, 42790, 42796, 42804, 42812, + 42821, 42829, 42835, 42843, 42852, 42860, 42864, 42869, 42882, 42895, + 42899, 42903, 42907, 42911, 42921, 42925, 42930, 42935, 42940, 42945, + 42950, 42955, 42965, 42975, 42983, 42993, 43003, 43011, 43021, 43031, + 43039, 43049, 43059, 43067, 43075, 43085, 43095, 43098, 43101, 43104, + 43109, 43113, 43119, 43126, 43133, 43141, 43148, 43152, 43156, 43160, + 43164, 43166, 43170, 43174, 43179, 43184, 43191, 43198, 43201, 43208, + 43210, 43212, 43216, 43220, 43225, 43231, 43237, 43243, 43249, 43258, + 43267, 43276, 43280, 43282, 43286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43293, 43297, 43304, 43311, 43318, 43325, 43329, 43333, 43337, 43341, + 43346, 43352, 43357, 43363, 43369, 43375, 43381, 43389, 43396, 43403, + 43410, 43417, 43422, 43428, 43437, 43441, 43448, 43452, 43456, 43462, + 43468, 43474, 43480, 43484, 43488, 43491, 43495, 43499, 43506, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43513, + 43516, 43520, 43524, 43530, 43536, 43542, 43550, 43557, 43561, 43569, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43574, 43577, + 43580, 43583, 43586, 43589, 43592, 43595, 43598, 43601, 43605, 43609, + 43613, 43617, 43621, 43625, 43629, 43633, 43637, 43641, 43645, 43648, + 43651, 43654, 43657, 43660, 43663, 43666, 43669, 43672, 43676, 43680, + 43684, 43688, 43692, 43696, 43700, 43704, 43708, 43712, 43716, 43722, + 43728, 43734, 43741, 43748, 43755, 43762, 43769, 43776, 43783, 43790, + 43797, 43804, 43811, 43818, 43825, 43832, 43839, 43846, 43853, 43858, + 43864, 43870, 43876, 43881, 43887, 43893, 43899, 43904, 43910, 43916, + 43921, 43926, 43931, 43936, 43942, 43948, 43953, 43958, 43964, 43969, + 43975, 43981, 43987, 43993, 43999, 44004, 44010, 44016, 44022, 44027, + 44033, 44039, 44045, 44050, 44056, 44062, 44067, 44072, 44077, 44082, + 44088, 44094, 44099, 44104, 44110, 44115, 44121, 44127, 44133, 44139, + 44145, 44150, 44156, 44162, 44168, 44173, 44179, 44185, 44191, 44196, + 44202, 44208, 44213, 44218, 44223, 44228, 44234, 44240, 44245, 44250, + 44256, 44261, 44267, 44273, 44279, 44285, 44291, 44295, 44300, 44305, + 44310, 44315, 44320, 44325, 44330, 44335, 44340, 44345, 44349, 44353, + 44357, 44361, 44365, 44369, 44373, 44377, 44381, 44386, 44391, 44396, + 44401, 44406, 44411, 44420, 44429, 44438, 44447, 44456, 44465, 44474, + 44483, 44490, 44498, 44506, 44513, 44520, 44528, 44536, 44543, 44550, + 44558, 44566, 44573, 44580, 44588, 44596, 44603, 44610, 44618, 44627, + 44636, 44644, 44653, 44662, 44669, 44676, 44684, 44693, 44702, 44710, + 44719, 44728, 44735, 44742, 44751, 44760, 44768, 44776, 44785, 44794, + 44801, 44808, 44817, 44826, 44834, 44842, 44851, 44860, 44867, 44874, + 44883, 44892, 44900, 44909, 44918, 44926, 44936, 44946, 44956, 44966, + 44975, 44984, 44993, 45002, 45009, 45017, 45025, 45033, 45041, 45046, + 45051, 45060, 45068, 45075, 45084, 45092, 45099, 45108, 45116, 45123, + 45132, 45140, 45147, 45156, 45164, 45171, 45180, 45188, 45195, 45204, + 45212, 45219, 45228, 45236, 45243, 45252, 45260, 45267, 45276, 45285, + 45294, 45303, 45317, 45331, 45338, 45343, 45348, 45353, 45358, 45363, + 45368, 45373, 45378, 45386, 45394, 45402, 45410, 45415, 45422, 45429, + 45436, 45441, 45449, 45456, 45464, 45468, 45475, 45481, 45488, 45492, + 45498, 45504, 45510, 45514, 45517, 45521, 45525, 45532, 45538, 45544, + 45550, 45556, 45570, 45580, 45594, 45608, 45614, 45624, 45638, 45641, + 45644, 45651, 45659, 45664, 45669, 45677, 45689, 45701, 45709, 45713, + 45717, 45720, 45723, 45727, 45731, 45734, 45737, 45742, 45747, 45753, + 45759, 45764, 45769, 45775, 45781, 45786, 45791, 45796, 45801, 45807, + 45813, 45818, 45823, 45829, 45835, 45840, 45845, 45848, 45851, 45860, + 45862, 45864, 45867, 45871, 45877, 45879, 45882, 45889, 45896, 45904, + 45912, 45922, 45936, 45941, 45946, 45950, 45955, 45963, 45971, 45980, + 45989, 45998, 46007, 46012, 46017, 46023, 46029, 46035, 46041, 46044, + 46050, 46056, 46066, 46076, 46084, 46092, 46101, 46110, 46114, 46122, + 46130, 46138, 46146, 46155, 46164, 46173, 46182, 46187, 46192, 46197, + 46202, 46207, 46213, 46219, 46224, 46230, 46232, 46234, 46236, 46238, + 46241, 46244, 46246, 46248, 46250, 46254, 46258, 46260, 46262, 46265, + 46268, 46272, 46278, 46284, 46286, 46293, 46297, 46302, 46307, 46309, + 46319, 46325, 46331, 46337, 46343, 46349, 46355, 46360, 46363, 46366, + 46369, 46371, 46373, 46377, 46381, 46386, 46391, 46396, 46399, 46403, + 46408, 46411, 46415, 46420, 46425, 46430, 46435, 46440, 46445, 46450, + 46455, 46460, 46465, 46470, 46475, 46481, 46487, 46493, 46495, 46498, + 46500, 46503, 46505, 46507, 46509, 46511, 46513, 46515, 46517, 46519, + 46521, 46523, 46525, 46527, 46529, 46531, 46533, 46535, 46537, 46542, + 46547, 46552, 46557, 46562, 46567, 46572, 46577, 46582, 46587, 46592, + 46597, 46602, 46607, 46612, 46617, 46622, 46627, 46632, 46637, 46641, + 46645, 46649, 46655, 46661, 46666, 46671, 46676, 46681, 46686, 46691, + 46699, 46707, 46715, 46723, 46731, 46739, 46747, 46755, 46761, 46766, + 46771, 46776, 46779, 46783, 46787, 46791, 46795, 46799, 46803, 46810, + 46817, 46825, 46833, 46838, 46843, 46850, 46857, 46864, 46871, 46874, + 46877, 46882, 46884, 46888, 46893, 46895, 46897, 46899, 46901, 46906, + 46909, 46911, 46916, 46923, 46930, 46933, 46937, 46942, 46947, 46955, + 46961, 46967, 46979, 46986, 46993, 46998, 47003, 47009, 47012, 47015, + 47020, 47022, 47026, 47028, 47030, 47032, 47034, 47036, 47038, 47043, + 47045, 47047, 47049, 47051, 47055, 47057, 47060, 47065, 47070, 47075, + 47080, 47086, 47092, 47094, 47097, 47104, 47111, 47118, 47125, 47129, + 47133, 47135, 47137, 47141, 47147, 47152, 47154, 47158, 47167, 47175, + 47183, 47189, 47195, 47200, 47206, 47211, 47214, 47228, 47231, 47236, + 47241, 47247, 47257, 47259, 47265, 47271, 47275, 47282, 47286, 47288, + 47290, 47294, 47300, 47305, 47311, 47313, 47319, 47321, 47327, 47329, + 47331, 47336, 47338, 47342, 47347, 47349, 47354, 47359, 47363, 47370, 0, + 47380, 47386, 47389, 47395, 47398, 47403, 47408, 47412, 47414, 47416, + 47420, 47424, 47428, 47432, 47437, 47439, 47444, 47447, 47450, 47453, + 47457, 47461, 47466, 47470, 47475, 47480, 47484, 47490, 47497, 47500, + 47506, 47511, 47515, 47520, 47526, 47532, 47539, 47545, 47552, 47559, + 47561, 47568, 47572, 47579, 47585, 47590, 47596, 47600, 47605, 47608, + 47614, 47620, 47627, 47635, 47642, 47651, 47661, 47668, 47674, 47678, + 47686, 47691, 47700, 47703, 47706, 47715, 47726, 47733, 47735, 47741, + 47746, 47748, 47751, 47755, 47763, 47772, 47775, 47780, 47785, 47793, + 47801, 47809, 47817, 47823, 47829, 47835, 47843, 47848, 47851, 47855, + 47858, 47870, 47880, 47891, 47900, 47911, 47921, 47930, 47936, 47944, + 47948, 47956, 47960, 47968, 47975, 47982, 47991, 48000, 48010, 48020, + 48030, 48040, 48049, 48058, 48068, 48078, 48087, 48096, 48102, 48108, + 48114, 48120, 48126, 48132, 48138, 48144, 48150, 48157, 48163, 48169, + 48175, 48181, 48187, 48193, 48199, 48205, 48211, 48218, 48225, 48232, + 48239, 48246, 48253, 48260, 48267, 48274, 48281, 48289, 48294, 48297, + 48301, 48305, 48311, 48314, 48320, 48326, 48331, 48335, 48340, 48346, + 48353, 48356, 48363, 48370, 48374, 48383, 48392, 48397, 48403, 48408, + 48413, 48420, 48427, 48435, 48443, 48452, 48456, 48465, 48470, 48474, + 48481, 48485, 48492, 48500, 48505, 48513, 48517, 48522, 48526, 48531, + 48535, 48540, 48545, 48554, 48556, 48560, 48564, 48571, 48578, 48583, + 48591, 48597, 0, 48603, 0, 48606, 48611, 48616, 48624, 48628, 48635, + 48643, 48651, 48656, 48661, 48667, 48672, 48677, 48683, 48688, 48691, + 48695, 48699, 48706, 48715, 48720, 48729, 48738, 48744, 48750, 48755, + 48760, 48765, 48770, 48776, 48782, 48790, 48798, 48804, 48810, 48815, + 48820, 48827, 48834, 48840, 48843, 48846, 48850, 48854, 48858, 48863, + 48869, 48875, 48882, 48889, 48894, 48898, 48902, 48906, 48910, 48914, + 48918, 48922, 48926, 48930, 48934, 48938, 48942, 48946, 48950, 48954, + 48958, 48962, 48966, 48970, 48974, 48978, 48982, 48986, 48990, 48994, + 48998, 49002, 49006, 49010, 49014, 49018, 49022, 49026, 49030, 49034, + 49038, 49042, 49046, 49050, 49054, 49058, 49062, 49066, 49070, 49074, + 49078, 49082, 49086, 49090, 49094, 49098, 49102, 49106, 49110, 49114, + 49118, 49122, 49126, 49130, 49134, 49138, 49142, 49146, 49150, 49154, + 49158, 49162, 49166, 49170, 49174, 49178, 49182, 49186, 49190, 49194, + 49198, 49202, 49206, 49210, 49214, 49218, 49222, 49226, 49230, 49234, + 49238, 49242, 49246, 49250, 49254, 49258, 49262, 49266, 49270, 49274, + 49278, 49282, 49286, 49290, 49294, 49298, 49302, 49306, 49310, 49314, + 49318, 49322, 49326, 49330, 49334, 49338, 49342, 49346, 49350, 49354, + 49358, 49362, 49366, 49370, 49374, 49378, 49382, 49386, 49390, 49394, + 49398, 49402, 49406, 49410, 49414, 49418, 49422, 49426, 49430, 49434, + 49438, 49442, 49446, 49450, 49454, 49458, 49462, 49466, 49470, 49474, + 49478, 49482, 49486, 49490, 49494, 49498, 49502, 49506, 49510, 49514, + 49518, 49522, 49526, 49530, 49534, 49538, 49542, 49546, 49550, 49554, + 49558, 49562, 49566, 49570, 49574, 49578, 49582, 49586, 49590, 49594, + 49598, 49602, 49606, 49610, 49614, 49618, 49622, 49626, 49630, 49634, + 49638, 49642, 49646, 49650, 49654, 49658, 49662, 49666, 49670, 49674, + 49678, 49682, 49686, 49690, 49694, 49698, 49702, 49706, 49710, 49714, + 49718, 49722, 49726, 49730, 49734, 49738, 49742, 49746, 49750, 49754, + 49758, 49762, 49766, 49770, 49774, 49778, 49782, 49786, 49790, 49794, + 49798, 49802, 49806, 49810, 49814, 49818, 49822, 49826, 49830, 49834, + 49838, 49842, 49846, 49850, 49854, 49858, 49862, 49866, 49870, 49874, + 49878, 49882, 49886, 49890, 49894, 49898, 49902, 49906, 49910, 49914, + 49918, 49925, 49933, 49939, 49945, 49952, 49959, 49965, 49971, 49977, + 49983, 49988, 49993, 49998, 50003, 50009, 50015, 50023, 50030, 50036, + 50042, 50050, 50059, 50066, 50076, 50087, 50090, 50093, 50097, 50101, + 50108, 50115, 50126, 50137, 50147, 50157, 50164, 50171, 50178, 50185, + 50196, 50207, 50218, 50229, 50239, 50249, 50261, 50273, 50284, 50295, + 50307, 50319, 50328, 50338, 50348, 50359, 50370, 50377, 50384, 50391, + 50398, 50408, 50418, 50426, 50434, 50441, 50448, 50455, 50462, 50469, + 50474, 50479, 50485, 50493, 50503, 50511, 50519, 50527, 50535, 50543, + 50551, 50559, 50567, 50576, 50585, 50595, 50605, 50614, 50623, 50633, + 50643, 50652, 50661, 50671, 50681, 50690, 50699, 50709, 50719, 50733, + 50750, 50764, 50781, 50795, 50809, 50823, 50837, 50847, 50858, 50868, + 50879, 50896, 50913, 50921, 50927, 50934, 50941, 50948, 50955, 50960, + 50966, 50971, 50976, 50982, 50987, 50992, 50997, 51002, 51007, 51014, + 51019, 51026, 51031, 51036, 51040, 51044, 51051, 51058, 51065, 51072, + 51079, 51086, 51099, 51112, 51125, 51138, 51146, 51154, 51160, 51166, + 51173, 51180, 51187, 51194, 51198, 51203, 51211, 51219, 51227, 51234, + 51238, 51246, 51254, 51258, 51262, 51267, 51274, 51282, 51290, 51310, + 51330, 51350, 51370, 51390, 51410, 51430, 51450, 51456, 51463, 51472, + 51480, 51488, 51493, 51496, 51499, 51504, 51507, 51526, 51533, 51539, + 51545, 51549, 51552, 51555, 51558, 51570, 51583, 51590, 51597, 51600, + 51604, 51607, 51612, 51617, 51622, 51628, 51637, 51644, 51651, 51659, + 51666, 51673, 51676, 51682, 51688, 51691, 51694, 51699, 51704, 51710, + 51716, 51720, 51725, 51732, 51736, 51742, 51746, 51750, 51758, 51770, + 51779, 51783, 51785, 51794, 51803, 51809, 51812, 51818, 51824, 51829, + 51834, 51839, 51844, 51849, 51854, 51856, 51862, 51867, 51874, 51878, + 51884, 51887, 51891, 51898, 51905, 51907, 51909, 51915, 51921, 51927, + 51936, 51945, 51952, 51959, 51965, 51971, 51976, 51981, 51986, 51992, + 51998, 52003, 52010, 52014, 52018, 52031, 52044, 52056, 52065, 52071, + 52078, 52083, 52088, 52093, 52098, 52103, 52105, 52112, 52119, 52126, + 52133, 52140, 52148, 52154, 52159, 52165, 52171, 52177, 52184, 52190, + 52198, 52206, 52214, 52222, 52229, 52235, 52241, 52250, 52254, 52263, + 52272, 52281, 52289, 52293, 52299, 52306, 52313, 52317, 52323, 52330, + 52335, 52340, 52346, 52351, 52356, 52363, 52370, 52375, 52380, 52388, + 52396, 52406, 52416, 52423, 52430, 52434, 52438, 52450, 52456, 52462, + 52467, 52472, 52479, 52486, 52492, 52498, 52507, 52515, 52523, 52530, + 52537, 52544, 52550, 52557, 52563, 52570, 52577, 52584, 52591, 52597, + 52602, 52611, 52621, 52628, 52637, 52643, 52648, 52653, 52663, 52669, + 52675, 52681, 52689, 52694, 52701, 52708, 52719, 52726, 52733, 52740, + 52747, 52754, 52761, 52768, 52780, 52792, 52803, 52814, 52827, 52840, + 52845, 52850, 52859, 52868, 52875, 52882, 52891, 52900, 52908, 52916, + 52924, 52932, 52942, 52952, 52966, 52980, 52988, 52996, 53008, 53020, + 53028, 53036, 53046, 53056, 53061, 53066, 53075, 53084, 53089, 53094, + 53102, 53108, 53114, 53122, 53130, 53143, 53156, 53160, 53164, 53171, + 53178, 53185, 53193, 53201, 53210, 53219, 53225, 53231, 53238, 53245, + 53252, 53259, 53268, 53277, 53280, 53283, 53288, 53293, 53299, 53305, + 53312, 53319, 53329, 53339, 53346, 53353, 53361, 53369, 53377, 53385, + 53393, 53401, 53408, 53415, 53419, 53423, 53430, 53437, 53442, 53447, + 53452, 53457, 53463, 53477, 53484, 53491, 53495, 53497, 53499, 53504, + 53509, 53514, 53518, 53526, 53533, 53540, 53548, 53560, 53568, 53576, + 53587, 53591, 53595, 53601, 53609, 53622, 53629, 53636, 53643, 53648, + 53655, 53664, 53672, 53678, 53684, 53690, 53699, 53708, 53716, 53725, + 53730, 53733, 53738, 53744, 53750, 53756, 53762, 53766, 53769, 53773, + 53777, 53783, 53789, 53795, 53801, 53805, 53809, 53816, 53823, 53830, + 53837, 53844, 53851, 53861, 53871, 53878, 53885, 53893, 53901, 53905, + 53910, 53915, 53921, 53927, 53930, 53933, 53936, 53939, 53943, 53948, + 53953, 53958, 53963, 53968, 53972, 53976, 53980, 53984, 53988, 53992, + 53996, 54002, 54006, 54012, 54017, 54024, 54032, 54039, 54047, 54054, + 54062, 54071, 54078, 54088, 54099, 54105, 54114, 54120, 54129, 54138, + 54144, 54150, 54154, 54158, 54167, 54176, 54183, 54190, 54199, 0, 0, 0, + 54208, 54213, 54217, 54221, 54226, 54231, 54236, 54244, 54252, 54255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52948, 52953, 52958, 52963, 52968, - 52973, 52978, 52983, 52988, 52993, 52998, 53004, 53008, 53013, 53018, - 53023, 53028, 53033, 53038, 53043, 53048, 53053, 53058, 53063, 53068, - 53073, 53078, 53083, 53088, 53093, 53098, 53103, 53108, 53113, 53118, - 53124, 53129, 53135, 53144, 53149, 53157, 53164, 53173, 53178, 53183, - 53188, 53194, 0, 53201, 53206, 53211, 53216, 53221, 53226, 53231, 53236, - 53241, 53246, 53251, 53257, 53261, 53266, 53271, 53276, 53281, 53286, - 53291, 53296, 53301, 53306, 53311, 53316, 53321, 53326, 53331, 53336, - 53341, 53346, 53351, 53356, 53361, 53366, 53371, 53377, 53382, 53388, - 53397, 53402, 53410, 53417, 53426, 53431, 53436, 53441, 53447, 0, 53454, - 53462, 53470, 53480, 53487, 53495, 53501, 53510, 53518, 53526, 53534, - 53542, 53550, 53558, 53563, 53570, 53575, 53581, 53589, 53596, 53603, - 53611, 53617, 53623, 53630, 53637, 53646, 53656, 53662, 53669, 53674, - 53684, 53694, 53699, 53704, 53709, 53714, 53719, 53724, 53729, 53734, - 53739, 53744, 53749, 53754, 53759, 53764, 53769, 53774, 53779, 53784, - 53789, 53794, 53799, 53804, 53809, 53814, 53819, 53824, 53829, 53834, - 53839, 53844, 53848, 53852, 53857, 53862, 53867, 53872, 53877, 53882, - 53887, 53892, 53897, 53902, 53907, 53912, 53917, 53922, 53927, 53932, - 53937, 53942, 53949, 53956, 53963, 53970, 53977, 53984, 53991, 53998, - 54005, 54012, 54019, 54026, 54033, 54040, 54045, 54050, 54057, 54064, - 54071, 54078, 54085, 54092, 54099, 54106, 54113, 54120, 54127, 54134, - 54140, 54146, 54152, 54158, 54165, 54172, 54179, 54186, 54193, 54200, - 54207, 54214, 54221, 54228, 54236, 54244, 54252, 54260, 54268, 54276, - 54284, 54292, 54296, 54302, 54308, 54312, 54318, 54324, 54330, 54337, - 54344, 54351, 54358, 54363, 54369, 0, 0, 0, 0, 0, 0, 0, 54375, 54383, - 54392, 54401, 54409, 54415, 54420, 54425, 54430, 54435, 54440, 54445, - 54450, 54455, 54460, 54465, 54470, 54475, 54480, 54485, 54490, 54495, - 54500, 54505, 54510, 54515, 54520, 54525, 54530, 54535, 54540, 54545, - 54550, 54555, 54560, 54565, 54570, 54575, 54580, 54585, 54590, 54595, - 54600, 54605, 54610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54615, 54619, 54624, - 54629, 54634, 54639, 54648, 54653, 54658, 54663, 54668, 54673, 54678, - 54683, 54688, 54695, 54700, 54705, 54714, 54721, 54726, 54731, 54736, - 54743, 54748, 54755, 54760, 54765, 54772, 54779, 54784, 54789, 54794, - 54801, 54808, 54813, 54818, 54823, 54828, 54833, 54840, 54847, 54852, - 54857, 54862, 54867, 54872, 54877, 54882, 54887, 54892, 54897, 54902, - 54909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 54921, 54925, 54929, 54933, 54937, 54941, 54945, 54949, - 54953, 54957, 54961, 54967, 54971, 54975, 54979, 54983, 54987, 54991, - 54995, 54999, 55003, 55007, 55011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55015, - 55019, 55023, 55027, 55031, 55035, 55039, 0, 55043, 55047, 55051, 55055, - 55059, 55063, 55067, 0, 55071, 55075, 55079, 55083, 55087, 55091, 55095, - 0, 55099, 55103, 55107, 55111, 55115, 55119, 55123, 0, 55127, 55131, - 55135, 55139, 55143, 55147, 55151, 0, 55155, 55159, 55163, 55167, 55171, - 55175, 55179, 0, 55183, 55187, 55191, 55195, 55199, 55203, 55207, 0, - 55211, 55215, 55219, 55223, 55227, 55231, 55235, 0, 55239, 55244, 55249, - 55254, 55259, 55264, 55269, 55273, 55278, 55283, 55288, 55292, 55297, - 55302, 55307, 55312, 55316, 55321, 55326, 55331, 55336, 55341, 55346, - 55350, 55355, 55360, 55367, 55372, 55377, 55383, 55390, 55397, 55406, - 55413, 55422, 55426, 55430, 55436, 55442, 55448, 55456, 55462, 55466, - 55470, 55474, 55480, 55486, 55490, 55492, 55496, 55501, 55503, 55507, - 55511, 55515, 55521, 55526, 55530, 55534, 55539, 55545, 55550, 55555, - 55560, 55565, 55572, 55579, 55584, 55589, 55594, 55599, 55604, 55609, - 55613, 55617, 55624, 55631, 55637, 55641, 55645, 55648, 55652, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54259, 54264, 54269, 54274, 54279, + 54284, 54289, 54294, 54299, 54304, 54309, 54315, 54319, 54324, 54329, + 54334, 54339, 54344, 54349, 54354, 54359, 54364, 54369, 54374, 54379, + 54384, 54389, 54394, 54399, 54404, 54409, 54414, 54419, 54424, 54429, + 54435, 54440, 54446, 54455, 54460, 54468, 54475, 54484, 54489, 54494, + 54499, 54505, 0, 54512, 54517, 54522, 54527, 54532, 54537, 54542, 54547, + 54552, 54557, 54562, 54568, 54572, 54577, 54582, 54587, 54592, 54597, + 54602, 54607, 54612, 54617, 54622, 54627, 54632, 54637, 54642, 54647, + 54652, 54657, 54662, 54667, 54672, 54677, 54682, 54688, 54693, 54699, + 54708, 54713, 54721, 54728, 54737, 54742, 54747, 54752, 54758, 0, 54765, + 54773, 54781, 54791, 54798, 54806, 54812, 54821, 54829, 54837, 54845, + 54853, 54861, 54869, 54874, 54881, 54887, 54894, 54902, 54909, 54916, + 54924, 54930, 54936, 54943, 54950, 54960, 54970, 54977, 54984, 54989, + 54999, 55009, 55014, 55019, 55024, 55029, 55034, 55039, 55044, 55049, + 55054, 55059, 55064, 55069, 55074, 55079, 55084, 55089, 55094, 55099, + 55104, 55109, 55114, 55119, 55124, 55129, 55134, 55139, 55144, 55149, + 55154, 55159, 55163, 55167, 55172, 55177, 55182, 55187, 55192, 55197, + 55202, 55207, 55212, 55217, 55222, 55227, 55232, 55237, 55242, 55247, + 55252, 55257, 55264, 55271, 55278, 55285, 55292, 55299, 55306, 55313, + 55320, 55327, 55334, 55341, 55348, 55355, 55360, 55365, 55372, 55379, + 55386, 55393, 55400, 55407, 55414, 55421, 55428, 55435, 55442, 55449, + 55455, 55461, 55467, 55473, 55480, 55487, 55494, 55501, 55508, 55515, + 55522, 55529, 55536, 55543, 55551, 55559, 55567, 55575, 55583, 55591, + 55599, 55607, 55611, 55617, 55623, 55627, 55633, 55639, 55645, 55652, + 55659, 55666, 55673, 55678, 55684, 0, 0, 0, 0, 0, 0, 0, 55690, 55698, + 55707, 55716, 55724, 55730, 55735, 55740, 55745, 55750, 55755, 55760, + 55765, 55770, 55775, 55780, 55785, 55790, 55795, 55800, 55805, 55810, + 55815, 55820, 55825, 55830, 55835, 55840, 55845, 55850, 55855, 55860, + 55865, 55870, 55875, 55880, 55885, 55890, 55895, 55900, 55905, 55910, + 55915, 55920, 55925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55930, 55934, 55939, + 55944, 55949, 55954, 55963, 55968, 55973, 55978, 55983, 55988, 55993, + 55998, 56003, 56010, 56015, 56020, 56029, 56036, 56041, 56046, 56051, + 56058, 56063, 56070, 56075, 56080, 56087, 56094, 56099, 56104, 56109, + 56116, 56123, 56128, 56133, 56138, 56143, 56148, 56155, 56162, 56167, + 56172, 56177, 56182, 56187, 56192, 56197, 56202, 56207, 56212, 56217, + 56224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56229, 56236, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 56241, 56247, 56251, 56255, 56259, 56263, 56267, 56271, + 56275, 56279, 56283, 56287, 56293, 56297, 56301, 56305, 56309, 56313, + 56317, 56321, 56325, 56329, 56333, 56337, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56341, 56345, 56349, 56353, 56357, 56361, 56365, 0, 56369, 56373, 56377, + 56381, 56385, 56389, 56393, 0, 56397, 56401, 56405, 56409, 56413, 56417, + 56421, 0, 56425, 56429, 56433, 56437, 56441, 56445, 56449, 0, 56453, + 56457, 56461, 56465, 56469, 56473, 56477, 0, 56481, 56485, 56489, 56493, + 56497, 56501, 56505, 0, 56509, 56513, 56517, 56521, 56525, 56529, 56533, + 0, 56537, 56541, 56545, 56549, 56553, 56557, 56561, 0, 56565, 56570, + 56575, 56580, 56585, 56590, 56595, 56599, 56604, 56609, 56614, 56618, + 56623, 56628, 56633, 56638, 56642, 56647, 56652, 56657, 56662, 56667, + 56672, 56676, 56681, 56686, 56693, 56698, 56703, 56709, 56716, 56723, + 56732, 56739, 56748, 56752, 56756, 56762, 56768, 56774, 56782, 56788, + 56792, 56796, 56800, 56806, 56812, 56816, 56818, 56822, 56828, 56830, + 56834, 56838, 56842, 56848, 56853, 56857, 56861, 56866, 56872, 56877, + 56882, 56887, 56892, 56899, 56906, 56911, 56916, 56921, 56926, 56931, + 56936, 56940, 56944, 56951, 56958, 56964, 56968, 56973, 56976, 56980, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 55660, 55664, 55668, 55673, 55678, 55683, 55687, 55691, 55695, - 55700, 55705, 55709, 55713, 55717, 55721, 55726, 55731, 55736, 55741, - 55745, 55749, 55754, 55759, 55764, 55769, 55773, 0, 55777, 55781, 55785, - 55789, 55793, 55797, 55801, 55806, 55811, 55815, 55820, 55825, 55834, - 55838, 55842, 55846, 55853, 55857, 55862, 55867, 55871, 55875, 55881, - 55886, 55891, 55896, 55901, 55905, 55909, 55913, 55917, 55921, 55926, - 55931, 55935, 55939, 55944, 55949, 55954, 55958, 55962, 55967, 55972, - 55978, 55984, 55988, 55994, 56000, 56004, 56010, 56016, 56021, 56026, - 56030, 56036, 56040, 56044, 56050, 56056, 56061, 56066, 56070, 56074, - 56082, 56088, 56094, 56100, 56105, 56110, 56115, 56121, 56125, 56131, - 56135, 56139, 56145, 56151, 56157, 56163, 56169, 56175, 56181, 56187, - 56193, 56199, 56205, 56211, 56215, 56221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 56227, 56230, 56234, 56238, 56242, 56246, 56249, 56252, 56256, - 56260, 56264, 56268, 56271, 56276, 56280, 56284, 56288, 56294, 56298, - 56302, 56306, 56310, 56317, 56323, 56327, 56331, 56335, 56339, 56343, - 56347, 56351, 56355, 56359, 56363, 56367, 56373, 56377, 56381, 56385, - 56389, 56393, 56397, 56401, 56405, 56409, 56413, 56417, 56421, 56425, - 56429, 56433, 56437, 56443, 56449, 56454, 56459, 56463, 56467, 56471, - 56475, 56479, 56483, 56487, 56491, 56495, 56499, 56503, 56507, 56511, - 56515, 56519, 56523, 56527, 56531, 56535, 56539, 56543, 56547, 56551, - 56555, 56561, 56565, 56569, 56573, 56577, 56581, 56585, 56589, 56593, - 56598, 56605, 56609, 56613, 56617, 56621, 56625, 56629, 56633, 56637, - 56641, 56645, 56649, 56653, 56660, 56664, 56670, 56674, 56678, 56682, - 56686, 56690, 56693, 56697, 56701, 56705, 56709, 56713, 56717, 56721, - 56725, 56729, 56733, 56737, 56741, 56745, 56749, 56753, 56757, 56761, - 56765, 56769, 56773, 56777, 56781, 56785, 56789, 56793, 56797, 56801, - 56805, 56809, 56813, 56817, 56821, 56827, 56831, 56835, 56839, 56843, - 56847, 56851, 56855, 56859, 56863, 56867, 56871, 56875, 56879, 56883, - 56887, 56891, 56895, 56899, 56903, 56907, 56911, 56915, 56919, 56923, - 56927, 56931, 56935, 56943, 56947, 56951, 56955, 56959, 56963, 56969, - 56973, 56977, 56981, 56985, 56989, 56993, 56997, 57001, 57005, 57009, - 57013, 57017, 57021, 57027, 57031, 57035, 57039, 57043, 57047, 57051, - 57055, 57059, 57063, 57067, 57071, 57075, 57079, 57083, 57087, 57091, - 57095, 57099, 57103, 57107, 57111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57115, 57123, 57130, 57141, 57151, - 57159, 57168, 57177, 57187, 57199, 57211, 57223, 0, 0, 0, 0, 57229, - 57232, 57235, 57240, 57243, 57250, 57254, 57258, 57262, 57266, 57270, - 57275, 57280, 57284, 57288, 57293, 57298, 57303, 57308, 57311, 57314, - 57320, 57326, 57331, 57336, 57343, 57350, 57354, 57358, 57362, 57369, - 57375, 57382, 57387, 57392, 57397, 57402, 57407, 57412, 57417, 57422, - 57427, 57432, 57437, 57442, 57447, 57452, 57458, 57463, 57467, 57473, - 57484, 57494, 57509, 57519, 57523, 57532, 57538, 57544, 57550, 57555, - 57558, 57563, 57567, 0, 57573, 57577, 57580, 57584, 57587, 57591, 57594, - 57598, 57601, 57605, 57608, 57611, 57615, 57619, 57623, 57627, 57631, - 57635, 57639, 57643, 57647, 57651, 57655, 57659, 57663, 57667, 57671, - 57675, 57679, 57683, 57687, 57691, 57695, 57699, 57703, 57708, 57712, - 57716, 57720, 57724, 57727, 57731, 57734, 57738, 57742, 57746, 57750, - 57753, 57757, 57760, 57764, 57768, 57772, 57776, 57780, 57784, 57788, - 57792, 57796, 57800, 57804, 57808, 57811, 57815, 57819, 57823, 57827, - 57831, 57834, 57839, 57843, 57848, 57852, 57855, 57859, 57863, 57867, - 57871, 57876, 57880, 57884, 57888, 57892, 57895, 57899, 57903, 0, 0, - 57908, 57916, 57924, 57931, 57938, 57942, 57948, 57953, 57958, 57962, - 57965, 57969, 57972, 57976, 57979, 57983, 57986, 57990, 57993, 57996, - 58000, 58004, 58008, 58012, 58016, 58020, 58024, 58028, 58032, 58036, - 58040, 58044, 58048, 58052, 58056, 58060, 58064, 58068, 58072, 58076, - 58080, 58084, 58088, 58093, 58097, 58101, 58105, 58109, 58112, 58116, - 58119, 58123, 58127, 58131, 58135, 58138, 58142, 58145, 58149, 58153, - 58157, 58161, 58165, 58169, 58173, 58177, 58181, 58185, 58189, 58193, - 58196, 58200, 58204, 58208, 58212, 58216, 58219, 58224, 58228, 58233, - 58237, 58240, 58244, 58248, 58252, 58256, 58261, 58265, 58269, 58273, - 58277, 58280, 58284, 58288, 58293, 58297, 58301, 58305, 58309, 58314, - 58321, 58325, 58331, 0, 0, 0, 0, 0, 58336, 58340, 58344, 58347, 58351, - 58355, 58359, 58362, 58365, 58369, 58373, 58377, 58381, 58385, 58389, - 58393, 58397, 58401, 58404, 58408, 58412, 58415, 58418, 58421, 58424, - 58428, 58432, 58436, 58440, 58444, 58448, 58452, 58456, 58460, 58464, - 58467, 58470, 58474, 58478, 58482, 58486, 0, 0, 0, 58490, 58494, 58498, - 58502, 58506, 58510, 58514, 58518, 58522, 58526, 58530, 58534, 58538, - 58542, 58546, 58550, 58554, 58558, 58562, 58566, 58570, 58574, 58578, - 58582, 58586, 58590, 58594, 58598, 58602, 58606, 58610, 58613, 58617, - 58620, 58624, 58628, 58631, 58635, 58639, 58642, 58646, 58650, 58654, - 58658, 58661, 58665, 58669, 58673, 58677, 58681, 58685, 58688, 58691, - 58695, 58699, 58703, 58707, 58711, 58715, 58719, 58723, 58727, 58731, - 58735, 58739, 58743, 58747, 58751, 58755, 58759, 58763, 58767, 58771, - 58775, 58779, 58783, 58787, 58791, 58795, 58799, 58803, 58807, 58811, - 58815, 58819, 58823, 58827, 58831, 58835, 58839, 58843, 58847, 58851, - 58855, 0, 58859, 58865, 58871, 58876, 58881, 58886, 58892, 58898, 58904, - 58910, 58916, 58922, 58928, 58934, 58940, 58946, 58952, 58956, 58960, + 0, 0, 0, 0, 0, 56988, 56992, 56996, 57001, 57006, 57011, 57015, 57019, + 57023, 57028, 57033, 57037, 57041, 57045, 57049, 57054, 57059, 57064, + 57069, 57073, 57077, 57082, 57087, 57092, 57097, 57101, 0, 57105, 57109, + 57113, 57117, 57121, 57125, 57129, 57134, 57139, 57143, 57148, 57153, + 57162, 57166, 57170, 57174, 57181, 57185, 57190, 57195, 57199, 57203, + 57209, 57214, 57219, 57224, 57229, 57233, 57237, 57241, 57245, 57249, + 57254, 57259, 57263, 57267, 57272, 57277, 57282, 57286, 57290, 57295, + 57300, 57306, 57312, 57316, 57322, 57328, 57332, 57338, 57344, 57349, + 57354, 57358, 57364, 57368, 57372, 57378, 57384, 57389, 57394, 57398, + 57402, 57410, 57416, 57422, 57428, 57433, 57438, 57443, 57449, 57453, + 57459, 57463, 57467, 57473, 57479, 57485, 57491, 57497, 57503, 57509, + 57515, 57521, 57527, 57533, 57539, 57543, 57549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 57555, 57558, 57562, 57566, 57570, 57574, 57577, 57580, + 57584, 57588, 57592, 57596, 57599, 57604, 57608, 57612, 57616, 57622, + 57626, 57630, 57634, 57638, 57645, 57651, 57655, 57659, 57663, 57667, + 57671, 57675, 57679, 57683, 57687, 57691, 57695, 57701, 57705, 57709, + 57713, 57717, 57721, 57725, 57729, 57733, 57737, 57741, 57745, 57749, + 57753, 57757, 57761, 57765, 57771, 57777, 57782, 57787, 57791, 57795, + 57799, 57803, 57807, 57811, 57815, 57819, 57823, 57827, 57831, 57835, + 57839, 57843, 57847, 57851, 57855, 57859, 57863, 57867, 57871, 57875, + 57879, 57883, 57889, 57893, 57897, 57901, 57905, 57909, 57913, 57917, + 57921, 57926, 57933, 57937, 57941, 57945, 57949, 57953, 57957, 57961, + 57965, 57969, 57973, 57977, 57981, 57988, 57992, 57998, 58002, 58006, + 58010, 58014, 58018, 58021, 58025, 58029, 58033, 58037, 58041, 58045, + 58049, 58053, 58057, 58061, 58065, 58069, 58073, 58077, 58081, 58085, + 58089, 58093, 58097, 58101, 58105, 58109, 58113, 58117, 58121, 58125, + 58129, 58133, 58137, 58141, 58145, 58149, 58155, 58159, 58163, 58167, + 58171, 58175, 58179, 58183, 58187, 58191, 58195, 58199, 58203, 58207, + 58211, 58215, 58219, 58223, 58227, 58231, 58235, 58239, 58243, 58247, + 58251, 58255, 58259, 58263, 58271, 58275, 58279, 58283, 58287, 58291, + 58297, 58301, 58305, 58309, 58313, 58317, 58321, 58325, 58329, 58333, + 58337, 58341, 58345, 58349, 58355, 58359, 58363, 58367, 58371, 58375, + 58379, 58383, 58387, 58391, 58395, 58399, 58403, 58407, 58411, 58415, + 58419, 58423, 58427, 58431, 58435, 58439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58443, 58452, 58460, + 58472, 58483, 58491, 58500, 58509, 58519, 58531, 58543, 58555, 0, 0, 0, + 0, 58561, 58564, 58567, 58572, 58575, 58582, 58586, 58590, 58594, 58598, + 58602, 58607, 58612, 58616, 58620, 58625, 58630, 58635, 58640, 58643, + 58646, 58652, 58658, 58663, 58668, 58675, 58682, 58686, 58690, 58694, + 58702, 58708, 58715, 58720, 58725, 58730, 58735, 58740, 58745, 58750, + 58755, 58760, 58765, 58770, 58775, 58780, 58785, 58791, 58796, 58800, + 58806, 58817, 58827, 58842, 58852, 58856, 58865, 58871, 58877, 58883, + 58888, 58891, 58896, 58900, 0, 58906, 58910, 58913, 58917, 58920, 58924, + 58927, 58931, 58934, 58938, 58941, 58944, 58948, 58952, 58956, 58960, 58964, 58968, 58972, 58976, 58980, 58984, 58988, 58992, 58996, 59000, - 59004, 59008, 59012, 59016, 59020, 59024, 59028, 59032, 59037, 59042, - 59047, 0, 0, 0, 0, 0, 0, 0, 0, 59052, 59056, 59060, 59064, 59068, 59072, - 59076, 59080, 59084, 59088, 59092, 59096, 59100, 59104, 59108, 59112, - 59115, 59119, 59122, 59126, 59130, 59134, 59138, 59142, 59146, 59150, - 59154, 59158, 59162, 59166, 59170, 59174, 59178, 59182, 59186, 59190, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59194, 59199, 59204, 59209, 59213, - 59218, 59222, 59227, 59232, 59237, 59242, 59247, 59251, 59256, 59261, - 59266, 59271, 59275, 59279, 59283, 59287, 59291, 59295, 59299, 59303, - 59307, 59311, 59315, 59319, 59323, 59327, 59332, 59337, 59342, 59347, - 59352, 59357, 59362, 59367, 59372, 59377, 59382, 59387, 59392, 59397, - 59402, 59408, 0, 59415, 59418, 59421, 59424, 59427, 59430, 59433, 59436, - 59439, 59442, 59446, 59450, 59454, 59458, 59462, 59466, 59470, 59474, - 59478, 59482, 59486, 59490, 59494, 59498, 59502, 59506, 59510, 59514, - 59518, 59522, 59526, 59530, 59534, 59538, 59542, 59546, 59550, 59554, - 59558, 59562, 59566, 59575, 59584, 59593, 59602, 59611, 59620, 59629, - 59638, 59641, 59646, 59651, 59656, 59661, 59666, 59671, 59676, 59681, - 59686, 59690, 59695, 59700, 59705, 59710, 59715, 59719, 59723, 59727, - 59731, 59735, 59739, 59743, 59747, 59751, 59755, 59759, 59763, 59767, - 59771, 59776, 59781, 59786, 59791, 59796, 59801, 59806, 59811, 59816, - 59821, 59826, 59831, 59836, 59841, 59847, 59853, 59858, 59863, 59866, - 59869, 59872, 59875, 59878, 59881, 59884, 59887, 59890, 59894, 59898, - 59902, 59906, 59910, 59914, 59918, 59922, 59926, 59930, 59934, 59938, - 59942, 59946, 59950, 59954, 59958, 59962, 59966, 59970, 59974, 59978, - 59982, 59986, 59990, 59994, 59998, 60002, 60006, 60010, 60014, 60018, - 60022, 60026, 60030, 60034, 60038, 60042, 60046, 60050, 60055, 60060, - 60065, 60070, 60074, 60079, 60084, 60089, 60094, 60099, 60104, 60109, - 60114, 60119, 60123, 60129, 60135, 60141, 60147, 60153, 60159, 60165, - 60171, 60177, 60183, 60189, 60195, 60198, 60201, 60204, 60209, 60212, - 60215, 60218, 60221, 60224, 60227, 60231, 60235, 60239, 60243, 60247, - 60251, 60255, 60259, 60263, 60267, 60271, 60275, 60279, 60282, 60285, - 60289, 60293, 60297, 60301, 60304, 60308, 60312, 60316, 60320, 60323, - 60327, 60331, 60335, 60339, 60342, 60346, 60350, 60353, 60357, 60361, - 60365, 60369, 60373, 60377, 60381, 0, 60385, 60388, 60391, 60394, 60397, - 60400, 60403, 60406, 60409, 60412, 60415, 60418, 60421, 60424, 60427, - 60430, 60433, 60436, 60439, 60442, 60445, 60448, 60451, 60454, 60457, - 60460, 60463, 60466, 60469, 60472, 60475, 60478, 60481, 60484, 60487, - 60490, 60493, 60496, 60499, 60502, 60505, 60508, 60511, 60514, 60517, - 60520, 60523, 60526, 60529, 60532, 60535, 60538, 60541, 60544, 60547, - 60550, 60553, 60556, 60559, 60562, 60565, 60568, 60571, 60574, 60577, - 60580, 60583, 60586, 60589, 60592, 60595, 60598, 60601, 60604, 60607, - 60610, 60613, 60616, 60619, 60622, 60625, 60628, 60631, 60634, 60637, - 60640, 60643, 60646, 60649, 60657, 60664, 60671, 60678, 60685, 60692, - 60699, 60706, 60713, 60720, 60728, 60736, 60744, 60752, 60760, 60768, - 60776, 60784, 60792, 60800, 60808, 60816, 60824, 60832, 60840, 60843, - 60846, 60849, 60851, 60854, 60857, 60860, 60865, 60870, 60873, 60880, - 60887, 60894, 60901, 60904, 60909, 60911, 60915, 60917, 60919, 60922, - 60925, 60928, 60931, 60934, 60937, 60940, 60945, 60950, 60953, 60956, - 60959, 60962, 60965, 60968, 60971, 60975, 60978, 60981, 60984, 60987, - 60990, 60994, 60997, 61000, 61003, 61008, 61013, 61018, 61023, 61028, - 61033, 61038, 61043, 61048, 61056, 61058, 61061, 61064, 61067, 61070, - 61075, 61083, 61086, 61089, 61093, 61096, 61099, 61102, 61107, 61110, - 61113, 61118, 61121, 61124, 61129, 61132, 61135, 61140, 61145, 61150, - 61153, 61156, 61159, 61162, 61168, 61171, 61174, 61177, 61179, 61182, - 61185, 61188, 61193, 61196, 61199, 61202, 61205, 61208, 61213, 61216, - 61219, 61222, 61225, 61228, 61231, 61234, 61237, 61240, 61245, 61249, - 61256, 61263, 61270, 61277, 61284, 61291, 61298, 61305, 61312, 61320, - 61328, 61336, 61344, 61352, 61360, 61368, 61376, 61384, 61392, 61400, - 61408, 61416, 61424, 61432, 61440, 61448, 61456, 61464, 61472, 61480, - 61488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 59004, 59008, 59012, 59016, 59020, 59024, 59028, 59032, 59036, 59041, + 59045, 59049, 59053, 59057, 59060, 59064, 59067, 59071, 59075, 59079, + 59083, 59086, 59090, 59093, 59097, 59101, 59105, 59109, 59113, 59117, + 59121, 59125, 59129, 59133, 59137, 59141, 59144, 59148, 59152, 59156, + 59160, 59164, 59167, 59172, 59176, 59181, 59185, 59188, 59192, 59196, + 59200, 59204, 59209, 59213, 59217, 59221, 59225, 59228, 59232, 59236, 0, + 0, 59241, 59249, 59257, 59264, 59271, 59275, 59281, 59286, 59291, 59295, + 59298, 59302, 59305, 59309, 59312, 59316, 59319, 59323, 59326, 59329, + 59333, 59337, 59341, 59345, 59349, 59353, 59357, 59361, 59365, 59369, + 59373, 59377, 59381, 59385, 59389, 59393, 59397, 59401, 59405, 59409, + 59413, 59417, 59421, 59426, 59430, 59434, 59438, 59442, 59445, 59449, + 59452, 59456, 59460, 59464, 59468, 59471, 59475, 59478, 59482, 59486, + 59490, 59494, 59498, 59502, 59506, 59510, 59514, 59518, 59522, 59526, + 59529, 59533, 59537, 59541, 59545, 59549, 59552, 59557, 59561, 59566, + 59570, 59573, 59577, 59581, 59585, 59589, 59594, 59598, 59602, 59606, + 59610, 59613, 59617, 59621, 59626, 59630, 59634, 59638, 59642, 59647, + 59654, 59658, 59664, 0, 0, 0, 0, 0, 59669, 59673, 59677, 59680, 59684, + 59688, 59692, 59695, 59698, 59702, 59706, 59710, 59714, 59718, 59722, + 59726, 59730, 59734, 59737, 59741, 59745, 59748, 59751, 59754, 59757, + 59761, 59765, 59769, 59773, 59777, 59781, 59785, 59789, 59793, 59797, + 59800, 59803, 59807, 59811, 59815, 59819, 0, 0, 0, 59823, 59827, 59831, + 59835, 59839, 59843, 59847, 59851, 59855, 59859, 59863, 59867, 59871, + 59875, 59879, 59883, 59887, 59891, 59895, 59899, 59903, 59907, 59911, + 59915, 59919, 59923, 59927, 59931, 59935, 59939, 59943, 59946, 59950, + 59953, 59957, 59961, 59964, 59968, 59972, 59975, 59979, 59983, 59987, + 59991, 59994, 59998, 60002, 60006, 60010, 60014, 60018, 60021, 60024, + 60028, 60032, 60036, 60040, 60044, 60048, 60052, 60056, 60060, 60064, + 60068, 60072, 60076, 60080, 60084, 60088, 60092, 60096, 60100, 60104, + 60108, 60112, 60116, 60120, 60124, 60128, 60132, 60136, 60140, 60144, + 60148, 60152, 60156, 60160, 60164, 60168, 60172, 60176, 60180, 60184, + 60188, 0, 60192, 60198, 60204, 60209, 60214, 60219, 60225, 60231, 60237, + 60243, 60249, 60255, 60261, 60267, 60273, 60279, 60285, 60289, 60293, + 60297, 60301, 60305, 60309, 60313, 60317, 60321, 60325, 60329, 60333, + 60337, 60341, 60345, 60349, 60353, 60357, 60361, 60365, 60370, 60375, + 60380, 60385, 60389, 60393, 0, 0, 0, 0, 0, 60397, 60402, 60407, 60412, + 60417, 60422, 60427, 60432, 60437, 60442, 60447, 60452, 60457, 60462, + 60467, 60472, 60476, 60481, 60485, 60490, 60495, 60500, 60505, 60510, + 60515, 60520, 60525, 60530, 60535, 60540, 60545, 60550, 60555, 60560, + 60565, 60570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60575, 60580, 60585, + 60590, 60594, 60599, 60603, 60608, 60613, 60618, 60623, 60628, 60632, + 60637, 60642, 60647, 60652, 60656, 60660, 60664, 60668, 60672, 60676, + 60680, 60684, 60688, 60692, 60696, 60700, 60704, 60708, 60713, 60718, + 60723, 60728, 60733, 60738, 60743, 60748, 60753, 60758, 60763, 60768, + 60773, 60778, 60783, 60789, 0, 60796, 60799, 60802, 60805, 60808, 60811, + 60814, 60817, 60820, 60823, 60827, 60831, 60835, 60839, 60843, 60847, + 60851, 60855, 60859, 60863, 60867, 60871, 60875, 60879, 60883, 60887, + 60891, 60895, 60899, 60903, 60907, 60911, 60915, 60919, 60923, 60927, + 60931, 60935, 60939, 60943, 60947, 60956, 60965, 60974, 60983, 60992, + 61001, 61010, 61019, 61022, 61027, 61032, 61037, 61042, 61047, 61052, + 61057, 61062, 61067, 61071, 61076, 61081, 61086, 61091, 61096, 61100, + 61104, 61108, 61112, 61116, 61120, 61124, 61128, 61132, 61136, 61140, + 61144, 61148, 61152, 61157, 61162, 61167, 61172, 61177, 61182, 61187, + 61192, 61197, 61202, 61207, 61212, 61217, 61222, 61228, 61234, 61239, + 61244, 61247, 61250, 61253, 61256, 61259, 61262, 61265, 61268, 61271, + 61275, 61279, 61283, 61287, 61291, 61295, 61299, 61303, 61307, 61311, + 61315, 61319, 61323, 61327, 61331, 61335, 61339, 61343, 61347, 61351, + 61355, 61359, 61363, 61367, 61371, 61375, 61379, 61383, 61387, 61391, + 61395, 61399, 61403, 61407, 61411, 61415, 61419, 61423, 61427, 61431, + 61436, 61441, 61446, 61451, 61455, 61460, 61465, 61470, 61475, 61480, + 61485, 61490, 61495, 61500, 61504, 61510, 61516, 61522, 61528, 61534, + 61540, 61546, 61552, 61558, 61564, 61570, 61576, 61579, 61582, 61585, + 61590, 61593, 61596, 61599, 61602, 61605, 61608, 61612, 61616, 61620, + 61624, 61628, 61632, 61636, 61640, 61644, 61648, 61652, 61656, 61660, + 61663, 61666, 61670, 61674, 61678, 61682, 61685, 61689, 61693, 61697, + 61701, 61704, 61708, 61712, 61716, 61720, 61723, 61727, 61731, 61734, + 61738, 61742, 61746, 61750, 61754, 61758, 61762, 0, 61766, 61769, 61772, + 61775, 61778, 61781, 61784, 61787, 61790, 61793, 61796, 61799, 61802, + 61805, 61808, 61811, 61814, 61817, 61820, 61823, 61826, 61829, 61832, + 61835, 61838, 61841, 61844, 61847, 61850, 61853, 61856, 61859, 61862, + 61865, 61868, 61871, 61874, 61877, 61880, 61883, 61886, 61889, 61892, + 61895, 61898, 61901, 61904, 61907, 61910, 61913, 61916, 61919, 61922, + 61925, 61928, 61931, 61934, 61937, 61940, 61943, 61946, 61949, 61952, + 61955, 61958, 61961, 61964, 61967, 61970, 61973, 61976, 61979, 61982, + 61985, 61988, 61991, 61994, 61997, 62000, 62003, 62006, 62009, 62012, + 62015, 62018, 62021, 62024, 62027, 62030, 62038, 62045, 62052, 62059, + 62066, 62073, 62080, 62087, 62094, 62101, 62109, 62117, 62125, 62133, + 62141, 62149, 62157, 62165, 62173, 62181, 62189, 62197, 62205, 62213, + 62221, 62224, 62227, 62230, 62232, 62235, 62238, 62241, 62246, 62251, + 62254, 62261, 62268, 62275, 62282, 62285, 62290, 62292, 62296, 62298, + 62300, 62303, 62306, 62309, 62312, 62315, 62318, 62321, 62326, 62331, + 62334, 62337, 62340, 62343, 62346, 62349, 62352, 62356, 62359, 62362, + 62365, 62368, 62371, 62375, 62378, 62381, 62384, 62389, 62394, 62399, + 62404, 62409, 62414, 62419, 62424, 62429, 62437, 62439, 62442, 62445, + 62448, 62451, 62456, 62464, 62467, 62470, 62474, 62477, 62480, 62483, + 62488, 62491, 62494, 62499, 62502, 62505, 62510, 62513, 62516, 62521, + 62526, 62531, 62534, 62537, 62540, 62543, 62549, 62552, 62555, 62558, + 62560, 62563, 62566, 62569, 62574, 62577, 62580, 62583, 62586, 62589, + 62594, 62597, 62600, 62603, 62606, 62609, 62612, 62615, 62618, 62621, + 62626, 62630, 62637, 62644, 62651, 62658, 62665, 62672, 62679, 62686, + 62693, 62701, 62709, 62717, 62725, 62733, 62741, 62749, 62757, 62765, + 62773, 62781, 62789, 62797, 62805, 62813, 62821, 62829, 62837, 62845, + 62853, 62861, 62869, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61491, 61499, - 61507, 61517, 61523, 61527, 61531, 61537, 61543, 61548, 61552, 61556, - 61560, 61564, 61570, 61574, 61578, 61582, 61592, 61596, 61600, 61606, - 61610, 61616, 61620, 61624, 61630, 61636, 61642, 61650, 61658, 61662, - 61666, 61670, 61676, 61680, 61689, 61695, 61699, 61703, 61707, 61711, - 61715, 61719, 61726, 61732, 61738, 61742, 61748, 61752, 61758, 61766, - 61776, 61780, 61788, 61792, 61798, 61806, 61814, 61818, 61822, 61828, - 61833, 61839, 61845, 61849, 61853, 61856, 61860, 61864, 61868, 61872, - 61876, 61880, 61884, 61887, 61891, 61895, 61899, 61903, 61907, 61911, - 61914, 61918, 61922, 61925, 61929, 61933, 61937, 61941, 61945, 61949, - 61953, 61957, 61961, 61965, 61969, 61973, 61977, 61981, 61985, 61989, - 61993, 61997, 62001, 62005, 62009, 62013, 62017, 62021, 62025, 62029, - 62033, 62037, 62041, 62045, 62049, 62053, 62057, 62061, 62065, 62069, - 62073, 62077, 62081, 62085, 62089, 62093, 62097, 62101, 62104, 62108, - 62112, 62116, 62120, 62124, 62128, 62132, 62136, 62140, 62144, 62148, - 62152, 62156, 62160, 62164, 62168, 62172, 62176, 62180, 62184, 62188, - 62192, 62196, 62200, 62204, 62208, 62212, 62216, 62220, 62224, 62228, - 62232, 62236, 62240, 62244, 62248, 62252, 62256, 62260, 62264, 62268, - 62272, 62276, 62280, 62284, 62288, 62292, 62296, 62300, 62304, 62308, - 62312, 62316, 62320, 62324, 62328, 62332, 62336, 62340, 62344, 62348, - 62352, 62356, 62360, 62364, 62368, 62372, 62376, 62380, 62384, 62388, - 62392, 62396, 62400, 62404, 62408, 62412, 62416, 62420, 62424, 62428, - 62432, 62436, 62440, 62444, 62448, 62452, 62456, 62460, 62464, 62468, - 62472, 62476, 62480, 62484, 62488, 62492, 62496, 62500, 62504, 62508, - 62512, 62516, 62520, 62524, 62528, 62532, 62536, 62540, 62544, 62548, - 62552, 62556, 62560, 62564, 62568, 62572, 62575, 62579, 62583, 62587, - 62591, 62595, 62599, 62603, 62607, 62611, 62615, 62619, 62623, 62627, - 62631, 62635, 62639, 62643, 62647, 62651, 62655, 62659, 62663, 62667, - 62671, 62675, 62679, 62683, 62687, 62691, 62695, 62699, 62703, 62707, - 62711, 62715, 62719, 62723, 62727, 62731, 62735, 62739, 62743, 62747, - 62751, 62755, 62759, 62763, 62767, 62771, 62775, 62779, 62783, 62787, - 62791, 62795, 62799, 62803, 62807, 62811, 62815, 62819, 62823, 62827, - 62831, 62835, 62839, 62843, 62847, 62851, 62855, 62859, 62863, 62867, - 62871, 62875, 62879, 62883, 62887, 62891, 62895, 62899, 62903, 62907, - 62911, 62915, 62919, 62923, 62927, 62931, 62935, 62939, 62943, 62947, - 62951, 62955, 62959, 62963, 62967, 62971, 62975, 62979, 62983, 62987, - 62991, 62995, 62999, 63003, 63007, 63011, 63015, 63019, 63023, 63027, - 63031, 63035, 63038, 63042, 63046, 63050, 63054, 63058, 63062, 63066, - 63070, 63074, 63078, 63082, 63086, 63090, 63094, 63098, 63102, 63106, - 63110, 63114, 63118, 63122, 63126, 63130, 63134, 63138, 63142, 63146, - 63150, 63154, 63158, 63162, 63166, 63170, 63174, 63178, 63182, 63186, - 63190, 63194, 63198, 63202, 63206, 63210, 63214, 63218, 63222, 63226, - 63230, 63234, 63238, 63242, 63246, 63250, 63254, 63258, 63262, 63266, - 63270, 63274, 63278, 63282, 63286, 63290, 63294, 63298, 63302, 63306, - 63310, 63314, 63318, 63322, 63326, 63330, 63334, 63338, 63342, 63346, - 63350, 63354, 63358, 63362, 63366, 63370, 63374, 63378, 63382, 63386, - 63390, 63394, 63397, 63401, 63405, 63409, 63413, 63417, 63421, 63425, - 63429, 63433, 63437, 63441, 63445, 63449, 63453, 63457, 63461, 63465, - 63469, 63473, 63477, 63481, 63485, 63489, 63493, 63497, 63501, 63505, - 63509, 63513, 63517, 63521, 63525, 63529, 63533, 63537, 63541, 63545, - 63549, 63553, 63557, 63561, 63565, 63569, 63573, 63577, 63581, 63585, - 63589, 63593, 63597, 63601, 63605, 63609, 63613, 63617, 63621, 63625, - 63629, 63633, 63637, 63641, 63645, 63649, 63653, 63657, 63661, 63665, - 63669, 63673, 63677, 63681, 63685, 63689, 63693, 63697, 63701, 63705, - 63709, 63713, 63717, 63721, 63725, 63729, 63733, 63737, 63741, 63745, - 63749, 63753, 63757, 63761, 63765, 63769, 63773, 63777, 63781, 63785, - 63789, 63793, 63797, 63801, 63805, 63809, 63813, 63817, 63821, 63825, - 63829, 63833, 63837, 63841, 63845, 63849, 63853, 63857, 63861, 63865, - 63869, 63873, 63877, 63881, 63885, 63889, 63892, 63896, 63900, 63904, - 63908, 63912, 63916, 63920, 63924, 63928, 63932, 63936, 63940, 63944, - 63948, 63952, 63956, 63960, 63964, 63968, 63972, 63976, 63980, 63984, - 63988, 63992, 63996, 64000, 64004, 64008, 64012, 64016, 64020, 64024, - 64028, 64032, 64036, 64040, 64044, 64048, 64052, 64056, 64060, 64064, - 64068, 64072, 64076, 64080, 64084, 64088, 64092, 64096, 64100, 64104, - 64108, 64112, 64116, 64120, 64124, 64128, 64132, 64136, 64140, 64144, - 64148, 64152, 64156, 64160, 64164, 64168, 64172, 64176, 64180, 64184, - 64188, 64192, 64196, 64200, 64204, 64208, 64212, 64216, 64220, 64224, - 64228, 64232, 64236, 64240, 64244, 64248, 64252, 64256, 64260, 64264, - 64268, 64272, 64276, 64280, 64284, 64288, 64292, 64296, 64300, 64304, - 64308, 64312, 64316, 64320, 64324, 64328, 64332, 64336, 64340, 64344, - 64347, 64351, 64355, 64359, 64363, 64367, 64371, 64375, 64379, 64383, - 64387, 64391, 64395, 64399, 64403, 64407, 64411, 64415, 64419, 64423, - 64427, 64431, 64435, 64439, 64443, 64447, 64451, 64455, 64459, 64463, - 64467, 64471, 64475, 64479, 64483, 64487, 64491, 64495, 64499, 64503, - 64507, 64511, 64515, 64519, 64523, 64527, 64531, 64535, 64539, 64543, - 64547, 64551, 64555, 64559, 64563, 64567, 64571, 64575, 64579, 64583, - 64587, 64591, 64595, 64599, 64603, 64607, 64611, 64615, 64619, 64623, - 64627, 64631, 64635, 64639, 64643, 64647, 64651, 64655, 64659, 64663, - 64667, 64671, 64675, 64679, 64683, 64687, 64691, 64695, 64699, 64703, - 64707, 64711, 64715, 64719, 64723, 64727, 64731, 64735, 64739, 64743, - 64747, 64751, 64755, 64759, 64763, 64767, 64771, 64775, 64779, 64783, - 64787, 64791, 64795, 64799, 64803, 64807, 64811, 64815, 64819, 64823, - 64827, 64831, 64835, 64839, 64843, 64847, 64851, 64855, 64859, 64863, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 62872, 62881, 62890, 62901, 62908, 62913, 62918, 62925, 62932, 62938, + 62943, 62948, 62953, 62958, 62965, 62970, 62975, 62980, 62991, 62996, + 63001, 63008, 63013, 63020, 63025, 63030, 63037, 63044, 63051, 63060, + 63069, 63074, 63079, 63084, 63091, 63096, 63106, 63113, 63118, 63123, + 63128, 63133, 63138, 63143, 63152, 63159, 63166, 63171, 63178, 63183, + 63190, 63199, 63210, 63215, 63224, 63229, 63236, 63245, 63254, 63259, + 63264, 63271, 63277, 63284, 63291, 63295, 63299, 63302, 63306, 63310, + 63314, 63318, 63322, 63326, 63330, 63333, 63337, 63341, 63345, 63349, + 63353, 63357, 63360, 63364, 63368, 63371, 63375, 63379, 63383, 63387, + 63391, 63395, 63399, 63403, 63407, 63411, 63415, 63419, 63423, 63427, + 63431, 63435, 63439, 63443, 63447, 63451, 63455, 63459, 63463, 63467, + 63471, 63475, 63479, 63483, 63487, 63491, 63495, 63499, 63503, 63507, + 63511, 63515, 63519, 63523, 63527, 63531, 63535, 63539, 63543, 63547, + 63550, 63554, 63558, 63562, 63566, 63570, 63574, 63578, 63582, 63586, + 63590, 63594, 63598, 63602, 63606, 63610, 63614, 63618, 63622, 63626, + 63630, 63634, 63638, 63642, 63646, 63650, 63654, 63658, 63662, 63666, + 63670, 63674, 63678, 63682, 63686, 63690, 63694, 63698, 63702, 63706, + 63710, 63714, 63718, 63722, 63726, 63730, 63734, 63738, 63742, 63746, + 63750, 63754, 63758, 63762, 63766, 63770, 63774, 63778, 63782, 63786, + 63790, 63794, 63798, 63802, 63806, 63810, 63814, 63818, 63822, 63826, + 63830, 63834, 63838, 63842, 63846, 63850, 63854, 63858, 63862, 63866, + 63870, 63874, 63878, 63882, 63886, 63890, 63894, 63898, 63902, 63906, + 63910, 63914, 63918, 63922, 63926, 63930, 63934, 63938, 63942, 63946, + 63950, 63954, 63958, 63962, 63966, 63970, 63974, 63978, 63982, 63986, + 63990, 63994, 63998, 64002, 64006, 64010, 64014, 64018, 64021, 64025, + 64029, 64033, 64037, 64041, 64045, 64049, 64053, 64057, 64061, 64065, + 64069, 64073, 64077, 64081, 64085, 64089, 64093, 64097, 64101, 64105, + 64109, 64113, 64117, 64121, 64125, 64129, 64133, 64137, 64141, 64145, + 64149, 64153, 64157, 64161, 64165, 64169, 64173, 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, 64357, 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, 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, + 64828, 64832, 64836, 64840, 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, 64950, 64954, 64958, 64962, 64966, 64970, 64974, 64978, 64982, - 64986, 64990, 64994, 64998, 65002, 65006, 65010, 65014, 65018, 65022, - 65026, 65030, 65034, 65038, 65042, 65046, 65050, 65054, 65058, 65062, - 65066, 65070, 65074, 65078, 65082, 65086, 65090, 65094, 65098, 65102, - 65106, 65110, 65114, 65118, 65122, 65126, 65130, 65134, 65138, 65142, - 65146, 65150, 65154, 65158, 65162, 65166, 65170, 65174, 65178, 65182, - 65186, 65190, 65194, 65198, 65202, 65206, 65210, 65214, 65218, 65222, - 65226, 65230, 65234, 65238, 65242, 65246, 65250, 65254, 65258, 65262, - 65266, 65270, 65274, 65278, 65282, 65286, 65290, 65294, 65298, 65302, - 65306, 65310, 65314, 65318, 65322, 65326, 65330, 65334, 65338, 65342, + 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, 65291, 65295, 65299, 65303, + 65307, 65311, 65315, 65319, 65323, 65327, 65331, 65335, 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, @@ -13685,9 +14867,9 @@ static unsigned int phrasebook_offset2[] = { 65586, 65590, 65594, 65598, 65602, 65606, 65610, 65614, 65618, 65622, 65626, 65630, 65634, 65638, 65642, 65646, 65650, 65654, 65658, 65662, 65666, 65670, 65674, 65678, 65682, 65686, 65690, 65694, 65698, 65702, - 65706, 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, + 65706, 65710, 65714, 65718, 65722, 65726, 65730, 65734, 65738, 65742, + 65746, 65750, 65754, 65758, 65762, 65766, 65770, 65774, 65778, 65782, + 65786, 65790, 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, @@ -13702,3556 +14884,3928 @@ static unsigned int phrasebook_offset2[] = { 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, 0, 0, 0, 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, 66605, 66609, 66613, 66617, - 66621, 66625, 66629, 66633, 66637, 66641, 66645, 66649, 66653, 66657, - 66661, 66665, 66669, 66673, 66677, 66681, 66685, 66689, 66693, 66697, - 66701, 66705, 66709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66713, 66718, 66722, - 66727, 66732, 66737, 66742, 66747, 66751, 66756, 66761, 66766, 66771, - 66776, 66781, 66786, 66790, 66794, 66799, 66804, 66809, 66814, 66819, - 66823, 66828, 66833, 66838, 66843, 66848, 66852, 66857, 66861, 66866, - 66870, 66875, 66879, 66883, 66887, 66892, 66897, 66902, 66910, 66918, - 66926, 66934, 66941, 66949, 66955, 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, 67110, 67114, 67118, 67122, 67126, 67130, 67134, 67138, - 67142, 67146, 67150, 67154, 67158, 67162, 67166, 67170, 67174, 67178, - 67182, 67186, 67190, 67194, 67198, 67202, 67206, 67210, 67214, 67218, - 67222, 67226, 67230, 67234, 67238, 67242, 67246, 67250, 67254, 67257, - 67261, 67265, 67268, 67272, 67276, 67280, 67283, 67287, 67291, 67295, - 67299, 67303, 67307, 67311, 67315, 67319, 67323, 67327, 67331, 67335, - 67339, 67342, 67346, 67350, 67354, 67358, 67362, 67366, 67370, 67374, - 67378, 67381, 67384, 67388, 67392, 67396, 67399, 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, 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, 67700, 67704, 67708, 67712, 67716, 67720, 67724, 67728, - 67732, 67736, 67740, 67744, 67748, 67752, 67756, 67760, 67764, 67767, - 67771, 67775, 67779, 67783, 67787, 67791, 67795, 67799, 67803, 67807, - 67811, 67815, 67819, 67823, 67827, 67831, 67835, 67839, 67843, 67847, - 67851, 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, 67966, - 67970, 67974, 67978, 67982, 67986, 67990, 67994, 67998, 68002, 68006, - 68010, 68014, 68018, 68022, 68026, 68029, 68034, 68038, 68044, 68049, - 68055, 68059, 68063, 68067, 68071, 68075, 68079, 68083, 68087, 68091, - 68095, 68099, 68103, 68107, 68111, 68114, 68117, 68120, 68123, 68126, - 68129, 68132, 68135, 68138, 68143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 68149, 68154, 68159, 68164, 68169, 68175, 68181, - 68186, 68191, 68196, 68201, 68208, 68215, 68222, 68229, 68236, 68243, - 68253, 68263, 68270, 68277, 68283, 68289, 68295, 68301, 68310, 68319, - 68326, 68333, 68344, 68355, 68360, 0, 0, 68365, 68372, 68379, 68386, - 68393, 68400, 68407, 68413, 68419, 68425, 68431, 68438, 68445, 68450, - 68454, 68461, 68468, 68475, 0, 0, 0, 0, 0, 0, 0, 0, 68479, 68483, 68487, - 68490, 68493, 68498, 68503, 68508, 68513, 68518, 68523, 68528, 68533, - 68538, 68543, 68552, 68561, 68566, 68571, 68576, 68581, 68586, 68591, - 68596, 68601, 68606, 68611, 68616, 0, 0, 0, 0, 0, 0, 0, 0, 68621, 68624, - 68627, 68630, 68634, 68638, 68642, 68646, 68649, 68653, 68656, 68660, - 68663, 68667, 68671, 68675, 68679, 68683, 68687, 68691, 68694, 68698, - 68702, 68706, 68710, 68714, 68718, 68722, 68726, 68730, 68734, 68738, - 68742, 68746, 68750, 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, 68852, 68856, - 68860, 68864, 68868, 68872, 68876, 68880, 68883, 68887, 68891, 68895, - 68899, 68903, 68907, 68911, 68915, 68919, 68923, 68927, 68931, 68936, - 68941, 68944, 68949, 68952, 68955, 68958, 0, 0, 0, 0, 0, 0, 0, 0, 68962, - 68971, 68980, 68989, 68998, 69007, 69016, 69025, 69034, 69042, 69049, - 69057, 69064, 69072, 69082, 69091, 69101, 69110, 69120, 69128, 69135, - 69143, 69150, 69158, 69163, 69168, 69173, 69182, 69188, 69194, 69201, - 69210, 69218, 69226, 69234, 69241, 69248, 69255, 69262, 69267, 69272, - 69277, 69282, 69287, 69292, 69297, 69302, 69310, 69318, 69324, 69329, - 69334, 69339, 69344, 69349, 69354, 69359, 69364, 69369, 69377, 69385, - 69390, 69395, 69404, 69413, 69420, 69427, 69436, 69445, 69456, 69467, - 69473, 69479, 69487, 69495, 69504, 69513, 69520, 69527, 69532, 69537, - 69548, 69559, 69567, 69575, 69585, 69595, 69606, 69617, 69626, 69635, - 69642, 69649, 69656, 69663, 69672, 69681, 69686, 69691, 69698, 69705, - 69712, 69719, 69730, 69741, 69746, 69751, 69756, 69761, 69766, 69771, - 69776, 69781, 69785, 69790, 69795, 69800, 69805, 69810, 69816, 69821, - 69826, 69833, 69840, 69847, 69854, 69861, 69869, 69877, 69882, 69887, - 69893, 69899, 69905, 69911, 69918, 69925, 69932, 69936, 69943, 69948, 0, + 66385, 66389, 66393, 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, 66600, 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, 67155, 67159, 67163, 67167, 67171, 67175, 67179, + 67183, 67187, 67191, 67195, 67199, 67203, 67207, 67211, 67215, 67219, + 67223, 67227, 67231, 67235, 67239, 67243, 67247, 67251, 67255, 67259, + 67263, 67267, 67271, 67275, 67279, 67283, 67287, 67291, 67295, 67299, + 67303, 67307, 67311, 67315, 67319, 67323, 67327, 67331, 67335, 67339, + 67343, 67347, 67351, 67355, 67359, 67363, 67367, 67371, 67375, 67379, + 67383, 67387, 67391, 67395, 67399, 67403, 67407, 67411, 67415, 67419, + 67423, 67427, 67431, 67435, 67439, 67443, 67447, 67451, 67455, 67459, + 67463, 67467, 67471, 67475, 67479, 67483, 67487, 67491, 67495, 67499, + 67503, 67507, 67511, 67515, 67519, 67523, 67527, 67531, 67535, 67539, + 67543, 67547, 67551, 67555, 67559, 67563, 67567, 67571, 67575, 67579, + 67583, 67587, 67591, 67595, 67599, 67603, 67607, 67611, 67615, 67619, + 67623, 67627, 67631, 67635, 67639, 67643, 67647, 67651, 67655, 67659, + 67663, 67667, 67671, 67675, 67679, 67683, 67687, 67691, 67695, 67699, + 67703, 67707, 67711, 67715, 67719, 67723, 67727, 67731, 67735, 67739, + 67743, 67747, 67751, 67755, 67759, 67763, 67767, 67771, 67775, 67779, + 67783, 67787, 67791, 67795, 67799, 67803, 67807, 67811, 67815, 67819, + 67823, 67827, 67831, 67835, 67839, 67843, 67847, 67851, 67855, 67859, + 67863, 67867, 67871, 67875, 67879, 67883, 67887, 67891, 67895, 67899, + 67903, 67907, 67911, 67915, 67919, 67923, 67927, 67931, 67935, 0, 0, 0, + 67939, 67943, 67947, 67951, 67955, 67959, 67963, 67967, 67971, 67975, + 67979, 67983, 67987, 67991, 67995, 67999, 68003, 68007, 68011, 68015, + 68019, 68023, 68027, 68031, 68035, 68039, 68043, 68047, 68051, 68055, + 68059, 68063, 68067, 68071, 68075, 68079, 68083, 68087, 68091, 68095, + 68099, 68103, 68107, 68111, 68115, 68119, 68123, 68127, 68131, 68135, + 68139, 68143, 68147, 68151, 68155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68159, + 68164, 68168, 68173, 68178, 68183, 68188, 68193, 68197, 68202, 68207, + 68212, 68217, 68222, 68227, 68232, 68236, 68240, 68245, 68250, 68255, + 68260, 68265, 68269, 68274, 68279, 68284, 68289, 68294, 68298, 68303, + 68307, 68312, 68316, 68321, 68325, 68329, 68333, 68338, 68343, 68348, + 68356, 68364, 68372, 68380, 68387, 68395, 68401, 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, 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, 68703, 68707, 68711, 68714, 68718, 68722, 68726, 68729, 68733, + 68737, 68741, 68745, 68749, 68753, 68757, 68761, 68765, 68769, 68773, + 68777, 68781, 68785, 68788, 68792, 68796, 68800, 68804, 68808, 68812, + 68816, 68820, 68824, 68827, 68830, 68834, 68838, 68842, 68845, 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, 68964, 68968, + 68972, 68976, 68980, 68984, 68988, 68992, 68996, 68999, 69003, 69007, + 69011, 69015, 69019, 69023, 69027, 69031, 69035, 69039, 69043, 69047, + 69051, 69055, 69059, 69063, 69067, 69071, 69075, 69079, 69083, 69087, + 69091, 69095, 69099, 69103, 69107, 69111, 69115, 69119, 69123, 69127, + 69131, 69135, 69139, 69143, 69146, 69150, 69154, 69158, 69162, 69166, + 69170, 69174, 69178, 69182, 69186, 69190, 69194, 69198, 69202, 69206, + 69210, 69213, 69217, 69221, 69225, 69229, 69233, 69237, 69241, 69245, + 69249, 69253, 69257, 69261, 69265, 69269, 69273, 69277, 69281, 69285, + 69289, 69293, 69297, 69300, 69304, 69308, 69312, 69316, 69320, 69324, + 69328, 69332, 69336, 69340, 69344, 69348, 69352, 69356, 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, 69475, 69480, 69484, + 69490, 69495, 69501, 69505, 69509, 69513, 69517, 69521, 69525, 69529, + 69533, 69537, 69541, 69545, 69549, 69553, 69557, 69560, 69563, 69566, + 69569, 69572, 69575, 69578, 69581, 69584, 69589, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69595, 69600, 69605, 69610, 69615, + 69622, 69629, 69634, 69639, 69644, 69649, 69656, 69663, 69670, 69677, + 69684, 69691, 69701, 69711, 69718, 69725, 69732, 69739, 69745, 69751, + 69760, 69769, 69776, 69783, 69794, 69805, 69810, 69815, 69822, 69829, + 69836, 69843, 69850, 69857, 69864, 69871, 69877, 69883, 69889, 69895, + 69902, 69909, 69914, 69918, 69925, 69932, 69939, 0, 0, 0, 0, 0, 0, 0, 0, + 69943, 69947, 69951, 69954, 69957, 69962, 69967, 69972, 69977, 69982, + 69987, 69992, 69997, 70002, 70007, 70016, 70025, 70030, 70035, 70040, + 70045, 70050, 70055, 70060, 70065, 70070, 70075, 70080, 0, 0, 0, 0, 0, 0, + 0, 0, 70085, 70088, 70091, 70094, 70098, 70102, 70106, 70110, 70113, + 70117, 70120, 70124, 70127, 70131, 70135, 70139, 70143, 70147, 70151, + 70155, 70158, 70162, 70166, 70170, 70174, 70178, 70182, 70186, 70190, + 70194, 70198, 70202, 70206, 70210, 70214, 70217, 70221, 70225, 70229, + 70233, 70237, 70241, 70245, 70249, 70253, 70257, 70261, 70265, 70269, + 70273, 70277, 70281, 70285, 70289, 70293, 70297, 70301, 70305, 70309, + 70313, 70316, 70320, 70324, 70328, 70332, 70336, 70340, 70344, 70347, + 70351, 70355, 70359, 70363, 70367, 70371, 70375, 70379, 70383, 70387, + 70391, 70395, 70400, 70405, 70408, 70413, 70416, 70419, 70422, 0, 0, 0, + 0, 0, 0, 0, 0, 70426, 70435, 70444, 70453, 70462, 70471, 70480, 70489, + 70498, 70506, 70513, 70521, 70528, 70536, 70546, 70555, 70565, 70574, + 70584, 70592, 70599, 70607, 70614, 70622, 70627, 70632, 70637, 70646, + 70652, 70658, 70665, 70674, 70682, 70690, 70698, 70705, 70712, 70719, + 70726, 70731, 70736, 70741, 70746, 70751, 70756, 70761, 70766, 70774, + 70782, 70788, 70793, 70798, 70803, 70808, 70813, 70818, 70823, 70828, + 70833, 70841, 70849, 70854, 70859, 70869, 70879, 70886, 70893, 70902, + 70911, 70923, 70935, 70941, 70947, 70955, 70963, 70973, 70983, 70990, + 70997, 71002, 71007, 71019, 71031, 71039, 71047, 71057, 71067, 71079, + 71091, 71100, 71109, 71116, 71123, 71130, 71137, 71146, 71155, 71160, + 71165, 71172, 71179, 71186, 71193, 71205, 71217, 71222, 71227, 71232, + 71237, 71242, 71247, 71252, 71257, 71261, 71266, 71271, 71276, 71281, + 71286, 71292, 71297, 71302, 71309, 71316, 71323, 71330, 71337, 71346, + 71355, 71361, 71367, 71373, 71379, 71385, 71391, 71398, 71405, 71412, + 71416, 71423, 71428, 71433, 71440, 0, 71453, 71461, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 71469, 71478, 71487, 71496, 71505, 71514, 71523, + 71532, 71541, 71550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71559, 71566, 71574, 71582, + 71589, 71597, 71604, 71610, 71616, 71623, 71629, 71635, 71641, 71648, + 71655, 71662, 71669, 71676, 71683, 71690, 71697, 71704, 71711, 71718, + 71725, 71732, 71739, 71745, 71752, 71759, 71766, 71773, 71780, 71787, + 71794, 71801, 71808, 71815, 71822, 71829, 71836, 71843, 71850, 71857, + 71864, 71871, 71879, 71887, 71895, 71903, 0, 0, 0, 0, 71911, 71920, + 71929, 71938, 71947, 71956, 71965, 71972, 71979, 71986, 0, 0, 0, 0, 0, 0, + 71993, 71997, 72002, 72007, 72012, 72017, 72022, 72027, 72032, 72037, + 72042, 72047, 72051, 72055, 72060, 72065, 72069, 72074, 72079, 72084, + 72089, 72094, 72099, 72104, 72108, 72112, 72117, 72122, 72127, 72131, + 72135, 72139, 72143, 72147, 72151, 72156, 72161, 72166, 72171, 72176, + 72183, 72189, 72194, 72199, 72204, 72209, 72215, 72222, 72228, 72235, + 72241, 72247, 72252, 72259, 72265, 72270, 0, 0, 0, 0, 0, 0, 0, 0, 72276, + 72280, 72284, 72287, 72291, 72294, 72298, 72301, 72305, 72309, 72314, + 72318, 72323, 72326, 72330, 72334, 72337, 72341, 72345, 72348, 72352, + 72356, 72360, 72364, 72368, 72372, 72376, 72380, 72384, 72388, 72392, + 72396, 72400, 72404, 72408, 72412, 72416, 72420, 72423, 72426, 72430, + 72434, 72438, 72441, 72444, 72447, 72451, 72455, 72459, 72463, 72467, + 72470, 72474, 72480, 72485, 72489, 72494, 72498, 72503, 72508, 72514, + 72519, 72525, 72529, 72534, 72539, 72543, 72548, 72553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 72557, 72560, 72564, 72568, 72571, 72574, 72577, 72580, 72583, + 72586, 72589, 72592, 0, 0, 0, 0, 0, 0, 72595, 72600, 72604, 72608, 72612, + 72616, 72620, 72624, 72628, 72632, 72636, 72640, 72644, 72648, 72652, + 72656, 72660, 72665, 72670, 72676, 72682, 72689, 72694, 72699, 72705, + 72709, 72714, 72717, 0, 0, 0, 0, 72720, 72727, 72733, 72739, 72745, + 72751, 72757, 72763, 72769, 72775, 72781, 72787, 72794, 72801, 72808, + 72815, 72822, 72829, 72836, 72843, 72850, 72856, 72862, 72869, 72875, + 72882, 72889, 72895, 72901, 72908, 72915, 72922, 72928, 72935, 72942, + 72948, 72955, 72961, 72968, 72975, 72981, 72987, 72994, 73000, 73007, + 73014, 73023, 73030, 73037, 73041, 73046, 73051, 73056, 73061, 73065, + 73069, 73074, 73078, 73083, 73088, 73093, 73098, 73102, 73107, 73111, + 73116, 73120, 73125, 73130, 73135, 73140, 73144, 73149, 73154, 73159, + 73165, 73170, 73176, 73182, 73188, 73195, 73201, 73207, 73214, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 73218, 73223, 73227, 73231, 73235, 73239, 73243, + 73247, 73251, 73255, 73259, 73263, 73267, 73271, 73275, 73279, 73283, + 73287, 73291, 73295, 73299, 73303, 73307, 73311, 73315, 73319, 73323, + 73327, 73331, 73335, 0, 0, 0, 73339, 73343, 73347, 73351, 73355, 73358, + 73364, 73367, 73371, 73374, 73380, 73386, 73394, 73397, 73401, 73404, + 73407, 73413, 73419, 73423, 73429, 73433, 73437, 73443, 73447, 73453, + 73459, 73463, 73467, 73473, 73477, 73483, 73489, 73493, 73499, 73503, + 73509, 73512, 73515, 73521, 73525, 73531, 73534, 73537, 73540, 73546, + 73550, 73554, 73560, 73566, 73570, 73573, 73579, 73584, 73589, 73594, + 73601, 73606, 73613, 73618, 73625, 73630, 73636, 73642, 73648, 73651, + 73655, 73659, 73664, 73669, 73674, 73679, 73684, 73689, 73694, 73699, + 73706, 73711, 0, 73718, 73721, 73725, 73728, 73731, 73734, 73737, 73740, + 73743, 73746, 73749, 0, 0, 0, 0, 73752, 73759, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73764, 73767, 73770, 73773, 73776, 73780, 73783, 73786, 73790, 73794, + 73798, 73802, 73806, 73810, 73814, 73818, 73822, 73826, 73830, 73834, + 73838, 73842, 73846, 73850, 73854, 73857, 73861, 73864, 73868, 73872, + 73876, 73880, 73884, 73887, 73891, 73894, 73897, 73901, 73905, 73909, + 73913, 73916, 73921, 73925, 73930, 73935, 73939, 73944, 73948, 73953, + 73958, 73963, 73968, 73973, 73979, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73985, + 73990, 73995, 74000, 74007, 74012, 74017, 74021, 74026, 74031, 74035, + 74039, 74044, 74050, 0, 0, 74057, 74061, 74064, 74067, 74070, 74073, + 74076, 74079, 74082, 74085, 0, 0, 74088, 74093, 74098, 74104, 74111, + 74117, 74123, 74129, 74135, 74141, 74147, 74153, 74159, 74165, 74171, + 74177, 74182, 74188, 74193, 74199, 74205, 74212, 74218, 74224, 74229, + 74236, 74243, 74250, 74256, 74261, 74266, 74271, 0, 0, 0, 0, 74279, + 74285, 74291, 74297, 74303, 74309, 74315, 74321, 74327, 74333, 74339, + 74345, 74351, 74357, 74363, 74369, 74375, 74381, 74387, 74393, 74399, + 74404, 74409, 74415, 74421, 74427, 74433, 74439, 74445, 74451, 74457, + 74463, 74469, 74475, 74481, 74487, 74493, 74499, 74505, 74511, 74517, + 74523, 74529, 74535, 74541, 74547, 74553, 74558, 74563, 74569, 74574, + 74578, 74583, 74587, 74591, 74595, 74601, 74606, 74611, 74616, 74621, + 74626, 74631, 74636, 74643, 74650, 74657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74664, 74669, 74674, 74679, + 74686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74693, 74697, 74701, 74705, 74709, + 74713, 0, 0, 74717, 74721, 74725, 74729, 74733, 74737, 0, 0, 74741, + 74745, 74749, 74753, 74757, 74761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74765, + 74769, 74773, 74777, 74781, 74785, 74789, 0, 74793, 74797, 74801, 74805, + 74809, 74813, 74817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69953, 69960, 69967, 69974, 69982, - 69989, 69995, 70001, 70008, 70014, 70020, 70026, 70033, 70040, 70047, - 70054, 70061, 70068, 70075, 70082, 70089, 70096, 70103, 70110, 70117, - 70124, 70130, 70137, 70144, 70151, 70158, 70165, 70172, 70179, 70186, - 70193, 70200, 70207, 70214, 70221, 70228, 70235, 70242, 70249, 70256, - 70264, 70272, 70280, 70288, 0, 0, 0, 0, 70296, 70305, 70314, 70323, - 70332, 70341, 70350, 70357, 70364, 70371, 0, 0, 0, 0, 0, 0, 70378, 70382, - 70387, 70392, 70397, 70402, 70407, 70412, 70417, 70422, 70427, 70432, - 70436, 70440, 70445, 70450, 70454, 70459, 70464, 70469, 70474, 70479, - 70484, 70489, 70493, 70497, 70502, 70507, 70512, 70516, 70520, 70524, - 70528, 70532, 70536, 70541, 70546, 70551, 70556, 70561, 70568, 70574, - 70579, 70584, 70589, 70594, 70600, 70607, 70613, 70620, 70626, 70632, - 70637, 70644, 70650, 70655, 0, 0, 0, 0, 0, 0, 0, 0, 70661, 70665, 70669, - 70672, 70676, 70679, 70683, 70686, 70690, 70694, 70699, 70703, 70708, - 70711, 70715, 70719, 70722, 70726, 70730, 70733, 70737, 70741, 70745, - 70749, 70753, 70757, 70761, 70765, 70769, 70773, 70777, 70781, 70785, - 70789, 70793, 70797, 70801, 70805, 70808, 70811, 70815, 70819, 70823, - 70826, 70829, 70832, 70836, 70840, 70844, 70848, 70852, 70855, 70859, - 70865, 70870, 70874, 70879, 70883, 70888, 70893, 70899, 70904, 70910, - 70914, 70919, 70924, 70928, 70933, 70938, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 70942, 70945, 70949, 70953, 70956, 70959, 70962, 70965, 70968, 70971, - 70974, 70977, 0, 0, 0, 0, 0, 0, 70980, 70985, 70989, 70993, 70997, 71001, - 71005, 71009, 71013, 71017, 71021, 71025, 71029, 71033, 71037, 71041, - 71045, 71050, 71055, 71061, 71067, 71074, 71079, 71084, 71090, 71094, - 71099, 71102, 0, 0, 0, 0, 71105, 71112, 71118, 71124, 71130, 71136, - 71142, 71148, 71154, 71160, 71166, 71172, 71179, 71186, 71193, 71200, - 71207, 71214, 71221, 71228, 71235, 71241, 71247, 71254, 71260, 71267, - 71274, 71280, 71286, 71293, 71300, 71307, 71313, 71320, 71327, 71333, - 71340, 71346, 71353, 71360, 71366, 71372, 71379, 71385, 71392, 71399, - 71408, 71415, 71422, 71426, 71431, 71436, 71441, 71446, 71450, 71454, - 71459, 71463, 71468, 71473, 71478, 71483, 71487, 71492, 71496, 71501, - 71505, 71510, 71515, 71520, 71525, 71529, 71534, 71539, 71544, 71550, - 71555, 71561, 71567, 71573, 71580, 71586, 71592, 71599, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 71603, 71608, 71612, 71616, 71620, 71624, 71628, 71632, - 71636, 71640, 71644, 71648, 71652, 71656, 71660, 71664, 71668, 71672, - 71676, 71680, 71684, 71688, 71692, 71696, 71700, 71704, 71708, 71712, - 71716, 71720, 0, 0, 0, 71724, 71728, 71732, 71736, 71740, 71743, 71749, - 71752, 71756, 71759, 71765, 71771, 71779, 71782, 71786, 71789, 71792, - 71797, 71802, 71806, 71812, 71816, 71820, 71826, 71830, 71836, 71842, - 71846, 71850, 71856, 71860, 71866, 71872, 71876, 71882, 71886, 71892, - 71895, 71898, 71904, 71908, 71914, 71917, 71920, 71923, 71929, 71933, - 71937, 71943, 71949, 71953, 71956, 71962, 71967, 71972, 71977, 71984, - 71989, 71996, 72001, 72008, 72013, 72019, 72025, 72031, 72034, 72038, - 72042, 72047, 72052, 72057, 72062, 72067, 72072, 72077, 72082, 72089, - 72094, 0, 72100, 72103, 72107, 72110, 72113, 72116, 72119, 72122, 72125, - 72128, 72131, 0, 0, 0, 0, 72134, 72141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72146, - 72149, 72152, 72155, 72158, 72162, 72165, 72168, 72172, 72176, 72180, - 72184, 72188, 72192, 72196, 72200, 72204, 72208, 72212, 72216, 72220, - 72224, 72228, 72232, 72236, 72239, 72243, 72246, 72250, 72254, 72258, - 72262, 72266, 72269, 72273, 72276, 72279, 72283, 72287, 72291, 72295, - 72298, 72303, 72307, 72312, 72317, 72321, 72326, 72330, 72335, 72340, - 72345, 72350, 72355, 72361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72367, 72372, - 72377, 72382, 72389, 72394, 72399, 72403, 72408, 72413, 72417, 72421, - 72426, 72432, 0, 0, 72439, 72443, 72446, 72449, 72452, 72455, 72458, - 72461, 72464, 72467, 0, 0, 72470, 72475, 72480, 72486, 72493, 72499, - 72505, 72511, 72517, 72523, 72529, 72535, 72541, 72547, 72553, 72559, - 72564, 72570, 72575, 72581, 72587, 72594, 72600, 72606, 72611, 72618, - 72625, 72632, 72638, 72643, 72648, 72653, 0, 0, 0, 0, 72661, 72667, - 72673, 72679, 72685, 72691, 72697, 72703, 72709, 72715, 72721, 72727, - 72733, 72739, 72745, 72751, 72757, 72763, 72769, 72775, 72781, 72786, - 72791, 72797, 72803, 72809, 72815, 72821, 72827, 72833, 72839, 72845, - 72851, 72857, 72863, 72869, 72875, 72881, 72887, 72893, 72899, 72905, - 72911, 72917, 72923, 72929, 72935, 72940, 72945, 72951, 72956, 72960, - 72965, 72969, 72973, 72977, 72983, 72988, 72993, 72998, 73003, 73008, - 73013, 73018, 73025, 73032, 73039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73046, 73051, 73056, 73061, 73068, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73075, - 73082, 73089, 73096, 73103, 73109, 73115, 73122, 73129, 73136, 73143, - 73150, 73157, 73164, 73171, 73178, 73184, 73191, 73198, 73205, 73212, - 73219, 73226, 73233, 73240, 73247, 73254, 73261, 73270, 73279, 73288, - 73297, 73306, 73315, 73324, 73333, 73341, 73349, 73357, 73365, 73373, - 73381, 73389, 73397, 73403, 73411, 0, 0, 73419, 73426, 73432, 73438, - 73444, 73450, 73456, 73462, 73468, 73474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 74821, 74828, 74835, 74842, 74849, 74855, 74861, + 74868, 74875, 74882, 74889, 74896, 74903, 74910, 74917, 74924, 74930, + 74937, 74944, 74951, 74958, 74965, 74972, 74979, 74986, 74993, 75000, + 75007, 75016, 75025, 75034, 75043, 75052, 75061, 75070, 75079, 75087, + 75095, 75103, 75111, 75119, 75127, 75135, 75143, 75149, 75157, 0, 0, + 75165, 75172, 75178, 75184, 75190, 75196, 75202, 75208, 75214, 75220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73480, 73484, - 73488, 73492, 73496, 73500, 73504, 73508, 73512, 73516, 73520, 73524, - 73528, 73532, 73536, 73540, 73544, 73548, 73552, 73556, 73560, 73564, - 73568, 0, 0, 0, 0, 73572, 73576, 73580, 73584, 73588, 73592, 73596, - 73600, 73604, 73608, 73612, 73616, 73620, 73624, 73628, 73632, 73636, - 73640, 73644, 73648, 73652, 73656, 73660, 73664, 73668, 73672, 73676, - 73680, 73684, 73688, 73692, 73696, 73700, 73704, 73708, 73712, 73716, - 73720, 73724, 73728, 73732, 73736, 73740, 73744, 73748, 73752, 73756, - 73760, 73764, 0, 0, 0, 0, 73768, 73772, 73776, 73780, 73784, 73788, - 73792, 73796, 73800, 73804, 73808, 73812, 73816, 73820, 73824, 73828, - 73832, 73836, 73840, 73844, 73848, 73852, 73856, 73860, 73864, 73868, - 73872, 73876, 73880, 73884, 73888, 73892, 73896, 73900, 73904, 73908, - 73912, 73916, 73920, 73924, 73928, 73932, 73936, 73940, 73944, 73948, - 73952, 73956, 73960, 73964, 73968, 73972, 73976, 73980, 73984, 73988, - 73992, 73996, 74000, 74004, 74008, 74012, 74016, 74020, 74024, 74028, - 74032, 74036, 74040, 74044, 74048, 74052, 74056, 74060, 74064, 74068, - 74072, 74076, 74080, 74084, 74088, 74092, 74096, 74100, 74104, 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, 74224, 74228, - 74232, 74236, 74240, 74244, 74248, 74252, 74256, 74260, 74264, 74268, - 74272, 74276, 74280, 74284, 74288, 74292, 74296, 74300, 74304, 74308, - 74312, 74316, 74320, 74324, 74328, 74332, 74336, 74340, 74344, 74348, - 74352, 74356, 74360, 74364, 74368, 74372, 74376, 74380, 74384, 74388, - 74392, 74396, 74400, 74404, 74408, 74412, 74416, 74420, 74424, 74428, - 74432, 74436, 74440, 74444, 74448, 74452, 74456, 74460, 74464, 74468, - 74472, 74476, 74480, 74484, 74488, 74492, 74496, 74500, 74504, 74508, - 74512, 74516, 74520, 74524, 74528, 74532, 74536, 74540, 74544, 74548, - 74552, 74556, 74560, 74564, 74568, 74572, 74576, 74580, 74584, 74588, - 74592, 74596, 74600, 74604, 74608, 74612, 74616, 74620, 74624, 74628, - 74632, 74636, 74640, 74644, 74648, 74652, 74656, 74660, 74664, 74668, - 74672, 74676, 74680, 74684, 74688, 74692, 74696, 74700, 74704, 74708, - 74712, 74716, 74720, 74724, 74728, 74732, 74736, 74740, 74744, 74748, - 74752, 74756, 74760, 74764, 74768, 74772, 74776, 74780, 74784, 74788, - 74792, 74796, 74800, 74804, 74808, 74812, 74816, 74820, 74824, 74828, - 74832, 74836, 74840, 74844, 74848, 74852, 74856, 74860, 74864, 74868, - 74872, 74876, 74880, 74884, 74888, 74892, 74896, 74900, 74904, 74908, - 74912, 74916, 74920, 74924, 74928, 74932, 74936, 74940, 74944, 74948, - 74952, 74956, 74960, 74964, 74968, 74972, 0, 0, 74976, 74980, 74984, - 74988, 74992, 74996, 75000, 75004, 75008, 75012, 75016, 75020, 75024, - 75028, 75032, 75036, 75040, 75044, 75048, 75052, 75056, 75060, 75064, - 75068, 75072, 75076, 75080, 75084, 75088, 75092, 75096, 75100, 75104, - 75108, 75112, 75116, 75120, 75124, 75128, 75132, 75136, 75140, 75144, - 75148, 75152, 75156, 75160, 75164, 75168, 75172, 75176, 75180, 75184, - 75188, 75192, 75196, 75200, 75204, 75208, 75212, 75216, 75220, 0, 0, - 75224, 75228, 75232, 75236, 75240, 75244, 75248, 75252, 75256, 75260, - 75264, 75268, 75272, 75276, 75280, 75284, 75288, 75292, 75296, 75300, - 75304, 75308, 75312, 75316, 75320, 75324, 75328, 75332, 75336, 75340, - 75344, 75348, 75352, 75356, 75360, 75364, 75368, 75372, 75376, 75380, - 75384, 75388, 75392, 75396, 75400, 75404, 75408, 75412, 75416, 75420, - 75424, 75428, 75432, 75436, 75440, 75444, 75448, 75452, 75456, 75460, - 75464, 75468, 75472, 75476, 75480, 75484, 75488, 75492, 75496, 75500, - 75504, 75508, 75512, 75516, 75520, 75524, 75528, 75532, 75536, 75540, - 75544, 75548, 75552, 75556, 75560, 75564, 75568, 75572, 75576, 75580, - 75584, 75588, 75592, 75596, 75600, 75604, 75608, 75612, 75616, 75620, - 75624, 75628, 75632, 75636, 75640, 75644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 75648, 75653, 75658, 75663, 75668, 75673, 75681, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 75686, 75693, 75700, 75707, 75714, 0, 0, 0, 0, 0, - 75721, 75728, 75735, 75745, 75751, 75757, 75763, 75769, 75775, 75781, - 75788, 75794, 75800, 75806, 75815, 75824, 75836, 75848, 75854, 75860, - 75866, 75873, 75880, 75887, 75894, 75901, 0, 75908, 75915, 75922, 75930, - 75937, 0, 75944, 0, 75951, 75958, 0, 75965, 75973, 0, 75980, 75987, - 75994, 76001, 76008, 76015, 76022, 76029, 76036, 76043, 76048, 76055, - 76062, 76068, 76074, 76080, 76086, 76092, 76098, 76104, 76110, 76116, - 76122, 76128, 76134, 76140, 76146, 76152, 76158, 76164, 76170, 76176, - 76182, 76188, 76194, 76200, 76206, 76212, 76218, 76224, 76230, 76236, - 76242, 76248, 76254, 76260, 76266, 76272, 76278, 76284, 76290, 76296, - 76302, 76308, 76314, 76320, 76326, 76332, 76338, 76344, 76350, 76356, - 76362, 76368, 76374, 76380, 76386, 76392, 76398, 76404, 76410, 76416, - 76422, 76428, 76434, 76440, 76446, 76452, 76458, 76464, 76470, 76476, - 76482, 76488, 76494, 76500, 76506, 76512, 76518, 76526, 76534, 76540, - 76546, 76552, 76558, 76567, 76576, 76584, 76592, 76600, 76608, 76616, - 76624, 76632, 76640, 76647, 76654, 76664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 76674, 76680, 76686, 76692, 76698, 76703, 76708, 76714, 76720, 76726, - 76732, 76740, 76746, 76752, 76760, 76768, 76776, 76784, 76789, 76794, - 76799, 76804, 76816, 76828, 76838, 76848, 76859, 76870, 76881, 76892, - 76902, 76912, 76923, 76934, 76945, 76956, 76966, 76976, 76986, 77001, - 77016, 77031, 77038, 77045, 77052, 77059, 77069, 77079, 77089, 77100, - 77110, 77118, 77126, 77135, 77143, 77152, 77160, 77168, 77176, 77185, - 77193, 77202, 77210, 77218, 77226, 77235, 77243, 77250, 77257, 77264, - 77271, 77279, 77287, 77295, 77303, 77311, 77320, 77328, 77336, 77344, - 77352, 77360, 77369, 77377, 77385, 77393, 77401, 77409, 77417, 77425, - 77433, 77441, 77449, 77458, 77466, 77475, 77483, 77491, 77499, 77508, - 77516, 77524, 77532, 77540, 77549, 77558, 77566, 77575, 77583, 77591, - 77599, 77608, 77616, 77625, 77633, 77640, 77647, 77655, 77662, 77670, - 77677, 77685, 77693, 77702, 77710, 77719, 77727, 77735, 77743, 77752, - 77760, 77767, 77774, 77782, 77789, 77797, 77804, 77814, 77824, 77834, - 77843, 77852, 77861, 77870, 77879, 77889, 77900, 77911, 77921, 77932, - 77943, 77953, 77962, 77971, 77979, 77988, 77997, 78005, 78014, 78023, - 78031, 78040, 78049, 78057, 78066, 78075, 78083, 78092, 78101, 78109, - 78118, 78126, 78135, 78143, 78151, 78160, 78168, 78177, 78185, 78193, - 78202, 78210, 78217, 78224, 78233, 78242, 78250, 78259, 78268, 78276, - 78286, 78294, 78302, 78309, 78317, 78325, 78332, 78342, 78352, 78363, - 78373, 78384, 78392, 78400, 78409, 78417, 78426, 78434, 78442, 78451, - 78459, 78468, 78476, 78483, 78490, 78497, 78504, 78512, 78520, 78528, - 78536, 78545, 78553, 78561, 78570, 78578, 78586, 78594, 78603, 78611, - 78619, 78627, 78635, 78643, 78651, 78659, 78667, 78675, 78684, 78692, - 78700, 78708, 78716, 78724, 78733, 78742, 78750, 78758, 78766, 78775, - 78783, 78792, 78799, 78806, 78814, 78821, 78829, 78837, 78846, 78854, - 78863, 78871, 78879, 78889, 78896, 78903, 78911, 78918, 78926, 78936, - 78947, 78955, 78964, 78972, 78981, 78989, 78998, 79006, 79015, 79023, - 79032, 79041, 79049, 79057, 79065, 79074, 79081, 79089, 79098, 79107, - 79116, 79125, 79133, 79142, 79150, 79159, 79167, 79176, 79184, 79193, - 79201, 79209, 79216, 79224, 79231, 79240, 79248, 79257, 79265, 79274, - 79282, 79290, 79298, 79307, 79315, 79324, 79333, 79342, 79351, 79360, - 79368, 79377, 79385, 79394, 79402, 79411, 79419, 79428, 79436, 79444, - 79451, 79459, 79466, 79475, 79483, 79492, 79500, 79509, 79517, 79525, - 79533, 79542, 79550, 79559, 79568, 79577, 79586, 79594, 79602, 79611, - 79619, 79628, 79637, 79645, 79653, 79661, 79670, 79678, 79686, 79695, - 79703, 79711, 79719, 79727, 79732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 79737, 79747, 79757, 79767, 79777, 79788, 79798, 79808, 79819, - 79828, 79837, 79846, 79856, 79866, 79876, 79887, 79897, 79907, 79917, - 79927, 79937, 79947, 79957, 79967, 79977, 79987, 79997, 80008, 80019, - 80029, 80039, 80050, 80061, 80072, 80082, 80092, 80102, 80112, 80122, - 80132, 80142, 80153, 80163, 80173, 80184, 80195, 80206, 80216, 80226, - 80236, 80246, 80257, 80267, 80277, 80288, 80299, 80309, 80319, 80328, - 80337, 80346, 80355, 80364, 80374, 0, 0, 80384, 80394, 80404, 80414, - 80424, 80435, 80445, 80455, 80466, 80476, 80487, 80496, 80505, 80516, - 80526, 80537, 80548, 80560, 80570, 80581, 80590, 80600, 80610, 80622, - 80632, 80642, 80652, 80662, 80672, 80681, 80690, 80699, 80708, 80718, - 80728, 80738, 80748, 80758, 80768, 80778, 80788, 80798, 80808, 80818, - 80828, 80837, 80846, 80855, 80865, 80875, 80885, 80895, 80905, 80916, 0, + 0, 0, 0, 0, 0, 75226, 75230, 75234, 75238, 75242, 75246, 75250, 75254, + 75258, 75262, 75266, 75270, 75274, 75278, 75282, 75286, 75290, 75294, + 75298, 75302, 75306, 75310, 75314, 0, 0, 0, 0, 75318, 75322, 75326, + 75330, 75334, 75338, 75342, 75346, 75350, 75354, 75358, 75362, 75366, + 75370, 75374, 75378, 75382, 75386, 75390, 75394, 75398, 75402, 75406, + 75410, 75414, 75418, 75422, 75426, 75430, 75434, 75438, 75442, 75446, + 75450, 75454, 75458, 75462, 75466, 75470, 75474, 75478, 75482, 75486, + 75490, 75494, 75498, 75502, 75506, 75510, 0, 0, 0, 0, 75514, 75518, + 75522, 75526, 75530, 75534, 75538, 75542, 75546, 75550, 75554, 75558, + 75562, 75566, 75570, 75574, 75578, 75582, 75586, 75590, 75594, 75598, + 75602, 75606, 75610, 75614, 75618, 75622, 75626, 75630, 75634, 75638, + 75642, 75646, 75650, 75654, 75658, 75662, 75666, 75670, 75674, 75678, + 75682, 75686, 75690, 75694, 75698, 75702, 75706, 75710, 75714, 75718, + 75722, 75726, 75730, 75734, 75738, 75742, 75746, 75750, 75754, 75758, + 75762, 75766, 75770, 75774, 75778, 75782, 75786, 75790, 75794, 75798, + 75802, 75806, 75810, 75814, 75818, 75822, 75826, 75830, 75834, 75838, + 75842, 75846, 75850, 75854, 75858, 75862, 75866, 75870, 75874, 75878, + 75882, 75886, 75890, 75894, 75898, 75902, 75906, 75910, 75914, 75918, + 75922, 75926, 75930, 75934, 75938, 75942, 75946, 75950, 75954, 75958, + 75962, 75966, 75970, 75974, 75978, 75982, 75986, 75990, 75994, 75998, + 76002, 76006, 76010, 76014, 76018, 76022, 76026, 76030, 76034, 76038, + 76042, 76046, 76050, 76054, 76058, 76062, 76066, 76070, 76074, 76078, + 76082, 76086, 76090, 76094, 76098, 76102, 76106, 76110, 76114, 76118, + 76122, 76126, 76130, 76134, 76138, 76142, 76146, 76150, 76154, 76158, + 76162, 76166, 76170, 76174, 76178, 76182, 76186, 76190, 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, 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, 0, + 0, 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, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80926, 80941, 80956, 80962, - 80968, 80974, 80980, 80986, 80992, 80998, 81004, 81012, 81016, 81019, 0, - 0, 81027, 81030, 81033, 81036, 81039, 81042, 81045, 81048, 81051, 81054, - 81057, 81060, 81063, 81066, 81069, 81072, 81075, 81083, 81092, 81103, - 81111, 81119, 81128, 81137, 81148, 81160, 0, 0, 0, 0, 0, 0, 81169, 81174, - 81179, 81186, 81193, 81199, 81205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81210, - 81220, 81230, 81240, 81249, 81260, 81269, 81278, 81288, 81298, 81310, - 81322, 81333, 81344, 81355, 81366, 81376, 81386, 81396, 81406, 81417, - 81428, 81432, 81437, 81446, 81455, 81459, 81463, 81467, 81472, 81477, - 81482, 81487, 81490, 81494, 0, 81499, 81502, 81505, 81509, 81513, 81518, - 81522, 81526, 81531, 81536, 81543, 81550, 81553, 81556, 81559, 81562, - 81565, 81569, 81573, 0, 81577, 81582, 81586, 81590, 0, 0, 0, 0, 81595, - 81600, 81607, 81612, 81617, 0, 81622, 81627, 81632, 81637, 81642, 81647, - 81652, 81657, 81662, 81667, 81672, 81677, 81686, 81695, 81703, 81711, - 81720, 81729, 81738, 81747, 81755, 81763, 81771, 81779, 81784, 81789, - 81795, 81801, 81807, 81813, 81821, 81829, 81835, 81841, 81847, 81853, - 81859, 81865, 81871, 81877, 81882, 81887, 81892, 81897, 81902, 81907, - 81912, 81917, 81923, 81929, 81935, 81941, 81947, 81953, 81959, 81965, - 81971, 81977, 81983, 81989, 81995, 82001, 82007, 82013, 82019, 82025, - 82031, 82037, 82043, 82049, 82055, 82061, 82067, 82073, 82079, 82085, - 82091, 82097, 82103, 82109, 82115, 82121, 82127, 82133, 82139, 82145, - 82151, 82157, 82163, 82169, 82175, 82181, 82187, 82193, 82199, 82205, - 82211, 82217, 82223, 82229, 82235, 82241, 82247, 82253, 82259, 82265, - 82271, 82277, 82282, 82287, 82292, 82297, 82303, 82309, 82315, 82321, - 82327, 82333, 82339, 82345, 82351, 82357, 82363, 82369, 82374, 82379, - 82384, 82389, 82401, 82413, 82424, 82435, 82447, 82459, 82467, 0, 0, - 82475, 0, 82483, 82487, 82491, 82494, 82498, 82502, 82505, 82508, 82512, - 82516, 82519, 82522, 82525, 82528, 82533, 82536, 82540, 82543, 82546, - 82549, 82552, 82555, 82558, 82561, 82564, 82567, 82570, 82573, 82577, - 82581, 82585, 82589, 82594, 82599, 82605, 82611, 82617, 82622, 82628, - 82634, 82640, 82645, 82651, 82657, 82662, 82667, 82672, 82677, 82683, - 82689, 82694, 82699, 82705, 82710, 82716, 82722, 82728, 82734, 82740, - 82744, 82749, 82753, 82758, 82762, 82767, 82772, 82778, 82784, 82790, - 82795, 82801, 82807, 82813, 82818, 82824, 82830, 82835, 82840, 82845, - 82850, 82856, 82862, 82867, 82872, 82878, 82883, 82889, 82895, 82901, - 82907, 82913, 82918, 82922, 82927, 82930, 82935, 82940, 82946, 82951, - 82956, 82960, 82966, 82971, 82976, 82981, 82986, 82991, 82996, 83001, - 83007, 83013, 83019, 83027, 83031, 83035, 83039, 83043, 83047, 83051, - 83056, 83061, 83066, 83071, 83076, 83081, 83086, 83091, 83096, 83101, - 83106, 83111, 83116, 83120, 83124, 83129, 83134, 83139, 83144, 83148, - 83153, 83158, 83163, 83168, 83172, 83177, 83182, 83187, 83192, 83196, - 83201, 83206, 83210, 83215, 83220, 83225, 83230, 83235, 83239, 83246, - 83253, 83257, 83262, 83267, 83272, 83277, 83282, 83287, 83292, 83297, - 83302, 83307, 83312, 83317, 83322, 83327, 83332, 83337, 83342, 83347, - 83352, 83357, 83362, 83367, 83372, 83377, 83382, 83387, 83392, 83397, - 83402, 0, 0, 0, 83407, 83411, 83416, 83420, 83425, 83430, 0, 0, 83434, - 83439, 83444, 83448, 83453, 83458, 0, 0, 83463, 83468, 83472, 83477, - 83482, 83487, 0, 0, 83492, 83497, 83502, 0, 0, 0, 83506, 83510, 83514, - 83517, 83520, 83524, 83528, 0, 83532, 83538, 83541, 83545, 83548, 83552, - 83556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83560, 83566, 83572, 83578, 83584, - 0, 0, 83588, 83594, 83600, 83606, 83612, 83618, 83625, 83632, 83639, - 83646, 83653, 83660, 0, 83667, 83674, 83681, 83687, 83694, 83701, 83708, - 83715, 83721, 83728, 83735, 83742, 83749, 83755, 83762, 83769, 83776, - 83783, 83789, 83796, 83803, 83810, 83817, 83824, 83831, 83838, 0, 83845, - 83851, 83858, 83865, 83872, 83879, 83886, 83893, 83900, 83907, 83914, - 83921, 83928, 83935, 83941, 83948, 83955, 83962, 83969, 0, 83976, 83983, - 0, 83990, 83997, 84004, 84011, 84018, 84025, 84032, 84039, 84046, 84053, - 84060, 84067, 84074, 84081, 84088, 0, 0, 84094, 84099, 84104, 84109, - 84114, 84119, 84124, 84129, 84134, 84139, 84144, 84149, 84154, 84159, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77394, 77399, 77404, 77409, 77414, + 77419, 77427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77432, 77439, 77446, + 77453, 77460, 0, 0, 0, 0, 0, 77467, 77474, 77481, 77491, 77497, 77503, + 77509, 77515, 77521, 77527, 77534, 77540, 77546, 77552, 77561, 77570, + 77582, 77594, 77600, 77606, 77612, 77619, 77626, 77633, 77640, 77647, 0, + 77654, 77661, 77668, 77676, 77683, 0, 77690, 0, 77697, 77704, 0, 77711, + 77719, 0, 77726, 77733, 77740, 77747, 77754, 77761, 77768, 77775, 77782, + 77789, 77794, 77801, 77808, 77814, 77820, 77826, 77832, 77838, 77844, + 77850, 77856, 77862, 77868, 77874, 77880, 77886, 77892, 77898, 77904, + 77910, 77916, 77922, 77928, 77934, 77940, 77946, 77952, 77958, 77964, + 77970, 77976, 77982, 77988, 77994, 78000, 78006, 78012, 78018, 78024, + 78030, 78036, 78042, 78048, 78054, 78060, 78066, 78072, 78078, 78084, + 78090, 78096, 78102, 78108, 78114, 78120, 78126, 78132, 78138, 78144, + 78150, 78156, 78162, 78168, 78174, 78180, 78186, 78192, 78198, 78204, + 78210, 78216, 78222, 78228, 78234, 78240, 78246, 78252, 78258, 78264, + 78272, 78280, 78286, 78292, 78298, 78304, 78313, 78322, 78330, 78338, + 78346, 78354, 78362, 78370, 78378, 78386, 78393, 78400, 78410, 78420, + 78424, 78428, 78433, 78438, 78443, 78448, 78457, 78466, 78472, 78478, + 78485, 78492, 78499, 78503, 78509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 78515, 78521, 78527, 78533, 78539, 78544, 78549, 78555, + 78561, 78567, 78573, 78581, 78587, 78593, 78601, 78609, 78617, 78625, + 78630, 78635, 78640, 78645, 78657, 78669, 78679, 78689, 78700, 78711, + 78722, 78733, 78743, 78753, 78764, 78775, 78786, 78797, 78807, 78817, + 78827, 78842, 78857, 78872, 78879, 78886, 78893, 78900, 78910, 78920, + 78930, 78941, 78951, 78959, 78967, 78976, 78984, 78993, 79001, 79009, + 79017, 79026, 79034, 79043, 79051, 79059, 79067, 79076, 79084, 79091, + 79098, 79105, 79112, 79120, 79128, 79136, 79144, 79152, 79161, 79169, + 79177, 79185, 79193, 79201, 79210, 79218, 79226, 79234, 79242, 79250, + 79258, 79266, 79274, 79282, 79290, 79299, 79307, 79316, 79324, 79332, + 79340, 79349, 79357, 79365, 79373, 79381, 79390, 79399, 79407, 79416, + 79424, 79432, 79440, 79449, 79457, 79466, 79474, 79481, 79488, 79496, + 79503, 79511, 79518, 79526, 79534, 79543, 79551, 79560, 79568, 79576, + 79584, 79593, 79601, 79608, 79615, 79623, 79630, 79638, 79645, 79655, + 79665, 79675, 79684, 79693, 79702, 79711, 79720, 79730, 79741, 79752, + 79762, 79773, 79784, 79794, 79803, 79812, 79820, 79829, 79838, 79846, + 79855, 79864, 79872, 79881, 79890, 79898, 79907, 79916, 79924, 79933, + 79942, 79950, 79959, 79967, 79976, 79984, 79992, 80001, 80009, 80018, + 80026, 80034, 80043, 80051, 80058, 80065, 80074, 80083, 80091, 80100, + 80109, 80117, 80127, 80135, 80143, 80150, 80158, 80166, 80173, 80183, + 80193, 80204, 80214, 80225, 80233, 80241, 80250, 80258, 80267, 80275, + 80283, 80292, 80300, 80309, 80317, 80324, 80331, 80338, 80345, 80353, + 80361, 80369, 80377, 80386, 80394, 80402, 80411, 80419, 80427, 80435, + 80444, 80452, 80460, 80468, 80476, 80484, 80492, 80500, 80508, 80516, + 80525, 80533, 80541, 80549, 80557, 80565, 80574, 80583, 80591, 80599, + 80607, 80616, 80624, 80633, 80640, 80647, 80655, 80662, 80670, 80678, + 80687, 80695, 80704, 80712, 80720, 80730, 80737, 80744, 80752, 80759, + 80767, 80777, 80788, 80796, 80805, 80813, 80822, 80830, 80839, 80847, + 80856, 80864, 80873, 80882, 80890, 80898, 80906, 80915, 80922, 80930, + 80939, 80948, 80957, 80966, 80974, 80983, 80991, 81000, 81008, 81017, + 81025, 81034, 81042, 81050, 81057, 81065, 81072, 81081, 81089, 81098, + 81106, 81115, 81123, 81131, 81139, 81148, 81156, 81165, 81174, 81183, + 81192, 81201, 81209, 81218, 81226, 81235, 81243, 81252, 81260, 81269, + 81277, 81285, 81292, 81300, 81307, 81316, 81324, 81333, 81341, 81350, + 81358, 81366, 81374, 81383, 81391, 81400, 81409, 81418, 81427, 81435, + 81443, 81452, 81460, 81469, 81478, 81486, 81494, 81502, 81511, 81519, + 81527, 81536, 81544, 81552, 81560, 81568, 81573, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 81578, 81588, 81598, 81608, 81618, 81629, 81639, + 81649, 81660, 81669, 81678, 81687, 81697, 81707, 81717, 81728, 81738, + 81748, 81758, 81768, 81778, 81788, 81798, 81808, 81818, 81828, 81838, + 81849, 81860, 81870, 81880, 81891, 81902, 81913, 81923, 81933, 81943, + 81953, 81963, 81973, 81983, 81994, 82004, 82014, 82025, 82036, 82047, + 82057, 82067, 82077, 82087, 82098, 82108, 82118, 82129, 82140, 82150, + 82160, 82169, 82178, 82187, 82196, 82205, 82215, 0, 0, 82225, 82235, + 82245, 82255, 82265, 82276, 82286, 82296, 82307, 82317, 82328, 82337, + 82346, 82357, 82367, 82378, 82389, 82401, 82411, 82422, 82431, 82441, + 82451, 82463, 82473, 82483, 82493, 82503, 82513, 82522, 82531, 82540, + 82549, 82559, 82569, 82579, 82589, 82599, 82609, 82619, 82629, 82639, + 82649, 82659, 82669, 82678, 82687, 82696, 82706, 82716, 82726, 82736, + 82746, 82757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82767, 82782, + 82797, 82803, 82809, 82815, 82821, 82827, 82833, 82839, 82845, 82853, + 82857, 82860, 0, 0, 82868, 82871, 82874, 82877, 82880, 82883, 82886, + 82889, 82892, 82895, 82898, 82901, 82904, 82907, 82910, 82913, 82916, + 82924, 82933, 82944, 82952, 82960, 82969, 82978, 82989, 83001, 0, 0, 0, + 0, 0, 0, 83010, 83015, 83020, 83027, 83034, 83040, 83046, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83051, 83061, 83071, 83081, 83090, 83101, 83110, 83119, + 83129, 83139, 83151, 83163, 83174, 83185, 83196, 83207, 83217, 83227, + 83237, 83247, 83258, 83269, 83273, 83278, 83287, 83296, 83300, 83304, + 83308, 83313, 83318, 83323, 83328, 83331, 83335, 0, 83340, 83343, 83346, + 83350, 83354, 83359, 83363, 83367, 83372, 83377, 83384, 83391, 83394, + 83397, 83400, 83403, 83406, 83410, 83414, 0, 83418, 83423, 83427, 83431, + 0, 0, 0, 0, 83436, 83441, 83448, 83453, 83458, 0, 83463, 83468, 83473, + 83478, 83483, 83488, 83493, 83498, 83503, 83508, 83513, 83518, 83527, + 83536, 83544, 83552, 83561, 83570, 83579, 83588, 83596, 83604, 83612, + 83620, 83625, 83630, 83636, 83642, 83648, 83654, 83662, 83670, 83676, + 83682, 83688, 83694, 83700, 83706, 83712, 83718, 83723, 83728, 83733, + 83738, 83743, 83748, 83753, 83758, 83764, 83770, 83776, 83782, 83788, + 83794, 83800, 83806, 83812, 83818, 83824, 83830, 83836, 83842, 83848, + 83854, 83860, 83866, 83872, 83878, 83884, 83890, 83896, 83902, 83908, + 83914, 83920, 83926, 83932, 83938, 83944, 83950, 83956, 83962, 83968, + 83974, 83980, 83986, 83992, 83998, 84004, 84010, 84016, 84022, 84028, + 84034, 84040, 84046, 84052, 84058, 84064, 84070, 84076, 84082, 84088, + 84094, 84100, 84106, 84112, 84118, 84123, 84128, 84133, 84138, 84144, + 84150, 84156, 84162, 84168, 84174, 84180, 84186, 84192, 84198, 84204, + 84210, 84215, 84220, 84225, 84230, 84242, 84254, 84265, 84276, 84288, + 84300, 84308, 0, 0, 84316, 0, 84324, 84328, 84332, 84335, 84339, 84343, + 84346, 84349, 84353, 84357, 84360, 84363, 84366, 84369, 84374, 84377, + 84381, 84384, 84387, 84390, 84393, 84396, 84399, 84402, 84405, 84408, + 84411, 84414, 84418, 84422, 84426, 84430, 84435, 84440, 84446, 84452, + 84458, 84463, 84469, 84475, 84481, 84486, 84492, 84498, 84503, 84508, + 84513, 84518, 84524, 84530, 84535, 84540, 84546, 84551, 84557, 84563, + 84569, 84575, 84581, 84585, 84590, 84594, 84599, 84603, 84608, 84613, + 84619, 84625, 84631, 84636, 84642, 84648, 84654, 84659, 84665, 84671, + 84676, 84681, 84686, 84691, 84697, 84703, 84708, 84713, 84719, 84724, + 84730, 84736, 84742, 84748, 84754, 84759, 84763, 84768, 84771, 84776, + 84781, 84787, 84792, 84797, 84801, 84807, 84812, 84817, 84822, 84827, + 84832, 84837, 84842, 84848, 84854, 84860, 84868, 84872, 84876, 84880, + 84884, 84888, 84892, 84897, 84902, 84907, 84912, 84917, 84922, 84927, + 84932, 84937, 84942, 84947, 84952, 84957, 84961, 84965, 84970, 84975, + 84980, 84985, 84989, 84994, 84999, 85004, 85009, 85013, 85018, 85023, + 85028, 85033, 85037, 85042, 85047, 85051, 85056, 85061, 85066, 85071, + 85076, 85080, 85087, 85094, 85098, 85103, 85108, 85113, 85118, 85123, + 85128, 85133, 85138, 85143, 85148, 85153, 85158, 85163, 85168, 85173, + 85178, 85183, 85188, 85193, 85198, 85203, 85208, 85213, 85218, 85223, + 85228, 85233, 85238, 85243, 0, 0, 0, 85248, 85252, 85257, 85261, 85266, + 85271, 0, 0, 85275, 85280, 85285, 85289, 85294, 85299, 0, 0, 85304, + 85309, 85313, 85318, 85323, 85328, 0, 0, 85333, 85338, 85343, 0, 0, 0, + 85347, 85351, 85355, 85359, 85362, 85366, 85370, 0, 85374, 85380, 85383, + 85387, 85390, 85394, 85398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85402, 85408, + 85414, 85420, 85426, 0, 0, 85430, 85436, 85442, 85448, 85454, 85460, + 85467, 85474, 85481, 85488, 85495, 85502, 0, 85509, 85516, 85523, 85529, + 85536, 85543, 85550, 85557, 85563, 85570, 85577, 85584, 85591, 85597, + 85604, 85611, 85618, 85625, 85631, 85638, 85645, 85652, 85659, 85666, + 85673, 85680, 0, 85687, 85693, 85700, 85707, 85714, 85721, 85728, 85735, + 85742, 85749, 85756, 85763, 85770, 85777, 85783, 85790, 85797, 85804, + 85811, 0, 85818, 85825, 0, 85832, 85839, 85846, 85853, 85860, 85867, + 85874, 85881, 85888, 85895, 85902, 85909, 85916, 85923, 85930, 0, 0, + 85936, 85941, 85946, 85951, 85956, 85961, 85966, 85971, 85976, 85981, + 85986, 85991, 85996, 86001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86006, 86013, + 86020, 86027, 86034, 86041, 86048, 86055, 86062, 86069, 86076, 86083, + 86090, 86097, 86104, 86111, 86118, 86125, 86132, 86139, 86147, 86155, + 86162, 86169, 86174, 86182, 86190, 86197, 86204, 86209, 86216, 86221, + 86226, 86233, 86238, 86243, 86248, 86256, 86261, 86266, 86273, 86278, + 86283, 86290, 86297, 86302, 86307, 86312, 86317, 86322, 86327, 86332, + 86337, 86342, 86349, 86354, 86361, 86366, 86371, 86376, 86381, 86386, + 86391, 86396, 86401, 86406, 86411, 86416, 86423, 86430, 86437, 86444, + 86450, 86455, 86462, 86467, 86472, 86481, 86488, 86497, 86504, 86509, + 86514, 86522, 86527, 86532, 86537, 86542, 86547, 86554, 86559, 86564, + 86569, 86574, 86579, 86586, 86593, 86600, 86607, 86614, 86621, 86628, + 86635, 86642, 86649, 86656, 86663, 86670, 86677, 86684, 86691, 86698, + 86705, 86712, 86719, 86726, 86733, 86740, 86747, 86754, 86761, 86768, + 86775, 0, 0, 0, 0, 0, 86782, 86790, 86798, 0, 0, 0, 0, 86803, 86807, + 86811, 86815, 86819, 86823, 86827, 86831, 86835, 86839, 86844, 86849, + 86854, 86859, 86864, 86869, 86874, 86879, 86884, 86890, 86896, 86902, + 86909, 86916, 86923, 86930, 86937, 86944, 86950, 86956, 86962, 86969, + 86976, 86983, 86990, 86997, 87004, 87011, 87018, 87025, 87032, 87039, + 87046, 87053, 87060, 0, 0, 0, 87067, 87075, 87083, 87091, 87099, 87107, + 87117, 87127, 87135, 87143, 87151, 87159, 87167, 87173, 87180, 87189, + 87198, 87207, 87216, 87225, 87234, 87244, 87255, 87265, 87276, 87285, + 87294, 87303, 87313, 87324, 87334, 87345, 87356, 87365, 87373, 87379, + 87385, 87391, 87397, 87405, 87413, 87419, 87426, 87436, 87443, 87450, + 87457, 87464, 87471, 87481, 87488, 87495, 87503, 87511, 87520, 87529, + 87538, 87547, 87556, 87564, 87573, 87582, 87591, 87595, 87602, 87607, + 87612, 87616, 87620, 87624, 87628, 87633, 87638, 87644, 87650, 87654, + 87660, 87664, 87668, 87672, 87676, 87680, 87684, 87690, 0, 0, 0, 0, 0, + 87694, 87699, 87704, 87709, 87714, 87721, 87726, 87731, 87736, 87741, + 87746, 87751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 84164, 84171, 84178, 84185, 84192, 84199, - 84206, 84213, 84220, 84227, 84234, 84241, 84248, 84255, 84262, 84269, - 84276, 84283, 84290, 84297, 84305, 84313, 84320, 84327, 84332, 84340, - 84348, 84355, 84362, 84367, 84374, 84379, 84384, 84391, 84396, 84401, - 84406, 84414, 84419, 84424, 84431, 84436, 84441, 84448, 84455, 84460, - 84465, 84470, 84475, 84480, 84485, 84490, 84495, 84500, 84507, 84512, - 84519, 84524, 84529, 84534, 84539, 84544, 84549, 84554, 84559, 84564, - 84569, 84574, 84581, 84588, 84595, 84602, 84608, 84613, 84620, 84625, - 84630, 84639, 84646, 84655, 84662, 84667, 84672, 84680, 84685, 84690, - 84695, 84700, 84705, 84712, 84717, 84722, 84727, 84732, 84737, 84744, - 84751, 84758, 84765, 84772, 84779, 84786, 84793, 84800, 84807, 84814, - 84821, 84828, 84835, 84842, 84849, 84856, 84863, 84870, 84877, 84884, - 84891, 84898, 84905, 84912, 84919, 84926, 84933, 0, 0, 0, 0, 0, 84940, - 84948, 84956, 0, 0, 0, 0, 84961, 84965, 84969, 84973, 84977, 84981, - 84985, 84989, 84993, 84997, 85002, 85007, 85012, 85017, 85022, 85027, - 85032, 85037, 85042, 85048, 85054, 85060, 85067, 85074, 85081, 85088, - 85095, 85102, 85108, 85114, 85120, 85127, 85134, 85141, 85148, 85155, - 85162, 85169, 85176, 85183, 85190, 85197, 85204, 85211, 85218, 0, 0, 0, - 85225, 85233, 85241, 85249, 85257, 85265, 85275, 85285, 85293, 85301, - 85309, 85317, 85325, 85331, 85338, 85347, 85356, 85365, 85374, 85383, - 85392, 85402, 85413, 85423, 85434, 85443, 85452, 85461, 85471, 85482, - 85492, 85503, 85514, 85523, 85531, 85537, 85543, 85549, 85555, 85563, - 85571, 85577, 85584, 85594, 85601, 85608, 85615, 85622, 85629, 85639, - 85646, 85653, 85661, 85669, 85678, 85687, 85696, 85705, 85714, 85722, - 85731, 85740, 85749, 85753, 85760, 85765, 85770, 85774, 85778, 85782, - 85786, 85791, 85796, 85802, 85808, 85812, 85818, 85822, 85826, 85830, - 85834, 85838, 85842, 85848, 0, 0, 0, 0, 0, 85852, 85857, 85862, 85867, - 85872, 85879, 85884, 85889, 85894, 85899, 85904, 85909, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87756, 87763, 87772, 87781, 87788, 87795, 87802, + 87809, 87816, 87823, 87829, 87836, 87843, 87850, 87857, 87864, 87871, + 87878, 87885, 87894, 87901, 87908, 87915, 87922, 87929, 87936, 87943, + 87950, 87959, 87966, 87973, 87980, 87987, 87994, 88001, 88010, 88017, + 88024, 88031, 88038, 88047, 88054, 88061, 88068, 88076, 88085, 0, 0, + 88094, 88098, 88102, 88107, 88112, 88117, 88122, 88126, 88131, 88136, + 88141, 88146, 88151, 88156, 88160, 88164, 88168, 88173, 88178, 88182, + 88187, 88192, 88196, 88200, 88205, 88210, 88215, 88220, 88225, 0, 0, 0, + 88230, 88234, 88239, 88244, 88248, 88253, 88257, 88262, 88267, 88272, + 88277, 88281, 88285, 88290, 88295, 88300, 88305, 88309, 88314, 88318, + 88323, 88328, 88332, 88337, 88342, 88347, 88351, 88355, 88360, 88365, + 88370, 88375, 88380, 88385, 88390, 88395, 88400, 88405, 88410, 88415, + 88420, 88425, 88430, 88435, 88440, 88445, 88450, 88455, 88460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85914, - 85921, 85930, 85939, 85946, 85953, 85960, 85967, 85974, 85981, 85987, - 85994, 86001, 86008, 86015, 86022, 86029, 86036, 86043, 86052, 86059, - 86066, 86073, 86080, 86087, 86094, 86101, 86108, 86117, 86124, 86131, - 86138, 86145, 86152, 86159, 86168, 86175, 86182, 86189, 86196, 86205, - 86212, 86219, 86226, 86234, 86243, 0, 0, 86252, 86256, 86260, 86265, - 86270, 86275, 86280, 86284, 86289, 86294, 86299, 86304, 86309, 86314, - 86318, 86322, 86326, 86331, 86336, 86340, 86345, 86350, 86354, 86358, - 86363, 86368, 86373, 86378, 86383, 0, 0, 0, 86388, 86392, 86397, 86402, - 86406, 86411, 86415, 86420, 86425, 86430, 86435, 86439, 86443, 86448, - 86453, 86458, 86463, 86467, 86472, 86476, 86481, 86486, 86490, 86495, - 86500, 86505, 86509, 86513, 86518, 86523, 86528, 86533, 86538, 86543, - 86548, 86553, 86558, 86563, 86568, 86573, 86578, 86583, 86588, 86593, - 86598, 86603, 86608, 86613, 86618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88465, 88469, + 88474, 88479, 88484, 88488, 88493, 88498, 88503, 88508, 88512, 88516, + 88521, 88526, 88531, 88536, 88540, 88545, 88550, 88555, 88560, 88565, + 88570, 88574, 88579, 88584, 88589, 88594, 88599, 88604, 88609, 0, 88614, + 88619, 88624, 88630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88636, 88641, + 88646, 88651, 88656, 88661, 88666, 88671, 88676, 88681, 88686, 88691, + 88696, 88701, 88706, 88711, 88716, 88721, 88726, 88731, 88736, 88741, + 88746, 88751, 88756, 88761, 88766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86623, 86627, 86632, 86637, 86642, 86646, - 86651, 86656, 86661, 86666, 86670, 86674, 86679, 86684, 86689, 86694, - 86698, 86703, 86708, 86713, 86718, 86723, 86728, 86732, 86737, 86742, - 86747, 86752, 86757, 86762, 86767, 0, 86772, 86777, 86782, 86788, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86794, 86799, 86804, 86809, 86814, 86819, - 86824, 86829, 86834, 86839, 86844, 86849, 86854, 86859, 86864, 86869, - 86874, 86879, 86884, 86889, 86894, 86899, 86904, 86909, 86914, 86919, - 86924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88773, 88778, 88783, + 88788, 88793, 88798, 88803, 88808, 88813, 88818, 88823, 88828, 88833, + 88838, 88843, 88848, 88853, 88858, 88863, 88868, 88873, 88878, 88883, + 88888, 88893, 88898, 88903, 88907, 88911, 88915, 0, 88920, 88926, 88931, + 88936, 88941, 88946, 88952, 88958, 88964, 88970, 88976, 88982, 88988, + 88994, 89000, 89006, 89012, 89018, 89024, 89029, 89035, 89041, 89046, + 89052, 89057, 89063, 89069, 89074, 89080, 89086, 89091, 89097, 89103, + 89109, 89115, 89121, 89127, 0, 0, 0, 0, 89132, 89138, 89144, 89150, + 89156, 89162, 89168, 89174, 89180, 89187, 89192, 89197, 89203, 89209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 86931, 86936, 86941, 86946, 86951, 86956, 86961, - 86966, 86971, 86976, 86981, 86986, 86991, 86996, 87001, 87006, 87011, - 87016, 87021, 87026, 87031, 87036, 87041, 87046, 87051, 87056, 87061, - 87065, 87069, 87073, 0, 87078, 87084, 87089, 87094, 87099, 87104, 87110, - 87116, 87122, 87128, 87134, 87140, 87146, 87152, 87158, 87164, 87170, - 87176, 87182, 87187, 87193, 87199, 87204, 87210, 87215, 87221, 87227, - 87232, 87238, 87244, 87249, 87255, 87261, 87267, 87273, 87279, 87285, 0, - 0, 0, 0, 87290, 87296, 87302, 87308, 87314, 87320, 87326, 87332, 87338, - 87345, 87350, 87355, 87361, 87367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89215, 89220, 89225, + 89230, 89236, 89241, 89247, 89253, 89259, 89265, 89272, 89278, 89285, + 89290, 89295, 89300, 89305, 89310, 89315, 89320, 89325, 89330, 89335, + 89340, 89345, 89350, 89355, 89360, 89365, 89370, 89375, 89380, 89385, + 89390, 89395, 89400, 89405, 89410, 89415, 89420, 89425, 89430, 89435, + 89440, 89446, 89451, 89457, 89463, 89469, 89475, 89482, 89488, 89495, + 89500, 89505, 89510, 89515, 89520, 89525, 89530, 89535, 89540, 89545, + 89550, 89555, 89560, 89565, 89570, 89575, 89580, 89585, 89590, 89595, + 89600, 89605, 89610, 89615, 89620, 89625, 89630, 89635, 89640, 89645, + 89650, 89655, 89660, 89665, 89670, 89675, 89680, 89685, 89690, 89695, + 89700, 89705, 89710, 89715, 89720, 89725, 89730, 89735, 89740, 89745, + 89750, 89755, 89760, 89765, 89770, 89775, 89780, 89785, 89790, 89795, + 89800, 89805, 89810, 89815, 89820, 89825, 89830, 89835, 89840, 89845, + 89850, 89855, 89860, 89865, 89870, 89875, 89880, 89885, 89890, 89895, + 89900, 89905, 89910, 89914, 89919, 89924, 89929, 89934, 89939, 89944, + 89949, 89954, 89959, 89964, 89969, 89974, 89978, 89982, 89986, 89990, + 89994, 89998, 90002, 90007, 90012, 0, 0, 90017, 90022, 90026, 90030, + 90034, 90038, 90042, 90046, 90050, 90054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87373, 87378, 87383, 87388, 87394, 87399, 87405, 87411, - 87417, 87423, 87430, 87436, 87443, 87448, 87453, 87458, 87463, 87468, - 87473, 87478, 87483, 87488, 87493, 87498, 87503, 87508, 87513, 87518, - 87523, 87528, 87533, 87538, 87543, 87548, 87553, 87558, 87563, 87568, - 87573, 87578, 87583, 87588, 87593, 87598, 87604, 87609, 87615, 87621, - 87627, 87633, 87640, 87646, 87653, 87658, 87663, 87668, 87673, 87678, - 87683, 87688, 87693, 87698, 87703, 87708, 87713, 87718, 87723, 87728, - 87733, 87738, 87743, 87748, 87753, 87758, 87763, 87768, 87773, 87778, - 87783, 87788, 87793, 87798, 87803, 87808, 87813, 87818, 87823, 87828, - 87833, 87838, 87843, 87848, 87853, 87858, 87863, 87868, 87873, 87878, - 87883, 87888, 87893, 87898, 87903, 87908, 87913, 87918, 87923, 87928, - 87933, 87938, 87943, 87948, 87953, 87958, 87963, 87968, 87973, 87978, - 87983, 87988, 87993, 87998, 88003, 88008, 88013, 88018, 88023, 88028, - 88033, 88038, 88043, 88048, 88053, 88058, 88063, 88068, 88072, 88077, - 88082, 88087, 88092, 88097, 88102, 88107, 88112, 88117, 88122, 88127, - 88132, 88136, 88140, 88144, 88148, 88152, 88156, 88160, 88165, 88170, 0, - 0, 88175, 88180, 88184, 88188, 88192, 88196, 88200, 88204, 88208, 88212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 90058, 90062, 90066, 90070, 90074, 90078, 0, 0, 90083, 0, + 90088, 90092, 90097, 90102, 90107, 90112, 90117, 90122, 90127, 90132, + 90137, 90141, 90146, 90151, 90156, 90161, 90165, 90170, 90175, 90180, + 90185, 90189, 90194, 90199, 90204, 90209, 90213, 90218, 90223, 90228, + 90233, 90238, 90243, 90248, 90253, 90258, 90263, 90268, 90273, 90277, + 90282, 90287, 90292, 90297, 0, 90302, 90307, 0, 0, 0, 90312, 0, 0, 90317, + 90322, 90329, 90336, 90343, 90350, 90357, 90364, 90371, 90378, 90385, + 90392, 90399, 90406, 90413, 90420, 90427, 90434, 90441, 90448, 90455, + 90462, 90469, 0, 90476, 90483, 90489, 90495, 90501, 90508, 90515, 90523, + 90531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90540, 90545, 90550, 90555, 90560, 90565, + 90570, 90575, 90580, 90585, 90590, 90595, 90600, 90605, 90610, 90615, + 90620, 90625, 90630, 90635, 90640, 90645, 90650, 90654, 90659, 90664, + 90670, 90674, 0, 0, 0, 90678, 90684, 90688, 90693, 90698, 90703, 90707, + 90712, 90716, 90721, 90726, 90730, 90734, 90738, 90742, 90746, 90751, + 90756, 90760, 90765, 90770, 90774, 90779, 90784, 90789, 90794, 90799, 0, + 0, 0, 0, 0, 90804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88216, 88220, 88224, 88228, - 88232, 88236, 0, 0, 88241, 0, 88246, 88250, 88255, 88260, 88265, 88270, - 88275, 88280, 88285, 88290, 88295, 88299, 88304, 88309, 88314, 88319, - 88323, 88328, 88333, 88338, 88343, 88347, 88352, 88357, 88362, 88367, - 88371, 88376, 88381, 88386, 88391, 88396, 88401, 88406, 88411, 88416, - 88421, 88426, 88431, 88435, 88440, 88445, 88450, 88455, 0, 88460, 88465, - 0, 0, 0, 88470, 0, 0, 88475, 88480, 88487, 88494, 88501, 88508, 88515, - 88522, 88529, 88536, 88543, 88550, 88557, 88564, 88571, 88578, 88585, - 88592, 88599, 88606, 88613, 88620, 88627, 0, 88634, 88641, 88647, 88653, - 88659, 88666, 88673, 88681, 88689, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88698, 88703, - 88708, 88713, 88718, 88723, 88728, 88733, 88738, 88743, 88748, 88753, - 88758, 88763, 88768, 88773, 88778, 88783, 88788, 88793, 88798, 88803, - 88808, 88812, 88817, 88822, 88828, 88832, 0, 0, 0, 88836, 88842, 88846, - 88851, 88856, 88861, 88865, 88870, 88874, 88879, 88884, 88888, 88892, - 88896, 88900, 88904, 88909, 88914, 88918, 88923, 88928, 88932, 88937, - 88942, 88947, 88952, 88957, 0, 0, 0, 0, 0, 88962, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90809, + 90813, 90818, 90823, 0, 90829, 90834, 0, 0, 0, 0, 0, 90839, 90845, 90852, + 90857, 90862, 90866, 90871, 90876, 0, 90881, 90886, 90891, 0, 90896, + 90901, 90906, 90911, 90916, 90921, 90926, 90931, 90936, 90941, 90946, + 90950, 90954, 90959, 90964, 90969, 90973, 90977, 90981, 90986, 90991, + 90996, 91001, 91006, 91011, 91015, 91020, 0, 0, 0, 0, 91025, 91031, + 91036, 0, 0, 0, 0, 91041, 91045, 91049, 91053, 91057, 91061, 91066, + 91071, 91077, 0, 0, 0, 0, 0, 0, 0, 0, 91083, 91089, 91096, 91102, 91109, + 91115, 91121, 91127, 91134, 0, 0, 0, 0, 0, 0, 0, 91140, 91148, 91156, + 91164, 91172, 91180, 91188, 91196, 91204, 91212, 91220, 91228, 91236, + 91244, 91252, 91260, 91268, 91276, 91284, 91292, 91300, 91308, 91316, + 91324, 91332, 91340, 91348, 91356, 91364, 91372, 91379, 91387, 91395, + 91399, 91404, 91409, 91414, 91419, 91424, 91429, 91434, 91438, 91443, + 91447, 91452, 91456, 91461, 91465, 91470, 91475, 91480, 91485, 91490, + 91495, 91500, 91505, 91510, 91515, 91520, 91525, 91530, 91535, 91540, + 91545, 91550, 91555, 91560, 91565, 91570, 91575, 91580, 91585, 91590, + 91595, 91600, 91605, 91610, 91615, 91620, 91625, 91630, 91635, 91640, + 91645, 91650, 91655, 0, 0, 0, 91660, 91665, 91674, 91682, 91691, 91700, + 91711, 91722, 91729, 91736, 91743, 91750, 91757, 91764, 91771, 91778, + 91785, 91792, 91799, 91806, 91813, 91820, 91827, 91834, 91841, 91848, + 91855, 91862, 91869, 0, 0, 91876, 91882, 91888, 91894, 91900, 91907, + 91914, 91922, 91930, 91937, 91944, 91951, 91958, 91965, 91972, 91979, + 91986, 91993, 92000, 92007, 92014, 92021, 92028, 92035, 92042, 92049, + 92056, 0, 0, 0, 0, 0, 92063, 92069, 92075, 92081, 92087, 92094, 92101, + 92109, 92117, 92123, 92129, 92136, 92142, 92148, 92154, 92160, 92167, + 92174, 92181, 92188, 92195, 92202, 92209, 92216, 92223, 92230, 92237, + 92244, 92251, 92258, 92265, 92272, 92279, 92286, 92293, 92300, 92307, + 92314, 92321, 92328, 92335, 92342, 92349, 92356, 92363, 92370, 92377, + 92384, 92391, 92398, 92405, 92412, 92419, 92426, 92433, 92440, 92447, + 92454, 92461, 92468, 92475, 92482, 92489, 92496, 92503, 92510, 92517, + 92524, 92531, 92538, 92545, 92552, 92559, 92566, 92573, 92580, 92587, + 92594, 92601, 92608, 92615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88967, 88970, 88974, 88978, 0, 88983, 88987, 0, - 0, 0, 0, 0, 88991, 88996, 89002, 89006, 89010, 89013, 89017, 89021, 0, - 89025, 89029, 89033, 0, 89037, 89041, 89045, 89049, 89053, 89057, 89061, - 89065, 89069, 89073, 89077, 89080, 89083, 89087, 89091, 89095, 89098, - 89101, 89104, 89108, 89112, 89116, 89120, 89124, 89128, 89131, 89135, 0, - 0, 0, 0, 89139, 89144, 89148, 0, 0, 0, 0, 89152, 89155, 89158, 89161, - 89164, 89167, 89171, 89175, 89180, 0, 0, 0, 0, 0, 0, 0, 0, 89185, 89190, - 89196, 89201, 89207, 89212, 89217, 89222, 89228, 0, 0, 0, 0, 0, 0, 0, - 89233, 89241, 89249, 89257, 89265, 89273, 89281, 89289, 89297, 89305, - 89313, 89321, 89329, 89337, 89345, 89353, 89361, 89369, 89377, 89385, - 89393, 89401, 89409, 89417, 89425, 89433, 89441, 89449, 89457, 89465, - 89472, 89480, 89488, 89492, 89497, 89502, 89507, 89512, 89517, 89522, - 89527, 89531, 89536, 89540, 89545, 89549, 89554, 89558, 89563, 89568, - 89573, 89578, 89583, 89588, 89593, 89598, 89603, 89608, 89613, 89618, - 89623, 89628, 89633, 89638, 89643, 89648, 89653, 89658, 89663, 89668, - 89673, 89678, 89683, 89688, 89693, 89698, 89703, 89708, 89713, 89718, - 89723, 89728, 89733, 89738, 89743, 89748, 0, 0, 0, 89753, 89758, 89767, - 89775, 89784, 89793, 89804, 89815, 89822, 89829, 89836, 89843, 89850, - 89857, 89864, 89871, 89878, 89885, 89892, 89899, 89906, 89913, 89920, - 89927, 89934, 89941, 89948, 89955, 89962, 0, 0, 89969, 89975, 89981, - 89987, 89993, 90000, 90007, 90015, 90023, 90030, 90037, 90044, 90051, - 90058, 90065, 90072, 90079, 90086, 90093, 90100, 90107, 90114, 90121, - 90128, 90135, 90142, 90149, 0, 0, 0, 0, 0, 90156, 90162, 90168, 90174, - 90180, 90187, 90194, 90202, 90210, 90216, 90222, 90229, 90235, 90241, - 90247, 90253, 90260, 90267, 90274, 90281, 90288, 90295, 90302, 90309, - 90316, 90323, 90330, 90337, 90344, 90351, 90358, 90365, 90372, 90379, - 90386, 90393, 90400, 90407, 90414, 90421, 90428, 90435, 90442, 90449, - 90456, 90463, 90470, 90477, 90484, 90491, 90498, 90505, 90512, 90519, - 90526, 90533, 90540, 90547, 90554, 90561, 90568, 90575, 90582, 90589, - 90596, 90603, 90610, 90617, 90624, 90631, 90638, 90645, 90652, 90659, - 90666, 90673, 90680, 90687, 90694, 90701, 90708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92622, 92626, 92630, + 92634, 92638, 92642, 92646, 92650, 92654, 92658, 92663, 92668, 92673, + 92678, 92683, 92688, 92693, 92698, 92703, 92709, 92715, 92721, 92728, + 92735, 92742, 92749, 92756, 92763, 92770, 92777, 92784, 0, 92791, 92795, + 92799, 92803, 92807, 92811, 92814, 92818, 92821, 92825, 92828, 92832, + 92836, 92841, 92845, 92850, 92853, 92857, 92860, 92864, 92867, 92871, + 92875, 92879, 92883, 92887, 92891, 92895, 92899, 92903, 92907, 92911, + 92915, 92919, 92923, 92927, 92931, 92935, 92939, 92942, 92945, 92949, + 92953, 92957, 92960, 92963, 92966, 92970, 92974, 92978, 92982, 92986, + 92989, 92993, 92999, 93005, 93011, 93016, 93023, 93027, 93032, 93036, + 93041, 93046, 93052, 93057, 93063, 93067, 93072, 93076, 93081, 93084, + 93087, 93091, 93096, 93102, 93107, 93113, 0, 0, 0, 0, 93118, 93121, + 93124, 93127, 93130, 93133, 93136, 93139, 93142, 93145, 93149, 93153, + 93157, 93161, 93165, 93169, 93173, 93177, 93181, 93186, 93191, 93195, + 93198, 93201, 93204, 93207, 93210, 93213, 93216, 93219, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93222, 93226, 93230, 93234, 93237, 93241, + 93244, 93248, 93251, 93255, 93258, 93262, 93265, 93269, 93272, 93276, + 93280, 93284, 93288, 93292, 93296, 93300, 93304, 93308, 93312, 93316, + 93320, 93324, 93328, 93332, 93336, 93340, 93344, 93348, 93352, 93355, + 93358, 93362, 93366, 93370, 93373, 93376, 93379, 93383, 93387, 93391, + 93395, 93399, 93402, 93407, 93411, 93416, 93420, 93425, 93429, 93434, + 93438, 93443, 93447, 93451, 93455, 93459, 93462, 93466, 93471, 93474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90715, 90719, 90723, 90727, 90731, 90735, 90739, 90743, 90747, 90751, - 90756, 90761, 90766, 90771, 90776, 90781, 90786, 90791, 90796, 90802, - 90808, 90814, 90821, 90828, 90835, 90842, 90849, 90856, 90863, 90870, - 90877, 0, 90884, 90888, 90892, 90896, 90899, 90903, 90906, 90910, 90913, - 90917, 90920, 90924, 90927, 90931, 90934, 90938, 90942, 90946, 90950, - 90954, 90958, 90962, 90966, 90970, 90974, 90978, 90982, 90986, 90990, - 90994, 90998, 91002, 91006, 91010, 91014, 91017, 91020, 91024, 91028, - 91032, 91035, 91038, 91041, 91045, 91049, 91053, 91057, 91061, 91064, - 91069, 91073, 91078, 91082, 91087, 91091, 91096, 91100, 91105, 91109, - 91113, 91117, 91121, 91124, 91128, 91133, 91136, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93478, 93481, 93486, 93492, 93500, + 93505, 93511, 93519, 93525, 93531, 93535, 93539, 93546, 93555, 93562, + 93571, 93577, 93586, 93593, 93600, 93607, 93617, 93623, 93627, 93634, + 93643, 93653, 93660, 93667, 93671, 93675, 93682, 93692, 93696, 93703, + 93710, 93717, 93723, 93730, 93737, 93744, 93751, 93755, 93759, 93763, + 93770, 93774, 93781, 93788, 93802, 93811, 93815, 93819, 93823, 93830, + 93834, 93838, 93842, 93850, 93858, 93877, 93887, 93907, 93911, 93915, + 93919, 93923, 93927, 93931, 93935, 93942, 93946, 93949, 93953, 93957, + 93963, 93970, 93979, 93983, 93992, 94001, 94009, 94013, 94020, 94024, + 94028, 94032, 94036, 94047, 94056, 94065, 94074, 94083, 94095, 94104, + 94113, 94122, 94130, 94139, 94151, 94160, 94169, 94178, 94190, 94199, + 94208, 94220, 94229, 94238, 94250, 94259, 94263, 94267, 94271, 94275, + 94279, 94283, 94287, 94294, 94298, 94302, 94313, 94317, 94321, 94328, + 94334, 94340, 94344, 94351, 94355, 94359, 94363, 94367, 94371, 94375, + 94381, 94389, 94393, 94397, 94400, 94406, 94416, 94420, 94432, 94439, + 94446, 94453, 94460, 94466, 94470, 94474, 94478, 94482, 94489, 94498, + 94505, 94513, 94521, 94527, 94531, 94535, 94539, 94543, 94549, 94558, + 94570, 94577, 94584, 94593, 94604, 94610, 94619, 94628, 94635, 94644, + 94651, 94658, 94668, 94675, 94682, 94689, 94696, 94700, 94706, 94710, + 94721, 94729, 94738, 94750, 94757, 94764, 94774, 94781, 94790, 94797, + 94806, 94813, 94820, 94830, 94837, 94844, 94854, 94861, 94873, 94882, + 94889, 94896, 94903, 94912, 94922, 94935, 94942, 94952, 94962, 94969, + 94978, 94991, 94998, 95005, 95012, 95022, 95032, 95039, 95049, 95056, + 95063, 95073, 95079, 95086, 95093, 95100, 95110, 95117, 95124, 95131, + 95137, 95144, 95154, 95161, 95165, 95173, 95177, 95189, 95193, 95207, + 95211, 95215, 95219, 95223, 95229, 95236, 95244, 95248, 95252, 95256, + 95260, 95267, 95271, 95277, 95283, 95291, 95295, 95302, 95310, 95314, + 95318, 95324, 95328, 95337, 95346, 95353, 95363, 95369, 95373, 95377, + 95385, 95392, 95399, 95405, 95409, 95417, 95421, 95428, 95440, 95447, + 95457, 95463, 95467, 95476, 95483, 95492, 95496, 95500, 95507, 95511, + 95515, 95519, 95523, 95526, 95532, 95538, 95542, 95546, 95553, 95560, + 95567, 95574, 95581, 95588, 95595, 95602, 95608, 95612, 95616, 95623, + 95630, 95637, 95644, 95651, 95655, 95658, 95663, 95667, 95671, 95680, + 95689, 95693, 95697, 95703, 95709, 95726, 95732, 95736, 95745, 95749, + 95753, 95760, 95768, 95776, 95782, 95786, 95790, 95794, 95798, 95801, + 95807, 95814, 95824, 95831, 95838, 95845, 95851, 95858, 95865, 95872, + 95879, 95886, 95895, 95902, 95914, 95921, 95928, 95938, 95949, 95956, + 95963, 95970, 95977, 95984, 95991, 95998, 96005, 96012, 96019, 96029, + 96039, 96049, 96056, 96066, 96073, 96080, 96087, 96094, 96101, 96108, + 96115, 96122, 96129, 96136, 96143, 96150, 96157, 96163, 96170, 96177, + 96186, 96193, 96200, 96204, 96212, 96216, 96220, 96224, 96228, 96232, + 96239, 96243, 96252, 96256, 96263, 96271, 96275, 96279, 96283, 96296, + 96312, 96316, 96320, 96327, 96333, 96340, 96344, 96348, 96352, 96356, + 96360, 96367, 96371, 96389, 96393, 96397, 96404, 96408, 96412, 96418, + 96422, 96426, 96434, 96438, 96442, 96446, 96450, 96456, 96467, 96476, + 96485, 96492, 96499, 96510, 96517, 96524, 96531, 96538, 96545, 96552, + 96559, 96569, 96575, 96582, 96592, 96601, 96608, 96617, 96627, 96634, + 96641, 96648, 96655, 96667, 96674, 96681, 96688, 96695, 96702, 96712, + 96719, 96726, 96736, 96749, 96761, 96768, 96778, 96785, 96792, 96799, + 96813, 96819, 96827, 96837, 96847, 96854, 96861, 96867, 96871, 96878, + 96888, 96894, 96907, 96911, 96915, 96922, 96926, 96933, 96943, 96947, + 96951, 96955, 96959, 96963, 96970, 96974, 96981, 96988, 96995, 97004, + 97013, 97023, 97030, 97037, 97044, 97054, 97061, 97071, 97078, 97088, + 97095, 97102, 97112, 97122, 97129, 97135, 97143, 97151, 97157, 97163, + 97167, 97171, 97178, 97186, 97192, 97196, 97200, 97204, 97211, 97223, + 97226, 97233, 97239, 97243, 97247, 97251, 97255, 97259, 97263, 97267, + 97271, 97275, 97279, 97286, 97290, 97296, 97300, 97304, 97308, 97314, + 97321, 97328, 97335, 97346, 97354, 97358, 97364, 97373, 97380, 97386, + 97389, 97393, 97397, 97403, 97412, 97420, 97424, 97430, 97434, 97438, + 97442, 97448, 97455, 97461, 97465, 97471, 97475, 97479, 97488, 97500, + 97504, 97511, 97518, 97528, 97535, 97547, 97554, 97561, 97568, 97579, + 97589, 97602, 97612, 97619, 97623, 97627, 97631, 97635, 97644, 97653, + 97662, 97679, 97688, 97694, 97701, 97709, 97722, 97726, 97735, 97744, + 97753, 97762, 97773, 97782, 97791, 97800, 97809, 97818, 97827, 97837, + 97840, 97844, 97848, 97852, 97856, 97860, 97866, 97873, 97880, 97887, + 97893, 97899, 97906, 97912, 97919, 97927, 97931, 97938, 97945, 97952, + 97960, 97963, 97967, 97971, 97975, 97979, 97985, 97989, 97995, 98002, + 98009, 98015, 98022, 98029, 98036, 98043, 98050, 98057, 98064, 98071, + 98078, 98085, 98092, 98099, 98106, 98113, 98119, 98123, 98132, 98136, + 98140, 98144, 98148, 98154, 98161, 98168, 98175, 98182, 98189, 98195, + 98203, 98207, 98211, 98215, 98219, 98225, 98242, 98259, 98263, 98267, + 98271, 98275, 98279, 98283, 98289, 98296, 98300, 98306, 98313, 98320, + 98327, 98334, 98341, 98350, 98357, 98364, 98371, 98378, 98382, 98386, + 98392, 98404, 98408, 98412, 98421, 98425, 98429, 98433, 98439, 98443, + 98447, 98456, 98460, 98464, 98468, 98475, 98479, 98483, 98487, 98491, + 98495, 98499, 98503, 98507, 98513, 98520, 98527, 98533, 98537, 98554, + 98560, 98564, 98570, 98576, 98582, 98588, 98594, 98600, 98604, 98608, + 98612, 98618, 98622, 98628, 98632, 98636, 98643, 98650, 98667, 98671, + 98675, 98679, 98683, 98687, 98699, 98702, 98707, 98712, 98727, 98737, + 98749, 98753, 98757, 98761, 98767, 98774, 98781, 98791, 98803, 98809, + 98815, 98824, 98828, 98832, 98839, 98849, 98856, 98862, 98866, 98870, + 98877, 98883, 98887, 98893, 98897, 98905, 98911, 98915, 98923, 98931, + 98938, 98944, 98951, 98958, 98968, 98978, 98982, 98986, 98990, 98994, + 99000, 99007, 99013, 99020, 99027, 99034, 99043, 99050, 99057, 99063, + 99070, 99077, 99084, 99091, 99098, 99105, 99111, 99118, 99125, 99132, + 99141, 99148, 99155, 99159, 99165, 99169, 99175, 99182, 99189, 99196, + 99200, 99204, 99208, 99212, 99216, 99223, 99227, 99231, 99237, 99245, + 99249, 99253, 99257, 99261, 99268, 99272, 99276, 99284, 99288, 99292, + 99296, 99300, 99306, 99310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 99314, 99320, 99326, 99333, 99340, 99347, 99354, 99361, 99368, + 99374, 99381, 99388, 99395, 99402, 99409, 99416, 99422, 99428, 99434, + 99440, 99446, 99452, 99458, 99464, 99470, 99477, 99484, 99491, 99498, + 99505, 99512, 99518, 99524, 99530, 99537, 99544, 99550, 99556, 99565, + 99572, 99579, 99586, 99593, 99600, 99607, 99613, 99619, 99625, 99634, + 99641, 99648, 99659, 99670, 99676, 99682, 99688, 99697, 99704, 99711, + 99721, 99731, 99742, 99753, 99765, 99778, 99789, 99800, 99812, 99825, + 99836, 99847, 99858, 99869, 99880, 99892, 99900, 99908, 99917, 99926, + 99935, 99941, 99947, 99953, 99960, 99970, 99977, 99987, 99992, 99997, + 100003, 100009, 100017, 100025, 100034, 100045, 100056, 100064, 100072, + 100081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100090, 100101, 100108, + 100116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100124, 100128, 100132, + 100136, 100140, 100144, 100148, 100152, 100156, 100160, 100164, 100168, + 100172, 100176, 100180, 100184, 100188, 100192, 100196, 100200, 100204, + 100208, 100212, 100216, 100220, 100224, 100228, 100232, 100236, 100240, + 100244, 100248, 100252, 100256, 100260, 100264, 100268, 100272, 100276, + 100280, 100284, 100288, 100292, 100296, 100300, 100304, 100308, 100312, + 100316, 100320, 100324, 100328, 100332, 100336, 100340, 100344, 100348, + 100352, 100356, 100360, 100364, 100368, 100372, 100376, 100380, 100384, + 100388, 100392, 100396, 100400, 100404, 100408, 100412, 100416, 100420, + 100424, 100428, 100432, 100436, 100440, 100444, 100448, 100452, 100456, + 100460, 100464, 100468, 100472, 100476, 100480, 100484, 100488, 100492, + 100496, 100500, 100504, 100508, 100512, 100516, 100520, 100524, 100528, + 100532, 100536, 100540, 100544, 100548, 100552, 100556, 100560, 100564, + 100568, 100572, 100576, 100580, 100584, 100588, 100592, 100596, 100600, + 100604, 100608, 100612, 100616, 100620, 100624, 100628, 100632, 100636, + 100640, 100644, 100648, 100652, 100656, 100660, 100664, 100668, 100672, + 100676, 100680, 100684, 100688, 100692, 100696, 100700, 100704, 100708, + 100712, 100716, 100720, 100724, 100728, 100732, 100736, 100740, 100744, + 100748, 100752, 100756, 100760, 100764, 100768, 100772, 100776, 100780, + 100784, 100788, 100792, 100796, 100800, 100804, 100808, 100812, 100816, + 100820, 100824, 100828, 100832, 100836, 100840, 100844, 100848, 100852, + 100856, 100860, 100864, 100868, 100872, 100876, 100880, 100884, 100888, + 100892, 100896, 100900, 100904, 100908, 100912, 100916, 100920, 100924, + 100928, 100932, 100936, 100940, 100944, 100948, 100952, 100956, 100960, + 100964, 100968, 100972, 100976, 100980, 100984, 100988, 100992, 100996, + 101000, 101004, 101008, 101012, 101016, 101020, 101024, 101028, 101032, + 101036, 101040, 101044, 101048, 101052, 101056, 101060, 101064, 101068, + 101072, 101076, 101080, 101084, 101088, 101092, 101096, 101100, 101104, + 101108, 101112, 101116, 101120, 101124, 101128, 101132, 101136, 101140, + 101144, 101148, 101152, 101156, 101160, 101164, 101168, 101172, 101176, + 101180, 101184, 101188, 101192, 101196, 101200, 101204, 101208, 101212, + 101216, 101220, 101224, 101228, 101232, 101236, 101240, 101244, 101248, + 101252, 101256, 101260, 101264, 101268, 101272, 101276, 101280, 101284, + 101288, 101292, 101296, 101300, 101304, 101308, 101312, 101316, 101320, + 101324, 101328, 101332, 101336, 101340, 101344, 101348, 101352, 101356, + 101360, 101364, 101368, 101372, 101376, 101380, 101384, 101388, 101392, + 101396, 101400, 101404, 101408, 101412, 101416, 101420, 101424, 101428, + 101432, 101436, 101440, 101444, 101448, 101452, 101456, 101460, 101464, + 101468, 101472, 101476, 101480, 101484, 101488, 101492, 101496, 101500, + 101504, 101508, 101512, 101516, 101520, 101524, 101528, 101532, 101536, + 101540, 101544, 101548, 101552, 101556, 101560, 101564, 101568, 101572, + 101576, 101580, 101584, 101588, 101592, 101596, 101600, 101604, 101608, + 101612, 101616, 101620, 101624, 101628, 101632, 101636, 101640, 101644, + 101648, 101652, 101656, 101660, 101664, 101668, 101672, 101676, 101680, + 101684, 101688, 101692, 101696, 101700, 101704, 101708, 101712, 101716, + 101720, 101724, 101728, 101732, 101736, 101740, 101744, 101748, 101752, + 101756, 101760, 101764, 101768, 101772, 101776, 101780, 101784, 101788, + 101792, 101796, 101800, 101804, 101808, 101812, 101816, 101820, 101824, + 101828, 101832, 101836, 101840, 101844, 101848, 101852, 101856, 101860, + 101864, 101868, 101872, 101876, 101880, 101884, 101888, 101892, 101896, + 101900, 101904, 101908, 101912, 101916, 101920, 101924, 101928, 101932, + 101936, 101940, 101944, 101948, 101952, 101956, 101960, 101964, 101968, + 101972, 101976, 101980, 101984, 101988, 101992, 101996, 102000, 102004, + 102008, 102012, 102016, 102020, 102024, 102028, 102032, 102036, 102040, + 102044, 102048, 102052, 102056, 102060, 102064, 102068, 102072, 102076, + 102080, 102084, 102088, 102092, 102096, 102100, 102104, 102108, 102112, + 102116, 102120, 102124, 102128, 102132, 102136, 102140, 102144, 102148, + 102152, 102156, 102160, 102164, 102168, 102172, 102176, 102180, 102184, + 102188, 102192, 102196, 102200, 102204, 102208, 102212, 102216, 102220, + 102224, 102228, 102232, 102236, 102240, 102244, 102248, 102252, 102256, + 102260, 102264, 102268, 102272, 102276, 102280, 102284, 102288, 102292, + 102296, 102300, 102304, 102308, 102312, 102316, 102320, 102324, 102328, + 102332, 102336, 102340, 102344, 102348, 102352, 102356, 102360, 102364, + 102368, 102372, 102376, 102380, 102384, 102388, 102392, 102396, 102400, + 102404, 102408, 102412, 102416, 102420, 102424, 102428, 102432, 102436, + 102440, 102444, 102448, 102452, 102456, 102460, 102464, 102468, 102472, + 102476, 102480, 102484, 102488, 102492, 102496, 102500, 102504, 102508, + 102512, 102516, 102520, 102524, 102528, 102532, 102536, 102540, 102544, + 102548, 102552, 102556, 102560, 102564, 102568, 102572, 102576, 102580, + 102584, 102588, 102592, 102596, 102600, 102604, 102608, 102612, 102616, + 102620, 102624, 102628, 102632, 102636, 102640, 102644, 102648, 102652, + 102656, 102660, 102664, 102668, 102672, 102676, 102680, 102684, 102688, + 102692, 102696, 102700, 102704, 102708, 102712, 102716, 102720, 102724, + 102728, 102732, 102736, 102740, 102744, 102748, 102752, 102756, 102760, + 102764, 102768, 102772, 102776, 102780, 102784, 102788, 102792, 102796, + 102800, 102804, 102808, 102812, 102816, 102820, 102824, 102828, 102832, + 102836, 102840, 102844, 102848, 102852, 102856, 102860, 102864, 102868, + 102872, 102876, 102880, 102884, 102888, 102892, 102896, 102900, 102904, + 102908, 102912, 102916, 102920, 102924, 102928, 102932, 102936, 102940, + 102944, 102948, 102952, 102956, 102960, 102964, 102968, 102972, 102976, + 102980, 102984, 102988, 102992, 102996, 103000, 103004, 103008, 103012, + 103016, 103020, 103024, 103028, 103032, 103036, 103040, 103044, 103048, + 103052, 103056, 103060, 103064, 103068, 103072, 103076, 103080, 103084, + 103088, 103092, 103096, 103100, 103104, 103108, 103112, 103116, 103120, + 103124, 103128, 103132, 103136, 103140, 103144, 103148, 103152, 103156, + 103160, 103164, 103168, 103172, 103176, 103180, 103184, 103188, 103192, + 103196, 103200, 103204, 103208, 103212, 103216, 103220, 103224, 103228, + 103232, 103236, 103240, 103244, 103248, 103252, 103256, 103260, 103264, + 103268, 103272, 103276, 103280, 103284, 103288, 103292, 103296, 103300, + 103304, 103308, 103312, 103316, 103320, 103324, 103328, 103332, 103336, + 103340, 103344, 103348, 103352, 103356, 103360, 103364, 103368, 103372, + 103376, 103380, 103384, 103388, 103392, 103396, 103400, 103404, 103408, + 103412, 103416, 103420, 103424, 103428, 103432, 103436, 103440, 103444, + 103448, 103452, 103456, 103460, 103464, 103468, 103472, 103476, 103480, + 103484, 103488, 103492, 103496, 103500, 103504, 103508, 103512, 103516, + 103520, 103524, 103528, 103532, 103536, 103540, 103544, 103548, 103552, + 103556, 103560, 103564, 103568, 103572, 103576, 103580, 103584, 103588, + 103592, 103596, 103600, 103604, 103608, 103612, 103616, 103620, 103624, + 103628, 103632, 103636, 103640, 103644, 103648, 103652, 103656, 103660, + 103664, 103668, 103672, 103676, 103680, 103684, 103688, 103692, 103696, + 103700, 103704, 103708, 103712, 103716, 103720, 103724, 103728, 103732, + 103736, 103740, 103744, 103748, 103752, 103756, 103760, 103764, 103768, + 103772, 103776, 103780, 103784, 103788, 103792, 103796, 103800, 103804, + 103808, 103812, 103816, 103820, 103824, 103828, 103832, 103836, 103840, + 103844, 103848, 103852, 103856, 103860, 103864, 103868, 103872, 103876, + 103880, 103884, 103888, 103892, 103896, 103900, 103904, 103908, 103912, + 103916, 103920, 103924, 103928, 103932, 103936, 103940, 103944, 103948, + 103952, 103956, 103960, 103964, 103968, 103972, 103976, 103980, 103984, + 103988, 103992, 103996, 104000, 104004, 104008, 104012, 104016, 104020, + 104024, 104028, 104032, 104036, 104040, 104044, 104048, 104052, 104056, + 104060, 104064, 104068, 104072, 104076, 104080, 104084, 104088, 104092, + 104096, 104100, 104104, 104108, 104112, 104116, 104120, 104124, 104128, + 104132, 104136, 104140, 104144, 104148, 104152, 104156, 104160, 104164, + 104168, 104172, 104176, 104180, 104184, 104188, 104192, 104196, 104200, + 104204, 104208, 104212, 104216, 104220, 104224, 104228, 104232, 104236, + 104240, 104244, 104248, 104252, 104256, 104260, 104264, 104268, 104272, + 104276, 104280, 104284, 104288, 104292, 104296, 104300, 104304, 104308, + 104312, 104316, 104320, 104324, 104328, 104332, 104336, 104340, 104344, + 104348, 104352, 104356, 104360, 104364, 104368, 104372, 104376, 104380, + 104384, 104388, 104392, 104396, 104400, 104404, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 104408, 104415, 104422, 104431, 104440, 104447, 104452, 104459, + 104466, 104475, 104486, 104497, 104502, 104509, 104514, 104519, 104524, + 104529, 104534, 104539, 104544, 104549, 104554, 104559, 104564, 104571, + 104578, 104583, 104588, 104593, 104598, 104605, 104612, 104620, 104625, + 104632, 104637, 104642, 104647, 104652, 104657, 104664, 104671, 104676, + 104681, 104686, 104691, 104696, 104701, 104706, 104711, 104716, 104721, + 104726, 104731, 104736, 104741, 104746, 104751, 104756, 104761, 104766, + 104773, 104778, 104783, 104792, 104799, 104804, 104809, 104814, 104819, + 104824, 104829, 104834, 104839, 104844, 104849, 104854, 104859, 104864, + 104869, 104874, 104879, 104884, 104889, 104894, 104899, 104904, 104910, + 104918, 104924, 104932, 104940, 104948, 104954, 104960, 104966, 104972, + 104978, 104986, 104996, 105004, 105012, 105018, 105024, 105032, 105040, + 105046, 105054, 105062, 105070, 105076, 105082, 105088, 105094, 105100, + 105106, 105114, 105122, 105128, 105134, 105140, 105146, 105152, 105160, + 105166, 105172, 105178, 105184, 105190, 105196, 105204, 105210, 105216, + 105222, 105228, 105236, 105244, 105250, 105256, 105262, 105267, 105273, + 105279, 105286, 105291, 105296, 105301, 105306, 105311, 105316, 105321, + 105326, 105331, 105340, 105347, 105352, 105357, 105362, 105369, 105374, + 105379, 105384, 105391, 105396, 105401, 105406, 105411, 105416, 105421, + 105426, 105431, 105436, 105441, 105446, 105453, 105458, 105465, 105470, + 105475, 105482, 105487, 105492, 105497, 105502, 105507, 105512, 105517, + 105522, 105527, 105532, 105537, 105542, 105547, 105552, 105557, 105562, + 105567, 105572, 105577, 105584, 105589, 105594, 105599, 105604, 105609, + 105614, 105619, 105624, 105629, 105634, 105639, 105644, 105649, 105656, + 105661, 105666, 105673, 105678, 105683, 105688, 105693, 105698, 105703, + 105708, 105713, 105718, 105723, 105730, 105735, 105740, 105745, 105750, + 105755, 105762, 105769, 105774, 105779, 105784, 105789, 105794, 105799, + 105804, 105809, 105814, 105819, 105824, 105829, 105834, 105839, 105844, + 105849, 105854, 105859, 105864, 105869, 105874, 105879, 105884, 105889, + 105894, 105899, 105904, 105909, 105914, 105919, 105924, 105929, 105934, + 105939, 105944, 105949, 105956, 105961, 105966, 105971, 105976, 105981, + 105986, 105991, 105996, 106001, 106006, 106011, 106016, 106021, 106026, + 106031, 106036, 106041, 106046, 106051, 106056, 106061, 106066, 106071, + 106076, 106081, 106086, 106091, 106096, 106101, 106106, 106111, 106116, + 106121, 106126, 106131, 106136, 106141, 106146, 106151, 106156, 106161, + 106166, 106171, 106176, 106181, 106186, 106191, 106196, 106201, 106206, + 106211, 106216, 106221, 106226, 106231, 106236, 106241, 106246, 106253, + 106258, 106263, 106268, 106273, 106278, 106283, 106287, 106292, 106297, + 106302, 106307, 106312, 106317, 106322, 106327, 106332, 106337, 106342, + 106347, 106352, 106357, 106364, 106369, 106374, 106380, 106385, 106390, + 106395, 106400, 106405, 106410, 106415, 106420, 106425, 106430, 106435, + 106440, 106445, 106450, 106455, 106460, 106465, 106470, 106475, 106480, + 106485, 106490, 106495, 106500, 106505, 106510, 106515, 106520, 106525, + 106530, 106535, 106540, 106545, 106550, 106555, 106560, 106565, 106570, + 106575, 106580, 106585, 106590, 106595, 106602, 106607, 106612, 106619, + 106626, 106631, 106636, 106641, 106646, 106651, 106656, 106661, 106666, + 106671, 106676, 106681, 106686, 106691, 106696, 106701, 106706, 106711, + 106716, 106721, 106726, 106731, 106736, 106741, 106746, 106751, 106758, + 106763, 106768, 106773, 106778, 106783, 106788, 106793, 106798, 106803, + 106808, 106813, 106818, 106823, 106828, 106833, 106838, 106843, 106848, + 106855, 106860, 106865, 106870, 106875, 106880, 106885, 106890, 106896, + 106901, 106906, 106911, 106916, 106921, 106926, 106931, 106936, 106943, + 106950, 106955, 106960, 106964, 106969, 106973, 106977, 106982, 106989, + 106994, 106999, 107008, 107013, 107018, 107023, 107028, 107035, 107042, + 107047, 107052, 107057, 107062, 107069, 107074, 107079, 107084, 107089, + 107094, 107099, 107104, 107109, 107114, 107119, 107124, 107129, 107136, + 107140, 107145, 107150, 107155, 107160, 107164, 107169, 107174, 107179, + 107184, 107189, 107194, 107199, 107204, 107209, 107215, 107221, 107227, + 107233, 107239, 107245, 107251, 107257, 107263, 107269, 107275, 107281, + 107286, 107292, 107298, 107304, 107310, 107316, 107322, 107328, 107334, + 107340, 107346, 107352, 107357, 107363, 107369, 107375, 107381, 107387, + 107393, 107399, 107405, 107411, 107417, 107423, 107429, 107435, 107441, + 107447, 107453, 107459, 107465, 107471, 107477, 107482, 107488, 107494, + 107500, 107506, 107512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 107518, 107523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 91140, 91143, 91148, 91154, 91162, 91167, 91173, 91181, - 91187, 91193, 91197, 91201, 91208, 91217, 91224, 91233, 91239, 91248, - 91255, 91262, 91269, 91279, 91285, 91289, 91296, 91305, 91315, 91322, - 91329, 91333, 91337, 91344, 91354, 91358, 91365, 91372, 91379, 91385, - 91392, 91399, 91406, 91413, 91417, 91421, 91425, 91432, 91436, 91443, - 91450, 91464, 91473, 91477, 91481, 91485, 91492, 91496, 91500, 91504, - 91512, 91520, 91539, 91549, 91569, 91573, 91577, 91581, 91585, 91589, - 91593, 91597, 91604, 91608, 91611, 91615, 91619, 91625, 91632, 91641, - 91645, 91654, 91663, 91671, 91675, 91682, 91686, 91690, 91694, 91698, - 91709, 91718, 91727, 91736, 91745, 91757, 91766, 91775, 91784, 91792, - 91801, 91813, 91822, 91831, 91840, 91852, 91861, 91870, 91882, 91891, - 91900, 91912, 91921, 91925, 91929, 91933, 91937, 91941, 91945, 91949, - 91956, 91960, 91964, 91975, 91979, 91983, 91990, 91996, 92002, 92006, - 92013, 92017, 92021, 92025, 92029, 92033, 92037, 92043, 92051, 92055, - 92059, 92062, 92068, 92078, 92082, 92094, 92101, 92108, 92115, 92122, - 92128, 92132, 92136, 92140, 92144, 92151, 92160, 92167, 92175, 92183, - 92189, 92193, 92197, 92201, 92205, 92211, 92220, 92232, 92239, 92246, - 92255, 92266, 92272, 92281, 92290, 92297, 92306, 92313, 92320, 92330, - 92337, 92344, 92351, 92358, 92362, 92368, 92372, 92383, 92391, 92400, - 92412, 92419, 92426, 92436, 92443, 92452, 92459, 92468, 92475, 92482, - 92492, 92499, 92506, 92516, 92523, 92535, 92544, 92551, 92558, 92565, - 92574, 92584, 92597, 92604, 92614, 92624, 92631, 92640, 92653, 92660, - 92667, 92674, 92684, 92694, 92701, 92711, 92718, 92725, 92735, 92741, - 92748, 92755, 92762, 92772, 92779, 92786, 92793, 92799, 92806, 92816, - 92823, 92827, 92835, 92839, 92851, 92855, 92869, 92873, 92877, 92881, - 92885, 92891, 92898, 92906, 92910, 92914, 92918, 92922, 92929, 92933, - 92939, 92945, 92953, 92957, 92964, 92972, 92976, 92980, 92986, 92990, - 92999, 93008, 93015, 93025, 93031, 93035, 93039, 93047, 93054, 93061, - 93067, 93071, 93079, 93083, 93090, 93102, 93109, 93119, 93125, 93129, - 93138, 93145, 93154, 93158, 93162, 93169, 93173, 93177, 93181, 93185, - 93188, 93194, 93200, 93204, 93208, 93215, 93222, 93229, 93236, 93243, - 93250, 93257, 93264, 93270, 93274, 93278, 93285, 93292, 93299, 93306, - 93313, 93317, 93320, 93325, 93329, 93333, 93342, 93351, 93355, 93359, - 93365, 93371, 93388, 93394, 93398, 93407, 93411, 93415, 93422, 93430, - 93438, 93444, 93448, 93452, 93456, 93460, 93463, 93468, 93474, 93483, - 93489, 93495, 93501, 93506, 93512, 93518, 93524, 93530, 93536, 93544, - 93550, 93561, 93567, 93573, 93582, 93592, 93598, 93604, 93610, 93616, - 93622, 93628, 93634, 93640, 93646, 93652, 93661, 93670, 93679, 93685, - 93694, 93700, 93706, 93712, 93718, 93724, 93730, 93736, 93742, 93748, - 93754, 93760, 93766, 93772, 93777, 93783, 93789, 93797, 93803, 93809, - 93813, 93821, 93825, 93829, 93833, 93837, 93841, 93848, 93852, 93861, - 93865, 93872, 93880, 93884, 93888, 93892, 93905, 93921, 93925, 93929, - 93936, 93942, 93949, 93953, 93957, 93961, 93965, 93969, 93976, 93980, - 93998, 94002, 94006, 94013, 94017, 94021, 94027, 94031, 94035, 94043, - 94047, 94051, 94055, 94059, 94065, 94076, 94085, 94094, 94101, 94108, - 94119, 94126, 94133, 94140, 94147, 94154, 94161, 94168, 94178, 94184, - 94191, 94201, 94210, 94217, 94226, 94236, 94243, 94250, 94257, 94264, - 94276, 94283, 94290, 94297, 94304, 94311, 94321, 94328, 94335, 94345, - 94358, 94370, 94377, 94387, 94394, 94401, 94408, 94422, 94428, 94436, - 94446, 94456, 94463, 94470, 94476, 94480, 94487, 94497, 94503, 94516, - 94520, 94524, 94531, 94535, 94542, 94552, 94556, 94560, 94564, 94568, - 94572, 94579, 94583, 94590, 94597, 94604, 94613, 94622, 94632, 94639, - 94646, 94653, 94663, 94670, 94680, 94687, 94697, 94704, 94711, 94721, - 94731, 94738, 94744, 94752, 94760, 94766, 94772, 94776, 94780, 94787, - 94795, 94801, 94805, 94809, 94813, 94820, 94832, 94835, 94842, 94848, - 94852, 94856, 94860, 94864, 94868, 94872, 94876, 94880, 94884, 94888, - 94895, 94899, 94905, 94909, 94913, 94917, 94923, 94930, 94937, 94944, - 94955, 94963, 94967, 94973, 94982, 94989, 94995, 94998, 95002, 95006, - 95012, 95021, 95029, 95033, 95039, 95043, 95047, 95051, 95057, 95064, - 95070, 95074, 95080, 95084, 95088, 95097, 95109, 95113, 95120, 95127, - 95137, 95144, 95156, 95163, 95170, 95177, 95188, 95198, 95211, 95221, - 95228, 95232, 95236, 95240, 95244, 95253, 95262, 95271, 95288, 95297, - 95303, 95310, 95318, 95331, 95335, 95344, 95353, 95362, 95371, 95382, - 95391, 95400, 95409, 95418, 95427, 95436, 95446, 95449, 95453, 95457, - 95461, 95465, 95469, 95475, 95482, 95489, 95496, 95502, 95508, 95515, - 95521, 95528, 95536, 95540, 95547, 95554, 95561, 95569, 95572, 95576, - 95580, 95584, 95588, 95594, 95598, 95604, 95611, 95618, 95624, 95631, - 95638, 95645, 95652, 95659, 95666, 95673, 95680, 95687, 95694, 95701, - 95708, 95715, 95722, 95728, 95732, 95741, 95745, 95749, 95753, 95757, - 95763, 95770, 95777, 95784, 95791, 95798, 95804, 95812, 95816, 95820, - 95824, 95828, 95834, 95851, 95868, 95872, 95876, 95880, 95884, 95888, - 95892, 95898, 95905, 95909, 95915, 95922, 95929, 95936, 95943, 95950, - 95959, 95966, 95973, 95980, 95987, 95991, 95995, 96001, 96013, 96017, - 96021, 96030, 96034, 96038, 96042, 96048, 96052, 96056, 96065, 96069, - 96073, 96077, 96084, 96088, 96092, 96096, 96100, 96104, 96108, 96112, - 96116, 96122, 96129, 96136, 96142, 96146, 96163, 96169, 96173, 96179, - 96185, 96191, 96197, 96203, 96209, 96213, 96217, 96221, 96227, 96231, - 96237, 96241, 96245, 96252, 96259, 96276, 96280, 96284, 96288, 96292, - 96296, 96308, 96311, 96316, 96321, 96336, 96346, 96357, 96361, 96365, - 96369, 96375, 96382, 96389, 96399, 96411, 96417, 96423, 96432, 96436, - 96440, 96447, 96457, 96464, 96470, 96474, 96478, 96485, 96491, 96495, - 96501, 96505, 96513, 96519, 96523, 96531, 96539, 96546, 96552, 96559, - 96566, 96576, 96586, 96590, 96594, 96598, 96602, 96608, 96615, 96621, - 96628, 96635, 96642, 96651, 96658, 96665, 96671, 96678, 96685, 96692, - 96699, 96706, 96713, 96719, 96726, 96733, 96740, 96749, 96756, 96763, - 96767, 96773, 96777, 96783, 96790, 96797, 96804, 96808, 96812, 96816, - 96820, 96824, 96831, 96835, 96839, 96845, 96853, 96857, 96861, 96865, - 96869, 96876, 96880, 96884, 96892, 96896, 96900, 96904, 96908, 96914, - 96918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96922, 96928, - 96934, 96941, 96948, 96955, 96962, 96969, 96976, 96982, 96989, 96996, - 97003, 97010, 97017, 97024, 97030, 97036, 97042, 97048, 97054, 97060, - 97066, 97072, 97078, 97085, 97092, 97099, 97106, 97113, 97120, 97126, - 97132, 97138, 97145, 97152, 97158, 97164, 97173, 97180, 97187, 97194, - 97201, 97208, 97215, 97221, 97227, 97233, 97242, 97249, 97256, 97267, - 97278, 97284, 97290, 97296, 97305, 97312, 97319, 97329, 97339, 97350, - 97361, 97373, 97386, 97397, 97408, 97420, 97433, 97444, 97455, 97466, - 97477, 97488, 97500, 97508, 97516, 97525, 97534, 97543, 97549, 97555, - 97561, 97568, 97578, 97585, 97595, 97600, 97605, 97611, 97617, 97625, - 97633, 97642, 97653, 97664, 97672, 97680, 97689, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 97698, 97709, 97716, 97724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 97732, 97736, 97740, 97744, 97748, 97752, 97756, 97760, 97764, - 97768, 97772, 97776, 97780, 97784, 97788, 97792, 97796, 97800, 97804, - 97808, 97812, 97816, 97820, 97824, 97828, 97832, 97836, 97840, 97844, - 97848, 97852, 97856, 97860, 97864, 97868, 97872, 97876, 97880, 97884, - 97888, 97892, 97896, 97900, 97904, 97908, 97912, 97916, 97920, 97924, - 97928, 97932, 97936, 97940, 97944, 97948, 97952, 97956, 97960, 97964, - 97968, 97972, 97976, 97980, 97984, 97988, 97992, 97996, 98000, 98004, - 98008, 98012, 98016, 98020, 98024, 98028, 98032, 98036, 98040, 98044, - 98048, 98052, 98056, 98060, 98064, 98068, 98072, 98076, 98080, 98084, - 98088, 98092, 98096, 98100, 98104, 98108, 98112, 98116, 98120, 98124, - 98128, 98132, 98136, 98140, 98144, 98148, 98152, 98156, 98160, 98164, - 98168, 98172, 98176, 98180, 98184, 98188, 98192, 98196, 98200, 98204, - 98208, 98212, 98216, 98220, 98224, 98228, 98232, 98236, 98240, 98244, - 98248, 98252, 98256, 98260, 98264, 98268, 98272, 98276, 98280, 98284, - 98288, 98292, 98296, 98300, 98304, 98308, 98312, 98316, 98320, 98324, - 98328, 98332, 98336, 98340, 98344, 98348, 98352, 98356, 98360, 98364, - 98368, 98372, 98376, 98380, 98384, 98388, 98392, 98396, 98400, 98404, - 98408, 98412, 98416, 98420, 98424, 98428, 98432, 98436, 98440, 98444, - 98448, 98452, 98456, 98460, 98464, 98468, 98472, 98476, 98480, 98484, - 98488, 98492, 98496, 98500, 98504, 98508, 98512, 98516, 98520, 98524, - 98528, 98532, 98536, 98540, 98544, 98548, 98552, 98556, 98560, 98564, - 98568, 98572, 98576, 98580, 98584, 98588, 98592, 98596, 98600, 98604, - 98608, 98612, 98616, 98620, 98624, 98628, 98632, 98636, 98640, 98644, - 98648, 98652, 98656, 98660, 98664, 98668, 98672, 98676, 98680, 98684, - 98688, 98692, 98696, 98700, 98704, 98708, 98712, 98716, 98720, 98724, - 98728, 98732, 98736, 98740, 98744, 98748, 98752, 98756, 98760, 98764, - 98768, 98772, 98776, 98780, 98784, 98788, 98792, 98796, 98800, 98804, - 98808, 98812, 98816, 98820, 98824, 98828, 98832, 98836, 98840, 98844, - 98848, 98852, 98856, 98860, 98864, 98868, 98872, 98876, 98880, 98884, - 98888, 98892, 98896, 98900, 98904, 98908, 98912, 98916, 98920, 98924, - 98928, 98932, 98936, 98940, 98944, 98948, 98952, 98956, 98960, 98964, - 98968, 98972, 98976, 98980, 98984, 98988, 98992, 98996, 99000, 99004, - 99008, 99012, 99016, 99020, 99024, 99028, 99032, 99036, 99040, 99044, - 99048, 99052, 99056, 99060, 99064, 99068, 99072, 99076, 99080, 99084, - 99088, 99092, 99096, 99100, 99104, 99108, 99112, 99116, 99120, 99124, - 99128, 99132, 99136, 99140, 99144, 99148, 99152, 99156, 99160, 99164, - 99168, 99172, 99176, 99180, 99184, 99188, 99192, 99196, 99200, 99204, - 99208, 99212, 99216, 99220, 99224, 99228, 99232, 99236, 99240, 99244, - 99248, 99252, 99256, 99260, 99264, 99268, 99272, 99276, 99280, 99284, - 99288, 99292, 99296, 99300, 99304, 99308, 99312, 99316, 99320, 99324, - 99328, 99332, 99336, 99340, 99344, 99348, 99352, 99356, 99360, 99364, - 99368, 99372, 99376, 99380, 99384, 99388, 99392, 99396, 99400, 99404, - 99408, 99412, 99416, 99420, 99424, 99428, 99432, 99436, 99440, 99444, - 99448, 99452, 99456, 99460, 99464, 99468, 99472, 99476, 99480, 99484, - 99488, 99492, 99496, 99500, 99504, 99508, 99512, 99516, 99520, 99524, - 99528, 99532, 99536, 99540, 99544, 99548, 99552, 99556, 99560, 99564, - 99568, 99572, 99576, 99580, 99584, 99588, 99592, 99596, 99600, 99604, - 99608, 99612, 99616, 99620, 99624, 99628, 99632, 99636, 99640, 99644, - 99648, 99652, 99656, 99660, 99664, 99668, 99672, 99676, 99680, 99684, - 99688, 99692, 99696, 99700, 99704, 99708, 99712, 99716, 99720, 99724, - 99728, 99732, 99736, 99740, 99744, 99748, 99752, 99756, 99760, 99764, - 99768, 99772, 99776, 99780, 99784, 99788, 99792, 99796, 99800, 99804, - 99808, 99812, 99816, 99820, 99824, 99828, 99832, 99836, 99840, 99844, - 99848, 99852, 99856, 99860, 99864, 99868, 99872, 99876, 99880, 99884, - 99888, 99892, 99896, 99900, 99904, 99908, 99912, 99916, 99920, 99924, - 99928, 99932, 99936, 99940, 99944, 99948, 99952, 99956, 99960, 99964, - 99968, 99972, 99976, 99980, 99984, 99988, 99992, 99996, 100000, 100004, - 100008, 100012, 100016, 100020, 100024, 100028, 100032, 100036, 100040, - 100044, 100048, 100052, 100056, 100060, 100064, 100068, 100072, 100076, - 100080, 100084, 100088, 100092, 100096, 100100, 100104, 100108, 100112, - 100116, 100120, 100124, 100128, 100132, 100136, 100140, 100144, 100148, - 100152, 100156, 100160, 100164, 100168, 100172, 100176, 100180, 100184, - 100188, 100192, 100196, 100200, 100204, 100208, 100212, 100216, 100220, - 100224, 100228, 100232, 100236, 100240, 100244, 100248, 100252, 100256, - 100260, 100264, 100268, 100272, 100276, 100280, 100284, 100288, 100292, - 100296, 100300, 100304, 100308, 100312, 100316, 100320, 100324, 100328, - 100332, 100336, 100340, 100344, 100348, 100352, 100356, 100360, 100364, - 100368, 100372, 100376, 100380, 100384, 100388, 100392, 100396, 100400, - 100404, 100408, 100412, 100416, 100420, 100424, 100428, 100432, 100436, - 100440, 100444, 100448, 100452, 100456, 100460, 100464, 100468, 100472, - 100476, 100480, 100484, 100488, 100492, 100496, 100500, 100504, 100508, - 100512, 100516, 100520, 100524, 100528, 100532, 100536, 100540, 100544, - 100548, 100552, 100556, 100560, 100564, 100568, 100572, 100576, 100580, - 100584, 100588, 100592, 100596, 100600, 100604, 100608, 100612, 100616, - 100620, 100624, 100628, 100632, 100636, 100640, 100644, 100648, 100652, - 100656, 100660, 100664, 100668, 100672, 100676, 100680, 100684, 100688, - 100692, 100696, 100700, 100704, 100708, 100712, 100716, 100720, 100724, - 100728, 100732, 100736, 100740, 100744, 100748, 100752, 100756, 100760, - 100764, 100768, 100772, 100776, 100780, 100784, 100788, 100792, 100796, - 100800, 100804, 100808, 100812, 100816, 100820, 100824, 100828, 100832, - 100836, 100840, 100844, 100848, 100852, 100856, 100860, 100864, 100868, - 100872, 100876, 100880, 100884, 100888, 100892, 100896, 100900, 100904, - 100908, 100912, 100916, 100920, 100924, 100928, 100932, 100936, 100940, - 100944, 100948, 100952, 100956, 100960, 100964, 100968, 100972, 100976, - 100980, 100984, 100988, 100992, 100996, 101000, 101004, 101008, 101012, - 101016, 101020, 101024, 101028, 101032, 101036, 101040, 101044, 101048, - 101052, 101056, 101060, 101064, 101068, 101072, 101076, 101080, 101084, - 101088, 101092, 101096, 101100, 101104, 101108, 101112, 101116, 101120, - 101124, 101128, 101132, 101136, 101140, 101144, 101148, 101152, 101156, - 101160, 101164, 101168, 101172, 101176, 101180, 101184, 101188, 101192, - 101196, 101200, 101204, 101208, 101212, 101216, 101220, 101224, 101228, - 101232, 101236, 101240, 101244, 101248, 101252, 101256, 101260, 101264, - 101268, 101272, 101276, 101280, 101284, 101288, 101292, 101296, 101300, - 101304, 101308, 101312, 101316, 101320, 101324, 101328, 101332, 101336, - 101340, 101344, 101348, 101352, 101356, 101360, 101364, 101368, 101372, - 101376, 101380, 101384, 101388, 101392, 101396, 101400, 101404, 101408, - 101412, 101416, 101420, 101424, 101428, 101432, 101436, 101440, 101444, - 101448, 101452, 101456, 101460, 101464, 101468, 101472, 101476, 101480, - 101484, 101488, 101492, 101496, 101500, 101504, 101508, 101512, 101516, - 101520, 101524, 101528, 101532, 101536, 101540, 101544, 101548, 101552, - 101556, 101560, 101564, 101568, 101572, 101576, 101580, 101584, 101588, - 101592, 101596, 101600, 101604, 101608, 101612, 101616, 101620, 101624, - 101628, 101632, 101636, 101640, 101644, 101648, 101652, 101656, 101660, - 101664, 101668, 101672, 101676, 101680, 101684, 101688, 101692, 101696, - 101700, 101704, 101708, 101712, 101716, 101720, 101724, 101728, 101732, - 101736, 101740, 101744, 101748, 101752, 101756, 101760, 101764, 101768, - 101772, 101776, 101780, 101784, 101788, 101792, 101796, 101800, 101804, - 101808, 101812, 101816, 101820, 101824, 101828, 101832, 101836, 101840, - 101844, 101848, 101852, 101856, 101860, 101864, 101868, 101872, 101876, - 101880, 101884, 101888, 101892, 101896, 101900, 101904, 101908, 101912, - 101916, 101920, 101924, 101928, 101932, 101936, 101940, 101944, 101948, - 101952, 101956, 101960, 101964, 101968, 101972, 101976, 101980, 101984, - 101988, 101992, 101996, 102000, 102004, 102008, 102012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 102016, 102021, 102026, 102031, 102038, 102045, 102052, 102059, - 102064, 102069, 102074, 102079, 102086, 102091, 102098, 102105, 102110, - 102115, 102120, 102127, 102132, 102137, 102144, 102151, 102156, 102161, - 102166, 102173, 102180, 102187, 102192, 102197, 102204, 102211, 102218, - 102225, 102230, 102235, 102240, 102247, 102252, 102257, 102262, 102269, - 102278, 102285, 102290, 102295, 102300, 102305, 102310, 102315, 102324, - 102331, 102336, 102343, 102350, 102355, 102360, 102365, 102372, 102377, - 102384, 102391, 102396, 102401, 102406, 102413, 102420, 102425, 102430, - 102437, 102444, 102451, 102456, 102461, 102466, 102471, 102478, 102487, - 102496, 102501, 102508, 102517, 102522, 102527, 102532, 102537, 102544, - 102551, 102558, 102565, 102570, 102575, 102580, 102587, 102594, 102601, - 102606, 102611, 102618, 102623, 102630, 102635, 102642, 102647, 102654, - 102661, 102666, 102671, 102676, 102681, 102686, 102691, 102696, 102701, - 102706, 102713, 102720, 102727, 102734, 102741, 102750, 102755, 102760, - 102767, 102774, 102779, 102786, 102793, 102800, 102807, 102814, 102821, - 102826, 102831, 102836, 102841, 102846, 102855, 102864, 102873, 102882, - 102891, 102900, 102909, 102918, 102923, 102934, 102945, 102954, 102959, - 102964, 102969, 102974, 102983, 102990, 102997, 103004, 103011, 103018, - 103025, 103034, 103043, 103054, 103063, 103074, 103083, 103090, 103099, - 103110, 103119, 103128, 103137, 103146, 103153, 103160, 103167, 103176, - 103185, 103196, 103205, 103214, 103225, 103230, 103235, 103246, 103254, - 103263, 103272, 103281, 103292, 103301, 103310, 103321, 103332, 103343, - 103354, 103365, 103376, 103383, 103390, 103397, 103404, 103415, 103424, - 103431, 103438, 103445, 103456, 103467, 103478, 103489, 103500, 103511, - 103522, 103533, 103540, 103547, 103556, 103565, 103572, 103579, 103586, - 103595, 103604, 103613, 103620, 103629, 103638, 103647, 103654, 103661, - 103666, 103672, 103679, 103686, 103693, 103700, 103707, 103714, 103723, - 103732, 103741, 103750, 103757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103766, - 103772, 103777, 103782, 103789, 103795, 103801, 103807, 103813, 103819, - 103825, 103831, 103835, 103839, 103845, 103851, 103857, 103861, 103866, - 103871, 103875, 103879, 103882, 103888, 103894, 103900, 103906, 103912, - 103918, 103924, 103930, 103936, 103946, 103956, 103962, 103968, 103978, - 103988, 103994, 0, 0, 104000, 104008, 104013, 104018, 104024, 104030, - 104036, 104042, 104048, 104054, 104061, 104068, 104074, 104080, 104086, - 104092, 104098, 104104, 104110, 104116, 104121, 104127, 104133, 104139, - 104145, 104151, 104160, 104166, 104171, 104179, 104186, 104193, 104202, - 104211, 104220, 104229, 104238, 104247, 104256, 104265, 104275, 104285, - 104293, 104301, 104310, 104319, 104325, 104331, 104337, 104343, 104351, - 104359, 104363, 104369, 104374, 104380, 104386, 104392, 104398, 104404, - 104413, 104418, 104425, 104430, 104435, 104440, 104446, 104452, 104458, - 104465, 104470, 104475, 104480, 104485, 104490, 104496, 104502, 104508, - 104514, 104520, 104526, 104532, 104538, 104543, 104548, 104553, 104558, - 104563, 104568, 104573, 104578, 104584, 104590, 104595, 104600, 104605, - 104610, 104615, 104621, 104628, 104632, 104636, 104640, 104644, 104648, - 104652, 104656, 104660, 104668, 104678, 104682, 104686, 104692, 104698, - 104704, 104710, 104716, 104722, 104728, 104734, 104740, 104746, 104752, - 104758, 104764, 104770, 104774, 104778, 104785, 104791, 104797, 104803, - 104808, 104815, 104820, 104826, 104832, 104838, 104844, 104849, 104853, - 104859, 104863, 104867, 104871, 104877, 104883, 104887, 104893, 104899, - 104905, 104911, 104917, 104925, 104933, 104939, 104945, 104951, 104957, - 104969, 104981, 104995, 105007, 105019, 105033, 105047, 105061, 105065, - 105073, 105081, 105086, 105090, 105094, 105098, 105102, 105106, 105110, - 105114, 105120, 105126, 105132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105138, - 105144, 105150, 105156, 105162, 105168, 105174, 105180, 105186, 105192, - 105198, 105204, 105210, 105216, 105222, 105228, 105234, 105240, 105246, - 105252, 105258, 105264, 105270, 105276, 105282, 105288, 105294, 105300, - 105306, 105312, 105318, 105324, 105330, 105336, 105342, 105348, 105354, - 105360, 105366, 105372, 105378, 105384, 105390, 105396, 105402, 105408, - 105414, 105420, 105426, 105432, 105438, 105444, 105450, 105456, 105462, - 105468, 105474, 105480, 105486, 105492, 105498, 105504, 105510, 105516, - 105522, 105528, 105534, 105539, 105544, 105549, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107529, 107534, + 107539, 107544, 107551, 107558, 107565, 107572, 107577, 107582, 107587, + 107592, 107599, 107604, 107611, 107618, 107623, 107628, 107633, 107640, + 107645, 107650, 107657, 107664, 107669, 107674, 107679, 107686, 107693, + 107700, 107705, 107710, 107717, 107724, 107731, 107738, 107743, 107748, + 107753, 107760, 107765, 107770, 107775, 107782, 107791, 107798, 107803, + 107808, 107813, 107818, 107823, 107828, 107837, 107844, 107849, 107856, + 107863, 107868, 107873, 107878, 107885, 107890, 107897, 107904, 107909, + 107914, 107919, 107926, 107933, 107938, 107943, 107950, 107957, 107964, + 107969, 107974, 107979, 107984, 107991, 108000, 108009, 108014, 108021, + 108030, 108035, 108040, 108045, 108050, 108057, 108064, 108071, 108078, + 108083, 108088, 108093, 108100, 108107, 108114, 108119, 108124, 108131, + 108136, 108143, 108148, 108155, 108160, 108167, 108174, 108179, 108184, + 108189, 108194, 108199, 108204, 108209, 108214, 108219, 108226, 108233, + 108240, 108247, 108254, 108263, 108268, 108273, 108280, 108287, 108292, + 108299, 108306, 108313, 108320, 108327, 108334, 108339, 108344, 108349, + 108354, 108359, 108368, 108377, 108386, 108395, 108404, 108413, 108422, + 108431, 108436, 108447, 108458, 108467, 108472, 108477, 108482, 108487, + 108496, 108503, 108510, 108517, 108524, 108531, 108538, 108547, 108556, + 108567, 108576, 108587, 108596, 108603, 108612, 108623, 108632, 108641, + 108650, 108659, 108666, 108673, 108680, 108689, 108698, 108709, 108718, + 108727, 108738, 108743, 108748, 108759, 108767, 108776, 108785, 108794, + 108805, 108814, 108823, 108834, 108845, 108856, 108867, 108878, 108889, + 108896, 108903, 108910, 108917, 108928, 108937, 108944, 108951, 108958, + 108969, 108980, 108991, 109002, 109013, 109024, 109035, 109046, 109053, + 109060, 109069, 109078, 109085, 109092, 109099, 109108, 109117, 109126, + 109133, 109142, 109151, 109160, 109167, 109174, 109179, 109185, 109192, + 109199, 109206, 109213, 109220, 109227, 109236, 109245, 109254, 109263, + 109270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109279, 109285, 109290, 109295, + 109302, 109308, 109314, 109320, 109326, 109332, 109338, 109344, 109348, + 109352, 109358, 109364, 109370, 109374, 109379, 109384, 109388, 109392, + 109395, 109401, 109407, 109413, 109419, 109425, 109431, 109437, 109443, + 109449, 109459, 109469, 109475, 109481, 109491, 109501, 109507, 0, 0, + 109513, 109521, 109526, 109531, 109537, 109543, 109549, 109555, 109561, + 109567, 109574, 109581, 109587, 109593, 109599, 109605, 109611, 109617, + 109623, 109629, 109634, 109640, 109646, 109652, 109658, 109664, 109673, + 109679, 109684, 109692, 109699, 109706, 109715, 109724, 109733, 109742, + 109751, 109760, 109769, 109778, 109788, 109798, 109806, 109814, 109823, + 109832, 109838, 109844, 109850, 109856, 109864, 109872, 109876, 109882, + 109887, 109893, 109899, 109905, 109911, 109917, 109926, 109931, 109938, + 109943, 109948, 109953, 109959, 109965, 109971, 109978, 109983, 109988, + 109993, 109998, 110003, 110009, 110015, 110021, 110027, 110033, 110039, + 110045, 110051, 110056, 110061, 110066, 110071, 110076, 110081, 110086, + 110091, 110097, 110103, 110108, 110113, 110118, 110123, 110128, 110134, + 110141, 110145, 110149, 110153, 110157, 110161, 110165, 110169, 110173, + 110181, 110191, 110195, 110199, 110205, 110211, 110217, 110223, 110229, + 110235, 110241, 110247, 110253, 110259, 110265, 110271, 110277, 110283, + 110287, 110291, 110298, 110304, 110310, 110316, 110321, 110328, 110333, + 110339, 110345, 110351, 110357, 110362, 110366, 110372, 110376, 110380, + 110384, 110390, 110396, 110400, 110406, 110412, 110418, 110424, 110430, + 110438, 110446, 110452, 110458, 110464, 110470, 110482, 110494, 110508, + 110520, 110532, 110546, 110560, 110574, 110578, 110586, 110594, 110599, + 110603, 110607, 110611, 110615, 110619, 110623, 110627, 110633, 110639, + 110645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110651, 110657, 110663, 110669, + 110675, 110681, 110687, 110693, 110699, 110705, 110711, 110717, 110723, + 110729, 110735, 110741, 110747, 110753, 110759, 110765, 110771, 110777, + 110783, 110789, 110795, 110801, 110807, 110813, 110819, 110825, 110831, + 110837, 110843, 110849, 110855, 110861, 110867, 110873, 110879, 110885, + 110891, 110897, 110903, 110909, 110915, 110921, 110927, 110933, 110939, + 110945, 110951, 110957, 110963, 110969, 110975, 110981, 110987, 110993, + 110999, 111005, 111011, 111017, 111023, 111029, 111035, 111041, 111047, + 111052, 111057, 111062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111066, 111071, + 111078, 111085, 111092, 111099, 111104, 111108, 111114, 111118, 111122, + 111128, 111132, 111136, 111140, 111146, 111153, 111157, 111161, 111165, + 111169, 111173, 111177, 111183, 111187, 111191, 111195, 111199, 111203, + 111207, 111211, 111215, 111219, 111223, 111227, 111231, 111236, 111240, + 111244, 111248, 111252, 111256, 111260, 111264, 111268, 111272, 111279, + 111283, 111291, 111295, 111299, 111303, 111307, 111311, 111315, 111319, + 111326, 111330, 111334, 111338, 111342, 111346, 111352, 111356, 111362, + 111366, 111370, 111374, 111378, 111382, 111386, 111390, 111394, 111398, + 111402, 111406, 111410, 111414, 111418, 111422, 111426, 111430, 111434, + 111438, 111446, 111450, 111454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111458, + 111466, 111474, 111482, 111490, 111498, 111506, 111514, 111522, 111530, + 111538, 111546, 111554, 111562, 111570, 111578, 111586, 111594, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111602, 111606, 111611, 111616, 111621, + 111625, 111630, 111635, 111640, 111644, 111649, 111654, 111658, 111662, + 111666, 111670, 111675, 111680, 111684, 111688, 111693, 111697, 111702, + 111707, 111712, 111717, 111722, 111726, 111731, 111736, 111741, 111745, + 111750, 111755, 111760, 111764, 111769, 111774, 111778, 111782, 111786, + 111790, 111795, 111800, 111804, 111808, 111813, 111817, 111822, 111827, + 111832, 111837, 111842, 111846, 111851, 111856, 111861, 111865, 111870, + 111875, 111880, 111884, 111889, 111894, 111898, 111902, 111906, 111910, + 111915, 111920, 111924, 111928, 111933, 111937, 111942, 111947, 111952, + 111957, 111962, 111966, 111971, 111976, 111981, 111985, 111990, 0, + 111995, 111999, 112004, 112009, 112013, 112017, 112021, 112025, 112030, + 112035, 112039, 112043, 112048, 112052, 112057, 112062, 112067, 112072, + 112077, 112082, 112088, 112094, 112100, 112105, 112111, 112117, 112123, + 112128, 112134, 112140, 112145, 112150, 112155, 112160, 112166, 112172, + 112177, 112182, 112188, 112193, 112199, 112205, 112211, 112217, 112223, + 112228, 112234, 112240, 112246, 112251, 112257, 112263, 112269, 112274, + 112280, 112286, 112291, 112296, 112301, 112306, 112312, 112318, 112323, + 112328, 112334, 112339, 112345, 112351, 112357, 112363, 112369, 0, + 112373, 112378, 0, 0, 112383, 0, 0, 112388, 112393, 0, 0, 112398, 112402, + 112406, 112411, 0, 112416, 112420, 112425, 112429, 112434, 112439, + 112444, 112449, 112454, 112458, 112463, 112468, 0, 112473, 0, 112478, + 112483, 112487, 112492, 112497, 112501, 112505, 0, 112509, 112514, + 112519, 112523, 112527, 112532, 112536, 112541, 112546, 112551, 112556, + 112561, 112566, 112572, 112578, 112584, 112589, 112595, 112601, 112607, + 112612, 112618, 112624, 112629, 112634, 112639, 112644, 112650, 112656, + 112661, 112666, 112672, 112677, 112683, 112689, 112695, 112701, 112707, + 112712, 112718, 112724, 112730, 112735, 112741, 112747, 112753, 112758, + 112764, 112770, 112775, 112780, 112785, 112790, 112796, 112802, 112807, + 112812, 112818, 112823, 112829, 112835, 112841, 112847, 112853, 112857, + 0, 112862, 112867, 112871, 112876, 0, 0, 112881, 112886, 112891, 112895, + 112899, 112903, 112907, 112912, 0, 112917, 112921, 112926, 112930, + 112935, 112940, 112945, 0, 112950, 112954, 112959, 112964, 112969, + 112973, 112978, 112983, 112988, 112992, 112997, 113002, 113006, 113010, + 113014, 113018, 113023, 113028, 113032, 113036, 113041, 113045, 113050, + 113055, 113060, 113065, 113070, 113074, 0, 113079, 113084, 113088, + 113093, 0, 113098, 113102, 113107, 113112, 113116, 0, 113120, 0, 0, 0, + 113124, 113128, 113133, 113137, 113142, 113147, 113152, 0, 113157, + 113161, 113166, 113171, 113176, 113180, 113185, 113190, 113195, 113199, + 113204, 113209, 113213, 113217, 113221, 113225, 113230, 113235, 113239, + 113243, 113248, 113252, 113257, 113262, 113267, 113272, 113277, 113282, + 113288, 113294, 113300, 113305, 113311, 113317, 113323, 113328, 113334, + 113340, 113345, 113350, 113355, 113360, 113366, 113372, 113377, 113382, + 113388, 113393, 113399, 113405, 113411, 113417, 113423, 113428, 113434, + 113440, 113446, 113451, 113457, 113463, 113469, 113474, 113480, 113486, + 113491, 113496, 113501, 113506, 113512, 113518, 113523, 113528, 113534, + 113539, 113545, 113551, 113557, 113563, 113569, 113573, 113578, 113583, + 113588, 113592, 113597, 113602, 113607, 113611, 113616, 113621, 113625, + 113629, 113633, 113637, 113642, 113647, 113651, 113655, 113660, 113664, + 113669, 113674, 113679, 113684, 113689, 113693, 113698, 113703, 113708, + 113712, 113717, 113722, 113727, 113731, 113736, 113741, 113745, 113749, + 113753, 113757, 113762, 113767, 113771, 113775, 113780, 113784, 113789, + 113794, 113799, 113804, 113809, 113814, 113820, 113826, 113832, 113837, + 113843, 113849, 113855, 113860, 113866, 113872, 113877, 113882, 113887, + 113892, 113898, 113904, 113909, 113914, 113920, 113925, 113931, 113937, + 113943, 113949, 113955, 113960, 113966, 113972, 113978, 113983, 113989, + 113995, 114001, 114006, 114012, 114018, 114023, 114028, 114033, 114038, + 114044, 114050, 114055, 114060, 114066, 114071, 114077, 114083, 114089, + 114095, 114101, 114106, 114112, 114118, 114124, 114129, 114135, 114141, + 114147, 114152, 114158, 114164, 114169, 114174, 114179, 114184, 114190, + 114196, 114201, 114206, 114212, 114217, 114223, 114229, 114235, 114241, + 114247, 114252, 114258, 114264, 114270, 114275, 114281, 114287, 114293, + 114298, 114304, 114310, 114315, 114320, 114325, 114330, 114336, 114342, + 114347, 114352, 114358, 114363, 114369, 114375, 114381, 114387, 114393, + 114399, 114406, 114413, 114420, 114426, 114433, 114440, 114447, 114453, + 114460, 114467, 114473, 114479, 114485, 114491, 114498, 114505, 114511, + 114517, 114524, 114530, 114537, 114544, 114551, 114558, 114565, 114571, + 114578, 114585, 114592, 114598, 114605, 114612, 114619, 114625, 114632, + 114639, 114645, 114651, 114657, 114663, 114670, 114677, 114683, 114689, + 114696, 114702, 114709, 114716, 114723, 114730, 114737, 114742, 114748, + 114754, 114760, 114765, 114771, 114777, 114783, 114788, 114794, 114800, + 114805, 114810, 114815, 114820, 114826, 114832, 114837, 114842, 114848, + 114853, 114859, 114865, 114871, 114877, 114883, 114888, 114894, 114900, + 114906, 114911, 114917, 114923, 114929, 114934, 114940, 114946, 114951, + 114956, 114961, 114966, 114972, 114978, 114983, 114988, 114994, 114999, + 115005, 115011, 115017, 115023, 115029, 115035, 0, 0, 115042, 115047, + 115052, 115057, 115062, 115067, 115072, 115077, 115082, 115087, 115092, + 115097, 115102, 115107, 115112, 115117, 115122, 115127, 115133, 115138, + 115143, 115148, 115153, 115158, 115163, 115168, 115172, 115177, 115182, + 115187, 115192, 115197, 115202, 115207, 115212, 115217, 115222, 115227, + 115232, 115237, 115242, 115247, 115252, 115257, 115263, 115268, 115273, + 115278, 115283, 115288, 115293, 115298, 115304, 115309, 115314, 115319, + 115324, 115329, 115334, 115339, 115344, 115349, 115354, 115359, 115364, + 115369, 115374, 115379, 115384, 115389, 115394, 115399, 115404, 115409, + 115414, 115419, 115425, 115430, 115435, 115440, 115445, 115450, 115455, + 115460, 115464, 115469, 115474, 115479, 115484, 115489, 115494, 115499, + 115504, 115509, 115514, 115519, 115524, 115529, 115534, 115539, 115544, + 115549, 115555, 115560, 115565, 115570, 115575, 115580, 115585, 115590, + 115596, 115601, 115606, 115611, 115616, 115621, 115626, 115632, 115638, + 115644, 115650, 115656, 115662, 115668, 115674, 115680, 115686, 115692, + 115698, 115704, 115710, 115716, 115722, 115728, 115735, 115741, 115747, + 115753, 115759, 115765, 115771, 115777, 115782, 115788, 115794, 115800, + 115806, 115812, 115818, 115824, 115830, 115836, 115842, 115848, 115854, + 115860, 115866, 115872, 115878, 115884, 115891, 115897, 115903, 115909, + 115915, 115921, 115927, 115933, 115940, 115946, 115952, 115958, 115964, + 115970, 115976, 115982, 115988, 115994, 116000, 116006, 116012, 116018, + 116024, 116030, 116036, 116042, 116048, 116054, 116060, 116066, 116072, + 116078, 116085, 116091, 116097, 116103, 116109, 116115, 116121, 116127, + 116132, 116138, 116144, 116150, 116156, 116162, 116168, 116174, 116180, + 116186, 116192, 116198, 116204, 116210, 116216, 116222, 116228, 116234, + 116241, 116247, 116253, 116259, 116265, 116271, 116277, 116283, 116290, + 116296, 116302, 116308, 116314, 116320, 116326, 116333, 116340, 116347, + 116354, 116361, 116368, 116375, 116382, 116389, 116396, 116403, 116410, + 116417, 116424, 116431, 116438, 116445, 116453, 116460, 116467, 116474, + 116481, 116488, 116495, 116502, 116508, 116515, 116522, 116529, 116536, + 116543, 116550, 116557, 116564, 116571, 116578, 116585, 116592, 116599, + 116606, 116613, 116620, 116627, 116635, 116642, 116649, 116656, 116663, + 116670, 116677, 116684, 116692, 116699, 116706, 116713, 116720, 116727, + 116734, 116739, 0, 0, 116744, 116749, 116753, 116757, 116761, 116765, + 116769, 116773, 116777, 116781, 116785, 116790, 116794, 116798, 116802, + 116806, 116810, 116814, 116818, 116822, 116826, 116831, 116835, 116839, + 116843, 116847, 116851, 116855, 116859, 116863, 116867, 116873, 116878, + 116883, 116888, 116893, 116898, 116903, 116908, 116913, 116918, 116924, + 116929, 116934, 116939, 116944, 116949, 116954, 116959, 116964, 116969, + 116976, 116983, 116990, 116997, 117004, 117011, 117017, 117024, 117031, + 117038, 117046, 117054, 117062, 117070, 117078, 117086, 117093, 117100, + 117107, 117115, 117123, 117131, 117139, 117147, 117155, 117162, 117169, + 117176, 117184, 117192, 117200, 117208, 117216, 117224, 117229, 117234, + 117239, 117244, 117249, 117254, 117259, 117264, 117269, 0, 0, 0, 0, + 117274, 117279, 117283, 117287, 117291, 117295, 117299, 117303, 117307, + 117311, 117315, 117319, 117323, 117327, 117331, 117335, 117339, 117343, + 117347, 117351, 117355, 117359, 117363, 117367, 117371, 117375, 117379, + 117383, 117387, 117391, 117395, 117399, 117403, 117407, 117411, 117415, + 117419, 117423, 117427, 117431, 117435, 117439, 117443, 117447, 117451, + 117455, 117459, 117463, 117467, 117471, 117475, 117480, 117484, 117488, + 117492, 117496, 117500, 117504, 117508, 117512, 117516, 117520, 117524, + 117528, 117532, 117536, 117540, 117544, 117548, 117552, 117556, 117560, + 117564, 117568, 117572, 117576, 117580, 117584, 117588, 117592, 117596, + 117600, 117604, 117608, 117612, 117616, 117620, 117624, 117628, 117632, + 117636, 117640, 117644, 117648, 117652, 117656, 117660, 117664, 117668, + 117672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117676, 117682, 117691, + 117699, 117707, 117716, 117725, 117734, 117743, 117752, 117761, 117770, + 117779, 117788, 117797, 0, 0, 117806, 117815, 117823, 117831, 117840, + 117849, 117858, 117867, 117876, 117885, 117894, 117903, 117912, 117921, + 0, 0, 117930, 117939, 117947, 117955, 117964, 117973, 117982, 117991, + 118000, 118009, 118018, 118027, 118036, 118045, 118054, 0, 118061, + 118070, 118078, 118086, 118095, 118104, 118113, 118122, 118131, 118140, + 118149, 118158, 118167, 118176, 118185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118192, + 118199, 118204, 118208, 118212, 118216, 118221, 118226, 118231, 118236, + 118241, 0, 0, 0, 0, 0, 118246, 118251, 118257, 118263, 118269, 118274, + 118280, 118286, 118292, 118297, 118303, 118309, 118314, 118319, 118324, + 118329, 118335, 118341, 118346, 118351, 118357, 118362, 118368, 118374, + 118380, 118386, 118392, 118402, 118409, 118415, 118418, 0, 118421, + 118426, 118432, 118438, 118444, 118449, 118455, 118461, 118467, 118472, + 118478, 118484, 118489, 118494, 118499, 118504, 118510, 118516, 118521, + 118526, 118532, 118537, 118543, 118549, 118555, 118561, 118567, 118570, + 118573, 118576, 118579, 118582, 118585, 118591, 118598, 118605, 118612, + 118618, 118625, 118632, 118639, 118645, 118652, 118659, 118665, 118671, + 118677, 118683, 118690, 118697, 118703, 118709, 118716, 118722, 118729, + 118736, 118743, 118750, 0, 0, 0, 0, 0, 0, 118757, 118763, 118770, 118777, + 118784, 118790, 118797, 118804, 118811, 118817, 118824, 118831, 118837, + 118843, 118849, 118855, 118862, 118869, 118875, 118881, 118888, 118894, + 118901, 118908, 118915, 118922, 118929, 118938, 118942, 118945, 118949, + 118953, 118957, 118960, 118963, 118966, 118969, 118972, 118975, 118978, + 118981, 118984, 118990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 105553, 105558, 105565, 105572, 105579, 105586, 105591, 105595, - 105601, 105605, 105609, 105615, 105619, 105623, 105627, 105633, 105640, - 105644, 105648, 105652, 105656, 105660, 105664, 105670, 105674, 105678, - 105682, 105686, 105690, 105694, 105698, 105702, 105706, 105710, 105714, - 105718, 105723, 105727, 105731, 105735, 105739, 105743, 105747, 105751, - 105755, 105759, 105766, 105770, 105777, 105781, 105785, 105789, 105793, - 105797, 105801, 105805, 105812, 105816, 105820, 105824, 105828, 105832, - 105838, 105842, 105848, 105852, 105856, 105860, 105864, 105868, 105872, - 105876, 105880, 105884, 105888, 105892, 105896, 105900, 105904, 105908, - 105912, 105916, 105920, 105924, 105932, 105936, 105940, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 105944, 105952, 105960, 105968, 105976, 105984, 105992, 106000, - 106008, 106016, 106024, 106032, 106040, 106048, 106056, 106064, 106072, - 106080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106088, 106092, 106097, - 106102, 106107, 106111, 106116, 106121, 106126, 106130, 106135, 106140, - 106144, 106148, 106152, 106156, 106161, 106166, 106170, 106174, 106179, - 106183, 106188, 106193, 106198, 106203, 106208, 106212, 106217, 106222, - 106227, 106231, 106236, 106241, 106246, 106250, 106255, 106260, 106264, - 106268, 106272, 106276, 106281, 106286, 106290, 106294, 106299, 106303, - 106308, 106313, 106318, 106323, 106328, 106332, 106337, 106342, 106347, - 106351, 106356, 106361, 106366, 106370, 106375, 106380, 106384, 106388, - 106392, 106396, 106401, 106406, 106410, 106414, 106419, 106423, 106428, - 106433, 106438, 106443, 106448, 106452, 106457, 106462, 106467, 106471, - 106476, 0, 106481, 106485, 106490, 106495, 106499, 106503, 106507, - 106511, 106516, 106521, 106525, 106529, 106534, 106538, 106543, 106548, - 106553, 106558, 106563, 106568, 106574, 106580, 106586, 106591, 106597, - 106603, 106609, 106614, 106620, 106626, 106631, 106636, 106641, 106646, - 106652, 106658, 106663, 106668, 106674, 106679, 106685, 106691, 106697, - 106703, 106709, 106714, 106720, 106726, 106732, 106737, 106743, 106749, - 106755, 106760, 106766, 106772, 106777, 106782, 106787, 106792, 106798, - 106804, 106809, 106814, 106820, 106825, 106831, 106837, 106843, 106849, - 106855, 0, 106859, 106864, 0, 0, 106869, 0, 0, 106874, 106879, 0, 0, - 106884, 106888, 106892, 106897, 0, 106902, 106906, 106911, 106915, - 106920, 106925, 106930, 106935, 106940, 106944, 106949, 106954, 0, - 106959, 0, 106964, 106969, 106973, 106978, 106983, 106987, 106991, 0, - 106995, 107000, 107005, 107009, 107013, 107018, 107022, 107027, 107032, - 107037, 107042, 107047, 107052, 107058, 107064, 107070, 107075, 107081, - 107087, 107093, 107098, 107104, 107110, 107115, 107120, 107125, 107130, - 107136, 107142, 107147, 107152, 107158, 107163, 107169, 107175, 107181, - 107187, 107193, 107198, 107204, 107210, 107216, 107221, 107227, 107233, - 107239, 107244, 107250, 107256, 107261, 107266, 107271, 107276, 107282, - 107288, 107293, 107298, 107304, 107309, 107315, 107321, 107327, 107333, - 107339, 107343, 0, 107348, 107353, 107357, 107362, 0, 0, 107367, 107372, - 107377, 107381, 107385, 107389, 107393, 107398, 0, 107403, 107407, - 107412, 107416, 107421, 107426, 107431, 0, 107436, 107440, 107445, - 107450, 107455, 107459, 107464, 107469, 107474, 107478, 107483, 107488, - 107492, 107496, 107500, 107504, 107509, 107514, 107518, 107522, 107527, - 107531, 107536, 107541, 107546, 107551, 107556, 107560, 0, 107565, - 107570, 107574, 107579, 0, 107584, 107588, 107593, 107598, 107602, 0, - 107606, 0, 0, 0, 107610, 107614, 107619, 107623, 107628, 107633, 107638, - 0, 107643, 107647, 107652, 107657, 107662, 107666, 107671, 107676, - 107681, 107685, 107690, 107695, 107699, 107703, 107707, 107711, 107716, - 107721, 107725, 107729, 107734, 107738, 107743, 107748, 107753, 107758, - 107763, 107768, 107774, 107780, 107786, 107791, 107797, 107803, 107809, - 107814, 107820, 107826, 107831, 107836, 107841, 107846, 107852, 107858, - 107863, 107868, 107874, 107879, 107885, 107891, 107897, 107903, 107909, - 107914, 107920, 107926, 107932, 107937, 107943, 107949, 107955, 107960, - 107966, 107972, 107977, 107982, 107987, 107992, 107998, 108004, 108009, - 108014, 108020, 108025, 108031, 108037, 108043, 108049, 108055, 108059, - 108064, 108069, 108074, 108078, 108083, 108088, 108093, 108097, 108102, - 108107, 108111, 108115, 108119, 108123, 108128, 108133, 108137, 108141, - 108146, 108150, 108155, 108160, 108165, 108170, 108175, 108179, 108184, - 108189, 108194, 108198, 108203, 108208, 108213, 108217, 108222, 108227, - 108231, 108235, 108239, 108243, 108248, 108253, 108257, 108261, 108266, - 108270, 108275, 108280, 108285, 108290, 108295, 108300, 108306, 108312, - 108318, 108323, 108329, 108335, 108341, 108346, 108352, 108358, 108363, - 108368, 108373, 108378, 108384, 108390, 108395, 108400, 108406, 108411, - 108417, 108423, 108429, 108435, 108441, 108446, 108452, 108458, 108464, - 108469, 108475, 108481, 108487, 108492, 108498, 108504, 108509, 108514, - 108519, 108524, 108530, 108536, 108541, 108546, 108552, 108557, 108563, - 108569, 108575, 108581, 108587, 108592, 108598, 108604, 108610, 108615, - 108621, 108627, 108633, 108638, 108644, 108650, 108655, 108660, 108665, - 108670, 108676, 108682, 108687, 108692, 108698, 108703, 108709, 108715, - 108721, 108727, 108733, 108738, 108744, 108750, 108756, 108761, 108767, - 108773, 108779, 108784, 108790, 108796, 108801, 108806, 108811, 108816, - 108822, 108828, 108833, 108838, 108844, 108849, 108855, 108861, 108867, - 108873, 108879, 108885, 108892, 108899, 108906, 108912, 108919, 108926, - 108933, 108939, 108946, 108953, 108959, 108965, 108971, 108977, 108984, - 108991, 108997, 109003, 109010, 109016, 109023, 109030, 109037, 109044, - 109051, 109057, 109064, 109071, 109078, 109084, 109091, 109098, 109105, - 109111, 109118, 109125, 109131, 109137, 109143, 109149, 109156, 109163, - 109169, 109175, 109182, 109188, 109195, 109202, 109209, 109216, 109223, - 109227, 109232, 109237, 109242, 109246, 109251, 109256, 109261, 109265, - 109270, 109275, 109279, 109283, 109287, 109291, 109296, 109301, 109305, - 109309, 109314, 109318, 109323, 109328, 109333, 109338, 109343, 109347, - 109352, 109357, 109362, 109366, 109371, 109376, 109381, 109385, 109390, - 109395, 109399, 109403, 109407, 109411, 109416, 109421, 109425, 109429, - 109434, 109438, 109443, 109448, 109453, 109458, 109463, 109469, 0, 0, - 109476, 109481, 109486, 109491, 109496, 109501, 109506, 109511, 109516, - 109521, 109526, 109531, 109536, 109541, 109546, 109551, 109556, 109561, - 109567, 109572, 109577, 109582, 109587, 109592, 109597, 109602, 109606, - 109611, 109616, 109621, 109626, 109631, 109636, 109641, 109646, 109651, - 109656, 109661, 109666, 109671, 109676, 109681, 109686, 109691, 109697, - 109702, 109707, 109712, 109717, 109722, 109727, 109732, 109738, 109743, - 109748, 109753, 109758, 109763, 109768, 109773, 109778, 109783, 109788, - 109793, 109798, 109803, 109808, 109813, 109818, 109823, 109828, 109833, - 109838, 109843, 109848, 109853, 109859, 109864, 109869, 109874, 109879, - 109884, 109889, 109894, 109898, 109903, 109908, 109913, 109918, 109923, - 109928, 109933, 109938, 109943, 109948, 109953, 109958, 109963, 109968, - 109973, 109978, 109983, 109989, 109994, 109999, 110004, 110009, 110014, - 110019, 110024, 110030, 110035, 110040, 110045, 110050, 110055, 110060, - 110066, 110072, 110078, 110084, 110090, 110096, 110102, 110108, 110114, - 110120, 110126, 110132, 110138, 110144, 110150, 110156, 110162, 110169, - 110175, 110181, 110187, 110193, 110199, 110205, 110211, 110216, 110222, - 110228, 110234, 110240, 110246, 110252, 110258, 110264, 110270, 110276, - 110282, 110288, 110294, 110300, 110306, 110312, 110318, 110325, 110331, - 110337, 110343, 110349, 110355, 110361, 110367, 110374, 110380, 110386, - 110392, 110398, 110404, 110410, 110416, 110422, 110428, 110434, 110440, - 110446, 110452, 110458, 110464, 110470, 110476, 110482, 110488, 110494, - 110500, 110506, 110512, 110519, 110525, 110531, 110537, 110543, 110549, - 110555, 110561, 110566, 110572, 110578, 110584, 110590, 110596, 110602, - 110608, 110614, 110620, 110626, 110632, 110638, 110644, 110650, 110656, - 110662, 110668, 110675, 110681, 110687, 110693, 110699, 110705, 110711, - 110717, 110724, 110730, 110736, 110742, 110748, 110754, 110760, 110767, - 110774, 110781, 110788, 110795, 110802, 110809, 110816, 110823, 110830, - 110837, 110844, 110851, 110858, 110865, 110872, 110879, 110887, 110894, - 110901, 110908, 110915, 110922, 110929, 110936, 110942, 110949, 110956, - 110963, 110970, 110977, 110984, 110991, 110998, 111005, 111012, 111019, - 111026, 111033, 111040, 111047, 111054, 111061, 111069, 111076, 111083, - 111090, 111097, 111104, 111111, 111118, 111126, 111133, 111140, 111147, - 111154, 111161, 111168, 111173, 0, 0, 111178, 111183, 111187, 111191, - 111195, 111199, 111203, 111207, 111211, 111215, 111219, 111224, 111228, - 111232, 111236, 111240, 111244, 111248, 111252, 111256, 111260, 111265, - 111269, 111273, 111277, 111281, 111285, 111289, 111293, 111297, 111301, - 111307, 111312, 111317, 111322, 111327, 111332, 111337, 111342, 111347, - 111352, 111357, 111361, 111365, 111369, 111373, 111377, 111381, 111385, - 111389, 111393, 111400, 111407, 111414, 111421, 111428, 111435, 111441, - 111448, 111455, 111462, 111470, 111478, 111486, 111494, 111502, 111510, - 111517, 111524, 111531, 111539, 111547, 111555, 111563, 111571, 111579, - 111586, 111593, 111600, 111608, 111616, 111624, 111632, 111640, 111648, - 111653, 111658, 111663, 111668, 111673, 111678, 111683, 111688, 111693, - 0, 0, 0, 0, 111698, 111703, 111707, 111711, 111715, 111719, 111723, - 111727, 111731, 111735, 111739, 111743, 111747, 111751, 111755, 111759, - 111763, 111767, 111771, 111775, 111779, 111783, 111787, 111791, 111795, - 111799, 111803, 111807, 111811, 111815, 111819, 111823, 111827, 111831, - 111835, 111839, 111843, 111847, 111851, 111855, 111859, 111863, 111867, - 111871, 111875, 111879, 111883, 111887, 111891, 111895, 111899, 111904, - 111908, 111912, 111916, 111920, 111924, 111928, 111932, 111936, 111940, - 111944, 111948, 111952, 111956, 111960, 111964, 111968, 111972, 111976, - 111980, 111984, 111988, 111992, 111996, 112000, 112004, 112008, 112012, - 112016, 112020, 112024, 112028, 112032, 112036, 112040, 112044, 112048, - 112052, 112056, 112060, 112064, 112068, 112072, 112076, 112080, 112084, - 112088, 112092, 112096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118993, 119000, 119008, 119016, 119024, + 119031, 119039, 119047, 119055, 119062, 119070, 119078, 119085, 119092, + 119099, 119106, 119114, 119122, 119129, 119136, 119144, 119151, 119159, + 119167, 119175, 119183, 119191, 119195, 119199, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 119203, 119209, 119215, 119221, 119225, 119231, 119237, + 119243, 119249, 119255, 119261, 119267, 119273, 119279, 119285, 119291, + 119297, 119303, 119309, 119315, 119321, 119327, 119333, 119339, 119345, + 119351, 119357, 119363, 119369, 119375, 119381, 119387, 119393, 119399, + 119405, 119411, 119417, 119423, 119429, 119435, 119441, 119447, 119453, + 0, 0, 0, 0, 0, 119459, 119470, 119481, 119492, 119503, 119514, 119525, + 119536, 119547, 0, 0, 0, 0, 0, 0, 0, 119558, 119562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119566, 119568, 119570, + 119574, 119579, 119584, 119586, 119592, 119597, 119599, 119605, 119609, + 119611, 119615, 119621, 119627, 119633, 119638, 119642, 119649, 119656, + 119663, 119668, 119675, 119682, 119689, 119693, 119699, 119708, 119717, + 119724, 119729, 119733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 119737, 119739, 119741, 119745, 119749, 119753, 0, 119755, 119757, + 119761, 119763, 119765, 119767, 119769, 119774, 119779, 119781, 119787, + 119791, 119795, 119803, 119805, 119807, 119809, 119811, 119813, 119815, + 119817, 119819, 119821, 119823, 119827, 119831, 119833, 119835, 119837, + 119839, 119841, 119846, 119852, 119856, 119860, 119864, 119868, 119873, + 119877, 119879, 119881, 119885, 119891, 119893, 119895, 119897, 119901, + 119910, 119916, 119920, 119924, 119926, 119928, 119931, 119933, 119935, + 119937, 119941, 119943, 119947, 119952, 119954, 119959, 119965, 119972, + 119976, 119980, 119984, 119988, 119994, 0, 0, 0, 119998, 120000, 120004, + 120008, 120010, 120014, 120018, 120020, 120024, 120026, 120030, 120034, + 120038, 120042, 120046, 120050, 120054, 120058, 120064, 120068, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 120072, 120076, 120080, 120084, 120091, + 120093, 120097, 120099, 120101, 120105, 120109, 120113, 120115, 120119, + 120123, 120127, 120131, 120135, 120137, 120141, 120143, 120149, 120152, + 120157, 120159, 120161, 120164, 120166, 120168, 120171, 120178, 120185, + 120192, 120197, 120201, 120203, 120205, 0, 120207, 120209, 120213, + 120217, 120221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 120223, 120227, 120232, 120236, 120242, 120248, 120250, 120252, + 120258, 120260, 120264, 120268, 120270, 120274, 120276, 120280, 120284, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120288, 120290, 120292, + 120294, 120298, 120300, 120302, 120304, 120306, 120308, 120310, 120312, + 120314, 120316, 120318, 120320, 120322, 120324, 120326, 120328, 120330, + 120332, 120334, 120336, 120338, 120340, 120342, 120346, 120348, 120350, + 120352, 120356, 120358, 120362, 120364, 120366, 120370, 120374, 120380, + 120382, 120384, 120386, 120388, 120392, 120396, 120398, 120402, 120406, + 120410, 120414, 120418, 120422, 120426, 120430, 120434, 120438, 120442, + 120446, 120450, 120454, 120458, 120462, 120466, 0, 120470, 0, 120472, + 120474, 120476, 120478, 120480, 120488, 120496, 120504, 120512, 120517, + 120522, 120527, 120531, 120535, 120540, 120545, 120547, 120551, 120553, + 120555, 120557, 120559, 120561, 120563, 120565, 120569, 120571, 120573, + 120575, 120579, 120583, 120587, 120591, 120595, 120597, 120603, 120609, + 120611, 120613, 120615, 120617, 120619, 120628, 120635, 120642, 120646, + 120653, 120658, 120665, 120674, 120679, 120683, 120687, 120689, 120693, + 120695, 120699, 120703, 120705, 120709, 120713, 120717, 120719, 120721, + 120727, 120729, 120731, 120733, 120737, 120741, 120743, 120747, 120749, + 120751, 120754, 120758, 120760, 120764, 120766, 120768, 120773, 120775, + 120779, 120783, 120786, 120790, 120794, 120798, 120802, 120806, 120810, + 120814, 120819, 120823, 120827, 120836, 120841, 120844, 120846, 120849, + 120852, 120857, 120859, 120862, 120867, 120871, 120874, 120878, 120882, + 120885, 120890, 120894, 120898, 120902, 120906, 120912, 120918, 120924, + 120930, 120935, 120946, 120948, 120952, 120954, 120956, 120960, 120964, + 120966, 120970, 120976, 120981, 120987, 120989, 120993, 120997, 121004, + 121011, 121015, 121017, 121019, 121023, 121025, 121029, 121033, 121037, + 121039, 121041, 121048, 121052, 121056, 121060, 121064, 121068, 121070, + 121074, 121076, 121078, 121082, 121084, 121088, 121092, 121098, 121102, + 121106, 121110, 121112, 121115, 121119, 121126, 121135, 121144, 121153, + 121162, 121164, 121168, 121170, 121174, 121185, 121189, 121195, 121201, + 121206, 0, 121208, 121212, 121214, 121216, 0, 0, 0, 121218, 121223, + 121234, 121250, 121263, 121276, 121280, 121284, 121290, 121292, 121300, + 121308, 121310, 121314, 121320, 121326, 121333, 121340, 121342, 121344, + 121348, 121350, 121356, 121358, 121361, 121365, 121371, 121377, 121388, + 121394, 121401, 121409, 121413, 121421, 121429, 121435, 121441, 121448, + 121450, 121454, 121456, 121458, 121463, 121465, 121467, 121469, 121471, + 121475, 121486, 121492, 121496, 121500, 121504, 121510, 121516, 121522, + 121528, 121533, 121538, 121544, 121550, 121557, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121564, 121571, 121578, 121585, 121593, + 121601, 121609, 121617, 121625, 121633, 121641, 121649, 121657, 121663, + 121669, 121675, 121681, 121687, 121693, 121699, 121705, 121711, 121717, + 121723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112100, - 112107, 112112, 112116, 112120, 112124, 112129, 112134, 112139, 112144, - 112149, 0, 0, 0, 0, 0, 112154, 112159, 112165, 112171, 112177, 112182, - 112188, 112194, 112200, 112205, 112211, 112217, 112222, 112227, 112232, - 112237, 112243, 112249, 112254, 112259, 112265, 112270, 112276, 112282, - 112288, 112294, 112300, 112310, 112317, 112323, 112326, 0, 0, 112329, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112335, 0, 112340, 0, 0, 112346, 0, 0, 0, - 112351, 0, 0, 0, 112357, 112360, 112363, 112366, 112369, 0, 0, 0, 0, 0, - 0, 0, 0, 112372, 0, 0, 0, 0, 0, 0, 0, 112380, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112388, 0, 112396, - 112403, 0, 0, 112410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112418, 112428, - 112433, 112437, 0, 0, 112442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 112445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112449, 112455, - 112461, 112467, 112471, 112477, 112483, 112489, 112495, 112501, 112507, - 112513, 112519, 112525, 112531, 112537, 112543, 112549, 112555, 112561, - 112567, 112573, 112579, 112585, 112591, 112597, 112603, 112609, 112615, - 112621, 112627, 112633, 112639, 112645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 112651, 112662, 112673, 112684, 112695, 112706, 112717, 112728, - 112739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 121729, 121733, 121737, 121742, 121747, 0, 121749, 121758, + 121766, 121775, 121789, 121803, 121817, 121824, 121831, 121835, 121844, + 121852, 121856, 121865, 121872, 121876, 0, 121880, 121884, 121891, 0, + 121895, 0, 121899, 0, 121906, 0, 121915, 121927, 121939, 0, 121943, + 121947, 121951, 121955, 121959, 121967, 0, 0, 121975, 121979, 121983, + 121987, 0, 121991, 0, 0, 121997, 122009, 122017, 122021, 0, 122025, + 122029, 122035, 122042, 122053, 122063, 122074, 122085, 122094, 122105, + 122111, 122117, 0, 0, 0, 0, 122123, 122132, 122139, 122145, 122149, + 122153, 122157, 122166, 122178, 122182, 122189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 112750, 112754, 112758, 112762, 112766, - 112770, 112774, 112778, 112782, 112786, 112790, 112794, 112798, 112802, - 112806, 112810, 112814, 112818, 112822, 112826, 112830, 112834, 112838, - 112842, 112846, 112850, 112854, 112858, 112862, 112866, 112870, 112874, - 112878, 112882, 112886, 112890, 112894, 112898, 112902, 112906, 112910, - 112914, 112918, 112922, 112926, 112930, 112934, 112938, 112942, 112946, - 112950, 112954, 112958, 112962, 112966, 112970, 112974, 112978, 112982, - 112986, 112990, 112994, 112998, 113002, 113006, 113010, 113014, 113018, - 113022, 113026, 113030, 113034, 113038, 113042, 113046, 113050, 113054, - 113058, 113062, 113066, 113070, 113074, 113078, 113082, 113086, 113090, - 113094, 113098, 113102, 113106, 113110, 113114, 113118, 113122, 113126, - 113130, 113134, 113138, 113142, 113146, 113150, 113154, 113158, 113162, - 113166, 113170, 113174, 113178, 113182, 113186, 113190, 113194, 113198, - 113202, 113206, 113210, 113214, 113218, 113222, 113226, 113230, 113234, - 113238, 113242, 113246, 113250, 113254, 113258, 113262, 113266, 113270, - 113274, 113278, 113282, 113286, 113290, 113294, 113298, 113302, 113306, - 113310, 113314, 113318, 113322, 113326, 113330, 113334, 113338, 113342, - 113346, 113350, 113354, 113358, 113362, 113366, 113370, 113374, 113378, - 113382, 113386, 113390, 113394, 113398, 113402, 113406, 113410, 113414, - 113418, 113422, 113426, 113430, 113434, 113438, 113442, 113446, 113450, - 113454, 113458, 113462, 113466, 113470, 113474, 113478, 113482, 113486, - 113490, 113494, 113498, 113502, 113506, 113510, 113514, 113518, 113522, - 113526, 113530, 113534, 113538, 113542, 113546, 113550, 113554, 113558, - 113562, 113566, 113570, 113574, 113578, 113582, 113586, 113590, 113594, - 113598, 113602, 113606, 113610, 113614, 113618, 113622, 113626, 113630, - 113634, 113638, 113642, 113646, 113650, 113654, 113658, 113662, 113666, - 113670, 113674, 113678, 113682, 113686, 113690, 113694, 113698, 113702, - 113706, 113710, 113714, 113718, 113722, 113726, 113730, 113734, 113738, - 113742, 113746, 113750, 113754, 113758, 113762, 113766, 113770, 113774, - 113778, 113782, 113786, 113790, 113794, 113798, 113802, 113806, 113810, - 113814, 113818, 113822, 113826, 113830, 113834, 113838, 113842, 113846, - 113850, 113854, 113858, 113862, 113866, 113870, 113874, 113878, 113882, - 113886, 113890, 113894, 113898, 113902, 113906, 113910, 113914, 113918, - 113922, 113926, 113930, 113934, 113938, 113942, 113946, 113950, 113954, - 113958, 113962, 113966, 113970, 113974, 113978, 113982, 113986, 113990, - 113994, 113998, 114002, 114006, 114010, 114014, 114018, 114022, 114026, - 114030, 114034, 114038, 114042, 114046, 114050, 114054, 114058, 114062, - 114066, 114070, 114074, 114078, 114082, 114086, 114090, 114094, 114098, - 114102, 114106, 114110, 114114, 114118, 114122, 114126, 114130, 114134, - 114138, 114142, 114146, 114150, 114154, 114158, 114162, 114166, 114170, - 114174, 114178, 114182, 114186, 114190, 114194, 114198, 114202, 114206, - 114210, 114214, 114218, 114222, 114226, 114230, 114234, 114238, 114242, - 114246, 114250, 114254, 114258, 114262, 114266, 114270, 114274, 114278, - 114282, 114286, 114290, 114294, 114298, 114302, 114306, 114310, 114314, - 114318, 114322, 114326, 114330, 114334, 114338, 114342, 114346, 114350, - 114354, 114358, 114362, 114366, 114370, 114374, 114378, 114382, 114386, - 114390, 114394, 114398, 114402, 114406, 114410, 114414, 114418, 114422, - 114426, 114430, 114434, 114438, 114442, 114446, 114450, 114454, 114458, - 114462, 114466, 114470, 114474, 114478, 114482, 114486, 114490, 114494, - 114498, 114502, 114506, 114510, 114514, 114518, 114522, 114526, 114530, - 114534, 114538, 114542, 114546, 114550, 114554, 114558, 114562, 114566, - 114570, 114574, 114578, 114582, 114586, 114590, 114594, 114598, 114602, - 114606, 114610, 114614, 114618, 114622, 114626, 114630, 114634, 114638, - 114642, 114646, 114650, 114654, 114658, 114662, 114666, 114670, 114674, - 114678, 114682, 114686, 114690, 114694, 114698, 114702, 114706, 114710, - 114714, 114718, 114722, 114726, 114730, 114734, 114738, 114742, 114746, - 114750, 114754, 114758, 114762, 114766, 114770, 114774, 114778, 114782, - 114786, 114790, 114794, 114798, 114802, 114806, 114810, 114814, 114818, - 114822, 114826, 114830, 114834, 114838, 114842, 114846, 114850, 114854, - 114858, 114862, 114866, 114870, 114874, 114878, 114882, 114886, 114890, - 114894, 114898, 114902, 114906, 114910, 114914, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122196, 122198, 122200, + 122204, 122208, 122212, 122221, 122223, 122225, 122228, 122230, 122232, + 122236, 122238, 122242, 122244, 122248, 122250, 122252, 122256, 122260, + 122266, 122268, 122272, 122274, 122278, 122282, 122286, 122290, 122292, + 122294, 122298, 122302, 122306, 122310, 122312, 122314, 122316, 122321, + 122326, 122329, 122337, 122345, 122347, 122352, 122355, 122360, 122371, + 122378, 122383, 122388, 122390, 122394, 122396, 122400, 122402, 122406, + 122410, 122413, 122416, 122418, 122421, 122423, 122427, 122429, 122431, + 122433, 122437, 122439, 122443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122446, + 122451, 122456, 122461, 122466, 122471, 122476, 122483, 122490, 122497, + 122504, 122509, 122514, 122519, 122524, 122531, 122537, 122544, 122551, + 122558, 122563, 122568, 122573, 122578, 122583, 122590, 122597, 122602, + 122607, 122614, 122621, 122629, 122637, 122644, 122651, 122659, 122667, + 122675, 122682, 122692, 122703, 122708, 122715, 122722, 122729, 122737, + 122745, 122756, 122764, 122772, 122780, 122785, 122790, 122795, 122800, + 122805, 122810, 122815, 122820, 122825, 122830, 122835, 122840, 122847, + 122852, 122857, 122864, 122869, 122874, 122879, 122884, 122889, 122894, + 122899, 122904, 122909, 122914, 122919, 122924, 122931, 122939, 122944, + 122949, 122956, 122961, 122966, 122971, 122978, 122983, 122990, 122995, + 123002, 123007, 123016, 123025, 123030, 123035, 123040, 123045, 123050, + 123055, 123060, 123065, 123070, 123075, 123080, 123085, 123090, 123098, + 123106, 123111, 123116, 123121, 123126, 123131, 123137, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 123143, 123147, 123151, 123155, 123159, 123163, 123167, + 123171, 123175, 123179, 123183, 123187, 123191, 123195, 123199, 123203, + 123207, 123211, 123215, 123219, 123223, 123227, 123231, 123235, 123239, + 123243, 123247, 123251, 123255, 123259, 123263, 123267, 123271, 123275, + 123279, 123283, 123287, 123291, 123295, 123299, 123303, 123307, 123311, + 123315, 123319, 123323, 123327, 123331, 123335, 123339, 123343, 123347, + 123351, 123355, 123359, 123363, 123367, 123371, 123375, 123379, 123383, + 123387, 123391, 123395, 123399, 123403, 123407, 123411, 123415, 123419, + 123423, 123427, 123431, 123435, 123439, 123443, 123447, 123451, 123455, + 123459, 123463, 123467, 123471, 123475, 123479, 123483, 123487, 123491, + 123495, 123499, 123503, 123507, 123511, 123515, 123519, 123523, 123527, + 123531, 123535, 123539, 123543, 123547, 123551, 123555, 123559, 123563, + 123567, 123571, 123575, 123579, 123583, 123587, 123591, 123595, 123599, + 123603, 123607, 123611, 123615, 123619, 123623, 123627, 123631, 123635, + 123639, 123643, 123647, 123651, 123655, 123659, 123663, 123667, 123671, + 123675, 123679, 123683, 123687, 123691, 123695, 123699, 123703, 123707, + 123711, 123715, 123719, 123723, 123727, 123731, 123735, 123739, 123743, + 123747, 123751, 123755, 123759, 123763, 123767, 123771, 123775, 123779, + 123783, 123787, 123791, 123795, 123799, 123803, 123807, 123811, 123815, + 123819, 123823, 123827, 123831, 123835, 123839, 123843, 123847, 123851, + 123855, 123859, 123863, 123867, 123871, 123875, 123879, 123883, 123887, + 123891, 123895, 123899, 123903, 123907, 123911, 123915, 123919, 123923, + 123927, 123931, 123935, 123939, 123943, 123947, 123951, 123955, 123959, + 123963, 123967, 123971, 123975, 123979, 123983, 123987, 123991, 123995, + 123999, 124003, 124007, 124011, 124015, 124019, 124023, 124027, 124031, + 124035, 124039, 124043, 124047, 124051, 124055, 124059, 124063, 124067, + 124071, 124075, 124079, 124083, 124087, 124091, 124095, 124099, 124103, + 124107, 124111, 124115, 124119, 124123, 124127, 124131, 124135, 124139, + 124143, 124147, 124151, 124155, 124159, 124163, 124167, 124171, 124175, + 124179, 124183, 124187, 124191, 124195, 124199, 124203, 124207, 124211, + 124215, 124219, 124223, 124227, 124231, 124235, 124239, 124243, 124247, + 124251, 124255, 124259, 124263, 124267, 124271, 124275, 124279, 124283, + 124287, 124291, 124295, 124299, 124303, 124307, 124311, 124315, 124319, + 124323, 124327, 124331, 124335, 124339, 124343, 124347, 124351, 124355, + 124359, 124363, 124367, 124371, 124375, 124379, 124383, 124387, 124391, + 124395, 124399, 124403, 124407, 124411, 124415, 124419, 124423, 124427, + 124431, 124435, 124439, 124443, 124447, 124451, 124455, 124459, 124463, + 124467, 124471, 124475, 124479, 124483, 124487, 124491, 124495, 124499, + 124503, 124507, 124511, 124515, 124519, 124523, 124527, 124531, 124535, + 124539, 124543, 124547, 124551, 124555, 124559, 124563, 124567, 124571, + 124575, 124579, 124583, 124587, 124591, 124595, 124599, 124603, 124607, + 124611, 124615, 124619, 124623, 124627, 124631, 124635, 124639, 124643, + 124647, 124651, 124655, 124659, 124663, 124667, 124671, 124675, 124679, + 124683, 124687, 124691, 124695, 124699, 124703, 124707, 124711, 124715, + 124719, 124723, 124727, 124731, 124735, 124739, 124743, 124747, 124751, + 124755, 124759, 124763, 124767, 124771, 124775, 124779, 124783, 124787, + 124791, 124795, 124799, 124803, 124807, 124811, 124815, 124819, 124823, + 124827, 124831, 124835, 124839, 124843, 124847, 124851, 124855, 124859, + 124863, 124867, 124871, 124875, 124879, 124883, 124887, 124891, 124895, + 124899, 124903, 124907, 124911, 124915, 124919, 124923, 124927, 124931, + 124935, 124939, 124943, 124947, 124951, 124955, 124959, 124963, 124967, + 124971, 124975, 124979, 124983, 124987, 124991, 124995, 124999, 125003, + 125007, 125011, 125015, 125019, 125023, 125027, 125031, 125035, 125039, + 125043, 125047, 125051, 125055, 125059, 125063, 125067, 125071, 125075, + 125079, 125083, 125087, 125091, 125095, 125099, 125103, 125107, 125111, + 125115, 125119, 125123, 125127, 125131, 125135, 125139, 125143, 125147, + 125151, 125155, 125159, 125163, 125167, 125171, 125175, 125179, 125183, + 125187, 125191, 125195, 125199, 125203, 125207, 125211, 125215, 125219, + 125223, 125227, 125231, 125235, 125239, 125243, 125247, 125251, 125255, + 125259, 125263, 125267, 125271, 125275, 125279, 125283, 125287, 125291, + 125295, 125299, 125303, 125307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 114922, 114925, 114929, 114933, 114936, 114940, 114944, 114947, - 114950, 114954, 114958, 114961, 114964, 114967, 114970, 114975, 114978, - 114982, 114985, 114988, 114991, 114994, 114997, 115000, 115003, 115006, - 115009, 115012, 115015, 115019, 115023, 115027, 115031, 115036, 115041, - 115047, 115053, 115059, 115064, 115070, 115076, 115082, 115087, 115093, - 115099, 115104, 115109, 115114, 115119, 115125, 115131, 115136, 115141, - 115147, 115152, 115158, 115164, 115170, 115176, 115182, 115186, 115191, - 115195, 115200, 115204, 115209, 115214, 115220, 115226, 115232, 115237, - 115243, 115249, 115255, 115260, 115266, 115272, 115277, 115282, 115287, - 115292, 115298, 115304, 115309, 115314, 115320, 115325, 115331, 115337, - 115343, 115349, 115355, 115360, 115364, 115369, 115372, 115376, 115379, - 115382, 115385, 115388, 115391, 115394, 115397, 115400, 115403, 115406, - 115409, 115412, 115415, 115418, 115421, 115424, 115427, 115430, 115433, - 115436, 115439, 115442, 115445, 115448, 115451, 115454, 115457, 115460, - 115463, 115466, 115469, 115472, 115475, 115478, 115481, 115484, 115487, - 115490, 115493, 115496, 115499, 115502, 115505, 115508, 115511, 115514, - 115517, 115520, 115523, 115526, 115529, 115532, 115535, 115538, 115541, - 115544, 115547, 115550, 115553, 115556, 115559, 115562, 115565, 115568, - 115571, 115574, 115577, 115580, 115583, 115586, 115589, 115592, 115595, - 115598, 115601, 115604, 115607, 115610, 115613, 115616, 115619, 115622, - 115625, 115628, 115631, 115634, 115637, 115640, 115643, 115646, 115649, - 115652, 115655, 115658, 115661, 115664, 115667, 115670, 115673, 115676, - 115679, 115682, 115685, 115688, 115691, 115694, 115697, 115700, 115703, - 115706, 115709, 115712, 115715, 115718, 115721, 115724, 115727, 115730, - 115733, 115736, 115739, 115742, 115745, 115748, 115751, 115754, 115757, - 115760, 115763, 115766, 115769, 115772, 115775, 115778, 115781, 115784, - 115787, 115790, 115793, 115796, 115799, 115802, 115805, 115808, 115811, - 115814, 115817, 115820, 115823, 115826, 115829, 115832, 115835, 115838, - 115841, 115844, 115847, 115850, 115853, 115856, 115859, 115862, 115865, - 115868, 115871, 115874, 115877, 115880, 115883, 115886, 115889, 115892, - 115895, 115898, 115901, 115904, 115907, 115910, 115913, 115916, 115919, - 115922, 115925, 115928, 115931, 115934, 115937, 115940, 115943, 115946, - 115949, 115952, 115955, 115958, 115961, 115964, 115967, 115970, 115973, - 115976, 115979, 115982, 115985, 115988, 115991, 115994, 115997, 116000, - 116003, 116006, 116009, 116012, 116015, 116018, 116021, 116024, 116027, - 116030, 116033, 116036, 116039, 116042, 116045, 116048, 116051, 116054, - 116057, 116060, 116063, 116066, 116069, 116072, 116075, 116078, 116081, - 116084, 116087, 116090, 116093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125311, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125315, + 125318, 125322, 125326, 125329, 125333, 125337, 125340, 125343, 125347, + 125351, 125354, 125357, 125360, 125363, 125368, 125371, 125375, 125378, + 125381, 125384, 125387, 125390, 125393, 125396, 125399, 125402, 125405, + 125408, 125412, 125416, 125420, 125424, 125429, 125434, 125440, 125446, + 125452, 125457, 125463, 125469, 125475, 125480, 125486, 125492, 125497, + 125502, 125507, 125512, 125518, 125524, 125529, 125534, 125540, 125545, + 125551, 125557, 125563, 125569, 125575, 125579, 125584, 125588, 125593, + 125597, 125602, 125607, 125613, 125619, 125625, 125630, 125636, 125642, + 125648, 125653, 125659, 125665, 125670, 125675, 125680, 125685, 125691, + 125697, 125702, 125707, 125713, 125718, 125724, 125730, 125736, 125742, + 125748, 125753, 125757, 125762, 125765, 125769, 125772, 125775, 125778, + 125781, 125784, 125787, 125790, 125793, 125796, 125799, 125802, 125805, + 125808, 125811, 125814, 125817, 125820, 125823, 125826, 125829, 125832, + 125835, 125838, 125841, 125844, 125847, 125850, 125853, 125856, 125859, + 125862, 125865, 125868, 125871, 125874, 125877, 125880, 125883, 125886, + 125889, 125892, 125895, 125898, 125901, 125904, 125907, 125910, 125913, + 125916, 125919, 125922, 125925, 125928, 125931, 125934, 125937, 125940, + 125943, 125946, 125949, 125952, 125955, 125958, 125961, 125964, 125967, + 125970, 125973, 125976, 125979, 125982, 125985, 125988, 125991, 125994, + 125997, 126000, 126003, 126006, 126009, 126012, 126015, 126018, 126021, + 126024, 126027, 126030, 126033, 126036, 126039, 126042, 126045, 126048, + 126051, 126054, 126057, 126060, 126063, 126066, 126069, 126072, 126075, + 126078, 126081, 126084, 126087, 126090, 126093, 126096, 126099, 126102, + 126105, 126108, 126111, 126114, 126117, 126120, 126123, 126126, 126129, + 126132, 126135, 126138, 126141, 126144, 126147, 126150, 126153, 126156, + 126159, 126162, 126165, 126168, 126171, 126174, 126177, 126180, 126183, + 126186, 126189, 126192, 126195, 126198, 126201, 126204, 126207, 126210, + 126213, 126216, 126219, 126222, 126225, 126228, 126231, 126234, 126237, + 126240, 126243, 126246, 126249, 126252, 126255, 126258, 126261, 126264, + 126267, 126270, 126273, 126276, 126279, 126282, 126285, 126288, 126291, + 126294, 126297, 126300, 126303, 126306, 126309, 126312, 126315, 126318, + 126321, 126324, 126327, 126330, 126333, 126336, 126339, 126342, 126345, + 126348, 126351, 126354, 126357, 126360, 126363, 126366, 126369, 126372, + 126375, 126378, 126381, 126384, 126387, 126390, 126393, 126396, 126399, + 126402, 126405, 126408, 126411, 126414, 126417, 126420, 126423, 126426, + 126429, 126432, 126435, 126438, 126441, 126444, 126447, 126450, 126453, + 126456, 126459, 126462, 126465, 126468, 126471, 126474, 126477, 126480, + 126483, 126486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /* name->code dictionary */ static unsigned int code_hash[] = { - 74224, 4851, 0, 78156, 78499, 0, 7929, 0, 194682, 0, 78500, 66480, 0, - 42833, 74529, 12064, 0, 596, 0, 0, 13192, 8651, 0, 0, 120218, 12995, - 64865, 1373, 0, 0, 5816, 119067, 64810, 4231, 6825, 0, 4233, 4234, 4232, - 917836, 74415, 120210, 6384, 917840, 78108, 8851, 0, 0, 0, 41601, 8874, - 0, 7748, 0, 0, 0, 0, 41603, 9784, 0, 9188, 41600, 0, 120618, 0, 1457, - 3535, 0, 0, 0, 0, 65240, 11951, 0, 3404, 0, 0, 0, 1759, 0, 41076, 68383, - 120572, 119205, 66577, 0, 0, 65859, 0, 7404, 0, 0, 0, 0, 65908, 9834, - 3055, 9852, 0, 65288, 0, 11398, 0, 0, 119255, 0, 0, 603, 74398, 43548, 0, - 0, 917824, 3350, 120817, 64318, 917828, 127089, 3390, 74483, 43265, - 120599, 917830, 78573, 0, 1919, 3400, 0, 917813, 0, 917540, 66446, 64141, - 8562, 64139, 64138, 4043, 8712, 64134, 64133, 11297, 0, 0, 11966, 64128, - 0, 0, 0, 64132, 10867, 64130, 64129, 0, 43374, 9779, 2764, 66002, 10167, - 9471, 0, 66021, 0, 0, 5457, 5440, 8857, 0, 65282, 2843, 5355, 0, 0, 0, - 5194, 11657, 43984, 0, 0, 0, 0, 0, 127027, 10717, 64570, 5630, 74350, - 64143, 10682, 0, 10602, 800, 42499, 66186, 0, 0, 64930, 11631, 64146, - 64145, 64144, 762, 13172, 118859, 194661, 64468, 10906, 1353, 6960, 0, 0, - 5828, 8724, 917806, 8933, 1601, 42244, 858, 7080, 64109, 64108, 8090, 0, - 74401, 917811, 587, 0, 0, 0, 0, 0, 78214, 2750, 0, 556, 64158, 64157, 0, - 12213, 194678, 2760, 0, 0, 0, 0, 64156, 64155, 42496, 0, 64151, 64150, - 12679, 10053, 10421, 11093, 64153, 64152, 0, 0, 4839, 0, 0, 1874, 119016, - 0, 6577, 64125, 64124, 64123, 0, 0, 0, 7007, 7590, 65443, 9036, 0, 64122, - 74422, 66609, 0, 64117, 64116, 6287, 64114, 2725, 64120, 64119, 43981, - 42128, 0, 1177, 65601, 12322, 64106, 0, 127306, 64102, 7859, 1945, 64099, - 0, 10453, 64104, 7188, 7997, 0, 7389, 0, 8705, 64097, 64096, 9571, 528, - 917989, 44017, 11429, 0, 0, 0, 917990, 73841, 0, 0, 9056, 0, 6188, - 120019, 6155, 64068, 1823, 64066, 64065, 64072, 64071, 63, 7233, 120698, - 0, 41904, 6639, 64064, 0, 0, 0, 1176, 118959, 0, 8162, 0, 0, 0, 120519, - 66376, 66242, 11415, 4333, 9855, 64112, 64642, 0, 5388, 0, 0, 0, 7714, - 66222, 0, 7768, 0, 4199, 64708, 0, 0, 0, 8708, 9560, 64077, 64076, 8996, - 4992, 4471, 42622, 64079, 64078, 0, 0, 0, 0, 64615, 0, 0, 12075, 0, 0, - 5174, 0, 0, 127557, 3123, 0, 12685, 0, 8408, 64704, 0, 0, 9223, 0, 41616, - 0, 73797, 0, 1116, 0, 43049, 0, 43050, 8548, 120485, 0, 119061, 917999, - 0, 13115, 43675, 64091, 9322, 0, 120595, 64095, 64094, 8111, 66247, - 42332, 64089, 64088, 6199, 0, 0, 11434, 64083, 64082, 11329, 7737, 64087, - 64086, 64085, 64084, 0, 9927, 41335, 4118, 1797, 0, 41334, 0, 46, 43448, - 0, 298, 0, 0, 0, 42627, 0, 32, 6187, 119052, 11495, 11459, 3665, 0, - 42871, 0, 19923, 74335, 0, 0, 66239, 0, 64403, 4412, 7240, 0, 0, 0, - 65758, 12750, 4181, 8544, 0, 120199, 917897, 120198, 120203, 6181, 65014, - 0, 0, 0, 3639, 119588, 0, 0, 0, 10073, 120206, 0, 0, 68409, 42844, 7498, - 1098, 0, 0, 0, 0, 10207, 8789, 0, 0, 0, 0, 9234, 0, 6182, 0, 65058, 0, 0, - 0, 0, 5471, 9461, 5573, 118936, 5473, 44, 0, 66244, 118907, 0, 66238, - 12844, 0, 1622, 7767, 1900, 41339, 11458, 0, 0, 6581, 5576, 0, 64405, - 41337, 0, 41631, 8947, 68390, 0, 41694, 0, 0, 7908, 0, 10408, 6579, 0, - 64618, 0, 120147, 0, 6583, 7761, 127010, 120504, 194828, 0, 5058, 41010, - 9992, 0, 5057, 0, 0, 74538, 5054, 118951, 194971, 78606, 0, 1437, 41617, - 658, 3497, 0, 7486, 5061, 5060, 4235, 0, 0, 0, 12113, 4236, 4727, 0, 0, - 7693, 10749, 0, 7488, 5773, 978, 0, 0, 41619, 10239, 68611, 0, 66209, 0, - 0, 9748, 0, 127524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9341, 119596, - 2379, 11325, 0, 64668, 67854, 8125, 120545, 6743, 119175, 917940, 2369, - 0, 0, 0, 119235, 74092, 73936, 7008, 43660, 0, 0, 0, 2367, 0, 0, 264, - 2375, 8060, 6194, 119858, 1844, 119084, 0, 12858, 0, 0, 6961, 0, 118839, - 0, 8800, 0, 42862, 4463, 65581, 6192, 194676, 42771, 0, 0, 725, 65042, - 118797, 120800, 0, 12892, 0, 0, 0, 0, 0, 0, 0, 120707, 0, 0, 5074, 5073, - 0, 8983, 0, 74493, 0, 5072, 0, 6198, 11614, 0, 196, 0, 0, 0, 4929, - 120342, 0, 0, 0, 0, 42847, 0, 0, 0, 4934, 0, 41323, 9758, 0, 120341, 0, - 42584, 0, 4329, 41321, 4979, 3048, 7752, 41320, 0, 74418, 12819, 0, 5071, - 0, 3642, 0, 5070, 10042, 118835, 3987, 5068, 0, 8909, 78650, 78649, 0, - 10636, 73981, 11806, 43167, 4531, 1245, 9105, 66463, 4921, 120219, 4926, - 65544, 73884, 194619, 0, 0, 64709, 0, 194620, 78880, 4922, 325, 992, - 119568, 4925, 0, 0, 9526, 4920, 0, 948, 0, 120208, 4930, 0, 0, 120275, - 4933, 0, 0, 118985, 4928, 0, 0, 74770, 120194, 0, 722, 0, 19908, 12637, - 0, 119855, 8753, 1509, 0, 5468, 9511, 0, 0, 1672, 6205, 10864, 74586, 0, - 0, 0, 0, 0, 73863, 0, 0, 41607, 120115, 1679, 120116, 120180, 120113, 0, - 7005, 41609, 9580, 0, 401, 0, 120109, 6968, 5761, 342, 8553, 0, 8143, - 127115, 11983, 127113, 624, 74508, 0, 119630, 5078, 74258, 12478, 0, - 5076, 0, 194609, 0, 120097, 685, 9025, 1524, 12618, 0, 5539, 0, 120095, - 120102, 120094, 120552, 0, 194611, 78752, 0, 12520, 8058, 9732, 0, 5080, + 74224, 4851, 0, 78156, 78499, 128685, 7929, 0, 194682, 127766, 78500, + 66480, 0, 42833, 74529, 12064, 0, 596, 0, 128103, 13192, 8651, 0, 0, + 120218, 12995, 64865, 1373, 0, 0, 5816, 119067, 64810, 4231, 6825, 42897, + 4233, 4234, 4232, 917836, 74415, 120210, 6384, 917840, 78108, 8851, 0, + 128553, 0, 41601, 8874, 0, 7748, 0, 0, 0, 127939, 41603, 9784, 0, 9188, + 41600, 0, 120618, 128343, 1457, 3535, 0, 0, 0, 0, 65240, 11951, 0, 3404, + 0, 0, 0, 1759, 0, 41076, 68383, 120572, 119205, 66577, 0, 127764, 65859, + 0, 7404, 0, 0, 0, 0, 65908, 9834, 3055, 9852, 0, 65288, 0, 11398, 0, + 92417, 119255, 0, 0, 603, 74398, 43548, 0, 0, 917824, 3350, 120817, + 64318, 917828, 127089, 3390, 74483, 43265, 120599, 917830, 78573, 0, + 1919, 3400, 120651, 127944, 11647, 917540, 66446, 64141, 8562, 2121, + 64138, 4043, 8712, 64134, 64133, 11297, 0, 0, 11966, 64128, 128587, 0, 0, + 64132, 10867, 64130, 64129, 0, 43374, 9779, 2764, 66002, 10167, 9471, 0, + 66021, 0, 0, 5457, 5440, 8857, 128771, 65282, 2843, 5355, 127928, 0, 0, + 5194, 11657, 43984, 128292, 0, 0, 0, 0, 127027, 10717, 64570, 5630, + 74350, 64143, 10682, 0, 10602, 800, 42499, 66186, 0, 0, 64930, 11631, + 64146, 64145, 64144, 762, 13172, 118859, 194661, 64468, 10906, 1353, + 6960, 0, 0, 5828, 8724, 917806, 8933, 1601, 42244, 858, 7080, 64109, + 64108, 8090, 0, 74401, 917811, 587, 0, 128131, 0, 0, 0, 78214, 2750, + 74218, 556, 64158, 64157, 0, 12213, 194678, 2760, 0, 0, 0, 194794, 64156, + 64155, 42496, 0, 64151, 64150, 12679, 10053, 10421, 11093, 64153, 64152, + 0, 0, 4839, 0, 0, 1874, 119016, 0, 6577, 64125, 64124, 64123, 0, 127531, + 92534, 7007, 7590, 65443, 9036, 92550, 64122, 74422, 66609, 0, 64117, + 64116, 6287, 64114, 2725, 64120, 64119, 43981, 42128, 127842, 1177, + 65601, 12322, 64106, 69640, 127306, 64102, 7859, 1945, 64099, 0, 10453, + 64104, 7188, 7997, 0, 7389, 0, 8705, 64097, 64096, 9571, 528, 128671, + 44017, 11429, 0, 0, 0, 917990, 73841, 0, 0, 9056, 64313, 6188, 120019, + 6155, 64068, 1823, 64066, 64065, 64072, 64071, 63, 7233, 92212, 0, 41904, + 6639, 64064, 0, 128344, 0, 1176, 118959, 127930, 8162, 128667, 0, 0, + 120519, 66376, 66242, 11415, 4333, 9855, 64112, 64642, 0, 5388, 0, 0, 0, + 7714, 66222, 0, 7768, 0, 4199, 64708, 0, 0, 0, 8708, 9560, 64077, 64076, + 8996, 4992, 4471, 42622, 64079, 64078, 92179, 0, 0, 0, 64615, 41915, 0, + 12075, 92211, 0, 5174, 0, 0, 127557, 3123, 0, 12685, 127904, 8408, 64704, + 0, 0, 9223, 0, 41616, 0, 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, 0, 11434, 64083, + 64082, 11329, 7737, 64087, 64086, 64085, 64084, 194817, 9927, 41335, + 4118, 1797, 0, 41334, 0, 46, 43448, 127881, 298, 0, 128114, 0, 42627, 0, + 32, 6187, 119052, 11495, 11459, 3665, 0, 42871, 0, 19923, 74335, 0, + 127192, 66239, 42264, 64403, 4412, 7240, 92495, 0, 0, 65758, 12750, 4181, + 8544, 0, 120199, 917897, 120198, 69809, 6181, 65014, 0, 0, 0, 3639, + 119588, 0, 0, 118904, 10073, 120206, 128862, 127186, 68409, 42844, 7498, + 1098, 92565, 120205, 0, 0, 10207, 8789, 0, 0, 0, 0, 9234, 0, 6182, 0, + 65058, 0, 0, 0, 0, 5471, 9461, 5573, 118936, 5473, 44, 0, 66244, 118907, + 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, 0, 120147, 2138, 6583, 7761, 127010, 120504, 194828, 0, + 5058, 41010, 9992, 128299, 5057, 0, 0, 74538, 5054, 118951, 194971, + 78606, 0, 1437, 41617, 658, 3497, 128509, 7486, 5061, 5060, 4235, 0, 0, + 0, 12113, 4236, 4727, 0, 0, 7693, 10749, 0, 7488, 5773, 978, 128134, 0, + 41619, 10239, 68611, 0, 66209, 0, 128700, 9748, 0, 127524, 0, 0, 0, 0, + 195083, 0, 0, 0, 0, 0, 0, 0, 9341, 119596, 2379, 11325, 0, 64668, 67854, + 8125, 120545, 6743, 119175, 917940, 2369, 0, 0, 0, 119235, 74092, 73936, + 7008, 43660, 0, 0, 0, 2367, 127827, 0, 264, 2375, 8060, 6194, 119858, + 1844, 119084, 0, 6019, 0, 0, 6961, 0, 118839, 0, 8800, 0, 42862, 4463, + 65581, 6192, 194676, 42771, 0, 92333, 725, 65042, 118797, 120800, 0, + 12892, 0, 0, 0, 0, 0, 0, 127261, 120707, 0, 0, 5074, 5073, 128790, 8983, + 118981, 74493, 0, 5072, 128071, 6198, 11614, 0, 196, 0, 0, 0, 4929, + 120342, 0, 0, 0, 0, 42847, 0, 0, 0, 4934, 0, 41323, 9758, 0, 92289, + 127917, 42584, 0, 4329, 41321, 4979, 3048, 7752, 41320, 0, 74418, 12819, + 0, 5071, 0, 3642, 0, 5070, 10042, 118835, 3987, 5068, 0, 8909, 78650, + 78649, 0, 10636, 73981, 11806, 43167, 4531, 1245, 9105, 66463, 4921, + 120219, 4926, 65544, 73884, 194619, 0, 0, 64709, 0, 194620, 78880, 4922, + 325, 992, 119568, 4925, 0, 0, 9526, 4920, 0, 948, 0, 120208, 4930, 0, + 92175, 120275, 4933, 0, 0, 118985, 4928, 0, 0, 74770, 120194, 0, 722, + 194934, 19908, 12637, 127485, 119855, 8753, 1509, 0, 5468, 9511, 127474, + 127477, 1672, 6205, 10864, 74586, 127480, 92310, 127466, 78555, 127468, + 73863, 127470, 127473, 41607, 120115, 1679, 120116, 120180, 120113, + 127462, 7005, 41609, 9580, 0, 401, 0, 43779, 6968, 5761, 342, 8553, 0, + 8143, 127115, 11983, 92249, 624, 74508, 4057, 43788, 5078, 74258, 12478, + 0, 5076, 0, 194609, 0, 120097, 685, 9025, 1524, 12618, 0, 5539, 0, 92523, + 120102, 7138, 120552, 0, 194611, 78752, 0, 12520, 8058, 9732, 0, 5080, 64775, 5036, 5035, 120590, 42604, 0, 0, 8074, 275, 13291, 1907, 78838, 4432, 127271, 5033, 127273, 127272, 4836, 3888, 73792, 10729, 64546, 127262, 43704, 127264, 127251, 67588, 119000, 127252, 127255, 8858, 6409, - 127256, 120252, 0, 0, 0, 66321, 0, 12814, 127248, 3432, 10218, 0, 6094, - 7641, 42445, 0, 0, 42406, 1676, 74320, 194607, 0, 5030, 0, 0, 0, 0, 9622, - 0, 0, 6787, 0, 0, 0, 0, 10544, 12919, 0, 0, 0, 0, 0, 120789, 0, 947, - 119835, 194586, 194585, 10969, 119935, 7613, 119937, 119936, 4795, - 119930, 7018, 7376, 120181, 120192, 120268, 0, 43567, 74056, 917910, - 118963, 119919, 7216, 65232, 7217, 251, 7218, 7895, 4395, 43538, 119926, - 119929, 119928, 7213, 119922, 7214, 7215, 0, 74141, 8880, 7685, 66459, - 120173, 65540, 119618, 625, 8187, 42861, 1113, 7236, 7915, 3630, 120176, - 8179, 74264, 67886, 9316, 10980, 2489, 65624, 8150, 1359, 67652, 0, 0, - 73756, 5042, 5041, 42769, 12084, 0, 0, 0, 127319, 0, 917906, 0, 0, 12283, - 1616, 3795, 0, 8795, 66245, 0, 0, 0, 1138, 73905, 12677, 0, 0, 3239, 0, - 0, 0, 8431, 0, 42164, 0, 11778, 12620, 6826, 73773, 119073, 5040, 0, 0, - 0, 78420, 0, 5039, 0, 78418, 0, 5038, 0, 0, 13184, 74293, 0, 64648, 0, - 9359, 78416, 0, 0, 65157, 6662, 0, 0, 3863, 73909, 4835, 55266, 43432, 0, - 4309, 0, 194569, 0, 194568, 1301, 0, 42589, 569, 0, 73813, 711, 119085, - 0, 0, 73880, 11610, 11368, 0, 194571, 41331, 1006, 74240, 0, 1550, 8201, + 127256, 120252, 128100, 0, 0, 66321, 0, 12814, 127248, 3432, 10218, 0, + 6094, 7641, 42445, 0, 92487, 42406, 1676, 74320, 194607, 0, 5030, 0, 0, + 0, 73869, 9622, 0, 0, 6787, 0, 0, 0, 0, 10544, 12919, 0, 92218, 0, 0, 0, + 120789, 0, 947, 119835, 194586, 194585, 10969, 119935, 7613, 92562, + 119936, 4795, 119930, 7018, 7376, 120181, 120192, 120268, 0, 43567, + 74056, 917910, 118963, 119919, 7216, 65232, 7217, 251, 7218, 7895, 4395, + 43538, 119926, 119929, 119928, 7213, 119922, 7214, 7215, 0, 74141, 8880, + 7685, 66459, 120173, 65540, 119618, 625, 8187, 42861, 1113, 7236, 7915, + 3630, 120176, 8179, 74264, 67886, 9316, 10980, 2489, 65624, 8150, 1359, + 67652, 127329, 127330, 73756, 5042, 5041, 42769, 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, 0, 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, 194570, 41331, 1006, 74240, 0, 1550, 8201, 73737, 7627, 5499, 5031, 77908, 42738, 65784, 77907, 65267, 3758, 0, - 65781, 64734, 0, 2440, 65780, 77913, 8449, 0, 5008, 0, 8822, 0, 12121, - 8255, 5512, 73875, 119560, 0, 64313, 2641, 5906, 1119, 127068, 13038, 0, - 2455, 0, 118809, 0, 0, 0, 0, 8714, 0, 4211, 0, 0, 0, 0, 43713, 5052, - 66220, 5821, 6186, 65778, 65775, 5051, 65773, 1429, 42647, 5050, 302, - 388, 41115, 735, 6637, 5907, 120670, 0, 12726, 74594, 9117, 0, 195010, - 5513, 6666, 5053, 74230, 5510, 78451, 0, 78447, 2470, 78437, 0, 1925, 0, - 0, 74807, 0, 5048, 5047, 0, 0, 0, 194863, 0, 74497, 0, 8089, 6929, 639, - 0, 68179, 0, 0, 0, 4599, 41402, 6674, 43397, 43294, 1476, 648, 0, 65819, - 3233, 0, 41782, 6951, 0, 0, 3530, 9750, 0, 0, 6656, 194858, 0, 5046, - 8512, 65856, 74261, 8967, 0, 5045, 0, 1916, 7986, 5044, 120556, 9006, - 13128, 5043, 0, 7853, 74068, 74004, 9669, 12341, 12703, 8402, 0, 119070, - 0, 41750, 3586, 64508, 43148, 0, 0, 119606, 0, 13296, 517, 0, 0, 0, - 41528, 123, 65454, 0, 0, 74478, 10531, 7784, 41526, 10829, 73991, 8057, - 1126, 73895, 0, 194591, 0, 3925, 4251, 8069, 10517, 120439, 489, 0, 4250, - 120441, 120452, 43151, 0, 0, 66200, 0, 0, 0, 78423, 0, 0, 8711, 6183, 0, - 0, 0, 120448, 7623, 118925, 194853, 9235, 12760, 74176, 0, 66445, 43540, - 120437, 3743, 11514, 11078, 0, 12136, 0, 0, 120435, 0, 7726, 0, 19922, - 267, 3393, 42198, 1371, 194849, 69233, 2458, 0, 6201, 0, 41074, 4266, - 10652, 41612, 41077, 3402, 9050, 3398, 0, 0, 0, 3391, 41075, 2476, 0, - 917550, 0, 10625, 0, 12767, 13017, 78743, 64261, 64934, 127537, 13014, - 13013, 0, 6673, 0, 0, 0, 12438, 0, 0, 0, 0, 0, 9053, 13015, 74523, 0, - 704, 66215, 6195, 0, 6660, 78758, 917760, 917793, 42212, 12629, 11435, 0, - 55256, 65538, 0, 0, 0, 74547, 0, 65448, 78100, 12948, 119001, 195002, - 119238, 195004, 78099, 127085, 0, 0, 4287, 8276, 4902, 1131, 0, 78458, - 66728, 1816, 0, 42533, 168, 42845, 4898, 64298, 0, 0, 4901, 1821, 0, 578, - 3653, 0, 791, 9162, 6977, 0, 119298, 74561, 0, 73731, 8354, 43590, 0, 0, - 7557, 0, 119301, 8234, 7241, 0, 194994, 119167, 194996, 12811, 65925, - 3946, 78078, 10998, 78080, 673, 194867, 64397, 0, 74599, 78449, 8890, - 194977, 194976, 2448, 78085, 10267, 8424, 2452, 78083, 194864, 8729, - 78456, 0, 7845, 0, 78692, 4408, 4122, 6772, 11039, 8723, 194990, 194989, - 119302, 731, 119304, 119303, 2438, 64855, 119300, 119299, 1175, 0, 42135, - 373, 119172, 5396, 11457, 11521, 7723, 0, 0, 0, 41952, 0, 5273, 8248, - 5269, 6337, 5202, 2404, 5267, 42823, 11291, 19915, 5277, 12963, 0, 6189, - 4125, 1314, 12133, 0, 118873, 1271, 0, 0, 66024, 41482, 3864, 74539, 0, - 3879, 0, 12978, 4166, 4574, 0, 7567, 7459, 0, 41390, 5384, 41882, 67647, - 0, 5759, 0, 0, 41388, 0, 41392, 64288, 41387, 0, 8706, 5552, 0, 700, 0, - 5553, 0, 7088, 5356, 7499, 78110, 66596, 0, 0, 10263, 5554, 0, 12344, - 10311, 78113, 6665, 0, 0, 7618, 8517, 11455, 78440, 64632, 66017, 5555, - 78088, 78093, 78091, 0, 42803, 65033, 9143, 6668, 195067, 195066, 195069, - 656, 195071, 65037, 4577, 64624, 0, 0, 0, 0, 4269, 73885, 917775, 42846, - 917774, 950, 0, 0, 66580, 118895, 66683, 10554, 917778, 119121, 0, 5098, - 917770, 0, 119099, 5097, 4935, 9848, 10381, 0, 917560, 0, 3651, 0, 0, - 127556, 5102, 5101, 10269, 12983, 8138, 4517, 1932, 5100, 1439, 12093, - 1247, 10034, 195064, 5099, 78373, 1441, 42087, 3063, 650, 0, 7838, 0, - 195041, 195040, 119142, 9031, 120790, 195044, 9078, 8545, 66356, 195048, - 0, 9154, 9118, 0, 0, 2676, 7750, 0, 73812, 6190, 8599, 195053, 0, 10795, - 9857, 7014, 9856, 195033, 0, 12129, 0, 8481, 0, 6202, 195035, 10920, - 195037, 5203, 195039, 195038, 5108, 5107, 65818, 66019, 9762, 0, 5541, - 74772, 0, 12613, 5284, 6657, 207, 0, 4275, 74819, 854, 68147, 74381, 0, - 0, 5103, 0, 64348, 41368, 43974, 488, 69811, 0, 0, 10157, 0, 43034, - 11438, 0, 0, 0, 68431, 41771, 5106, 6669, 8504, 65154, 69813, 41367, - 5105, 195030, 69809, 6476, 5104, 0, 304, 3176, 0, 0, 932, 0, 6567, 238, - 74522, 195011, 194595, 19905, 120577, 195015, 120187, 41044, 67640, - 194902, 42055, 9912, 65939, 10670, 74093, 13273, 0, 12552, 195019, 8803, - 309, 6622, 8151, 10858, 194596, 67636, 0, 12568, 0, 12553, 0, 43275, - 6950, 9712, 68680, 43970, 0, 65165, 0, 0, 66466, 0, 0, 0, 66725, 6191, + 65781, 64734, 0, 2440, 65780, 77913, 8449, 0, 5008, 0, 2118, 0, 12121, + 8255, 5512, 73875, 2128, 2130, 2131, 2126, 2133, 1119, 127068, 2114, + 2116, 2455, 0, 2122, 2123, 2124, 2125, 0, 8714, 0, 2113, 0, 2115, 128177, + 127907, 43713, 5052, 66220, 5821, 6186, 65778, 65775, 5051, 65773, 1429, + 42647, 5050, 302, 388, 41115, 735, 6637, 5907, 65088, 0, 12726, 74594, + 9117, 0, 12003, 5513, 6666, 5053, 74230, 5510, 78451, 0, 78447, 2470, + 78437, 0, 1925, 0, 92237, 74807, 0, 5048, 5047, 0, 0, 0, 92313, 0, 74497, + 92395, 8089, 6929, 639, 0, 68179, 64442, 0, 92348, 4599, 41402, 6674, + 43397, 43294, 1476, 648, 0, 65819, 3233, 0, 41782, 6951, 0, 0, 3530, + 9750, 128317, 0, 6656, 92367, 0, 5046, 8512, 65856, 74261, 8967, 0, 5045, + 0, 1916, 7986, 5044, 120556, 9006, 13128, 5043, 0, 7853, 74068, 74004, + 9669, 12341, 12703, 8402, 0, 119070, 917600, 41750, 3586, 64508, 43148, + 0, 0, 119606, 0, 13296, 517, 0, 128534, 194946, 41528, 123, 65454, 0, 0, + 74478, 10531, 7784, 41526, 10829, 73991, 8057, 1126, 73895, 0, 194591, 0, + 3925, 4251, 8069, 10517, 120439, 489, 0, 4250, 120441, 120452, 43151, 0, + 194851, 66200, 0, 0, 0, 78423, 0, 0, 8711, 6183, 0, 0, 0, 120448, 7623, + 118925, 194853, 9235, 12760, 74176, 69662, 66445, 43540, 10062, 3743, + 11514, 11078, 0, 12136, 0, 0, 120435, 0, 7726, 0, 19922, 267, 3393, + 42198, 1371, 194849, 69233, 2458, 0, 6201, 0, 41074, 4266, 10652, 41612, + 41077, 3402, 9050, 3398, 0, 0, 0, 3391, 41075, 2476, 0, 128017, 0, 10625, + 0, 12767, 13017, 78743, 64261, 64934, 127537, 13014, 13013, 0, 6673, 0, + 0, 0, 12438, 0, 0, 0, 0, 0, 9053, 13015, 74523, 0, 704, 66215, 6195, 0, + 6660, 78758, 917760, 917793, 42212, 12629, 11435, 0, 55256, 65538, 0, + 127940, 0, 74547, 0, 65448, 78100, 12948, 119001, 195002, 119238, 195004, + 78099, 127085, 0, 0, 4287, 8276, 4902, 1131, 0, 78458, 66728, 1816, 0, + 42533, 168, 42845, 4898, 64298, 0, 0, 4901, 1821, 0, 578, 3653, 0, 791, + 9162, 6977, 0, 119298, 74561, 0, 73731, 8354, 43590, 119303, 0, 7557, + 119339, 119301, 8234, 7241, 0, 194994, 119167, 194996, 12811, 65925, + 3946, 78078, 10998, 78080, 673, 194867, 64397, 128276, 74599, 78449, + 8890, 194977, 194976, 2448, 78085, 10267, 8424, 2452, 78083, 194864, + 8729, 78456, 0, 7845, 917917, 78692, 4408, 4122, 6772, 11039, 8723, + 194990, 127833, 119302, 731, 119304, 92286, 2438, 64855, 119300, 119299, + 1175, 0, 42135, 373, 119172, 2119, 11457, 11521, 7723, 0, 0, 0, 41952, 0, + 5273, 2127, 5269, 6337, 5202, 2404, 5267, 42823, 11291, 19915, 5277, + 12963, 127864, 6189, 4125, 1314, 12133, 0, 118873, 1271, 0, 0, 66024, + 41482, 3864, 74539, 0, 3879, 0, 12978, 4166, 4574, 0, 7567, 7459, 0, + 41390, 5384, 41882, 67647, 92548, 5759, 0, 0, 41388, 92362, 41392, 64288, + 41387, 0, 8706, 5552, 0, 700, 0, 5553, 0, 7088, 5356, 7499, 78110, 66596, + 0, 0, 10263, 5554, 0, 12344, 10311, 78113, 6665, 0, 0, 7618, 8517, 11455, + 78440, 64632, 64447, 5555, 78088, 78093, 78091, 0, 42803, 65033, 9143, + 6668, 195067, 195066, 195069, 656, 195071, 65037, 4577, 64624, 0, 0, 0, + 0, 4269, 73885, 917775, 42846, 69644, 950, 0, 92273, 66580, 118895, + 66683, 10554, 917778, 119121, 0, 5098, 917770, 0, 119099, 5097, 4935, + 9848, 10381, 0, 128870, 0, 3651, 0, 194610, 127556, 5102, 5101, 10269, + 12983, 8138, 4517, 1932, 5100, 1439, 12093, 1247, 10034, 195064, 5099, + 78373, 1441, 42087, 3063, 650, 0, 7838, 0, 195041, 195040, 119142, 9031, + 120790, 128582, 9078, 8545, 66356, 128799, 0, 9154, 9118, 0, 0, 2676, + 7750, 0, 73812, 6190, 8599, 195053, 0, 10795, 9857, 7014, 9856, 195033, + 92620, 12129, 0, 8481, 0, 6202, 195035, 10920, 128237, 5203, 195039, + 195038, 5108, 5107, 65818, 66019, 9762, 0, 5541, 74772, 0, 12613, 5284, + 6657, 207, 128806, 4275, 74819, 854, 68147, 74381, 0, 0, 5103, 127861, + 64348, 41368, 43974, 488, 69811, 0, 0, 10157, 0, 43034, 11438, 0, 0, + 92694, 68431, 41771, 5106, 6669, 8504, 65154, 69813, 41367, 5105, 195030, + 69720, 6476, 5104, 0, 304, 3176, 0, 0, 932, 128663, 6567, 238, 69656, + 195011, 194595, 19905, 120577, 195015, 78870, 41044, 67640, 194902, + 42055, 9912, 65939, 10670, 74093, 13273, 0, 12552, 195019, 8803, 309, + 6622, 8151, 10858, 194596, 67636, 0, 12568, 0, 12553, 10814, 43275, 6950, + 9712, 68680, 43970, 0, 65165, 92725, 0, 66466, 0, 0, 0, 66725, 6191, 11351, 10437, 11316, 67634, 0, 0, 41754, 67635, 9370, 2720, 194975, 68462, 8232, 118817, 0, 3222, 0, 0, 0, 66663, 0, 0, 10834, 0, 0, 65732, - 0, 917547, 119579, 67679, 195020, 0, 7781, 41383, 64568, 0, 120738, - 12077, 0, 64586, 917620, 42396, 55255, 3475, 0, 2479, 0, 3632, 120728, + 0, 917547, 92682, 67679, 195020, 0, 7781, 41383, 64568, 0, 120738, 12077, + 0, 64586, 917620, 42396, 55255, 3475, 128035, 2479, 0, 3632, 120728, 10698, 8376, 3648, 194960, 74844, 67639, 3636, 67894, 3650, 8837, 65229, - 1843, 42283, 43250, 41562, 9100, 74548, 0, 3640, 0, 42321, 7284, 194974, - 194973, 194950, 194949, 194952, 194951, 0, 194953, 42080, 2529, 0, 0, 0, - 42083, 120678, 68398, 194957, 67619, 66367, 194958, 9634, 0, 9988, 0, - 41068, 0, 0, 65264, 0, 0, 917923, 0, 785, 8236, 194942, 9027, 68160, - 67623, 64383, 0, 925, 0, 0, 41985, 41071, 9586, 0, 41984, 9217, 0, 0, 0, - 9186, 2067, 4016, 0, 0, 381, 0, 0, 42077, 0, 194946, 5184, 42078, 194947, - 10810, 0, 4585, 19943, 5860, 67633, 0, 0, 812, 3615, 0, 5178, 44000, - 120548, 78807, 5188, 74287, 67629, 3605, 10692, 1166, 64429, 42639, 924, - 0, 67631, 0, 0, 2442, 10703, 78789, 67632, 917924, 12771, 12736, 12753, - 0, 73933, 67626, 42401, 0, 0, 127373, 42288, 12751, 0, 8542, 13145, 0, - 2468, 66706, 41294, 3626, 3883, 64388, 42479, 0, 41117, 0, 0, 0, 0, - 67624, 0, 1290, 0, 65585, 2715, 806, 65208, 41884, 917883, 7027, 64731, - 0, 0, 0, 66325, 3465, 2405, 9240, 0, 12756, 65259, 0, 0, 12752, 5833, - 1432, 0, 41883, 73912, 9799, 0, 41886, 2480, 0, 2062, 127293, 6494, 5537, - 78656, 0, 194587, 0, 1211, 0, 0, 0, 118832, 12318, 0, 0, 0, 10622, 0, 0, - 0, 6566, 78659, 0, 73780, 0, 64864, 0, 78660, 0, 8284, 0, 0, 3589, 0, - 4035, 6492, 118981, 4265, 6642, 3977, 74186, 41778, 836, 119216, 2488, 0, - 4582, 0, 0, 41777, 12926, 0, 7528, 10550, 0, 0, 0, 0, 0, 1374, 64878, - 119014, 0, 42389, 41374, 0, 0, 78492, 41377, 0, 0, 400, 12597, 120586, 0, - 0, 6661, 0, 64827, 0, 73817, 390, 0, 74755, 0, 3473, 7718, 0, 0, 0, - 55285, 0, 0, 0, 11969, 0, 0, 6365, 1887, 6763, 0, 8080, 7006, 0, 0, 6757, - 0, 1544, 0, 6766, 64677, 120716, 0, 6146, 0, 771, 0, 0, 12812, 13168, - 42272, 12200, 917927, 7904, 0, 953, 12917, 0, 12300, 0, 11491, 9724, + 1843, 42283, 43250, 41562, 9100, 74548, 917630, 3640, 127190, 42321, + 7284, 194974, 194973, 194950, 194949, 194952, 194951, 0, 194953, 42080, + 2529, 0, 0, 0, 42083, 120678, 68398, 194957, 67619, 66367, 194958, 9634, + 92380, 9988, 0, 41068, 0, 0, 65264, 0, 0, 92545, 0, 785, 8236, 128647, + 9027, 68160, 67623, 64383, 128821, 925, 127156, 0, 41985, 41071, 9586, 0, + 41984, 9217, 0, 0, 0, 9186, 2067, 4016, 0, 0, 381, 0, 0, 42077, 0, + 127483, 5184, 42078, 194947, 10810, 128531, 4585, 19943, 5860, 67633, 0, + 0, 812, 3615, 0, 5178, 44000, 120548, 78807, 5188, 74287, 67629, 3605, + 10692, 1166, 64429, 42639, 924, 0, 67631, 0, 120670, 2442, 10703, 78789, + 67632, 917924, 12771, 12736, 12753, 0, 73933, 67626, 42401, 0, 0, 127373, + 42288, 12751, 0, 8542, 13145, 194963, 2468, 66706, 41294, 3626, 3883, + 64388, 42479, 0, 41117, 0, 92580, 0, 0, 67624, 0, 1290, 0, 65585, 2715, + 806, 65208, 41884, 917883, 1318, 64731, 0, 0, 0, 66325, 3465, 2405, 9240, + 0, 12756, 65259, 0, 0, 12752, 5833, 1432, 0, 41883, 73912, 9799, 0, + 41886, 2480, 0, 2062, 127293, 6494, 5537, 78656, 0, 194587, 0, 1211, 0, + 0, 0, 118832, 12318, 0, 0, 0, 10622, 0, 0, 78654, 6566, 78659, 0, 73780, + 0, 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, 0, 7528, 10550, 0, 92706, 0, 11439, 0, 1374, 64878, 119014, 0, + 42389, 41374, 0, 0, 78492, 41377, 127909, 0, 400, 12597, 120586, 0, 0, + 6661, 0, 64827, 0, 73817, 390, 0, 74755, 0, 3473, 7718, 0, 0, 0, 55285, + 0, 0, 0, 11969, 0, 127841, 6365, 1887, 6763, 0, 8080, 7006, 0, 0, 6757, + 64351, 1544, 0, 6766, 64677, 120716, 0, 6146, 0, 771, 0, 0, 12812, 13168, + 42272, 12200, 917927, 7904, 0, 953, 12917, 119560, 12300, 0, 11491, 9724, 10341, 0, 9524, 7490, 11389, 7489, 3379, 0, 7487, 0, 471, 7484, 7482, 6753, 7480, 7479, 7478, 7477, 6501, 7475, 6918, 7473, 7472, 2474, 7470, - 7468, 10232, 10615, 10213, 0, 120222, 10049, 78884, 3544, 0, 6017, 65311, - 0, 120216, 13306, 10533, 7870, 73949, 7625, 0, 120544, 0, 0, 0, 0, 0, 0, - 19961, 2472, 42665, 120699, 0, 6019, 4256, 120776, 74380, 0, 42675, - 42658, 12845, 0, 0, 65138, 119355, 67862, 0, 65671, 120000, 120008, 8066, - 7678, 74865, 0, 0, 0, 0, 7186, 0, 120555, 0, 445, 120566, 0, 0, 0, 8330, - 0, 0, 42797, 0, 120215, 0, 3902, 0, 1770, 0, 0, 1560, 120209, 194972, - 4584, 73843, 0, 11712, 10866, 118928, 1118, 0, 0, 0, 1081, 7436, 68420, - 7252, 0, 5996, 0, 4903, 0, 41386, 5162, 119189, 1330, 0, 42848, 0, 12047, - 41384, 0, 0, 1848, 4334, 6324, 41975, 64777, 10674, 12308, 12186, 0, 0, - 0, 12715, 0, 0, 0, 2018, 66672, 41979, 66685, 119157, 0, 0, 0, 126984, 0, - 9334, 0, 127310, 0, 7975, 0, 77957, 0, 66621, 4884, 66597, 0, 0, 0, 6313, - 65513, 0, 0, 0, 0, 2345, 43697, 463, 0, 0, 119607, 3117, 5460, 0, 0, 0, - 0, 42279, 194577, 0, 78415, 0, 0, 0, 13248, 0, 0, 0, 0, 0, 0, 5663, 0, 0, - 0, 0, 2482, 1471, 0, 0, 42247, 12378, 73925, 127233, 0, 12374, 0, 0, 0, - 0, 2460, 0, 11944, 12376, 0, 64679, 0, 12380, 10557, 64473, 5870, 0, - 2024, 0, 0, 0, 539, 0, 0, 0, 3853, 65180, 0, 120796, 120245, 0, 0, 8659, - 0, 12474, 0, 9503, 194969, 2478, 0, 4162, 0, 4260, 12953, 0, 120089, - 12470, 0, 74189, 2742, 12476, 11798, 10946, 0, 5000, 0, 0, 0, 0, 8213, - 74017, 7771, 6161, 0, 6709, 0, 78885, 0, 194892, 120582, 78547, 0, 10301, - 10333, 10397, 0, 0, 73791, 0, 0, 0, 0, 0, 4014, 12842, 73952, 12015, 0, - 8275, 3893, 0, 0, 127555, 7221, 42147, 0, 74550, 74465, 64747, 118841, 0, - 12516, 4444, 0, 119017, 74537, 10892, 8231, 0, 6473, 41968, 78388, 41973, - 3591, 41969, 0, 2453, 0, 0, 64705, 0, 0, 10349, 10413, 43591, 41962, - 3202, 74353, 0, 8316, 0, 0, 0, 687, 0, 0, 0, 1840, 0, 68671, 119809, - 4883, 285, 4723, 77927, 0, 4459, 74577, 0, 41720, 11089, 240, 19906, 0, - 42323, 0, 9743, 120232, 13134, 0, 0, 0, 0, 0, 42634, 0, 43437, 3081, - 11463, 120230, 0, 0, 10445, 0, 0, 66717, 2614, 9125, 119023, 1729, 0, - 120236, 65221, 63883, 43334, 64852, 0, 120235, 66201, 0, 66578, 5001, - 41879, 74427, 4121, 5003, 884, 66700, 63879, 4943, 5150, 73889, 74182, 0, - 643, 3086, 0, 42448, 42299, 58, 0, 0, 120083, 63873, 8491, 0, 0, 0, 4530, - 42409, 0, 194575, 2721, 120074, 119096, 19929, 0, 194574, 0, 4242, 4264, - 120077, 0, 66179, 42412, 65941, 13114, 64522, 10740, 3094, 0, 9754, - 119102, 4437, 73948, 0, 0, 55280, 42174, 194925, 42430, 0, 0, 42355, - 66026, 4306, 41380, 68432, 0, 0, 66667, 127309, 0, 0, 42200, 42566, 0, 0, - 5088, 6948, 0, 8524, 0, 0, 12385, 0, 0, 0, 1386, 64580, 11480, 6116, + 7468, 10232, 10615, 10213, 127288, 92357, 10049, 78884, 3544, 0, 6017, + 65311, 127481, 120216, 13306, 10533, 7870, 73949, 7625, 0, 120544, 0, 0, + 92660, 0, 0, 0, 19961, 2472, 42665, 92341, 0, 2139, 4256, 120776, 74380, + 0, 42675, 42658, 12845, 0, 0, 65138, 119355, 67862, 0, 65671, 120000, + 120008, 8066, 7678, 74865, 0, 0, 0, 0, 7186, 0, 120555, 0, 445, 120566, + 128308, 0, 0, 8330, 0, 0, 42797, 0, 120215, 0, 3902, 0, 1770, 0, 128866, + 1560, 120209, 194972, 4584, 73843, 0, 11712, 10866, 118928, 1118, 92209, + 0, 0, 1081, 7436, 68420, 7252, 0, 5996, 0, 4903, 0, 41386, 5162, 119189, + 1330, 0, 7139, 0, 12047, 41384, 0, 0, 1848, 4334, 6324, 41975, 64777, + 10674, 12308, 12186, 0, 0, 0, 12715, 128349, 0, 0, 2018, 66672, 41979, + 66685, 119157, 0, 92464, 0, 126984, 0, 9334, 92705, 92315, 0, 7975, 0, + 77957, 0, 66621, 4884, 66597, 69732, 0, 0, 6313, 65513, 0, 0, 0, 0, 2345, + 43697, 463, 0, 0, 119607, 3117, 5460, 0, 0, 0, 0, 42279, 194577, 0, + 78415, 0, 195008, 0, 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, 0, 2460, 0, + 11944, 12376, 127868, 64679, 0, 12380, 10557, 64473, 5870, 0, 2024, + 127180, 0, 0, 539, 0, 127765, 0, 3853, 65180, 127923, 120796, 120245, + 92324, 0, 8659, 0, 12474, 92579, 9503, 194969, 2478, 0, 4162, 0, 4260, + 12953, 69633, 120089, 12470, 0, 74189, 2742, 12476, 11798, 10946, 127310, + 5000, 0, 0, 0, 69672, 8213, 74017, 7771, 6161, 0, 6709, 0, 78885, 0, + 127971, 120582, 78547, 0, 10301, 10333, 10397, 0, 0, 73791, 0, 0, 0, 0, + 0, 4014, 12842, 73952, 12015, 127290, 8275, 3893, 0, 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, 0, 687, 0, 0, 0, 1840, 0, 68671, 119809, 4883, 285, 4723, 77927, + 92692, 4459, 74577, 42921, 41720, 11089, 240, 19906, 0, 42323, 0, 9743, + 120232, 13134, 0, 0, 0, 0, 0, 42634, 0, 43437, 3081, 11463, 120154, 0, 0, + 10445, 0, 0, 66717, 2614, 9125, 119023, 1729, 0, 120236, 65221, 63883, + 43334, 64852, 0, 120235, 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, + 128132, 66179, 42412, 65941, 13114, 64522, 10740, 3094, 0, 9754, 119102, + 4437, 73948, 128692, 0, 55280, 42174, 194925, 42430, 0, 0, 42355, 66026, + 4306, 41380, 68432, 92586, 0, 66667, 127309, 0, 0, 42200, 42566, 0, 0, + 5088, 6948, 0, 8524, 0, 0, 12385, 0, 0, 69646, 1386, 64580, 11480, 6116, 65039, 65038, 12392, 65036, 8064, 0, 12101, 5822, 119004, 2080, 710, 77999, 11663, 1666, 42091, 119657, 12383, 43671, 42092, 68418, 4289, 0, 63896, 12061, 42096, 43621, 3362, 12377, 0, 0, 68449, 7461, 73901, 1244, 331, 73786, 12683, 10662, 0, 8112, 0, 65852, 0, 12379, 194877, 120818, 41964, 42208, 63843, 2084, 41965, 0, 65866, 4327, 0, 63840, 78549, 41220, - 13032, 0, 584, 12933, 43177, 12373, 0, 13000, 1351, 0, 8698, 12665, 0, - 1930, 0, 78229, 12427, 66514, 0, 13031, 0, 63901, 0, 3657, 0, 65202, - 6000, 119206, 12426, 0, 0, 41740, 12428, 41283, 41916, 119210, 0, 0, + 13032, 0, 584, 12933, 43177, 12373, 0, 13000, 1351, 2935, 8698, 12665, 0, + 1930, 0, 78229, 12427, 66514, 0, 13031, 0, 63901, 0, 3657, 128572, 65202, + 6000, 119206, 12426, 127181, 0, 41740, 12428, 41283, 41916, 119210, 0, 0, 12429, 6727, 0, 7562, 0, 5170, 0, 41755, 676, 0, 66704, 66664, 9978, - 66491, 3536, 0, 9752, 0, 6162, 0, 69228, 10113, 41829, 65886, 5159, + 66491, 3536, 0, 9752, 92397, 6162, 0, 69228, 10113, 41829, 65886, 5159, 12422, 41832, 439, 43077, 0, 42207, 74549, 11796, 40970, 41830, 0, 917799, 8308, 917797, 917796, 0, 67864, 917801, 917800, 12336, 4135, 69805, 341, 2727, 4129, 3539, 0, 63861, 0, 7913, 0, 63859, 4131, 63868, 0, 63867, 4133, 11371, 210, 4600, 0, 74560, 4137, 8082, 78506, 119062, - 78504, 6704, 4591, 0, 0, 0, 9680, 0, 120623, 561, 12159, 195, 78508, + 78504, 6704, 4591, 128029, 0, 0, 9680, 0, 120623, 561, 12159, 195, 78508, 41501, 0, 42031, 5719, 7172, 42687, 8368, 0, 41499, 0, 0, 42242, 41498, 917794, 42025, 78567, 65805, 42463, 0, 2924, 0, 120510, 0, 0, 119213, 73941, 0, 42330, 917784, 3969, 0, 0, 7169, 1992, 9652, 73977, 7246, - 42086, 917790, 917789, 0, 0, 0, 0, 0, 327, 0, 9042, 917777, 917776, + 42086, 917790, 917789, 0, 0, 128801, 0, 0, 327, 0, 9042, 917777, 917776, 65148, 12433, 917781, 127276, 917779, 12431, 8668, 12434, 0, 917782, - 5999, 0, 7712, 12432, 0, 43653, 1726, 1015, 0, 8212, 0, 0, 42423, 119066, - 0, 0, 66709, 0, 8811, 927, 0, 0, 12436, 0, 42021, 0, 0, 1299, 12240, - 42350, 65143, 0, 195016, 0, 78197, 11348, 0, 78037, 0, 0, 0, 19914, - 12179, 0, 9648, 194923, 63836, 63832, 917773, 10967, 63816, 2594, 3444, - 63817, 64651, 0, 41503, 0, 11265, 0, 0, 194922, 0, 5664, 3972, 0, 0, 0, - 917766, 12416, 917764, 119608, 10816, 917769, 917768, 12418, 74111, 3882, - 8532, 917771, 1573, 0, 119847, 4596, 66339, 12417, 66001, 65343, 194782, - 12414, 8287, 68219, 195017, 68108, 1143, 119169, 0, 12415, 6626, 42763, - 0, 118884, 9021, 120783, 0, 11724, 0, 0, 127104, 194794, 0, 0, 8027, - 10997, 9171, 12741, 11400, 74197, 194799, 0, 194798, 0, 0, 0, 127523, - 120190, 194773, 67608, 194772, 42368, 0, 7715, 3881, 41487, 12118, 42514, - 68651, 0, 0, 3009, 41476, 41489, 69825, 3007, 1448, 3018, 194809, 3889, - 8521, 5083, 5082, 119859, 120184, 8519, 0, 3014, 5081, 65853, 0, 0, - 120183, 78219, 5079, 64802, 42210, 4597, 65532, 78444, 120185, 12371, 0, - 8407, 0, 10805, 8518, 10779, 120188, 0, 0, 12367, 42170, 0, 0, 629, 1924, - 0, 12037, 74366, 5987, 8462, 8005, 12365, 63933, 127370, 120815, 12369, - 10649, 0, 5077, 127108, 10880, 63927, 5075, 0, 0, 65075, 0, 11007, 0, - 66659, 0, 0, 66684, 0, 3434, 4954, 1904, 0, 5266, 126980, 5272, 10499, - 4507, 9578, 63923, 120177, 7979, 0, 9831, 0, 194926, 461, 9803, 0, 4504, - 1505, 0, 6325, 5276, 43021, 0, 0, 55236, 0, 66461, 5177, 41324, 12055, - 8722, 0, 41327, 0, 66695, 4114, 409, 4383, 8900, 8948, 41325, 0, 721, - 10182, 9108, 0, 0, 119185, 42229, 194912, 0, 5998, 0, 42353, 74825, 0, - 12587, 0, 78571, 0, 0, 0, 41576, 42215, 78570, 119207, 0, 8578, 5995, - 7573, 41575, 74789, 74752, 63944, 63949, 64767, 2670, 4167, 0, 11723, 0, - 74120, 0, 65076, 938, 43414, 73854, 11737, 9721, 0, 0, 0, 11742, 0, 0, - 11493, 12334, 0, 4153, 12302, 10793, 5250, 12407, 11978, 4404, 9189, - 12401, 42007, 5775, 6759, 65806, 43997, 0, 42002, 12404, 0, 0, 4940, - 12410, 7683, 1167, 73729, 4983, 0, 861, 0, 0, 0, 0, 65577, 43370, 0, 0, - 11956, 0, 0, 0, 9616, 6631, 0, 12816, 74583, 42218, 12710, 68674, 12721, - 4101, 66185, 0, 5992, 7616, 0, 0, 12577, 0, 0, 853, 42693, 0, 0, 0, 5016, - 43535, 63893, 42835, 9491, 917913, 0, 917914, 0, 12712, 917919, 0, 65060, - 120797, 9900, 0, 0, 194919, 0, 0, 0, 64778, 12585, 10565, 0, 12177, 0, 0, - 0, 77824, 0, 4900, 0, 12878, 0, 8984, 4119, 74768, 8971, 78593, 43113, - 9702, 78594, 11025, 9245, 13048, 4927, 4138, 74185, 194921, 0, 12397, - 77827, 0, 13054, 12394, 0, 0, 0, 13053, 0, 3948, 10781, 1546, 0, 5010, - 1680, 10507, 78590, 78583, 0, 0, 0, 194915, 7267, 0, 74833, 0, 5993, - 2819, 0, 12706, 77840, 1893, 7266, 63915, 7264, 7265, 0, 1363, 0, 63997, - 63910, 63996, 3077, 0, 0, 1512, 0, 12589, 41479, 0, 0, 43339, 0, 9836, - 120727, 0, 41481, 43335, 7832, 42343, 3090, 43337, 817, 1664, 1850, 0, - 3079, 11340, 42408, 42447, 194704, 120020, 42307, 12386, 42304, 0, 0, - 12389, 0, 194694, 41996, 11526, 63985, 5864, 1147, 63992, 42887, 1987, 0, - 5480, 7858, 11653, 4116, 12391, 66193, 0, 4939, 12384, 0, 0, 41686, - 63905, 119601, 194688, 0, 0, 12649, 0, 0, 8247, 507, 91, 2042, 120775, - 43643, 194689, 66028, 10036, 41844, 119813, 774, 119831, 0, 119815, 5994, - 12539, 0, 78375, 120597, 119833, 0, 119600, 0, 0, 7719, 6026, 2486, 0, - 119808, 162, 0, 65219, 41073, 9687, 41681, 6304, 119812, 66196, 0, 5262, - 0, 55233, 12681, 42379, 0, 7534, 12219, 0, 127528, 42810, 10492, 0, 0, 0, - 43119, 0, 120753, 12403, 2500, 195013, 0, 4899, 0, 0, 0, 74113, 2343, - 4103, 19946, 74112, 77851, 13112, 0, 0, 12859, 0, 120148, 66369, 5861, 0, - 11999, 12400, 0, 0, 12645, 5146, 11320, 68410, 6748, 65040, 0, 64184, - 12974, 64183, 67613, 120645, 5147, 0, 0, 74524, 0, 1928, 0, 67649, 5991, - 3445, 67609, 4976, 64176, 0, 67610, 8241, 0, 77868, 4206, 0, 0, 0, 0, 0, - 10138, 0, 0, 8897, 0, 0, 8357, 4124, 77862, 65836, 120641, 0, 77859, 0, - 0, 1123, 963, 41553, 10120, 12405, 120150, 0, 398, 13278, 9723, 6366, - 120311, 7945, 0, 4402, 9970, 12402, 0, 42392, 1305, 12408, 0, 44007, 0, - 0, 41464, 12411, 12969, 120824, 41465, 0, 8528, 1575, 0, 63955, 165, - 3024, 41467, 119163, 0, 9093, 0, 9147, 0, 63958, 0, 9148, 9692, 4096, 53, - 73776, 6750, 195018, 0, 9594, 0, 0, 43527, 0, 727, 0, 0, 5805, 0, 6726, - 0, 42176, 12370, 11655, 119095, 10591, 12364, 0, 12372, 120642, 120307, - 0, 0, 0, 12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, 0, 10803, - 4132, 120306, 68474, 0, 0, 0, 74837, 0, 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, 120154, 9564, 0, - 0, 73866, 0, 0, 2487, 67614, 3121, 1804, 3311, 67615, 0, 78302, 12220, - 67616, 120598, 0, 0, 68200, 6675, 0, 0, 67592, 120685, 0, 64771, 1198, - 9132, 0, 64619, 510, 64663, 0, 0, 4561, 2101, 1398, 0, 0, 74034, 41569, - 0, 11406, 8167, 12127, 0, 840, 0, 0, 0, 6967, 0, 0, 9796, 0, 333, 0, 0, - 8144, 0, 0, 0, 12406, 0, 19931, 119089, 6678, 7769, 0, 12621, 0, 0, - 10227, 4764, 43101, 9981, 0, 40986, 4127, 66487, 0, 42202, 12754, 195022, - 0, 0, 0, 67594, 2048, 12944, 4050, 67595, 917967, 43102, 10581, 12985, - 4533, 195021, 74003, 6490, 0, 12038, 0, 0, 120704, 65461, 9798, 0, 0, - 1948, 119007, 0, 952, 0, 0, 0, 120802, 6449, 9494, 120313, 0, 43098, - 4843, 8142, 64160, 4098, 64170, 0, 0, 3436, 0, 0, 12817, 67597, 6676, - 3930, 66708, 0, 0, 67598, 0, 0, 0, 65591, 41581, 65916, 1453, 0, 0, 0, - 8500, 42222, 120142, 73743, 120400, 4317, 11543, 67676, 64676, 0, 0, - 67606, 119083, 0, 42217, 13102, 0, 66003, 6672, 0, 0, 0, 0, 63841, 9613, - 9001, 4526, 11274, 67601, 64520, 64210, 6664, 78704, 42056, 10228, 64957, - 11281, 0, 64213, 1469, 66640, 65381, 42197, 4988, 42372, 0, 9598, 904, - 352, 42225, 1451, 8061, 8453, 4134, 0, 74847, 66576, 0, 0, 10520, 8575, - 9960, 1201, 0, 12846, 0, 0, 11919, 64962, 0, 43739, 127281, 8511, 9460, - 823, 11587, 12305, 0, 64695, 0, 12387, 1253, 13183, 65766, 500, 42783, - 65765, 64208, 64369, 65760, 65761, 119585, 11606, 64784, 11702, 66498, - 9821, 0, 0, 5152, 11048, 7533, 68366, 64410, 0, 0, 4323, 120062, 0, 0, - 127052, 42587, 42214, 41394, 0, 4763, 4112, 118935, 0, 5260, 43143, 0, - 326, 120131, 68423, 0, 10771, 2876, 74074, 194835, 194924, 41398, 7382, - 9802, 127077, 127076, 453, 41396, 120524, 42720, 12140, 9572, 0, 7003, - 194883, 42334, 7704, 0, 0, 43144, 4123, 8494, 43146, 9977, 0, 0, 65759, - 10765, 64061, 4465, 9808, 64056, 65582, 4126, 0, 9521, 9589, 64755, 0, - 64020, 0, 10464, 0, 0, 194869, 64514, 11528, 64024, 0, 679, 64013, 0, - 5850, 758, 7536, 0, 0, 41441, 10693, 64006, 0, 64005, 10541, 119019, 0, - 64660, 0, 119050, 0, 0, 1139, 43298, 64027, 64029, 8970, 0, 64000, 0, - 10774, 0, 42201, 12421, 194876, 0, 1852, 3057, 0, 73744, 64034, 64039, 0, - 0, 0, 0, 0, 7645, 12854, 74338, 3496, 0, 0, 0, 9102, 627, 0, 6158, 8327, - 74553, 66632, 12419, 13309, 11570, 0, 19960, 11696, 0, 1018, 118970, - 194909, 0, 1682, 194896, 194911, 42756, 6765, 194906, 0, 0, 73814, 11412, - 6768, 10728, 194830, 119010, 118863, 43311, 64966, 11577, 0, 43040, 1833, - 11576, 0, 74779, 0, 185, 65085, 74533, 64754, 194848, 7535, 8085, 42525, - 120387, 9749, 41701, 6131, 1949, 4117, 7847, 120489, 194711, 64483, - 65693, 0, 0, 0, 0, 42240, 0, 0, 42864, 0, 64667, 41868, 1184, 0, 815, - 11484, 127535, 67840, 0, 0, 0, 0, 10986, 64683, 0, 0, 0, 0, 0, 9879, 0, - 0, 4158, 0, 68166, 0, 0, 0, 0, 0, 332, 118808, 0, 5142, 2407, 0, 42199, - 0, 0, 74373, 0, 55217, 0, 63870, 43163, 0, 0, 119081, 42867, 1834, 0, 0, - 69817, 10940, 65249, 119040, 8662, 0, 0, 2652, 120527, 11539, 10784, - 195093, 67674, 0, 0, 0, 0, 74562, 917505, 1828, 74474, 120327, 78620, - 8531, 12499, 6280, 12324, 118854, 65238, 68374, 4832, 65573, 0, 6279, - 12508, 12904, 12502, 9161, 0, 1620, 0, 3601, 195094, 0, 0, 609, 11555, 0, - 12496, 0, 74181, 4343, 12505, 0, 0, 0, 11377, 239, 0, 637, 0, 0, 42671, - 0, 0, 0, 43565, 127082, 0, 12696, 0, 0, 0, 12929, 0, 712, 0, 4197, 0, - 42818, 0, 0, 120490, 0, 0, 1506, 43562, 0, 0, 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, 917837, 0, 0, - 0, 0, 0, 0, 3178, 0, 0, 0, 0, 9080, 127000, 120352, 0, 68209, 0, 11082, - 0, 5699, 195100, 66000, 9488, 65166, 119112, 0, 0, 0, 0, 0, 0, 5265, - 69235, 0, 11487, 67858, 12464, 0, 43045, 0, 0, 43345, 0, 10770, 118994, - 6807, 465, 9829, 0, 74348, 0, 43346, 8116, 795, 0, 0, 12462, 10930, - 10831, 0, 118952, 64362, 74334, 0, 120811, 0, 12468, 8607, 1008, 0, - 10092, 0, 917842, 67855, 55257, 73771, 1766, 11282, 11996, 1820, 4547, 0, - 0, 0, 0, 13223, 0, 64595, 0, 0, 0, 4345, 12616, 0, 0, 0, 74467, 0, 0, 0, - 5382, 0, 0, 0, 119060, 64953, 5406, 19920, 0, 66510, 3590, 0, 1130, 0, 0, - 42016, 11823, 43023, 0, 118896, 7742, 0, 13280, 0, 9326, 73826, 5310, - 74812, 0, 119962, 8959, 43589, 6747, 66723, 0, 8568, 0, 120496, 73816, - 120803, 0, 42670, 0, 11621, 12460, 0, 120631, 0, 43063, 74519, 0, 0, 0, - 0, 0, 11689, 5410, 5783, 10468, 8403, 5400, 11594, 0, 0, 118990, 10491, - 0, 64412, 0, 0, 5587, 42865, 64404, 8268, 4923, 65086, 8981, 12382, - 42133, 120755, 9706, 0, 0, 66610, 10461, 12103, 0, 8642, 0, 42766, 0, - 66566, 9983, 0, 119105, 0, 0, 0, 7398, 41515, 0, 11802, 8041, 1461, 910, - 119133, 0, 6749, 3658, 0, 120525, 0, 7617, 0, 12888, 0, 67668, 13143, 0, - 41514, 11097, 5703, 0, 41517, 41504, 41519, 10016, 64305, 0, 65864, 623, - 781, 670, 10660, 5769, 613, 7543, 120279, 477, 41083, 0, 0, 592, 1578, - 12459, 43449, 0, 0, 8225, 0, 654, 11345, 653, 652, 0, 647, 0, 633, - 120744, 0, 0, 12480, 43243, 0, 39, 12487, 0, 120529, 74199, 12482, 0, - 12489, 0, 3195, 5550, 0, 7897, 0, 1203, 74396, 1813, 64544, 41311, 12090, - 0, 2877, 0, 0, 1675, 0, 0, 0, 0, 10070, 10595, 0, 119077, 0, 0, 0, 0, 0, - 43244, 0, 0, 0, 119561, 0, 0, 0, 0, 0, 0, 0, 77860, 0, 0, 270, 0, 10714, - 0, 0, 0, 0, 0, 65372, 0, 74038, 119558, 6273, 66679, 364, 9595, 194908, - 0, 0, 707, 0, 0, 9282, 66489, 224, 0, 68670, 9332, 4966, 68677, 0, 68644, - 0, 3841, 68634, 0, 10732, 68640, 850, 4972, 0, 64699, 2909, 68619, 44008, - 68627, 0, 11544, 10203, 9608, 0, 0, 11962, 0, 12507, 1196, 0, 0, 777, 0, - 4375, 65271, 67678, 0, 12198, 0, 64824, 0, 0, 9454, 63778, 8658, 42528, - 0, 2705, 917975, 41520, 0, 0, 11986, 7765, 42502, 8280, 0, 2701, 0, 0, - 5767, 0, 0, 9809, 8353, 63747, 66701, 63772, 0, 63745, 1748, 63770, 0, 0, - 0, 65542, 63766, 55244, 3061, 0, 63764, 63787, 9067, 6096, 0, 7694, 0, - 7257, 63768, 3485, 12987, 0, 127522, 120628, 63807, 1591, 0, 6386, 63783, - 0, 0, 0, 0, 0, 0, 74575, 0, 65719, 13083, 64574, 65012, 0, 1640, 12495, - 66691, 7624, 3138, 10996, 0, 1922, 0, 12498, 10987, 0, 0, 3894, 65543, 0, - 194842, 0, 493, 0, 43197, 1717, 4228, 479, 10303, 74020, 0, 917935, - 10335, 3520, 917932, 12490, 64315, 0, 127039, 12493, 6233, 42681, 1002, - 12491, 0, 64911, 127040, 2096, 65120, 0, 0, 0, 11611, 66228, 127041, - 66213, 63864, 66221, 66226, 66229, 13218, 66231, 66216, 8507, 66236, - 66211, 66218, 0, 66240, 78041, 66233, 8928, 0, 7909, 66234, 11605, 63759, - 0, 66208, 73999, 63799, 63803, 244, 11542, 12898, 12494, 73761, 12492, - 12669, 0, 0, 74153, 0, 0, 120680, 4882, 13040, 0, 8612, 4885, 74053, 0, - 13042, 4880, 64662, 2429, 1360, 248, 0, 63797, 0, 42358, 0, 7292, 0, - 63756, 42786, 66693, 0, 1870, 78040, 470, 78038, 78035, 78036, 0, 78034, - 4579, 0, 0, 12511, 74453, 12514, 0, 74579, 7239, 7001, 8623, 0, 0, 0, - 7378, 12512, 11615, 6104, 0, 0, 659, 6098, 0, 12234, 127307, 127067, - 8311, 12510, 41803, 13039, 127072, 12513, 10202, 12471, 0, 8747, 0, 0, 0, - 2323, 0, 2319, 77917, 12477, 77916, 2311, 0, 4415, 237, 6281, 0, 0, 0, - 2309, 1312, 8173, 0, 12469, 0, 78505, 64335, 10609, 0, 0, 9397, 11524, - 9395, 9396, 9393, 9394, 9391, 9392, 9389, 6209, 9387, 9388, 4932, 9386, - 9383, 9384, 6740, 0, 65451, 8185, 0, 917832, 43024, 43336, 67659, 2313, - 0, 7948, 9236, 0, 0, 0, 10570, 43473, 6289, 10484, 0, 0, 11998, 12082, - 10924, 3147, 0, 120684, 12524, 0, 2310, 11818, 9381, 9382, 9379, 9380, - 9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 12444, 0, 0, 13016, 8210, 0, - 42029, 11079, 12331, 43451, 42032, 8744, 726, 0, 0, 4155, 0, 0, 42030, - 5007, 12522, 43088, 0, 4951, 0, 127240, 0, 9922, 43309, 0, 12525, 0, - 12016, 65770, 9548, 67665, 403, 78230, 12503, 0, 0, 11030, 0, 0, 65691, - 63998, 1819, 10496, 0, 0, 119920, 0, 0, 0, 12506, 0, 12231, 0, 12500, - 44023, 12509, 64393, 78830, 3389, 10589, 6608, 41047, 120321, 78395, - 78394, 74069, 77995, 78391, 3608, 8281, 120320, 1107, 0, 9076, 8862, 0, - 41052, 13084, 64766, 43217, 7803, 13222, 74165, 74782, 0, 8546, 11553, - 63995, 13177, 9043, 6303, 0, 498, 64471, 120324, 0, 12529, 8042, 0, 2344, - 12528, 8031, 2414, 0, 0, 3231, 0, 6422, 66512, 0, 12530, 2537, 78405, - 41429, 12658, 13036, 65772, 0, 78738, 41433, 4719, 469, 0, 4363, 3313, - 41428, 78407, 2023, 1772, 78224, 78225, 65706, 10051, 64812, 78220, 0, - 9920, 12215, 0, 4931, 1951, 12497, 119363, 9607, 0, 9663, 0, 119634, - 6503, 41110, 0, 1491, 0, 0, 0, 41061, 0, 0, 0, 65026, 41993, 41509, - 11045, 65028, 78602, 66476, 41108, 9738, 41995, 1075, 1958, 12535, 41992, - 41506, 0, 41687, 0, 120717, 0, 9940, 0, 7692, 0, 8008, 41131, 330, 8566, - 65083, 41133, 9816, 0, 12532, 78550, 78546, 3508, 127058, 43235, 0, - 127298, 69783, 78231, 6411, 12910, 78554, 66644, 13028, 6737, 12537, 0, - 0, 64136, 12536, 2350, 13029, 78233, 0, 0, 13030, 6702, 4527, 0, 12538, - 0, 0, 65599, 65717, 9966, 0, 4948, 12484, 4032, 0, 12623, 0, 6207, 0, - 6117, 65930, 8412, 0, 7438, 1296, 2325, 41511, 0, 10149, 74118, 0, 0, - 12481, 0, 12488, 0, 0, 41556, 64414, 118802, 2354, 0, 73766, 0, 6295, - 901, 41510, 7953, 0, 65032, 41513, 0, 11927, 66584, 78559, 78560, 78557, - 78558, 0, 78556, 848, 9868, 0, 6424, 78568, 119338, 78565, 74031, 78563, - 78564, 2352, 78572, 893, 64576, 11289, 1407, 0, 0, 13026, 6762, 78579, - 78580, 13023, 8903, 9777, 66715, 1871, 8099, 0, 0, 1343, 0, 0, 9325, - 6818, 6283, 11738, 0, 0, 0, 11741, 0, 0, 9216, 8263, 11279, 194752, 0, - 194754, 13021, 64494, 3136, 194758, 194757, 194760, 13022, 42737, 64588, - 0, 0, 74552, 10014, 0, 41260, 119340, 13020, 118993, 194764, 194767, - 74340, 0, 0, 64945, 8029, 0, 0, 0, 3335, 0, 0, 9776, 120526, 194748, + 5999, 0, 7712, 12432, 128243, 43653, 1726, 1015, 0, 8212, 0, 128014, + 42423, 119066, 0, 128108, 66709, 0, 8811, 927, 0, 0, 12436, 0, 42021, 0, + 0, 1299, 12240, 42350, 65143, 0, 195016, 0, 78197, 11348, 0, 78037, 9194, + 0, 0, 19914, 12179, 0, 9648, 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, 917764, 119608, 10816, 917769, + 917768, 12418, 74111, 3882, 8532, 917771, 1573, 128648, 119847, 4596, + 66339, 12417, 66001, 65343, 194782, 12414, 8287, 68219, 195017, 68108, + 1143, 119169, 119846, 12415, 6626, 42763, 0, 118884, 9021, 120783, 0, + 11724, 0, 0, 127104, 128526, 0, 0, 8027, 10997, 9171, 12741, 11400, + 74197, 194799, 0, 128239, 0, 128881, 119604, 127523, 120190, 194773, + 67608, 128214, 42368, 0, 7715, 3881, 41487, 12118, 42514, 68651, 0, 0, + 3009, 41476, 41489, 69825, 3007, 1448, 3018, 194809, 3889, 8521, 5083, + 5082, 119859, 120184, 8519, 0, 3014, 5081, 65853, 120715, 0, 120183, + 78219, 5079, 64802, 42210, 4597, 65532, 78444, 120185, 12371, 0, 8407, 0, + 10805, 8518, 10779, 120188, 0, 0, 12367, 42170, 0, 92557, 629, 1924, 0, + 12037, 74366, 5987, 8462, 8005, 12365, 63933, 69735, 120815, 12369, + 10649, 0, 5077, 127108, 10880, 63927, 5075, 917881, 0, 65075, 0, 11007, + 0, 66659, 92607, 0, 66684, 0, 3434, 4954, 1904, 0, 5266, 126980, 5272, + 10499, 4507, 9578, 63923, 120177, 7979, 0, 9831, 0, 194926, 461, 9803, 0, + 4504, 1505, 0, 6325, 5276, 43021, 120488, 0, 55236, 0, 66461, 5177, + 41324, 12055, 8722, 0, 41327, 0, 66695, 4114, 409, 4383, 8900, 8948, + 41325, 0, 721, 10182, 9108, 0, 0, 119185, 42229, 194912, 0, 5998, 0, + 42353, 74825, 0, 12587, 0, 78571, 0, 0, 194562, 41576, 42215, 78570, + 119207, 0, 8578, 5995, 7573, 41575, 74789, 74752, 63944, 63949, 64767, + 2670, 4167, 0, 11723, 0, 74120, 0, 65076, 938, 43414, 73854, 11737, 9721, + 0, 0, 0, 11742, 2419, 0, 11493, 12334, 194913, 4153, 12302, 10793, 5250, + 12407, 11978, 4404, 9189, 12401, 42007, 5775, 6759, 65806, 43997, 0, + 42002, 12404, 0, 0, 4940, 12410, 7683, 1167, 73729, 4983, 0, 861, 0, 0, + 0, 0, 65577, 43370, 0, 0, 11956, 0, 0, 0, 9616, 6631, 0, 12816, 74583, + 42218, 12710, 68674, 12721, 4101, 66185, 0, 5992, 7616, 195044, 0, 12577, + 0, 0, 853, 42693, 195014, 0, 0, 5016, 43535, 63893, 42835, 9491, 917913, + 0, 917914, 0, 12712, 7105, 127807, 65060, 120797, 9900, 0, 0, 194919, 0, + 127830, 0, 64778, 12585, 10565, 128151, 12177, 0, 0, 0, 77824, 0, 4900, + 127874, 12878, 92630, 8984, 4119, 74768, 8971, 78593, 43113, 9702, 78594, + 11025, 9245, 13048, 4927, 4138, 74185, 92481, 92710, 12397, 77827, 0, + 13054, 12394, 0, 0, 0, 13053, 0, 3948, 10781, 1546, 0, 5010, 1680, 10507, + 78590, 78583, 0, 0, 0, 194915, 7267, 0, 74833, 128181, 5993, 2819, 0, + 12706, 77840, 1893, 7266, 63915, 7264, 7265, 0, 1363, 0, 63997, 63910, + 63996, 3077, 0, 0, 1512, 0, 12589, 41479, 128313, 0, 43339, 0, 9836, + 120727, 0, 41481, 43335, 7832, 42343, 3090, 43337, 817, 1664, 1850, + 128841, 3079, 11340, 42408, 42447, 127140, 120020, 42307, 12386, 42304, + 917555, 0, 12389, 0, 92366, 41996, 11526, 63985, 5864, 1147, 63992, + 42887, 1987, 92718, 5480, 7858, 11653, 4116, 12391, 66193, 0, 4939, + 12384, 0, 0, 41686, 63905, 119601, 194688, 0, 0, 12649, 0, 0, 8247, 507, + 91, 2042, 120775, 43643, 194689, 66028, 10036, 41844, 119813, 774, + 119831, 0, 119815, 5994, 12539, 0, 78375, 120597, 119833, 0, 119600, 0, + 0, 7719, 6026, 2486, 128312, 119808, 162, 0, 65219, 41073, 9687, 41681, + 6304, 119812, 66196, 194881, 5262, 0, 55233, 12681, 42379, 0, 7534, + 12219, 0, 127528, 42810, 10492, 0, 0, 0, 43119, 0, 120753, 12403, 2500, + 195013, 0, 4899, 12729, 0, 0, 74113, 2343, 4103, 19946, 74112, 77851, + 13112, 0, 195012, 12859, 0, 120148, 66369, 5861, 127758, 11999, 12400, 0, + 0, 12645, 5146, 11320, 68410, 6748, 65040, 0, 64184, 12974, 64183, 67613, + 120645, 5147, 0, 0, 74524, 0, 1928, 0, 67649, 5991, 3445, 67609, 4976, + 64176, 0, 67610, 8241, 0, 77868, 4206, 0, 0, 0, 128298, 0, 10138, 0, 0, + 8897, 0, 0, 8357, 4124, 77862, 65836, 120641, 127926, 77859, 0, 0, 1123, + 963, 41553, 10120, 12405, 120150, 92664, 398, 13278, 9723, 6366, 120311, + 7945, 0, 4402, 9970, 12402, 0, 42392, 1305, 12408, 0, 44007, 0, 0, 41464, + 12411, 12969, 120824, 41465, 0, 8528, 1575, 0, 63955, 165, 3024, 41467, + 119163, 0, 9093, 0, 9147, 0, 63958, 0, 9148, 9692, 4096, 53, 73776, 6750, + 195018, 0, 9594, 0, 0, 43527, 0, 727, 194703, 0, 5805, 0, 6726, 0, 42176, + 12370, 11655, 119095, 10591, 12364, 0, 12372, 120642, 120307, 0, 92343, + 0, 12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, 194701, 10803, + 4132, 120306, 68474, 92473, 0, 0, 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, + 0, 78302, 12220, 67616, 120598, 127475, 0, 68200, 6675, 128144, 0, 67592, + 120685, 0, 64771, 1198, 9132, 0, 64619, 510, 64663, 0, 0, 4561, 2101, + 1398, 0, 92554, 74034, 41569, 92684, 11406, 8167, 12127, 0, 840, 0, 0, 0, + 6967, 0, 0, 9796, 0, 333, 0, 0, 8144, 2117, 0, 0, 12406, 0, 19931, + 119089, 6678, 7769, 0, 12621, 0, 127366, 10227, 4764, 43101, 9981, 0, + 40986, 4127, 66487, 0, 42202, 12754, 195022, 0, 0, 0, 67594, 2048, 12944, + 4050, 67595, 917967, 43102, 10581, 12985, 4533, 195021, 74003, 6490, 0, + 12038, 0, 0, 120704, 65461, 9798, 69704, 0, 1948, 119007, 0, 952, 128235, + 0, 0, 120802, 6449, 9494, 120313, 0, 43098, 4843, 8142, 64160, 4098, + 64170, 0, 0, 3436, 119973, 0, 12817, 67597, 6676, 3930, 66708, 0, 0, + 67598, 0, 0, 0, 65591, 41581, 65916, 1453, 0, 0, 0, 8500, 42222, 120142, + 73743, 120400, 4317, 11543, 67676, 64676, 0, 0, 67606, 119083, 0, 42217, + 13102, 0, 66003, 6672, 0, 0, 0, 0, 63841, 9613, 9001, 4526, 11274, 67601, + 64520, 64210, 6664, 78704, 42056, 10228, 64957, 11281, 0, 64213, 1469, + 66640, 65381, 42197, 4988, 42372, 0, 9598, 904, 352, 42225, 1451, 8061, + 8453, 4134, 0, 74847, 66576, 127916, 0, 10520, 8575, 9960, 1201, 127289, + 12846, 127291, 127292, 11919, 64962, 127287, 43739, 127281, 8511, 9460, + 823, 11587, 12305, 0, 64695, 127305, 12387, 1253, 13183, 65766, 500, + 42783, 65765, 64208, 64369, 65760, 65761, 119585, 11606, 64784, 11702, + 66498, 9821, 64304, 0, 5152, 11048, 7533, 68366, 64410, 92305, 0, 4323, + 120062, 92669, 0, 127052, 42587, 42214, 41394, 0, 4763, 4112, 118935, 0, + 5260, 43143, 0, 326, 120131, 68423, 0, 10771, 2876, 74074, 92530, 194924, + 41398, 7382, 9802, 127077, 127076, 453, 41396, 120524, 42720, 12140, + 9572, 0, 7003, 194883, 42334, 7704, 0, 194885, 43144, 4123, 8494, 43146, + 9977, 0, 0, 65759, 10765, 64061, 4465, 9808, 64056, 65582, 4126, 0, 9521, + 9589, 64755, 0, 64020, 0, 10464, 0, 0, 194869, 64514, 11528, 64024, + 128072, 679, 64013, 0, 5850, 758, 7536, 0, 92234, 41441, 10693, 64006, 0, + 64005, 4058, 119019, 0, 64660, 0, 119050, 0, 0, 1139, 43298, 64027, + 64029, 8970, 0, 9934, 0, 10774, 128020, 42201, 12421, 128216, 0, 1852, + 3057, 128113, 73744, 64034, 64039, 0, 0, 0, 0, 92322, 7645, 12854, 74338, + 3496, 0, 0, 0, 9102, 627, 127795, 6158, 8327, 74553, 66632, 12419, 13309, + 11570, 127811, 19960, 11696, 0, 1018, 118970, 194909, 194897, 1682, + 194896, 194911, 42756, 6765, 194906, 0, 0, 73814, 11412, 6768, 10728, + 194830, 119010, 118863, 43311, 64966, 11577, 0, 43040, 1833, 11576, 0, + 74779, 0, 185, 65085, 74533, 64754, 194848, 7535, 8085, 42525, 120387, + 9749, 41701, 6131, 1949, 4117, 7847, 120489, 194711, 64483, 65693, 0, 0, + 0, 69695, 42240, 0, 0, 42864, 0, 64667, 41868, 1184, 0, 815, 11484, + 127535, 67840, 0, 0, 128793, 0, 10986, 64683, 0, 0, 194709, 0, 0, 9879, + 0, 0, 4158, 128050, 68166, 0, 0, 0, 0, 69645, 332, 118808, 0, 5142, 2407, + 69643, 42199, 0, 92404, 74373, 0, 55217, 0, 63870, 43163, 0, 0, 92390, + 42867, 1834, 0, 92461, 69817, 10940, 65249, 119040, 8662, 0, 0, 2652, + 120527, 7164, 10784, 195093, 67674, 0, 92233, 92482, 194749, 74562, + 917505, 1828, 74474, 120327, 78620, 8531, 12499, 6280, 12324, 118854, + 65238, 68374, 4832, 65573, 0, 6279, 12508, 12904, 12502, 9161, 0, 1620, + 64436, 3601, 195094, 128073, 0, 609, 11555, 0, 12496, 127839, 74181, + 4343, 12505, 0, 127863, 0, 11377, 239, 0, 637, 0, 0, 42671, 0, 0, 0, + 43565, 127082, 0, 12696, 128256, 0, 194796, 12929, 0, 712, 0, 4197, 0, + 42818, 128688, 0, 120490, 0, 119137, 1506, 43562, 0, 0, 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, 9080, 127000, + 120352, 0, 68209, 0, 11082, 0, 5699, 195100, 66000, 9488, 65166, 119112, + 0, 0, 0, 0, 128208, 0, 5265, 69235, 0, 11487, 67858, 12464, 0, 43045, 0, + 0, 43345, 0, 10770, 118994, 6807, 465, 9829, 0, 74348, 0, 43346, 8116, + 795, 0, 0, 12462, 10930, 10831, 0, 118952, 64362, 74334, 0, 120811, 0, + 12468, 8607, 1008, 0, 10092, 195078, 917842, 67855, 55257, 73771, 1766, + 11282, 11996, 1820, 4547, 0, 0, 0, 0, 13223, 128665, 64595, 127294, 0, + 92311, 4345, 12616, 0, 0, 0, 74467, 0, 0, 0, 5382, 0, 0, 0, 119060, + 64953, 5406, 19920, 92216, 66510, 3590, 0, 1130, 0, 0, 42016, 11823, + 43023, 0, 118896, 7742, 0, 13280, 0, 9326, 73826, 5310, 74812, 78584, + 92229, 8959, 43589, 6747, 66723, 0, 8568, 0, 120496, 73816, 120803, 0, + 42670, 0, 11621, 12460, 0, 120631, 0, 43063, 74519, 127182, 0, 0, 0, + 69783, 11689, 5410, 5783, 10468, 8403, 5400, 11594, 128247, 0, 118990, + 10491, 0, 64412, 0, 0, 5587, 42865, 64404, 8268, 4923, 65086, 8981, + 12382, 42133, 120755, 9706, 69738, 0, 66610, 10461, 12103, 0, 8642, 0, + 42766, 0, 66566, 9983, 0, 119105, 0, 0, 0, 7398, 41515, 0, 11802, 8041, + 1461, 910, 119133, 0, 6749, 3658, 0, 120525, 0, 7617, 194841, 12888, 0, + 67668, 13143, 0, 9193, 11097, 5703, 0, 41517, 41504, 41519, 10016, 64305, + 0, 65864, 623, 781, 670, 10660, 5769, 613, 7543, 120279, 477, 41083, + 92521, 0, 592, 1578, 12459, 43449, 0, 0, 8225, 0, 654, 11345, 653, 652, + 0, 647, 0, 633, 120744, 0, 0, 12480, 43243, 0, 39, 12487, 0, 120529, + 74199, 12482, 0, 12489, 0, 3195, 5550, 0, 7897, 0, 1203, 74396, 1813, + 64544, 41311, 12090, 0, 2877, 0, 0, 1675, 0, 0, 0, 0, 10070, 10595, 0, + 119077, 0, 0, 0, 0, 0, 43244, 0, 0, 0, 119561, 0, 0, 194921, 128160, + 9939, 0, 0, 77860, 0, 0, 270, 0, 10714, 0, 0, 0, 0, 0, 65372, 0, 74038, + 119558, 6273, 66679, 364, 9595, 194908, 0, 0, 707, 0, 0, 9282, 66489, + 224, 0, 68670, 9332, 4966, 68677, 0, 68644, 0, 3841, 68634, 0, 10732, + 68640, 850, 4972, 0, 64699, 2909, 68619, 44008, 68627, 0, 11544, 10203, + 9608, 0, 0, 11962, 194694, 12507, 1196, 128687, 128311, 777, 120187, + 4375, 65271, 67678, 0, 12198, 0, 64824, 119343, 0, 9454, 63778, 8658, + 42528, 78000, 2705, 917975, 41520, 0, 0, 11986, 7765, 42502, 8280, 0, + 2701, 0, 0, 5767, 0, 0, 9809, 8353, 63747, 66701, 63772, 0, 63745, 1748, + 63770, 0, 0, 0, 65542, 63766, 55244, 3061, 0, 63764, 63787, 9067, 6096, + 0, 7694, 0, 7257, 63768, 3485, 12987, 0, 127522, 120628, 63807, 1591, 0, + 6386, 63783, 0, 0, 127173, 0, 0, 0, 74575, 0, 65719, 13083, 64574, 65012, + 0, 1640, 12495, 66691, 7624, 3138, 10996, 92247, 1922, 0, 12498, 10987, + 0, 0, 3894, 65543, 0, 194842, 0, 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, 0, 0, 11611, + 11632, 127041, 66213, 63864, 66221, 66226, 66229, 13218, 66231, 66216, + 8507, 66236, 66211, 66218, 92672, 66240, 78041, 66233, 8928, 0, 7909, + 66234, 11605, 63759, 0, 66208, 73999, 63799, 63803, 244, 11542, 12898, + 12494, 73761, 12492, 12669, 0, 0, 74153, 0, 128278, 120680, 4882, 13040, + 0, 8612, 4885, 74053, 0, 13042, 4880, 64662, 2429, 1360, 248, 0, 63797, + 92394, 42358, 0, 7292, 0, 63756, 42786, 66693, 0, 1870, 78040, 470, + 78038, 78035, 78036, 0, 78034, 4579, 128090, 0, 12511, 74453, 12514, 0, + 74579, 7239, 7001, 8623, 0, 128052, 128048, 7378, 12512, 11615, 6104, 0, + 0, 659, 6098, 0, 12234, 127307, 127067, 8311, 12510, 41803, 13039, + 127072, 12513, 10202, 12471, 0, 8747, 0, 0, 0, 2323, 0, 2319, 77917, + 12477, 77916, 2311, 0, 4415, 237, 6281, 127280, 0, 0, 2309, 1312, 8173, + 128871, 12469, 0, 78505, 64335, 10609, 0, 128111, 9397, 11524, 9395, + 9396, 9393, 9394, 9391, 9392, 9389, 6209, 9387, 9388, 4932, 9386, 9383, + 9384, 6740, 0, 65451, 8185, 0, 917832, 43024, 43336, 67659, 2313, 128167, + 7948, 9236, 0, 0, 0, 10570, 43473, 6289, 10484, 0, 0, 11998, 12082, + 10924, 3147, 0, 120684, 12524, 119081, 2310, 11818, 9381, 9382, 9379, + 9380, 9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 12444, 0, 0, 13016, + 8210, 0, 42029, 11079, 12331, 43451, 42032, 8744, 726, 0, 0, 4155, 0, 0, + 42030, 5007, 12522, 43088, 0, 4951, 127805, 127240, 0, 9922, 43309, 0, + 12525, 0, 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, 78394, 74069, 77995, 78391, 3608, 8281, 120320, 1107, 0, + 9076, 8862, 69743, 41052, 13084, 64766, 43217, 7803, 13222, 74165, 74782, + 128817, 8546, 11553, 63995, 13177, 9043, 6303, 0, 498, 64471, 120324, + 128567, 12529, 8042, 0, 2344, 12528, 8031, 2414, 0, 69719, 3231, 0, 6422, + 66512, 69653, 12530, 2537, 78405, 41429, 12658, 13036, 65772, 0, 78738, + 41433, 4719, 469, 0, 4363, 3313, 41428, 78407, 2023, 1772, 78224, 78225, + 65706, 10051, 64812, 78220, 0, 9920, 12215, 0, 4931, 1951, 12497, 119363, + 9607, 0, 9663, 0, 119634, 6503, 41110, 0, 1491, 0, 0, 127304, 41061, 0, + 0, 127187, 65026, 41993, 41509, 11045, 65028, 78602, 66476, 41108, 9738, + 41995, 1075, 1958, 12535, 41992, 41506, 0, 41687, 0, 120717, 127776, + 9940, 127299, 7692, 0, 8008, 41131, 330, 8566, 65083, 41133, 9816, + 128074, 12532, 78550, 78546, 3508, 127058, 43235, 0, 127298, 64139, + 78231, 6411, 12910, 78554, 66644, 13028, 6737, 12537, 0, 0, 64136, 12536, + 2350, 13029, 78233, 0, 0, 13030, 6702, 4527, 0, 12538, 128810, 0, 65599, + 65717, 9966, 0, 4948, 12484, 4032, 128149, 12623, 0, 6207, 0, 6117, + 65930, 8412, 0, 7438, 1296, 2325, 41511, 0, 10149, 74118, 0, 127286, + 12481, 0, 12488, 0, 0, 41556, 64414, 118802, 2354, 128571, 73766, 0, + 6295, 901, 41510, 7953, 0, 65032, 41513, 0, 11927, 66584, 78559, 78560, + 78557, 78558, 0, 78556, 848, 9868, 0, 6424, 78568, 119338, 78565, 74031, + 78563, 78564, 2352, 78572, 893, 64576, 11289, 1407, 0, 0, 13026, 6762, + 78579, 78580, 13023, 8903, 9777, 66715, 1871, 8099, 0, 0, 1343, 0, 0, + 9325, 6818, 6283, 11738, 0, 0, 0, 11741, 0, 0, 9216, 8263, 11279, 194752, + 0, 194754, 13021, 64494, 3136, 194758, 194757, 194760, 13022, 42737, + 9956, 0, 0, 74552, 10014, 0, 41260, 119340, 13020, 10024, 194764, 194767, + 74340, 69681, 0, 64945, 8029, 0, 0, 0, 3335, 0, 0, 9776, 120526, 194748, 5215, 42644, 3333, 1632, 194751, 64849, 3342, 78582, 5363, 12957, 78581, - 4156, 0, 0, 6421, 78591, 1611, 78589, 13018, 74257, 78588, 78584, 3337, + 4156, 0, 0, 6421, 78591, 1611, 78589, 13018, 74257, 78588, 74542, 3337, 4537, 67895, 11736, 0, 68608, 6482, 4214, 73790, 11945, 0, 13046, 8838, 425, 4025, 10709, 78595, 2108, 2392, 13047, 0, 0, 6819, 13049, 6499, - 194739, 12424, 68614, 73944, 13050, 9924, 194745, 6507, 0, 0, 0, 3277, - 8929, 4947, 41055, 0, 194722, 194721, 194724, 13045, 64626, 66034, 7751, - 194727, 8371, 194729, 3997, 12806, 8768, 13044, 0, 12420, 4024, 194730, - 41054, 1078, 9757, 194734, 41057, 0, 0, 0, 0, 0, 0, 127109, 0, 41496, 0, - 9165, 1572, 11911, 0, 118842, 2346, 13270, 8958, 0, 9646, 3773, 43183, - 6401, 5831, 0, 0, 13043, 8056, 0, 65681, 208, 0, 0, 0, 0, 0, 10699, 6408, - 0, 7825, 5661, 0, 120630, 3603, 41109, 2398, 3548, 0, 0, 119933, 0, 3115, - 9918, 0, 11321, 0, 0, 0, 194726, 4876, 74286, 0, 0, 43468, 0, 41558, - 41471, 73950, 8158, 9944, 41472, 0, 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, - 194665, 63959, 0, 9942, 13231, 0, 64752, 4732, 194666, 11596, 119931, - 65187, 1626, 63983, 10110, 64772, 42024, 6420, 42028, 0, 10509, 2795, - 4910, 194728, 69231, 64753, 6275, 917808, 118830, 63978, 11044, 3229, - 6423, 42774, 0, 0, 0, 12823, 2331, 917810, 42026, 6137, 0, 7524, 0, - 917809, 119343, 0, 8338, 0, 65043, 0, 822, 0, 9903, 64721, 42722, 194656, - 194659, 78655, 78661, 194660, 78662, 41265, 5311, 1795, 965, 118791, - 10587, 78055, 11278, 78632, 194640, 0, 12946, 194641, 120705, 194643, - 6294, 3144, 194648, 194647, 65019, 194649, 73990, 0, 0, 748, 41067, 2330, - 535, 3148, 12375, 194652, 194629, 10556, 2475, 12388, 4889, 8968, 67863, - 3593, 0, 0, 2342, 0, 194634, 65206, 4894, 194635, 4890, 194637, 917804, - 581, 4893, 0, 6571, 65545, 4888, 4157, 78048, 78049, 78046, 78047, 0, - 10119, 6415, 0, 0, 0, 0, 0, 11375, 64746, 2332, 78063, 412, 78061, 64932, - 42880, 43587, 0, 0, 0, 0, 65197, 78066, 12203, 78064, 78065, 8913, 65854, - 4875, 65811, 120381, 120389, 118888, 9344, 8826, 120386, 120395, 13104, - 74781, 11997, 120393, 78075, 0, 3134, 0, 65696, 0, 0, 66217, 0, 8334, - 119344, 0, 3449, 0, 0, 78414, 78413, 118950, 74011, 0, 0, 0, 0, 1908, - 120167, 4328, 10734, 127014, 0, 0, 7804, 78272, 10811, 6250, 11339, 4914, - 11367, 0, 78054, 4917, 74516, 74208, 64285, 4912, 5464, 0, 118893, 2361, + 92243, 12424, 68614, 73944, 13050, 9924, 194745, 6507, 127919, 0, 128069, + 3277, 8929, 4947, 41055, 0, 194722, 194721, 194724, 13045, 64626, 66034, + 7751, 194727, 8371, 194729, 3997, 12806, 8768, 13044, 0, 12420, 4024, + 194730, 41054, 1078, 9757, 69736, 41057, 0, 0, 0, 0, 0, 92210, 92411, 0, + 41496, 0, 9165, 1572, 11911, 0, 118842, 2346, 13270, 8958, 0, 9646, 3773, + 43183, 6401, 5831, 0, 0, 13043, 8056, 92494, 65681, 208, 127382, 41514, + 0, 0, 0, 10699, 6408, 92227, 7825, 5661, 0, 120630, 3603, 41109, 2398, + 3548, 0, 0, 119933, 0, 3115, 9918, 0, 11321, 42912, 0, 0, 194726, 4876, + 65804, 0, 0, 43468, 0, 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, 194665, 63959, 0, 9942, 13231, 0, + 64752, 4732, 194666, 11596, 119931, 65187, 1626, 63983, 10110, 64772, + 42024, 6420, 42028, 0, 10509, 2795, 4910, 194728, 69231, 64753, 6275, + 917808, 118830, 63978, 11044, 3229, 6423, 42774, 0, 0, 0, 12823, 2331, + 917810, 42026, 6137, 0, 7524, 0, 917809, 8346, 0, 8338, 128315, 65043, 0, + 822, 127984, 9903, 64721, 42722, 194656, 194659, 78655, 78661, 194660, + 78662, 41265, 5311, 1795, 965, 118791, 10587, 78055, 11278, 78632, + 194640, 0, 12946, 194641, 119341, 120349, 6294, 3144, 194648, 194647, + 65019, 194649, 73990, 0, 0, 748, 41067, 2330, 535, 3148, 12375, 194652, + 194629, 10556, 2475, 12388, 4889, 8968, 67863, 3593, 0, 0, 2342, 0, + 194634, 65206, 4894, 194635, 4890, 194637, 917804, 581, 4893, 0, 6571, + 65545, 4888, 4157, 78048, 78049, 78046, 78047, 0, 10119, 6415, 42893, 0, + 69702, 0, 0, 11375, 64746, 2332, 78063, 412, 78061, 64932, 42880, 43587, + 0, 0, 0, 0, 65197, 78066, 12203, 78064, 78065, 8913, 65854, 4875, 65811, + 120381, 120389, 118888, 9344, 8826, 120386, 120395, 13104, 74781, 11997, + 120393, 78075, 0, 3134, 0, 65696, 92331, 0, 66217, 0, 8334, 119344, 0, + 3449, 0, 0, 78414, 78413, 118950, 74011, 0, 0, 0, 0, 1908, 120167, 4328, + 10734, 127014, 0, 127914, 7804, 78272, 10811, 6250, 11339, 4914, 11367, + 0, 78054, 4917, 74516, 74208, 64285, 4912, 5464, 127836, 118893, 2361, 7971, 78072, 78073, 55243, 78071, 0, 8086, 74317, 6707, 8319, 2312, 40977, 10960, 40962, 8305, 12573, 0, 40980, 0, 13202, 0, 12582, 78282, 0, - 0, 42438, 55221, 6288, 78280, 0, 5653, 42400, 10891, 7698, 5658, 74045, - 0, 0, 0, 4913, 0, 0, 0, 42326, 0, 0, 0, 42478, 2327, 0, 12563, 42287, - 12705, 0, 0, 12588, 8821, 6153, 2867, 194708, 66312, 698, 194709, 194606, - 10356, 74075, 194713, 651, 12641, 0, 0, 0, 0, 41552, 65115, 78465, 78467, - 78463, 78464, 194695, 78461, 194697, 74356, 0, 4716, 43277, 0, 78474, - 12340, 120568, 0, 194700, 55264, 41211, 120676, 8703, 5462, 917629, 0, - 10101, 0, 0, 8479, 4151, 41933, 0, 0, 66254, 120821, 0, 0, 0, 0, 119194, - 74050, 0, 0, 0, 0, 0, 0, 12278, 0, 0, 0, 2700, 12576, 7842, 12899, 0, 0, - 2699, 0, 73845, 2985, 119222, 0, 917845, 12192, 119314, 0, 119312, 9827, - 119310, 119311, 119308, 119309, 119306, 11481, 41210, 119305, 0, 35, - 78481, 78482, 66694, 68479, 78477, 78478, 43596, 6090, 64257, 7812, - 10534, 0, 78485, 73848, 78483, 4272, 0, 40967, 40964, 917825, 12704, - 78487, 43306, 0, 64497, 12138, 7930, 0, 43303, 68216, 0, 917826, 5244, - 4189, 127098, 67596, 0, 4188, 1879, 0, 968, 0, 43743, 0, 8873, 0, 0, - 917827, 65555, 12574, 0, 0, 0, 74490, 127099, 43657, 0, 0, 0, 42682, - 12578, 12720, 0, 41227, 0, 12346, 127101, 64848, 0, 0, 7251, 0, 0, - 118850, 119141, 0, 66015, 0, 959, 8885, 12564, 66457, 78808, 9469, 9632, - 0, 74761, 64323, 0, 0, 0, 0, 310, 0, 41281, 10976, 0, 194768, 0, 74266, - 10054, 6497, 8574, 0, 9012, 19958, 74420, 65089, 13215, 65047, 65163, - 74044, 374, 43195, 816, 0, 0, 0, 41934, 7465, 0, 0, 0, 4715, 6101, 0, - 41936, 0, 4879, 0, 65446, 0, 307, 0, 9585, 5374, 0, 0, 0, 0, 0, 0, 0, - 65567, 120614, 1929, 0, 12142, 0, 12236, 41419, 194618, 194621, 12982, - 194623, 5378, 78791, 0, 41421, 0, 4462, 0, 0, 0, 821, 0, 2498, 5800, - 120157, 0, 1760, 0, 4469, 2324, 828, 3611, 78400, 757, 1185, 0, 78770, - 43597, 10628, 74808, 194572, 7999, 43971, 0, 0, 10634, 10942, 7713, 2348, - 0, 64374, 4380, 194608, 119044, 9982, 64324, 41240, 862, 65626, 78462, - 1810, 3673, 5137, 194617, 0, 7277, 65622, 0, 7566, 64688, 194593, 194592, - 78092, 74357, 194597, 4748, 194599, 194598, 194601, 42260, 5871, 119075, - 0, 74576, 44019, 0, 194602, 3967, 194604, 13137, 8775, 194605, 0, 2963, - 0, 8410, 4454, 723, 917600, 966, 4449, 0, 127060, 0, 7819, 2320, 194589, - 339, 4968, 194590, 120399, 8075, 55276, 0, 8047, 0, 78827, 12634, 41542, - 78780, 7466, 6705, 12174, 42610, 0, 74452, 0, 1584, 66645, 6045, 6729, - 120640, 65218, 78777, 0, 78062, 7537, 0, 11370, 0, 10330, 0, 10394, 0, - 194783, 0, 0, 9780, 0, 13092, 194576, 119605, 194578, 7074, 120396, - 194579, 194582, 11414, 194584, 2531, 13034, 0, 0, 0, 1259, 7517, 0, 0, + 0, 42438, 55221, 6288, 78280, 127946, 5653, 42400, 10891, 7698, 5658, + 74045, 120165, 0, 0, 4913, 0, 0, 0, 42326, 128194, 12728, 92685, 42478, + 2327, 0, 12563, 42287, 12705, 0, 0, 12588, 8821, 6153, 2867, 194708, + 66312, 698, 128007, 194606, 10356, 74075, 194713, 651, 12641, 0, 0, 0, 0, + 41552, 65115, 78465, 78467, 78463, 78464, 128851, 78461, 194697, 74356, + 92626, 4716, 43277, 0, 78474, 12340, 120568, 0, 194700, 55264, 41211, + 120676, 8703, 5462, 917629, 0, 10101, 0, 0, 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, 0, 917845, 12192, 119314, 0, 119312, 9827, 119310, 119311, 119308, + 119309, 119306, 11481, 41210, 119305, 0, 35, 78481, 78482, 66694, 68479, + 78477, 78478, 43596, 6090, 64257, 7812, 10534, 0, 78485, 73848, 78483, + 4272, 0, 40967, 40964, 917825, 12704, 78487, 43306, 0, 64497, 12138, + 7930, 0, 43303, 68216, 0, 917826, 5244, 4189, 127098, 67596, 127504, + 4188, 1879, 0, 968, 0, 43743, 0, 8873, 0, 0, 917827, 65555, 12574, 0, 0, + 0, 74490, 127099, 43657, 0, 0, 0, 42682, 12578, 12720, 0, 41227, 0, + 12346, 127101, 64848, 0, 0, 7251, 0, 0, 118850, 119141, 128546, 66015, 0, + 959, 8885, 12564, 66457, 78808, 9469, 9632, 92323, 74761, 64323, 0, 0, 0, + 0, 310, 0, 41281, 10976, 0, 92190, 0, 74266, 10054, 6497, 8574, 0, 9012, + 19958, 74420, 65089, 13215, 12730, 65163, 74044, 374, 43195, 816, 0, 0, + 0, 41934, 7465, 0, 128168, 0, 4715, 6101, 0, 41936, 0, 4879, 0, 65446, 0, + 307, 127147, 9585, 5374, 0, 128059, 0, 0, 0, 0, 0, 65567, 120614, 1929, + 0, 12142, 0, 12236, 41419, 194618, 120610, 12982, 194623, 5378, 78791, + 128679, 41421, 0, 4462, 0, 0, 128092, 821, 0, 2498, 5800, 120157, 0, + 1760, 2421, 4469, 2324, 828, 3611, 78400, 757, 1185, 0, 78770, 43597, + 10628, 74808, 194572, 7999, 43971, 0, 0, 10634, 10942, 7713, 2348, 0, + 64374, 4380, 194608, 119044, 9982, 64324, 41240, 862, 65626, 78462, 1810, + 3673, 5137, 194617, 0, 7277, 65622, 0, 7566, 64688, 194593, 194592, + 78092, 74357, 194597, 4748, 92228, 194598, 194601, 42260, 5871, 119075, + 0, 74576, 44019, 0, 128189, 3967, 194604, 13137, 8775, 127945, 0, 2963, + 0, 8410, 4454, 723, 127882, 966, 4449, 92330, 92238, 0, 7819, 2320, + 194589, 339, 4968, 194590, 120399, 8075, 55276, 0, 8047, 0, 78827, 12634, + 41542, 78780, 7466, 6705, 12174, 42610, 0, 74452, 0, 1584, 66645, 6045, + 6729, 120640, 65218, 78777, 0, 78062, 7537, 0, 11370, 0, 10330, 0, 10394, + 0, 74194, 0, 127929, 9780, 0, 13092, 194576, 119605, 194578, 7074, 92648, + 194579, 194582, 11414, 128868, 2531, 13034, 0, 0, 4211, 1259, 7517, 0, 0, 194561, 40996, 13037, 7092, 641, 5219, 194567, 194566, 11064, 41129, 0, - 42850, 13035, 9075, 0, 5466, 194570, 0, 64098, 65793, 4535, 194573, 4271, - 78417, 0, 6769, 41410, 0, 64262, 6767, 41407, 0, 0, 6755, 118864, 9046, - 0, 0, 0, 0, 0, 0, 67675, 0, 0, 0, 64338, 2563, 13033, 247, 118915, 0, - 12338, 4651, 0, 11270, 0, 0, 11933, 0, 0, 41903, 43447, 11001, 0, 42255, - 0, 0, 0, 41905, 0, 0, 10775, 9793, 5009, 0, 42269, 64587, 0, 42535, - 69812, 64529, 41408, 42853, 3877, 120795, 42674, 8147, 43566, 119021, 0, - 10236, 65918, 0, 0, 0, 64506, 0, 118921, 4747, 0, 0, 43200, 5832, 0, 0, - 5141, 42600, 0, 43203, 0, 0, 43286, 0, 0, 0, 0, 41305, 78776, 74137, - 11303, 65547, 0, 7031, 859, 0, 0, 0, 6059, 126985, 55235, 0, 8535, 0, - 65196, 194787, 66032, 11488, 0, 120786, 42233, 127488, 9946, 63885, 0, - 11822, 0, 43189, 0, 0, 1788, 1579, 120482, 917817, 0, 0, 0, 9028, 119571, - 69234, 0, 0, 1285, 64882, 41242, 0, 0, 12640, 0, 7401, 0, 12625, 68198, - 0, 0, 3940, 41597, 55260, 3396, 12642, 8665, 0, 0, 12630, 1653, 917815, - 10153, 0, 6166, 120516, 120523, 0, 8815, 66673, 65046, 9285, 913, 42259, - 119317, 119318, 119315, 68454, 42485, 118837, 7878, 8211, 42293, 64377, - 0, 0, 0, 194673, 12032, 0, 9725, 0, 78431, 5263, 12818, 78430, 41939, - 10022, 65387, 78419, 42777, 10139, 980, 43698, 65386, 0, 0, 43701, 43198, - 7184, 120673, 194797, 917819, 10085, 119992, 0, 119993, 6634, 0, 0, - 119323, 8072, 119321, 43700, 0, 8872, 7783, 917992, 12398, 8237, 0, 0, - 12395, 0, 126977, 120565, 9914, 127011, 917854, 73975, 6367, 6351, 66688, - 0, 78107, 0, 64735, 41243, 0, 7808, 1829, 0, 41937, 4358, 43272, 6353, 0, - 0, 120422, 0, 1710, 0, 0, 65607, 0, 49, 6627, 0, 6258, 10683, 78672, - 9741, 78443, 5649, 78441, 43443, 64418, 1643, 65213, 8405, 3470, 0, - 13213, 42452, 78331, 0, 78445, 0, 1072, 78457, 78452, 78454, 6576, 41988, - 41132, 65675, 1080, 120002, 9886, 55225, 1101, 68404, 12309, 55227, 0, - 12632, 1086, 1869, 78685, 7680, 0, 65458, 120714, 12639, 3380, 8123, - 1091, 12638, 7977, 4501, 0, 0, 66309, 0, 0, 1494, 0, 0, 0, 11693, 0, - 10494, 119230, 65872, 12363, 11386, 0, 0, 0, 0, 64582, 0, 73794, 0, 8022, - 0, 0, 74106, 12413, 194829, 917994, 0, 917995, 5570, 1881, 7210, 0, 1012, - 66630, 0, 120709, 7208, 66442, 5569, 0, 42339, 0, 6063, 0, 0, 119594, - 6053, 65602, 0, 0, 64727, 9160, 194827, 0, 0, 0, 10503, 118810, 6055, - 3870, 4279, 8490, 120114, 4319, 64786, 8602, 120110, 11326, 0, 0, 0, - 120119, 78333, 120117, 120118, 120099, 120100, 65087, 5571, 3674, 9740, - 9121, 5568, 120107, 120108, 42085, 10107, 42159, 42870, 120101, 589, - 7050, 0, 43281, 10233, 41263, 66251, 65729, 66253, 0, 74099, 42645, 0, - 194815, 8583, 0, 5847, 6928, 0, 0, 0, 0, 0, 66592, 12204, 0, 19966, - 77856, 42561, 120626, 0, 0, 8120, 120701, 0, 0, 0, 41063, 0, 10664, 0, - 8369, 0, 4551, 0, 74759, 0, 0, 9673, 66334, 65580, 10478, 118960, 12517, - 557, 9457, 12034, 0, 6355, 12519, 41004, 0, 0, 74094, 0, 0, 77970, 0, 0, - 0, 12111, 3927, 0, 12515, 1474, 67893, 5492, 6923, 0, 10441, 73836, 0, - 43990, 5493, 0, 74319, 0, 66635, 12019, 0, 1618, 0, 120474, 9645, 10430, - 917959, 5853, 13063, 10363, 0, 12956, 0, 120729, 11314, 0, 12060, 0, - 78392, 12826, 6329, 0, 10514, 65517, 74395, 2707, 8309, 0, 127054, 78398, - 43570, 2697, 43420, 78396, 127057, 2695, 42171, 0, 0, 0, 67617, 118971, - 0, 2693, 12125, 12766, 0, 1164, 0, 0, 41918, 0, 0, 8687, 66009, 12178, - 7053, 0, 7469, 0, 5248, 12218, 120538, 6427, 42884, 41123, 0, 0, 42873, + 42850, 13035, 9075, 92387, 5466, 128153, 0, 64098, 65793, 4535, 194573, + 4271, 78417, 128357, 6769, 41410, 0, 64262, 6767, 41407, 0, 0, 6755, + 118864, 9046, 127934, 0, 0, 0, 0, 0, 67675, 0, 0, 0, 64338, 2563, 13033, + 247, 118915, 0, 12338, 4651, 0, 11270, 0, 0, 11933, 0, 0, 41903, 43447, + 11001, 0, 42255, 0, 92661, 69821, 41905, 0, 0, 10775, 9793, 5009, 0, + 42269, 64587, 0, 42535, 69812, 64529, 41408, 42853, 3877, 120795, 42674, + 8147, 43566, 119021, 0, 10236, 65918, 43782, 0, 0, 64506, 69652, 118921, + 4747, 128058, 0, 43200, 5832, 0, 0, 5141, 42600, 0, 43203, 0, 0, 43286, + 0, 128211, 43778, 0, 41305, 78776, 43781, 11303, 65547, 0, 7031, 859, 0, + 0, 0, 6059, 126985, 55235, 0, 8535, 0, 65196, 194787, 66032, 11488, 0, + 120786, 42233, 64140, 9946, 63885, 0, 11822, 0, 43189, 0, 0, 1788, 1579, + 120482, 917817, 0, 0, 0, 9028, 119571, 69234, 0, 0, 1285, 64882, 41242, + 0, 0, 12640, 0, 7401, 0, 12625, 68198, 0, 92254, 3940, 41597, 55260, + 3396, 12642, 8665, 0, 0, 12630, 1653, 917815, 10153, 0, 6166, 120516, + 120523, 0, 8815, 66673, 65046, 9285, 913, 42259, 119317, 119318, 2142, + 68454, 42485, 118837, 7878, 8211, 42293, 64377, 0, 92643, 0, 194673, + 12032, 0, 9725, 0, 78431, 5263, 12818, 78430, 41939, 10022, 65387, 78419, + 42777, 10139, 980, 43698, 65386, 0, 0, 43701, 43198, 7184, 120673, + 194797, 917819, 10085, 119992, 0, 119993, 6634, 92373, 0, 119323, 8072, + 119321, 43700, 0, 8872, 7783, 917992, 12398, 8237, 0, 0, 12395, 0, + 126977, 120565, 9914, 127011, 917854, 73975, 6367, 6351, 66688, 0, 78107, + 0, 64735, 41243, 92199, 7808, 1829, 0, 41937, 4358, 43272, 6353, 0, 0, + 120422, 0, 1710, 0, 0, 65607, 0, 49, 6627, 0, 6258, 10683, 78672, 9741, + 78329, 5649, 78441, 43443, 64418, 1643, 65213, 8405, 3470, 128225, 13213, + 42452, 78331, 0, 78445, 0, 1072, 78457, 78452, 78454, 6576, 41988, 41132, + 65675, 1080, 120002, 9886, 55225, 1101, 68404, 12309, 55227, 0, 12632, + 1086, 1869, 78685, 7680, 0, 65458, 120714, 12639, 3380, 8123, 1091, + 12638, 7977, 4501, 41099, 0, 66309, 0, 0, 1494, 0, 0, 0, 11693, 0, 10494, + 92655, 65872, 12363, 11386, 0, 0, 0, 0, 64582, 0, 73794, 0, 8022, 0, + 120462, 74106, 12413, 194829, 917994, 0, 917995, 5570, 1881, 7210, 0, + 1012, 66630, 0, 120709, 7208, 66442, 5569, 0, 42339, 0, 6063, 0, 0, + 119594, 6053, 65602, 0, 92201, 64727, 9160, 194827, 0, 0, 92180, 10503, + 118810, 6055, 3870, 4279, 8490, 120114, 4319, 64786, 8602, 120110, 11326, + 92204, 0, 0, 120119, 78333, 120117, 120118, 120099, 120100, 65087, 5571, + 3674, 9740, 9121, 5568, 120107, 120108, 42085, 10107, 42159, 42870, + 120101, 589, 7050, 0, 43281, 10233, 41263, 66251, 65729, 66253, 0, 74099, + 42645, 0, 194815, 8583, 0, 5847, 6928, 0, 0, 0, 0, 0, 66592, 12204, + 917962, 19966, 77856, 42561, 120626, 0, 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, 0, 6355, 12519, 41004, 0, + 195025, 74094, 0, 0, 77970, 0, 0, 128175, 12111, 3927, 0, 12515, 1474, + 67893, 5492, 6923, 128099, 10441, 73836, 0, 43990, 5493, 0, 74319, 0, + 66635, 12019, 0, 1618, 0, 120474, 9645, 10430, 917959, 5853, 13063, + 10363, 0, 12956, 128169, 120729, 11314, 917582, 12060, 0, 78392, 12826, + 6329, 0, 10514, 65517, 74395, 2707, 8309, 0, 127054, 78398, 43570, 2697, + 43420, 78396, 127057, 2695, 42171, 0, 0, 0, 67617, 118971, 0, 2693, + 12125, 12766, 0, 1164, 0, 0, 41918, 0, 127542, 8687, 66009, 12178, 7053, + 128001, 7469, 0, 5248, 12218, 120538, 6427, 42884, 41123, 0, 0, 42873, 41126, 9991, 41128, 74371, 127031, 0, 9873, 0, 42877, 7994, 64762, 2053, 42843, 6591, 9340, 0, 1589, 0, 296, 74438, 78852, 0, 67841, 74370, 0, - 8922, 0, 74600, 12700, 74836, 0, 12579, 0, 12575, 6416, 5656, 2891, + 8922, 128068, 74600, 12700, 74836, 0, 12579, 0, 12575, 6416, 5656, 2891, 13262, 65590, 5299, 0, 11473, 5449, 1252, 0, 78404, 41431, 74369, 65373, - 5295, 0, 74114, 1223, 1642, 174, 78399, 883, 4161, 12691, 42603, 41413, - 3212, 41459, 3211, 74810, 41425, 127029, 78412, 74450, 9728, 3846, 8070, - 6150, 6636, 4370, 0, 0, 74178, 74587, 74117, 0, 0, 0, 4986, 12189, 0, - 67648, 120499, 917553, 4257, 12104, 77942, 6220, 9004, 65561, 0, 77949, - 0, 68135, 917576, 77946, 0, 0, 0, 9890, 78561, 12971, 78453, 0, 73898, - 11979, 0, 118900, 917894, 0, 9635, 12600, 8871, 0, 0, 0, 6469, 74227, 0, - 65304, 4679, 10230, 64300, 64867, 3427, 4240, 0, 0, 0, 0, 917952, 0, 0, - 0, 7282, 78728, 65733, 4445, 0, 0, 3494, 74606, 6555, 0, 77976, 0, 0, - 78566, 0, 0, 65898, 0, 65312, 5447, 0, 12895, 65593, 4010, 0, 41106, 0, - 65804, 0, 41105, 0, 65820, 6232, 0, 0, 0, 43608, 119091, 0, 6538, 4335, - 78364, 3941, 41122, 11061, 78363, 64892, 9113, 1954, 12155, 0, 42878, - 11500, 0, 0, 74578, 0, 65832, 0, 0, 0, 77975, 0, 4586, 0, 350, 10951, 0, - 509, 0, 0, 0, 0, 0, 5133, 0, 0, 9500, 0, 12162, 64741, 0, 9354, 0, 0, 0, - 2496, 11516, 944, 118851, 3890, 12168, 1438, 0, 0, 0, 41947, 1220, - 120828, 0, 0, 0, 1571, 42630, 41949, 42805, 8270, 943, 564, 0, 312, - 41980, 0, 0, 78120, 8877, 269, 4429, 6272, 9617, 1460, 6954, 78657, - 41120, 65121, 10862, 6060, 41119, 41416, 74355, 4173, 0, 0, 0, 1906, - 917986, 11532, 74073, 0, 0, 1985, 6296, 9582, 917895, 64287, 0, 78115, - 11428, 1730, 2457, 0, 19918, 10469, 0, 0, 7703, 8840, 8035, 0, 0, 0, 0, - 6129, 0, 0, 0, 0, 7874, 8681, 0, 0, 13136, 0, 0, 74278, 63886, 118881, - 9605, 73892, 13220, 0, 120274, 5514, 0, 9228, 0, 0, 0, 5240, 9811, 10012, - 3096, 0, 0, 0, 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, 0, 19935, 0, 0, 0, 0, 0, 0, 5275, 0, 0, 8637, 0, 0, 3789, 63880, - 11471, 43554, 65862, 11474, 66332, 66603, 0, 2426, 12042, 0, 0, 9537, - 3961, 12115, 0, 2605, 4500, 64561, 55224, 4981, 0, 0, 63876, 11667, - 42686, 77973, 42362, 64686, 4499, 41649, 7589, 0, 0, 3237, 0, 68215, 0, - 8541, 78298, 0, 41866, 0, 0, 0, 0, 0, 43555, 2823, 9559, 0, 41940, 8299, - 41945, 0, 41941, 3308, 7190, 64880, 8614, 65220, 41493, 0, 41699, 10762, - 0, 12999, 0, 0, 8106, 4128, 0, 0, 4494, 0, 4012, 10395, 0, 119567, 65447, - 0, 0, 11004, 695, 739, 696, 7611, 0, 42755, 74802, 9227, 7506, 7510, 0, - 691, 738, 7511, 7512, 7515, 3868, 688, 41847, 690, 2548, 737, 974, 8003, - 7406, 0, 0, 0, 3985, 0, 65860, 63921, 7051, 69777, 4682, 917805, 12809, - 6406, 4685, 0, 10879, 10347, 4680, 6341, 0, 3851, 8132, 74325, 0, 917907, - 0, 41958, 119176, 917908, 0, 0, 42657, 0, 7643, 42373, 11714, 67587, - 43568, 0, 11717, 7650, 10594, 64951, 7647, 7649, 0, 7646, 0, 78082, 9651, - 0, 3891, 0, 0, 2337, 1735, 74324, 67860, 5452, 0, 0, 43561, 0, 0, 74146, - 1860, 7495, 7580, 5812, 7497, 7584, 0, 0, 0, 120347, 7727, 0, 8498, - 69818, 8949, 3065, 42719, 0, 1569, 0, 12534, 12124, 7690, 0, 12533, 0, - 6418, 4543, 78086, 6969, 0, 74800, 0, 0, 11980, 0, 0, 63894, 120760, - 12282, 66192, 0, 74592, 8850, 74275, 9238, 10617, 917545, 0, 0, 0, 12791, - 0, 0, 0, 4447, 73732, 12793, 12900, 0, 10950, 0, 78087, 12790, 41400, - 119128, 0, 12792, 42232, 0, 1744, 12789, 10366, 12317, 41310, 0, 41399, - 0, 0, 55258, 0, 12690, 0, 0, 43672, 0, 41652, 2974, 9010, 11315, 0, 278, - 0, 41405, 119254, 0, 10077, 63853, 74557, 42586, 0, 0, 6002, 0, 43553, 0, - 67903, 0, 12787, 41308, 7934, 65306, 0, 0, 0, 8646, 0, 77829, 0, 0, 6413, - 6550, 0, 1940, 0, 43637, 220, 65193, 43551, 10678, 10044, 0, 0, 0, 68659, - 6403, 5707, 10393, 127532, 0, 66614, 0, 0, 0, 10297, 0, 3742, 0, 3959, 0, - 0, 0, 2467, 0, 6003, 63844, 6663, 8040, 0, 63845, 4182, 78171, 4676, - 120501, 0, 0, 2510, 0, 10208, 78168, 0, 11540, 43546, 6692, 0, 41060, 0, - 0, 9083, 0, 0, 78144, 1559, 63831, 9677, 120260, 0, 65256, 0, 74070, 0, - 0, 365, 12056, 43027, 120423, 41716, 0, 0, 120472, 5516, 2845, 7717, - 8036, 41717, 73827, 544, 12045, 6278, 0, 5515, 0, 0, 0, 65339, 43221, - 65194, 0, 5517, 0, 0, 74841, 67884, 0, 67890, 67885, 67880, 67881, 67882, - 67883, 0, 0, 67879, 0, 1902, 67887, 9638, 12976, 0, 12483, 12368, 41769, - 42726, 41765, 0, 6667, 67874, 7556, 67878, 74351, 11264, 989, 42677, - 67889, 0, 1311, 0, 4326, 11000, 63824, 13068, 10932, 0, 6917, 78155, 0, - 949, 78162, 0, 6148, 8605, 42253, 78177, 0, 0, 42715, 0, 0, 0, 63871, 0, - 41796, 1269, 6530, 0, 65057, 0, 5144, 12221, 42716, 0, 4431, 4331, 0, 0, - 41834, 5279, 0, 10336, 8312, 0, 42701, 0, 0, 78165, 66036, 0, 0, 6428, + 5295, 917569, 74114, 1223, 1642, 174, 78399, 883, 4161, 12691, 42603, + 41413, 3212, 41459, 3211, 74810, 41425, 127029, 78412, 74450, 9728, 3846, + 8070, 6150, 6636, 4370, 0, 0, 74178, 74587, 74117, 0, 0, 0, 4986, 12189, + 0, 67648, 120499, 917553, 4257, 12104, 77942, 6220, 9004, 65561, 0, + 77949, 0, 68135, 917576, 77946, 0, 69679, 69684, 9890, 78561, 12971, + 78453, 92556, 73898, 11979, 0, 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, 0, 65898, 0, 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, 0, 42878, 11500, 0, 0, 74578, 0, 65832, + 0, 0, 0, 77975, 119230, 4586, 0, 350, 10951, 0, 509, 0, 0, 92307, 0, 0, + 5133, 0, 0, 9500, 0, 4957, 64741, 2422, 9354, 0, 0, 0, 2496, 11516, 944, + 118851, 3890, 12168, 1438, 0, 0, 0, 41947, 1220, 120828, 128555, 0, 0, + 1571, 42630, 41949, 42805, 8270, 943, 564, 0, 312, 41980, 0, 0, 78120, + 8877, 269, 4429, 6272, 9617, 1460, 6954, 78657, 41120, 65121, 10862, + 6060, 41119, 41416, 74355, 4173, 0, 0, 0, 1906, 917986, 11532, 74073, 0, + 0, 1985, 6296, 9582, 917895, 64287, 0, 78115, 11428, 1730, 2457, 0, + 19918, 10469, 0, 0, 7703, 8840, 8035, 0, 0, 92491, 0, 6129, 0, 0, 128268, + 0, 7874, 8681, 119092, 0, 13136, 0, 0, 74278, 63886, 118881, 9605, 73892, + 13220, 128776, 120274, 5514, 0, 9228, 0, 0, 0, 5240, 9811, 10012, 3096, + 0, 0, 0, 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, + 0, 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, 0, + 9537, 3961, 12115, 77953, 2605, 4500, 64561, 55224, 4981, 0, 0, 63876, + 11667, 42686, 77973, 42362, 64686, 4499, 41649, 7589, 0, 0, 3237, 0, + 68215, 0, 8541, 78298, 0, 41866, 0, 0, 0, 0, 0, 43555, 2823, 9559, 10060, + 41940, 8299, 41945, 7132, 41941, 3308, 7190, 64880, 8614, 65220, 41493, + 0, 41699, 10762, 43780, 12999, 0, 0, 8106, 4128, 0, 0, 4494, 0, 4012, + 10395, 0, 43633, 65447, 0, 0, 11004, 695, 739, 696, 7611, 0, 42755, + 74802, 9227, 7506, 7510, 92281, 691, 738, 7511, 7512, 7515, 3868, 688, + 41847, 690, 2548, 737, 974, 8003, 7406, 917911, 0, 0, 3985, 917912, + 65860, 63921, 7051, 69777, 4682, 917805, 12809, 6406, 4685, 92505, 10879, + 10347, 4680, 6341, 0, 3851, 8132, 74325, 0, 917907, 0, 41958, 119176, + 917908, 0, 0, 42657, 92468, 7643, 42373, 11714, 67587, 43568, 0, 11717, + 7650, 10594, 64951, 7647, 7649, 128155, 7646, 0, 78082, 9651, 0, 3891, 0, + 0, 2337, 1735, 74324, 67860, 2363, 0, 0, 43561, 0, 0, 74146, 1860, 7495, + 7580, 5812, 7497, 7584, 119140, 127853, 0, 120347, 7727, 0, 8498, 69818, + 8949, 3065, 42719, 7135, 1569, 92375, 12534, 12124, 7690, 0, 12533, 0, + 6418, 4543, 78086, 6969, 0, 74800, 0, 0, 11980, 128650, 0, 63894, 120760, + 12282, 66192, 0, 74592, 8850, 74275, 9238, 10617, 917545, 0, 92625, 0, + 12791, 0, 0, 0, 4447, 73732, 12793, 12900, 92377, 10950, 0, 78087, 12790, + 41400, 119128, 66607, 12792, 42232, 194938, 1744, 12789, 10366, 12317, + 41310, 0, 41399, 0, 0, 55258, 0, 12690, 0, 0, 43672, 127840, 41652, 2974, + 9010, 11315, 0, 278, 0, 41405, 119254, 0, 10077, 63853, 74557, 42586, 0, + 0, 6002, 0, 43553, 0, 67903, 0, 12787, 41308, 7934, 65306, 0, 0, 0, 8646, + 0, 77829, 0, 0, 6413, 6550, 0, 1940, 0, 43637, 220, 65193, 43551, 10678, + 10044, 0, 0, 0, 68659, 6403, 5707, 10393, 127532, 0, 66614, 0, 0, 0, + 10297, 0, 3742, 0, 3959, 0, 0, 0, 2467, 0, 6003, 63844, 6663, 8040, 0, + 63845, 4182, 78171, 4676, 120501, 0, 0, 2510, 0, 10208, 78168, 92361, + 11540, 43546, 6692, 0, 41060, 0, 0, 9083, 0, 0, 78144, 1559, 63831, 9677, + 120260, 0, 65256, 0, 74070, 0, 0, 365, 12056, 43027, 120423, 41716, + 128236, 0, 120472, 5516, 2845, 7717, 8036, 41717, 73827, 544, 12045, + 6278, 0, 5515, 0, 0, 0, 65339, 43221, 65194, 0, 5517, 0, 0, 74841, 67884, + 0, 67890, 67885, 67880, 67881, 67882, 67883, 0, 0, 67879, 127188, 1902, + 67887, 9638, 12976, 0, 12483, 12368, 41769, 42726, 41765, 128819, 6667, + 67874, 7556, 67878, 74351, 11264, 989, 42677, 67889, 0, 1311, 917966, + 4326, 11000, 63824, 13068, 10932, 128880, 6917, 78155, 0, 949, 78162, 0, + 6148, 8605, 42253, 78177, 0, 0, 42715, 0, 0, 0, 63871, 0, 41796, 1269, + 6530, 0, 65057, 0, 5144, 12221, 42716, 0, 4431, 4331, 0, 128675, 41834, + 5279, 0, 10336, 8312, 0, 42701, 128825, 0, 78165, 66036, 0, 0, 6428, 42270, 0, 0, 43059, 42666, 5256, 1067, 255, 12131, 0, 9493, 0, 41014, 11793, 0, 0, 74394, 43460, 10653, 42723, 0, 119632, 0, 6560, 7016, 74274, - 0, 43556, 3929, 0, 6614, 2768, 0, 9746, 5135, 11811, 12796, 11953, 0, - 69761, 5139, 346, 74303, 6305, 12795, 4675, 5168, 78552, 0, 74315, 74361, - 8253, 8817, 1136, 0, 43563, 0, 0, 194750, 7392, 8230, 9365, 0, 0, 0, 0, - 0, 4041, 0, 2357, 43240, 12786, 229, 119885, 119884, 44004, 43552, - 119881, 12350, 65554, 119882, 119877, 119876, 12785, 63863, 119873, 7770, - 10712, 64853, 12686, 118916, 42375, 0, 127238, 66352, 10470, 0, 11059, - 10791, 917944, 450, 0, 0, 10432, 12097, 5450, 64691, 1233, 0, 44009, - 78284, 66338, 0, 0, 1839, 118799, 0, 10927, 1701, 0, 2388, 41749, 41761, - 5453, 8361, 119865, 41758, 5444, 41763, 64889, 119860, 119863, 78677, 0, - 0, 78174, 66432, 8801, 3053, 4340, 0, 0, 65812, 917831, 0, 41824, 0, - 194801, 194800, 194803, 42700, 194805, 194804, 194807, 78676, 120413, - 194808, 0, 0, 4493, 4336, 0, 2314, 43602, 78826, 119325, 194811, 42439, - 64638, 42327, 43528, 4489, 194791, 0, 194793, 1912, 42385, 10306, 10370, - 0, 0, 8867, 10250, 10258, 2712, 1635, 78821, 1410, 0, 0, 118878, 0, 0, - 9919, 0, 559, 0, 41825, 0, 78188, 4892, 74016, 194781, 6542, 41957, 0, - 5777, 0, 759, 65749, 2079, 65248, 12788, 64487, 64552, 0, 10223, 42062, - 0, 0, 0, 3668, 65754, 43560, 12226, 0, 65149, 2340, 41959, 194786, - 194785, 194788, 43618, 65747, 10937, 2962, 0, 2321, 3587, 65745, 0, 8921, - 9952, 0, 0, 42714, 9951, 43409, 194770, 2949, 66012, 194775, 194774, - 2958, 68359, 41820, 43038, 2395, 0, 9976, 120043, 194778, 120058, 68220, - 194779, 42809, 42807, 0, 120046, 10198, 4150, 64371, 8318, 41790, 0, - 41898, 2360, 41794, 917942, 0, 0, 0, 0, 2418, 0, 2411, 11336, 799, 63823, - 10276, 10308, 10372, 917541, 41772, 42813, 2317, 10260, 118980, 55284, 0, - 0, 10384, 0, 0, 0, 7753, 2351, 6655, 64489, 0, 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, 0, 10264, 10280, - 9184, 10376, 7013, 4467, 0, 0, 0, 41887, 0, 4862, 9735, 6537, 120591, 0, - 3914, 119604, 0, 9065, 12961, 0, 0, 0, 0, 289, 0, 4694, 11420, 4690, 0, + 0, 43556, 3929, 73900, 6614, 2768, 92504, 9746, 5135, 11811, 12796, + 11953, 0, 69761, 5139, 346, 74303, 6305, 12795, 4675, 5168, 78552, + 127753, 74315, 74361, 8253, 8817, 1136, 0, 43563, 92232, 0, 194750, 7392, + 8230, 9365, 0, 0, 0, 0, 0, 4041, 0, 2357, 43240, 12786, 229, 119885, + 119884, 44004, 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, 0, 0, 10432, 12097, 5450, 64691, + 1233, 0, 44009, 78284, 66338, 0, 0, 1839, 118799, 0, 10927, 1701, 0, + 2388, 41749, 41761, 5453, 8361, 119865, 41758, 5444, 41763, 64889, 7143, + 92493, 78677, 0, 92429, 78174, 66432, 8801, 3053, 4340, 0, 0, 65812, + 917831, 0, 41824, 0, 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, 194791, 0, 194793, + 1912, 42385, 10306, 10370, 0, 0, 8867, 10250, 10258, 2712, 1635, 78821, + 1410, 92671, 0, 118878, 0, 0, 9919, 0, 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, 0, 3668, 65754, 43560, + 12226, 0, 65149, 2340, 41959, 194786, 194785, 194788, 43618, 65747, + 10937, 2962, 0, 2321, 3587, 65745, 92436, 8921, 9952, 0, 0, 42714, 9951, + 43409, 194770, 2949, 66012, 194775, 194774, 2958, 68359, 41820, 43038, + 2395, 0, 9976, 120043, 120050, 120058, 68220, 128143, 42809, 42807, 0, + 120046, 10198, 4150, 64371, 8318, 41790, 0, 41898, 2360, 41794, 917942, + 0, 127818, 0, 0, 2418, 0, 2411, 11336, 799, 63823, 10276, 10308, 10372, + 917541, 41772, 42813, 2317, 10260, 118980, 55284, 92203, 0, 10384, 0, 0, + 0, 7753, 2351, 6655, 64489, 0, 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, 4862, 9735, 6537, 120591, 74286, 3914, + 92178, 0, 9065, 12961, 0, 0, 92253, 0, 289, 0, 4694, 11420, 4690, 0, 120514, 917978, 4693, 0, 42724, 0, 4688, 120454, 0, 0, 119629, 8238, 3110, 120162, 0, 120163, 6528, 127553, 43035, 120161, 218, 0, 1520, 0, 4786, 0, 43225, 4602, 0, 78167, 10088, 6548, 0, 120156, 43978, 8988, - 8888, 0, 0, 0, 0, 10666, 0, 73902, 0, 0, 0, 9975, 0, 119902, 4689, 8932, - 0, 65560, 119209, 74441, 78810, 0, 0, 0, 0, 0, 0, 0, 0, 10065, 8207, 0, - 120539, 0, 0, 662, 0, 9244, 0, 0, 119261, 0, 0, 0, 0, 41929, 0, 0, 66674, - 41926, 120408, 120443, 10513, 64637, 194862, 0, 52, 13118, 6475, 0, 0, - 12095, 10225, 4812, 0, 0, 0, 74085, 0, 3978, 0, 917945, 0, 11582, 120761, - 12281, 0, 6544, 13241, 0, 69782, 0, 194860, 11765, 65258, 10369, 0, 1585, - 7192, 10249, 422, 1500, 2036, 986, 194859, 64394, 5781, 5599, 64294, - 2494, 120450, 4861, 74021, 64334, 78203, 0, 0, 0, 65102, 8961, 65842, - 10243, 10245, 0, 120410, 0, 120453, 64821, 9478, 2508, 0, 0, 202, 0, - 74131, 1242, 65514, 0, 63940, 0, 64533, 120129, 0, 67842, 11990, 0, - 63939, 43375, 65440, 2504, 0, 78671, 64829, 0, 6943, 917934, 5859, 0, - 2858, 0, 74294, 0, 69239, 0, 119027, 12992, 2753, 1936, 74491, 0, 2751, - 12662, 2763, 8953, 64701, 10731, 12922, 7052, 917839, 0, 0, 0, 63920, - 74128, 2856, 119910, 47, 119911, 126986, 65858, 0, 0, 0, 7899, 0, 8417, - 65903, 7072, 0, 0, 4033, 0, 43992, 0, 0, 212, 64600, 1903, 12320, 0, 0, - 0, 0, 8915, 2759, 945, 6689, 0, 0, 0, 0, 1291, 74828, 0, 0, 9531, 13155, - 8505, 68379, 12062, 0, 0, 65487, 0, 41837, 120611, 120432, 0, 0, 0, - 120433, 0, 63935, 73962, 120806, 64787, 43524, 0, 64426, 0, 0, 0, 0, - 65664, 6693, 9843, 0, 8674, 0, 0, 0, 0, 12624, 0, 1673, 4811, 0, 5986, - 9338, 3046, 74480, 5985, 917928, 119598, 9820, 0, 12187, 0, 0, 5984, 0, - 43308, 4393, 0, 0, 0, 0, 0, 74826, 64733, 0, 0, 3491, 0, 0, 0, 3514, - 65485, 0, 7492, 0, 74605, 119134, 7514, 0, 0, 194731, 7502, 7587, 68353, - 0, 0, 63925, 0, 7610, 219, 0, 0, 692, 43588, 74433, 41635, 43241, 9688, - 0, 9535, 0, 0, 0, 64530, 0, 64610, 11804, 0, 0, 7453, 0, 8013, 0, 0, 0, - 8895, 5253, 0, 5458, 0, 2866, 0, 0, 65111, 68433, 6700, 120484, 0, 0, 0, - 8962, 77960, 9641, 43694, 7059, 0, 0, 9604, 78700, 7441, 63826, 0, - 118941, 64392, 0, 0, 2844, 0, 41974, 0, 12139, 0, 0, 0, 3358, 65295, 0, - 3104, 0, 0, 194765, 0, 5308, 0, 290, 0, 0, 2862, 2792, 195088, 0, 0, - 3268, 66591, 0, 6552, 42367, 7035, 120558, 0, 0, 1814, 0, 10240, 0, - 74305, 0, 74528, 0, 0, 42646, 7606, 2591, 2837, 4341, 77956, 64482, 0, - 8163, 65270, 0, 0, 0, 9112, 74431, 863, 9490, 119898, 0, 43323, 120513, - 119897, 9071, 0, 0, 3654, 7789, 9637, 0, 2535, 65504, 7653, 40993, - 119899, 66587, 195098, 0, 0, 0, 11006, 12927, 7807, 8073, 0, 10629, 0, - 74088, 3056, 10823, 0, 127327, 8762, 10508, 74506, 73770, 43969, 43193, - 10737, 3463, 0, 0, 66633, 8695, 4815, 11322, 5811, 12345, 7049, 0, 5195, - 0, 0, 66639, 0, 0, 0, 0, 0, 120561, 1262, 0, 6561, 19939, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 119907, 64612, 11991, 0, 0, 0, 1502, 0, 0, 9107, 0, 5702, - 3655, 67661, 8430, 0, 74132, 120758, 0, 74057, 9603, 0, 5254, 120742, - 7724, 74388, 68375, 10796, 5129, 0, 0, 590, 7579, 5614, 5893, 194744, - 11720, 0, 11721, 0, 4798, 0, 119316, 66038, 4793, 67851, 11726, 0, 74204, - 68610, 0, 68626, 894, 300, 0, 12306, 66235, 8004, 0, 0, 2562, 0, 0, - 42503, 0, 11652, 0, 0, 119241, 0, 0, 5096, 5095, 2863, 3424, 0, 10454, - 42530, 5094, 119638, 0, 13156, 0, 10832, 5093, 0, 0, 0, 5092, 10708, - 11327, 0, 5091, 176, 0, 9153, 4104, 78599, 78601, 1215, 42712, 5744, - 12272, 9832, 11777, 0, 127371, 42881, 0, 8980, 118988, 67861, 8844, 7209, - 0, 0, 4278, 0, 0, 0, 0, 9074, 4348, 0, 65558, 65946, 8113, 7087, 5255, - 1786, 661, 0, 0, 0, 74423, 0, 586, 74414, 64359, 1267, 0, 65468, 0, - 65731, 0, 0, 3621, 120473, 66666, 64211, 0, 6562, 12928, 0, 1228, 65490, - 11383, 0, 0, 0, 1714, 74406, 0, 0, 0, 0, 66225, 0, 0, 42660, 11436, 2070, - 64, 120694, 0, 10291, 10323, 2826, 0, 0, 0, 42008, 9708, 42710, 0, 42011, - 41999, 0, 12206, 5839, 1702, 1240, 74065, 6286, 0, 0, 65833, 77848, 0, - 1765, 0, 0, 65588, 0, 0, 0, 8401, 0, 42014, 0, 7030, 0, 10479, 64959, - 2852, 0, 0, 0, 0, 195061, 917951, 6963, 0, 12667, 64540, 74786, 10147, - 12935, 0, 0, 0, 0, 0, 78757, 0, 0, 0, 0, 64947, 12467, 2864, 64719, 1148, - 10435, 11462, 41675, 0, 2765, 0, 0, 0, 120719, 0, 0, 66662, 0, 78133, - 9364, 194685, 74416, 0, 0, 77988, 263, 10449, 41288, 0, 41839, 78387, 0, - 77986, 0, 6931, 0, 64355, 7177, 120530, 0, 0, 0, 4262, 10285, 10722, - 42020, 0, 6806, 6992, 42019, 0, 41290, 0, 750, 0, 0, 10163, 63913, 74066, - 7032, 5954, 64931, 4314, 0, 198, 68453, 730, 0, 63907, 77993, 78891, - 13165, 10814, 74171, 42804, 678, 8240, 78015, 0, 41378, 11008, 6938, 0, - 0, 2097, 66246, 120560, 0, 0, 0, 3892, 68632, 0, 6712, 66045, 41470, - 64805, 0, 0, 0, 64801, 0, 497, 12100, 5953, 0, 7796, 0, 43254, 73831, 0, - 10293, 5952, 1281, 0, 0, 0, 10677, 604, 41097, 9182, 1859, 0, 0, 3425, 0, - 0, 2836, 0, 0, 9707, 0, 43202, 0, 0, 65199, 1738, 917818, 0, 2832, 0, - 9670, 12937, 0, 66374, 0, 0, 2822, 0, 4436, 0, 0, 73752, 0, 64872, 0, - 1331, 0, 0, 0, 12708, 0, 5090, 5089, 0, 0, 119109, 0, 0, 319, 118931, - 43479, 9477, 0, 0, 5087, 0, 7640, 96, 5086, 0, 0, 0, 5085, 64286, 0, 0, - 41422, 0, 119901, 42356, 3772, 0, 0, 5011, 0, 0, 0, 0, 0, 127241, 6677, - 7601, 0, 591, 64419, 118953, 0, 0, 118923, 73734, 0, 10939, 6106, 6933, - 41271, 6760, 119903, 4534, 41270, 917962, 0, 65574, 0, 9224, 0, 3671, - 8976, 0, 0, 41275, 6372, 0, 55261, 7963, 6371, 0, 568, 0, 41273, 0, 0, - 6728, 0, 9715, 0, 8258, 11753, 74820, 0, 9602, 118919, 42, 0, 43688, 0, - 0, 7458, 0, 0, 65385, 119900, 0, 11958, 0, 917822, 0, 6254, 42721, 66336, - 8045, 11550, 0, 0, 0, 42858, 11789, 65868, 5557, 917946, 9737, 13109, 0, - 9467, 5558, 8878, 0, 195036, 7451, 6706, 10146, 0, 9086, 64566, 0, 64584, - 7437, 7454, 12594, 0, 68362, 4546, 7731, 0, 119909, 74243, 0, 3805, 0, - 194565, 44001, 41008, 0, 6307, 19949, 0, 7544, 0, 43469, 0, 0, 10152, - 64422, 65091, 119113, 7602, 64729, 0, 43521, 0, 42302, 43711, 43523, - 41447, 5559, 0, 8704, 2397, 5556, 0, 0, 0, 9011, 9630, 0, 0, 0, 5506, 0, - 1911, 66652, 0, 9961, 8845, 66698, 0, 10792, 8889, 0, 2098, 0, 64751, 0, - 66622, 0, 0, 74364, 0, 0, 0, 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, 0, 0, 0, 4357, 0, 0, 0, 74233, - 9967, 119852, 42860, 119838, 10941, 65721, 6962, 0, 0, 119324, 0, 11014, - 0, 8942, 12000, 69224, 0, 0, 11974, 0, 42772, 127518, 11650, 5013, 0, 0, - 66210, 118914, 6613, 0, 0, 0, 0, 0, 64714, 0, 0, 0, 12120, 43476, 0, - 11024, 74811, 0, 10563, 0, 0, 43522, 2462, 0, 1837, 0, 63972, 6957, 0, + 8888, 0, 0, 0, 0, 10666, 0, 73902, 69740, 0, 0, 9975, 0, 119902, 4689, + 8932, 0, 65560, 119209, 74441, 78810, 0, 0, 0, 0, 0, 0, 0, 0, 10065, + 8207, 0, 92613, 128011, 0, 662, 0, 9244, 194863, 0, 119261, 0, 0, 0, 0, + 41929, 0, 0, 66674, 41926, 120408, 120443, 10513, 64637, 194862, 0, 52, + 13118, 6475, 0, 120341, 12095, 10225, 4812, 92578, 0, 0, 74085, 0, 3978, + 0, 917945, 127823, 11582, 120761, 12281, 0, 6544, 13241, 0, 69782, + 128557, 194860, 11765, 65258, 10369, 0, 1585, 7192, 10249, 422, 1500, + 2036, 986, 194859, 64394, 5781, 5599, 64294, 2494, 120450, 4861, 74021, + 64334, 78203, 127808, 0, 92266, 65102, 8961, 65842, 10243, 10245, 917933, + 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, 0, 6943, 917934, 5859, 0, 2858, 0, + 74294, 0, 69239, 0, 119027, 12992, 2753, 1936, 74491, 92574, 2751, 12662, + 2763, 8953, 64701, 10731, 12922, 7052, 917839, 0, 0, 0, 63920, 74128, + 2856, 119910, 47, 119911, 126986, 65858, 0, 0, 0, 7899, 0, 8417, 43798, + 7072, 0, 0, 4033, 128164, 43992, 0, 0, 212, 64600, 1903, 12320, 0, 0, 0, + 0, 8915, 2759, 945, 6689, 0, 0, 0, 0, 1291, 74828, 0, 0, 9531, 13155, + 8505, 68379, 12062, 0, 0, 65487, 92189, 41837, 120611, 120432, 0, 0, 0, + 120433, 0, 63935, 73962, 120806, 64787, 43524, 0, 64426, 0, 194948, 0, 0, + 65664, 6693, 9843, 0, 8674, 119887, 128812, 92715, 0, 12624, 0, 1673, + 4811, 92383, 5986, 9338, 3046, 74480, 5985, 917928, 119598, 9820, 0, + 12187, 0, 0, 5984, 0, 43308, 4393, 0, 0, 0, 0, 0, 74826, 64733, 0, 0, + 3491, 0, 0, 128219, 3514, 65485, 0, 7492, 0, 74605, 92483, 7514, 0, 0, + 194731, 7502, 7587, 68353, 0, 0, 63925, 0, 7610, 219, 0, 0, 692, 43588, + 74433, 41635, 43241, 9688, 7147, 9535, 0, 0, 0, 64530, 0, 64610, 11804, + 0, 7149, 7453, 0, 8013, 0, 92301, 0, 8895, 5253, 0, 5458, 0, 2866, 0, + 127860, 65111, 68433, 6700, 120484, 0, 0, 0, 8962, 77960, 9641, 43694, + 7059, 0, 0, 9604, 78700, 7441, 63826, 78706, 118941, 64392, 194735, 0, + 2844, 0, 41974, 0, 12139, 0, 0, 0, 3358, 65295, 0, 3104, 194734, 0, + 194765, 0, 5308, 0, 290, 0, 0, 2862, 2792, 195088, 0, 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, 0, 0, 9112, 74431, 863, 9490, 119898, 917837, 43323, 120513, + 119897, 9071, 127333, 0, 3654, 7789, 9637, 0, 2535, 65504, 7653, 40993, + 119899, 66587, 195098, 0, 92401, 0, 11006, 12927, 7807, 8073, 0, 10629, + 0, 74088, 3056, 10823, 128797, 127327, 8762, 10508, 69689, 73770, 43969, + 43193, 10737, 3463, 0, 0, 66633, 8695, 4815, 11322, 5811, 12345, 7049, 0, + 5195, 195081, 0, 66639, 0, 0, 0, 128041, 0, 92385, 1262, 0, 6561, 19939, + 0, 0, 0, 119906, 0, 0, 0, 0, 0, 119907, 64612, 11991, 0, 0, 0, 1502, 0, + 0, 9107, 127316, 5702, 3655, 67661, 8430, 0, 74132, 120758, 0, 74057, + 9603, 0, 5254, 120742, 7724, 74388, 68375, 10796, 5129, 0, 0, 590, 7579, + 5614, 5893, 92280, 11720, 92496, 11721, 0, 4798, 0, 119316, 66038, 4793, + 67851, 11726, 127541, 74204, 68610, 0, 68626, 894, 300, 917813, 12306, + 66235, 8004, 0, 0, 2562, 0, 0, 42503, 0, 11652, 0, 0, 119241, 92649, 0, + 5096, 5095, 2863, 3424, 92244, 10454, 42530, 5094, 119638, 0, 13156, 0, + 10832, 5093, 0, 0, 0, 5092, 10708, 11327, 0, 5091, 176, 0, 9153, 4104, + 78599, 78601, 1215, 42712, 5744, 12272, 9832, 11777, 0, 127371, 42881, 0, + 8980, 118988, 67861, 8844, 7209, 0, 0, 4278, 0, 0, 194789, 0, 9074, 4348, + 0, 65558, 65946, 8113, 7087, 5255, 1786, 661, 0, 0, 0, 74423, 0, 586, + 74414, 64359, 1267, 0, 65468, 0, 65731, 0, 127179, 3621, 120473, 66666, + 64211, 0, 6562, 12928, 0, 1228, 65490, 11383, 0, 0, 0, 1714, 74406, + 127831, 0, 0, 0, 66225, 0, 0, 42660, 11436, 2070, 64, 120694, 0, 10291, + 10323, 2826, 0, 0, 0, 42008, 9708, 42710, 0, 42011, 41999, 92164, 12206, + 5839, 1702, 1240, 74065, 6286, 0, 0, 65833, 77848, 0, 1765, 0, 0, 65588, + 0, 0, 0, 8401, 0, 42014, 0, 7030, 194704, 10479, 64959, 2852, 0, 0, 0, 0, + 128586, 917951, 6963, 0, 12667, 64540, 74786, 10147, 12935, 127568, 0, 0, + 0, 0, 78757, 0, 0, 0, 0, 9994, 12467, 2864, 64719, 1148, 10435, 11462, + 41675, 0, 2765, 0, 0, 0, 120719, 128188, 92516, 66662, 0, 78133, 9364, + 194685, 74416, 0, 0, 77988, 263, 10449, 41288, 0, 41839, 78387, 0, 77986, + 0, 6931, 69722, 64355, 7177, 120530, 0, 0, 0, 4262, 10285, 10722, 42020, + 0, 6806, 6992, 42019, 0, 41290, 0, 750, 0, 0, 10163, 63913, 74066, 7032, + 5954, 64931, 4314, 0, 198, 68453, 730, 120094, 63907, 77993, 78891, + 13165, 7107, 74171, 42804, 678, 8240, 78015, 128784, 41378, 11008, 6938, + 92222, 92637, 2097, 66246, 120560, 0, 0, 0, 3892, 68632, 69642, 6712, + 66045, 41470, 64805, 0, 0, 0, 64801, 0, 497, 12100, 5953, 92667, 7796, + 69669, 43254, 73831, 0, 10293, 5952, 1281, 0, 0, 0, 10677, 604, 41097, + 9182, 1859, 0, 92603, 3425, 127488, 0, 2836, 0, 0, 9707, 0, 43202, 0, 0, + 65199, 1738, 917818, 128158, 2832, 92702, 9670, 12937, 0, 66374, 917956, + 0, 2822, 68122, 4436, 92519, 0, 73752, 0, 64872, 92340, 1331, 0, 0, 0, + 12708, 0, 5090, 5089, 0, 0, 119109, 0, 128681, 319, 118847, 43479, 9477, + 0, 0, 5087, 92325, 7640, 96, 5086, 0, 92379, 0, 5085, 64286, 92665, 0, + 41422, 0, 119901, 42356, 3772, 0, 0, 5011, 0, 0, 0, 0, 127165, 127241, + 6677, 7601, 0, 591, 64419, 118953, 92262, 0, 118923, 73734, 0, 10939, + 6106, 6933, 41271, 6760, 119903, 4534, 41270, 128876, 0, 65574, 0, 9224, + 0, 3671, 8976, 0, 0, 41275, 6372, 128084, 55261, 7963, 6371, 0, 568, 0, + 41273, 0, 0, 6728, 0, 9715, 0, 8258, 11753, 74820, 0, 9602, 118919, 42, + 0, 43688, 0, 0, 7458, 0, 0, 65385, 119900, 0, 11958, 0, 917822, 0, 6254, + 42721, 66336, 8045, 11550, 0, 0, 0, 42858, 11789, 65868, 5557, 10133, + 9737, 13109, 0, 9467, 5558, 8878, 128136, 195036, 7451, 6706, 10146, 0, + 9086, 64566, 0, 64584, 7437, 7454, 12594, 128690, 68362, 4546, 7731, 0, + 119909, 74243, 0, 3805, 0, 194565, 44001, 41008, 0, 6307, 19949, 0, 7544, + 0, 43469, 0, 0, 10152, 64422, 65091, 119113, 7602, 64729, 0, 43521, 0, + 42302, 43711, 43523, 41447, 5559, 0, 8704, 2397, 5556, 0, 0, 0, 9011, + 9630, 92633, 0, 0, 5506, 0, 1911, 66652, 0, 9961, 8845, 66698, 0, 10792, + 8889, 0, 2098, 0, 64751, 0, 66622, 0, 0, 74364, 0, 0, 0, 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, 0, 0, 0, + 4357, 0, 119837, 0, 74233, 9967, 119852, 42860, 119838, 10941, 65721, + 6962, 0, 0, 119324, 0, 11014, 127972, 8942, 12000, 69224, 92267, 128536, + 11974, 92213, 42772, 127518, 11650, 5013, 92663, 128677, 66210, 118914, + 6613, 92476, 0, 43819, 0, 0, 64714, 0, 0, 12162, 12120, 43476, 0, 11024, + 74811, 66228, 10563, 0, 127196, 43522, 2462, 0, 1837, 0, 63972, 6957, 0, 120559, 4952, 65718, 65827, 5504, 65720, 65714, 65715, 65716, 0, 127005, - 127119, 3109, 63975, 74028, 0, 8107, 119234, 1127, 455, 0, 63968, 0, - 3483, 119593, 1989, 0, 0, 9104, 3503, 65375, 0, 6694, 42633, 1864, 0, - 74306, 41446, 2540, 7736, 0, 74064, 0, 10521, 0, 42173, 9705, 74124, - 8604, 6955, 10916, 43684, 6149, 3887, 19956, 1411, 2824, 0, 10106, 0, - 1403, 0, 1347, 9631, 74444, 0, 0, 0, 0, 8640, 0, 258, 1654, 0, 0, 0, - 43314, 0, 0, 4042, 11478, 2873, 63977, 11522, 41668, 8549, 10861, 0, - 63976, 0, 68623, 0, 74585, 41391, 0, 917903, 376, 6987, 9221, 0, 0, 8823, - 0, 12943, 65185, 41869, 12619, 0, 10154, 0, 74439, 2039, 0, 7446, 1684, - 63979, 10974, 458, 120620, 0, 69791, 0, 11916, 65016, 0, 78067, 42115, 0, - 12288, 78057, 0, 1493, 42111, 7553, 4097, 0, 13080, 0, 65808, 6610, 6030, - 8059, 7508, 13131, 0, 0, 0, 8794, 41278, 41629, 12154, 0, 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, 0, 195076, 0, 7405, 10105, 65810, 0, 41632, 7493, 0, 0, 41622, - 0, 0, 119556, 74584, 7632, 9716, 19954, 9805, 5990, 900, 0, 63957, 0, 0, - 3612, 0, 64376, 0, 5389, 0, 0, 65938, 2839, 9621, 582, 0, 74368, 3749, - 6949, 7569, 74061, 0, 0, 6956, 4403, 19962, 65559, 3299, 0, 0, 119127, - 9002, 0, 74372, 74236, 8478, 7598, 546, 42469, 65569, 1918, 9542, 472, - 7716, 10319, 10383, 6996, 0, 63952, 8425, 3602, 8328, 11764, 118894, 0, - 69796, 41183, 12907, 10271, 10287, 684, 43525, 0, 2854, 119586, 4592, - 65755, 0, 0, 11963, 43620, 0, 78889, 0, 0, 0, 9881, 43115, 65757, 3415, - 0, 0, 8648, 0, 6741, 43047, 0, 13180, 0, 418, 0, 0, 10295, 10327, 10391, - 41752, 74339, 8641, 41449, 0, 74100, 0, 10911, 6942, 0, 1024, 42849, - 41751, 69776, 8941, 0, 4554, 0, 9023, 11685, 0, 9928, 78617, 0, 11437, - 43741, 0, 120700, 63967, 0, 41206, 120724, 9049, 41185, 43166, 0, 11680, - 0, 11686, 0, 65224, 4565, 4655, 119553, 0, 0, 64523, 10343, 10407, 0, - 66671, 11466, 0, 0, 42890, 0, 12050, 68201, 2860, 0, 0, 0, 42792, 5743, - 10424, 12065, 42872, 0, 0, 0, 8875, 0, 0, 917991, 7531, 12847, 2413, 0, - 78635, 962, 0, 12855, 41196, 42564, 0, 1582, 0, 5508, 0, 0, 0, 10801, 0, - 118798, 0, 7173, 496, 10439, 4313, 64607, 119557, 7860, 0, 906, 42793, - 2842, 6405, 64722, 13132, 798, 64694, 12801, 8406, 1153, 0, 64788, 0, - 8054, 9174, 194749, 917976, 9964, 0, 41611, 4642, 66574, 11556, 0, 0, - 78857, 42089, 78855, 9008, 0, 0, 195096, 42079, 917981, 77924, 42513, 0, - 42842, 73985, 65285, 118974, 127003, 0, 0, 0, 0, 11335, 64069, 42093, - 3920, 0, 0, 0, 0, 4580, 41967, 0, 64384, 0, 119158, 3021, 42004, 0, 0, - 42317, 41998, 0, 6946, 0, 0, 0, 0, 65204, 0, 68113, 42690, 9880, 42010, - 74824, 64589, 10111, 64875, 0, 68399, 43998, 11360, 0, 0, 0, 0, 42149, 0, - 0, 0, 64941, 77919, 0, 0, 0, 55247, 4110, 66005, 6959, 10929, 119110, 0, - 66703, 77921, 8617, 41982, 6025, 69242, 0, 0, 0, 0, 9597, 42099, 43172, - 0, 10117, 0, 0, 41636, 0, 0, 120681, 8301, 0, 0, 187, 0, 65669, 0, 4963, - 0, 127517, 0, 8964, 65676, 65785, 0, 41948, 0, 0, 0, 41942, 65449, 3160, - 10081, 13226, 42121, 42475, 42663, 0, 41766, 0, 65882, 78849, 41760, + 127119, 3109, 63975, 74028, 0, 8107, 119234, 1127, 455, 0, 63968, 127924, + 3483, 119593, 1989, 0, 69678, 9104, 3503, 65375, 92509, 6694, 42633, + 1864, 0, 74306, 41446, 2540, 7736, 0, 74064, 0, 10521, 0, 42173, 9705, + 74124, 8604, 6955, 10916, 43684, 6149, 3887, 19956, 1411, 2824, 0, 10106, + 127862, 1403, 128839, 1347, 9631, 74444, 0, 0, 0, 0, 8640, 0, 258, 1654, + 0, 0, 0, 43314, 0, 0, 4042, 11478, 2873, 63977, 11522, 41668, 8549, + 10861, 0, 63976, 0, 68623, 0, 74585, 41391, 0, 917903, 376, 6987, 9221, + 0, 0, 8823, 128697, 12943, 65185, 41869, 12619, 0, 10154, 0, 74439, 2039, + 0, 7446, 1684, 63979, 10974, 458, 120620, 0, 69791, 127161, 11916, 65016, + 0, 69671, 42115, 0, 12288, 78057, 0, 1493, 42111, 7553, 4097, 128199, + 13080, 0, 65808, 6610, 6030, 8059, 7508, 13131, 0, 0, 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, 0, 128295, 0, 7405, 10105, + 65810, 0, 41632, 7493, 55290, 0, 41622, 0, 0, 119556, 74584, 7632, 9716, + 19954, 9805, 5990, 900, 0, 63957, 0, 0, 3612, 0, 64376, 0, 5389, 92597, + 0, 65938, 2839, 9621, 582, 0, 74368, 3749, 6949, 7569, 74061, 0, 0, 6956, + 4403, 19962, 65559, 3299, 0, 917566, 119127, 9002, 0, 74372, 74236, 8478, + 7598, 546, 42469, 65569, 1918, 9542, 472, 7716, 10319, 10383, 6996, 0, + 63952, 8425, 3602, 8328, 11764, 118894, 0, 69796, 41183, 12907, 10271, + 10287, 684, 43525, 0, 2854, 119586, 4592, 65755, 0, 92256, 11963, 43620, + 0, 78889, 0, 0, 128809, 9881, 43115, 65757, 3415, 0, 0, 8648, 0, 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, 0, 4554, 0, 9023, 11685, 0, 9928, 78617, 0, 11437, 43741, + 92163, 120700, 63967, 0, 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, 0, 12050, 68201, 2860, 0, 0, 0, + 42792, 5743, 10424, 12065, 42872, 0, 92342, 0, 8875, 0, 0, 917991, 7531, + 12847, 2413, 0, 78635, 962, 0, 12855, 41196, 42564, 0, 1582, 0, 5508, 0, + 0, 0, 10801, 0, 92354, 0, 7173, 496, 10439, 4313, 64607, 69638, 7860, 0, + 906, 42793, 2842, 6405, 64722, 13132, 798, 64694, 12801, 8406, 1153, + 92173, 64788, 0, 8054, 9174, 128652, 917976, 9964, 0, 41611, 4642, 66574, + 11556, 917982, 0, 78857, 42089, 78855, 9008, 0, 0, 195096, 42079, 917981, + 77924, 42513, 0, 42842, 73985, 65285, 118974, 127003, 0, 0, 0, 0, 11335, + 64069, 42093, 3920, 0, 0, 0, 0, 4580, 41967, 0, 64384, 92167, 119158, + 3021, 42004, 0, 0, 42317, 41998, 0, 6946, 0, 0, 0, 128193, 65204, 0, + 68113, 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, 0, 0, 0, 0, 9597, 42099, 43172, 0, 10117, 0, + 92297, 41636, 0, 0, 120681, 8301, 0, 0, 187, 0, 65669, 128339, 4963, 0, + 127517, 0, 8964, 65676, 65785, 0, 41948, 0, 0, 0, 41942, 65449, 3160, + 10081, 13226, 42121, 42475, 42663, 128210, 41766, 0, 65882, 78849, 41760, 1189, 905, 480, 10985, 41733, 67859, 9629, 6742, 1745, 43625, 73835, - 7888, 0, 0, 0, 42656, 41507, 8806, 7023, 0, 74279, 9447, 78651, 7867, - 69218, 6236, 0, 0, 10505, 0, 12851, 118948, 348, 5474, 0, 3103, 0, 41753, - 0, 0, 0, 78844, 78845, 41739, 78843, 42515, 10931, 41756, 43347, 42560, - 5391, 41746, 119147, 0, 41259, 5561, 74360, 2691, 0, 65553, 7933, 5562, - 69800, 917851, 41262, 0, 64421, 74846, 41251, 0, 0, 3979, 0, 0, 74813, 0, - 0, 0, 0, 118847, 41266, 0, 0, 917630, 10585, 65741, 41737, 9574, 2666, 0, - 41738, 831, 419, 13126, 10716, 0, 42822, 0, 6434, 0, 6939, 7766, 6432, 0, - 0, 916, 769, 41742, 11968, 74805, 6433, 5563, 547, 1943, 6439, 5560, - 4994, 487, 0, 4497, 3754, 127056, 120424, 9039, 0, 41776, 0, 8716, 1595, - 41615, 0, 0, 74260, 0, 43267, 43219, 0, 0, 12185, 0, 0, 68355, 68357, 0, - 42856, 8634, 0, 0, 4209, 120702, 0, 65879, 41538, 65612, 0, 669, 5679, 0, - 69786, 118961, 0, 0, 5678, 11821, 0, 6711, 460, 0, 0, 0, 0, 120747, 0, 0, - 78050, 119022, 0, 0, 0, 7782, 9044, 4974, 11760, 78494, 7577, 65711, - 41912, 1216, 0, 0, 5792, 0, 0, 78501, 0, 42264, 12244, 0, 5683, 0, 0, - 78119, 1549, 0, 0, 120398, 5682, 6206, 8670, 10256, 5680, 917568, 10001, - 0, 69768, 1449, 10241, 78290, 0, 0, 10552, 64342, 41922, 0, 8584, 0, - 5567, 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 0, 0, 0, 65708, 65709, - 5566, 69803, 65704, 65705, 11904, 42875, 43373, 42539, 5942, 8468, 0, - 10361, 10425, 65697, 65698, 65699, 0, 66598, 0, 64664, 10647, 78702, - 78703, 78690, 457, 78502, 65701, 1934, 43006, 0, 8802, 78710, 65130, - 78706, 78709, 6087, 78705, 78716, 41757, 78711, 8043, 8950, 65694, 64485, - 43534, 10457, 0, 11961, 78725, 78722, 78723, 78720, 78721, 0, 65515, - 9499, 10035, 13069, 0, 0, 9889, 68184, 42806, 0, 7256, 0, 0, 1667, 42161, - 0, 42428, 0, 6934, 0, 10802, 64861, 6556, 78390, 0, 8101, 3610, 0, 41748, - 4995, 955, 65907, 119208, 5350, 64339, 78306, 64549, 10875, 917956, 5477, - 65692, 0, 0, 120397, 12896, 10456, 917954, 0, 3874, 0, 0, 0, 0, 0, 0, - 65603, 0, 65687, 0, 41038, 74009, 119570, 42239, 8536, 78740, 0, 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, - 0, 0, 6370, 0, 7827, 68441, 6965, 0, 0, 13201, 0, 0, 0, 74382, 73781, - 7918, 73988, 0, 0, 917884, 1728, 0, 120710, 178, 12972, 0, 0, 0, 120671, - 0, 0, 78327, 120405, 65690, 0, 0, 119054, 0, 9252, 917889, 4652, 68371, - 0, 0, 0, 13065, 9923, 10806, 0, 11763, 0, 120688, 6723, 78187, 0, 6993, - 0, 0, 8333, 0, 0, 11390, 0, 74464, 0, 0, 74080, 0, 0, 11910, 0, 8278, - 8963, 4034, 0, 0, 65344, 120517, 41747, 0, 0, 8677, 0, 12707, 9350, - 66037, 0, 8836, 12315, 12747, 8300, 0, 0, 7491, 8856, 0, 0, 43150, 0, - 120404, 65389, 120402, 120403, 10813, 2592, 12853, 43269, 7263, 120244, - 6536, 120238, 120239, 65516, 12321, 120391, 120388, 55287, 10007, 120246, - 9588, 120248, 1596, 120383, 41994, 65801, 0, 0, 66572, 0, 0, 10613, 6697, - 12805, 41928, 40981, 78403, 78409, 5006, 64328, 0, 9931, 0, 8825, 74555, - 65940, 43259, 0, 6107, 0, 119177, 0, 78401, 0, 11783, 335, 120227, 64689, + 7888, 0, 3980, 0, 42656, 41507, 8806, 7023, 0, 74279, 9447, 78651, 7867, + 69218, 6236, 0, 0, 10505, 0, 12851, 118948, 348, 5474, 128843, 3103, 0, + 41753, 128540, 0, 0, 78844, 78845, 41739, 78843, 42515, 10931, 41756, + 43347, 42560, 5391, 41746, 119147, 92591, 41259, 5561, 74360, 2691, 0, + 65553, 7933, 5562, 69800, 128265, 41262, 128146, 64421, 74846, 41251, 0, + 0, 3979, 0, 0, 74813, 0, 0, 0, 0, 92524, 41266, 0, 0, 128836, 10585, + 65741, 41737, 9574, 2666, 0, 41738, 831, 419, 13126, 10716, 0, 42822, 0, + 6434, 0, 6939, 7766, 6432, 128106, 0, 916, 769, 41742, 11968, 74805, + 6433, 5563, 547, 1943, 6439, 5560, 4994, 487, 0, 4497, 3754, 127056, + 120424, 9039, 0, 41776, 0, 8716, 1595, 41615, 0, 0, 74260, 0, 42854, + 43219, 128709, 0, 12185, 128879, 0, 68355, 68357, 0, 42856, 8634, 0, 0, + 4209, 120702, 0, 65879, 41538, 65612, 127543, 669, 5679, 0, 69786, 92540, + 0, 0, 5678, 11821, 0, 6711, 460, 0, 0, 0, 0, 120747, 0, 0, 78050, 119022, + 0, 0, 0, 7782, 9044, 4974, 11760, 78494, 7577, 65711, 41912, 1216, 0, + 128079, 5792, 0, 0, 78501, 0, 2933, 12244, 0, 5683, 0, 0, 78119, 1549, 0, + 0, 120398, 5682, 6206, 8670, 10256, 5680, 917568, 10001, 0, 69768, 1449, + 10241, 78290, 128228, 0, 10552, 64342, 41922, 128548, 8584, 0, 5567, + 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 0, 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, 0, 8802, 78710, + 65130, 11747, 78709, 6087, 78705, 78716, 41757, 78711, 8043, 8950, 65694, + 64485, 43534, 10457, 0, 11961, 78725, 78722, 78723, 78720, 78721, 0, + 65515, 9499, 10035, 13069, 0, 0, 9889, 68184, 42806, 0, 7256, 0, 0, 1667, + 42161, 0, 42428, 0, 6934, 0, 10802, 64861, 6556, 78390, 0, 8101, 3610, 0, + 41748, 4995, 955, 65907, 119208, 5350, 64339, 78306, 64549, 10875, + 128662, 5477, 65692, 0, 128532, 120397, 12896, 10456, 917954, 0, 3874, 0, + 0, 0, 0, 0, 0, 65603, 0, 65687, 0, 41038, 74009, 119570, 42239, 8536, + 78740, 0, 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, 0, 92261, 6370, 0, 7827, 68441, 6965, 0, 0, 13201, 128205, 0, 0, + 74382, 73781, 7918, 73988, 0, 0, 917884, 1728, 0, 120710, 178, 12972, + 92679, 0, 917887, 92563, 0, 0, 78327, 120405, 65690, 0, 0, 119054, 0, + 9252, 917889, 4652, 68371, 0, 0, 0, 13065, 9923, 10806, 0, 11763, 0, + 120688, 6723, 78187, 0, 6993, 0, 0, 8333, 0, 0, 11390, 0, 74464, 0, + 92320, 74080, 0, 0, 11910, 92559, 8278, 8963, 4034, 128560, 0, 65344, + 120517, 41747, 0, 0, 8677, 0, 12707, 9350, 66037, 128180, 8836, 12315, + 12747, 8300, 0, 0, 7491, 8856, 128064, 0, 43150, 127768, 120404, 65389, + 120402, 120403, 10813, 2592, 12853, 43269, 7263, 120244, 6536, 120238, + 120239, 65516, 12321, 120391, 120388, 55287, 10007, 120246, 9588, 120248, + 1596, 120383, 41994, 65801, 128808, 0, 66572, 0, 0, 10613, 6697, 12805, + 41928, 40981, 78403, 78409, 5006, 64328, 0, 9931, 0, 8825, 74555, 65940, + 43259, 0, 6107, 0, 119177, 0, 78401, 128641, 11783, 335, 120227, 64689, 438, 4510, 5765, 8721, 120233, 119227, 6092, 12840, 43112, 8876, 120231, - 8096, 10284, 0, 0, 0, 10380, 8733, 0, 0, 41602, 0, 0, 74831, 917901, 0, - 73747, 65399, 0, 64591, 42405, 0, 120820, 843, 11541, 0, 917898, 2065, - 41935, 74496, 41902, 0, 0, 215, 41258, 77875, 43159, 1953, 9579, 41938, - 1256, 3910, 9407, 6242, 0, 0, 41257, 41900, 8675, 10700, 8805, 1742, 0, - 9333, 8202, 0, 0, 0, 0, 0, 73882, 499, 0, 43467, 0, 55290, 0, 1712, 5932, - 77845, 41762, 0, 0, 11967, 1775, 0, 0, 0, 0, 0, 9458, 0, 6470, 9180, - 120380, 43176, 0, 0, 42782, 0, 0, 0, 917912, 74777, 120669, 9414, 120382, - 73782, 73969, 565, 42484, 5794, 201, 2662, 42292, 0, 8254, 0, 10975, 0, - 120625, 74763, 1022, 4108, 3880, 74247, 0, 0, 194964, 917980, 7507, 0, - 43149, 0, 65031, 7961, 1636, 0, 65029, 65024, 0, 12473, 6534, 0, 99, 98, - 97, 120571, 67584, 4049, 74163, 127065, 7090, 0, 7892, 917969, 10777, 0, - 65310, 65562, 66599, 66722, 0, 8039, 3363, 66594, 43434, 0, 0, 12596, - 66595, 42258, 42570, 5593, 119148, 120711, 0, 10100, 6061, 64854, 119, - 118, 117, 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, 0, 0, 6020, 12716, 127112, 12744, 475, - 120394, 13266, 0, 127111, 0, 73926, 0, 10645, 1212, 6543, 0, 8134, 0, - 2913, 73870, 0, 1866, 0, 195095, 0, 8923, 1645, 12059, 66585, 78786, - 3196, 0, 0, 5935, 1250, 127066, 8174, 9787, 6733, 9859, 7916, 9861, 9860, - 5258, 1882, 1892, 6731, 10882, 405, 11454, 73911, 0, 0, 41169, 8939, + 8096, 10284, 128515, 0, 0, 10380, 8733, 0, 128240, 41602, 0, 92308, + 74831, 917901, 0, 73747, 65399, 0, 64591, 42405, 0, 120820, 843, 11541, + 0, 917898, 2065, 41935, 74496, 41902, 0, 0, 215, 41258, 77875, 43159, + 1953, 9579, 41938, 1256, 3910, 9407, 6242, 0, 0, 41257, 41900, 8675, + 10700, 8805, 1742, 0, 9333, 8202, 127750, 0, 0, 0, 0, 73882, 499, 0, + 43467, 0, 43818, 0, 1712, 5932, 77845, 41762, 0, 0, 11967, 1775, 0, 0, 0, + 0, 128009, 9458, 0, 6470, 9180, 120380, 43176, 0, 0, 42782, 0, 0, 0, + 128309, 74777, 120669, 9414, 120382, 73782, 73969, 565, 42484, 5794, 201, + 2662, 42292, 0, 8254, 0, 10975, 0, 120625, 74763, 1022, 4108, 3880, + 74247, 0, 0, 92263, 917980, 7507, 0, 43149, 0, 65031, 7961, 1636, 0, + 65029, 65024, 0, 12473, 6534, 0, 99, 98, 97, 120571, 67584, 4049, 74163, + 127065, 7090, 0, 7892, 917969, 10777, 917803, 65310, 65562, 66599, 66722, + 0, 8039, 3363, 66594, 43434, 0, 0, 12596, 66595, 42258, 42570, 5593, + 119148, 120711, 92425, 10100, 6061, 64854, 119, 118, 117, 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, 0, 8134, 128028, 2913, + 73870, 127113, 1866, 0, 195095, 0, 8923, 1645, 12059, 66585, 78786, 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, 0, 645, 0, 7609, 40973, 0, 73833, 78249, 5824, 984, 77918, 10688, 5851, 0, 7729, 73982, 120518, 0, 195086, 43369, - 0, 0, 68415, 0, 4538, 120406, 43141, 0, 0, 74214, 73886, 0, 0, 118902, - 43005, 78448, 9552, 0, 0, 0, 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, 0, 8455, 10082, 11575, 0, - 119566, 0, 12808, 12183, 6145, 0, 64929, 0, 0, 0, 43186, 42509, 0, 3922, - 9187, 0, 0, 0, 119057, 11752, 3353, 9358, 0, 917957, 66680, 120090, - 11747, 7931, 8558, 9795, 68380, 0, 0, 120082, 120081, 120084, 41027, - 120086, 0, 120088, 120087, 7019, 120073, 0, 11751, 120078, 78294, 64657, - 8657, 120048, 8594, 120068, 0, 0, 120069, 120072, 120071, 0, 0, 43154, - 41029, 0, 11332, 65380, 7728, 0, 11294, 0, 66665, 7851, 0, 8375, 8699, 0, - 42524, 0, 9085, 0, 7504, 9327, 6160, 0, 0, 0, 8088, 0, 74012, 0, 0, 4439, - 6926, 0, 12924, 0, 42369, 0, 65491, 65145, 9041, 43559, 64577, 10826, 0, - 11296, 0, 0, 0, 65825, 9577, 68199, 0, 64670, 0, 78056, 6793, 11295, 0, - 78053, 73872, 0, 0, 10902, 0, 0, 78070, 78068, 10472, 2995, 0, 0, 64682, - 2371, 78069, 120808, 259, 1009, 0, 2402, 2333, 6440, 0, 0, 65125, 41244, - 0, 13271, 9103, 41180, 0, 0, 0, 0, 10219, 0, 0, 0, 0, 43178, 127070, - 41261, 119362, 43640, 8613, 0, 118989, 6736, 195092, 41492, 12005, - 917982, 0, 1890, 120056, 0, 0, 0, 7293, 7991, 0, 10578, 0, 78076, 0, - 78077, 0, 0, 78800, 0, 120054, 42668, 6635, 0, 6164, 65170, 0, 0, 0, - 11664, 0, 0, 0, 0, 118812, 0, 0, 0, 9175, 11925, 78045, 9088, 0, 64545, - 1396, 0, 7546, 3847, 0, 0, 4985, 13288, 672, 8098, 43196, 194746, 0, 0, - 0, 74043, 65072, 1577, 11772, 13041, 5928, 4525, 10658, 65911, 1266, - 10180, 0, 0, 12622, 0, 0, 0, 194714, 0, 13310, 773, 19933, 1539, 0, - 126983, 42731, 0, 0, 0, 0, 3051, 5862, 7823, 0, 0, 120411, 3250, 43991, - 0, 66649, 9510, 66237, 0, 0, 41066, 64673, 917963, 917964, 0, 3505, 8707, - 917968, 6725, 917966, 917971, 917972, 3471, 917970, 5479, 882, 6686, - 119584, 11613, 120772, 42754, 0, 0, 0, 0, 0, 0, 0, 3225, 917996, 4433, - 41156, 43973, 43173, 1443, 4381, 0, 0, 10926, 11756, 11757, 64879, - 917949, 917950, 917947, 13227, 0, 10021, 5160, 1387, 0, 917953, 41418, 0, - 65914, 6721, 217, 917955, 917960, 917961, 10443, 10789, 41158, 119257, - 4274, 0, 41483, 0, 41250, 0, 42179, 0, 5931, 11744, 69232, 0, 41252, - 66682, 0, 119637, 41249, 1366, 64635, 0, 12466, 0, 0, 4397, 0, 0, 41296, - 9545, 41291, 0, 0, 41485, 3511, 41282, 5923, 10400, 0, 0, 760, 0, 12088, - 5786, 0, 42256, 119869, 119861, 417, 41474, 119562, 41565, 0, 5934, - 119867, 66583, 119231, 64877, 0, 64481, 78614, 66013, 41956, 43455, - 126995, 0, 0, 0, 42273, 5819, 0, 917556, 0, 0, 0, 65910, 0, 10246, - 120816, 0, 1237, 10274, 4552, 0, 0, 0, 1375, 66705, 43573, 65260, 42063, - 0, 42811, 10312, 74192, 120794, 7840, 0, 43630, 10252, 0, 0, 43185, 0, - 4396, 0, 119880, 10769, 9676, 119041, 0, 9753, 0, 8944, 0, 0, 10473, 0, - 0, 6072, 43025, 10299, 0, 0, 120608, 66326, 0, 0, 0, 0, 9330, 0, 7222, - 10283, 10315, 10379, 4996, 0, 13281, 66517, 7865, 10087, 78343, 0, 78347, - 0, 0, 7565, 66363, 12952, 64806, 43180, 77928, 68096, 77929, 43982, - 74288, 622, 74023, 885, 43405, 1602, 0, 0, 852, 0, 12160, 0, 10212, - 65435, 0, 12071, 9609, 12156, 917983, 917984, 43586, 11035, 10411, - 917988, 10255, 6710, 10279, 4194, 10375, 917993, 0, 4315, 12644, 127516, - 77937, 43639, 43343, 0, 917998, 11501, 41177, 0, 0, 917792, 0, 0, 8715, - 0, 41179, 0, 43313, 0, 41176, 0, 994, 0, 8452, 127103, 73966, 0, 0, 5921, - 0, 2597, 0, 5922, 118903, 77943, 4186, 127107, 127106, 127105, 6718, 0, - 4406, 74601, 8480, 9192, 9747, 0, 4413, 0, 42268, 3198, 5924, 5920, 0, - 6921, 78081, 74007, 42869, 8418, 11681, 43169, 10176, 0, 742, 0, 2893, - 10772, 65276, 5937, 1914, 2553, 11682, 6756, 0, 0, 8363, 0, 2993, 7772, - 3916, 0, 120494, 1141, 42407, 8159, 718, 7572, 973, 0, 120718, 3235, - 2415, 43164, 0, 8018, 42333, 74756, 10675, 6937, 42486, 43381, 65390, 0, - 0, 1202, 0, 0, 127037, 0, 0, 0, 78182, 64542, 3260, 73829, 65388, 9945, - 8419, 78042, 6738, 0, 43681, 74193, 2059, 0, 0, 55237, 1431, 0, 66565, - 10821, 0, 12804, 0, 8229, 1235, 3307, 11472, 78089, 78184, 4544, 0, 0, 0, - 1740, 78097, 8758, 985, 12872, 64511, 78094, 12068, 78102, 0, 10141, 0, - 63761, 8785, 4476, 78109, 63763, 12655, 8907, 78105, 78106, 78103, 78104, - 0, 119572, 10665, 64616, 41572, 0, 0, 0, 41573, 0, 3931, 120295, 74143, - 0, 0, 0, 0, 11982, 0, 0, 0, 0, 64484, 0, 41167, 0, 41735, 0, 717, 10754, - 0, 0, 0, 0, 63767, 0, 1780, 6936, 0, 0, 819, 10611, 9694, 126978, 0, 0, - 0, 0, 0, 0, 12820, 0, 6578, 7009, 7523, 6922, 74218, 67848, 7525, 3346, - 8339, 0, 0, 575, 268, 78111, 8563, 5754, 120343, 41541, 65565, 8336, - 5936, 7290, 78117, 8337, 13081, 308, 11388, 7522, 120721, 78123, 65466, - 11090, 6953, 0, 120346, 0, 78132, 5926, 78128, 78130, 78126, 78127, - 78124, 78125, 9038, 7887, 43456, 7830, 11651, 13093, 64002, 0, 65742, - 12874, 119597, 11590, 0, 74048, 0, 8595, 0, 0, 43703, 13097, 0, 64643, - 13283, 12697, 0, 12381, 3488, 5933, 10033, 73738, 66241, 65570, 0, 12297, - 119153, 1955, 0, 5349, 42538, 0, 0, 65308, 9462, 0, 0, 0, 0, 42736, 0, - 5756, 0, 7638, 41642, 42764, 0, 43109, 7637, 5752, 120600, 0, 73832, 0, - 120635, 0, 78334, 0, 7636, 65171, 9124, 0, 78892, 0, 291, 0, 0, 2027, - 66230, 78142, 78136, 10403, 0, 4640, 64713, 10224, 120429, 42512, 120431, - 120430, 0, 0, 0, 0, 0, 0, 0, 119094, 74213, 7824, 0, 0, 41274, 5778, - 6302, 0, 0, 12680, 119130, 1417, 77889, 194914, 9452, 0, 74393, 11552, 0, - 0, 0, 65391, 0, 10172, 65453, 63789, 41264, 78658, 6426, 4641, 9179, - 64819, 55278, 41255, 42036, 41469, 41269, 120412, 41267, 4646, 120425, - 865, 42034, 78274, 78273, 4645, 42033, 78270, 0, 0, 64728, 0, 78673, - 78674, 1659, 919, 42784, 1671, 195089, 6069, 9219, 195090, 1661, 13120, - 63784, 69819, 10140, 9713, 119143, 0, 0, 0, 2306, 10485, 118943, 6068, - 10612, 195099, 0, 195101, 195078, 41462, 195080, 195079, 5422, 195081, 0, - 0, 0, 10229, 10635, 826, 195083, 195082, 195085, 195084, 195087, 6483, 0, - 1808, 7848, 0, 8100, 78227, 78669, 78670, 13301, 78667, 9667, 78665, - 78872, 0, 11003, 9904, 0, 0, 120690, 9144, 10921, 0, 78680, 9840, 65131, - 78678, 77841, 10313, 0, 0, 64320, 10265, 78686, 10962, 78684, 43008, - 8945, 78683, 0, 41, 195072, 1792, 120515, 195073, 8655, 195075, 0, 77951, - 12066, 0, 385, 4152, 2585, 0, 119068, 3126, 0, 74136, 10957, 0, 43258, 0, - 0, 13157, 0, 0, 3570, 0, 7443, 0, 44006, 6997, 0, 0, 7879, 8739, 11075, - 0, 65216, 0, 69795, 2593, 8463, 7810, 917862, 7839, 119913, 78806, - 119912, 9691, 4411, 78802, 0, 0, 43442, 78799, 65254, 10066, 0, 0, 0, 0, - 13061, 8016, 78687, 19932, 64831, 0, 0, 12390, 119171, 1634, 68115, 0, - 11056, 0, 119925, 0, 41165, 11328, 12450, 0, 41166, 0, 12456, 119914, - 171, 5941, 12452, 917544, 12458, 12531, 78779, 43013, 63800, 74162, 0, - 120483, 9969, 0, 12454, 63806, 42132, 12063, 78425, 78424, 3230, 0, 0, 0, - 5209, 297, 5810, 8522, 8415, 0, 78429, 78428, 7077, 2497, 0, 960, 74156, - 6981, 0, 12938, 4292, 0, 74815, 10512, 0, 74814, 78875, 127505, 78876, - 2503, 73778, 1762, 69794, 2495, 78873, 5844, 78874, 118838, 0, 12654, - 4663, 1899, 78877, 2507, 64121, 8726, 65594, 0, 0, 0, 8892, 0, 0, 0, 0, - 5782, 420, 0, 0, 120462, 10797, 63794, 0, 0, 64814, 63796, 77965, 0, - 66581, 119204, 41608, 0, 0, 63792, 4659, 120788, 0, 43676, 0, 0, 0, 0, 0, - 329, 77968, 0, 917548, 7399, 0, 41188, 13244, 120466, 42167, 7435, 78193, - 5380, 119086, 69225, 1155, 11365, 43126, 77972, 0, 65684, 0, 5601, 65192, - 42765, 63752, 0, 7987, 0, 1172, 69799, 6786, 43601, 120476, 74126, 5603, - 0, 4473, 0, 194823, 0, 65347, 65346, 65345, 0, 0, 5347, 69802, 0, 73868, - 118944, 10588, 0, 0, 63755, 0, 5343, 78422, 0, 4555, 5341, 0, 0, 0, 5351, - 0, 43104, 65244, 917892, 64541, 42519, 74472, 0, 0, 74765, 917888, 0, - 6638, 0, 65113, 271, 74180, 65370, 8835, 65368, 12653, 65366, 42172, - 41086, 65363, 65362, 65361, 11912, 43410, 11323, 65357, 11800, 65355, - 5345, 65353, 65352, 65351, 761, 65349, 19959, 0, 63856, 0, 0, 77958, - 64647, 77959, 11957, 4699, 0, 0, 0, 0, 64605, 0, 0, 0, 4916, 0, 380, - 10958, 66563, 77955, 69773, 9773, 13167, 12918, 41096, 73980, 69245, - 78254, 917893, 10684, 0, 917896, 0, 7946, 12541, 8182, 0, 69780, 0, 0, 0, - 0, 9005, 1225, 6630, 0, 0, 0, 0, 8847, 0, 65876, 5535, 8329, 74590, 0, 0, - 0, 0, 3127, 2595, 65713, 42013, 0, 5607, 41089, 0, 0, 74256, 2665, 11304, - 0, 74200, 4970, 8764, 120459, 8934, 0, 41566, 4492, 0, 65011, 41090, 0, - 0, 1188, 7254, 1100, 0, 0, 41081, 2912, 11749, 69792, 0, 0, 3572, 10023, - 4959, 13079, 0, 0, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450, - 13304, 0, 127260, 41451, 0, 11095, 8273, 127533, 3451, 0, 972, 41453, 0, - 0, 73883, 0, 73945, 0, 3455, 19955, 9538, 0, 69807, 0, 0, 0, 0, 11396, 0, - 11019, 0, 0, 0, 120507, 41078, 0, 261, 5927, 7791, 0, 0, 0, 10696, 0, - 6073, 9838, 118920, 0, 6075, 0, 282, 0, 6437, 74078, 0, 65861, 0, 0, 0, - 0, 3474, 118787, 0, 120655, 6081, 0, 0, 74076, 78879, 0, 0, 0, 0, 0, - 8751, 11499, 120273, 7816, 12636, 4665, 12628, 4670, 120271, 120272, 0, - 9642, 10912, 958, 0, 11387, 78878, 4666, 0, 4915, 0, 4669, 0, 68099, - 13287, 4664, 10836, 120550, 0, 69775, 0, 43595, 7450, 0, 917875, 8664, - 9697, 3606, 917873, 0, 0, 64815, 1063, 120250, 120251, 9772, 7255, 8886, - 1389, 0, 120257, 120258, 120259, 12941, 42661, 120254, 120255, 120256, - 12301, 120266, 69820, 41102, 66604, 120262, 120263, 120264, 1017, 66600, - 523, 505, 1447, 74436, 0, 0, 0, 8608, 42789, 0, 0, 0, 119196, 11307, - 66707, 917871, 0, 11745, 7919, 0, 1641, 0, 0, 8966, 0, 0, 5908, 0, 0, - 6744, 0, 1699, 74191, 74843, 0, 0, 6306, 10169, 0, 119251, 118939, 3766, - 2389, 120456, 120455, 6611, 257, 43170, 13153, 0, 42386, 0, 9436, 2599, - 0, 6496, 9449, 5930, 11476, 11033, 11447, 0, 5622, 120436, 8477, 3760, - 1718, 9442, 66433, 3776, 0, 41435, 4352, 0, 2435, 120809, 5621, 0, 4201, - 3778, 4203, 4202, 4205, 4204, 120447, 3768, 68142, 765, 41440, 3764, - 8473, 6373, 8469, 120438, 12947, 4564, 0, 0, 74271, 73753, 8374, 0, 0, - 6829, 5225, 0, 0, 0, 0, 119615, 0, 74793, 5626, 73807, 11771, 0, 0, 0, 0, - 5353, 5625, 74179, 0, 0, 1010, 64572, 41780, 42623, 64277, 0, 6952, 0, - 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, 10961, 0, 203, 0, 0, 0, 0, 78350, - 0, 64378, 42054, 0, 0, 554, 119649, 11358, 0, 12182, 42048, 11065, 0, + 0, 128140, 68415, 0, 4538, 120406, 43141, 0, 0, 74214, 73886, 0, 0, + 118902, 43005, 78448, 9552, 0, 0, 0, 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, 0, 119566, 0, 12808, 12183, 6145, 118955, 64929, 92433, 0, 0, + 43186, 42509, 0, 3922, 9187, 0, 0, 10191, 119057, 11752, 3353, 9358, 0, + 917957, 66680, 120090, 8248, 7931, 8558, 9795, 68380, 0, 0, 120082, + 120081, 120084, 41027, 120086, 0, 120088, 120087, 7019, 120073, 0, 11751, + 120078, 78294, 64657, 8657, 120048, 8594, 120068, 0, 0, 120069, 120072, + 120071, 0, 0, 43154, 41029, 0, 11332, 65380, 7728, 0, 11294, 0, 66665, + 7851, 0, 8375, 8699, 0, 42524, 0, 9085, 0, 7504, 9327, 6160, 128095, 0, + 0, 8088, 0, 74012, 92500, 0, 4439, 6926, 0, 12924, 128227, 42369, 0, + 65491, 65145, 9041, 43559, 64577, 10826, 0, 11296, 0, 0, 0, 65825, 9577, + 68199, 0, 64670, 0, 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, 0, 0, 65125, 41244, 0, 13271, 9103, 41180, + 0, 0, 0, 0, 10219, 0, 0, 0, 0, 43178, 127070, 41261, 119362, 43640, 8613, + 0, 118989, 6736, 195092, 41492, 12005, 127889, 0, 1890, 120056, 0, 0, 0, + 7293, 7991, 0, 10578, 0, 78076, 194738, 78077, 0, 0, 78800, 92653, 64445, + 42668, 6635, 0, 6164, 65170, 0, 0, 7676, 11664, 0, 0, 69707, 0, 118812, + 0, 0, 128045, 9175, 11925, 78045, 9088, 0, 64545, 1396, 0, 7546, 3847, 0, + 127835, 4985, 13288, 672, 8098, 43196, 194746, 0, 128126, 0, 74043, + 65072, 1577, 11772, 13041, 5928, 4525, 10658, 65911, 1266, 10180, 0, + 128584, 12622, 0, 0, 0, 194714, 127139, 13310, 773, 19933, 1539, 0, + 126983, 42731, 92205, 0, 0, 0, 3051, 5862, 7823, 92478, 0, 120411, 3250, + 43991, 69687, 66649, 9510, 66237, 0, 0, 41066, 64673, 917963, 917964, 0, + 3505, 8707, 917968, 6725, 128013, 917971, 92314, 3471, 917970, 5479, 882, + 6686, 119584, 11613, 120772, 42754, 0, 0, 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, 0, 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, + 41474, 119562, 41565, 0, 5934, 119867, 66583, 119231, 64877, 0, 64481, + 78614, 66013, 41956, 43455, 126995, 0, 0, 0, 42273, 5819, 0, 917556, 0, + 0, 0, 65910, 127747, 10246, 120816, 0, 1237, 10274, 4552, 119576, 0, 0, + 1375, 66705, 43573, 65260, 42063, 0, 42811, 10312, 74192, 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, 0, 0, 0, 43811, 9330, 0, 7222, 10283, 10315, 10379, 4996, + 0, 13281, 66517, 7865, 10087, 78343, 0, 78347, 0, 0, 7565, 66363, 12952, + 64806, 43180, 77928, 68096, 77929, 43982, 74288, 622, 74023, 885, 43405, + 1602, 0, 0, 852, 0, 12160, 0, 10212, 65435, 0, 12071, 9609, 12156, + 917983, 917984, 43586, 11035, 10411, 917988, 10255, 6710, 10279, 4194, + 10375, 917993, 0, 4315, 12644, 127516, 77937, 43639, 43343, 0, 917998, + 11501, 41177, 128689, 0, 917792, 0, 92413, 8715, 0, 41179, 0, 43313, 0, + 41176, 0, 994, 0, 8452, 127103, 73966, 0, 0, 5921, 0, 2597, 0, 5922, + 118903, 77943, 4186, 92531, 127106, 127105, 6718, 0, 4406, 74601, 8480, + 9192, 9747, 128699, 4413, 92196, 42268, 3198, 5924, 5920, 92469, 6921, + 78081, 74007, 42869, 8418, 11681, 43169, 10176, 0, 742, 0, 2893, 10772, + 65276, 5937, 1914, 2553, 11682, 6756, 128590, 128646, 8363, 0, 2993, + 7772, 3916, 0, 120494, 1141, 42407, 8159, 718, 7572, 973, 0, 120718, + 3235, 2415, 43164, 0, 8018, 42333, 74756, 10675, 6937, 42486, 43381, + 65390, 10067, 0, 1202, 0, 0, 65863, 0, 0, 0, 78182, 64542, 3260, 73829, + 65388, 9945, 8419, 78042, 6738, 0, 43681, 69728, 2059, 0, 0, 55237, 1431, + 0, 66565, 10821, 0, 12804, 128076, 8229, 1235, 3307, 11472, 78089, 78184, + 4544, 0, 0, 0, 1740, 78097, 8758, 985, 12872, 64511, 78094, 12068, 78102, + 0, 10141, 0, 63761, 8785, 4476, 78109, 63763, 12655, 8907, 78105, 78106, + 78103, 78104, 0, 119572, 10665, 64616, 41572, 0, 127160, 0, 41573, 0, + 3931, 120295, 74143, 0, 0, 0, 0, 11982, 0, 0, 0, 128016, 64484, 0, 41167, + 0, 41735, 0, 717, 10754, 0, 0, 127979, 0, 63767, 0, 1780, 6936, 0, 0, + 819, 10611, 9694, 126978, 0, 0, 0, 0, 8343, 8342, 8345, 8344, 6578, 7009, + 7523, 6922, 8348, 8347, 7525, 3346, 8339, 128165, 128338, 575, 268, + 78111, 8563, 5754, 120343, 41541, 65565, 8336, 5936, 7290, 78117, 8337, + 8341, 308, 11388, 7522, 120721, 78123, 65466, 11090, 6953, 0, 120346, 0, + 78132, 5926, 78128, 78130, 78126, 78127, 78124, 78125, 9038, 7887, 43456, + 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, 65308, 9462, 917554, 0, 0, 0, 42736, 0, 5756, 0, 7638, + 41642, 42764, 0, 43109, 7637, 5752, 120600, 0, 73832, 128827, 120635, + 128231, 78334, 0, 7636, 65171, 9124, 0, 78892, 0, 291, 0, 0, 2027, 66230, + 10080, 78136, 10403, 0, 4640, 64713, 10224, 120429, 42512, 120431, + 120430, 0, 128351, 127489, 127148, 0, 92499, 0, 119094, 74213, 7824, 0, + 0, 41274, 5778, 6302, 0, 0, 12680, 119130, 1417, 77889, 194914, 9452, 0, + 74393, 11552, 0, 127855, 0, 65391, 0, 10172, 65453, 63789, 41264, 78658, + 6426, 4641, 9179, 64819, 55278, 41255, 42036, 41469, 41269, 120412, + 41267, 4646, 120425, 865, 42034, 78274, 78273, 4645, 42033, 78270, + 127982, 0, 64728, 0, 78673, 78674, 1659, 919, 42784, 1671, 195089, 6069, + 9219, 195090, 1661, 13120, 63784, 69819, 10140, 9713, 119143, 0, 0, 0, + 2306, 10485, 118943, 6068, 10612, 195099, 119567, 195101, 92561, 41462, + 120470, 195079, 5422, 128234, 0, 0, 0, 10229, 10635, 826, 128081, 195082, + 195085, 195084, 195087, 6483, 0, 1808, 7848, 0, 8100, 78227, 78669, + 78670, 13301, 78667, 9667, 78665, 78872, 0, 11003, 9904, 0, 0, 120690, + 9144, 10921, 0, 78680, 9840, 65131, 78678, 77841, 10313, 0, 0, 64320, + 10265, 78686, 10962, 78684, 43008, 8945, 78683, 0, 41, 195072, 1792, + 120515, 195073, 8655, 195075, 92544, 77951, 12066, 0, 385, 4152, 2585, + 127804, 119068, 3126, 0, 74136, 10957, 0, 43258, 0, 127873, 13157, 0, 0, + 3570, 0, 7443, 0, 44006, 6997, 0, 0, 7879, 8739, 11075, 0, 65216, 0, + 69795, 2593, 8463, 7810, 917862, 7839, 119913, 78806, 119912, 9691, 4411, + 78802, 0, 0, 43442, 78799, 65254, 10066, 0, 0, 0, 0, 13061, 8016, 78687, + 19932, 64831, 0, 119923, 12390, 119171, 1634, 68115, 0, 11056, 0, 119925, + 0, 41165, 11328, 12450, 0, 41166, 0, 12456, 119914, 171, 5941, 12452, + 917544, 12458, 12531, 78779, 43013, 63800, 74162, 127569, 120483, 9969, + 0, 12454, 63806, 42132, 12063, 78425, 78424, 3230, 0, 0, 0, 5209, 297, + 5810, 8522, 8415, 119937, 78429, 78428, 7077, 2497, 128651, 960, 74156, + 6981, 92374, 12938, 4292, 0, 74815, 10512, 0, 74814, 78875, 127505, + 78876, 2503, 73778, 1762, 69794, 2495, 78873, 5844, 78874, 118838, 0, + 12654, 4663, 1899, 78877, 2507, 64121, 8726, 65594, 0, 0, 0, 8892, 0, + 92339, 0, 0, 5782, 420, 0, 0, 43796, 10797, 63794, 0, 0, 64814, 63796, + 77965, 0, 66581, 119204, 41608, 0, 0, 63792, 4659, 120788, 0, 43676, 0, + 69673, 0, 0, 0, 329, 77968, 92707, 917548, 7399, 0, 41188, 13244, 120466, + 42167, 7435, 78193, 5380, 119086, 69225, 1155, 11365, 43126, 77972, 0, + 65684, 0, 5601, 65192, 42765, 63752, 0, 7987, 0, 1172, 69799, 6786, + 43601, 120476, 74126, 5603, 0, 4473, 0, 194823, 0, 65347, 65346, 65345, + 0, 127384, 5347, 69802, 0, 73868, 118944, 10588, 0, 0, 63755, 0, 5343, + 78422, 0, 4555, 5341, 0, 0, 128670, 5351, 0, 43104, 65244, 917892, 64541, + 42519, 74472, 0, 0, 74765, 917888, 194892, 6638, 0, 65113, 271, 74180, + 65370, 8835, 65368, 12653, 65366, 42172, 41086, 65363, 65362, 65361, + 11912, 43410, 11323, 65357, 11800, 65355, 5345, 65353, 65352, 65351, 761, + 65349, 19959, 69718, 63856, 0, 2423, 77958, 64647, 77959, 11957, 4699, 0, + 0, 0, 0, 64605, 0, 0, 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, + 0, 8847, 0, 65876, 5535, 8329, 74590, 0, 92609, 0, 0, 3127, 2595, 65713, + 42013, 0, 5607, 41089, 0, 0, 74256, 2665, 11304, 0, 74200, 4970, 8764, + 120459, 8934, 92726, 41566, 4492, 0, 65011, 41090, 0, 0, 1188, 7254, + 1100, 0, 128301, 41081, 2912, 11749, 69792, 0, 0, 3572, 10023, 4959, + 13079, 0, 0, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450, 13304, + 128290, 127260, 41451, 0, 11095, 8273, 127533, 3451, 0, 972, 41453, 0, 0, + 73883, 92408, 73945, 0, 3455, 19955, 9538, 0, 69807, 0, 0, 0, 0, 11396, + 0, 11019, 0, 0, 0, 120507, 41078, 0, 261, 5927, 7791, 0, 64446, 0, 10696, + 0, 6073, 9838, 118920, 0, 6075, 128563, 282, 0, 6437, 74078, 128000, + 9801, 0, 0, 0, 0, 3474, 118787, 0, 120655, 6081, 0, 127843, 74076, 78879, + 0, 0, 0, 0, 0, 8751, 11499, 120273, 7816, 12636, 4665, 12628, 4670, + 92608, 120272, 0, 9642, 10912, 958, 0, 11387, 78878, 4666, 0, 4915, 0, + 4669, 0, 68099, 13287, 4664, 10836, 120550, 0, 69775, 0, 43595, 7450, 0, + 917875, 8664, 9697, 3606, 917873, 0, 0, 64815, 1063, 120250, 120251, + 9772, 7255, 8886, 1389, 127932, 120257, 120258, 120259, 12941, 42661, + 92381, 120255, 120256, 12301, 120266, 69820, 41102, 66604, 120262, + 120263, 120264, 1017, 66600, 523, 505, 1447, 74436, 0, 0, 0, 8608, 42789, + 120613, 128704, 0, 119196, 11307, 66707, 917871, 127751, 11745, 7919, 0, + 1641, 0, 0, 8966, 0, 0, 5908, 0, 0, 6744, 128355, 1699, 74191, 74843, 0, + 0, 6306, 10169, 0, 119251, 10068, 3766, 2389, 120456, 120455, 6611, 257, + 43170, 13153, 0, 42386, 0, 9436, 2599, 0, 6496, 9449, 5930, 11476, 11033, + 11447, 10541, 5622, 120436, 8477, 3760, 1718, 9442, 66433, 3776, 0, + 41435, 4352, 0, 2435, 120809, 5621, 120385, 4201, 3778, 4203, 4202, 4205, + 4204, 120447, 3768, 68142, 765, 41440, 3764, 8473, 6373, 8469, 120438, + 12947, 4564, 0, 0, 74271, 73753, 8374, 0, 0, 6829, 5225, 128807, 127385, + 0, 0, 119615, 0, 74793, 5626, 73807, 11771, 0, 127236, 128019, 0, 5353, + 5625, 74179, 0, 0, 1010, 64572, 41780, 42623, 64277, 0, 6952, 0, 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, 10961, 0, 203, 0, 0, 0, 0, 78350, 0, + 64378, 42054, 0, 0, 554, 119649, 11358, 0, 12182, 42048, 11065, 127878, 73891, 0, 0, 5694, 7689, 69798, 9323, 4325, 3047, 10317, 175, 0, 0, - 69764, 0, 0, 1243, 42154, 5431, 6652, 0, 69770, 43651, 0, 68118, 0, 1129, - 0, 0, 65900, 1986, 7846, 78804, 8661, 0, 65255, 0, 3845, 4490, 118969, - 6649, 74400, 1456, 7530, 11977, 7249, 8366, 0, 7756, 12342, 0, 51, 41516, - 0, 8570, 9568, 917863, 456, 7026, 8145, 1168, 9251, 9082, 0, 64055, - 42781, 3866, 12323, 41512, 73805, 68121, 0, 41494, 0, 4660, 0, 10405, 0, - 78803, 0, 0, 42040, 73918, 119627, 7944, 41454, 12605, 0, 42205, 41455, - 236, 64051, 78867, 8214, 0, 0, 0, 41457, 0, 119589, 1969, 2384, 8097, - 917864, 0, 0, 78029, 8766, 0, 78079, 5854, 0, 10583, 0, 119989, 0, 10416, - 917869, 3872, 917868, 0, 8429, 0, 0, 2838, 917867, 0, 0, 0, 0, 0, 0, 0, - 11096, 120813, 10553, 1662, 8483, 0, 43605, 5892, 43418, 0, 73742, 66, - 65, 68, 67, 70, 69, 72, 71, 74, 73, 76, 75, 78, 77, 80, 79, 82, 81, 84, - 83, 86, 85, 88, 87, 90, 89, 119862, 10357, 7385, 8170, 1704, 8556, 0, - 9659, 0, 0, 0, 9556, 0, 4503, 11353, 9647, 0, 78185, 0, 0, 0, 78886, 0, - 0, 74229, 66593, 6438, 0, 9109, 78882, 1289, 64599, 0, 0, 0, 65507, 2447, - 0, 0, 0, 0, 0, 0, 6334, 0, 0, 19937, 0, 0, 0, 5675, 254, 0, 0, 0, 42425, - 8918, 64003, 5716, 42312, 0, 0, 6972, 42826, 0, 42464, 120567, 0, 0, - 74796, 64400, 64693, 0, 77861, 65429, 9515, 4435, 0, 42522, 0, 0, 11785, - 0, 64671, 41978, 1412, 4594, 1391, 10536, 8067, 9901, 7775, 0, 0, 74588, - 120748, 3140, 0, 7960, 43271, 0, 12518, 10909, 127508, 1428, 12472, 0, 0, - 7699, 12393, 0, 0, 0, 74518, 8223, 0, 4261, 0, 0, 0, 0, 0, 0, 0, 0, - 43419, 0, 64554, 10574, 3878, 0, 42352, 1752, 73785, 0, 42506, 0, 10199, - 0, 0, 0, 65919, 0, 6695, 720, 324, 0, 0, 43406, 0, 1464, 40985, 0, 7974, - 0, 43474, 0, 64488, 0, 0, 64041, 74787, 0, 78865, 0, 65597, 0, 78863, 0, - 1302, 0, 78861, 0, 0, 0, 5204, 74774, 43404, 43396, 0, 3995, 68360, - 65608, 3714, 0, 0, 0, 10999, 11750, 0, 43251, 68660, 43301, 0, 120557, - 8130, 8672, 10845, 11964, 0, 0, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, - 0, 468, 612, 0, 64401, 66448, 68376, 0, 1674, 0, 5823, 0, 12280, 0, 540, - 74564, 0, 0, 8432, 0, 11073, 0, 64316, 0, 0, 820, 41741, 0, 120667, 0, - 64684, 126992, 3359, 7800, 0, 65177, 6226, 353, 12396, 0, 119612, 64742, - 0, 120282, 0, 0, 12412, 19941, 0, 120277, 78847, 1884, 9481, 42418, 0, - 41157, 0, 1195, 64898, 7924, 0, 41151, 2010, 0, 41328, 42344, 0, 12409, - 0, 4360, 127009, 9739, 0, 74392, 73921, 0, 42521, 8539, 0, 0, 0, 0, 4788, - 0, 0, 65734, 0, 64353, 0, 13075, 74429, 0, 64569, 43532, 10837, 2492, 0, - 118901, 68637, 41136, 64351, 11813, 9649, 41154, 119617, 5128, 4038, - 41143, 65604, 64859, 41592, 6771, 1648, 5435, 0, 6734, 41343, 119848, - 65439, 12709, 6986, 119846, 0, 0, 41349, 0, 12581, 10374, 5175, 0, 73806, - 10254, 0, 10278, 10262, 77950, 41346, 0, 607, 0, 0, 0, 12923, 10314, - 10282, 65477, 10378, 120297, 40976, 8265, 0, 119834, 40975, 5840, 42838, - 0, 40978, 0, 119840, 0, 0, 0, 66444, 10538, 0, 2550, 119836, 6779, 0, 0, - 3525, 6824, 118886, 0, 0, 5619, 65822, 0, 194882, 7455, 0, 5616, 11486, - 9656, 0, 0, 10727, 5615, 0, 120551, 42380, 64895, 43693, 66451, 808, - 5455, 11347, 0, 1026, 5620, 194887, 0, 11350, 5617, 0, 9225, 64639, - 127073, 9145, 0, 1338, 120581, 0, 12739, 4603, 3084, 0, 0, 9858, 6037, 0, - 3974, 78213, 10290, 0, 3083, 10322, 0, 0, 0, 41036, 0, 0, 43321, 65606, - 0, 41032, 42388, 0, 64700, 10011, 1445, 40961, 0, 194893, 0, 40960, 0, - 194891, 0, 40963, 64952, 10402, 0, 0, 0, 10603, 0, 0, 0, 0, 6714, 10083, - 127069, 194895, 78367, 0, 0, 0, 9073, 42585, 64302, 10704, 65030, 4787, - 0, 74829, 0, 65423, 0, 0, 9570, 0, 9525, 2689, 917626, 65426, 0, 917624, - 43740, 0, 40966, 917623, 13286, 3998, 42598, 42596, 503, 0, 8735, 2690, - 66488, 42836, 194913, 41954, 917617, 1652, 772, 6688, 8310, 65428, 3487, - 43416, 3585, 10194, 43320, 119159, 0, 194874, 6468, 41976, 9720, 917606, - 11767, 41970, 0, 5836, 12358, 0, 4355, 9048, 12180, 65027, 64680, 65025, - 43699, 0, 41488, 0, 8527, 194917, 12362, 12435, 12360, 41053, 3266, 0, - 12356, 8616, 41466, 0, 0, 11450, 0, 3638, 12354, 0, 3216, 0, 2358, - 119069, 8633, 0, 0, 119182, 69244, 0, 0, 11759, 0, 6368, 74823, 0, 41423, - 8078, 10504, 0, 41698, 42237, 0, 7002, 0, 41430, 42267, 41051, 41484, 0, - 0, 41050, 41473, 10466, 13099, 0, 0, 0, 6435, 0, 11362, 0, 0, 65382, 0, - 41420, 0, 3625, 78157, 41409, 0, 0, 2041, 9178, 9672, 41427, 43541, - 43317, 0, 0, 0, 41424, 917598, 120546, 0, 0, 0, 41417, 1261, 0, 0, 12102, - 119662, 41401, 0, 0, 0, 0, 0, 42290, 3275, 0, 42329, 0, 0, 0, 0, 0, - 120725, 10989, 74234, 0, 10598, 7410, 2669, 903, 0, 2920, 0, 127232, - 74603, 64504, 19928, 0, 0, 3917, 0, 11732, 0, 0, 41448, 41461, 0, 0, - 917558, 0, 8819, 12663, 0, 41184, 74014, 232, 74835, 120646, 9168, 65786, - 0, 0, 0, 9094, 0, 11758, 68425, 0, 1064, 42467, 0, 10115, 19924, 0, 0, - 7862, 64551, 13224, 8516, 41862, 66650, 7561, 78618, 69793, 1878, 0, 0, - 2911, 0, 41178, 5427, 64823, 0, 0, 12617, 41174, 0, 41458, 0, 41463, - 42413, 11292, 2406, 775, 0, 65584, 0, 6074, 9618, 194903, 0, 43440, 0, - 194901, 41436, 3656, 0, 194899, 41456, 0, 1599, 11333, 0, 6703, 8513, 0, - 1613, 0, 68456, 12598, 0, 0, 78745, 74500, 41460, 10145, 10542, 9937, - 78746, 0, 9905, 0, 65730, 0, 120374, 8427, 120375, 55246, 120376, 0, - 11497, 64687, 74008, 120371, 3871, 0, 0, 9111, 5741, 0, 194846, 120366, - 119111, 120745, 0, 120368, 0, 11648, 0, 0, 120364, 41587, 120365, 0, - 74322, 42113, 0, 0, 12172, 0, 74530, 65298, 65723, 194840, 73871, 65724, + 69764, 0, 0, 1243, 42154, 5431, 6652, 0, 69770, 43651, 0, 68118, 128024, + 1129, 0, 0, 65900, 1986, 7846, 78804, 8661, 917772, 65255, 0, 3845, 4490, + 118969, 6649, 74400, 1456, 7530, 11977, 7249, 8366, 0, 7756, 12342, + 128568, 51, 41516, 0, 8570, 9568, 917863, 456, 7026, 8145, 1168, 9251, + 9082, 119964, 64055, 42781, 3866, 12323, 41512, 73805, 68121, 0, 41494, + 92316, 4660, 0, 10405, 0, 78803, 0, 0, 42040, 73918, 119627, 7944, 41454, + 12605, 0, 42205, 41455, 236, 64051, 78867, 8214, 0, 0, 0, 41457, 0, + 119589, 1969, 2384, 8097, 917864, 0, 127380, 78029, 8766, 0, 78079, 5854, + 127974, 10583, 0, 119989, 0, 10416, 917869, 3872, 917868, 0, 8429, 0, + 118806, 2838, 128802, 0, 917866, 0, 0, 0, 0, 0, 11096, 120813, 10553, + 1662, 8483, 120396, 43605, 5892, 43418, 0, 73742, 66, 65, 68, 67, 70, 69, + 72, 71, 74, 73, 76, 75, 78, 77, 80, 79, 82, 81, 84, 83, 86, 85, 88, 87, + 90, 89, 119862, 10357, 7385, 8170, 1704, 8556, 0, 9659, 0, 0, 0, 9556, 0, + 4503, 11353, 9647, 0, 78185, 0, 0, 92713, 78886, 0, 0, 74229, 66593, + 6438, 917979, 9109, 78882, 1289, 64599, 0, 0, 0, 65507, 2447, 0, 0, + 128042, 0, 0, 0, 6334, 0, 0, 19937, 0, 92368, 0, 5675, 254, 0, 0, 69686, + 42425, 8918, 64003, 5716, 42312, 0, 0, 6972, 42826, 0, 42464, 120567, 0, + 92645, 74796, 64400, 64693, 0, 77861, 65429, 9515, 4435, 0, 42522, 0, 0, + 11785, 0, 64671, 41978, 1412, 4594, 1391, 10536, 8067, 9901, 7775, + 128293, 0, 74588, 120748, 3140, 128854, 7960, 43271, 0, 12518, 10909, + 127508, 1428, 12472, 0, 128787, 7699, 12393, 0, 0, 0, 74518, 8223, 0, + 4261, 0, 0, 0, 0, 0, 128302, 0, 128046, 43419, 0, 64554, 10574, 3878, 0, + 42352, 1752, 73785, 0, 42506, 128541, 10199, 0, 0, 0, 65919, 0, 6695, + 720, 324, 0, 0, 43406, 0, 1464, 40985, 0, 7974, 0, 43474, 0, 64488, 0, 0, + 64041, 74787, 0, 78865, 92258, 65597, 0, 78863, 0, 1302, 0, 78861, 0, 0, + 0, 5204, 74774, 43404, 43396, 0, 3995, 68360, 65608, 3714, 0, 0, 0, + 10999, 11750, 0, 43251, 68660, 43301, 0, 120557, 8130, 8672, 10845, + 11964, 0, 0, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, 0, 468, 612, 0, + 64401, 66448, 68376, 0, 1674, 0, 5823, 0, 12280, 0, 540, 74564, 119017, + 0, 8432, 0, 11073, 0, 64316, 0, 0, 820, 41741, 0, 120667, 0, 64684, + 126992, 3359, 7800, 128644, 65177, 6226, 353, 12396, 0, 119612, 64742, + 128682, 120282, 0, 0, 12412, 19941, 0, 120277, 78847, 1884, 9481, 42418, + 0, 41157, 0, 1195, 64898, 7924, 0, 41151, 2010, 0, 41328, 42344, 0, + 12409, 0, 4360, 127009, 9739, 0, 74392, 73921, 0, 42521, 8539, 0, 0, + 118986, 0, 4788, 0, 0, 65734, 0, 43790, 0, 13075, 74429, 0, 64569, 43532, + 10837, 2492, 127197, 118901, 68637, 41136, 43785, 11813, 9649, 41154, + 119617, 5128, 4038, 41143, 65604, 64859, 41592, 6771, 1648, 5435, 0, + 6734, 41343, 119848, 65439, 12709, 6986, 92364, 0, 0, 41349, 119123, + 12581, 10374, 5175, 0, 73806, 10254, 0, 10278, 10262, 77950, 41346, 0, + 607, 0, 119853, 128846, 12923, 10314, 10282, 65477, 10378, 120297, 40976, + 8265, 0, 119834, 40975, 5840, 42838, 0, 40978, 0, 119840, 0, 0, 0, 66444, + 10538, 0, 2550, 119836, 6779, 0, 0, 3525, 6824, 118886, 0, 0, 5619, + 65822, 0, 194882, 7455, 0, 5616, 11486, 9656, 0, 0, 10727, 5615, 0, + 120551, 42380, 64895, 43693, 66451, 808, 5455, 11347, 0, 1026, 5620, + 194887, 0, 11350, 5617, 0, 9225, 64639, 127073, 9145, 128060, 1338, + 120581, 0, 12739, 4603, 3084, 0, 92484, 9858, 6037, 0, 3974, 78213, + 10290, 0, 3083, 10322, 0, 0, 0, 41036, 0, 0, 43321, 65606, 0, 41032, + 42388, 0, 64700, 10011, 1445, 40961, 0, 194893, 0, 40960, 0, 194891, 0, + 40963, 64952, 10402, 0, 0, 92304, 10603, 0, 0, 0, 0, 6714, 10083, 127069, + 194895, 78367, 127377, 0, 0, 9073, 42585, 64302, 10704, 65030, 4787, 0, + 74829, 0, 65423, 0, 128118, 9570, 0, 9525, 2689, 917626, 65426, 0, + 917624, 43740, 0, 40966, 917623, 13286, 3998, 42598, 42596, 503, 74237, + 8735, 2690, 66488, 42836, 127150, 41954, 917617, 1652, 772, 6688, 8310, + 65428, 3487, 43416, 3585, 10194, 43320, 119159, 128183, 194874, 6468, + 41976, 9720, 917606, 11767, 41970, 0, 5836, 12358, 0, 4355, 9048, 12180, + 65027, 64680, 13038, 43699, 0, 41488, 128087, 8527, 194917, 12362, 12435, + 12360, 41053, 3266, 0, 12356, 8616, 41466, 0, 92588, 11450, 0, 3638, + 12354, 0, 3216, 0, 2358, 92606, 8633, 0, 0, 119182, 69244, 0, 0, 11759, + 194903, 6368, 74823, 0, 41423, 8078, 10504, 0, 41698, 42237, 0, 7002, 0, + 41430, 42267, 41051, 41484, 0, 0, 41050, 41473, 10466, 13099, 0, 0, 0, + 6435, 0, 11362, 0, 0, 65382, 0, 41420, 0, 3625, 78157, 41409, 0, 69639, + 2041, 9178, 9672, 41427, 43541, 43317, 0, 0, 0, 41424, 917598, 120546, 0, + 128212, 0, 41417, 1261, 0, 0, 12102, 119662, 41401, 0, 127538, 0, 78251, + 0, 42290, 3275, 92472, 42329, 74759, 0, 0, 0, 92388, 69649, 10989, 74234, + 0, 10598, 7410, 2669, 903, 0, 2920, 0, 127232, 74603, 64504, 19928, 0, 0, + 3917, 0, 11732, 0, 0, 41448, 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, 0, 2911, 0, + 41178, 5427, 64823, 0, 0, 3787, 41174, 0, 41458, 0, 41463, 42413, 11292, + 2406, 775, 0, 65584, 0, 6074, 9618, 128668, 0, 43440, 0, 194901, 41436, + 3656, 0, 194899, 41456, 0, 1599, 11333, 0, 6703, 8513, 0, 1613, 0, 68456, + 12598, 0, 120734, 78745, 74500, 41460, 10145, 10542, 9937, 78746, 0, + 9905, 0, 65730, 0, 120374, 8427, 120375, 55246, 120376, 0, 11497, 64687, + 74008, 42592, 3871, 0, 128305, 9111, 5741, 0, 194846, 120366, 119111, + 120745, 0, 120368, 0, 11648, 0, 194873, 120364, 41587, 120365, 0, 74322, + 42113, 0, 127155, 12172, 0, 74530, 65298, 65723, 194840, 73871, 65724, 7928, 120354, 0, 41595, 73730, 0, 42118, 73830, 66042, 10355, 0, 7875, 0, - 41598, 3993, 0, 1545, 40971, 536, 0, 43029, 0, 0, 65173, 65286, 0, 0, 0, - 0, 0, 0, 41375, 5402, 0, 0, 1687, 120503, 0, 0, 78194, 64326, 40969, - 10526, 78753, 8323, 40968, 1339, 11731, 78756, 0, 65460, 12242, 0, 8020, - 10843, 11554, 0, 0, 8266, 41006, 65722, 0, 10710, 0, 118942, 67667, - 64567, 119155, 195091, 0, 119636, 67857, 120687, 0, 0, 11755, 66305, 0, - 0, 10917, 120767, 0, 11272, 2040, 41247, 41326, 195060, 1741, 42370, - 1227, 0, 0, 11413, 0, 0, 5283, 1586, 4978, 0, 1984, 0, 0, 120651, 40984, - 0, 9373, 0, 12916, 6284, 0, 41663, 0, 0, 0, 9237, 9385, 41648, 0, 0, 0, - 41666, 1830, 73783, 2056, 41287, 0, 0, 0, 42219, 0, 0, 41987, 41676, 0, - 120823, 0, 41670, 0, 0, 2796, 55291, 11683, 9902, 74521, 0, 11451, 0, 0, - 42631, 2359, 0, 67844, 74164, 41238, 548, 11405, 13133, 64368, 0, 0, 0, - 397, 43622, 42139, 9547, 9590, 0, 1614, 43661, 64356, 66307, 6651, 1358, - 0, 428, 9620, 1466, 78112, 10982, 118831, 1333, 0, 407, 6425, 0, 74253, - 0, 0, 0, 5804, 11976, 8554, 0, 0, 0, 9057, 42294, 41218, 0, 0, 78137, - 1883, 10952, 8048, 0, 41225, 0, 118955, 0, 0, 0, 4407, 0, 65809, 119074, - 194821, 8448, 68122, 74183, 0, 12675, 12659, 0, 42363, 120624, 194824, - 55273, 10766, 12012, 2386, 64732, 9170, 917821, 9123, 64585, 120500, 0, - 43367, 42051, 0, 4164, 9081, 0, 120569, 42049, 42042, 8709, 0, 0, 120637, - 42419, 0, 42047, 0, 0, 8470, 11807, 65897, 577, 0, 0, 74300, 0, 127308, - 74840, 0, 0, 0, 0, 8736, 1414, 42643, 9683, 43486, 74344, 0, 2536, 0, - 66330, 0, 0, 0, 0, 0, 0, 0, 66317, 917612, 66315, 2106, 0, 11273, 0, - 43004, 7541, 0, 0, 961, 64307, 66324, 64906, 0, 3106, 65917, 41284, 1696, - 0, 891, 12105, 0, 42624, 12802, 3264, 8824, 13268, 43003, 10936, 0, 0, 0, - 0, 0, 0, 2322, 0, 0, 11449, 0, 42868, 41285, 3547, 0, 0, 0, 0, 43216, - 6089, 78682, 0, 120578, 4170, 1029, 0, 127036, 119224, 42374, 0, 744, 0, - 0, 0, 65823, 0, 0, 3551, 0, 0, 4623, 55268, 0, 4598, 0, 65136, 0, 0, 0, - 10851, 0, 6179, 0, 6180, 0, 11952, 120778, 78648, 11972, 78646, 78647, - 78644, 78645, 177, 78643, 6176, 120580, 0, 0, 6177, 9020, 78652, 78653, - 6178, 120249, 120242, 0, 67673, 7518, 8754, 0, 120237, 74551, 43081, 0, - 0, 9136, 120240, 4401, 41280, 0, 8974, 2308, 0, 74149, 0, 2318, 0, 66361, - 8198, 0, 64360, 12601, 42536, 65266, 120827, 74307, 0, 6970, 5404, 43332, - 3667, 7936, 12925, 126989, 6385, 0, 0, 118949, 10874, 65505, 0, 0, 42053, - 2075, 42057, 11083, 42052, 0, 0, 67651, 0, 9665, 0, 0, 13181, 0, 0, 0, 0, - 74148, 0, 0, 120225, 120229, 120224, 74172, 41145, 0, 0, 0, 41148, 8683, - 7594, 127519, 0, 119090, 10869, 43458, 41146, 0, 11441, 0, 3512, 119633, - 0, 8103, 0, 0, 65184, 11780, 41563, 42796, 0, 119106, 41544, 65146, 0, 0, - 0, 0, 19942, 0, 118908, 7988, 10436, 74273, 3271, 73804, 64711, 0, 0, 0, - 0, 3804, 13070, 11557, 42044, 0, 1095, 0, 3599, 0, 0, 0, 8514, 0, 0, 0, - 74346, 66697, 0, 11684, 0, 0, 0, 0, 42043, 43232, 66677, 0, 42046, 78241, - 4036, 0, 0, 0, 194861, 0, 11954, 0, 1450, 12986, 1340, 0, 65441, 0, 0, 0, - 0, 0, 917542, 0, 0, 6539, 0, 0, 0, 194856, 0, 120492, 41190, 3973, - 119365, 4575, 41193, 7982, 429, 0, 0, 0, 194854, 65792, 0, 118968, 6417, - 118918, 78178, 0, 194850, 0, 0, 4919, 10590, 0, 7755, 0, 0, 64548, - 120506, 1621, 10214, 65126, 0, 127004, 0, 12188, 0, 1617, 8050, 0, 5015, - 0, 119174, 42590, 194871, 1756, 78181, 0, 65768, 6352, 41892, 0, 7555, - 13103, 5408, 2817, 1214, 0, 0, 0, 0, 0, 0, 0, 7957, 8689, 64723, 1056, 0, - 74147, 0, 0, 55286, 7073, 65850, 12327, 0, 119028, 0, 0, 0, 2341, 8450, - 8484, 8474, 0, 0, 0, 8461, 0, 12153, 12799, 0, 43709, 43708, 9451, 7571, - 13073, 0, 0, 681, 0, 703, 0, 3272, 8781, 12894, 0, 11709, 0, 74446, 0, 0, - 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, 0, 0, 0, 0, 10039, 0, 0, 5623, 5717, 5776, 0, 0, 0, - 41591, 11036, 65252, 120488, 0, 0, 0, 0, 0, 0, 0, 8887, 0, 7295, 11031, - 0, 43157, 0, 8946, 10348, 10412, 8755, 0, 0, 5718, 13221, 0, 0, 78135, 0, - 0, 8810, 74499, 686, 0, 0, 4619, 118954, 6654, 73769, 74426, 0, 12040, - 65689, 10128, 65118, 0, 119151, 118891, 0, 0, 2401, 68144, 8792, 0, 0, - 65455, 0, 0, 0, 119129, 0, 12886, 0, 66624, 0, 43557, 10300, 10161, - 10396, 74135, 0, 118945, 78118, 73851, 3010, 6441, 78122, 1458, 41475, 0, - 0, 0, 11479, 0, 0, 6350, 12864, 0, 78114, 1061, 64780, 2001, 43111, - 55230, 0, 4052, 0, 7626, 0, 0, 1045, 0, 5631, 41113, 0, 0, 43707, 74127, - 0, 0, 8486, 0, 73758, 2335, 4362, 0, 0, 69221, 1025, 0, 42625, 0, 78084, - 41443, 0, 0, 0, 1774, 1523, 0, 0, 41445, 78236, 0, 8567, 41442, 3988, 0, - 78237, 118910, 0, 65274, 8564, 0, 78238, 127515, 0, 0, 43446, 0, 66513, - 6256, 0, 579, 55218, 10206, 0, 6375, 2673, 0, 11814, 0, 4488, 0, 0, - 68451, 10444, 118846, 0, 11799, 74407, 68466, 4487, 0, 42832, 1032, - 120267, 43450, 78257, 7203, 0, 614, 78191, 0, 120615, 0, 78262, 0, 0, 0, - 43121, 0, 0, 0, 1050, 7549, 0, 0, 9314, 0, 0, 120616, 0, 10057, 0, 0, 0, - 66504, 0, 0, 2307, 0, 64333, 0, 0, 73873, 0, 0, 0, 0, 0, 0, 10360, 6746, - 0, 0, 440, 0, 13085, 9233, 74216, 0, 0, 68612, 0, 66447, 8046, 64963, - 65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, 0, 10487, 0, 12527, 0, - 7970, 0, 0, 0, 65769, 5243, 9849, 5239, 65771, 0, 0, 5237, 0, 0, 10103, - 5247, 4769, 0, 118977, 12873, 5764, 0, 0, 3008, 4896, 0, 12087, 0, 55231, - 41103, 0, 64565, 4773, 0, 0, 0, 4770, 0, 917567, 8731, 65378, 0, 120619, - 9122, 0, 0, 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, - 78098, 0, 42814, 880, 0, 0, 0, 0, 0, 10116, 9877, 0, 0, 0, 7095, 0, 0, - 6778, 0, 78090, 8243, 2427, 0, 7093, 0, 11585, 195003, 9962, 0, 12223, 0, - 0, 1434, 0, 5637, 11573, 0, 0, 0, 19951, 0, 78121, 0, 0, 55283, 0, 0, - 74437, 1156, 8740, 0, 3782, 64331, 0, 41370, 1014, 8261, 0, 0, 10835, 0, - 65536, 0, 120463, 0, 7702, 118824, 0, 43010, 65779, 65783, 1150, 10547, - 5700, 0, 120603, 65383, 2339, 42594, 5697, 118788, 0, 0, 0, 42257, 5696, - 120470, 120465, 3862, 9643, 0, 0, 7634, 65167, 9845, 0, 0, 5701, 9722, - 41490, 0, 1426, 68217, 0, 68447, 42204, 55270, 8571, 194991, 0, 0, 78818, - 0, 43182, 12184, 0, 42022, 0, 10281, 0, 5650, 43194, 64712, 10744, 0, - 990, 5647, 0, 7387, 78734, 41114, 11477, 5646, 12879, 11018, 0, 3945, 0, - 0, 0, 0, 0, 78212, 0, 1020, 73763, 0, 78731, 5648, 64748, 194910, 0, - 10205, 3545, 0, 6984, 0, 74051, 0, 43242, 120458, 2667, 0, 0, 0, 9911, 0, - 65020, 10097, 119166, 0, 0, 118836, 0, 78427, 1140, 78426, 0, 10159, 0, - 0, 8128, 0, 0, 917965, 1815, 19910, 890, 0, 3267, 0, 0, 10123, 0, 4410, - 1041, 10576, 6354, 0, 580, 74232, 0, 0, 0, 0, 0, 19938, 65906, 0, 0, 0, - 3298, 5375, 10142, 0, 8215, 0, 6134, 41246, 64402, 0, 0, 0, 0, 0, 41382, - 0, 0, 5173, 65348, 527, 0, 0, 0, 0, 78797, 11915, 0, 0, 10072, 0, 42695, - 2329, 42250, 0, 0, 0, 12245, 9939, 0, 0, 0, 0, 0, 74328, 119576, 74769, - 0, 119087, 9069, 6144, 0, 0, 73822, 0, 0, 64917, 41521, 118934, 494, - 13250, 0, 65098, 6364, 956, 0, 12830, 10462, 73740, 0, 0, 0, 0, 66449, - 13263, 74281, 69217, 13171, 0, 0, 0, 0, 0, 1044, 41276, 0, 0, 0, 42068, - 11795, 0, 0, 0, 0, 42450, 3907, 0, 64526, 0, 68197, 12295, 0, 11475, 0, - 3020, 11537, 0, 66441, 0, 0, 0, 0, 1057, 566, 42696, 0, 3016, 42274, - 43464, 66490, 12921, 66571, 78472, 0, 3006, 4620, 127237, 0, 0, 0, 64659, - 0, 0, 55253, 6357, 6362, 8626, 0, 0, 9090, 65377, 41596, 0, 0, 1698, 0, - 64477, 0, 0, 1053, 0, 78269, 0, 0, 1052, 1051, 459, 1060, 74349, 66479, - 0, 0, 0, 0, 42490, 689, 6508, 4163, 42298, 8639, 66641, 4246, 0, 0, - 12130, 0, 42337, 64596, 64375, 66481, 0, 0, 0, 6359, 0, 43471, 0, 0, 0, - 127274, 0, 6358, 6361, 1926, 6356, 0, 7898, 8110, 10935, 0, 43633, 5830, - 0, 43685, 0, 0, 0, 0, 8693, 78611, 119565, 0, 0, 0, 127257, 0, 0, 0, 0, - 0, 0, 0, 119187, 11439, 78868, 0, 0, 78869, 42313, 5579, 0, 0, 0, 0, 0, - 5578, 41774, 0, 42023, 6234, 5669, 0, 0, 0, 0, 127506, 68202, 5583, 0, 0, - 42426, 5580, 42276, 2923, 892, 5582, 42465, 41330, 194987, 5795, 65512, - 119006, 65702, 0, 120801, 65251, 0, 65710, 0, 0, 67672, 0, 5370, 0, - 194986, 1638, 10966, 10188, 65878, 118848, 0, 0, 0, 0, 8172, 42017, 0, - 10844, 0, 0, 0, 6374, 0, 0, 286, 78023, 1062, 0, 119999, 0, 7395, 0, - 1070, 64900, 0, 6095, 41865, 0, 3015, 0, 917763, 5211, 0, 6400, 0, - 194983, 0, 8189, 11276, 0, 0, 372, 0, 0, 118874, 42102, 41585, 0, 0, - 42101, 276, 78402, 0, 33, 74226, 0, 9007, 118796, 41588, 66033, 427, - 10763, 118819, 0, 0, 0, 1031, 6257, 0, 42104, 0, 0, 2328, 0, 1071, 0, 0, - 74848, 0, 0, 0, 1047, 0, 0, 64790, 0, 0, 10651, 0, 0, 0, 0, 0, 119181, - 5711, 41633, 12098, 65571, 9166, 0, 5710, 0, 6790, 65168, 13216, 0, 0, 0, - 0, 64611, 41623, 195001, 5715, 0, 0, 0, 5712, 2761, 41620, 68124, 3074, - 5722, 0, 8643, 73768, 0, 118906, 2757, 11067, 9718, 74498, 8910, 10689, - 6479, 0, 0, 0, 78607, 0, 0, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, 120010, 0, - 8701, 68130, 119616, 120522, 0, 42477, 0, 12123, 4495, 43569, 0, 0, 0, + 41598, 3993, 0, 1545, 40971, 536, 128521, 43029, 0, 0, 65173, 65286, 0, + 0, 0, 0, 0, 0, 41375, 5402, 0, 0, 1687, 120503, 0, 0, 78194, 64326, + 40969, 10526, 78753, 8323, 40968, 1339, 11731, 78756, 0, 65460, 12242, + 128513, 8020, 10843, 11554, 0, 0, 8266, 41006, 65722, 0, 10710, 0, + 118942, 67667, 64567, 119155, 195091, 0, 119636, 67857, 120687, 0, 0, + 11755, 66305, 0, 0, 10917, 120767, 0, 11272, 2040, 41247, 41326, 195060, + 1741, 42370, 1227, 0, 0, 11413, 0, 0, 5283, 1586, 4978, 0, 1984, 194621, + 0, 92293, 40984, 128306, 9373, 0, 12916, 6284, 0, 41663, 0, 0, 0, 9237, + 9385, 41648, 0, 0, 0, 41666, 1830, 73783, 2056, 41287, 92610, 0, 0, + 42219, 128257, 0, 41987, 41676, 0, 120823, 0, 41670, 0, 92590, 2796, + 55291, 11683, 9902, 74521, 0, 11451, 0, 128822, 42631, 2359, 0, 67844, + 74164, 41238, 548, 11405, 13133, 64368, 0, 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, 41225, 92621, 42915, 0, 128684, 0, 4407, 0, 65809, + 119074, 194821, 8448, 7141, 74183, 0, 12675, 12659, 0, 42363, 120624, + 194824, 55273, 10766, 12012, 2386, 64732, 9170, 917821, 9123, 64585, + 120500, 0, 7140, 10977, 127378, 4164, 9081, 0, 120569, 42049, 42042, + 8709, 128283, 0, 120637, 42419, 64799, 42047, 0, 0, 8470, 11807, 65897, + 577, 0, 0, 74300, 0, 127308, 74840, 0, 0, 128791, 92224, 8736, 1414, + 42643, 9683, 43486, 74344, 0, 2536, 0, 66330, 0, 0, 0, 0, 0, 0, 0, 66317, + 917612, 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, 0, 11449, 128187, 42868, 41285, 3547, 0, 0, 0, 0, 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, 0, 65136, + 127136, 0, 0, 10851, 0, 6179, 92602, 6180, 0, 11952, 120778, 78648, + 11972, 78646, 78647, 78644, 78645, 177, 78643, 6176, 120580, 0, 0, 6177, + 9020, 78652, 78653, 6178, 120249, 120242, 128027, 67673, 7518, 8754, 0, + 120237, 2137, 43081, 0, 0, 9136, 120240, 4401, 41280, 0, 8974, 2308, 0, + 74149, 0, 2318, 0, 66361, 8198, 0, 64360, 12601, 42536, 65266, 120827, + 74307, 0, 6970, 5404, 43332, 3667, 7936, 12925, 126989, 6385, 0, 0, + 118949, 10874, 65505, 128083, 0, 42053, 2075, 42057, 11083, 42052, 0, 0, + 67651, 0, 9665, 92300, 0, 13181, 0, 0, 0, 0, 74148, 0, 0, 120225, 120229, + 120224, 74172, 41145, 0, 0, 0, 41148, 8683, 7594, 127519, 0, 119090, + 10869, 43458, 41146, 92407, 11441, 0, 3512, 119633, 0, 8103, 0, 0, 65184, + 11780, 41563, 42796, 0, 69742, 41544, 65146, 0, 0, 0, 0, 19942, 0, + 118908, 7988, 10436, 74273, 3271, 73804, 64711, 0, 0, 0, 0, 3804, 13070, + 11557, 42044, 0, 1095, 0, 3599, 127774, 0, 128861, 8514, 0, 0, 0, 74346, + 66697, 0, 11684, 0, 92486, 0, 0, 42043, 43232, 66677, 0, 42046, 78241, + 4036, 0, 0, 128213, 194861, 0, 11954, 0, 1450, 12986, 1340, 0, 65441, + 92722, 0, 0, 127772, 0, 917542, 0, 0, 6539, 0, 0, 0, 194856, 0, 120492, + 41190, 3973, 119365, 4575, 41193, 7982, 429, 0, 127194, 0, 194854, 65792, + 0, 118968, 6417, 118918, 78178, 0, 194850, 0, 0, 4919, 10590, 0, 7755, 0, + 0, 64548, 120506, 1621, 10214, 65126, 0, 127004, 0, 12188, 0, 1617, 8050, + 0, 5015, 0, 119174, 42590, 194871, 1756, 78181, 0, 65768, 6352, 41892, 0, + 7555, 13103, 5408, 2817, 1214, 0, 92335, 0, 0, 0, 0, 127195, 7957, 8689, + 64723, 1056, 42896, 74147, 194813, 0, 55286, 7073, 65850, 12327, 0, + 119028, 0, 0, 0, 2341, 8450, 8484, 8474, 0, 0, 0, 8461, 128102, 12153, + 12799, 0, 43709, 43708, 9451, 7571, 13073, 0, 0, 681, 0, 703, 0, 3272, + 8781, 12894, 0, 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, 0, 0, 0, + 0, 10039, 0, 0, 5623, 5717, 5776, 0, 0, 0, 41591, 11036, 65252, 92382, 0, + 0, 0, 67848, 0, 0, 0, 8887, 0, 7295, 11031, 0, 43157, 0, 8946, 10348, + 10412, 8755, 0, 0, 5718, 13221, 0, 0, 78135, 0, 0, 8810, 74499, 686, 0, + 0, 4619, 118954, 6654, 73769, 74426, 0, 12040, 65689, 10128, 65118, 0, + 119151, 74205, 92651, 0, 2401, 68144, 8792, 0, 0, 65455, 0, 92246, 0, + 119129, 0, 12886, 127920, 66624, 0, 43557, 10300, 10161, 10396, 74135, 0, + 118945, 78118, 73851, 3010, 6441, 78122, 1458, 41475, 128672, 0, 0, + 11479, 0, 0, 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, 0, 0, 69221, 1025, 0, 42625, 917627, + 78084, 41443, 0, 128206, 0, 1774, 1523, 0, 0, 41445, 78236, 0, 8567, + 41442, 3988, 0, 78237, 118910, 0, 65274, 8564, 78199, 78238, 127515, 0, + 0, 43446, 0, 66513, 6256, 0, 579, 55218, 10206, 0, 6375, 2673, 0, 11814, + 0, 4488, 0, 127336, 68451, 10444, 118846, 127334, 11799, 74407, 68466, + 4487, 127849, 42832, 1032, 120267, 43450, 78257, 7203, 0, 614, 78191, + 127325, 120615, 0, 78262, 128669, 127323, 0, 43121, 0, 0, 92513, 1050, + 7549, 0, 0, 9314, 0, 0, 120616, 0, 10057, 0, 127313, 0, 66504, 0, 0, + 2307, 0, 64333, 127312, 128547, 73873, 0, 0, 0, 127973, 128708, 0, 10360, + 6746, 0, 92245, 440, 0, 13085, 9233, 74216, 0, 0, 9957, 0, 66447, 8046, + 64963, 65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, 0, 10487, 0, + 12527, 0, 7970, 0, 128660, 0, 65769, 5243, 9849, 5239, 65771, 0, 0, 5237, + 69714, 0, 10103, 5247, 4769, 0, 118977, 12873, 5764, 0, 0, 3008, 4896, 0, + 12087, 0, 55231, 41103, 0, 64565, 4773, 0, 92717, 0, 4770, 0, 917567, + 8731, 65378, 127362, 120619, 9122, 128033, 0, 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, 78098, 0, 42814, 880, 0, 0, 128021, 2134, + 0, 10116, 9877, 92329, 0, 0, 7095, 0, 74116, 6778, 0, 78090, 8243, 2427, + 128141, 7093, 0, 11585, 195003, 9962, 0, 12223, 0, 0, 1434, 120254, 5637, + 11573, 0, 0, 0, 19951, 0, 78121, 0, 0, 55283, 0, 0, 74437, 1156, 8740, + 92415, 3782, 64331, 0, 41370, 1014, 8261, 0, 0, 10835, 0, 65536, 0, + 120463, 0, 7702, 118824, 0, 43010, 65779, 65783, 1150, 10547, 5700, 0, + 120603, 65383, 2339, 42594, 5697, 118788, 0, 128576, 0, 42257, 5696, + 92677, 120465, 3862, 9643, 0, 0, 7634, 65167, 9845, 0, 0, 5701, 9722, + 41490, 0, 1426, 68217, 0, 68447, 42204, 55270, 8571, 194991, 78067, 0, + 78818, 92719, 43182, 12184, 0, 42022, 0, 10281, 0, 5650, 43194, 64712, + 10744, 0, 990, 5647, 0, 7387, 78734, 41114, 11477, 5646, 12879, 11018, 0, + 3945, 92589, 0, 0, 0, 0, 78212, 127746, 1020, 73763, 0, 78731, 5648, + 64748, 194910, 0, 10205, 3545, 0, 6984, 0, 74051, 0, 43242, 120458, 2667, + 0, 0, 0, 9911, 0, 65020, 10097, 119166, 127145, 0, 118836, 0, 78427, + 1140, 78426, 0, 10159, 0, 0, 8128, 0, 0, 917965, 1815, 19910, 890, 0, + 3267, 92291, 0, 10123, 0, 4410, 1041, 10576, 6354, 92581, 580, 74232, 0, + 128347, 0, 0, 0, 19938, 65906, 127819, 0, 0, 3298, 5375, 10142, 0, 8215, + 0, 6134, 41246, 64402, 0, 128215, 0, 0, 0, 41382, 0, 128653, 5173, 65348, + 527, 0, 0, 92612, 128250, 78797, 11915, 0, 0, 10072, 0, 42695, 2329, + 42250, 0, 128864, 69667, 12245, 1568, 0, 0, 0, 128120, 0, 74328, 92708, + 74769, 0, 119087, 9069, 6144, 0, 0, 73822, 0, 128010, 64917, 41521, + 118934, 494, 13250, 0, 65098, 6364, 956, 0, 12830, 10462, 73740, 0, 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, 917847, + 68197, 12295, 0, 11475, 0, 3020, 11537, 0, 66441, 0, 0, 0, 0, 1057, 566, + 42696, 0, 3016, 42274, 43464, 66490, 12921, 66571, 78472, 92510, 3006, + 4620, 127237, 0, 0, 0, 64659, 0, 127749, 55253, 6357, 6362, 8626, 0, 0, + 9090, 65377, 41596, 0, 42920, 1698, 0, 64477, 0, 43813, 1053, 0, 78269, + 0, 0, 1052, 1051, 459, 1060, 74349, 66479, 0, 0, 0, 0, 42490, 689, 6508, + 4163, 42298, 8639, 66641, 4246, 0, 0, 12130, 0, 42337, 64596, 64375, + 66481, 127850, 0, 0, 6359, 0, 43471, 0, 0, 0, 127274, 0, 6358, 6361, + 1926, 6356, 92627, 7898, 8110, 10935, 0, 10069, 5830, 0, 43685, 0, 0, 0, + 0, 8693, 78611, 119565, 0, 120413, 0, 127257, 65894, 0, 0, 0, 0, 0, 0, + 119187, 2135, 78868, 0, 0, 78869, 42313, 5579, 92412, 0, 0, 0, 0, 5578, + 41774, 128115, 42023, 6234, 5669, 92275, 0, 0, 0, 127506, 68202, 5583, 0, + 0, 42426, 5580, 42276, 2923, 892, 5582, 42465, 41330, 194987, 5795, + 65512, 119006, 65702, 0, 120801, 65251, 0, 65710, 0, 0, 67672, 0, 5370, + 0, 2931, 1638, 10966, 10188, 65878, 118848, 0, 69694, 0, 128830, 8172, + 42017, 0, 10844, 0, 128195, 92424, 6374, 0, 0, 286, 78023, 1062, 0, + 119999, 0, 7395, 0, 1070, 64900, 7153, 6095, 41865, 0, 3015, 128023, + 917763, 5211, 0, 6400, 0, 194983, 0, 8189, 11276, 0, 0, 372, 128829, 0, + 118874, 42102, 41585, 128202, 0, 42101, 276, 78402, 0, 33, 74226, 127303, + 9007, 118796, 41588, 66033, 427, 10763, 118819, 0, 127884, 0, 1031, 6257, + 0, 42104, 0, 0, 2328, 92409, 1071, 0, 0, 74848, 0, 0, 0, 1047, 0, 0, + 64790, 0, 69723, 10651, 0, 0, 0, 0, 92206, 119181, 5711, 41633, 12098, + 65571, 9166, 0, 5710, 0, 6790, 65168, 13216, 0, 69716, 69726, 0, 64611, + 41623, 195001, 5715, 69654, 0, 0, 5712, 2761, 41620, 68124, 3074, 5722, + 0, 8643, 73768, 0, 118906, 2757, 11067, 9718, 74498, 8910, 10689, 6479, + 0, 0, 0, 78607, 9196, 69670, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, 120010, + 0, 8701, 68130, 119616, 120522, 0, 42477, 0, 12123, 4495, 43569, 0, 0, 0, 64946, 10992, 0, 120009, 0, 0, 9318, 120661, 13249, 65679, 73808, 0, 65457, 42249, 7639, 43995, 67845, 42641, 5454, 0, 0, 194997, 120005, 0, 0, 5084, 0, 0, 118861, 0, 733, 917876, 78014, 78436, 78435, 41677, 0, - 9218, 1731, 0, 0, 0, 0, 0, 0, 0, 120001, 127018, 0, 5155, 0, 5358, 0, 0, - 917767, 64424, 0, 3840, 64314, 41432, 0, 0, 68430, 119116, 43253, 65943, - 0, 3371, 10988, 0, 8771, 1479, 0, 0, 1109, 11580, 0, 64601, 12205, 0, 0, - 64507, 8868, 399, 0, 74842, 0, 0, 12149, 13088, 551, 0, 10156, 12119, 0, - 0, 2544, 65074, 0, 0, 0, 78011, 351, 119149, 0, 0, 55229, 0, 74268, 0, 0, - 0, 42377, 0, 0, 0, 0, 0, 9013, 4054, 0, 0, 0, 0, 73960, 5585, 65881, - 2549, 74469, 0, 0, 5584, 8358, 0, 74411, 0, 10919, 0, 7980, 0, 0, 0, - 41800, 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, 0, 0, 43452, 78609, - 0, 42573, 67856, 0, 78129, 0, 0, 0, 8135, 6450, 10055, 77996, 0, 0, 0, - 5657, 0, 9626, 0, 77994, 10179, 5654, 12939, 0, 120799, 0, 0, 5652, - 10945, 0, 66486, 0, 3661, 7863, 0, 0, 0, 74509, 0, 5659, 0, 0, 66729, - 5655, 0, 42168, 0, 1055, 917628, 0, 66310, 74030, 0, 12146, 73955, 73956, - 11618, 0, 126990, 0, 10272, 10304, 10368, 42518, 594, 10244, 10248, 7407, - 0, 64870, 0, 3467, 0, 0, 3331, 946, 10231, 1495, 8131, 74330, 0, 9562, - 69222, 65927, 0, 0, 120155, 69769, 64656, 0, 0, 194837, 0, 5666, 65227, - 5318, 63994, 0, 9091, 10798, 0, 917979, 10186, 0, 7732, 0, 64556, 0, 0, - 5668, 74445, 0, 0, 5670, 0, 0, 11820, 2992, 7826, 5667, 19952, 120807, 0, - 12749, 0, 0, 0, 66496, 4361, 119260, 1306, 9286, 1497, 0, 0, 0, 0, 3571, - 13247, 0, 7973, 66353, 68435, 78278, 67896, 43192, 0, 78265, 553, 120653, - 0, 0, 5829, 0, 4587, 78285, 65912, 0, 12746, 0, 0, 119924, 5633, 119927, - 0, 0, 0, 64905, 0, 9512, 0, 12742, 6443, 0, 0, 9135, 0, 41564, 0, 55219, - 0, 0, 0, 12148, 0, 78297, 0, 64256, 0, 11669, 0, 5634, 4524, 0, 127270, - 0, 118880, 2425, 65182, 0, 43636, 5221, 78410, 328, 0, 0, 69815, 5636, 0, - 5329, 0, 5638, 119918, 7940, 64938, 43223, 0, 5635, 3373, 2986, 78292, - 74223, 3437, 78291, 6203, 4247, 0, 11920, 8274, 0, 0, 1657, 41561, 78299, - 78295, 5639, 2954, 5660, 5640, 78303, 0, 78300, 42227, 0, 0, 41637, - 67872, 0, 78310, 41625, 43362, 78309, 120713, 11705, 5642, 0, 5486, 0, - 4356, 11710, 0, 12051, 0, 0, 5641, 8259, 0, 1058, 0, 67630, 0, 0, 1144, - 78750, 0, 42228, 0, 73890, 118972, 0, 65322, 0, 5645, 64964, 8652, 2547, - 66484, 43634, 0, 5608, 65890, 0, 0, 67621, 119934, 9000, 0, 0, 0, 1865, - 0, 5613, 74267, 0, 0, 5610, 0, 0, 65826, 2069, 0, 10787, 43999, 2997, 0, - 5609, 78316, 65319, 78313, 12316, 65376, 2412, 0, 8186, 9807, 74269, 0, - 13130, 65874, 0, 5807, 0, 10030, 5306, 12936, 0, 0, 11704, 0, 0, 10211, - 0, 0, 0, 0, 11706, 9710, 0, 0, 0, 413, 65623, 74237, 0, 9133, 74262, 0, - 1042, 0, 64779, 12171, 119240, 6185, 64776, 4984, 0, 708, 11391, 0, - 12241, 0, 0, 1308, 0, 2534, 810, 0, 0, 0, 0, 0, 1917, 3000, 0, 0, 120739, - 2364, 0, 74470, 66618, 65680, 0, 10027, 0, 0, 12337, 120722, 0, 0, 2980, - 755, 69774, 931, 13124, 68182, 6363, 2748, 0, 0, 65041, 0, 44011, 8730, - 0, 0, 78312, 7274, 119250, 0, 7275, 78304, 935, 0, 65840, 377, 42325, - 11649, 0, 65253, 64301, 0, 78308, 42341, 65284, 2417, 0, 12884, 19912, - 7907, 10768, 0, 194998, 0, 10673, 119217, 7248, 0, 0, 1781, 5496, 3627, - 62, 1649, 0, 964, 0, 0, 78226, 0, 127512, 0, 0, 0, 0, 43689, 0, 13142, + 9218, 1731, 0, 0, 0, 195010, 0, 0, 0, 120001, 127018, 92492, 5155, 0, + 5358, 0, 0, 917767, 64424, 0, 3840, 64314, 41432, 0, 0, 68430, 119116, + 43253, 65943, 0, 3371, 10988, 0, 8771, 1479, 0, 0, 1109, 11580, 0, 64601, + 12205, 0, 0, 64507, 8868, 399, 0, 74842, 0, 0, 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, 0, 0, 9013, 4054, 0, 0, 0, + 0, 73960, 5585, 65881, 2549, 74469, 0, 0, 5584, 8358, 0, 74411, 92219, + 10919, 0, 7980, 0, 0, 0, 41800, 5589, 0, 2664, 41613, 5586, 118890, 0, + 11356, 0, 0, 43452, 78609, 0, 42573, 67856, 0, 78129, 0, 0, 92535, 8135, + 6450, 10055, 77996, 0, 0, 0, 5657, 0, 9626, 0, 77994, 10179, 5654, 12939, + 92573, 120799, 0, 0, 5652, 10945, 0, 66486, 0, 3661, 7863, 0, 0, 0, + 74509, 0, 5659, 0, 127510, 66729, 5655, 0, 42168, 0, 1055, 917628, + 127792, 66310, 74030, 0, 12146, 73955, 73956, 11618, 0, 126990, 0, 10272, + 10304, 10368, 42518, 594, 10244, 10248, 7407, 0, 64870, 0, 3467, 0, 0, + 3331, 946, 10231, 1495, 8131, 74330, 0, 9562, 69222, 65927, 0, 0, 69696, + 69769, 64656, 0, 0, 194837, 0, 5666, 65227, 5318, 63994, 0, 9091, 10798, + 0, 128166, 10186, 0, 7732, 0, 64556, 0, 0, 5668, 74445, 0, 0, 5670, 0, + 127297, 11820, 2992, 7826, 5667, 19952, 120807, 0, 12749, 74551, 0, 0, + 66496, 4361, 119260, 1306, 9286, 1497, 0, 0, 0, 0, 3571, 13247, 0, 7973, + 66353, 68435, 78278, 67896, 43192, 0, 78265, 553, 120653, 0, 128554, + 5829, 0, 4587, 78285, 65912, 0, 12746, 0, 0, 119924, 5633, 119927, 0, 0, + 0, 64905, 0, 9512, 120671, 12742, 6443, 0, 0, 9135, 0, 41564, 0, 55219, + 128832, 0, 0, 12148, 0, 78297, 0, 64256, 0, 11669, 0, 5634, 4524, 0, + 127270, 0, 118880, 2425, 65182, 128769, 43636, 5221, 78410, 328, 0, 0, + 69815, 5636, 0, 5329, 0, 5638, 119918, 7940, 64938, 43223, 0, 5635, 3373, + 2986, 78292, 74223, 3437, 78291, 6203, 4247, 0, 11920, 8274, 0, 0, 1657, + 41561, 78299, 78295, 5639, 2954, 5660, 5640, 78303, 0, 78300, 42227, 0, + 0, 41637, 67872, 0, 78310, 41625, 43362, 78309, 120713, 11705, 5642, 0, + 5486, 0, 4356, 11710, 0, 12051, 0, 0, 5641, 8259, 0, 1058, 0, 67630, 0, + 0, 1144, 78750, 0, 42228, 0, 73890, 118972, 0, 65322, 0, 5645, 64964, + 8652, 2547, 66484, 43634, 0, 5608, 65890, 43808, 0, 67621, 119934, 9000, + 0, 0, 92673, 1865, 0, 5613, 74267, 0, 0, 5610, 0, 0, 65826, 2069, 0, + 10787, 43999, 2997, 0, 5609, 78316, 65319, 78313, 12316, 65376, 2412, 0, + 8186, 9807, 74269, 0, 13130, 65874, 0, 5807, 0, 10030, 5306, 12936, 0, 0, + 11704, 0, 92583, 10211, 0, 0, 0, 0, 11706, 9710, 0, 0, 0, 413, 65623, + 7118, 0, 9133, 74262, 0, 1042, 0, 64779, 12171, 119240, 6185, 64776, + 4984, 0, 708, 11391, 0, 12241, 92720, 0, 1308, 0, 2534, 810, 0, 0, 0, 0, + 0, 1917, 3000, 0, 0, 120739, 2364, 92443, 74470, 66618, 65680, 0, 10027, + 0, 128154, 12337, 120722, 127368, 0, 2980, 755, 69774, 931, 13124, 68182, + 6363, 2748, 0, 0, 65041, 0, 44011, 8730, 0, 127854, 78312, 7274, 119250, + 0, 7275, 78304, 935, 0, 65840, 377, 42325, 11649, 127363, 65253, 64301, + 128835, 78308, 42341, 65284, 2417, 0, 12884, 19912, 7907, 10768, 0, + 194998, 0, 10673, 119217, 7248, 0, 128346, 1781, 5496, 3627, 62, 1649, 0, + 964, 0, 127876, 78226, 128775, 127512, 0, 0, 0, 0, 43689, 127911, 13142, 78812, 42415, 66575, 4542, 74037, 43547, 0, 0, 7677, 2991, 4946, 42454, - 0, 7949, 0, 0, 11341, 42494, 3073, 65625, 9714, 11692, 4657, 0, 0, 6478, - 9898, 43673, 65237, 6241, 0, 4877, 0, 6238, 0, 10548, 127049, 4409, 0, 0, - 64798, 0, 5346, 0, 120528, 6237, 4874, 0, 9176, 0, 0, 65231, 65884, - 12678, 78748, 118912, 11378, 44018, 42785, 2408, 3251, 0, 0, 5685, 0, - 2461, 11052, 7091, 5342, 8317, 0, 68163, 5340, 0, 0, 43635, 73928, - 127529, 0, 0, 0, 0, 65482, 0, 9142, 0, 0, 0, 10938, 0, 118790, 1182, - 2542, 4826, 0, 0, 0, 529, 8580, 0, 0, 10586, 10790, 10839, 66023, 41593, - 41207, 0, 0, 41594, 225, 42828, 0, 0, 0, 11376, 74379, 10721, 67664, - 3438, 42097, 127267, 11084, 3194, 41870, 266, 78305, 0, 41873, 120575, - 11324, 0, 0, 8420, 64918, 0, 41871, 41338, 3734, 7734, 43683, 8750, - 66605, 66011, 0, 40965, 0, 0, 5161, 10572, 0, 0, 0, 64349, 7287, 42162, - 127552, 0, 0, 11948, 69220, 12359, 43429, 41369, 1697, 12191, 0, 68633, - 7286, 0, 68635, 10031, 0, 9870, 68645, 8620, 65824, 0, 11938, 0, 7285, 0, - 119577, 42678, 0, 43677, 41583, 0, 65799, 0, 0, 0, 0, 78169, 66199, 0, - 3609, 68624, 0, 832, 120693, 120770, 78473, 66007, 78471, 65703, 0, 0, - 42732, 5180, 0, 41395, 41530, 11691, 64773, 0, 74002, 0, 0, 0, 6348, 243, - 13200, 0, 6024, 0, 9979, 10037, 41529, 10648, 8538, 43687, 0, 0, 4285, - 66195, 0, 4230, 0, 13307, 43256, 0, 7563, 42376, 0, 68442, 120512, 0, 0, - 214, 0, 0, 78466, 65893, 12208, 9973, 0, 66311, 65589, 0, 2603, 0, 0, 0, - 0, 0, 6022, 0, 2884, 0, 11620, 0, 43, 0, 66453, 1016, 41107, 0, 41121, - 3885, 92, 65456, 64608, 0, 74801, 0, 2074, 0, 78283, 0, 12453, 0, 0, - 74241, 0, 6791, 12457, 78268, 0, 0, 0, 78279, 0, 0, 0, 66637, 7995, 8759, - 43421, 78277, 12449, 0, 0, 0, 8752, 3197, 4720, 10165, 0, 119249, 0, - 11595, 64893, 0, 43435, 0, 0, 4993, 0, 6168, 10934, 1946, 741, 0, 5494, - 4639, 0, 1990, 66589, 4498, 78664, 119183, 0, 0, 0, 2960, 73779, 0, 8969, - 0, 43424, 127059, 0, 2950, 0, 6210, 65753, 370, 0, 0, 0, 4953, 0, 0, 0, - 0, 69230, 0, 0, 65688, 0, 5063, 3517, 2964, 43663, 917762, 6344, 74791, - 10566, 10144, 66333, 8252, 729, 66016, 78253, 0, 0, 64923, 0, 43669, - 9032, 78263, 78264, 0, 41215, 0, 65883, 0, 0, 120602, 3761, 0, 0, 0, 0, - 12912, 119012, 3850, 0, 0, 0, 0, 0, 908, 0, 8611, 0, 0, 0, 43691, 41197, - 0, 8978, 120540, 119135, 41586, 10527, 0, 917848, 3848, 78739, 194937, - 127536, 65241, 5336, 0, 0, 663, 0, 10780, 0, 0, 78767, 0, 0, 68193, 347, - 0, 0, 78775, 64675, 41582, 78774, 78744, 65579, 12980, 78769, 12143, - 73733, 78512, 0, 43441, 41804, 78523, 0, 78525, 0, 0, 41584, 10681, 0, 0, - 73938, 0, 0, 4800, 66661, 0, 66306, 64715, 78534, 9518, 6609, 10434, 0, - 11319, 1097, 0, 917850, 41730, 0, 0, 73847, 78761, 65172, 41728, 41721, - 0, 0, 0, 41203, 0, 13110, 41726, 0, 0, 1000, 0, 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, 0, 78796, - 78798, 78794, 78795, 68434, 78793, 66670, 0, 0, 12290, 0, 0, 0, 42142, - 9968, 8205, 0, 5131, 0, 9627, 78536, 78542, 78535, 0, 1944, 1248, 10148, - 0, 119990, 119991, 12701, 78376, 11308, 119995, 0, 119997, 119998, 65305, - 74263, 4031, 42794, 120003, 7075, 8154, 120006, 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, 0, 13012, 4571, 0, 0, 0, - 12078, 2970, 0, 10933, 0, 77870, 0, 0, 0, 41599, 0, 0, 0, 12950, 0, 3486, - 0, 0, 4239, 0, 0, 66511, 0, 2637, 64629, 8460, 127053, 8476, 0, 0, 0, 0, - 65673, 1019, 78495, 4148, 0, 12289, 0, 4316, 0, 13119, 0, 5412, 66243, - 9935, 0, 73864, 0, 41734, 8206, 74081, 9163, 3286, 9072, 5867, 13302, - 7622, 0, 41736, 0, 41731, 0, 7400, 5416, 68663, 118924, 10817, 0, 41539, - 0, 0, 73963, 41855, 41867, 65564, 11277, 65892, 11536, 10620, 0, 12210, - 66030, 73932, 5498, 73942, 41536, 0, 68204, 0, 3459, 8997, 0, 0, 0, 0, 0, - 0, 66377, 69781, 0, 0, 78511, 3161, 295, 120207, 0, 0, 0, 78742, 9016, - 43454, 63903, 63902, 43641, 0, 3971, 0, 73972, 2952, 78765, 11038, 10901, - 63900, 63899, 63898, 0, 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, 63875, 63874, 11460, 7432, - 1913, 41913, 63852, 0, 0, 42348, 0, 6752, 446, 41911, 0, 63851, 63850, - 41910, 0, 63846, 2972, 12932, 7262, 0, 63849, 63848, 63847, 0, 6570, - 8302, 7259, 63842, 4178, 10746, 7250, 13214, 10041, 8105, 63892, 0, - 118983, 1105, 4180, 0, 12094, 9497, 0, 63891, 63890, 63889, 63888, 5538, - 9987, 0, 118932, 1678, 13274, 552, 120654, 44010, 10785, 0, 119170, 4557, - 74459, 9159, 10171, 13125, 63860, 5540, 63858, 63865, 281, 13242, 63862, - 74154, 0, 5536, 65568, 63857, 1388, 74169, 0, 1077, 0, 65099, 11531, - 5834, 0, 0, 0, 0, 42773, 0, 0, 0, 119220, 0, 3663, 0, 1112, 119122, 8686, - 0, 5334, 65081, 43249, 74778, 0, 11077, 0, 6509, 0, 5327, 0, 19907, - 63869, 3478, 7583, 7679, 2903, 0, 3001, 1158, 8745, 0, 73748, 63866, 0, - 1915, 4846, 0, 66371, 118984, 42105, 2990, 120128, 805, 69238, 120125, - 12070, 8760, 1117, 118987, 12212, 120123, 65174, 42357, 63835, 63834, 0, - 78240, 12225, 63838, 63837, 0, 0, 63833, 6042, 66360, 8083, 0, 0, 63821, - 63820, 63819, 63818, 0, 5227, 9047, 63822, 0, 6091, 0, 10691, 560, 5643, - 8226, 119578, 63812, 63811, 63810, 63809, 5542, 63815, 63814, 63813, - 6047, 1597, 120143, 780, 206, 77925, 4936, 65147, 8168, 63930, 2076, - 1093, 9882, 63934, 2082, 63932, 917554, 63929, 3546, 1605, 77934, 9806, - 43472, 77933, 8400, 11343, 2086, 0, 63926, 2984, 5968, 9287, 0, 4618, - 42209, 43431, 13169, 5290, 2089, 1695, 10743, 1088, 63825, 7268, 1084, - 1085, 63829, 1083, 10131, 7283, 0, 63970, 0, 1092, 4754, 7273, 5252, - 44016, 43627, 0, 0, 7408, 11809, 0, 0, 0, 2965, 7258, 8808, 0, 1089, + 0, 7949, 0, 0, 11341, 42494, 3073, 65625, 9714, 11692, 4657, 0, 92724, + 6478, 9898, 43673, 65237, 6241, 7106, 4877, 0, 6238, 0, 10548, 127049, + 4409, 0, 0, 64798, 0, 5346, 0, 120528, 6237, 4874, 0, 9176, 0, 0, 65231, + 65884, 12678, 78748, 118912, 11378, 44018, 42785, 2408, 3251, 0, 0, 5685, + 0, 2461, 11052, 7091, 5342, 8317, 0, 68163, 5340, 0, 127820, 43635, + 73928, 127529, 0, 0, 0, 128510, 65482, 0, 9142, 0, 0, 0, 10938, 0, + 118790, 1182, 2542, 4826, 0, 0, 128176, 529, 8580, 0, 0, 10586, 10790, + 10839, 66023, 41593, 41207, 0, 0, 41594, 225, 42828, 0, 0, 0, 11376, + 74379, 10721, 67664, 3438, 42097, 127267, 11084, 3194, 41870, 266, 78305, + 0, 41873, 120575, 11324, 120531, 0, 8420, 64918, 128844, 41871, 41338, + 3734, 7734, 43683, 8750, 66605, 66011, 0, 40965, 127937, 0, 5161, 10572, + 0, 0, 0, 64349, 7287, 42162, 127552, 0, 0, 11948, 69220, 12359, 43429, + 41369, 1697, 12191, 0, 68633, 7286, 0, 68635, 10031, 0, 9870, 68645, + 8620, 65824, 0, 11938, 0, 7285, 0, 119577, 42678, 0, 43677, 41583, 0, + 65799, 92623, 0, 0, 0, 78169, 66199, 0, 3609, 68624, 0, 832, 120693, + 120770, 78473, 66007, 78471, 65703, 0, 0, 42732, 5180, 92699, 41395, + 41530, 11691, 64773, 92214, 74002, 0, 0, 128645, 6348, 243, 13200, 0, + 6024, 92309, 9979, 10037, 41529, 10648, 8538, 43687, 0, 0, 4285, 66195, + 0, 4230, 0, 13307, 43256, 92353, 7563, 42376, 0, 68442, 120512, 0, 0, + 214, 0, 0, 78466, 65893, 12208, 9973, 0, 66311, 65589, 128277, 2603, 0, + 0, 0, 0, 0, 6022, 0, 2884, 0, 11620, 0, 43, 0, 66453, 1016, 41107, 0, + 41121, 3885, 92, 65456, 64608, 0, 74801, 0, 2074, 0, 78283, 0, 12453, + 128128, 0, 74241, 0, 6791, 12457, 78268, 0, 0, 0, 78279, 0, 0, 92358, + 66637, 7995, 8759, 43421, 78277, 12449, 128552, 0, 0, 8752, 3197, 4720, + 10165, 0, 119249, 0, 11595, 64893, 0, 43435, 0, 0, 4993, 0, 6168, 10934, + 1946, 741, 0, 5494, 4639, 0, 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, 0, 0, 0, 0, 69230, 0, 0, 65688, 0, 5063, + 3517, 2964, 43663, 917762, 6344, 74791, 10566, 10144, 66333, 8252, 729, + 66016, 78253, 0, 0, 64923, 128040, 43669, 9032, 78263, 78264, 0, 41215, + 0, 65883, 0, 917774, 120602, 3761, 0, 0, 0, 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, 0, 128786, 663, 0, 10780, 0, 0, 78767, 0, 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, 0, 73938, 0, 128022, 4800, 66661, 0, 66306, 64715, 78534, 9518, 6609, + 10434, 0, 11319, 1097, 0, 917850, 41730, 0, 0, 73847, 78761, 65172, + 41728, 41721, 0, 0, 0, 41203, 0, 13110, 41726, 0, 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, 0, 78796, 78798, 78794, 78795, 68434, 78793, 66670, 0, 0, + 12290, 120169, 0, 119873, 42142, 9968, 8205, 0, 5131, 0, 9627, 78536, + 78542, 78535, 0, 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, 0, 13012, 4571, 0, 0, 0, 12078, 2970, 0, 10933, 0, + 77870, 0, 0, 0, 41599, 0, 128831, 0, 12950, 92160, 3486, 0, 78311, 4239, + 0, 127799, 66511, 0, 2637, 64629, 8460, 127053, 8476, 0, 0, 0, 0, 65673, + 1019, 78495, 4148, 0, 12289, 0, 4316, 0, 13119, 0, 5412, 66243, 9935, 0, + 73864, 0, 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, 73932, 5498, 73942, 41536, 0, 68204, 92587, 3459, 8997, 0, + 0, 0, 0, 92512, 0, 66377, 69781, 0, 0, 78511, 3161, 295, 120207, 0, + 92223, 127856, 78742, 9016, 43454, 63903, 63902, 43641, 0, 3971, 0, + 73972, 2952, 78765, 11038, 10901, 63900, 63899, 63898, 0, 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, 63875, 63874, 11460, 7432, 1913, 41913, 63852, 0, 0, 42348, 0, + 6752, 446, 41911, 127906, 63851, 63850, 41910, 0, 63846, 2972, 12932, + 7262, 0, 63849, 63848, 63847, 128070, 6570, 8302, 7259, 63842, 4178, + 10746, 7250, 13214, 10041, 8105, 63892, 0, 118983, 1105, 4180, 0, 12094, + 9497, 0, 63891, 63890, 63889, 63888, 5538, 9987, 0, 118932, 1678, 13274, + 552, 120654, 44010, 10785, 0, 119170, 4557, 74459, 9159, 10171, 13125, + 63860, 5540, 63858, 63865, 281, 13242, 63862, 74154, 0, 5536, 65568, + 63857, 1388, 74169, 0, 1077, 0, 65099, 11531, 5834, 0, 0, 0, 0, 42773, 0, + 0, 0, 119220, 0, 3663, 0, 1112, 119122, 8686, 0, 5334, 65081, 43249, + 74778, 127968, 11077, 0, 6509, 0, 5327, 0, 19907, 63869, 3478, 7583, + 7679, 2903, 0, 3001, 1158, 8745, 0, 73748, 63866, 0, 1915, 4846, 0, + 66371, 118984, 42105, 2990, 120128, 805, 69238, 64438, 12070, 8760, 1117, + 118987, 12212, 120123, 65174, 42357, 63835, 63834, 0, 78240, 12225, + 63838, 63837, 0, 0, 63833, 6042, 66360, 8083, 0, 0, 63821, 63820, 63819, + 63818, 0, 5227, 9047, 63822, 127162, 6091, 0, 10691, 560, 5643, 8226, + 119578, 63812, 63811, 63810, 63809, 5542, 63815, 63814, 63813, 6047, + 1597, 120143, 780, 206, 77925, 4936, 65147, 8168, 63930, 2076, 1093, + 9882, 63934, 2082, 63932, 128150, 63929, 3546, 1605, 77934, 9806, 43472, + 77933, 8400, 11343, 2086, 0, 63926, 2984, 5968, 9287, 0, 4618, 42209, + 43431, 13169, 5290, 2089, 1695, 10743, 1088, 63825, 7268, 1084, 1085, + 63829, 1083, 10131, 7283, 0, 63970, 128358, 1092, 4754, 7273, 5252, + 44016, 43627, 127921, 0, 7408, 11809, 0, 0, 0, 2965, 7258, 8808, 0, 1089, 4187, 63937, 42119, 42120, 0, 940, 5787, 10099, 63938, 0, 74494, 12463, 2994, 0, 118827, 0, 9664, 77939, 77940, 67892, 77938, 74343, 0, 0, 660, 10127, 666, 9022, 5532, 43667, 5533, 77941, 78507, 6118, 222, 979, 3884, - 0, 74151, 120445, 6502, 0, 127118, 0, 63951, 12465, 0, 0, 0, 63946, 1707, - 63924, 12461, 63950, 63897, 63948, 63947, 63945, 6038, 63943, 63942, - 64685, 63895, 65838, 0, 7776, 0, 0, 0, 120444, 78172, 801, 43165, 1690, - 63919, 63918, 63917, 13277, 43659, 12951, 120638, 9906, 2054, 2334, - 78515, 63916, 5483, 63914, 120610, 63911, 5484, 63909, 63908, 2539, 0, - 43980, 5485, 0, 42697, 9061, 5534, 10672, 4502, 0, 253, 0, 68208, 0, - 42854, 78393, 0, 11530, 0, 68668, 0, 0, 0, 10474, 43426, 13257, 42354, 0, - 0, 0, 195065, 0, 8413, 0, 0, 5693, 7272, 0, 13209, 64470, 65831, 78460, - 195063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66608, 3111, 41863, 8804, 66607, 0, - 7270, 0, 66606, 6628, 1076, 7433, 1436, 73844, 55226, 0, 63982, 7393, - 12807, 43413, 63906, 1598, 63904, 0, 0, 41729, 4423, 1307, 0, 10515, - 41589, 0, 0, 6218, 0, 1430, 0, 0, 120606, 78754, 5413, 7619, 3255, 3493, - 74032, 11549, 10735, 41743, 73937, 6801, 0, 4518, 10990, 65073, 5167, - 4481, 3771, 0, 2710, 0, 69243, 41724, 0, 43073, 41690, 12479, 0, 0, 0, 0, - 119659, 1628, 0, 0, 0, 65262, 6333, 10783, 42315, 0, 63855, 120683, 0, 0, - 5339, 74323, 0, 13004, 0, 4457, 0, 0, 0, 0, 5684, 8678, 10914, 0, 5689, - 65807, 0, 68464, 12633, 12870, 78521, 65183, 5688, 11926, 6033, 6310, - 5686, 0, 74251, 0, 120647, 0, 50, 10558, 9871, 0, 43655, 0, 0, 0, 66468, - 0, 13259, 4448, 0, 0, 0, 0, 67853, 0, 10640, 0, 1151, 0, 917607, 0, - 127079, 195050, 0, 0, 0, 0, 12501, 64604, 0, 11527, 118870, 8812, 0, - 11538, 8673, 12650, 11020, 0, 66467, 2105, 8087, 78163, 0, 9894, 0, 0, 0, - 4636, 55262, 78513, 4515, 2382, 0, 127055, 0, 120495, 0, 0, 12277, - 194627, 11995, 194626, 0, 12158, 0, 8741, 10197, 0, 0, 0, 6531, 0, 0, + 0, 74151, 92652, 6502, 0, 127118, 128695, 63951, 12465, 0, 0, 128782, + 63946, 1707, 63924, 12461, 63950, 63897, 63948, 63947, 63945, 6038, + 63943, 63942, 64685, 63895, 65838, 0, 7776, 0, 0, 127773, 120444, 69730, + 801, 43165, 1690, 63919, 63918, 63917, 13277, 43659, 12951, 120638, 9906, + 2054, 2334, 78515, 63916, 5483, 63914, 69737, 63911, 5484, 63909, 63908, + 2539, 0, 43980, 5485, 0, 42697, 9061, 5534, 10672, 4502, 0, 253, 0, + 68208, 0, 9203, 74231, 0, 11530, 92542, 68668, 0, 128816, 0, 10474, + 43426, 13257, 42354, 0, 0, 0, 195065, 0, 8413, 0, 0, 5693, 7272, 0, + 13209, 64470, 65831, 78460, 195063, 0, 0, 0, 0, 0, 0, 0, 128133, 127767, + 66608, 3111, 41863, 8804, 42913, 92187, 7270, 0, 66606, 6628, 1076, 7433, + 1436, 73844, 55226, 128353, 63982, 7393, 12807, 43413, 63906, 1598, + 63904, 0, 0, 41729, 4423, 1307, 0, 10515, 41589, 128698, 0, 6218, 0, + 1430, 0, 0, 120606, 78754, 5413, 7619, 3255, 3493, 74032, 11549, 10735, + 41743, 73937, 6801, 0, 4518, 10990, 65073, 5167, 4481, 3771, 0, 2710, 0, + 69243, 41724, 0, 43073, 41690, 12479, 0, 0, 0, 0, 119659, 1628, 127149, + 0, 0, 65262, 6333, 10783, 42315, 0, 63855, 120683, 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, 0, 50, 10558, 9871, 0, 43655, 0, 0, 0, 66468, 0, 13259, 4448, 0, + 0, 0, 0, 67853, 0, 10640, 11539, 1151, 0, 917607, 127544, 127079, 195050, + 127852, 0, 0, 0, 12501, 64604, 0, 11527, 118870, 8812, 0, 11538, 8673, + 12650, 11020, 0, 66467, 2105, 8087, 78163, 69632, 9894, 0, 0, 0, 4636, + 55262, 78513, 4515, 2382, 0, 127055, 0, 120495, 0, 128284, 12277, 194627, + 11995, 92553, 0, 12158, 0, 8741, 10197, 0, 92426, 0, 6531, 0, 127846, 473, 43415, 0, 0, 1873, 1087, 0, 0, 0, 78527, 66439, 43218, 0, 194716, 7237, 12504, 74282, 0, 0, 0, 9489, 0, 0, 4384, 74220, 195055, 2058, - 917561, 13295, 43191, 0, 0, 1154, 3857, 1205, 0, 0, 13100, 12958, 120706, - 74168, 0, 0, 4421, 10592, 0, 495, 0, 41712, 7983, 0, 120779, 0, 6347, 0, - 7654, 41710, 4196, 0, 437, 41709, 73772, 0, 0, 9465, 13290, 119180, 4997, - 64306, 0, 0, 4999, 194642, 0, 0, 4711, 120769, 0, 2739, 0, 8044, 74834, - 0, 41789, 0, 10809, 0, 0, 0, 1779, 6600, 6601, 41543, 5325, 642, 64187, - 13058, 120449, 12875, 0, 0, 13229, 0, 10575, 43399, 0, 0, 41791, 1104, 0, - 0, 10655, 0, 0, 0, 0, 1082, 195049, 8428, 6569, 0, 0, 0, 0, 6783, 0, - 12993, 8049, 41548, 44021, 6458, 0, 0, 4761, 63828, 4766, 64623, 1273, - 43407, 0, 118876, 195045, 6912, 1313, 6322, 10483, 0, 41545, 0, 0, 0, 0, - 0, 0, 78624, 3484, 74337, 0, 0, 8503, 5122, 41527, 0, 66320, 0, 0, 0, 0, - 41537, 0, 8303, 8282, 11817, 73857, 10003, 73859, 65904, 194663, 1686, 0, - 78406, 11467, 3664, 65921, 64299, 194664, 0, 0, 4324, 126, 42246, 119152, - 0, 74378, 65926, 7744, 194636, 74277, 74302, 78052, 0, 6966, 0, 8136, 0, - 65600, 1633, 0, 0, 4762, 1103, 0, 0, 4765, 0, 13078, 0, 4760, 63827, - 2050, 10871, 43199, 1102, 0, 42236, 0, 194667, 11546, 74794, 337, 0, - 42591, 8627, 12279, 1111, 0, 0, 4707, 68206, 10143, 7883, 127081, 7880, - 4522, 8645, 5704, 13010, 0, 8304, 0, 0, 119575, 0, 0, 66654, 0, 0, 0, - 13008, 0, 4385, 0, 13011, 0, 0, 119161, 13009, 160, 2677, 0, 0, 41793, - 65763, 74221, 120141, 41792, 42770, 0, 65762, 118829, 64573, 5709, 0, - 194638, 0, 0, 0, 1079, 3867, 5708, 0, 0, 0, 5706, 64768, 5705, 8791, - 4005, 0, 10237, 10991, 0, 43459, 9173, 917581, 917580, 13170, 65942, + 128863, 13295, 43191, 128030, 0, 1154, 3857, 1205, 0, 0, 13100, 12958, + 120706, 74168, 0, 0, 4421, 10592, 0, 495, 0, 41712, 7983, 0, 120779, 0, + 6347, 0, 7654, 41710, 4196, 0, 437, 41709, 73772, 0, 0, 9465, 13290, + 119180, 4997, 64306, 0, 0, 4999, 194642, 0, 0, 4711, 120769, 0, 2739, 0, + 8044, 74834, 194643, 41789, 128142, 10809, 0, 0, 0, 1779, 6600, 6601, + 41543, 5325, 642, 64187, 13058, 120449, 12875, 0, 92186, 13229, 0, 10575, + 43399, 0, 0, 41791, 1104, 0, 0, 10655, 0, 0, 0, 0, 1082, 195049, 8428, + 6569, 0, 0, 0, 0, 6783, 0, 12993, 8049, 41548, 44021, 6458, 0, 128882, + 4761, 63828, 4766, 64623, 1273, 43407, 0, 118876, 195045, 6912, 1313, + 6322, 10483, 0, 41545, 0, 92449, 0, 0, 0, 0, 78624, 3484, 74337, 0, 0, + 8503, 5122, 41527, 0, 66320, 0, 0, 0, 0, 41537, 69683, 8303, 8282, 11817, + 73857, 10003, 73859, 65904, 194663, 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, 0, 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, 0, 0, 66654, 0, 92676, 0, 13008, 0, + 4385, 0, 13011, 0, 92569, 119161, 13009, 160, 2677, 0, 0, 41793, 65763, + 74221, 120141, 41792, 42770, 0, 65762, 118829, 43821, 5709, 0, 127177, + 43816, 0, 0, 1079, 3867, 5708, 0, 0, 43797, 5706, 64768, 5705, 8791, + 4005, 0, 10237, 10991, 0, 43459, 9173, 917581, 917580, 13170, 12540, 917577, 42605, 120765, 917570, 68647, 917572, 10058, 0, 74867, 194654, 127078, 3339, 11448, 1106, 917591, 917590, 917593, 3340, 917587, 917586, - 917589, 917588, 120541, 10605, 1309, 63966, 120743, 1754, 127075, 13246, - 864, 0, 118926, 8972, 0, 7849, 120092, 0, 13240, 195068, 5192, 4338, 0, - 10948, 917601, 13199, 120169, 1236, 13208, 13261, 13189, 13188, 120164, + 917589, 917588, 120541, 10605, 1309, 63966, 120743, 1754, 92226, 13246, + 864, 0, 118926, 8972, 0, 7849, 120092, 92533, 13240, 195068, 5192, 4338, + 0, 10948, 917601, 13199, 92575, 1236, 13208, 13261, 13189, 13188, 120164, 0, 7440, 0, 120153, 9553, 1590, 63777, 63776, 13178, 63782, 63781, 63780, - 63779, 1583, 0, 13260, 4550, 0, 64205, 0, 0, 41522, 0, 0, 0, 0, 11354, 0, - 0, 42795, 0, 119195, 11394, 194646, 13236, 13272, 13194, 1334, 0, 4479, - 1178, 65586, 120663, 66681, 119193, 4601, 0, 0, 0, 0, 0, 194658, 0, 6809, - 63786, 6031, 0, 63791, 63790, 1145, 63788, 7910, 63785, 43153, 754, - 10192, 13105, 8183, 120741, 2037, 0, 0, 10747, 125, 0, 64890, 0, 0, 0, - 41719, 63758, 3523, 1074, 13258, 9536, 74077, 0, 4427, 74242, 63757, + 63779, 1583, 0, 13260, 4550, 0, 64205, 0, 0, 41522, 0, 92168, 0, 917858, + 11354, 0, 0, 42795, 0, 119195, 11394, 194646, 13236, 13272, 13194, 1334, + 0, 4479, 1178, 65586, 120663, 66681, 119193, 4601, 0, 0, 0, 0, 0, 194658, + 0, 6809, 63786, 6031, 0, 63791, 63790, 1145, 63788, 7910, 63785, 43153, + 754, 10192, 13105, 8183, 120741, 2037, 0, 0, 10747, 125, 0, 64890, 0, 0, + 0, 41719, 63758, 3523, 1074, 13258, 9536, 74077, 0, 4427, 74242, 63757, 43145, 12217, 63754, 41532, 1349, 63750, 63749, 0, 0, 0, 63753, 63802, 41084, 120622, 68133, 41930, 63805, 63804, 43632, 63801, 41082, 8140, - 63798, 6260, 0, 0, 119225, 63793, 11988, 3898, 0, 10201, 12238, 63795, - 42194, 10367, 12521, 10431, 42114, 41932, 1068, 0, 12523, 12945, 0, - 42203, 7950, 10804, 63771, 42787, 4386, 12224, 6973, 2793, 12475, 0, 0, - 63769, 9530, 0, 12232, 13135, 8596, 5681, 63762, 4595, 63760, 792, 0, - 64803, 0, 8742, 0, 11053, 0, 63744, 0, 0, 7588, 63748, 1693, 63746, - 43204, 5055, 68426, 917853, 1090, 120679, 0, 11665, 74133, 4558, 65685, - 9523, 0, 0, 78681, 11513, 0, 6157, 63775, 63774, 63773, 13191, 12170, - 3500, 3139, 0, 3170, 12485, 0, 10872, 78271, 13006, 64433, 0, 0, 941, 0, - 0, 0, 65541, 11063, 0, 8228, 0, 42065, 0, 0, 0, 0, 0, 7386, 0, 68358, 0, - 0, 43603, 0, 65397, 288, 0, 0, 0, 10025, 917916, 2918, 0, 65300, 119871, - 9883, 64726, 2790, 65395, 3793, 0, 0, 65393, 0, 74138, 0, 0, 0, 74139, - 120613, 65394, 11548, 5270, 0, 65396, 0, 65813, 13256, 1282, 120771, 0, - 0, 10888, 0, 65242, 0, 3330, 0, 0, 0, 0, 0, 74259, 3304, 42753, 0, 0, 0, - 1627, 0, 0, 0, 5371, 13116, 0, 1826, 118794, 0, 43094, 0, 43650, 0, 0, - 9035, 0, 0, 0, 0, 0, 68125, 0, 164, 0, 0, 0, 6958, 0, 43116, 0, 0, 13245, - 0, 0, 127376, 0, 73893, 0, 12666, 13175, 13207, 120414, 66014, 120428, - 7447, 5929, 0, 65509, 0, 7449, 11306, 0, 73920, 3180, 0, 63808, 9054, - 971, 13062, 0, 0, 65195, 10164, 0, 74428, 0, 78146, 0, 0, 0, 0, 10045, - 12882, 13275, 0, 11057, 0, 13276, 0, 41525, 78150, 7271, 11444, 0, 0, 0, - 12229, 41523, 0, 43411, 73751, 0, 64813, 0, 0, 10476, 3858, 0, 3932, - 64958, 0, 0, 73989, 68192, 0, 0, 369, 0, 41784, 0, 64163, 0, 0, 0, 65474, - 4796, 12292, 0, 65479, 0, 41781, 10486, 41480, 120511, 9899, 0, 0, 404, - 12821, 3741, 0, 5788, 8092, 68212, 41222, 1831, 66020, 0, 0, 4388, 0, - 746, 120784, 0, 0, 12018, 65294, 0, 0, 0, 0, 4422, 4708, 3799, 74292, - 119357, 0, 74430, 0, 11700, 4374, 0, 0, 1364, 0, 8038, 0, 917597, 12868, - 69814, 0, 6735, 73979, 13174, 73968, 13225, 0, 69808, 65835, 0, 2365, - 7841, 0, 42855, 118856, 42866, 0, 0, 0, 66438, 41785, 41171, 64172, - 13173, 4372, 119354, 0, 0, 0, 0, 0, 0, 12965, 384, 64512, 10404, 10340, - 119352, 1556, 5274, 13210, 0, 10017, 9733, 41787, 0, 126994, 41373, + 63798, 6260, 0, 0, 119225, 63793, 11988, 3898, 128241, 10201, 12238, + 63795, 42194, 10367, 12521, 10431, 42114, 41932, 1068, 0, 12523, 12945, + 0, 42203, 7950, 10804, 63771, 42787, 4386, 12224, 6973, 2793, 12475, 0, + 0, 63769, 9530, 0, 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, 917853, 1090, 120679, 128356, 11665, 74133, + 4558, 65685, 9523, 0, 0, 78681, 11513, 0, 6157, 63775, 63774, 63773, + 13191, 12170, 3500, 3139, 0, 3170, 12485, 0, 10872, 78271, 13006, 64433, + 0, 0, 941, 0, 0, 0, 65541, 11063, 0, 8228, 0, 42065, 0, 0, 0, 0, 92455, + 7386, 0, 64444, 0, 119863, 43603, 0, 65397, 288, 0, 0, 0, 10025, 917916, + 2918, 0, 65300, 119871, 9883, 64726, 2790, 65395, 3793, 0, 127829, 65393, + 0, 74138, 0, 0, 0, 74139, 92712, 65394, 11548, 5270, 0, 65396, 0, 65813, + 13256, 1282, 120771, 0, 0, 10888, 0, 65242, 0, 3330, 0, 0, 0, 0, 0, + 74259, 3304, 42753, 0, 0, 0, 1627, 0, 0, 0, 5371, 13116, 0, 1826, 118794, + 0, 43094, 0, 43650, 0, 0, 9035, 0, 0, 128005, 0, 92207, 68125, 0, 164, 0, + 0, 0, 6958, 0, 43116, 0, 0, 13245, 0, 0, 127376, 0, 73893, 127756, 12666, + 13175, 13207, 120414, 66014, 120428, 7447, 5929, 0, 65509, 0, 7449, + 11306, 0, 73920, 3180, 0, 63808, 9054, 971, 13062, 0, 0, 65195, 10164, + 92252, 74428, 0, 78146, 92611, 0, 0, 0, 10045, 12882, 13275, 128161, + 11057, 0, 13276, 0, 41525, 78150, 7271, 11444, 0, 0, 0, 12229, 41523, 0, + 43411, 73751, 0, 64813, 0, 0, 10476, 3858, 0, 3932, 64958, 0, 0, 73989, + 68192, 0, 0, 369, 0, 41784, 0, 64163, 0, 0, 0, 65474, 4796, 12292, 0, + 65479, 0, 41781, 10486, 41480, 43002, 9899, 0, 0, 404, 12821, 3741, 0, + 5788, 8092, 68212, 41222, 1831, 66020, 3982, 0, 4388, 0, 746, 120784, 0, + 0, 12018, 65294, 0, 0, 0, 0, 4422, 4708, 3799, 74292, 119357, 0, 74430, + 0, 11700, 4374, 0, 128179, 1364, 0, 8038, 0, 917597, 12868, 69814, 0, + 6735, 73979, 13174, 73968, 13225, 0, 69808, 65835, 0, 2365, 7841, 0, + 42855, 118856, 42866, 0, 0, 0, 66438, 41785, 12617, 64172, 13173, 4372, + 119354, 0, 0, 0, 0, 92402, 128062, 12965, 384, 64512, 10404, 10340, + 119352, 1556, 5274, 13210, 120125, 10017, 9733, 41787, 0, 126994, 41373, 78039, 12303, 0, 13232, 13233, 349, 4863, 41371, 11656, 0, 120703, - 119883, 12861, 4398, 8543, 65618, 0, 1096, 0, 0, 42688, 12441, 12355, - 119348, 119347, 4318, 10452, 0, 8032, 13243, 13237, 12719, 0, 119101, 0, - 64884, 119872, 119345, 8597, 0, 0, 9864, 0, 120785, 119874, 0, 13195, - 41452, 64961, 7722, 0, 10459, 119878, 0, 119879, 66590, 0, 41533, 66337, - 0, 0, 0, 4965, 0, 917536, 73849, 0, 43638, 78537, 0, 6261, 119342, 43147, - 66570, 1957, 10420, 982, 2756, 13292, 13206, 0, 0, 2925, 73809, 13056, - 127559, 13212, 43238, 0, 13190, 13187, 0, 13198, 118793, 0, 5242, 119179, - 64476, 1694, 8216, 0, 6770, 43331, 0, 65620, 0, 43544, 0, 0, 41444, - 65621, 120325, 64799, 5246, 120326, 13185, 9709, 120323, 120322, 12314, - 65616, 5238, 119333, 0, 119337, 5236, 40979, 0, 74201, 8286, 0, 3936, - 119331, 11699, 41347, 127249, 13235, 8842, 41248, 0, 4379, 13239, 12692, - 7969, 127266, 7219, 127250, 0, 120509, 0, 66224, 734, 2979, 120303, - 65619, 9872, 957, 64921, 1846, 66631, 41477, 119256, 120310, 74511, - 41770, 1670, 6442, 120317, 42446, 5379, 120318, 41163, 74832, 120315, - 120314, 0, 0, 42841, 13267, 0, 0, 41775, 0, 0, 41773, 0, 10663, 0, 0, 0, - 6151, 12110, 42673, 65572, 119602, 65250, 13265, 13264, 64518, 0, 6100, - 0, 0, 5808, 65922, 0, 12967, 66041, 5612, 4583, 0, 0, 68097, 64575, 0, - 11965, 0, 119211, 0, 69789, 0, 0, 68102, 9698, 7814, 74476, 119651, 0, 0, - 41921, 118858, 9756, 6985, 119258, 0, 74219, 0, 0, 118997, 8012, 5674, - 12353, 0, 12361, 5677, 5588, 0, 41925, 0, 41920, 5673, 120534, 5676, - 41923, 12694, 118978, 5672, 1294, 0, 78059, 0, 42511, 1727, 0, 42436, 0, - 0, 0, 74222, 8718, 3550, 736, 10268, 4505, 10316, 74090, 5826, 55232, - 5813, 0, 120712, 5841, 5837, 55234, 0, 3105, 12829, 5838, 5796, 0, + 119883, 12861, 4398, 8543, 65618, 128018, 1096, 0, 0, 42688, 12441, + 12355, 119348, 119347, 4318, 10452, 0, 8032, 13243, 13237, 12719, 0, + 119101, 0, 64884, 119872, 119345, 8597, 0, 0, 9864, 0, 120785, 119874, 0, + 13195, 41452, 64961, 7722, 0, 10459, 119878, 0, 119879, 66590, 128123, + 41533, 66337, 0, 92184, 0, 4965, 43445, 917536, 73849, 0, 43638, 78537, + 128287, 6261, 119342, 43147, 66570, 1957, 10420, 982, 2756, 13292, 13206, + 128828, 0, 2925, 73809, 13056, 127559, 13212, 43238, 0, 13190, 13187, + 92541, 13198, 118793, 0, 5242, 119179, 64476, 1694, 8216, 0, 6770, 43331, + 0, 65620, 0, 43544, 0, 0, 41444, 65621, 120325, 9197, 5246, 119106, + 13185, 9709, 120323, 120322, 12314, 65616, 5238, 119333, 0, 119337, 5236, + 40979, 0, 74201, 8286, 0, 3936, 119331, 11699, 41347, 127249, 13235, + 8842, 41248, 0, 4379, 13239, 12692, 7969, 127266, 7219, 127250, 0, + 120509, 0, 66224, 734, 2979, 120303, 65619, 9872, 957, 64921, 1846, + 66631, 41477, 119256, 120310, 74511, 41770, 1670, 6442, 120317, 42446, + 5379, 120318, 41163, 74832, 120315, 120314, 128025, 0, 42841, 13267, 0, + 0, 41775, 0, 7130, 41773, 0, 10663, 0, 0, 0, 6151, 12110, 42673, 65572, + 65293, 65250, 13265, 13264, 64518, 0, 6100, 0, 92647, 5808, 65922, 0, + 12967, 66041, 5612, 4583, 0, 0, 68097, 64575, 128524, 11965, 0, 68358, 0, + 69789, 0, 92260, 68102, 9698, 7814, 74476, 119651, 128514, 0, 41921, + 118858, 9756, 6985, 119258, 78490, 74219, 0, 0, 118997, 8012, 5674, + 12353, 0, 12361, 5677, 5588, 0, 41925, 128124, 41920, 5673, 120534, 5676, + 41923, 12694, 118978, 5672, 1294, 0, 78059, 0, 42511, 1727, 120725, + 42436, 0, 0, 0, 74222, 8718, 3550, 736, 10268, 4505, 10316, 74090, 5826, + 55232, 5813, 0, 120712, 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, 0, 0, 847, 0, 9529, 0, - 66657, 6980, 0, 120035, 78484, 0, 0, 120033, 78486, 0, 0, 120039, 42683, - 0, 0, 9624, 0, 0, 43190, 65463, 1554, 0, 42611, 42563, 0, 5651, 2929, - 6792, 43201, 0, 19963, 5698, 0, 0, 0, 0, 5644, 10292, 65546, 69821, - 68141, 8372, 0, 65116, 0, 120022, 0, 10388, 42799, 0, 41013, 10568, 0, 0, - 2869, 0, 41015, 194692, 2785, 4366, 0, 10954, 41802, 0, 42608, 78469, - 9884, 4759, 0, 0, 10266, 41359, 1170, 43365, 69810, 73908, 1609, 902, 0, - 63936, 0, 11661, 8122, 5818, 0, 0, 3861, 9540, 11028, 2554, 5158, 5714, - 127015, 0, 0, 807, 43079, 0, 78475, 976, 5511, 64553, 0, 42155, 0, 41356, - 74110, 118801, 0, 0, 8676, 0, 0, 11066, 451, 63941, 5798, 9349, 42018, 0, - 0, 0, 43609, 194703, 120553, 1440, 0, 194701, 120016, 74283, 11005, 0, - 66656, 66044, 0, 194698, 0, 0, 43393, 10094, 0, 11529, 10857, 120643, - 66436, 6546, 93, 8102, 0, 68405, 0, 0, 8171, 0, 119097, 127064, 917543, - 383, 10377, 41656, 0, 0, 0, 5187, 0, 127277, 11286, 68620, 64217, 0, - 5232, 0, 41009, 0, 41005, 0, 0, 0, 8292, 195074, 4980, 8860, 73947, - 10028, 66478, 7076, 13182, 194705, 0, 0, 10631, 66031, 7972, 0, 78785, 0, - 7900, 0, 11309, 78319, 4198, 42725, 0, 67656, 78819, 0, 0, 0, 12931, 0, - 42684, 74285, 2088, 0, 64366, 65156, 8814, 42238, 74771, 0, 0, 12836, 0, - 0, 74342, 8593, 0, 0, 68445, 13255, 0, 0, 7464, 0, 65865, 0, 194650, 0, - 0, 9342, 120464, 0, 64516, 0, 78792, 10129, 41007, 74375, 0, 40995, - 12209, 41012, 119136, 0, 0, 120633, 40992, 0, 0, 68653, 43558, 5522, 0, - 61, 0, 74105, 3633, 0, 65162, 41234, 12089, 78281, 9771, 0, 13251, 0, 0, - 6262, 2784, 42743, 0, 8126, 66483, 0, 0, 441, 42621, 0, 0, 41002, 40999, - 119623, 43266, 0, 0, 10890, 74481, 65834, 8324, 119103, 64417, 74817, 0, - 64737, 0, 0, 8930, 66678, 74249, 1193, 10056, 1800, 13253, 13252, 7829, - 0, 0, 7743, 0, 0, 77904, 0, 77905, 9034, 6039, 0, 10075, 0, 41018, 65683, - 10338, 66469, 0, 0, 0, 42815, 0, 41966, 0, 0, 0, 11792, 43064, 41025, - 911, 7539, 0, 0, 120339, 65159, 64390, 0, 0, 5520, 11662, 0, 65330, - 42812, 0, 0, 12326, 0, 0, 42808, 0, 9348, 64901, 0, 0, 0, 0, 0, 0, - 917584, 43702, 0, 5857, 65342, 0, 119120, 120079, 8644, 0, 0, 0, 74296, - 41909, 0, 120332, 2791, 0, 1891, 69824, 0, 41907, 66647, 0, 8761, 12942, - 5748, 0, 10773, 0, 0, 8796, 78149, 6412, 2061, 8520, 13146, 0, 63931, 0, - 65902, 2882, 0, 0, 12843, 4520, 120345, 0, 0, 0, 0, 73860, 0, 0, 64345, - 0, 0, 0, 194940, 0, 0, 43679, 917585, 65117, 194939, 0, 10427, 0, 3844, - 0, 9755, 1110, 6612, 12222, 0, 194934, 0, 0, 783, 194935, 0, 0, 0, - 194720, 65056, 3620, 0, 68378, 4556, 0, 0, 194933, 74250, 0, 67657, - 10510, 4382, 66482, 0, 0, 0, 9177, 8902, 0, 9839, 0, 12891, 0, 0, 63999, - 2016, 41917, 9788, 63928, 0, 1862, 65800, 9155, 66623, 9786, 65082, - 41919, 8579, 41914, 7981, 0, 0, 4508, 64883, 0, 0, 0, 0, 64592, 74276, - 120080, 6784, 78788, 68181, 0, 0, 0, 127534, 12147, 9024, 66378, 66472, - 0, 64289, 65289, 78151, 66658, 194929, 64509, 78152, 0, 0, 11051, 0, 0, - 11355, 65885, 0, 0, 41214, 0, 12299, 0, 7500, 4506, 7773, 0, 0, 9963, - 68649, 0, 4040, 0, 6167, 0, 63922, 6594, 0, 0, 0, 3624, 43036, 0, 6387, - 63990, 19947, 63988, 41955, 0, 63993, 10440, 9611, 0, 6803, 0, 7738, - 63986, 11446, 63984, 120331, 3435, 78164, 0, 119108, 7029, 64258, 41292, - 118898, 12748, 42742, 9517, 11518, 0, 78790, 0, 194777, 63956, 42458, - 63954, 63953, 63960, 9591, 4516, 10217, 68370, 11469, 0, 42306, 2723, - 118947, 0, 0, 0, 0, 0, 11397, 2880, 0, 0, 2872, 0, 0, 3498, 4378, 917539, - 4270, 0, 65551, 68205, 6633, 43387, 0, 5230, 0, 0, 0, 0, 0, 8161, 393, - 12013, 0, 0, 0, 415, 63964, 63963, 42345, 0, 5183, 1877, 42498, 0, 2927, - 0, 63961, 4472, 0, 0, 78159, 0, 917936, 42340, 4756, 0, 7081, 10730, - 7691, 10331, 63830, 119625, 194945, 42103, 8628, 9813, 0, 42453, 1604, - 9565, 10539, 0, 65764, 41415, 65767, 0, 8457, 42301, 11372, 64873, 11992, + 5806, 42398, 0, 9037, 5671, 120041, 0, 0, 0, 128855, 0, 847, 128242, + 9529, 0, 66657, 6980, 0, 120035, 78484, 0, 0, 120033, 78486, 0, 0, + 120039, 42683, 0, 0, 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, 0, 41013, + 10568, 0, 0, 2869, 0, 41015, 194692, 2785, 4366, 0, 10954, 41802, 0, + 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, 127015, 0, 0, 807, 43079, 0, 78475, 976, 5511, 64553, + 0, 42155, 0, 41356, 74110, 118801, 0, 0, 8676, 0, 0, 11066, 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, 8171, 0, + 119097, 127064, 917543, 383, 7154, 41656, 92634, 0, 0, 5187, 0, 127277, + 11286, 68620, 64217, 0, 5232, 0, 41009, 0, 41005, 0, 0, 0, 8292, 195074, + 4980, 8860, 73947, 10028, 65291, 7076, 13182, 194705, 0, 0, 10631, 66031, + 7972, 0, 78785, 0, 7900, 0, 11309, 78319, 4198, 42725, 0, 67656, 9995, 0, + 92552, 0, 12931, 0, 42684, 74285, 2088, 0, 64366, 65156, 8814, 42238, + 74771, 0, 0, 12836, 0, 0, 74342, 8593, 0, 0, 68445, 13255, 0, 0, 7464, 0, + 65865, 0, 194650, 127144, 0, 9342, 120464, 0, 64516, 0, 78792, 10129, + 41007, 74375, 0, 40995, 12209, 41012, 119136, 0, 0, 69724, 40992, 92264, + 127153, 68653, 43558, 5522, 0, 61, 0, 74105, 3633, 0, 65162, 41234, + 12089, 78281, 9771, 0, 13251, 128701, 0, 6262, 2784, 42743, 0, 8126, + 66483, 0, 0, 441, 42621, 0, 0, 41002, 40999, 119623, 43266, 7108, 194779, + 10890, 74481, 65834, 8324, 119103, 64417, 74817, 127465, 64737, 0, 0, + 8930, 66678, 74249, 1193, 10056, 1800, 13253, 13252, 7829, 0, 0, 7743, 0, + 0, 77904, 92640, 77905, 9034, 6039, 0, 10075, 0, 41018, 65683, 10338, + 66469, 0, 0, 0, 42815, 0, 41966, 0, 0, 0, 11792, 43064, 41025, 911, 7539, + 0, 0, 120339, 65159, 64390, 0, 0, 5520, 11662, 0, 65330, 42812, 0, 0, + 12326, 0, 0, 42808, 128337, 9348, 64901, 0, 0, 0, 0, 0, 0, 917584, 43702, + 0, 5857, 65342, 92727, 119120, 120079, 8644, 0, 0, 0, 74296, 41909, 0, + 120332, 2791, 69663, 1891, 69824, 0, 41907, 66647, 118939, 8761, 12942, + 5748, 0, 10773, 0, 0, 8796, 78149, 6412, 2061, 8520, 13146, 127185, + 63931, 0, 65902, 2882, 0, 0, 12843, 4520, 120345, 92459, 0, 0, 0, 73860, + 0, 0, 64345, 0, 9201, 128314, 194940, 0, 0, 43679, 917585, 65117, 92270, + 0, 10427, 0, 3844, 120675, 9755, 1110, 6612, 12222, 0, 128789, 0, 0, 783, + 194935, 0, 0, 0, 194720, 65056, 3620, 0, 68378, 4556, 0, 0, 194933, + 74250, 0, 67657, 10510, 4382, 66482, 0, 0, 127527, 9177, 8902, 0, 9839, + 0, 12891, 0, 0, 63999, 2016, 41917, 9788, 63928, 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, 0, 64289, 65289, 78151, 66658, + 194929, 64509, 78152, 0, 0, 11051, 0, 0, 11355, 65885, 0, 128310, 41214, + 0, 12299, 0, 7500, 4506, 7773, 0, 0, 9963, 68649, 0, 4040, 120570, 6167, + 0, 63922, 6594, 0, 0, 0, 3624, 43036, 0, 6387, 63990, 19947, 63988, + 41955, 0, 63993, 10440, 9611, 0, 6803, 0, 7738, 63986, 11446, 63984, + 92641, 3435, 78164, 43814, 43810, 7029, 64258, 41292, 118898, 12748, + 42742, 9517, 11518, 0, 78790, 0, 194777, 63956, 42458, 63954, 63953, + 63960, 9591, 4516, 10217, 68370, 11469, 69697, 42306, 2723, 118947, 0, 0, + 0, 0, 0, 11397, 2880, 0, 0, 2872, 0, 0, 3498, 4378, 917539, 4270, 0, + 65551, 68205, 6633, 43387, 0, 5230, 0, 0, 0, 0, 0, 8161, 393, 12013, 0, + 0, 0, 415, 63964, 63963, 42345, 0, 5183, 1877, 42498, 0, 2927, 0, 63961, + 4472, 0, 0, 78159, 69699, 917936, 42340, 4756, 128078, 7081, 10730, 7691, + 10331, 63830, 119625, 194945, 42103, 8628, 9813, 0, 42453, 1604, 9565, + 10539, 69701, 65764, 41415, 65767, 0, 8457, 42301, 11372, 64873, 11992, 0, 0, 63980, 11801, 3622, 0, 64336, 12017, 10463, 63981, 4967, 64189, 1966, 43628, 0, 0, 0, 0, 63971, 4347, 4416, 42098, 11009, 10694, 63973, 402, 0, 13147, 0, 42100, 64646, 13228, 0, 41875, 3515, 74252, 11805, 0, - 11302, 6259, 43395, 0, 0, 194670, 0, 0, 0, 74425, 11299, 1561, 0, 0, - 64942, 0, 194733, 0, 194732, 0, 74301, 0, 11280, 0, 69784, 74060, 0, 0, - 119664, 5145, 12486, 65018, 66516, 5409, 0, 194669, 7402, 5399, 9685, - 74089, 7952, 5401, 0, 66616, 68421, 0, 0, 5405, 917555, 64866, 0, 0, 0, - 78784, 74248, 11330, 194723, 64690, 3254, 0, 0, 0, 42390, 43678, 194725, - 0, 65077, 0, 6388, 3355, 9508, 9867, 5723, 11520, 5611, 0, 3377, 0, 0, 0, - 0, 78228, 0, 0, 42691, 917886, 0, 74767, 0, 0, 1379, 246, 0, 0, 3788, 0, - 11041, 0, 66304, 0, 0, 8917, 42403, 301, 0, 0, 0, 0, 0, 0, 10656, 0, - 65214, 119242, 42567, 0, 13163, 0, 120831, 74597, 3182, 0, 0, 0, 65034, - 65889, 42169, 4755, 74244, 0, 11443, 0, 66319, 74598, 608, 600, 0, 1219, - 3934, 64206, 11483, 74510, 0, 74485, 42442, 65470, 0, 64202, 13160, 7759, - 42482, 485, 0, 0, 9828, 0, 0, 42280, 0, 9351, 7778, 64379, 7496, 42431, - 6916, 1208, 0, 119631, 11002, 42470, 0, 118946, 0, 0, 74041, 0, 0, 43539, - 5411, 42196, 0, 0, 0, 9150, 0, 42393, 13086, 1310, 194687, 9337, 12052, - 10643, 55271, 0, 194684, 2546, 194683, 213, 118852, 65611, 0, 0, 194756, - 74310, 6554, 0, 11914, 0, 0, 0, 0, 0, 0, 194681, 118826, 2713, 0, 9650, - 43330, 0, 194675, 1406, 0, 0, 0, 0, 68223, 4143, 194677, 0, 65748, 4141, - 9682, 65287, 1508, 194963, 8779, 10569, 8725, 13299, 66638, 65750, 42263, + 11302, 6259, 43395, 0, 0, 194670, 0, 92351, 0, 74425, 11299, 1561, 0, + 92359, 64942, 0, 194733, 0, 194732, 0, 74301, 0, 11280, 0, 69784, 74060, + 0, 0, 119664, 5145, 12486, 65018, 66516, 5409, 127379, 194669, 7402, + 5399, 9685, 74089, 7952, 5401, 0, 66616, 68421, 0, 0, 5405, 127875, + 64866, 0, 119583, 128345, 78784, 74248, 11330, 194723, 64690, 3254, 0, 0, + 0, 42390, 43678, 194725, 0, 65077, 0, 6388, 3355, 9508, 9867, 5723, + 11520, 5611, 0, 3377, 0, 0, 0, 0, 78228, 0, 0, 42691, 917886, 127198, + 74767, 0, 127075, 1379, 246, 0, 0, 3788, 0, 11041, 92549, 66304, 0, 0, + 8917, 42403, 301, 0, 0, 0, 0, 0, 0, 10656, 0, 65214, 119242, 42567, + 92217, 13163, 0, 120831, 74597, 3182, 0, 0, 0, 65034, 65889, 42169, 4755, + 74244, 0, 11443, 0, 66319, 74598, 608, 600, 0, 1219, 3934, 64206, 11483, + 74510, 0, 74485, 42442, 65470, 0, 64202, 13160, 7759, 42482, 485, 128006, + 0, 9828, 0, 0, 42280, 0, 9351, 7778, 64379, 7496, 42431, 6916, 1208, 0, + 119631, 11002, 42470, 0, 118946, 0, 0, 74041, 0, 120633, 43539, 5411, + 42196, 0, 0, 0, 9150, 0, 42393, 13086, 1310, 194687, 9337, 12052, 10643, + 55271, 0, 12166, 2546, 194683, 213, 118852, 65611, 0, 0, 194756, 74310, + 6554, 0, 11914, 5452, 0, 0, 0, 0, 0, 194681, 92560, 2713, 0, 9650, 43330, + 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, 0, 12955, 10596, 2888, 0, 0, 0, 9657, - 9019, 194766, 0, 2878, 5390, 0, 194961, 0, 68679, 0, 7501, 6328, 0, + 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, 0, 10632, 11934, 11452, 1332, 0, 0, 0, 0, 118887, 1791, 5191, 9288, 64822, 2892, 0, 43394, 555, 0, 0, 66646, 0, 119002, 13151, 74512, 7289, 74055, 0, 8854, - 64162, 5858, 41927, 10582, 0, 1784, 1361, 195047, 0, 7905, 0, 64868, 0, - 13158, 0, 7211, 0, 9371, 73973, 0, 6828, 1625, 0, 0, 1342, 68440, 64171, - 0, 10903, 0, 0, 0, 0, 0, 4482, 41606, 0, 0, 0, 0, 64381, 0, 0, 0, 42245, - 0, 41972, 0, 444, 0, 9127, 66687, 66619, 0, 78025, 0, 11349, 40991, 0, 0, - 119599, 120830, 0, 1197, 0, 1149, 194970, 0, 0, 40990, 0, 0, 3492, 0, 0, - 0, 0, 0, 12838, 0, 19948, 0, 3099, 0, 0, 41087, 0, 0, 0, 119059, 12036, - 0, 0, 0, 8152, 0, 64428, 12227, 0, 0, 12828, 127511, 0, 0, 120708, 0, 0, - 10386, 119574, 0, 0, 0, 0, 68154, 0, 1743, 0, 0, 0, 65186, 0, 0, 9606, 0, - 0, 0, 0, 0, 0, 0, 0, 194967, 0, 0, 3395, 9362, 10878, 0, 0, 78362, 64830, - 0, 0, 41091, 3426, 1344, 8870, 0, 0, 4735, 0, 6119, 12822, 42699, 0, 0, - 74818, 0, 0, 42637, 41080, 0, 12039, 10559, 0, 118892, 0, 9472, 0, 11929, - 0, 7170, 9596, 6130, 0, 43629, 11579, 194741, 0, 194740, 0, 0, 66699, 0, - 1004, 0, 194737, 43234, 66008, 12627, 0, 68414, 0, 43619, 43382, 11300, - 43304, 9686, 5890, 11776, 7558, 0, 65627, 0, 10718, 13154, 3461, 9139, 0, - 0, 0, 0, 65365, 73877, 65628, 78019, 0, 0, 41708, 12860, 41703, 12069, - 10838, 5403, 10352, 73917, 10061, 43237, 0, 5140, 209, 0, 41704, 41056, - 43078, 0, 0, 0, 10899, 65469, 0, 0, 0, 2410, 993, 0, 120589, 120689, - 78693, 0, 0, 7232, 0, 119253, 0, 0, 74462, 2066, 10489, 42166, 43463, - 10659, 3600, 0, 4224, 1336, 41518, 0, 0, 0, 0, 41139, 64820, 0, 12966, - 41134, 0, 0, 0, 0, 272, 4263, 8793, 0, 0, 41502, 0, 983, 12549, 0, 0, - 1190, 4109, 1335, 841, 5888, 41358, 64863, 9544, 43481, 0, 0, 0, 2099, - 5120, 2409, 7799, 0, 74424, 0, 0, 4731, 0, 66629, 0, 0, 1255, 4149, 9247, - 0, 9913, 0, 0, 64914, 917787, 65101, 0, 11694, 0, 11690, 5835, 0, 66625, + 64162, 5858, 41927, 10582, 0, 1784, 1361, 195047, 0, 7905, 0, 64868, + 128813, 13158, 92166, 7211, 0, 9371, 73973, 0, 6828, 1625, 92302, 0, + 1342, 68440, 64171, 0, 10903, 0, 0, 0, 0, 0, 4482, 41606, 0, 128569, 0, + 0, 64381, 0, 0, 0, 42245, 0, 41972, 0, 444, 0, 9127, 66687, 66619, 0, + 78025, 0, 11349, 40991, 0, 0, 119599, 120830, 0, 1197, 128282, 1149, + 194970, 0, 0, 40990, 0, 0, 3492, 0, 127942, 0, 0, 0, 12838, 0, 19948, 0, + 3099, 0, 0, 41087, 0, 0, 0, 119059, 12036, 41309, 0, 0, 8152, 0, 64428, + 12227, 0, 0, 12828, 127511, 0, 0, 120708, 0, 0, 10386, 119574, 0, 0, + 92680, 0, 68154, 0, 1743, 0, 0, 92239, 65186, 0, 0, 9606, 0, 0, 64439, 0, + 0, 92686, 0, 0, 194967, 0, 0, 3395, 9362, 10878, 0, 0, 78362, 64830, 0, + 0, 41091, 3426, 1344, 8870, 0, 0, 4735, 127017, 6119, 12822, 42699, 0, 0, + 74818, 5396, 0, 42637, 41080, 0, 12039, 10559, 0, 118892, 0, 9472, 0, + 11929, 0, 7170, 9596, 6130, 128826, 43629, 11579, 194741, 0, 194740, + 128691, 92185, 66699, 64440, 1004, 92584, 194737, 43234, 66008, 12627, 0, + 68414, 0, 43619, 43382, 11300, 43304, 9686, 5890, 11776, 7558, 127158, + 65627, 0, 10718, 13154, 3461, 9139, 0, 0, 0, 0, 65365, 73877, 65628, + 78019, 0, 0, 41708, 12860, 2641, 12069, 10838, 5403, 10352, 73917, 10061, + 43237, 0, 5140, 209, 128847, 41704, 41056, 43078, 128125, 118809, 0, + 10899, 65469, 0, 0, 0, 2410, 993, 0, 120589, 120689, 78693, 0, 0, 7232, + 0, 119253, 0, 7110, 74462, 2066, 10489, 42166, 43463, 10659, 3600, 0, + 4224, 1336, 41518, 0, 0, 0, 0, 41139, 64820, 92538, 12966, 41134, 0, 0, + 0, 0, 272, 4263, 8793, 0, 0, 41502, 0, 983, 12549, 0, 0, 1190, 4109, + 1335, 841, 5888, 41358, 64863, 9544, 43481, 0, 0, 0, 2099, 5120, 2409, + 7799, 0, 74424, 0, 0, 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, 0, 0, 0, 10695, 0, 7540, - 0, 881, 7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, 64321, 8359, 0, - 12689, 0, 194594, 0, 0, 0, 68183, 0, 0, 1287, 5436, 0, 0, 74142, 127013, - 74152, 119078, 6051, 10497, 0, 8985, 12109, 0, 0, 0, 0, 0, 3652, 10537, - 0, 1276, 120440, 6549, 279, 73745, 0, 0, 0, 1489, 0, 0, 0, 3899, 1007, - 42124, 0, 42122, 0, 0, 0, 11985, 1345, 78600, 0, 0, 8956, 43083, 119830, - 42138, 78610, 0, 12151, 78608, 78604, 78605, 6285, 78603, 78612, 78613, - 74194, 492, 8685, 0, 0, 0, 78622, 43712, 2582, 11470, 64538, 7444, 78615, - 78616, 41550, 0, 73837, 119823, 2527, 119824, 197, 2799, 0, 41944, - 120276, 9933, 0, 66515, 767, 5524, 7028, 0, 0, 119827, 119817, 119828, - 78633, 10896, 0, 1799, 120497, 6971, 74336, 0, 0, 65340, 118979, 41551, - 2434, 0, 0, 120579, 0, 4631, 0, 0, 6407, 0, 6338, 43214, 0, 7570, 0, - 3192, 0, 8414, 0, 0, 0, 0, 0, 9164, 66612, 0, 3171, 6623, 4961, 68396, - 886, 55216, 8654, 78832, 9993, 74390, 64603, 0, 69241, 9599, 78629, - 43084, 78627, 78628, 78625, 2399, 0, 8994, 10944, 41208, 0, 41168, 8178, - 0, 3367, 195008, 42510, 78641, 78636, 6804, 78634, 1947, 0, 0, 0, 42759, - 11068, 1705, 9331, 0, 74798, 9181, 65359, 0, 8017, 0, 65096, 66720, 0, - 43475, 0, 4909, 12126, 0, 120696, 4904, 0, 195012, 1365, 9253, 42757, - 43436, 7462, 0, 0, 0, 0, 119587, 64415, 0, 0, 5398, 0, 195014, 0, 0, 0, - 119015, 0, 0, 9476, 0, 0, 12763, 0, 3629, 0, 13005, 0, 3628, 0, 0, 0, - 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, 119814, 0, 12276, 0, 68372, 0, 0, 119244, 0, 0, 10467, 0, - 2443, 10918, 78217, 119825, 1001, 9241, 1927, 0, 0, 73987, 0, 0, 0, - 118828, 127504, 65678, 12867, 0, 8260, 77945, 7519, 11505, 12274, 8904, - 518, 65857, 0, 0, 13204, 4387, 857, 0, 65369, 0, 119583, 43125, 120592, - 0, 0, 0, 0, 5136, 1968, 0, 195023, 1337, 64967, 1629, 0, 796, 66506, 0, - 74123, 12877, 0, 42314, 43388, 0, 74403, 6120, 478, 65151, 68128, 0, - 43082, 6016, 0, 42284, 0, 4276, 1206, 3619, 41638, 0, 3843, 12011, 8853, - 3361, 0, 490, 10715, 7578, 68384, 0, 65350, 10530, 12348, 8653, 74314, - 42435, 6154, 9551, 65354, 78522, 784, 42397, 334, 0, 42416, 65356, 65273, - 77987, 127265, 4442, 10364, 0, 778, 41626, 42455, 7989, 74063, 3227, 0, - 127275, 73983, 2915, 11502, 41022, 41702, 10309, 127035, 78320, 0, 6975, - 0, 5415, 12176, 0, 0, 3462, 65215, 42629, 78691, 73784, 0, 0, 9759, 0, - 78324, 127254, 8114, 78698, 78697, 78696, 78695, 8710, 42495, 118956, 0, - 4051, 10460, 43364, 118917, 1356, 12161, 42713, 0, 127268, 1619, 9703, + 0, 9972, 73865, 4519, 6114, 10898, 43072, 0, 0, 128858, 0, 0, 10695, 0, + 7540, 0, 881, 7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, 64321, + 8359, 0, 12689, 0, 194594, 0, 0, 0, 68183, 0, 0, 1287, 5436, 0, 0, 74142, + 92328, 74152, 119078, 6051, 10497, 69668, 8985, 12109, 0, 0, 0, 0, 0, + 3652, 10537, 0, 1276, 120440, 6549, 279, 73745, 0, 0, 0, 1489, 0, 0, 0, + 3899, 1007, 42124, 0, 42122, 92337, 0, 0, 11985, 1345, 78600, 0, 0, 8956, + 43083, 119830, 42138, 78610, 0, 12151, 78608, 78604, 78605, 6285, 78603, + 78612, 78613, 65942, 492, 8685, 0, 0, 0, 78622, 43712, 2582, 11470, + 64538, 7444, 78615, 78616, 41550, 0, 73837, 119823, 2527, 119824, 197, + 2799, 92594, 41944, 120276, 9933, 0, 66515, 767, 5524, 7028, 0, 0, + 119827, 119817, 119828, 78633, 10896, 0, 1799, 120497, 6971, 74336, + 128342, 0, 65340, 118979, 41551, 2434, 0, 0, 120579, 0, 4631, 0, 0, 6407, + 0, 6338, 43214, 0, 7570, 0, 3192, 0, 8414, 0, 0, 0, 0, 0, 9164, 66612, 0, + 3171, 6623, 4961, 68396, 886, 55216, 8654, 78832, 9993, 74390, 64603, 0, + 69241, 9599, 78629, 43084, 78627, 78628, 78625, 2399, 69693, 8994, 10944, + 41208, 0, 41168, 8178, 0, 3367, 92334, 42510, 78641, 78636, 6804, 78634, + 1947, 0, 0, 92681, 42759, 11068, 1705, 9331, 0, 74798, 9181, 65359, 0, + 8017, 0, 65096, 66720, 0, 43475, 0, 4909, 12126, 128673, 120696, 4904, 0, + 69650, 1365, 9253, 42757, 43436, 7462, 0, 0, 0, 0, 119587, 64415, 0, 0, + 5398, 0, 127386, 0, 0, 0, 119015, 0, 0, 9476, 0, 0, 12763, 0, 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, 0, 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, 120592, 0, 0, 0, 0, 5136, + 1968, 0, 195023, 1337, 64967, 1629, 0, 796, 66506, 0, 74123, 12877, 0, + 42314, 43388, 0, 74403, 6120, 478, 65151, 68128, 128147, 43082, 6016, 0, + 42284, 128507, 4276, 1206, 3619, 41638, 69691, 3843, 12011, 8853, 3361, + 0, 490, 10715, 7578, 68384, 0, 65350, 10530, 12348, 8653, 74314, 42435, + 6154, 9551, 65354, 78522, 784, 42397, 334, 0, 42416, 65356, 65273, 77987, + 69666, 4442, 10364, 0, 778, 41626, 42455, 7989, 74063, 3227, 0, 127275, + 73983, 2915, 11502, 41022, 41702, 10309, 127035, 78320, 0, 6975, 0, 5415, + 12176, 0, 74193, 3462, 65215, 42629, 78691, 73784, 0, 0, 9759, 0, 78324, + 127254, 8114, 78698, 78697, 78696, 78695, 8710, 42495, 118956, 0, 4051, + 10460, 43364, 118917, 1356, 12161, 42713, 128857, 127268, 1619, 9703, 43152, 42489, 42112, 0, 1875, 10808, 42109, 120284, 41860, 64862, 13305, - 64907, 5289, 13144, 0, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 0, 0, - 43236, 3382, 42449, 6498, 1658, 11936, 78232, 0, 11269, 10151, 73759, + 64907, 5289, 13144, 128658, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 0, + 0, 43236, 3382, 42449, 6498, 1658, 11936, 78232, 0, 11269, 10151, 73759, 43100, 74449, 65508, 0, 0, 0, 8935, 917985, 0, 0, 0, 616, 74753, 65178, 4684, 78701, 119653, 0, 0, 0, 6048, 74460, 42110, 73965, 10870, 8557, 11054, 68664, 119049, 9681, 4475, 0, 41142, 2100, 0, 120731, 6035, 0, - 7651, 10296, 0, 0, 0, 917987, 0, 118966, 74144, 40997, 0, 10392, 10328, - 40998, 43462, 74488, 0, 9800, 8979, 0, 119131, 41000, 0, 119239, 6487, - 10977, 0, 10344, 0, 65299, 5394, 43246, 78243, 10220, 66505, 41200, 0, - 4425, 0, 0, 0, 43074, 73799, 0, 78147, 0, 12173, 78545, 0, 0, 65338, 0, - 0, 119582, 4474, 0, 43093, 0, 1587, 0, 127372, 64475, 0, 1369, 0, 78251, - 7927, 0, 4560, 0, 0, 0, 0, 64948, 4430, 74347, 42601, 4514, 66434, 0, - 8194, 65462, 10626, 10965, 0, 8893, 0, 12542, 0, 65341, 0, 65829, 7925, - 119822, 10475, 0, 0, 1352, 11069, 7707, 127560, 0, 65279, 127102, 68207, - 127100, 65605, 6040, 127097, 10071, 0, 9336, 0, 0, 8899, 7798, 64474, - 64259, 0, 65188, 7820, 43018, 0, 0, 7746, 1492, 78551, 10884, 77982, 0, - 5127, 11285, 42501, 5495, 4273, 43095, 41426, 10849, 5730, 2999, 6342, - 68636, 74304, 371, 64373, 6023, 169, 5497, 11708, 0, 0, 6323, 0, 8224, 0, - 8938, 6043, 12738, 0, 0, 5321, 0, 0, 0, 2589, 74332, 1689, 7802, 4683, - 74318, 42704, 120296, 11905, 0, 0, 0, 0, 74513, 6049, 0, 4027, 834, - 118962, 1803, 0, 1503, 0, 0, 0, 5731, 1381, 2387, 0, 0, 8289, 64525, - 65817, 2881, 43142, 0, 9601, 2879, 9668, 9766, 0, 5729, 917833, 74410, - 6036, 64881, 4026, 9361, 127091, 2887, 0, 3526, 6298, 0, 77897, 0, 78519, - 0, 8572, 6021, 77896, 0, 77895, 43155, 0, 0, 3146, 10959, 9483, 0, 77893, - 10981, 166, 917841, 8635, 0, 10623, 408, 119058, 127507, 13298, 0, 7426, - 41641, 12717, 0, 7607, 10639, 66713, 0, 0, 41643, 74134, 0, 8713, 41640, - 10221, 41645, 66712, 6645, 646, 66726, 66711, 42129, 0, 77901, 3472, - 8697, 0, 0, 0, 0, 0, 0, 5809, 1950, 119356, 0, 74572, 0, 42136, 0, 0, 0, - 0, 3247, 119854, 65017, 0, 68428, 66668, 0, 0, 10983, 0, 0, 0, 41567, 0, - 0, 0, 194624, 0, 0, 0, 8285, 0, 4509, 0, 66471, 12216, 0, 40988, 0, 0, - 41727, 0, 0, 2396, 0, 0, 74018, 917538, 64940, 0, 3886, 0, 42457, 119008, - 0, 996, 68123, 917571, 4249, 0, 917594, 11707, 8222, 0, 7939, 0, 917574, - 917582, 917592, 917569, 8534, 0, 40983, 0, 0, 0, 7201, 12561, 0, 42371, - 12558, 0, 0, 10052, 40982, 0, 0, 1488, 0, 0, 0, 917559, 0, 0, 1563, 0, - 9619, 0, 0, 0, 0, 0, 5803, 7797, 6070, 10006, 0, 2922, 6082, 0, 65009, 0, - 12567, 0, 0, 41412, 0, 0, 3607, 65863, 10046, 9612, 42153, 8218, 9485, 0, - 2032, 78354, 0, 0, 0, 0, 0, 43085, 6057, 508, 0, 0, 120265, 0, 0, 0, 0, - 638, 6083, 119072, 0, 0, 2305, 78348, 0, 0, 6056, 6659, 0, 0, 6085, 0, 0, - 3915, 41634, 0, 41639, 63912, 11941, 0, 4028, 1787, 42180, 43096, 0, - 3249, 1768, 0, 12328, 501, 127074, 10601, 0, 583, 0, 41977, 0, 66004, - 119350, 6505, 74010, 0, 13064, 55267, 120810, 6500, 5526, 65049, 0, - 73764, 0, 0, 12745, 9678, 0, 120587, 9869, 0, 1771, 0, 8936, 0, 0, 4208, - 78341, 119115, 78342, 0, 0, 74101, 0, 11762, 0, 0, 77997, 0, 66475, 0, - 5027, 0, 0, 0, 5069, 73862, 5028, 9897, 0, 73739, 5026, 0, 68639, 6331, - 0, 8931, 0, 1415, 8866, 41901, 74790, 78138, 119361, 0, 43106, 5029, - 65309, 1580, 3598, 68424, 41070, 77903, 0, 3440, 78215, 1562, 0, 127236, - 119358, 1716, 0, 10600, 0, 620, 41001, 6028, 0, 42892, 0, 74822, 5024, - 120829, 41003, 0, 5025, 0, 0, 0, 119328, 0, 65557, 0, 74541, 0, 11599, 0, - 11602, 6243, 11574, 11581, 11597, 11598, 6253, 6105, 11584, 74195, 11569, - 65275, 8906, 127096, 5755, 2636, 0, 10815, 11619, 78717, 41540, 7815, - 11616, 6979, 12080, 7721, 11604, 7869, 1592, 0, 42152, 78498, 41048, 0, - 829, 0, 0, 19950, 0, 0, 6616, 0, 118875, 10953, 391, 0, 69785, 482, - 42296, 11588, 0, 43606, 0, 68397, 66370, 0, 42335, 0, 0, 0, 7538, 5315, - 0, 42491, 0, 42061, 0, 4576, 0, 68417, 120241, 4277, 0, 4039, 64472, - 42338, 368, 42058, 3960, 11043, 11337, 78209, 917820, 63989, 3958, 12132, - 1849, 0, 9921, 42451, 4253, 41147, 42064, 11959, 42404, 41160, 0, 3618, - 78338, 0, 43300, 5156, 0, 0, 929, 6827, 42035, 42437, 1555, 0, 8691, - 66435, 0, 41662, 0, 0, 0, 0, 0, 4578, 64513, 41664, 0, 42578, 0, 41661, - 78715, 43305, 9356, 0, 0, 0, 1286, 10166, 0, 0, 64707, 0, 42476, 7730, 0, - 0, 42483, 0, 0, 42324, 42291, 10020, 43359, 0, 6641, 525, 41627, 0, 8763, - 0, 41628, 533, 11931, 65225, 8321, 42504, 42581, 0, 6915, 42310, 4377, - 8559, 0, 120234, 0, 13193, 64350, 11666, 8679, 41924, 1576, 7735, 0, 0, - 73840, 0, 11374, 78043, 10889, 43461, 7757, 42462, 120226, 10029, 66493, - 2718, 4168, 73842, 13308, 120112, 0, 1179, 4440, 0, 77948, 363, 11015, - 77947, 77944, 64296, 127090, 66692, 120826, 0, 66492, 6593, 64625, 41963, - 0, 119329, 0, 10013, 0, 0, 127095, 9492, 11782, 64382, 12833, 118986, 0, - 1297, 41630, 630, 127094, 0, 120774, 120570, 1043, 43652, 66223, 10090, - 0, 0, 313, 917563, 41881, 0, 42311, 7445, 0, 5750, 10759, 9419, 55222, - 9405, 11268, 0, 9398, 8526, 9399, 9422, 0, 66495, 0, 0, 127239, 41718, - 10707, 1603, 0, 119003, 0, 631, 77952, 77953, 13161, 65272, 0, 10546, - 74210, 78101, 11600, 77961, 2797, 73821, 42427, 306, 714, 3058, 42381, - 77962, 127080, 12351, 42395, 0, 11607, 0, 42282, 77971, 77967, 9157, - 73765, 66364, 42433, 77964, 7603, 12803, 180, 42141, 0, 120612, 66494, - 12674, 8244, 362, 0, 0, 8037, 917803, 11535, 0, 74845, 5185, 66696, 5521, - 10334, 2093, 77983, 10302, 0, 10104, 1027, 5181, 0, 0, 10523, 1446, - 42320, 41646, 991, 5189, 42472, 41647, 120105, 1722, 5581, 77979, 3405, - 0, 194644, 5523, 0, 42620, 0, 0, 9549, 0, 10549, 55282, 9661, 43682, 0, - 77910, 120026, 78708, 0, 77911, 0, 41991, 0, 0, 7630, 9846, 7684, 10350, - 0, 1174, 77981, 42733, 77978, 77980, 66485, 77977, 42277, 77974, 42456, - 65667, 0, 12330, 0, 0, 42417, 42383, 0, 41344, 6293, 0, 66252, 77984, - 74443, 0, 10209, 8313, 4195, 74435, 1316, 66690, 120032, 6332, 64894, 0, - 65871, 78060, 1736, 0, 3901, 12228, 120151, 65200, 3383, 10446, 78841, - 693, 9130, 314, 64149, 42420, 11949, 0, 120152, 11026, 0, 5332, 6940, - 64154, 12635, 127007, 42706, 1751, 273, 8165, 13166, 120763, 78840, 0, - 12824, 0, 4528, 5320, 6301, 43662, 6133, 9339, 9463, 42346, 10922, 64560, - 3757, 0, 0, 0, 65869, 73760, 2569, 0, 2326, 65740, 2565, 42459, 7596, - 7921, 0, 74095, 0, 41848, 2567, 66006, 0, 4044, 0, 0, 12233, 0, 1023, - 474, 0, 119818, 0, 0, 42487, 65556, 0, 0, 42295, 0, 0, 0, 0, 9835, 66499, - 0, 5417, 12275, 10895, 0, 274, 0, 1858, 0, 0, 55251, 10118, 3133, 0, - 73795, 0, 9610, 8068, 8197, 0, 699, 0, 41665, 5868, 0, 0, 42182, 7581, - 19940, 43668, 41667, 0, 0, 1923, 65583, 65802, 0, 64597, 43444, 119184, - 0, 0, 6464, 7036, 2996, 1937, 0, 0, 41835, 4047, 41842, 0, 64107, 0, 0, - 11017, 0, 0, 293, 77966, 0, 64791, 41827, 42466, 43422, 10579, 8560, 0, - 65413, 77963, 4803, 12964, 1739, 1941, 3900, 0, 1713, 77969, 0, 73957, - 11407, 42441, 41971, 6297, 120098, 64105, 0, 42481, 11716, 66473, 7179, - 42289, 0, 64103, 969, 0, 9352, 0, 6165, 64100, 0, 6632, 73861, 42402, - 74327, 7806, 0, 8914, 0, 0, 3183, 1435, 64876, 2969, 6046, 0, 6208, - 67849, 5746, 73749, 0, 64416, 42422, 0, 0, 7082, 73775, 338, 5059, - 194719, 0, 42328, 10767, 0, 8115, 0, 0, 0, 8227, 2073, 1218, 0, 0, 65848, - 0, 0, 0, 0, 126987, 4486, 0, 0, 0, 10925, 0, 0, 0, 0, 42309, 10257, 0, - 10273, 0, 10305, 42461, 0, 42349, 8832, 78051, 64127, 10644, 42662, - 78828, 42278, 74451, 126988, 917857, 7794, 0, 42429, 6377, 42316, 119026, - 3669, 3968, 42468, 0, 78544, 0, 65402, 119581, 0, 0, 64933, 0, 41960, - 6699, 0, 0, 0, 6823, 42391, 1588, 65400, 8409, 78223, 19967, 65398, 787, - 0, 917939, 0, 6115, 2078, 41654, 42480, 0, 0, 41655, 65401, 43975, 0, 0, - 0, 644, 65500, 41657, 10778, 3659, 9533, 184, 1553, 13107, 65484, 0, - 10502, 74457, 0, 0, 41554, 0, 8220, 917943, 41557, 0, 0, 11070, 119221, - 5157, 4020, 73858, 41555, 9514, 64818, 65103, 64641, 64303, 78131, 7520, - 0, 74377, 11029, 66651, 0, 0, 118930, 64527, 0, 7877, 73803, 0, 0, - 120096, 74602, 9955, 0, 4055, 42817, 0, 65212, 11715, 12190, 12319, - 78630, 0, 78631, 9502, 65427, 0, 65424, 12607, 0, 9734, 65425, 0, 0, 0, - 78835, 0, 10112, 10827, 0, 9866, 74527, 66675, 0, 8625, 64346, 11290, - 10477, 0, 8636, 0, 8315, 65444, 0, 0, 74595, 6152, 0, 0, 6629, 0, 120171, - 0, 74589, 43993, 0, 69790, 0, 0, 43690, 11046, 11490, 42730, 4485, 0, 0, - 64926, 0, 0, 0, 5869, 12437, 42728, 0, 7040, 3588, 0, 12825, 0, 0, 12725, - 0, 0, 78642, 223, 0, 69806, 120166, 42444, 0, 64499, 65245, 0, 1171, 0, - 120165, 0, 1805, 8772, 0, 0, 9930, 65247, 78619, 120111, 2338, 0, 118853, - 0, 42676, 0, 64800, 65236, 67644, 68126, 1213, 0, 64075, 797, 64074, - 8734, 4212, 0, 64387, 4115, 0, 5005, 64070, 64073, 10679, 0, 77954, 0, - 64276, 426, 0, 0, 8251, 10136, 65436, 0, 65088, 43302, 1224, 0, 65576, - 120158, 10701, 1764, 3101, 0, 65291, 120159, 0, 11373, 6378, 0, 120103, - 8663, 9312, 41644, 4539, 3787, 0, 9222, 0, 0, 4259, 9092, 74567, 41961, - 0, 12724, 66357, 42331, 64935, 0, 0, 1293, 7947, 12003, 0, 74593, 120308, - 2454, 42717, 3613, 0, 0, 0, 65888, 8816, 10978, 10840, 0, 10668, 0, - 43087, 12595, 120304, 0, 118806, 0, 1157, 64903, 8638, 0, 0, 0, 0, - 120319, 8235, 120316, 4405, 10086, 120247, 0, 69216, 0, 65430, 74013, - 6079, 6817, 10764, 0, 64291, 0, 998, 120312, 11062, 1317, 64327, 1558, 0, - 1991, 7882, 42254, 0, 41700, 530, 0, 10428, 119335, 12002, 119336, 5742, - 43076, 4692, 64630, 41823, 4007, 5004, 119334, 7896, 751, 6595, 6596, 0, - 66373, 0, 0, 64908, 0, 6311, 0, 12004, 119192, 12049, 43108, 0, 0, 41705, - 0, 6598, 0, 6599, 0, 0, 42148, 118825, 66027, 0, 6597, 9412, 8340, 11824, - 64745, 0, 0, 0, 1988, 5407, 67865, 2430, 41678, 0, 120243, 2336, 0, 0, - 78871, 120442, 0, 1921, 10947, 19927, 0, 65406, 0, 19913, 4284, 13217, 0, - 0, 12841, 9229, 10956, 42285, 41674, 19964, 41679, 65084, 3521, 0, 5774, - 8325, 0, 65403, 0, 1854, 10794, 0, 67660, 0, 0, 78359, 5280, 0, 4344, - 12905, 65433, 6076, 64793, 41610, 768, 12074, 442, 0, 68162, 64081, - 12934, 41682, 65432, 41693, 0, 6071, 65434, 0, 4804, 4053, 0, 0, 194653, - 41696, 467, 69823, 0, 69797, 0, 0, 8421, 0, 0, 43705, 502, 0, 65431, - 119056, 0, 12043, 1303, 316, 0, 2029, 65191, 119246, 11533, 64365, 43480, - 0, 4860, 194645, 0, 42488, 0, 9583, 0, 5546, 8019, 73856, 0, 0, 0, 5544, - 2355, 12150, 65725, 5543, 77989, 63751, 12137, 5548, 77985, 0, 65727, - 68388, 65726, 6077, 0, 65452, 0, 11301, 78013, 78008, 78010, 9874, 78007, - 0, 0, 3050, 65410, 0, 0, 78016, 78017, 42830, 43996, 66716, 0, 4691, 0, - 9345, 621, 0, 0, 0, 65411, 0, 41182, 73881, 65408, 73899, 78024, 9474, + 7651, 10296, 64443, 0, 0, 917987, 0, 118966, 74144, 40997, 0, 10392, + 10328, 40998, 43462, 74488, 0, 9800, 8979, 0, 119131, 41000, 0, 119239, + 6487, 3386, 0, 10344, 0, 65299, 5394, 43246, 78243, 10220, 66505, 41200, + 128583, 4425, 0, 0, 0, 43074, 73799, 0, 78147, 0, 12173, 78545, 0, 0, + 65338, 0, 0, 119582, 4474, 0, 43093, 0, 1587, 0, 127372, 64475, 128098, + 1369, 0, 9959, 7927, 0, 4560, 0, 0, 92277, 0, 64948, 4430, 74347, 42601, + 4514, 66434, 0, 8194, 65462, 10626, 10965, 0, 8893, 0, 12542, 0, 65341, + 0, 65829, 7925, 119822, 10475, 0, 0, 1352, 11069, 7707, 127560, 0, 65279, + 127102, 68207, 127100, 65605, 6040, 127097, 10071, 0, 9336, 128824, 0, + 8899, 7798, 64474, 64259, 0, 65188, 7820, 43018, 0, 0, 7746, 1492, 78551, + 10884, 77982, 0, 5127, 11285, 42501, 5495, 4273, 43095, 41426, 10849, + 5730, 2999, 6342, 68636, 74304, 371, 64373, 6023, 169, 5497, 11708, 0, 0, + 6323, 194684, 8224, 0, 8938, 6043, 12738, 0, 0, 5321, 0, 194798, 0, 2589, + 74332, 1689, 7802, 4683, 74318, 42704, 120296, 11905, 0, 0, 128516, + 128163, 74513, 6049, 0, 4027, 834, 118962, 1803, 0, 1503, 0, 0, 0, 5731, + 1381, 2387, 0, 0, 8289, 64525, 65817, 2881, 43142, 0, 9601, 2879, 9668, + 9766, 0, 5729, 917833, 74410, 6036, 64881, 4026, 9361, 127091, 2887, 0, + 3526, 6298, 0, 77897, 120095, 78519, 0, 8572, 6021, 77896, 128288, 77895, + 43155, 0, 119849, 3146, 10959, 9483, 0, 77893, 10981, 166, 917841, 8635, + 0, 10623, 408, 119058, 127507, 13298, 0, 7426, 41641, 12717, 0, 7607, + 10639, 66713, 0, 0, 41643, 74134, 0, 8713, 41640, 10221, 41645, 66712, + 6645, 646, 66726, 66711, 42129, 0, 77901, 3472, 8697, 0, 0, 0, 0, 0, 0, + 5809, 1950, 119356, 92432, 74572, 0, 42136, 0, 0, 0, 0, 3247, 119854, + 65017, 0, 68428, 66668, 0, 0, 10983, 0, 0, 0, 41567, 0, 0, 0, 194624, 0, + 0, 0, 8285, 0, 4509, 0, 66471, 12216, 0, 40988, 92592, 0, 41727, 0, + 42848, 2396, 917766, 0, 74018, 917538, 64940, 7027, 3886, 0, 42457, + 119008, 0, 996, 68123, 917571, 4249, 0, 917594, 11707, 8222, 0, 7939, + 92454, 92460, 127801, 917592, 128359, 8534, 127154, 40983, 0, 0, 0, 7201, + 12561, 0, 42371, 12558, 0, 917549, 10052, 40982, 0, 0, 1488, 0, 0, 0, + 917559, 0, 0, 1563, 128034, 9619, 0, 0, 0, 127872, 0, 5803, 7797, 6070, + 10006, 0, 2922, 6082, 0, 65009, 0, 12567, 128703, 0, 41412, 0, 0, 3607, + 9200, 10046, 9612, 42153, 8218, 9485, 0, 2032, 78354, 0, 0, 0, 0, 0, + 43085, 6057, 508, 128585, 128015, 120265, 0, 92405, 0, 0, 638, 6083, + 119072, 0, 0, 2305, 78348, 0, 0, 6056, 6659, 0, 0, 6085, 0, 0, 3915, + 41634, 0, 41639, 63912, 11941, 0, 4028, 1787, 42180, 43096, 92690, 3249, + 1768, 0, 12328, 501, 127074, 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, 119115, 78342, 0, 0, 74101, 0, 11762, 0, 92422, 77997, 128788, + 66475, 0, 5027, 78172, 128878, 0, 5069, 73862, 5028, 9897, 0, 73739, + 5026, 0, 68639, 6331, 10079, 8931, 0, 1415, 8866, 41901, 74790, 78138, + 119361, 0, 43106, 5029, 65309, 1580, 3598, 68424, 41070, 77903, 0, 3440, + 78215, 1562, 128656, 127175, 119358, 1716, 0, 10600, 917867, 620, 41001, + 6028, 0, 42892, 0, 74822, 5024, 120829, 41003, 0, 5025, 128269, 0, 0, + 119328, 0, 65557, 0, 74541, 0, 11599, 128209, 11602, 6243, 11574, 11581, + 11597, 11598, 6253, 6105, 11584, 74195, 11569, 65275, 8906, 127096, 5755, + 2636, 0, 10815, 11619, 78717, 41540, 7815, 11616, 6979, 12080, 7721, + 11604, 7869, 1592, 0, 42152, 78498, 41048, 0, 829, 0, 92406, 19950, 0, + 128217, 6616, 0, 118875, 10953, 391, 0, 69785, 482, 42296, 11588, 0, + 43606, 0, 68397, 66370, 74506, 42335, 0, 0, 0, 7538, 5315, 120644, 42491, + 0, 42061, 128088, 4576, 0, 68417, 43809, 4277, 0, 4039, 64472, 42338, + 368, 42058, 3960, 11043, 11337, 78209, 917820, 63989, 3958, 12132, 1849, + 0, 9921, 42451, 4253, 41147, 42064, 11959, 42404, 41160, 0, 3618, 78338, + 0, 43300, 5156, 92629, 0, 929, 6827, 42035, 42437, 1555, 0, 8691, 66435, + 0, 41662, 0, 0, 0, 0, 0, 4578, 64513, 41664, 0, 42578, 128794, 41661, + 78715, 43267, 9356, 0, 0, 0, 1286, 10166, 0, 0, 64707, 0, 42476, 7730, 0, + 128522, 42483, 0, 0, 42324, 42291, 10020, 43359, 0, 6641, 525, 41627, + 917923, 8763, 128304, 41628, 533, 11931, 65225, 8321, 42504, 42581, 0, + 6915, 42310, 4377, 8559, 0, 120234, 0, 13193, 64350, 11666, 8679, 41924, + 1576, 7735, 92398, 0, 73840, 0, 11374, 78043, 10889, 43461, 7757, 42462, + 120226, 10029, 66493, 2718, 4168, 73842, 13308, 120112, 0, 1179, 4440, 0, + 77948, 363, 11015, 77947, 77944, 64296, 127090, 66692, 120826, 0, 66492, + 6593, 64625, 41963, 92177, 119329, 0, 10013, 64434, 92520, 127095, 9492, + 11782, 64382, 12833, 77830, 0, 1297, 41630, 630, 127094, 0, 120774, + 92465, 1043, 43652, 66223, 10090, 0, 128664, 313, 917563, 41881, 0, + 42311, 7445, 0, 5750, 10759, 9419, 55222, 9405, 11268, 42919, 9398, 8526, + 9399, 9422, 0, 66495, 0, 0, 127239, 41718, 10707, 1603, 0, 119003, 0, + 631, 77952, 69703, 13161, 65272, 0, 10546, 74210, 78101, 11600, 77961, + 2797, 73821, 42427, 306, 714, 3058, 42381, 77962, 127080, 12351, 42395, + 0, 11607, 0, 42282, 77971, 77967, 9157, 73765, 66364, 42433, 77964, 7603, + 12803, 180, 42141, 0, 120612, 66494, 12674, 8244, 362, 92439, 0, 8037, + 43777, 11535, 0, 74845, 5185, 7165, 5521, 10334, 2093, 77983, 10302, + 128112, 10104, 1027, 5181, 0, 0, 10523, 1446, 42320, 41646, 991, 5189, + 42472, 41647, 120105, 1722, 5581, 77979, 3405, 0, 194644, 5523, 0, 42620, + 92447, 0, 9549, 0, 10549, 55282, 9661, 43682, 0, 77910, 120026, 78708, 0, + 77911, 0, 41991, 0, 0, 7630, 9846, 7684, 10350, 0, 1174, 77981, 42733, + 77978, 77980, 66485, 77977, 42277, 77974, 42456, 65667, 127037, 12330, + 128272, 0, 42417, 42383, 0, 41344, 6293, 0, 66252, 77984, 74443, 0, + 10209, 8313, 4195, 74435, 1316, 66690, 120032, 6332, 64894, 0, 65871, + 78060, 1736, 0, 3901, 12228, 120151, 65200, 3383, 10446, 78841, 693, + 9130, 314, 64149, 42420, 11949, 0, 120152, 11026, 0, 5332, 6940, 64154, + 12635, 127007, 42706, 1751, 273, 8165, 13166, 120763, 78840, 0, 12824, 0, + 4528, 5320, 6301, 43662, 6133, 9339, 9463, 42346, 10922, 64560, 3757, 0, + 0, 0, 65869, 73760, 2569, 0, 2326, 65740, 2565, 42459, 7596, 7921, 0, + 74095, 127981, 41848, 2567, 66006, 0, 4044, 92646, 0, 12233, 0, 1023, + 474, 0, 119818, 0, 0, 42487, 65556, 0, 0, 42295, 0, 0, 0, 92518, 9835, + 66499, 0, 5417, 12275, 10895, 0, 274, 0, 1858, 0, 0, 55251, 10118, 3133, + 128008, 73795, 0, 9610, 8068, 8197, 0, 699, 0, 41665, 5868, 0, 92695, + 42182, 7581, 19940, 43668, 41667, 128057, 0, 1923, 65583, 65802, 0, + 64597, 43444, 119184, 92197, 0, 6464, 7036, 2996, 1937, 0, 0, 41835, + 4047, 41842, 0, 64107, 0, 0, 11017, 0, 0, 293, 77966, 92169, 64791, + 41827, 42466, 43422, 10579, 8560, 0, 65413, 77963, 4803, 12964, 1739, + 1941, 3900, 0, 1713, 77969, 0, 73957, 11407, 42441, 41971, 6297, 120098, + 64105, 128080, 42481, 11716, 66473, 7179, 42289, 0, 64103, 969, 0, 9352, + 0, 6165, 64100, 0, 6632, 73861, 42402, 74327, 7806, 0, 8914, 0, 0, 3183, + 1435, 64876, 2969, 6046, 64441, 6208, 67849, 5746, 73749, 0, 64416, + 42422, 0, 0, 7082, 73775, 338, 5059, 194719, 0, 42328, 10767, 0, 8115, 0, + 74758, 0, 8227, 2073, 1218, 0, 0, 65848, 0, 0, 0, 0, 126987, 4486, 0, 0, + 0, 10925, 0, 0, 0, 0, 42309, 10257, 65191, 10273, 0, 10305, 42461, 0, + 42349, 8832, 78051, 64127, 10644, 42662, 78828, 42278, 74451, 126988, + 917857, 7794, 0, 42429, 6377, 42316, 119026, 3669, 3968, 42468, 0, 69658, + 0, 65402, 119581, 0, 0, 64933, 0, 41960, 6699, 0, 0, 128354, 6823, 42391, + 1588, 65400, 8409, 78223, 19967, 65398, 787, 0, 917939, 127744, 6115, + 2078, 41654, 42480, 0, 92650, 41655, 65401, 43975, 0, 0, 0, 644, 65500, + 41657, 10778, 3659, 9533, 184, 1553, 13107, 65484, 69648, 10502, 74457, + 0, 0, 41554, 0, 8220, 917943, 41557, 0, 0, 11070, 119221, 5157, 4020, + 73858, 41555, 9514, 64818, 65103, 64641, 64303, 78131, 7520, 0, 74377, + 11029, 66651, 0, 0, 118930, 64527, 0, 7877, 73803, 0, 127348, 120096, + 74602, 9955, 119557, 4055, 42817, 0, 65212, 11715, 12190, 12319, 78630, + 0, 78631, 9502, 65427, 0, 65424, 12607, 0, 9734, 65425, 0, 0, 127357, + 78835, 92410, 10112, 10827, 0, 9866, 74527, 66675, 0, 8625, 64346, 11290, + 10477, 0, 8636, 0, 8315, 65444, 0, 0, 74595, 6152, 0, 0, 6629, 128251, + 120171, 0, 74589, 43993, 0, 69790, 64435, 0, 43690, 11046, 11490, 42730, + 4485, 127107, 0, 64926, 0, 0, 0, 5869, 12437, 42728, 0, 7040, 3588, 0, + 12825, 0, 0, 12725, 0, 0, 78642, 223, 0, 69675, 120166, 42444, 0, 64499, + 65245, 0, 1171, 0, 69717, 0, 1805, 8772, 43820, 0, 9930, 65247, 78619, + 120111, 2338, 0, 118853, 0, 42676, 0, 64800, 65236, 67644, 68126, 1213, + 0, 64075, 797, 64074, 8734, 4212, 0, 64387, 4115, 0, 5005, 64070, 64073, + 10679, 0, 77954, 9402, 64276, 426, 0, 0, 8251, 10136, 65436, 0, 2120, + 43302, 1224, 0, 65576, 120158, 10701, 1764, 3101, 127815, 12858, 120159, + 0, 11373, 6378, 127859, 120103, 8663, 9312, 41644, 4539, 2129, 0, 9222, + 0, 0, 4259, 9092, 74567, 41961, 0, 12724, 66357, 42331, 64935, 0, 0, + 1293, 7947, 2132, 0, 74593, 120308, 2454, 42717, 3613, 128837, 0, 0, + 65888, 8816, 10978, 10840, 0, 10668, 0, 43087, 12595, 120304, 0, 8822, 0, + 1157, 64903, 8638, 0, 0, 0, 0, 120319, 8235, 120316, 4405, 10086, 120247, + 0, 69216, 0, 65430, 74013, 6079, 6817, 10764, 127910, 64291, 128051, 998, + 120312, 11062, 1317, 64327, 1558, 0, 1991, 7882, 42254, 0, 41700, 530, 0, + 10428, 119335, 12002, 119336, 5742, 43076, 4692, 64630, 41823, 4007, + 5004, 119334, 7896, 751, 6595, 6596, 0, 66373, 0, 0, 64908, 92691, 6311, + 0, 12004, 119192, 12049, 43108, 120326, 0, 41705, 92188, 6598, 0, 6599, + 120334, 0, 42148, 118825, 66027, 0, 6597, 9412, 8340, 11824, 64745, 0, 0, + 0, 1988, 5407, 67865, 2430, 41678, 0, 120243, 2336, 0, 0, 78871, 120442, + 0, 1921, 10947, 19927, 0, 65406, 0, 19913, 4284, 13217, 0, 43789, 12841, + 9229, 10956, 42285, 41674, 19964, 41679, 65084, 3521, 0, 5774, 8325, 0, + 65403, 0, 1854, 10794, 0, 67660, 0, 0, 78359, 5280, 0, 4344, 12905, + 65433, 6076, 64793, 41610, 768, 12074, 442, 0, 68162, 64081, 12934, + 41682, 65432, 41693, 0, 6071, 65434, 127467, 4804, 4053, 0, 127469, + 194653, 41696, 467, 69823, 127463, 69797, 0, 0, 8421, 127472, 69682, + 43705, 502, 0, 65431, 119056, 0, 12043, 1303, 316, 92462, 2029, 2136, + 119246, 11533, 64365, 43480, 92639, 4860, 194645, 127877, 42488, 0, 9583, + 128849, 5546, 8019, 73856, 0, 0, 0, 5544, 2355, 12150, 65725, 5543, + 77989, 63751, 12137, 5548, 77985, 0, 65727, 68388, 65726, 6077, 128352, + 65452, 0, 11301, 78013, 78008, 78010, 9874, 78007, 0, 1319, 3050, 65410, + 0, 0, 78016, 78017, 42830, 43996, 66716, 128137, 4691, 92242, 9345, 621, + 92709, 128222, 0, 65411, 0, 41182, 73881, 65408, 73899, 78024, 9474, 10545, 119118, 10887, 3786, 65409, 8894, 43179, 119611, 7923, 3716, - 119341, 9996, 8508, 0, 7012, 8195, 0, 9566, 0, 3722, 0, 41707, 8493, 545, - 9575, 41379, 10050, 12718, 0, 8859, 6820, 74345, 65110, 120740, 0, 0, - 9119, 2787, 7920, 118823, 4021, 2012, 7985, 0, 119663, 0, 0, 78021, + 92363, 9996, 8508, 0, 7012, 8195, 127834, 9566, 0, 3722, 0, 41707, 8493, + 545, 9575, 41379, 10050, 12718, 0, 8859, 6820, 74345, 65110, 120740, 0, + 0, 9119, 2787, 7920, 118823, 4021, 2012, 7985, 0, 119663, 0, 0, 78021, 78022, 410, 78020, 1802, 78018, 74107, 0, 41659, 41671, 1827, 0, 64396, 10126, 12116, 41673, 120370, 11422, 78141, 120373, 3860, 120367, 68412, 41345, 120362, 120363, 11748, 42158, 7941, 11076, 8749, 120361, 2104, - 64858, 361, 120357, 845, 0, 41560, 11970, 4562, 917920, 2926, 0, 4569, - 74130, 0, 43487, 194630, 611, 74129, 64871, 120379, 65629, 0, 0, 0, 0, 0, - 120543, 0, 0, 6291, 0, 78639, 41669, 7094, 917921, 0, 0, 74054, 0, - 195029, 0, 839, 0, 7695, 8769, 65246, 4829, 0, 4859, 64467, 0, 0, 118998, - 7206, 0, 6647, 43986, 0, 69766, 0, 64764, 4210, 0, 0, 804, 0, 0, 12298, - 0, 66653, 0, 64924, 10091, 73931, 9468, 74245, 0, 0, 74246, 0, 12839, - 64669, 0, 0, 1279, 1425, 6224, 119229, 11049, 0, 917549, 43239, 8482, 0, - 0, 5032, 77830, 11940, 67888, 664, 0, 5034, 0, 0, 127525, 42702, 73888, - 0, 13294, 67873, 64869, 6032, 0, 9115, 7430, 120377, 0, 120819, 68387, - 120168, 73913, 120170, 41161, 5518, 4174, 10993, 41162, 120160, 64528, - 1169, 434, 41437, 1905, 6034, 41164, 64744, 9528, 118867, 194668, 524, 0, - 74029, 788, 74027, 0, 0, 0, 1663, 10419, 74025, 42636, 0, 0, 0, 120656, - 0, 67876, 0, 0, 0, 67897, 74039, 0, 0, 11395, 0, 119107, 43612, 64344, 0, - 0, 10855, 5445, 9355, 0, 65198, 7391, 8989, 221, 65686, 0, 0, 8010, 7191, - 4962, 69772, 8855, 0, 0, 64469, 120426, 10555, 0, 43333, 0, 0, 120427, - 10451, 0, 67653, 7245, 12443, 74405, 9947, 120149, 78317, 3873, 8367, 0, - 120146, 43433, 43649, 11987, 0, 0, 11010, 12723, 74059, 74062, 6217, - 5896, 0, 7682, 74049, 1462, 10235, 0, 0, 0, 0, 0, 0, 42595, 0, 74402, - 118860, 0, 120419, 0, 74052, 0, 0, 120549, 119082, 64295, 120418, 0, - 64765, 73923, 120417, 120662, 120730, 0, 6216, 0, 10755, 9455, 0, 8124, - 127042, 9470, 6944, 0, 0, 0, 2828, 0, 531, 42638, 0, 0, 0, 43428, 8204, - 3614, 2827, 9696, 0, 0, 8728, 4354, 10904, 78562, 19936, 7833, 120691, 0, - 42599, 42597, 42709, 120409, 127044, 0, 8537, 0, 0, 0, 0, 0, 41199, - 10121, 2028, 0, 0, 0, 0, 3062, 0, 74447, 12608, 0, 66440, 7545, 9700, - 12580, 0, 120777, 120502, 41155, 0, 74071, 0, 0, 12713, 0, 0, 0, 78772, - 0, 1734, 0, 0, 0, 64594, 2456, 231, 0, 74167, 542, 0, 118786, 0, 0, 1230, - 0, 0, 3597, 4446, 10584, 74235, 0, 4037, 0, 8352, 0, 5687, 0, 64515, 0, - 0, 55265, 67846, 78434, 9704, 0, 0, 74284, 0, 0, 8660, 0, 0, 0, 78773, - 74482, 4483, 1709, 120617, 9909, 6080, 0, 0, 1746, 1315, 8667, 0, 0, - 13140, 65899, 10604, 0, 4480, 11266, 0, 1226, 6930, 0, 0, 6360, 10897, - 41230, 605, 0, 74785, 120356, 0, 0, 41500, 0, 311, 11453, 6221, 10608, - 64943, 74280, 10877, 118868, 64885, 74272, 0, 0, 0, 120736, 74312, 345, - 0, 74456, 64606, 9917, 0, 0, 5037, 0, 1776, 8422, 0, 118814, 41508, - 41201, 323, 43328, 0, 42698, 1295, 0, 4625, 0, 4630, 13117, 0, 0, 65123, - 11293, 2668, 11288, 0, 42640, 65666, 2519, 0, 65420, 0, 0, 4252, 5049, - 42659, 119011, 706, 7754, 10854, 8738, 0, 65419, 0, 0, 649, 65421, 0, - 66702, 0, 12670, 1013, 0, 64919, 705, 0, 65422, 0, 1183, 0, 7017, 42852, - 0, 8157, 9736, 64503, 65418, 0, 0, 74035, 0, 11913, 73874, 6696, 0, 8920, - 0, 0, 7962, 12211, 9837, 2051, 66227, 0, 4184, 0, 0, 10177, 73777, 1857, - 0, 4626, 8464, 8472, 0, 4629, 8499, 78321, 78322, 4624, 7818, 119173, 0, - 0, 7805, 0, 0, 6935, 0, 78325, 78326, 78323, 43327, 43989, 119046, 8492, + 64858, 361, 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, 0, 74054, 127754, 195029, 0, 839, 0, 7695, 8769, 65246, 4829, 0, 4859, + 64467, 0, 0, 118998, 7206, 0, 6647, 43986, 0, 69766, 0, 64764, 4210, 0, + 127936, 804, 0, 0, 12298, 0, 66653, 0, 64924, 10091, 73931, 9468, 74245, + 0, 0, 74246, 92503, 12839, 64669, 92202, 0, 1279, 1425, 6224, 119229, + 11049, 0, 92697, 43239, 8482, 92440, 0, 5032, 69677, 11940, 67888, 664, + 120437, 5034, 0, 0, 127525, 42702, 73888, 0, 13294, 67873, 64869, 6032, + 0, 9115, 7430, 120377, 0, 120819, 68387, 120168, 73913, 120170, 41161, + 5518, 4174, 10993, 41162, 120160, 64528, 1169, 434, 41437, 1905, 6034, + 41164, 64744, 9528, 118867, 128800, 524, 0, 74029, 788, 74027, 0, 194638, + 0, 1663, 10419, 74025, 42636, 0, 69725, 0, 120656, 0, 67876, 0, 0, 0, + 67897, 74039, 0, 0, 11395, 0, 119107, 43612, 64344, 0, 0, 10855, 5445, + 9355, 0, 65198, 7391, 8989, 221, 65686, 0, 0, 8010, 7191, 4962, 69772, + 8855, 0, 0, 64469, 120426, 10555, 0, 43333, 92299, 0, 120427, 10451, 0, + 67653, 7245, 12443, 74405, 9947, 120149, 78317, 3873, 8367, 0, 120146, + 43433, 43649, 11987, 0, 0, 11010, 12723, 74059, 74062, 6217, 5896, 0, + 7682, 74049, 1462, 10235, 0, 0, 0, 0, 0, 0, 42595, 0, 74402, 118860, 0, + 120419, 92497, 74052, 0, 0, 120549, 119082, 64295, 120418, 0, 64765, + 73923, 120417, 120662, 120730, 194702, 6216, 0, 10755, 9455, 0, 8124, + 127042, 9470, 6944, 127540, 0, 69680, 2828, 0, 531, 42638, 0, 0, 0, + 43428, 8204, 3614, 2827, 9696, 0, 0, 8728, 4354, 10904, 78562, 19936, + 7833, 120691, 0, 42599, 42597, 42709, 120409, 127044, 0, 8537, 0, 0, 0, + 0, 0, 41199, 10121, 2028, 0, 0, 69715, 0, 3062, 0, 74447, 12608, 0, + 66440, 7545, 9700, 12580, 0, 120777, 120502, 41155, 0, 74071, 0, 0, + 12713, 0, 0, 0, 78772, 0, 1734, 0, 0, 127040, 64594, 2456, 231, 0, 74167, + 542, 0, 118786, 0, 0, 1230, 0, 0, 3597, 4446, 10584, 74235, 92215, 4037, + 127938, 8352, 0, 5687, 0, 64515, 0, 194801, 55265, 67846, 78434, 9704, 0, + 0, 74284, 128285, 0, 8660, 0, 0, 0, 78773, 74482, 4483, 1709, 69721, + 9909, 6080, 0, 120358, 1746, 1315, 8667, 0, 0, 13140, 65899, 10604, 0, + 4480, 11266, 128152, 1226, 6930, 0, 0, 6360, 10897, 41230, 605, 0, 74785, + 120356, 0, 0, 41500, 0, 311, 11453, 6221, 10608, 64943, 74280, 10877, + 118868, 64885, 74272, 0, 0, 0, 120736, 74312, 345, 0, 74456, 64606, 9917, + 0, 92231, 5037, 0, 1776, 8422, 0, 118814, 41508, 41201, 323, 43328, 0, + 42698, 1295, 0, 4625, 0, 4630, 13117, 0, 128772, 65123, 11293, 2668, + 11288, 0, 42640, 65666, 2519, 92369, 65420, 92479, 0, 4252, 5049, 42659, + 119011, 706, 7754, 10854, 8738, 0, 65419, 0, 0, 649, 65421, 0, 66702, 0, + 12670, 1013, 0, 64919, 705, 0, 65422, 127803, 1183, 0, 7017, 42852, 0, + 8157, 9736, 64503, 65418, 0, 0, 74035, 0, 11913, 73874, 6696, 0, 8920, 0, + 0, 7962, 12211, 9837, 2051, 66227, 0, 4184, 0, 0, 10177, 73777, 1857, 0, + 4626, 8464, 8472, 0, 4629, 8499, 78321, 78322, 4624, 7818, 119173, 0, 0, + 7805, 0, 0, 6935, 92292, 78325, 78326, 78323, 43327, 43989, 119046, 8492, 8250, 8459, 0, 8497, 8496, 0, 0, 78336, 78339, 9543, 78335, 78332, 77832, 65849, 77831, 0, 0, 12451, 0, 8684, 0, 6102, 0, 5298, 0, 5294, 0, 0, 0, - 195062, 9949, 119826, 43617, 119215, 0, 12073, 0, 0, 77863, 13108, 0, - 74397, 41468, 0, 0, 5292, 55272, 0, 1939, 5302, 3970, 0, 12455, 1793, 0, - 0, 0, 6643, 0, 65263, 0, 78330, 41293, 78328, 78329, 0, 13219, 9569, 0, - 74383, 0, 0, 0, 5500, 8813, 0, 0, 74566, 5322, 0, 78340, 43631, 5324, - 66443, 3784, 41614, 65269, 6230, 78349, 78345, 43324, 3360, 78344, 11523, - 0, 0, 9926, 7197, 0, 68429, 0, 41821, 1249, 78360, 78361, 78356, 78358, - 78353, 64899, 64763, 41149, 41807, 43162, 41815, 41150, 0, 10571, 10096, - 0, 0, 78074, 6947, 41152, 887, 9249, 6565, 78510, 41990, 78509, 41811, - 74466, 0, 6670, 77882, 0, 0, 43092, 43325, 0, 10168, 0, 9781, 194610, - 9190, 0, 9666, 8269, 65944, 74005, 13019, 11670, 0, 315, 12813, 0, 78432, - 78256, 78351, 78352, 0, 0, 0, 0, 1378, 9509, 0, 0, 74475, 3066, 0, 67847, - 0, 0, 0, 78365, 8787, 0, 194616, 41618, 194615, 78261, 194614, 0, 64652, - 0, 194612, 0, 78366, 42088, 0, 0, 7176, 0, 10137, 6121, 10995, 78259, - 74534, 8119, 64874, 917816, 0, 0, 0, 74525, 0, 0, 12930, 1394, 74514, 0, + 195062, 9949, 119826, 43617, 119215, 0, 12073, 0, 0, 77863, 13108, + 120617, 74397, 41468, 0, 0, 5292, 55272, 0, 1939, 5302, 3970, 917879, + 12455, 1793, 0, 0, 0, 6643, 92477, 65263, 0, 78330, 41293, 78328, 65923, + 0, 13219, 9569, 0, 74383, 0, 0, 0, 5500, 8813, 0, 0, 74566, 5322, 0, + 78340, 43631, 5324, 66443, 3784, 41614, 65269, 6230, 78349, 78345, 43324, + 3360, 78344, 11523, 0, 92488, 9926, 7197, 0, 68429, 42894, 41821, 1249, + 78360, 78361, 78356, 78358, 78353, 64899, 64763, 41149, 41807, 43162, + 41815, 41150, 0, 10571, 10096, 0, 0, 78074, 6947, 41152, 887, 9249, 6565, + 78510, 41990, 78509, 41811, 74466, 0, 6670, 77882, 0, 0, 43092, 43325, 0, + 10168, 0, 9781, 128655, 9190, 0, 9666, 8269, 65944, 74005, 13019, 11670, + 127383, 315, 12813, 0, 78432, 78256, 78351, 78352, 0, 0, 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, 128833, 10137, 6121, 10995, 78259, 74534, 8119, + 64874, 917816, 127199, 194939, 0, 74525, 0, 0, 12930, 1394, 74514, 0, 74515, 0, 118804, 2998, 9527, 120659, 65190, 12977, 42090, 119165, 0, - 119100, 41236, 0, 42005, 42003, 41237, 5848, 0, 0, 3670, 0, 194600, 0, 0, - 7890, 0, 11298, 43315, 0, 6229, 1593, 0, 0, 619, 4635, 65080, 0, 0, 4120, - 65337, 65336, 0, 11808, 119214, 74115, 9366, 42790, 42006, 0, 65327, - 65326, 65325, 10757, 1507, 42216, 65321, 65320, 65335, 65334, 65333, - 65332, 65331, 42059, 65329, 42689, 0, 9128, 118885, 42073, 6785, 64590, - 0, 4371, 7196, 65318, 2035, 65316, 4106, 65314, 65313, 42074, 0, 41228, - 0, 65609, 41241, 7903, 41239, 43533, 78459, 7189, 0, 0, 0, 12357, 42802, - 78450, 8487, 9131, 0, 4615, 12695, 0, 0, 12175, 0, 64535, 0, 7809, 0, 0, - 562, 12169, 6590, 69762, 66455, 64738, 3219, 68654, 0, 0, 1037, 0, 2025, - 0, 13098, 78442, 10637, 4568, 549, 1570, 0, 2835, 0, 10624, 43623, 11072, - 0, 0, 0, 12606, 78433, 2825, 0, 10825, 8079, 2821, 41046, 0, 0, 0, - 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, 0, 42628, 78575, 0, 0, 0, 3240, 0, 12194, 0, 11591, 41065, 5323, - 8166, 0, 0, 0, 74535, 1623, 65297, 0, 571, 0, 4918, 0, 5288, 127295, - 8916, 65048, 1909, 8864, 0, 0, 10736, 0, 11571, 7615, 0, 0, 4237, 0, - 1035, 65815, 0, 7881, 701, 65936, 3489, 0, 0, 120751, 11403, 0, 0, 0, - 3796, 6800, 0, 3994, 11421, 0, 0, 0, 0, 0, 0, 64857, 0, 2855, 0, 66308, - 41621, 68214, 0, 0, 10654, 0, 119226, 12164, 3246, 7906, 43972, 65847, - 7182, 0, 13024, 194822, 74270, 0, 0, 0, 0, 1496, 747, 0, 942, 2378, - 43136, 0, 8466, 0, 9320, 8001, 1232, 8139, 11617, 0, 0, 11409, 68373, - 6382, 0, 64634, 0, 0, 11612, 0, 67600, 2374, 0, 8475, 11609, 66313, 0, 0, - 5286, 119297, 0, 0, 64925, 0, 0, 118982, 194583, 7705, 11942, 11305, + 119100, 41236, 92235, 42005, 42003, 41237, 5848, 0, 0, 3670, 128657, + 194600, 0, 0, 7890, 0, 11298, 43315, 0, 6229, 1593, 0, 0, 619, 4635, + 65080, 0, 128002, 4120, 65337, 65336, 0, 11808, 119214, 74115, 9366, + 42790, 42006, 0, 65327, 65326, 65325, 10757, 1507, 42216, 65321, 65320, + 65335, 65334, 65333, 65332, 65331, 42059, 65329, 42689, 92427, 9128, + 118885, 42073, 6785, 64590, 0, 4371, 7196, 65318, 2035, 65316, 4106, + 65314, 65313, 42074, 127847, 41228, 0, 65609, 41241, 7903, 41239, 43533, + 78459, 7189, 0, 0, 0, 12357, 42802, 78450, 8487, 9131, 0, 4615, 12695, + 127752, 0, 12175, 0, 64535, 0, 7809, 0, 0, 562, 12169, 6590, 69762, + 66455, 64738, 3219, 68654, 0, 0, 1037, 0, 2025, 128263, 13098, 78442, + 10637, 4568, 549, 1570, 0, 2835, 0, 10624, 43623, 11072, 127191, 0, 0, + 12606, 78433, 2825, 0, 10825, 8079, 2821, 41046, 92327, 0, 0, 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, + 0, 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, 4237, 92576, 1035, 65815, 0, 7881, 701, 65936, 3489, 0, 0, 120751, + 11403, 0, 0, 127146, 3796, 6800, 0, 3994, 11421, 0, 195076, 0, 0, 0, 0, + 64857, 128105, 2855, 127828, 66308, 41621, 68214, 127283, 127817, 10654, + 0, 119226, 12164, 3246, 7906, 43972, 65847, 7182, 0, 13024, 194822, + 74270, 128289, 0, 0, 0, 1496, 747, 0, 942, 2378, 43136, 127905, 8466, 0, + 9320, 8001, 1232, 8139, 11617, 0, 0, 11409, 68373, 6382, 0, 64634, + 128279, 0, 11612, 0, 67600, 2374, 0, 8475, 11609, 66313, 0, 0, 5286, + 119297, 0, 0, 64925, 120283, 194584, 118982, 194583, 7705, 11942, 11305, 194581, 3309, 0, 0, 0, 0, 6802, 0, 41653, 1280, 1241, 7168, 12096, 0, 66615, 42565, 41651, 0, 0, 0, 41650, 66507, 66470, 0, 12914, 41491, - 66010, 119552, 6078, 65100, 0, 1475, 0, 9938, 6084, 917546, 41064, 41062, - 0, 0, 3256, 0, 42076, 43252, 78823, 0, 8727, 0, 65875, 0, 0, 0, 10562, - 74215, 43065, 0, 0, 3248, 74297, 3261, 9015, 0, 0, 3635, 64337, 0, 0, 0, - 7195, 0, 2007, 64431, 0, 0, 0, 0, 635, 0, 0, 65613, 77909, 0, 73997, 0, - 0, 119218, 7984, 8600, 74434, 0, 4176, 0, 2034, 0, 120805, 65891, 127038, - 0, 318, 2038, 0, 78596, 0, 3649, 13149, 42145, 42798, 3634, 120291, - 118927, 67677, 120124, 7866, 0, 11402, 42146, 120134, 74238, 42664, 2849, - 127034, 0, 7938, 12960, 1761, 11812, 65379, 68386, 0, 1159, 0, 0, 0, 0, - 7178, 194632, 0, 41680, 0, 0, 11534, 1514, 11668, 67891, 9313, 7015, 0, - 67877, 0, 12989, 66474, 9368, 12848, 1624, 43270, 0, 194563, 10818, - 194562, 9953, 0, 78421, 1194, 3242, 9761, 9555, 8598, 120299, 6169, - 12871, 1551, 2798, 65176, 120298, 42752, 119025, 0, 67875, 120301, 3495, - 66648, 0, 0, 68364, 0, 4891, 0, 10641, 0, 73746, 0, 68352, 0, 73787, 0, - 194633, 7199, 64955, 0, 0, 0, 0, 0, 42685, 42679, 193, 0, 0, 0, 42667, 0, - 5271, 0, 119661, 118882, 1362, 13297, 0, 0, 0, 0, 73789, 0, 6658, 4426, - 0, 0, 0, 119123, 7276, 42163, 5220, 0, 0, 0, 2416, 3310, 42703, 0, 379, - 0, 0, 0, 0, 3223, 65492, 1284, 194771, 4549, 0, 0, 0, 0, 10807, 9558, - 194613, 0, 8515, 8688, 12866, 0, 3294, 0, 8529, 0, 43385, 7564, 0, 43329, - 0, 0, 73757, 66456, 42359, 0, 2031, 0, 7202, 0, 12676, 42729, 0, 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, - 0, 0, 8502, 5762, 1967, 7483, 0, 0, 8104, 0, 7474, 0, 0, 0, 10414, 13001, - 8141, 0, 42537, 1557, 43594, 0, 6330, 6805, 8631, 2545, 120672, 0, 0, - 74190, 0, 0, 0, 42762, 0, 127017, 1650, 262, 1637, 0, 7901, 3238, 0, - 41861, 0, 0, 65158, 10860, 0, 43658, 7527, 0, 43319, 6419, 0, 45, 0, 0, - 0, 0, 119810, 7194, 5291, 0, 43666, 13129, 0, 9084, 0, 8737, 0, 12881, 0, - 12906, 9639, 7912, 2620, 0, 0, 0, 0, 179, 65896, 0, 64756, 2853, 0, - 118813, 0, 118996, 119009, 2850, 8084, 0, 73850, 2801, 119837, 42069, - 119839, 74754, 119841, 42072, 119843, 119842, 10398, 0, 0, 0, 0, 8245, - 68401, 3158, 119853, 4389, 43656, 923, 119857, 119856, 292, 13002, - 119845, 119844, 3221, 1763, 119849, 4612, 119851, 119850, 7253, 127110, - 68391, 0, 10782, 3637, 12996, 43542, 0, 64578, 0, 3228, 73869, 8783, 0, - 119614, 2731, 0, 0, 78585, 4102, 7696, 73878, 0, 0, 78586, 43316, 4177, - 11283, 9089, 0, 73996, 0, 64500, 43674, 0, 0, 1856, 0, 0, 6379, 0, 0, 0, - 3208, 12975, 0, 0, 0, 0, 74072, 55269, 0, 0, 0, 2033, 78577, 78576, - 195026, 55254, 7740, 0, 0, 0, 73964, 0, 0, 67612, 65674, 0, 0, 41689, 0, - 74006, 64909, 6646, 11790, 74019, 0, 0, 0, 8561, 4573, 0, 5326, 0, - 120605, 7230, 8257, 0, 8778, 41688, 0, 65776, 2071, 8314, 6459, 0, 7628, - 65092, 73903, 66721, 11342, 0, 0, 0, 0, 127001, 0, 11810, 13164, 10723, - 967, 0, 0, 11946, 0, 3257, 0, 12307, 1845, 0, 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, 0, 868, 873, 7642, 0, - 869, 874, 7644, 0, 875, 790, 0, 0, 0, 0, 66182, 0, 5429, 0, 66180, 0, - 66181, 68452, 0, 0, 42067, 0, 5433, 10657, 7911, 194622, 1547, 66176, - 42012, 120576, 5425, 4977, 9999, 5317, 5423, 4611, 0, 67637, 0, 9679, - 74122, 0, 0, 0, 0, 4418, 66184, 4628, 4245, 119648, 0, 0, 1851, 0, 0, - 11908, 0, 9360, 118897, 0, 42776, 66187, 12837, 8829, 7711, 0, 0, 119973, - 43318, 0, 8809, 119974, 0, 0, 120604, 0, 0, 0, 0, 0, 0, 7427, 0, 4588, - 43680, 0, 74484, 0, 2433, 0, 119622, 3352, 74363, 0, 0, 793, 74404, 0, - 305, 567, 67662, 842, 0, 8208, 0, 41695, 1647, 118877, 0, 7837, 917625, - 818, 5337, 917622, 917621, 41376, 119978, 917618, 120594, 74086, 917615, - 917614, 917613, 10973, 66359, 1372, 917609, 917608, 4969, 1254, 917605, - 917604, 917603, 917602, 65228, 78221, 0, 0, 2840, 0, 119982, 0, 0, 3245, - 9068, 68194, 64725, 0, 0, 12991, 0, 2651, 0, 0, 917611, 127026, 0, 0, 0, - 43648, 120812, 0, 43322, 0, 0, 0, 64372, 0, 3226, 655, 752, 7457, 7456, - 7452, 3285, 0, 0, 119988, 65610, 0, 0, 0, 671, 250, 7434, 618, 668, 610, - 42800, 7431, 1152, 42801, 640, 120666, 7448, 7439, 628, 3905, 73810, 0, - 0, 64749, 67850, 2107, 0, 0, 4605, 194873, 0, 43372, 65945, 0, 0, 119590, - 0, 0, 0, 987, 6927, 11572, 42261, 11464, 3365, 9971, 0, 0, 0, 0, 0, 0, 0, - 11334, 43326, 12609, 11519, 11503, 5530, 5210, 0, 4627, 0, 5208, 0, 0, - 10332, 5218, 7976, 9156, 0, 3244, 5529, 0, 73894, 0, 5432, 64965, 5527, - 74033, 10516, 7790, 5528, 0, 42140, 120281, 0, 0, 43545, 9887, 0, 4000, - 7429, 7428, 665, 7424, 3206, 120278, 7884, 0, 0, 0, 0, 211, 2509, 0, - 120573, 68672, 3220, 42235, 0, 10690, 8951, 5214, 42474, 8118, 0, 7048, - 4590, 127258, 5852, 0, 0, 127259, 1708, 0, 0, 2623, 11943, 0, 69226, 0, - 4698, 66509, 1066, 119921, 4701, 0, 120285, 74225, 119114, 8267, 0, 0, 0, - 7516, 0, 2625, 0, 8034, 74309, 0, 3631, 10955, 7850, 120293, 8416, 0, 0, - 0, 43384, 12660, 0, 0, 0, 74850, 41069, 0, 0, 12099, 4310, 10032, 6252, - 713, 7990, 0, 3990, 0, 0, 66368, 5017, 64956, 7071, 0, 119144, 1030, - 118800, 0, 9513, 41059, 9357, 0, 1773, 0, 120350, 0, 6339, 7745, 9844, 0, - 64650, 94, 1880, 74766, 0, 8908, 0, 0, 65913, 78470, 10752, 13003, 0, 0, + 66010, 119552, 6078, 9954, 0, 1475, 0, 9938, 6084, 917546, 41064, 41062, + 0, 0, 3256, 128640, 42076, 43252, 78823, 917906, 8727, 0, 65875, 0, 0, + 127762, 10562, 74215, 43065, 0, 0, 3248, 74297, 3261, 9015, 0, 0, 3635, + 64337, 0, 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, 0, + 2034, 92551, 120805, 65891, 127038, 0, 318, 2038, 128860, 78596, 0, 3649, + 13149, 42145, 42798, 3634, 120291, 118927, 67677, 120124, 7866, 0, 11402, + 42146, 120134, 74238, 42664, 2849, 127034, 0, 7938, 12960, 1761, 11812, + 65379, 68386, 128185, 1159, 0, 69729, 0, 0, 7178, 194632, 0, 41680, 0, + 128203, 11534, 1514, 11668, 67891, 9313, 7015, 0, 67877, 0, 12989, 66474, + 9368, 12848, 1624, 43270, 0, 194563, 10818, 128207, 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, 0, 4891, + 0, 10641, 0, 73746, 0, 68352, 0, 73787, 0, 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, 0, 73789, 0, 6658, 4426, 0, 92628, 0, 92319, + 7276, 42163, 5220, 0, 0, 0, 2416, 3310, 42703, 0, 379, 0, 127977, 0, 0, + 3223, 65492, 1284, 194771, 4549, 0, 0, 0, 127763, 10807, 9558, 194613, 0, + 8515, 8688, 12866, 0, 3294, 0, 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, 0, 7152, 8502, 5762, 1967, 7483, 0, 0, 8104, 0, 7474, + 92571, 0, 0, 10414, 13001, 8141, 0, 42537, 1557, 43594, 128642, 6330, + 6805, 8631, 2545, 120672, 127166, 0, 74190, 0, 0, 0, 42762, 0, 42914, + 1650, 262, 1637, 0, 7901, 3238, 128173, 41861, 0, 0, 65158, 10860, 0, + 43658, 7527, 0, 43319, 6419, 0, 45, 0, 64588, 0, 0, 119810, 7194, 5291, + 0, 43666, 13129, 0, 9084, 0, 8737, 0, 12881, 0, 12906, 9639, 7912, 2620, + 0, 0, 0, 0, 179, 65896, 0, 64756, 2853, 78443, 118813, 0, 118996, 119009, + 2850, 8084, 0, 73850, 2801, 92284, 42069, 119839, 74754, 119841, 42072, + 119843, 119842, 10398, 0, 0, 8377, 127116, 8245, 68401, 3158, 92396, + 3983, 43656, 923, 119857, 119856, 292, 13002, 119845, 119844, 3221, 1763, + 92463, 4612, 119851, 119850, 7253, 127110, 68391, 0, 10782, 3637, 12996, + 43542, 0, 64578, 0, 3228, 69636, 8783, 0, 119614, 2731, 0, 0, 78585, + 4102, 7696, 73878, 0, 0, 78586, 43316, 4177, 11283, 9089, 0, 73996, 0, + 64500, 43674, 0, 64947, 1856, 0, 0, 6379, 0, 0, 0, 3208, 12975, 74775, 0, + 0, 92389, 74072, 55269, 0, 0, 0, 2033, 78577, 78576, 195026, 55254, 7740, + 0, 0, 0, 73964, 0, 0, 67612, 65674, 0, 0, 41689, 0, 74006, 64909, 6646, + 11790, 74019, 0, 128066, 128031, 8561, 4573, 0, 5326, 0, 120605, 7230, + 8257, 0, 8778, 41688, 0, 65776, 2071, 8314, 6459, 0, 7628, 65092, 73903, + 66721, 11342, 128561, 0, 0, 128226, 127001, 0, 11810, 13164, 10723, 967, + 0, 0, 11946, 0, 3257, 0, 12307, 1845, 0, 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, 0, 868, 873, 7642, 0, 869, 874, + 7644, 0, 875, 790, 128303, 0, 0, 0, 66182, 0, 5429, 0, 66180, 0, 66181, + 68452, 0, 0, 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, 0, 42776, 66187, 12837, 8829, 7711, 92714, 0, + 92321, 43318, 0, 8809, 119974, 0, 0, 120604, 0, 0, 0, 0, 0, 0, 7427, + 9958, 4588, 43680, 0, 74484, 0, 2433, 0, 119622, 3352, 74363, 0, 0, 793, + 74404, 0, 305, 567, 67662, 842, 128519, 8208, 0, 41695, 1647, 118877, 0, + 7837, 917625, 818, 5337, 917622, 917621, 41376, 119978, 917618, 120594, + 74086, 917615, 917614, 917613, 10973, 66359, 1372, 127172, 917608, 4969, + 1254, 917605, 917604, 917603, 917602, 65228, 78221, 0, 0, 2840, 0, + 119982, 0, 0, 3245, 9068, 68194, 64725, 0, 0, 12991, 0, 2651, 128528, 0, + 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, 628, 3905, 73810, 0, 128266, + 64749, 67850, 2107, 0, 0, 4605, 128174, 0, 43372, 65945, 128838, 0, + 119590, 0, 0, 0, 987, 6927, 11572, 42261, 11464, 3365, 9971, 0, 0, + 128297, 0, 0, 0, 0, 11334, 43326, 12609, 11519, 11503, 5530, 5210, 0, + 4627, 0, 5208, 0, 128842, 10332, 5218, 7976, 9156, 0, 3244, 5529, 69647, + 73894, 128852, 5432, 64965, 5527, 74033, 10516, 7790, 5528, 0, 42140, + 120281, 0, 0, 43545, 9887, 0, 4000, 7429, 7428, 665, 7424, 3206, 120278, + 7884, 0, 128566, 917989, 128666, 211, 2509, 0, 120573, 68672, 3220, + 42235, 0, 10690, 8951, 5214, 42474, 8118, 0, 7048, 4590, 127258, 5852, 0, + 0, 127259, 1708, 0, 0, 2623, 11943, 0, 69226, 0, 4698, 66509, 1066, + 119921, 4701, 0, 120285, 74225, 119114, 8267, 0, 127265, 0, 7516, 0, + 2625, 0, 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, 0, 66368, 5017, 64956, 7071, 0, 119144, 1030, 118800, + 0, 9513, 41059, 9357, 0, 1773, 0, 120350, 0, 6339, 7745, 9844, 0, 64650, + 94, 1880, 74766, 0, 8908, 0, 128707, 65913, 78470, 10752, 13003, 0, 0, 41307, 8732, 120338, 0, 1757, 6964, 4696, 0, 0, 64785, 7394, 3641, 5419, - 0, 0, 0, 0, 120344, 43988, 0, 8610, 43062, 7592, 856, 74299, 936, 13289, - 127521, 43171, 1459, 0, 65243, 78638, 19953, 0, 1504, 0, 0, 12913, 74206, - 7529, 0, 0, 0, 120782, 4113, 0, 2372, 336, 0, 7509, 12152, 0, 682, 66458, - 41505, 0, 64743, 10593, 1703, 0, 0, 8033, 0, 0, 9810, 127269, 0, 12970, - 0, 42351, 10109, 0, 0, 194693, 0, 119247, 0, 0, 74291, 1965, 7069, 43312, - 0, 73887, 0, 2087, 64370, 6314, 41714, 8501, 0, 0, 74239, 41317, 0, 2091, - 0, 2090, 0, 9353, 77887, 2077, 77886, 0, 10498, 2083, 77888, 0, 0, - 119236, 634, 0, 0, 0, 69779, 4165, 8746, 0, 9654, 12856, 6924, 0, 7066, - 0, 0, 0, 41037, 42692, 7786, 12959, 41039, 0, 0, 680, 6274, 0, 1181, - 7056, 3174, 0, 0, 0, 65665, 0, 0, 6920, 0, 0, 0, 118965, 0, 64644, - 126981, 0, 0, 41028, 0, 6231, 2613, 65302, 40989, 0, 194696, 0, 42760, 0, - 0, 0, 40987, 4667, 0, 0, 8828, 0, 0, 1246, 4746, 0, 0, 11021, 4749, 0, 0, - 921, 4744, 0, 12702, 242, 0, 1566, 8217, 0, 64653, 78386, 0, 74036, - 74505, 43274, 5313, 951, 0, 0, 0, 7604, 0, 4009, 0, 0, 120562, 0, 0, - 64860, 119138, 119887, 0, 194702, 4048, 0, 0, 120596, 1646, 77890, 64534, - 73995, 0, 0, 119890, 2579, 119905, 3177, 11357, 9099, 4107, 3441, 119894, + 128055, 0, 127883, 0, 120344, 43988, 0, 8610, 43062, 7592, 856, 74299, + 936, 13289, 127521, 43171, 1459, 0, 65243, 78638, 19953, 0, 1504, 119108, + 0, 12913, 74206, 7529, 0, 0, 0, 120782, 4113, 0, 2372, 336, 0, 7509, + 12152, 0, 682, 66458, 41505, 0, 64743, 10593, 1703, 0, 0, 8033, 0, 0, + 9810, 127269, 0, 12970, 0, 42351, 10109, 0, 0, 194693, 0, 119247, 0, 0, + 74291, 1965, 7069, 43312, 0, 73887, 0, 2087, 64370, 6314, 41714, 8501, 0, + 0, 74239, 41317, 92614, 2091, 74545, 2090, 0, 9353, 7117, 2077, 77886, 0, + 10498, 2083, 77888, 0, 0, 119236, 634, 0, 0, 0, 69779, 4165, 8746, 0, + 9654, 12856, 6924, 0, 7066, 0, 0, 128135, 41037, 42692, 7786, 12959, + 41039, 0, 0, 680, 6274, 128200, 1181, 7056, 3174, 0, 0, 92668, 65665, + 127375, 0, 6920, 0, 92295, 0, 118965, 0, 64644, 126981, 0, 0, 41028, 0, + 6231, 2613, 65302, 40989, 0, 194696, 0, 42760, 0, 0, 0, 40987, 4667, 0, + 0, 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, 0, 7604, 0, 4009, 127816, 0, 120562, 0, 0, 64860, + 119138, 119069, 0, 127370, 4048, 0, 0, 120596, 1646, 77890, 64534, 73995, + 120705, 0, 119890, 2579, 119905, 3177, 11357, 9099, 4107, 3441, 119894, 2975, 74442, 9822, 0, 55220, 10084, 73943, 118840, 0, 917562, 0, 3399, 9851, 0, 11909, 9059, 0, 7687, 0, 6789, 0, 0, 0, 0, 0, 0, 1777, 9151, - 1137, 69767, 749, 42366, 0, 5385, 0, 0, 0, 0, 5989, 0, 0, 0, 0, 41685, - 69223, 0, 9769, 41684, 0, 519, 0, 11740, 5766, 0, 0, 2600, 8848, 120138, - 41297, 0, 3666, 74473, 41300, 74468, 65160, 0, 74542, 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, 0, 11730, 0, 9593, 5757, - 2403, 64808, 55275, 0, 11728, 65894, 0, 0, 7764, 0, 11094, 120825, 0, 0, - 4282, 8298, 0, 0, 0, 0, 0, 0, 0, 127509, 63854, 8456, 0, 74783, 65670, 0, - 78250, 0, 7774, 10607, 9792, 0, 0, 0, 0, 120764, 0, 10019, 74762, 0, - 3458, 4365, 0, 0, 3647, 0, 2602, 0, 0, 194707, 41135, 0, 0, 0, 64631, - 172, 4971, 41219, 41137, 1889, 7238, 6545, 0, 0, 7597, 10528, 0, 0, 3732, - 73910, 194588, 5344, 0, 43366, 43363, 9062, 119252, 0, 0, 0, 64479, 9232, - 0, 0, 0, 194712, 10900, 41531, 1263, 3720, 12048, 0, 64292, 41524, 7227, - 119635, 6099, 41534, 0, 0, 0, 299, 0, 8525, 0, 3524, 917565, 8831, 0, 0, - 3075, 67867, 0, 0, 66362, 0, 74758, 0, 0, 5845, 0, 0, 0, 2581, 8200, + 1137, 69767, 749, 42366, 0, 5385, 128574, 128218, 0, 0, 5989, 0, 0, + 128091, 0, 41685, 69223, 0, 9769, 41684, 0, 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, 0, + 11730, 0, 9593, 5757, 2403, 64808, 55275, 0, 11728, 43572, 0, 0, 7764, 0, + 11094, 120825, 0, 0, 4282, 8298, 0, 0, 0, 0, 0, 64449, 0, 127509, 63854, + 8456, 0, 74783, 65670, 0, 78250, 0, 7774, 10607, 9792, 0, 0, 0, 0, + 120764, 0, 10019, 74762, 0, 3458, 4365, 0, 0, 3647, 0, 2602, 128341, 0, + 194707, 41135, 0, 0, 0, 64631, 172, 4971, 41219, 41137, 1889, 7238, 6545, + 0, 92193, 7597, 10528, 0, 0, 3732, 73910, 194588, 5344, 0, 43366, 43363, + 9062, 119252, 0, 0, 0, 64479, 9232, 92596, 0, 0, 194712, 10900, 41531, + 1263, 3720, 12048, 0, 64292, 41524, 7227, 119635, 6099, 41534, 0, 127354, + 127345, 299, 0, 8525, 127347, 3524, 917565, 8831, 127349, 92564, 3075, + 67867, 127352, 0, 66362, 0, 64353, 0, 0, 5845, 0, 0, 0, 2581, 8200, 65114, 68460, 0, 43283, 5551, 0, 120735, 0, 6340, 118855, 0, 78134, 8680, - 7204, 0, 2588, 2914, 7011, 55281, 0, 2471, 0, 2883, 2749, 119563, 73774, - 10913, 0, 0, 8666, 675, 42493, 0, 43571, 0, 6219, 0, 9980, 41232, 10928, - 0, 41153, 41229, 118967, 0, 3738, 0, 0, 12711, 3181, 66212, 74289, 68472, - 42857, 8262, 0, 0, 0, 0, 42347, 12092, 9615, 7234, 74047, 0, 0, 64674, 0, - 0, 73846, 0, 12722, 0, 922, 43983, 74507, 0, 74461, 3218, 120471, 74290, - 120469, 64562, 120475, 8569, 11404, 11932, 73728, 3214, 120461, 120468, - 12128, 3207, 65486, 78729, 1901, 78727, 0, 120460, 7425, 3205, 0, 78737, - 78736, 78735, 43383, 78733, 65459, 2606, 78730, 73897, 0, 11496, 1173, 0, - 41272, 0, 0, 0, 0, 120737, 0, 0, 0, 378, 2610, 0, 65079, 0, 65695, 0, 37, - 7068, 0, 120480, 120479, 3209, 120477, 0, 10638, 9768, 120481, 0, 0, 0, - 0, 0, 0, 65510, 0, 0, 5233, 0, 64792, 0, 0, 0, 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, 0, - 8203, 78488, 0, 8458, 65211, 8495, 119904, 0, 917552, 779, 78314, 64367, - 2465, 0, 8193, 55279, 9730, 9280, 0, 7065, 74155, 4346, 0, 73798, 504, 0, - 120715, 8982, 0, 0, 0, 782, 0, 10883, 0, 194852, 732, 3737, 127253, 1548, - 68650, 0, 1832, 5604, 5735, 41141, 119020, 4376, 0, 11787, 3745, 0, 0, - 42888, 65712, 0, 3869, 11937, 5725, 0, 1783, 68648, 5728, 0, 0, 0, 11918, - 66567, 5724, 0, 5727, 0, 0, 0, 764, 0, 0, 43531, 0, 9033, 0, 42532, 6223, - 11042, 120749, 11423, 0, 0, 0, 43465, 0, 0, 6559, 64557, 0, 0, 120648, - 43019, 43477, 10238, 0, 0, 43377, 120675, 0, 1478, 9783, 11825, 2607, - 64740, 0, 7739, 74543, 0, 0, 0, 6132, 0, 63765, 0, 0, 41144, 0, 0, 43537, - 6761, 10093, 4369, 917791, 0, 0, 8820, 3947, 0, 0, 11515, 526, 0, 41295, - 194603, 917785, 194932, 0, 7688, 917786, 7686, 8288, 11815, 0, 0, 0, - 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, 0, 41216, - 7844, 2616, 119190, 68461, 65234, 0, 13076, 3135, 0, 78143, 119139, 3142, - 194948, 0, 10819, 119580, 10183, 0, 2608, 1470, 73967, 0, 6227, 0, 0, - 74775, 0, 6163, 0, 0, 0, 0, 0, 8603, 0, 119866, 3306, 10876, 43392, - 119573, 0, 5751, 0, 6222, 0, 0, 12086, 7403, 1600, 64309, 64939, 0, - 64783, 0, 11310, 0, 8882, 0, 0, 2570, 7021, 0, 0, 43110, 0, 1234, 6540, - 6974, 0, 0, 0, 5002, 0, 41286, 0, 127019, 0, 43585, 0, 6551, 0, 0, 0, - 41289, 0, 0, 0, 8977, 602, 120814, 0, 0, 0, 0, 0, 41279, 0, 0, 0, 11081, - 43615, 0, 0, 0, 0, 12727, 0, 0, 78397, 9475, 0, 65105, 0, 9633, 10886, - 43592, 7831, 0, 0, 0, 73915, 8076, 43048, 8290, 8291, 43051, 0, 0, 2596, - 43584, 0, 13113, 0, 0, 2393, 7058, 9087, 74067, 68673, 41574, 78337, 0, - 74058, 6376, 0, 0, 0, 0, 9854, 0, 64696, 0, 0, 0, 6994, 0, 1720, 0, 0, 0, + 7204, 0, 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, 127369, 0, 12711, 3181, 66212, + 74289, 68472, 42857, 8262, 0, 0, 0, 0, 42347, 12092, 9615, 7234, 74047, + 0, 0, 64674, 0, 0, 73846, 2934, 12722, 120762, 922, 43983, 74507, 0, + 74461, 3218, 120471, 74290, 120469, 64562, 120475, 8569, 11404, 11932, + 73728, 3214, 120461, 120468, 12128, 3207, 65486, 78729, 1901, 78727, + 127326, 120460, 7425, 3205, 0, 78737, 78736, 78735, 43383, 78733, 65459, + 2606, 78730, 73897, 0, 11496, 1173, 0, 41272, 119661, 0, 0, 0, 120737, 0, + 0, 0, 378, 2610, 0, 65079, 0, 65695, 0, 37, 7068, 0, 120480, 120479, + 3209, 120477, 0, 10638, 9768, 120481, 0, 0, 0, 0, 0, 0, 65510, 0, 0, + 5233, 0, 64792, 0, 0, 0, 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, 0, 8203, 78488, 0, 8458, + 65211, 8495, 119904, 0, 917552, 779, 78314, 64367, 2465, 0, 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, 0, 1832, 5604, + 5735, 41141, 119020, 4376, 0, 11787, 3745, 0, 0, 42888, 65712, 0, 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, 0, 43465, 0, 128267, 6559, 64557, 0, 0, 120648, + 43019, 43477, 10238, 0, 0, 43377, 92282, 0, 1478, 9783, 11825, 2607, + 64740, 0, 7739, 74543, 0, 0, 0, 6132, 0, 63765, 0, 0, 41144, 0, 92438, + 43537, 6761, 10093, 4369, 917791, 0, 0, 8820, 3947, 0, 0, 11515, 526, 0, + 41295, 194603, 917785, 194932, 0, 7688, 917786, 7686, 8288, 11815, 0, 0, + 0, 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, 0, + 41216, 7844, 2616, 119190, 68461, 65234, 0, 13076, 3135, 0, 78143, + 119139, 3142, 92451, 0, 10819, 119580, 10183, 0, 2608, 1470, 73967, 0, + 6227, 0, 0, 69741, 0, 6163, 0, 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, 0, 5002, 0, 41286, 0, 127019, 0, 43585, + 0, 6551, 0, 128229, 0, 41289, 0, 194602, 0, 8977, 602, 120814, 0, 128778, + 128661, 0, 0, 41279, 0, 0, 0, 11081, 43615, 0, 0, 0, 0, 12727, 0, 0, + 78397, 9475, 7112, 65105, 0, 9633, 10886, 43592, 7831, 0, 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, 0, 3751, 9120, 0, 0, 1798, 709, 0, 1354, 1876, 13152, 6557, - 12430, 8137, 0, 0, 0, 0, 245, 0, 11456, 41233, 7070, 0, 0, 6136, 0, - 65677, 8682, 41235, 0, 42045, 9804, 0, 432, 3595, 0, 65437, 0, 74455, - 42399, 0, 0, 0, 0, 119658, 0, 0, 0, 77894, 8797, 0, 9052, 64888, 0, 2356, - 95, 74784, 10580, 0, 42286, 0, 64640, 0, 119104, 0, 0, 0, 10063, 12652, - 12199, 127030, 0, 2566, 11971, 0, 0, 1065, 0, 0, 43400, 2576, 0, 0, 0, - 43604, 0, 0, 74082, 514, 74502, 0, 2921, 43215, 64493, 5772, 12968, 0, - 194944, 74580, 43398, 2580, 0, 41341, 41223, 6564, 1463, 41342, 0, 5293, - 0, 0, 3733, 11346, 0, 12054, 0, 74098, 42827, 0, 13091, 0, 0, 0, 917915, - 0, 127025, 0, 74821, 0, 0, 119042, 0, 0, 13090, 66643, 0, 1270, 1132, - 42360, 0, 74096, 66655, 42569, 0, 0, 64761, 0, 41021, 8510, 42432, 0, 0, - 0, 0, 64496, 74109, 0, 9915, 0, 0, 7061, 41336, 3854, 0, 13141, 68413, - 43401, 42319, 13082, 0, 7067, 68221, 0, 0, 0, 0, 0, 0, 9029, 43543, 0, - 2353, 6308, 0, 74792, 2611, 119186, 0, 0, 0, 43664, 0, 66627, 0, 4484, - 8509, 118976, 78116, 65233, 0, 41224, 41017, 0, 3747, 10522, 0, 0, 1691, - 41226, 0, 12107, 44002, 10905, 65010, 0, 697, 66018, 9284, 4244, 0, 0, 0, - 13121, 120036, 0, 12010, 0, 0, 0, 0, 0, 0, 65816, 68111, 0, 0, 65668, 0, - 6618, 118784, 66365, 0, 42234, 12648, 0, 0, 0, 5785, 41309, 9764, 41316, - 65877, 7383, 13230, 41299, 0, 0, 68365, 0, 0, 0, 0, 13122, 0, 191, 74119, - 8585, 8000, 64411, 120652, 42889, 64850, 41072, 41578, 0, 41577, 0, - 10002, 0, 6533, 73802, 41570, 0, 683, 396, 41580, 68146, 0, 12901, 43058, - 0, 343, 0, 42680, 41360, 78154, 0, 4743, 0, 0, 74040, 74108, 8743, 1724, - 1433, 119322, 0, 3739, 6263, 0, 0, 3964, 6592, 0, 0, 66040, 0, 42568, 0, - 0, 1778, 3956, 0, 42070, 6563, 43075, 9018, 0, 0, 12067, 41312, 0, 5547, - 74531, 0, 0, 8175, 0, 284, 8108, 934, 0, 74001, 173, 66460, 7174, 917917, - 118822, 1750, 0, 4394, 68368, 1807, 0, 0, 0, 5889, 0, 7180, 0, 119145, 0, - 0, 42471, 6982, 1721, 44022, 7891, 42243, 42160, 2583, 4512, 119360, - 65230, 0, 0, 0, 3855, 0, 0, 0, 0, 74295, 0, 0, 119140, 3975, 0, 74087, 0, - 12672, 3798, 2703, 0, 0, 2109, 9774, 1275, 0, 0, 41095, 3962, 0, 7873, - 41101, 3954, 6457, 4513, 0, 0, 73994, 73992, 1468, 0, 0, 41851, 0, 41846, - 0, 55238, 7633, 41849, 68385, 4320, 3224, 0, 0, 0, 42531, 0, 1510, 0, - 8256, 0, 11393, 0, 8879, 0, 0, 8770, 0, 0, 78377, 1910, 8671, 78374, - 4283, 0, 127117, 68361, 78318, 2654, 7893, 195007, 0, 0, 0, 65106, 42761, - 12857, 4581, 8411, 78372, 78371, 78370, 78369, 78368, 0, 0, 0, 1733, - 4392, 2568, 10786, 0, 0, 8184, 41486, 0, 7396, 0, 0, 69788, 0, 7185, - 7965, 0, 0, 0, 0, 41350, 9129, 0, 0, 0, 0, 0, 0, 10481, 0, 0, 7171, 0, - 340, 0, 0, 0, 0, 0, 0, 0, 6764, 0, 0, 0, 0, 0, 65203, 11392, 119098, - 119359, 0, 3210, 0, 0, 0, 0, 0, 0, 917619, 0, 0, 10043, 0, 1186, 41571, - 6999, 617, 9464, 0, 3675, 5207, 65062, 5213, 194769, 2617, 41348, 41568, - 0, 3253, 120535, 0, 8630, 0, 0, 5596, 5545, 7288, 2586, 64887, 0, 5217, - 0, 0, 0, 0, 64293, 68098, 2635, 0, 0, 0, 0, 0, 7835, 0, 0, 194988, 0, - 64558, 127122, 0, 127121, 0, 0, 0, 5784, 0, 0, 0, 0, 4011, 917616, 68101, - 0, 7864, 4254, 65095, 0, 5600, 3903, 127083, 10447, 5598, 1207, 120521, - 66689, 3501, 42582, 43600, 194780, 0, 1124, 5597, 0, 0, 9321, 0, 0, 0, 0, - 1719, 68356, 68354, 9671, 1125, 4399, 0, 917610, 0, 7631, 5488, 65223, - 120532, 0, 5491, 0, 8937, 43044, 2604, 74187, 5490, 43046, 5489, 7212, - 11768, 43043, 6300, 0, 194789, 0, 4390, 454, 41397, 0, 9875, 7593, - 194792, 0, 118913, 7207, 0, 65901, 2394, 2575, 0, 3746, 11016, 65752, - 120037, 0, 43423, 0, 11989, 0, 0, 0, 0, 0, 8249, 0, 0, 78531, 6640, - 74806, 2598, 513, 0, 6586, 8656, 0, 127002, 65008, 0, 194784, 0, 194795, - 0, 0, 68475, 0, 0, 0, 78637, 12647, 0, 194796, 0, 1036, 0, 0, 1723, 0, 0, - 0, 41579, 2444, 0, 10705, 73876, 0, 74486, 0, 740, 194985, 194978, - 194984, 0, 4238, 11071, 9459, 68437, 78140, 78139, 0, 8121, 10438, 74487, - 42574, 13285, 55263, 11907, 195000, 5690, 194999, 0, 0, 43181, 13095, 0, - 0, 64498, 0, 9506, 6978, 194993, 77992, 0, 0, 194992, 0, 0, 1122, 317, 0, - 0, 0, 0, 1920, 0, 10173, 827, 0, 0, 78378, 120126, 5223, 1304, 0, 119564, - 5226, 12602, 0, 0, 9329, 7758, 9239, 41173, 5224, 5487, 1222, 5692, - 41725, 69229, 9674, 5695, 41711, 64627, 19909, 0, 74604, 5691, 287, 866, - 233, 0, 0, 42816, 0, 65140, 74797, 0, 8830, 6568, 42300, 10524, 41175, 0, - 0, 0, 5296, 0, 42492, 43402, 0, 3302, 0, 0, 6516, 6515, 6514, 6513, 6512, - 0, 7856, 8690, 0, 0, 12122, 119628, 43976, 0, 1785, 0, 68622, 65153, - 194810, 5138, 0, 0, 0, 0, 4540, 41181, 0, 6200, 0, 5134, 0, 322, 4643, - 5132, 0, 6389, 0, 5143, 0, 8790, 0, 0, 194802, 0, 8869, 120601, 0, 42060, - 0, 0, 0, 0, 10270, 10286, 10318, 10382, 43529, 66477, 0, 0, 74170, 0, - 3234, 0, 0, 74376, 43139, 118815, 127084, 120627, 8767, 0, 74489, 9695, - 120746, 5201, 0, 6215, 12714, 6214, 13101, 0, 0, 65268, 0, 0, 0, 11027, - 0, 10059, 10511, 42075, 9767, 789, 1749, 78890, 127071, 0, 320, 0, 8647, - 0, 3049, 0, 6471, 42071, 43156, 9925, 127356, 127355, 0, 4960, 5549, - 127359, 0, 8485, 4671, 5418, 0, 3351, 127006, 0, 10610, 5414, 3064, 6212, - 4286, 5421, 0, 9554, 0, 0, 0, 6653, 0, 0, 64510, 6213, 12885, 0, 119045, - 64720, 0, 120759, 73741, 12603, 78654, 11430, 4566, 7843, 9317, 3801, - 10342, 10406, 0, 119259, 42576, 0, 5200, 0, 917948, 0, 9183, 0, 74458, - 73825, 395, 5482, 5198, 8786, 10390, 74202, 5196, 43224, 6113, 42009, - 5205, 0, 43307, 0, 118973, 0, 12134, 0, 0, 118843, 9126, 435, 0, 12014, - 12893, 8093, 9079, 3203, 192, 65109, 3385, 0, 64430, 5383, 10294, 10326, - 0, 5738, 0, 3336, 78355, 5361, 3623, 41159, 0, 68112, 7872, 8581, 0, - 1260, 3149, 5359, 0, 0, 7914, 5357, 0, 0, 2624, 5364, 0, 11431, 120030, - 9101, 11058, 78288, 0, 78293, 42271, 78289, 65737, 120793, 0, 65566, - 6717, 10619, 43360, 78385, 78384, 78383, 78382, 78381, 78380, 78379, - 9319, 7097, 119055, 77906, 3232, 73824, 74581, 120632, 0, 0, 41889, 0, 0, - 1161, 41895, 74103, 9701, 8622, 0, 0, 73819, 120588, 5012, 77912, 41362, - 0, 78296, 11921, 0, 11769, 0, 68609, 41364, 0, 74228, 41352, 41361, 0, - 41366, 0, 3356, 0, 917, 68422, 119915, 119923, 8199, 78389, 119917, 677, - 119916, 0, 119932, 0, 0, 0, 0, 3349, 74125, 7022, 8927, 4739, 0, 5802, 0, - 8615, 0, 0, 491, 0, 0, 0, 65837, 0, 8426, 11092, 9891, 0, 42497, 0, 7586, - 42305, 10852, 0, 0, 4606, 68448, 9095, 7741, 12684, 41885, 1046, 0, 0, 0, - 5815, 5171, 65539, 0, 6932, 78315, 42394, 41878, 74849, 120621, 0, 5169, - 11935, 0, 0, 3175, 120822, 1537, 120804, 5176, 8905, 4136, 4871, 78287, - 0, 9833, 0, 0, 1128, 65920, 0, 9711, 7057, 9408, 9409, 9410, 9411, 3662, - 9413, 3378, 9415, 9416, 9417, 9418, 6320, 9420, 9421, 5897, 9423, 5165, - 5126, 41385, 0, 41389, 917938, 8955, 3374, 9400, 9401, 9402, 9403, 9404, - 3507, 9406, 7629, 0, 19925, 42669, 68463, 183, 43985, 2631, 0, 10627, - 41130, 78260, 3996, 0, 78771, 0, 119313, 119307, 78768, 6580, 4332, - 64825, 66329, 10726, 66686, 41125, 5899, 41365, 917918, 12085, 0, 574, - 917922, 77825, 73828, 5448, 41058, 5446, 73900, 41322, 42211, 5442, 4190, - 77834, 77835, 5451, 77833, 3616, 77828, 77837, 77838, 7708, 77836, 10859, - 65867, 10345, 10409, 4191, 0, 77844, 73800, 42181, 77843, 77839, 2060, 0, - 78311, 11788, 65587, 68129, 10415, 74102, 0, 205, 0, 10351, 119076, 0, - 9862, 6588, 43257, 64697, 73998, 41355, 5505, 119154, 5503, 8021, 0, - 119150, 9819, 41357, 8011, 42885, 5507, 12044, 0, 0, 10026, 5472, 65108, - 1191, 13106, 5470, 10329, 5476, 8991, 66322, 69778, 78267, 42874, 8550, - 42876, 5592, 2919, 0, 2675, 5595, 78411, 0, 4367, 0, 0, 5478, 5904, 5594, - 0, 74150, 7291, 5590, 77849, 13067, 118909, 120372, 0, 9731, 0, 64633, - 77857, 77854, 77855, 77852, 77853, 77850, 10750, 43714, 77858, 74545, 0, - 0, 12887, 10551, 194564, 77866, 77867, 77864, 77865, 9929, 5199, 9936, - 1120, 42387, 0, 1444, 9486, 7554, 65839, 55252, 0, 1442, 0, 5894, 0, 0, - 0, 0, 74313, 0, 13162, 0, 3334, 0, 118803, 77881, 66022, 0, 0, 1651, 0, - 8861, 0, 0, 1142, 0, 8271, 0, 0, 0, 12903, 0, 4002, 43626, 10442, 10676, - 3344, 0, 0, 12920, 194560, 0, 0, 66642, 1277, 0, 7871, 0, 0, 78853, 0, - 78854, 120360, 0, 11784, 0, 78012, 4700, 66366, 78858, 120359, 11012, 0, - 78856, 120358, 77879, 4973, 8784, 77877, 74804, 77874, 77869, 77871, - 42440, 0, 43118, 0, 42364, 6774, 6773, 0, 120369, 10346, 10410, 78859, - 9243, 2464, 0, 6108, 3372, 0, 6247, 43117, 74526, 0, 74166, 0, 120355, 0, - 0, 0, 0, 0, 0, 0, 74217, 3354, 0, 4192, 9289, 118999, 41191, 3876, 0, 0, - 120660, 43696, 43380, 0, 0, 0, 0, 11603, 0, 0, 6589, 0, 194679, 0, 0, 0, - 0, 0, 42572, 0, 10630, 74827, 1963, 118889, 0, 11654, 0, 7550, 10686, - 5903, 0, 78009, 41329, 9662, 917937, 64698, 3366, 10399, 0, 0, 11013, 0, - 917933, 0, 78621, 194672, 6925, 0, 0, 917929, 0, 11568, 0, 917931, 64579, + 12430, 8137, 0, 92642, 0, 0, 245, 128097, 11456, 41233, 7070, 0, 0, 6136, + 917609, 65677, 8682, 41235, 92595, 42045, 9804, 0, 432, 3595, 0, 65437, + 0, 74455, 42399, 0, 0, 128274, 0, 119658, 0, 0, 0, 77894, 8797, 0, 9052, + 64888, 7167, 2356, 95, 74784, 10580, 0, 42286, 0, 64640, 0, 119104, 0, + 74137, 0, 10063, 12652, 12199, 92480, 0, 2566, 11971, 0, 0, 1065, 0, 0, + 43400, 2576, 66696, 0, 0, 43604, 0, 0, 74082, 514, 74502, 0, 2921, 43215, + 64493, 5772, 12968, 0, 194944, 74580, 43398, 2580, 0, 41341, 41223, 6564, + 1463, 41342, 0, 5293, 0, 0, 3733, 11346, 0, 12054, 0, 74098, 42827, 0, + 13091, 0, 0, 0, 917915, 0, 127025, 0, 74821, 0, 0, 119042, 0, 127865, + 13090, 66643, 0, 1270, 1132, 42360, 0, 74096, 66655, 42569, 127824, 0, + 64761, 0, 41021, 8510, 42432, 0, 0, 0, 0, 64496, 74109, 0, 9915, 0, 0, + 7061, 41336, 3854, 69700, 13141, 68413, 43401, 42319, 13082, 0, 7067, + 68221, 0, 0, 127171, 0, 0, 127797, 9029, 43543, 119315, 2353, 6308, 0, + 74792, 2611, 119186, 0, 0, 0, 43664, 92399, 66627, 0, 4484, 8509, 118976, + 78116, 65233, 0, 41224, 41017, 0, 3747, 10522, 0, 0, 1691, 41226, 0, + 12107, 44002, 10905, 65010, 194986, 697, 66018, 9284, 4244, 0, 0, 92644, + 13121, 120036, 0, 12010, 128573, 128221, 0, 0, 0, 127193, 65816, 68111, + 0, 127933, 65668, 92257, 6618, 118784, 66365, 0, 42234, 12648, 128039, + 7123, 0, 5785, 9198, 9764, 41316, 65877, 7383, 13230, 41299, 0, 0, 68365, + 128258, 0, 0, 0, 13122, 0, 191, 74119, 8585, 8000, 64411, 120652, 42889, + 64850, 41072, 41578, 0, 41577, 0, 10002, 0, 6533, 73802, 41570, 0, 683, + 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, 92514, + 0, 3964, 6592, 0, 128693, 66040, 0, 42568, 69806, 0, 1778, 3956, 0, + 42070, 6563, 43075, 9018, 0, 0, 12067, 41312, 0, 5547, 74531, 127969, 0, + 8175, 0, 284, 8108, 934, 0, 74001, 173, 66460, 7174, 92703, 118822, 1750, + 0, 4394, 68368, 1807, 0, 92298, 0, 5889, 0, 7180, 0, 119145, 0, 917558, + 42471, 6982, 1721, 44022, 7891, 42243, 42160, 2583, 4512, 119360, 65230, + 128109, 0, 0, 3855, 0, 0, 0, 0, 74295, 0, 0, 92416, 3975, 0, 74087, 0, + 12672, 3798, 2703, 0, 0, 2109, 9774, 1275, 0, 0, 41095, 3962, 0, 2932, + 41101, 3954, 6457, 4513, 0, 0, 73994, 73992, 1468, 0, 0, 41851, 128230, + 41846, 0, 55238, 7633, 41849, 68385, 4320, 3224, 0, 128032, 0, 42531, 0, + 1510, 0, 8256, 0, 11393, 0, 8879, 128075, 92474, 8770, 0, 0, 78377, 1910, + 8671, 78374, 4283, 0, 127117, 68361, 78318, 2654, 7893, 195007, 0, 0, 0, + 65106, 42761, 12857, 4581, 8411, 78372, 78371, 78370, 78369, 78368, 0, 0, + 0, 1733, 4392, 2568, 10786, 69661, 0, 8184, 41486, 0, 7396, 7116, 0, + 69788, 0, 7185, 7965, 0, 0, 92347, 0, 41350, 9129, 0, 0, 0, 0, 92489, 0, + 10481, 0, 127486, 7171, 0, 340, 92498, 0, 0, 0, 92200, 0, 0, 6764, + 127487, 0, 0, 0, 0, 65203, 11392, 119098, 119359, 0, 3210, 0, 0, 0, 0, 0, + 127970, 917619, 0, 0, 10043, 0, 1186, 41571, 6999, 617, 9464, 128244, + 3675, 5207, 65062, 5213, 194769, 2617, 41348, 41568, 128803, 3253, + 120535, 0, 8630, 128544, 0, 5596, 5545, 7288, 2586, 64887, 0, 5217, 0, 0, + 0, 0, 64293, 68098, 2635, 0, 0, 0, 0, 0, 7835, 0, 0, 194988, 92285, + 64558, 127122, 0, 127121, 0, 127913, 0, 5784, 0, 0, 0, 0, 4011, 917616, + 68101, 0, 7864, 4254, 65095, 0, 5600, 3903, 127083, 10447, 5598, 1207, + 120521, 66689, 3501, 42582, 43600, 194780, 0, 1124, 5597, 194778, 194772, + 9321, 0, 0, 0, 0, 1719, 68356, 68354, 9671, 1125, 4399, 127479, 917610, + 0, 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, 194792, 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, 127002, + 65008, 0, 194784, 194989, 194795, 0, 92515, 68475, 0, 0, 0, 78637, 12647, + 0, 128043, 0, 1036, 0, 92419, 1723, 128056, 0, 0, 41579, 2444, 0, 10705, + 73876, 0, 74486, 0, 740, 119222, 194978, 194984, 0, 4238, 11071, 9459, + 68437, 78140, 78139, 194985, 8121, 10438, 74487, 42574, 13285, 55263, + 11907, 195000, 5690, 92255, 0, 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, 0, 0, 9329, 7758, 9239, 41173, 5224, 5487, 1222, 5692, 41725, + 69229, 9674, 5695, 41711, 64627, 19909, 0, 74604, 5691, 287, 866, 233, + 127490, 0, 42816, 0, 65140, 74797, 0, 8830, 6568, 42300, 10524, 41175, 0, + 0, 0, 5296, 0, 42492, 43402, 92466, 3302, 0, 0, 6516, 6515, 6514, 6513, + 6512, 0, 7856, 8690, 0, 0, 12122, 119602, 43976, 0, 1785, 92507, 68622, + 65153, 194810, 5138, 0, 0, 0, 0, 4540, 41181, 0, 6200, 0, 5134, 0, 322, + 4643, 5132, 0, 6389, 0, 5143, 0, 8790, 128694, 0, 194802, 0, 8869, + 120601, 0, 42060, 0, 0, 194804, 127012, 10270, 10286, 10318, 10382, + 43529, 66477, 0, 0, 74170, 0, 3234, 0, 0, 74376, 43139, 118815, 127084, + 120627, 8767, 0, 74489, 9695, 120746, 5201, 0, 6215, 12714, 6214, 13101, + 0, 194999, 65268, 0, 0, 0, 11027, 0, 10059, 10511, 42075, 9767, 789, + 1749, 78890, 127071, 0, 320, 0, 8647, 0, 3049, 0, 6471, 42071, 43156, + 9925, 127356, 127355, 66478, 4960, 5549, 127359, 127346, 8485, 4671, + 5418, 127350, 3351, 127006, 127351, 10610, 5414, 3064, 6212, 4286, 5421, + 127344, 9554, 0, 127794, 127109, 6653, 128811, 0, 64510, 6213, 12885, 0, + 119045, 64720, 0, 120759, 73741, 12603, 7131, 11430, 4566, 7843, 9317, + 3801, 10342, 10406, 0, 119259, 42576, 0, 5200, 0, 917948, 0, 9183, + 127361, 74458, 73825, 395, 5482, 5198, 8786, 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, 0, 3336, 78355, 5361, 3623, 41159, 0, 68112, + 7872, 8581, 0, 1260, 3149, 5359, 0, 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, 78383, 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, 0, 78296, 11921, 0, 11769, 0, 68609, + 41364, 0, 74228, 41352, 41361, 0, 41366, 0, 3356, 0, 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, 0, 10190, 120698, + 65837, 128820, 8426, 11092, 9891, 0, 42497, 7113, 7586, 42305, 10852, 0, + 0, 4606, 68448, 9095, 7741, 12684, 41885, 1046, 7124, 0, 0, 5815, 5171, + 65539, 68612, 6932, 78315, 42394, 41878, 74849, 120621, 0, 5169, 11935, + 0, 0, 3175, 120822, 1537, 120804, 5176, 8905, 4136, 4871, 78287, 0, 9833, + 0, 0, 1128, 65920, 0, 9711, 7057, 9408, 9409, 9410, 9411, 3662, 9413, + 3378, 9415, 9416, 9417, 9418, 6320, 9420, 9421, 5897, 9423, 5165, 5126, + 41385, 0, 41389, 917938, 8955, 3374, 9400, 9401, 7119, 9403, 9404, 3507, + 9406, 7629, 0, 19925, 42669, 68463, 183, 43985, 2631, 0, 10627, 41130, + 78260, 3996, 0, 78771, 0, 119313, 119307, 78768, 6580, 4332, 64825, + 66329, 10726, 66686, 41125, 5899, 41365, 917918, 12085, 0, 574, 917922, + 77825, 73828, 5448, 41058, 5446, 69709, 41322, 42211, 5442, 4190, 77834, + 77835, 5451, 77833, 3616, 77828, 77837, 77838, 7708, 77836, 10859, 65867, + 10345, 10409, 4191, 0, 77844, 73800, 42181, 77843, 77839, 2060, 0, 7111, + 11788, 65587, 68129, 10415, 74102, 0, 205, 0, 10351, 119076, 0, 9862, + 6588, 43257, 64697, 73998, 41355, 5505, 119154, 5503, 8021, 0, 7125, + 9819, 41357, 8011, 42885, 5507, 12044, 92636, 0, 10026, 5472, 7109, 1191, + 13106, 5470, 10329, 5476, 8991, 66322, 69778, 78267, 42874, 8550, 42876, + 5592, 2919, 0, 2675, 5595, 78411, 0, 4367, 0, 0, 5478, 5904, 5594, 0, + 74150, 7291, 5590, 77849, 13067, 118909, 120372, 0, 9731, 69731, 64633, + 77857, 77854, 77855, 77852, 77853, 77850, 10750, 43714, 77858, 7137, 0, + 128296, 12887, 10551, 194564, 77866, 77867, 77864, 77865, 9929, 5199, + 9936, 1120, 42387, 0, 1444, 9486, 7554, 65839, 55252, 0, 1442, 0, 5894, + 0, 0, 41171, 92511, 74313, 0, 13162, 0, 3334, 0, 118803, 77881, 66022, 0, + 0, 1651, 0, 8861, 0, 0, 1142, 0, 8271, 0, 0, 0, 12903, 0, 4002, 43626, + 10442, 10676, 3344, 0, 0, 12920, 194560, 0, 0, 66642, 1277, 0, 7871, 0, + 0, 78853, 0, 78854, 120360, 0, 11784, 0, 78012, 4700, 66366, 78858, + 120359, 11012, 0, 78856, 92400, 77879, 4973, 8784, 77877, 74804, 77874, + 77869, 77871, 42440, 0, 43118, 0, 42364, 6774, 6773, 917560, 120369, + 10346, 10410, 78859, 9243, 2464, 74263, 6108, 3372, 0, 6247, 43117, + 74526, 7121, 74166, 0, 120355, 92537, 0, 0, 195034, 0, 0, 0, 74217, 3354, + 195037, 4192, 9289, 118999, 41191, 3876, 0, 127983, 120660, 43696, 43380, + 0, 0, 0, 0, 11603, 0, 0, 6589, 128588, 194679, 0, 0, 0, 0, 0, 42572, + 128264, 10630, 74827, 1963, 118889, 127978, 11654, 0, 7550, 10686, 5903, + 0, 78009, 41329, 9662, 917937, 64698, 3366, 10399, 0, 0, 11013, 127927, + 128300, 0, 78621, 194672, 6925, 0, 0, 917929, 0, 11568, 0, 43367, 64579, 917930, 7852, 0, 0, 6754, 6312, 0, 64672, 65296, 0, 118957, 0, 416, - 12296, 68457, 73834, 68177, 11050, 10984, 0, 0, 0, 0, 0, 0, 9532, 66355, - 0, 0, 917925, 64343, 195032, 0, 195031, 0, 0, 195057, 11445, 0, 195028, - 195056, 195027, 10185, 1021, 0, 9507, 10210, 74544, 8023, 1200, 12243, - 78001, 5282, 78003, 12540, 11545, 0, 120493, 3343, 4424, 11047, 1885, - 43268, 3896, 78626, 66497, 2947, 392, 7894, 4391, 68139, 0, 13059, 74816, - 77998, 3381, 7942, 0, 69219, 0, 64757, 0, 3913, 0, 0, 78235, 7044, 1265, - 0, 6309, 7045, 7175, 7047, 78239, 11791, 0, 0, 8221, 78307, 41864, 0, 0, - 0, 0, 167, 0, 78301, 0, 74211, 41897, 68477, 0, 917583, 0, 0, 2493, 0, - 118811, 0, 0, 64354, 0, 8777, 0, 406, 8884, 2385, 0, 0, 0, 917573, 43030, - 42027, 12114, 0, 917579, 64936, 0, 0, 120629, 10561, 0, 8365, 0, 0, - 65841, 120787, 11601, 0, 74121, 0, 917575, 7834, 74159, 0, 0, 10298, - 6624, 4908, 917596, 1639, 0, 0, 74157, 6327, 6724, 0, 0, 0, 0, 4817, - 78446, 194759, 0, 7043, 9600, 11022, 0, 0, 0, 0, 0, 0, 7548, 64794, - 42050, 12291, 55289, 194761, 12343, 657, 195054, 42705, 4461, 1134, 1838, - 78438, 2057, 0, 4468, 0, 0, 0, 4456, 5206, 10720, 0, 42523, 127520, 0, 0, - 917595, 65550, 260, 4816, 67658, 10687, 0, 4821, 4466, 0, 195043, 4818, - 0, 41403, 119977, 0, 0, 41406, 43273, 74160, 119983, 73939, 119985, - 119984, 119979, 41404, 1165, 119980, 4451, 13087, 0, 11284, 119987, - 73855, 65155, 43014, 5439, 9363, 127558, 3375, 0, 5900, 0, 7889, 2722, - 42262, 0, 0, 0, 0, 0, 0, 0, 11401, 0, 0, 68459, 0, 0, 0, 0, 65438, 0, - 7280, 0, 0, 0, 4868, 119967, 119966, 0, 0, 0, 43161, 0, 119964, 0, 5182, - 0, 120542, 0, 0, 4226, 120798, 12135, 5732, 4464, 0, 0, 977, 4458, 0, 0, - 64770, 74838, 0, 344, 0, 194790, 1395, 64279, 0, 0, 0, 786, 0, 43174, - 64340, 0, 0, 0, 43026, 7612, 10132, 64413, 0, 0, 0, 0, 0, 0, 68444, 0, - 120734, 0, 119160, 10204, 0, 0, 0, 0, 1399, 0, 65217, 0, 8852, 0, 241, 0, - 4907, 0, 0, 7932, 9727, 0, 74255, 8748, 0, 0, 0, 0, 42780, 0, 0, 0, 4217, - 0, 8650, 0, 0, 0, 0, 118872, 43099, 3965, 119119, 6719, 0, 13300, 78439, - 0, 43057, 66588, 118991, 0, 0, 73815, 4420, 0, 6410, 7760, 0, 0, 0, 0, 0, - 7294, 0, 0, 0, 9066, 0, 11993, 43188, 2626, 7762, 0, 0, 0, 0, 42825, - 41854, 5304, 0, 78516, 6919, 8619, 119655, 10038, 66454, 9592, 42851, - 126993, 1542, 0, 0, 0, 0, 0, 74311, 78497, 0, 10181, 0, 43624, 0, 7779, - 0, 10195, 9479, 6029, 0, 0, 9689, 0, 0, 8993, 66358, 0, 42378, 3368, 606, - 0, 7697, 69237, 69787, 2030, 0, 6027, 8370, 4322, 0, 65207, 0, 0, 0, 0, - 0, 2735, 42831, 77935, 127120, 74866, 8881, 119047, 0, 0, 73946, 0, 0, 0, - 68140, 0, 9576, 0, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063, - 7709, 41112, 0, 66560, 42041, 4572, 12876, 66561, 0, 6758, 0, 1615, 5855, - 809, 0, 0, 0, 0, 5799, 0, 0, 0, 7260, 0, 43031, 64425, 65128, 127061, - 64386, 65257, 0, 68616, 120607, 9347, 0, 6532, 0, 0, 0, 0, 65828, 0, 283, - 68665, 78813, 532, 78663, 0, 0, 120609, 0, 3370, 0, 11361, 5443, 78778, - 8153, 73767, 0, 10741, 0, 0, 0, 0, 65495, 64706, 0, 43344, 0, 78870, - 9466, 78866, 9824, 0, 0, 0, 0, 915, 43425, 0, 0, 0, 0, 0, 43264, 0, 0, 0, - 0, 78864, 6730, 78862, 68161, 64550, 5186, 12890, 0, 0, 12108, 0, 65124, - 43127, 66043, 0, 6326, 43107, 77826, 0, 42562, 0, 0, 0, 0, 11485, 6103, - 127123, 0, 11718, 0, 12889, 0, 0, 0, 0, 0, 55245, 0, 1630, 0, 65483, 0, - 12565, 0, 65476, 120013, 0, 119554, 9283, 7700, 917537, 9690, 65499, 0, - 64593, 512, 3376, 68210, 0, 0, 77892, 632, 12940, 77891, 42529, 78587, 0, - 5957, 0, 8926, 0, 0, 0, 10745, 10174, 7379, 64581, 5386, 120686, 11713, - 10633, 120531, 5056, 0, 0, 0, 120773, 0, 9812, 0, 4460, 0, 0, 0, 0, 0, 0, - 0, 64278, 0, 43466, 0, 0, 64389, 2953, 73879, 1801, 12835, 119029, 0, - 73823, 0, 66375, 2085, 702, 42579, 77884, 77885, 13074, 77883, 0, 0, 0, - 12106, 0, 74207, 1755, 10482, 12863, 77898, 1163, 2951, 9522, 74079, - 78266, 120674, 0, 3384, 69227, 10702, 830, 77902, 77899, 77900, 8451, 0, - 0, 0, 120762, 0, 0, 0, 0, 2908, 0, 43386, 64902, 4243, 0, 12239, 0, 0, - 4441, 0, 0, 73940, 64352, 127513, 0, 411, 0, 0, 0, 4056, 118992, 41890, - 0, 2730, 41604, 0, 5428, 194743, 3364, 42265, 0, 0, 118816, 194742, 9684, - 216, 0, 1401, 0, 44012, 0, 0, 0, 9158, 77842, 120664, 5768, 0, 0, 0, 484, - 0, 0, 0, 65895, 0, 0, 3338, 73935, 572, 7041, 2736, 67605, 0, 0, 2794, - 8807, 64491, 77847, 5438, 5222, 5381, 43114, 0, 5193, 5125, 5456, 5509, - 77846, 194747, 9534, 0, 0, 0, 3430, 0, 0, 0, 0, 981, 0, 4330, 73929, - 120536, 1824, 10908, 0, 7034, 41683, 64617, 0, 73754, 3957, 64358, 64547, - 0, 674, 63991, 0, 2946, 5354, 5251, 5328, 5307, 3759, 11411, 8364, 5123, - 0, 5281, 5469, 5121, 119245, 0, 0, 5130, 0, 0, 77990, 0, 120726, 1221, - 2733, 11746, 77991, 5216, 0, 0, 0, 0, 3468, 7033, 9230, 5939, 0, 0, 0, - 120677, 68400, 7278, 10321, 10289, 64613, 10385, 41706, 0, 0, 0, 0, - 11739, 0, 41981, 0, 5938, 0, 0, 12448, 7576, 10401, 10337, 73852, 0, - 13057, 0, 126976, 0, 10009, 0, 64304, 0, 12165, 0, 0, 9885, 0, 8077, 0, - 0, 0, 0, 0, 0, 0, 4220, 10725, 10433, 0, 68395, 4987, 64519, 0, 0, 0, 0, - 0, 10970, 11733, 0, 120792, 0, 19944, 0, 9009, 8551, 0, 11468, 64636, - 7575, 0, 2724, 0, 0, 12313, 119949, 515, 119947, 42791, 63987, 78286, - 119943, 119940, 119941, 119938, 9775, 4046, 4589, 4521, 68629, 9141, 0, - 78850, 2741, 64399, 6197, 1370, 0, 0, 0, 0, 0, 0, 6184, 8606, 3303, - 41372, 11786, 9473, 66203, 66177, 0, 11593, 43007, 4478, 66178, 0, 0, - 2744, 0, 4477, 118964, 814, 42066, 66183, 66204, 66194, 119961, 66198, - 41880, 66188, 66197, 78148, 11955, 66190, 66191, 41111, 66189, 73788, - 7788, 4847, 0, 0, 0, 0, 0, 1581, 6535, 78161, 12954, 430, 78160, 55259, - 78158, 194938, 5278, 4945, 42883, 4950, 0, 68625, 0, 7269, 0, 5964, - 12908, 0, 0, 74764, 74477, 119146, 194936, 4949, 0, 443, 0, 4944, 5467, - 119603, 0, 65137, 6044, 65392, 0, 4213, 0, 41303, 0, 194931, 0, 41306, - 73984, 2698, 127531, 0, 12072, 3193, 0, 41304, 824, 0, 12091, 78893, - 78894, 119816, 4673, 64804, 4678, 119820, 119819, 65059, 0, 6739, 0, - 5481, 3490, 1199, 119811, 8356, 119829, 119832, 4677, 12688, 3102, 0, - 4672, 78173, 78175, 5531, 68367, 42575, 78170, 78166, 4674, 4548, 44005, - 0, 68658, 119946, 8025, 68630, 127024, 1855, 0, 68669, 0, 119942, 127554, - 0, 0, 119652, 2745, 11797, 0, 0, 68643, 4654, 0, 0, 68638, 73993, 10525, - 4649, 65209, 0, 0, 4648, 43080, 0, 0, 0, 6246, 64950, 7828, 4650, 6777, - 6776, 6775, 4653, 7822, 78005, 0, 43187, 8669, 0, 6821, 65093, 0, 78881, - 2716, 0, 0, 0, 0, 68369, 0, 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, 0, 0, 0, 64904, 9026, 10833, 74864, 7547, 4867, 0, - 10008, 10222, 3054, 194956, 9744, 78860, 7605, 4622, 119656, 0, 0, 0, 0, - 0, 9045, 78888, 4225, 19926, 78887, 12880, 65307, 4617, 78883, 0, 41732, - 4616, 10518, 10423, 10359, 0, 5958, 0, 0, 4215, 9789, 917941, 4321, 4621, - 0, 41313, 522, 5368, 0, 65803, 0, 5366, 12201, 5372, 0, 0, 0, 7720, 7390, - 2696, 0, 0, 4638, 0, 1790, 78242, 5965, 64363, 66569, 68646, 194968, - 5376, 1835, 5335, 194966, 0, 4633, 0, 68119, 1180, 4632, 0, 5387, 5333, - 0, 0, 42094, 5331, 4634, 11928, 0, 5338, 4637, 0, 5971, 42414, 0, 1268, - 65097, 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, 10358, 10422, 4758, - 0, 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231, 74384, 0, - 68377, 6248, 0, 0, 0, 42318, 0, 5229, 4757, 0, 0, 2728, 4752, 64563, - 65235, 5234, 0, 0, 0, 10713, 0, 0, 2622, 7460, 0, 0, 0, 8954, 74760, - 65189, 2632, 0, 10108, 1011, 5574, 1853, 2709, 65139, 5577, 0, 0, 118871, - 68641, 8965, 7635, 42177, 5316, 0, 5314, 6451, 5572, 0, 5312, 0, 5525, - 5330, 5319, 0, 0, 194907, 44003, 0, 0, 0, 120498, 0, 195009, 0, 74022, 0, - 64609, 0, 120634, 0, 5721, 0, 5519, 8632, 66465, 11267, 73961, 0, 5720, - 0, 1692, 4219, 4610, 8696, 4305, 0, 4609, 43478, 4614, 541, 0, 5287, - 5309, 5285, 68389, 5961, 4647, 56, 4216, 10577, 41381, 601, 4613, 0, 0, - 0, 4608, 64260, 41124, 5190, 67628, 0, 68145, 7086, 0, 119243, 67620, 0, - 2734, 11074, 0, 67627, 43593, 0, 67625, 5960, 0, 8992, 65293, 0, 1782, - 67622, 68114, 119939, 0, 68180, 5501, 119952, 42508, 7442, 43665, 359, - 41253, 68392, 6239, 119956, 41256, 0, 68134, 0, 74209, 0, 9346, 118904, - 41254, 0, 43291, 3767, 5737, 0, 4865, 0, 5740, 917997, 5736, 4368, 0, - 7193, 68137, 0, 5739, 41024, 4866, 0, 73904, 0, 4869, 120563, 0, 4223, 0, - 6650, 0, 0, 0, 0, 4870, 0, 68661, 6716, 78176, 68667, 68382, 68676, 0, - 10122, 4864, 66568, 4144, 7937, 0, 6245, 68652, 2732, 42734, 745, 0, - 195097, 0, 4777, 7821, 0, 68631, 42775, 0, 194954, 0, 3097, 0, 5966, 0, - 4778, 0, 10863, 0, 4781, 0, 64407, 0, 0, 8577, 0, 68196, 43285, 10216, - 4782, 0, 0, 120757, 68618, 12325, 43056, 8717, 0, 0, 4776, 0, 11492, - 8700, 0, 13176, 68363, 10426, 0, 917599, 10362, 0, 1715, 4849, 8242, - 9561, 73922, 43278, 42635, 0, 0, 5963, 917926, 0, 0, 4850, 0, 1607, 466, - 4853, 118995, 4854, 0, 5164, 0, 1350, 5124, 64420, 1993, 5362, 8471, - 2708, 0, 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, 0, 303, 0, 0, 0, 2437, - 0, 4221, 4844, 118869, 0, 0, 0, 0, 0, 43292, 0, 2441, 10739, 65090, 0, - 119327, 0, 2451, 2714, 119326, 0, 43379, 4937, 43376, 753, 5849, 10597, - 43089, 11722, 9248, 0, 42879, 11725, 0, 0, 2726, 3107, 73958, 4941, - 64937, 119233, 9140, 1408, 5261, 4607, 0, 181, 0, 4942, 9539, 4938, 0, - 65201, 5259, 9369, 64185, 4142, 5257, 0, 0, 4964, 5264, 64178, 64177, - 12979, 41411, 64182, 64181, 64180, 64179, 9482, 4873, 41231, 1822, 42526, - 0, 12758, 3865, 0, 0, 10500, 0, 0, 78028, 0, 9830, 43642, 389, 10893, - 7521, 0, 4872, 5463, 0, 3125, 9567, 0, 4878, 5459, 4604, 0, 9557, 5465, - 68617, 0, 11494, 0, 9563, 10865, 74570, 43279, 64186, 0, 78714, 64191, - 64190, 8898, 64188, 0, 41030, 78836, 0, 917835, 78820, 917834, 0, 78805, - 41031, 78801, 11960, 6745, 3082, 0, 78539, 73919, 10573, 41744, 7079, - 5856, 127043, 5163, 78809, 0, 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, 0, 42156, 78688, 0, - 64193, 64192, 78000, 9943, 64197, 64196, 64195, 64194, 13282, 64175, - 64174, 64173, 78189, 846, 78186, 9965, 0, 0, 0, 0, 2543, 12163, 3108, - 9745, 64167, 64166, 64165, 64164, 2110, 0, 64169, 64168, 64949, 10972, - 10251, 10247, 42768, 715, 64161, 43299, 9453, 5348, 10943, 120378, 0, - 11352, 550, 9910, 0, 0, 66579, 11551, 0, 0, 9504, 7187, 0, 10373, 0, + 12296, 68457, 73834, 68177, 11050, 10984, 92208, 0, 0, 92182, 0, 0, 9532, + 66355, 0, 0, 917925, 64343, 195032, 128281, 195031, 0, 0, 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, 78626, 66497, 2947, 392, 7894, 4391, 68139, 0, + 13059, 74816, 77998, 3381, 7942, 0, 69219, 0, 64757, 0, 3913, 0, 0, + 78235, 7044, 1265, 0, 6309, 7045, 7175, 7047, 78239, 11791, 0, 0, 8221, + 78307, 41864, 0, 0, 0, 0, 167, 0, 78301, 0, 74211, 41897, 68477, 0, + 917583, 0, 0, 2493, 0, 118811, 0, 0, 64354, 0, 8777, 0, 406, 8884, 2385, + 0, 92450, 0, 917573, 43030, 42027, 12114, 0, 917579, 64936, 194695, 0, + 120629, 10561, 0, 8365, 120539, 0, 65841, 120787, 11601, 0, 74121, 0, + 917575, 7834, 74159, 0, 917574, 10298, 6624, 4908, 917596, 1639, 0, 0, + 74157, 6327, 6724, 0, 128086, 92566, 0, 4817, 78446, 194759, 92536, 7043, + 9600, 11022, 0, 0, 0, 0, 0, 0, 7548, 64794, 42050, 12291, 55289, 194761, + 12343, 657, 195054, 42705, 4461, 1134, 1838, 78438, 2057, 0, 4468, 0, 0, + 0, 4456, 5206, 10720, 0, 42523, 127520, 0, 0, 917595, 65550, 260, 4816, + 67658, 10687, 0, 4821, 4466, 0, 195043, 4818, 195048, 41403, 119977, 0, + 0, 41406, 43273, 74160, 119983, 73939, 92638, 119984, 119979, 41404, + 1165, 119980, 4451, 13087, 0, 11284, 119987, 73855, 65155, 43014, 5439, + 9363, 127558, 3375, 128869, 5900, 0, 7889, 2722, 42262, 0, 0, 128774, 0, + 0, 0, 127810, 11401, 0, 0, 68459, 0, 0, 0, 0, 65438, 0, 7280, 127887, 0, + 127381, 4868, 119967, 119966, 118798, 0, 0, 43161, 0, 92360, 0, 5182, 0, + 120542, 0, 0, 4226, 120798, 12135, 5732, 4464, 0, 0, 977, 4458, 0, 0, + 64770, 74838, 0, 344, 0, 194790, 1395, 64279, 0, 92240, 0, 786, 0, 43174, + 64340, 0, 0, 120723, 43026, 7612, 10132, 64413, 65025, 0, 0, 0, 0, 0, + 68444, 0, 92437, 0, 119160, 10204, 92656, 0, 127809, 0, 1399, 0, 65217, + 0, 8852, 0, 241, 128780, 4907, 0, 0, 7932, 9727, 128873, 74255, 8748, 0, + 0, 0, 0, 42780, 0, 0, 0, 4217, 0, 8650, 0, 0, 0, 0, 118872, 43099, 3965, + 119119, 6719, 0, 13300, 78439, 128261, 43057, 66588, 118991, 0, 0, 73815, + 4420, 0, 6410, 7760, 0, 0, 0, 0, 0, 7294, 0, 0, 0, 9066, 0, 11993, 43188, + 2626, 7762, 0, 0, 0, 92601, 42825, 41854, 5304, 0, 78516, 6919, 8619, + 119655, 10038, 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, 0, 8993, 66358, 0, 42378, 3368, 606, 127030, 7697, 69237, + 69787, 2030, 0, 6027, 8370, 4322, 0, 65207, 0, 0, 0, 0, 0, 2735, 42831, + 77935, 127120, 74866, 8881, 119047, 0, 0, 73946, 0, 0, 0, 68140, 0, 9576, + 128872, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063, 7709, 41112, + 0, 66560, 42041, 4572, 12876, 66561, 0, 6758, 0, 1615, 5855, 809, 0, + 92283, 128316, 128004, 5799, 0, 0, 0, 7260, 0, 43031, 64425, 65128, + 78819, 64386, 65257, 0, 68616, 120607, 9347, 128067, 6532, 0, 0, 0, + 127060, 65828, 0, 283, 68665, 78813, 532, 78663, 0, 0, 120609, 0, 3370, + 0, 11361, 5443, 78778, 8153, 73767, 0, 10741, 0, 0, 0, 0, 65495, 64706, + 0, 43344, 0, 7144, 9466, 78866, 9824, 0, 0, 0, 0, 915, 43425, 0, 0, 0, 0, + 127178, 43264, 0, 0, 0, 0, 78864, 6730, 78862, 68161, 64550, 5186, 12890, + 127837, 0, 12108, 0, 65124, 43127, 66043, 0, 6326, 43107, 77826, 0, + 42562, 0, 0, 0, 128520, 11485, 6103, 127123, 0, 11718, 0, 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, 0, 77892, 632, 12940, 77891, 42529, 78587, 0, 5957, 110593, + 8926, 0, 0, 128273, 10745, 10174, 7379, 64581, 5386, 120686, 11713, + 10633, 69708, 5056, 0, 0, 0, 120773, 0, 9812, 0, 4460, 0, 0, 0, 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, + 0, 0, 128570, 12106, 0, 74207, 1755, 10482, 12863, 77898, 1163, 2951, + 9522, 74079, 78266, 120674, 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, 0, 73940, 64352, 127513, 0, 411, 0, 9199, 0, 4056, + 118992, 41890, 0, 2730, 41604, 0, 5428, 194743, 3364, 42265, 64437, + 127935, 118816, 194742, 9684, 216, 0, 1401, 128053, 44012, 0, 0, 92585, + 9158, 77842, 120664, 5768, 0, 0, 0, 484, 194739, 0, 0, 65895, 0, 0, 3338, + 73935, 572, 7041, 2736, 67605, 0, 128680, 2794, 8807, 64491, 77847, 5438, + 5222, 5381, 43114, 0, 5193, 5125, 5456, 5509, 77846, 194747, 9534, 0, 0, + 0, 3430, 0, 0, 0, 0, 981, 0, 4330, 73929, 120536, 1824, 10908, 0, 7034, + 41683, 64617, 0, 73754, 3957, 64358, 64547, 128259, 674, 63991, 0, 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, 0, 0, 11739, 0, + 41981, 0, 5938, 0, 0, 12448, 7576, 10401, 10337, 73852, 0, 13057, 0, + 126976, 0, 10009, 0, 41703, 0, 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, 11733, 0, 120792, 0, 19944, 0, 9009, 8551, 92345, 11468, + 64636, 7575, 0, 2724, 0, 0, 12313, 110592, 515, 119947, 42791, 63987, + 78286, 119943, 119940, 119941, 119938, 9775, 4046, 4589, 4521, 68629, + 9141, 0, 78850, 2741, 64399, 6197, 1370, 0, 0, 0, 0, 0, 0, 6184, 8606, + 3303, 41372, 11786, 9473, 66203, 66177, 92446, 11593, 43007, 4478, 66178, + 0, 0, 2744, 0, 4477, 118964, 814, 42066, 66183, 66204, 43786, 119961, + 66198, 41880, 66188, 66197, 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, 0, 68625, 0, 7269, + 0, 5964, 12908, 0, 0, 74764, 74477, 119146, 194936, 4949, 0, 443, 0, + 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, 119829, 119832, 4677, + 12688, 3102, 0, 4672, 78173, 78175, 5531, 68367, 42575, 78170, 78166, + 4674, 4548, 44005, 119949, 68658, 119946, 8025, 68630, 127024, 1855, 0, + 68669, 0, 92445, 127554, 0, 0, 119652, 2745, 11797, 0, 128159, 9202, + 4654, 0, 0, 68638, 73993, 10525, 4649, 65209, 0, 0, 4648, 43080, 0, 0, 0, + 6246, 64950, 7828, 4650, 6777, 6776, 6775, 4653, 7822, 78005, 92384, + 43187, 8669, 0, 6821, 65093, 0, 78881, 2716, 0, 0, 0, 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, 0, 0, 0, + 64904, 9026, 10833, 74864, 7547, 4867, 0, 10008, 10222, 3054, 194956, + 9744, 78860, 7605, 4622, 119656, 0, 0, 0, 0, 0, 9045, 78888, 4225, 19926, + 78887, 12880, 65307, 4617, 78883, 0, 41732, 4616, 10518, 10423, 10359, 0, + 5958, 0, 0, 4215, 9789, 917941, 4321, 4621, 0, 41313, 522, 5368, 0, + 65803, 0, 5366, 12201, 5372, 0, 0, 0, 7720, 7390, 2696, 0, 0, 4638, 0, + 1790, 78242, 5965, 64363, 66569, 68646, 194968, 5376, 1835, 5335, 194966, + 128089, 4633, 0, 68119, 1180, 4632, 128093, 5387, 5333, 0, 0, 42094, + 5331, 4634, 11928, 0, 5338, 4637, 128170, 5971, 42414, 0, 1268, 65097, + 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, 10358, 10422, 4758, 0, + 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231, 74384, 0, + 68377, 6248, 0, 0, 0, 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, 92230, 10108, 1011, 5574, 1853, 2709, 65139, + 5577, 0, 0, 118871, 68641, 8965, 7635, 42177, 5316, 0, 5314, 6451, 5572, + 0, 5312, 0, 5525, 5330, 5319, 0, 0, 194907, 44003, 0, 0, 0, 120498, + 127851, 195009, 0, 74022, 0, 64609, 68643, 120634, 0, 5721, 0, 5519, + 8632, 66465, 11267, 73961, 92278, 5720, 0, 1692, 4219, 4610, 8696, 4305, + 0, 4609, 43478, 4614, 541, 0, 5287, 5309, 5285, 68389, 5961, 4647, 56, + 4216, 10577, 41381, 601, 4613, 0, 0, 92276, 4608, 64260, 41124, 5190, + 67628, 0, 68145, 7086, 0, 119243, 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, 0, 4869, 120563, 0, 4223, 128201, 6650, 0, + 0, 0, 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, 0, 4778, 0, 10863, 0, 4781, 0, 64407, 0, 0, 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, 43278, 42635, 0, 0, 5963, 917926, 0, 0, + 4850, 0, 1607, 466, 4853, 118995, 4854, 127918, 5164, 0, 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, + 0, 303, 0, 92622, 0, 2437, 0, 4221, 4844, 118869, 0, 0, 0, 0, 0, 43292, + 0, 2441, 10739, 65090, 0, 119327, 0, 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, + 0, 4942, 9539, 4938, 0, 65201, 5259, 9369, 64185, 4142, 5257, 0, 0, 4964, + 5264, 64178, 64177, 12979, 41411, 64182, 64181, 64180, 64179, 9482, 4873, + 41231, 1822, 42526, 128581, 12758, 3865, 0, 0, 10500, 0, 0, 78028, 0, + 9830, 43642, 389, 10893, 7521, 127879, 4872, 5463, 0, 3125, 9567, 0, + 4878, 5459, 4604, 917931, 9557, 5465, 68617, 0, 11494, 0, 9563, 10865, + 74570, 43279, 64186, 0, 78714, 64191, 64190, 8898, 64188, 0, 41030, + 78836, 0, 917835, 78820, 917834, 0, 78805, 41031, 78801, 11960, 6745, + 3082, 0, 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, 0, 42156, 78688, 0, 64193, 64192, + 65223, 9943, 64197, 64196, 64195, 64194, 13282, 64175, 64174, 64173, + 78189, 846, 78186, 9965, 0, 0, 0, 0, 2543, 12163, 3108, 9745, 64167, + 64166, 64165, 64164, 2110, 92176, 64169, 64168, 64949, 10972, 10251, + 10247, 42768, 715, 64161, 43299, 9453, 5348, 10943, 120378, 0, 11352, + 550, 9910, 0, 0, 66579, 11551, 0, 195080, 9504, 7187, 0, 10373, 0, 120791, 10261, 10253, 6404, 10277, 78183, 11984, 1552, 65222, 6998, 78180, 0, 3128, 4789, 5067, 5066, 118849, 4784, 0, 8827, 1146, 5065, 78196, 78192, 68136, 78190, 43412, 5064, 2431, 0, 9450, 1809, 0, 78200, 78201, 5062, 1264, 64817, 13254, 11697, 0, 9785, 64716, 0, 3933, 74559, 4740, 7954, 0, 0, 42609, 0, 74175, 0, 127016, 0, 0, 42130, 0, 5151, 917829, 917823, 0, 0, 0, 7620, 3800, 65122, 0, 0, 8355, 7854, 0, 954, - 64927, 4185, 41045, 0, 41438, 41439, 68666, 10711, 4593, 0, 120584, 0, - 64774, 8053, 10532, 66727, 0, 0, 0, 64759, 6381, 5166, 9888, 0, 5148, - 42834, 0, 78205, 78206, 64140, 78204, 64131, 3119, 917814, 0, 3060, - 64135, 9986, 0, 77876, 636, 11698, 0, 0, 9916, 11701, 7836, 42741, 64137, - 8320, 78640, 8863, 0, 119960, 1477, 43289, 0, 74358, 8618, 0, 9908, 0, 0, - 0, 3937, 12312, 0, 0, 0, 64781, 912, 6349, 4536, 119963, 74532, 0, 6244, - 0, 194580, 3935, 120665, 0, 0, 11950, 5392, 42248, 65129, 68656, 5397, 0, - 12046, 12599, 0, 0, 5395, 0, 5393, 354, 68615, 119948, 78503, 0, 0, - 42039, 0, 0, 64142, 626, 0, 5895, 0, 0, 5780, 0, 0, 0, 0, 0, 43297, 0, - 4311, 4644, 8818, 0, 0, 0, 73818, 3918, 66452, 3797, 1644, 119944, 9658, - 4140, 11385, 65947, 6455, 9030, 813, 119945, 68131, 4146, 119957, 5360, - 2466, 0, 67669, 0, 6249, 42117, 0, 0, 0, 0, 74046, 120583, 4911, 988, - 917807, 0, 0, 43061, 7054, 64147, 0, 64920, 68195, 6698, 118933, 120349, - 0, 0, 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, 917866, 73736, 0, 9825, 6448, 6715, 127008, 4831, 0, 0, 0, - 5300, 4741, 42108, 0, 64159, 4736, 64148, 0, 849, 0, 78491, 43288, 0, - 66620, 0, 194920, 65549, 9496, 64598, 118866, 0, 7876, 68132, 917872, - 3928, 917870, 43378, 10706, 7198, 0, 4842, 12053, 0, 0, 4841, 0, 4171, - 12008, 6251, 3923, 1490, 0, 119591, 0, 40972, 5245, 0, 10114, 42001, - 41888, 4845, 8332, 40974, 64347, 4840, 9077, 78346, 1747, 917849, 4825, - 69240, 917852, 68655, 0, 0, 0, 0, 68628, 0, 9850, 118937, 367, 1472, - 917859, 6687, 1274, 0, 5905, 12339, 8919, 73953, 10907, 65261, 11023, - 119559, 4830, 9134, 78666, 64126, 43011, 0, 0, 64101, 0, 0, 4824, 10614, - 120390, 0, 1888, 1960, 7861, 917856, 78524, 41836, 43012, 6052, 6064, 54, - 43009, 12214, 0, 6211, 0, 358, 41997, 41833, 11442, 10758, 65774, 0, - 120384, 64115, 120385, 0, 0, 0, 119053, 0, 12765, 64118, 126998, 12962, - 0, 0, 4017, 12827, 5241, 120392, 0, 41118, 3924, 0, 11366, 917843, 0, 0, - 917846, 41116, 917844, 917564, 0, 11363, 12057, 11917, 1567, 74000, 4721, - 0, 66202, 8957, 4139, 0, 0, 0, 0, 0, 12740, 0, 4722, 6816, 0, 12759, - 4725, 0, 4726, 0, 0, 0, 917904, 917905, 0, 12755, 12762, 4015, 0, 8052, - 476, 0, 0, 0, 64212, 41020, 1382, 64209, 64216, 64215, 64214, 1656, - 41831, 0, 0, 41843, 8720, 3908, 1452, 13111, 0, 64067, 0, 8552, 64113, - 41845, 3849, 78732, 66232, 9778, 120066, 5891, 7064, 55, 9948, 917911, 0, - 0, 7935, 67586, 0, 1114, 0, 67585, 78675, 120053, 120050, 120051, 3938, + 64927, 4185, 41045, 127141, 41438, 41439, 68666, 10711, 4593, 127745, + 120584, 0, 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, 0, 9916, 11701, 7836, + 42741, 64137, 8320, 78640, 8863, 92431, 119960, 1477, 43289, 0, 74358, + 8618, 0, 9908, 0, 0, 0, 3937, 12312, 0, 0, 0, 64781, 912, 6349, 4536, + 119963, 74532, 0, 6244, 0, 194580, 3935, 120665, 0, 0, 11950, 5392, + 42248, 65129, 68656, 5397, 0, 12046, 12599, 0, 0, 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, 0, 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, 120583, 4911, 988, 917807, 0, 0, 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, 0, 9825, 6448, 6715, 127008, 4831, 0, 92525, 0, 5300, 4741, 42108, + 0, 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, 66620, 0, 127331, + 65549, 9496, 64598, 118866, 0, 7876, 68132, 917872, 3928, 917870, 43378, + 10706, 7198, 0, 4842, 12053, 128129, 0, 4841, 0, 4171, 12008, 6251, 3923, + 1490, 0, 119591, 0, 40972, 5245, 0, 10114, 42001, 41888, 4845, 8332, + 40974, 64347, 4840, 9077, 78346, 1747, 917849, 4825, 69240, 917852, + 68655, 0, 0, 0, 0, 68628, 0, 9850, 118937, 367, 1472, 917859, 6687, 1274, + 0, 5905, 12339, 8919, 73953, 10907, 65261, 11023, 119559, 4830, 9134, + 78666, 64126, 43011, 0, 0, 64101, 0, 0, 4824, 10614, 120390, 0, 1888, + 1960, 7861, 917856, 78524, 41836, 43012, 6052, 6064, 54, 43009, 12214, 0, + 6211, 0, 358, 41997, 41833, 11442, 10758, 65774, 0, 120384, 64115, 92221, + 0, 0, 0, 119053, 0, 12765, 64118, 126998, 12962, 0, 0, 4017, 12827, 5241, + 120392, 0, 41118, 3924, 0, 11366, 917843, 0, 0, 917846, 41116, 917844, + 917564, 0, 11363, 12057, 11917, 1567, 74000, 4721, 0, 66202, 8957, 4139, + 0, 0, 0, 0, 0, 12740, 128702, 4722, 6816, 127793, 12759, 4725, 0, 4726, + 0, 0, 0, 917904, 917905, 0, 12755, 12762, 4015, 0, 8052, 476, 0, 0, + 128294, 64212, 41020, 1382, 64209, 64216, 64215, 64214, 1656, 41831, 0, + 0, 41843, 8720, 3908, 1452, 13111, 0, 64067, 127328, 8552, 64113, 41845, + 3849, 78732, 66232, 9778, 120066, 5891, 7064, 55, 9948, 119085, 0, 0, + 7935, 2420, 0, 1114, 92599, 67585, 78675, 120053, 92350, 120051, 3938, 120057, 65417, 64717, 120060, 120061, 65415, 120059, 6292, 65303, 7955, - 6452, 4713, 917887, 66249, 917885, 917890, 917891, 65152, 719, 120044, + 6452, 4713, 128196, 66249, 917885, 917890, 917891, 65152, 719, 120044, 78623, 120042, 6713, 4532, 65412, 69822, 10868, 4717, 2349, 5902, 66450, 4712, 917902, 917899, 917900, 65416, 8155, 4718, 3942, 4714, 9625, 0, - 6383, 0, 12006, 0, 0, 0, 0, 0, 65414, 6454, 1229, 0, 66437, 66025, 78699, - 0, 42500, 120508, 4809, 9623, 917874, 78694, 917880, 917877, 917878, - 65405, 68159, 917881, 917882, 5365, 4545, 8901, 917566, 119555, 4813, 0, - 0, 5925, 4808, 64330, 0, 65475, 118940, 0, 4814, 0, 4810, 0, 0, 64928, - 10543, 0, 3522, 0, 414, 65404, 0, 0, 6456, 73820, 0, 6691, 42193, 0, 0, - 0, 74495, 0, 0, 0, 118820, 9751, 65407, 0, 11770, 3919, 0, 0, 65061, 0, - 0, 0, 12235, 0, 0, 195025, 64092, 0, 64080, 0, 64090, 0, 0, 10162, 10310, - 0, 8454, 0, 42038, 387, 41363, 12737, 0, 4780, 43368, 0, 64310, 64621, - 6732, 0, 0, 0, 0, 0, 8896, 0, 375, 6976, 66582, 119005, 0, 0, 0, 119202, - 119203, 12526, 43120, 2315, 0, 1938, 119197, 0, 4529, 119200, 119201, - 119198, 119199, 0, 0, 0, 13150, 64492, 0, 0, 0, 12902, 0, 42891, 66327, - 74298, 0, 10799, 0, 2587, 66372, 0, 4193, 120334, 4241, 0, 7998, 0, 0, 0, - 0, 2316, 118821, 0, 0, 0, 64297, 74799, 0, 74140, 0, 5373, 0, 0, 3762, - 10015, 0, 119232, 0, 41590, 0, 0, 3780, 7485, 5779, 0, 42037, 0, 3906, - 12349, 0, 8326, 0, 65498, 3763, 6983, 5618, 0, 3779, 0, 43613, 0, 0, 0, - 0, 0, 0, 280, 74558, 0, 68138, 13072, 1894, 0, 0, 65478, 43310, 7231, 0, - 11773, 0, 0, 0, 0, 2551, 0, 6453, 10200, 6235, 0, 119237, 0, 0, 4470, - 119613, 0, 7780, 5369, 118958, 5249, 0, 5367, 8756, 0, 0, 5377, 120585, - 68143, 1688, 78245, 0, 0, 0, 0, 0, 44020, 6808, 41319, 1300, 10650, - 41692, 64505, 4668, 0, 119624, 1465, 10850, 3943, 0, 41205, 41315, 0, 0, - 0, 5352, 0, 0, 8839, 41314, 7384, 7785, 41204, 0, 41209, 0, 0, 43607, 0, - 0, 5420, 3897, 0, 0, 74417, 4018, 0, 68127, 0, 0, 0, 0, 127526, 2561, - 68621, 3542, 41915, 12076, 7951, 68152, 118857, 5303, 6276, 1706, 0, - 78751, 74116, 0, 65150, 41819, 0, 73951, 10847, 41822, 9985, 860, 0, - 10506, 0, 0, 10753, 10830, 0, 615, 64490, 7574, 0, 77922, 0, 12909, - 43016, 64559, 127028, 0, 0, 0, 2020, 0, 4022, 0, 0, 77923, 0, 41691, 0, - 0, 74329, 0, 64622, 9070, 0, 68411, 3911, 42829, 43122, 1033, 74440, 0, - 7000, 3904, 0, 0, 0, 0, 127012, 13123, 10846, 3450, 0, 7397, 118807, 0, - 42778, 10000, 41088, 449, 0, 3777, 68458, 0, 9636, 0, 10738, 0, 9367, + 6383, 194744, 12006, 128565, 0, 0, 0, 0, 65414, 6454, 1229, 0, 66437, + 66025, 78699, 0, 42500, 120508, 4809, 9623, 917874, 78694, 917880, + 917877, 917878, 65405, 68159, 12893, 917882, 5365, 4545, 8901, 92421, + 119555, 4813, 128262, 0, 5925, 4808, 64330, 0, 65475, 118940, 195028, + 4814, 0, 4810, 0, 0, 64928, 10543, 0, 3522, 0, 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, 0, 64080, 0, 64090, 0, 0, 10162, 10310, 0, 8454, 127888, + 42038, 387, 41363, 12737, 0, 4780, 43368, 0, 64310, 64621, 6732, 0, 0, 0, + 0, 0, 8896, 0, 375, 6976, 66582, 119005, 0, 0, 0, 119202, 119203, 12526, + 43120, 2315, 0, 1938, 119197, 0, 4529, 119200, 119201, 119198, 119199, + 69692, 0, 69698, 13150, 64492, 0, 0, 0, 12902, 0, 42891, 66327, 74298, 0, + 10799, 69690, 2587, 66372, 0, 4193, 92250, 4241, 0, 7998, 0, 0, 0, 0, + 2316, 118821, 0, 0, 0, 64297, 74799, 92442, 74140, 0, 5373, 0, 0, 3762, + 10015, 127335, 119232, 0, 41590, 0, 92378, 3780, 7485, 5779, 0, 42037, 0, + 3906, 12349, 0, 8326, 0, 65498, 3763, 6983, 5618, 0, 3779, 0, 43613, 0, + 0, 0, 0, 0, 0, 280, 74558, 127332, 68138, 13072, 1894, 0, 0, 65478, + 43310, 7231, 0, 11773, 0, 0, 0, 0, 2551, 0, 6453, 10200, 6235, 0, 119237, + 0, 128805, 4470, 119613, 917557, 7780, 5369, 118958, 5249, 0, 5367, 8756, + 127143, 0, 5377, 120585, 68143, 1688, 78245, 0, 69685, 0, 0, 0, 44020, + 6808, 41319, 1300, 10650, 41692, 64505, 4668, 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, 0, 69641, 10753, + 10830, 0, 615, 64490, 7574, 92617, 77922, 0, 12909, 43016, 64559, 127028, + 0, 0, 0, 2020, 0, 4022, 128783, 0, 77923, 0, 41691, 0, 0, 74329, 0, + 64622, 9070, 0, 68411, 3911, 42829, 43122, 1033, 74440, 0, 7000, 3904, 0, + 128198, 0, 118931, 119630, 13123, 10846, 3450, 127360, 7397, 118807, 0, + 42778, 10000, 41088, 449, 0, 3777, 68458, 0, 9636, 0, 10738, 69634, 9367, 593, 41085, 3999, 65226, 41713, 12764, 0, 64409, 3596, 0, 0, 9763, - 120280, 120283, 12347, 124, 12981, 41127, 2092, 0, 0, 0, 0, 10820, 43987, - 0, 0, 1769, 41715, 2463, 78489, 0, 12770, 0, 1538, 0, 43124, 0, 195058, - 7795, 120300, 0, 4828, 1258, 0, 2006, 0, 0, 9498, 127032, 127033, 120289, - 120288, 3939, 120290, 8846, 8943, 120287, 120286, 2650, 4491, 1961, - 42602, 11525, 120292, 1959, 120294, 55228, 11774, 41016, 0, 68675, 0, - 1511, 9324, 78211, 10519, 66331, 3454, 19930, 0, 41019, 0, 0, 65292, - 6822, 12862, 0, 0, 42143, 41828, 78207, 65531, 78208, 118879, 55223, 0, - 0, 41826, 8865, 6402, 0, 13279, 7917, 120340, 0, 7733, 0, 4998, 0, 0, - 41950, 0, 4268, 0, 0, 0, 4013, 0, 10881, 0, 0, 0, 74788, 2014, 0, 0, - 9765, 0, 0, 0, 195059, 78357, 65281, 0, 10949, 0, 0, 0, 2015, 0, 0, 0, - 66318, 43233, 0, 42517, 0, 0, 0, 12698, 8094, 43445, 65909, 6474, 794, 0, - 12656, 0, 119353, 0, 1665, 0, 4833, 0, 119351, 0, 0, 189, 12611, 0, 0, - 2859, 4838, 0, 4834, 65078, 0, 0, 4837, 0, 770, 0, 811, 0, 41042, 917551, - 41318, 64427, 0, 0, 78848, 3895, 0, 74341, 3976, 0, 42859, 10193, 3116, - 7747, 0, 0, 0, 0, 0, 43686, 78846, 41877, 0, 2871, 64614, 0, 999, 0, - 6345, 41876, 2663, 2017, 0, 0, 11040, 10150, 0, 64308, 1522, 597, 4775, - 12555, 12571, 12550, 12583, 12560, 2019, 12556, 12584, 3092, 0, 12562, - 4783, 12566, 12569, 12554, 0, 10812, 78851, 0, 0, 3078, 1402, 0, 0, 0, 0, - 119248, 394, 3088, 0, 0, 0, 3991, 64391, 0, 0, 424, 66328, 1999, 0, - 73914, 0, 0, 0, 0, 42231, 8246, 0, 0, 0, 41840, 0, 2377, 1298, 64011, - 12572, 11318, 12557, 12559, 12570, 8488, 1003, 2373, 9446, 7481, 9448, - 48, 0, 9480, 481, 0, 9438, 9439, 9440, 9441, 8465, 9443, 9444, 9445, - 9430, 9431, 9432, 9433, 9434, 9435, 3984, 9437, 0, 0, 9424, 9425, 9426, - 9427, 9428, 9429, 64758, 0, 9655, 0, 2004, 9096, 9782, 0, 9172, 0, 19965, - 0, 5955, 67666, 1108, 0, 74773, 0, 0, 64782, 3926, 0, 65210, 8798, 0, 0, - 1392, 0, 0, 917557, 10606, 8065, 118805, 10353, 10417, 0, 0, 64524, 0, - 4019, 0, 0, 43280, 8219, 68402, 1812, 0, 0, 0, 0, 42410, 74448, 119132, - 6054, 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 0, 0, 68678, 0, 0, - 1049, 0, 65707, 2304, 41806, 0, 42336, 3921, 0, 11775, 64760, 11766, - 1038, 42303, 9823, 127278, 69236, 4008, 64004, 8773, 10733, 36, 0, 5153, - 41805, 0, 73735, 763, 41808, 64910, 0, 2009, 0, 0, 0, 9640, 119951, 0, - 120695, 8621, 0, 12852, 3031, 0, 64361, 0, 182, 194718, 0, 0, 119950, 0, - 9058, 366, 0, 9892, 5969, 11754, 10848, 4570, 65301, 44013, 4255, 0, - 10102, 41189, 4003, 41026, 68109, 13293, 41192, 0, 0, 42251, 0, 42534, - 65179, 11287, 6128, 0, 11034, 10923, 64423, 0, 65506, 0, 0, 74083, 0, - 9932, 0, 0, 119955, 0, 9817, 0, 120140, 0, 12117, 66586, 4183, 10540, - 66250, 9063, 127045, 0, 119954, 0, 12897, 3792, 2011, 0, 6065, 43160, 0, - 194715, 8692, 41186, 41816, 41023, 41818, 41187, 11659, 7922, 12614, - 2005, 8523, 78002, 0, 7513, 1863, 4710, 0, 5956, 7621, 78006, 127116, - 4705, 716, 78004, 0, 4704, 120040, 120270, 42241, 161, 43977, 74546, - 66214, 4706, 0, 0, 42672, 4709, 10680, 0, 43293, 0, 0, 119164, 120328, 0, - 0, 1700, 119223, 0, 0, 0, 4004, 0, 10968, 43296, 0, 8506, 0, 0, 126996, - 1005, 937, 78216, 4734, 2870, 0, 78218, 0, 7463, 4729, 0, 235, 1384, - 4728, 0, 120420, 120644, 120421, 8109, 43105, 0, 4730, 447, 13186, 1513, - 4733, 120415, 0, 0, 42527, 12911, 43427, 1383, 8565, 2469, 120024, 6690, - 6156, 68117, 43439, 7993, 4288, 120416, 2674, 13238, 11922, 0, 120330, - 3510, 13234, 0, 120407, 5605, 42095, 11364, 0, 1380, 65617, 120253, - 120261, 13196, 13197, 120309, 120682, 9495, 119346, 0, 5959, 0, 73976, - 120305, 43371, 6941, 119349, 13205, 13211, 5801, 12769, 65905, 41697, - 1283, 120302, 4779, 0, 3719, 4006, 0, 19957, 0, 2021, 119332, 0, 0, - 43028, 65493, 41838, 3875, 5962, 64341, 119339, 9814, 43457, 5827, 3314, - 7787, 78234, 65494, 68153, 0, 0, 120636, 64531, 120692, 0, 0, 0, 66316, - 65467, 5771, 41298, 0, 9742, 521, 0, 10800, 0, 8404, 194625, 483, 7096, - 7089, 66323, 928, 0, 0, 119018, 10599, 11586, 3989, 10971, 0, 65782, - 9841, 8843, 12145, 0, 10074, 78548, 0, 3769, 0, 0, 0, 0, 9573, 0, 65290, - 8849, 0, 65855, 65112, 1796, 120505, 0, 78555, 8164, 41301, 3502, 0, + 120280, 92192, 12347, 124, 12981, 41127, 2092, 92687, 0, 0, 0, 10820, + 43987, 0, 0, 1769, 41715, 2463, 78489, 0, 12770, 0, 1538, 0, 43124, 0, + 195058, 7795, 120300, 0, 4828, 1258, 127802, 2006, 0, 0, 9498, 127032, + 127033, 120289, 120288, 3939, 120290, 8846, 8943, 120287, 120286, 2650, + 4491, 1961, 42602, 11525, 120292, 1959, 120294, 55228, 11774, 41016, 0, + 68675, 128054, 1511, 9324, 78211, 10519, 66331, 3454, 19930, 0, 41019, 0, + 0, 65292, 6822, 12862, 0, 0, 42143, 41828, 78207, 65531, 78208, 118879, + 55223, 0, 0, 41826, 8865, 6402, 0, 13279, 7917, 120340, 0, 7733, 0, 4998, + 0, 92332, 41950, 0, 4268, 0, 0, 0, 4013, 0, 10881, 0, 0, 0, 74788, 2014, + 0, 0, 9765, 0, 0, 0, 195059, 78357, 65281, 127825, 10949, 0, 0, 0, 2015, + 0, 0, 0, 66318, 43233, 0, 42517, 0, 0, 0, 12698, 8094, 10135, 65909, + 6474, 794, 0, 12656, 128122, 119353, 128270, 1665, 0, 4833, 0, 119351, + 127367, 0, 189, 12611, 0, 0, 2859, 4838, 0, 4834, 65078, 0, 0, 4837, + 127061, 770, 0, 811, 0, 41042, 917551, 41318, 64427, 0, 0, 78848, 3895, + 0, 74341, 3976, 0, 42859, 10193, 3116, 7747, 0, 0, 0, 0, 0, 43686, 78846, + 41877, 0, 2871, 64614, 128785, 999, 0, 6345, 41876, 2663, 2017, 0, 0, + 11040, 10150, 0, 64308, 1522, 597, 4775, 12555, 12571, 12550, 12583, + 12560, 2019, 12556, 12584, 3092, 0, 12562, 4783, 12566, 12569, 12554, 0, + 10812, 78851, 0, 0, 3078, 1402, 0, 128275, 0, 0, 119248, 394, 3088, 0, + 92172, 0, 3991, 64391, 0, 0, 424, 66328, 1999, 69659, 73914, 0, 0, 0, 0, + 42231, 8246, 0, 0, 0, 41840, 0, 2377, 1298, 64011, 12572, 11318, 12557, + 12559, 12570, 8488, 1003, 2373, 9446, 7481, 9448, 48, 0, 9480, 481, 0, + 9438, 9439, 9440, 9441, 8465, 9443, 9444, 9445, 9430, 9431, 9432, 9433, + 9434, 9435, 3984, 9437, 0, 0, 9424, 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, 0, 43280, 8219, 68402, 1812, 0, 0, 0, 0, 42410, 74448, + 119132, 6054, 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 128139, 0, + 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, 0, 2009, 0, 0, 127142, + 9640, 119951, 0, 120695, 8621, 0, 12852, 3031, 0, 64361, 0, 182, 194718, + 92716, 92598, 119950, 0, 9058, 366, 0, 9892, 5969, 11754, 10848, 4570, + 65301, 44013, 4255, 0, 10102, 41189, 4003, 41026, 68109, 13293, 41192, + 69635, 0, 42251, 0, 42534, 65179, 11287, 6128, 0, 11034, 10923, 64423, 0, + 65506, 0, 65861, 74083, 92600, 9932, 0, 92423, 119955, 0, 9817, 0, + 120140, 0, 12117, 66586, 4183, 10540, 66250, 9063, 127045, 0, 119954, 0, + 12897, 3792, 2011, 0, 6065, 43160, 0, 194715, 8692, 41186, 41816, 41023, + 41818, 41187, 11659, 7922, 12614, 2005, 8523, 78002, 0, 7513, 1863, 4710, + 0, 5956, 7621, 78006, 92624, 4705, 716, 78004, 0, 4704, 120040, 120270, + 42241, 161, 43977, 74546, 66214, 4706, 0, 0, 42672, 4709, 10680, 0, + 43293, 119944, 0, 119164, 120328, 92467, 0, 1700, 119223, 0, 0, 128119, + 4004, 0, 10968, 43296, 0, 8506, 0, 0, 126996, 1005, 937, 78216, 4734, + 2870, 0, 78218, 0, 7463, 4729, 0, 235, 1384, 4728, 0, 120420, 92490, + 120331, 8109, 43105, 0, 4730, 447, 13186, 1513, 4733, 120415, 0, 0, + 42527, 12911, 43427, 1383, 8565, 2469, 120024, 6690, 6156, 68117, 43439, + 7993, 4288, 120416, 2674, 13238, 11922, 0, 120330, 3510, 13234, 0, + 120407, 5605, 42095, 11364, 0, 1380, 65617, 120253, 120261, 13196, 13197, + 120309, 120682, 9495, 119346, 0, 5959, 0, 73976, 120305, 43371, 6941, + 119349, 13205, 13211, 5801, 12769, 65905, 41697, 1283, 120302, 4779, 0, + 3719, 4006, 0, 19957, 128773, 2021, 119332, 120699, 119150, 43028, 65493, + 41838, 3875, 5962, 64341, 92616, 9814, 43457, 5827, 3314, 7787, 78234, + 65494, 68153, 0, 0, 120636, 64531, 120692, 194626, 0, 0, 66316, 65467, + 5771, 41298, 0, 9742, 521, 0, 10800, 0, 8404, 194625, 483, 7096, 7089, + 66323, 928, 0, 0, 119018, 10599, 11586, 3989, 10971, 0, 65782, 9841, + 8843, 12145, 92470, 10074, 78548, 0, 3769, 0, 0, 0, 0, 9573, 0, 65290, + 8849, 0, 65855, 65112, 1796, 120505, 0, 69665, 8164, 41301, 3502, 0, 7388, 10621, 73838, 78553, 5825, 13007, 68165, 0, 120457, 12661, 7608, 10354, 10418, 42411, 2022, 0, 1409, 12195, 4001, 3112, 10824, 120639, - 1390, 0, 0, 421, 43536, 5846, 120120, 4130, 0, 7595, 42588, 7600, 120121, - 66035, 0, 0, 65851, 42607, 0, 0, 3168, 0, 42134, 0, 2370, 2846, 0, 0, 0, - 120132, 0, 1836, 0, 0, 119137, 3740, 0, 6290, 65374, 120451, 65923, 3944, - 66628, 120434, 0, 6135, 3118, 74265, 119093, 120446, 0, 0, 8127, 8975, - 64739, 7943, 0, 0, 10618, 2584, 0, 0, 0, 9998, 0, 0, 0, 0, 0, 6204, 0, 0, - 8279, 8776, 64954, 4975, 74809, 120130, 4267, 0, 42206, 0, 0, 195046, - 65700, 66562, 0, 64645, 0, 0, 0, 12586, 0, 9242, 0, 0, 4523, 5842, 10495, - 3122, 0, 7793, 78275, 9328, 0, 0, 12604, 0, 6615, 67650, 0, 3986, 44025, - 0, 8912, 64555, 7409, 0, 0, 9541, 78276, 0, 11275, 8540, 11498, 0, 0, - 41040, 2459, 0, 13060, 41041, 74413, 0, 0, 0, 68427, 10450, 12551, 41043, - 7020, 120353, 3765, 0, 0, 1606, 120348, 120351, 3093, 68436, 0, 0, - 120649, 0, 0, 4312, 74091, 120337, 120336, 11923, 4023, 120333, 5763, - 120335, 4827, 10894, 12810, 64406, 118785, 4455, 74321, 433, 119620, - 66660, 2499, 0, 0, 0, 11973, 13089, 4293, 120329, 42224, 42758, 12196, - 42837, 42226, 119319, 0, 119126, 5817, 0, 55277, 3120, 9797, 0, 0, 0, - 10389, 0, 0, 4895, 65358, 0, 4359, 585, 0, 3509, 0, 486, 4290, 5758, 0, - 0, 0, 7004, 0, 65880, 0, 119048, 2380, 11380, 0, 0, 2376, 0, 917847, 0, + 1390, 0, 0, 421, 43536, 5846, 120120, 4130, 127775, 7595, 42588, 7600, + 120121, 66035, 0, 0, 65851, 42607, 128190, 92403, 3168, 0, 42134, 0, + 2370, 2846, 92605, 0, 0, 120132, 0, 1836, 0, 0, 92558, 3740, 92547, 6290, + 65374, 120451, 2390, 3944, 66628, 120434, 0, 6135, 3118, 74265, 119093, + 120446, 0, 0, 8127, 8975, 64739, 7943, 0, 0, 10618, 2584, 0, 0, 0, 9998, + 0, 0, 0, 0, 0, 6204, 0, 0, 8279, 8776, 64954, 4975, 74809, 120130, 4267, + 1631, 42206, 127866, 0, 195046, 65700, 66562, 0, 64645, 0, 0, 0, 12586, + 0, 9242, 127922, 0, 4523, 5842, 10495, 3122, 0, 7793, 78275, 9328, 0, + 78393, 12604, 0, 6615, 67650, 92344, 3986, 44025, 0, 8912, 64555, 7409, + 0, 0, 9541, 78276, 0, 11275, 8540, 11498, 0, 0, 41040, 2459, 0, 13060, + 41041, 74413, 0, 0, 0, 68427, 10450, 12551, 41043, 7020, 120353, 3765, 0, + 0, 1606, 120348, 120351, 3093, 68436, 0, 0, 120649, 0, 0, 4312, 74091, + 120337, 120336, 11923, 4023, 120333, 5763, 120335, 4827, 10894, 12810, + 64406, 118785, 4455, 74321, 433, 119620, 66660, 2499, 0, 0, 0, 11973, + 13089, 4293, 120329, 42224, 42758, 12196, 42837, 42226, 119319, 0, + 119126, 5817, 127806, 55277, 3120, 9797, 0, 0, 0, 10389, 0, 0, 4895, + 65358, 0, 4359, 585, 2383, 3509, 194920, 486, 4290, 5758, 127546, 0, 0, + 7004, 0, 65880, 127886, 119048, 2380, 11380, 0, 0, 2376, 0, 119320, 0, 5197, 127046, 127047, 127048, 2366, 127050, 127051, 120554, 120045, 0, 0, - 0, 0, 0, 0, 0, 74188, 0, 0, 0, 120047, 0, 0, 0, 120049, 0, 1847, 0, - 10339, 0, 42384, 0, 4227, 74158, 0, 0, 43032, 0, 42365, 0, 12671, 11384, - 0, 0, 0, 64797, 0, 5820, 0, 120052, 120065, 0, 120064, 120650, 42137, - 9893, 2754, 12664, 120063, 0, 7377, 0, 41799, 65530, 1711, 12984, 43039, - 3114, 6255, 0, 118938, 0, 10853, 926, 0, 74184, 0, 120055, 0, 43175, 0, - 43037, 41798, 41035, 11583, 0, 41801, 119088, 0, 520, 4200, 12699, 8331, - 0, 3091, 41034, 127353, 0, 8360, 0, 78044, 321, 4229, 64543, 0, 65563, 0, - 917974, 2861, 0, 10095, 0, 0, 0, 1861, 0, 0, 0, 0, 43041, 0, 0, 0, 3859, - 12181, 41660, 8209, 0, 73867, 12973, 0, 74757, 127514, 41658, 0, 0, 5760, - 0, 743, 4414, 120766, 0, 42632, 917973, 65161, 73896, 0, 0, 1405, 119063, - 43220, 43341, 0, 19919, 0, 64532, 65367, 43710, 0, 0, 3513, 0, 118883, - 43342, 119064, 65529, 65364, 0, 0, 6485, 1397, 0, 41986, 0, 0, 0, 74097, - 0, 7471, 12079, 0, 12682, 43287, 0, 0, 0, 0, 0, 0, 1099, 10490, 0, 10501, - 65181, 74463, 0, 464, 41624, 65283, 67663, 78222, 1346, 0, 917631, 64724, - 64897, 423, 1818, 65144, 0, 8272, 0, 19911, 4218, 3087, 64960, 127234, - 43564, 0, 0, 9584, 10465, 0, 74359, 12626, 9106, 0, 42642, 0, 64750, - 9390, 0, 41797, 0, 0, 265, 41795, 64666, 0, 43530, 2752, 0, 0, 0, 59, 0, - 0, 0, 0, 77873, 41810, 0, 7010, 0, 41809, 41495, 119364, 0, 42252, 42213, - 8009, 3305, 43033, 511, 119320, 66255, 13127, 120067, 0, 0, 0, 917977, - 65915, 1400, 41812, 10685, 194870, 2103, 10387, 4453, 43276, 917783, - 13159, 0, 6481, 41213, 0, 0, 0, 0, 41983, 74198, 6617, 9116, 119654, 0, - 462, 68110, 10493, 0, 8129, 0, 0, 74471, 6644, 11658, 0, 0, 3452, 11906, - 9581, 1385, 3098, 0, 119013, 43340, 0, 41033, 6493, 42626, 0, 0, 11426, - 0, 1681, 118789, 1204, 3755, 64661, 7235, 10170, 3966, 8911, 0, 41841, - 43338, 0, 0, 5726, 64915, 42175, 0, 0, 41497, 65044, 0, 2851, 43017, 0, - 0, 4373, 78058, 0, 9587, 1789, 6671, 0, 3100, 0, 65360, 0, 127510, 0, - 64922, 0, 8190, 12083, 0, 0, 6506, 64312, 74374, 2368, 0, 4419, 0, - 119125, 3439, 1825, 1192, 120106, 8891, 3080, 120228, 2347, 5430, 0, - 8990, 2848, 0, 0, 0, 249, 0, 0, 0, 120658, 0, 0, 8883, 917802, 728, - 68178, 995, 0, 0, 64826, 0, 917798, 0, 0, 19945, 8091, 558, 0, 12273, - 194814, 0, 12112, 0, 0, 0, 74419, 12335, 120104, 917795, 3443, 3129, 0, - 2102, 65445, 78258, 64891, 0, 7725, 0, 78255, 0, 8624, 69246, 12446, - 43295, 0, 41894, 0, 6277, 41672, 41893, 10010, 0, 3540, 0, 835, 0, 69816, - 119868, 74408, 0, 73959, 5426, 4258, 0, 0, 5424, 0, 8283, 0, 5434, 0, 0, - 19917, 11408, 0, 11947, 0, 1404, 3095, 11432, 194813, 3464, 6486, 4819, - 0, 0, 570, 8095, 3672, 119864, 1498, 67866, 0, 0, 431, 0, 0, 0, 0, 68167, - 0, 13096, 0, 0, 43408, 9516, 0, 5268, 42230, 42220, 0, 4450, 120723, - 11547, 43417, 0, 356, 3477, 227, 10488, 68203, 382, 11418, 0, 0, 0, 0, 0, - 0, 6484, 2541, 66039, 0, 78718, 0, 3549, 0, 9110, 119665, 2743, 0, 43290, - 194812, 9097, 0, 43015, 8782, 0, 776, 2524, 42707, 8573, 0, 0, 0, 0, - 42694, 64944, 8952, 3856, 118818, 0, 5872, 6495, 0, 0, 0, 0, 0, 120733, - 12849, 3953, 1897, 0, 65094, 11994, 4339, 74556, 0, 67843, 0, 0, 0, - 68473, 74104, 5228, 0, 7868, 43184, 0, 0, 73986, 43438, 0, 43022, 0, - 1162, 0, 2671, 0, 0, 0, 0, 118865, 4553, 73811, 0, 195005, 0, 0, 19921, - 74331, 11424, 195006, 4567, 41891, 0, 0, 55249, 4820, 65239, 194662, 0, - 0, 43042, 119212, 1377, 12869, 4897, 42821, 9250, 0, 4438, 64385, 0, - 1753, 11331, 6147, 194941, 43282, 8833, 0, 0, 6504, 78408, 126979, 10719, - 0, 1898, 1413, 42443, 0, 802, 12141, 0, 194671, 6648, 10671, 2528, 0, - 64789, 9169, 838, 127092, 120697, 844, 5014, 0, 256, 0, 9990, 0, 42739, - 0, 7542, 65464, 9726, 0, 6489, 10048, 74326, 78719, 66573, 0, 78724, - 78712, 11761, 194655, 0, 41094, 0, 0, 0, 0, 0, 6196, 6945, 194628, - 194890, 194631, 120491, 11816, 194943, 5733, 0, 0, 0, 41098, 0, 41093, 0, + 0, 0, 0, 0, 0, 74188, 120241, 0, 0, 120047, 128575, 0, 0, 120049, 0, + 1847, 0, 10339, 0, 42384, 0, 4227, 74158, 0, 92501, 43032, 0, 42365, 0, + 12671, 11384, 0, 0, 0, 64797, 0, 5820, 0, 120052, 120065, 0, 120064, + 120650, 42137, 9893, 2754, 12664, 120063, 0, 7377, 127867, 41799, 65530, + 1711, 12984, 43039, 3114, 6255, 0, 118938, 0, 10853, 926, 0, 74184, 0, + 120055, 0, 43175, 0, 43037, 41798, 41035, 11583, 127769, 41801, 119088, + 0, 520, 4200, 12699, 8331, 0, 3091, 41034, 127353, 0, 8360, 0, 78044, + 321, 4229, 64543, 917946, 65563, 0, 917974, 2861, 43793, 10095, 0, 9195, + 92386, 1861, 0, 73733, 0, 0, 43041, 0, 43794, 128530, 3859, 12181, 41660, + 8209, 0, 73867, 12973, 0, 74757, 127514, 41658, 0, 0, 5760, 0, 743, 4414, + 120766, 0, 42632, 917973, 65161, 73896, 128589, 0, 1405, 119063, 43220, + 43341, 0, 19919, 0, 64532, 65367, 43710, 0, 0, 3513, 0, 118883, 43342, + 119064, 65529, 65364, 128197, 0, 6485, 1397, 0, 41986, 92678, 0, 0, + 74097, 0, 7471, 12079, 0, 12682, 43287, 92317, 0, 0, 0, 0, 0, 1099, + 10490, 0, 10501, 65181, 74463, 0, 464, 41624, 65283, 67663, 78222, 1346, + 0, 917631, 64573, 64897, 423, 1818, 65144, 0, 8272, 127812, 19911, 4218, + 3087, 64960, 127234, 43564, 0, 0, 9584, 10465, 0, 74359, 12626, 9106, 0, + 42642, 120230, 64750, 9390, 0, 41797, 0, 0, 265, 41795, 64666, 0, 43530, + 2752, 0, 0, 0, 59, 0, 0, 0, 92371, 77873, 41810, 0, 7010, 0, 41809, + 41495, 119364, 0, 42252, 42213, 8009, 3305, 43033, 511, 92700, 66255, + 13127, 120067, 0, 0, 0, 917977, 65915, 1400, 41812, 10685, 194870, 2103, + 10387, 4453, 43276, 917783, 13159, 0, 6481, 41213, 0, 0, 0, 0, 41983, + 74198, 6617, 9116, 119654, 0, 462, 68110, 10493, 0, 8129, 0, 0, 74471, + 6644, 11658, 0, 128245, 3452, 11906, 9581, 1385, 3098, 0, 119013, 43340, + 0, 41033, 6493, 42626, 0, 0, 11426, 77887, 1681, 118789, 1204, 3755, + 64661, 7235, 10170, 3966, 8911, 0, 41841, 43338, 0, 0, 5726, 64915, + 42175, 0, 0, 41497, 65044, 120109, 2851, 43017, 0, 0, 4373, 78058, 0, + 9587, 1789, 6671, 128840, 3100, 0, 65360, 0, 92365, 0, 64922, 0, 8190, + 12083, 0, 0, 6506, 64312, 74374, 2368, 0, 4419, 0, 119125, 3439, 1825, + 1192, 120106, 8891, 3080, 120228, 2347, 5430, 0, 8990, 2848, 0, 128223, + 92528, 249, 0, 0, 0, 120658, 0, 0, 8883, 917802, 728, 68178, 995, 0, 0, + 64826, 0, 917798, 128348, 0, 19945, 8091, 558, 0, 12273, 194814, 0, + 12112, 0, 0, 0, 74419, 12335, 120104, 917795, 3443, 3129, 0, 2102, 65445, + 78258, 64891, 0, 7725, 65108, 78255, 0, 8624, 69246, 12446, 43295, 0, + 41894, 0, 6277, 41672, 41893, 10010, 128678, 3540, 128649, 835, 0, 69816, + 119868, 74408, 0, 73959, 5426, 4258, 0, 0, 5424, 128127, 8283, 0, 5434, + 0, 0, 19917, 11408, 0, 11947, 0, 1404, 3095, 11432, 128307, 3464, 6486, + 4819, 128233, 0, 570, 8095, 3672, 119864, 1498, 67866, 0, 0, 431, 0, 0, + 128182, 128096, 68167, 0, 13096, 128643, 0, 43408, 9516, 128538, 5268, + 42230, 42220, 0, 4450, 120511, 11547, 43417, 128542, 356, 3477, 227, + 10488, 68203, 382, 11418, 0, 0, 0, 0, 0, 0, 6484, 2541, 66039, 0, 78718, + 92723, 3549, 0, 9110, 119665, 2743, 0, 43290, 194812, 9097, 0, 43015, + 8782, 0, 776, 2524, 42707, 8573, 0, 0, 0, 0, 42694, 64944, 8952, 3856, + 118818, 0, 5872, 6495, 0, 0, 0, 92543, 0, 120733, 12849, 3953, 1897, 0, + 65094, 11994, 4339, 74556, 92654, 67843, 0, 0, 0, 68473, 74104, 5228, + 128804, 7868, 43184, 0, 0, 73986, 43438, 0, 43022, 0, 1162, 0, 2671, 0, + 0, 92632, 92631, 118865, 4553, 73811, 0, 195005, 0, 0, 19921, 74331, + 11424, 195006, 4567, 41891, 0, 0, 55249, 4820, 65239, 194662, 0, 0, + 43042, 119212, 1377, 12869, 4897, 42821, 9250, 0, 4438, 64385, 0, 1753, + 11331, 6147, 194941, 43282, 8833, 0, 0, 6504, 78408, 126979, 10719, 0, + 1898, 1413, 42443, 0, 802, 12141, 0, 194671, 6648, 10671, 2528, 0, 64789, + 9169, 838, 127092, 120697, 844, 5014, 0, 256, 0, 9990, 0, 42739, 917851, + 7542, 65464, 9726, 0, 6489, 10048, 74326, 78719, 66573, 0, 78724, 78712, + 11761, 194655, 0, 41094, 0, 0, 0, 0, 92689, 6196, 6945, 194628, 194890, + 128184, 120491, 11816, 194943, 5733, 2930, 0, 0, 41098, 0, 41093, 0, 66626, 588, 9760, 0, 194717, 1238, 200, 0, 1660, 73916, 0, 118905, 74362, - 0, 0, 194651, 0, 0, 3394, 194894, 120668, 0, 0, 0, 66219, 0, 43284, - 194657, 7817, 1841, 11055, 120533, 194979, 194982, 1669, 10776, 194981, - 7701, 194980, 0, 194995, 1732, 4030, 0, 3963, 66611, 127530, 41768, 6491, - 0, 65324, 914, 65323, 8071, 3538, 0, 78713, 65328, 0, 74367, 7614, 0, - 11819, 0, 12009, 12399, 0, 67852, 65537, 0, 10841, 43430, 5301, 0, 0, - 5734, 8960, 0, 127527, 65317, 77880, 0, 0, 0, 12304, 0, 0, 65315, 0, 0, - 0, 0, 0, 119621, 0, 74536, 12447, 64486, 0, 0, 0, 0, 0, 0, 42767, 10915, - 0, 12007, 43695, 120520, 11975, 194878, 0, 0, 2555, 8629, 0, 43168, - 41872, 43706, 4496, 194879, 0, 0, 0, 0, 0, 0, 64730, 0, 66714, 68222, 0, - 0, 65596, 0, 11416, 4280, 67655, 8765, 12784, 7792, 1393, 127242, 67871, - 74386, 0, 8233, 43572, 0, 6683, 0, 3442, 12144, 2841, 12543, 0, 1473, - 42820, 64329, 917772, 0, 68642, 6488, 357, 1048, 41100, 0, 41104, 0, - 41099, 1054, 119065, 1040, 65450, 0, 4434, 1069, 0, 118862, 74231, - 917765, 0, 0, 0, 9693, 41943, 0, 41931, 41759, 12757, 4353, 0, 1059, - 9790, 8995, 0, 0, 65937, 0, 41764, 10646, 0, 118833, 0, 0, 74830, 78569, - 12743, 0, 6480, 917761, 41779, 42580, 66601, 12207, 119619, 6335, 66602, - 11312, 64807, 0, 0, 41767, 0, 0, 43020, 0, 3955, 74254, 0, 0, 917861, 0, - 77926, 9770, 9246, 12230, 0, 0, 0, 10448, 41783, 41786, 127093, 12797, - 2755, 64571, 78578, 194927, 4857, 0, 4428, 12794, 73755, 0, 78574, 0, 0, - 0, 5747, 78825, 0, 7978, 41092, 74571, 0, 11924, 74205, 42144, 65015, 0, - 563, 0, 0, 12798, 11271, 57, 0, 0, 917860, 119043, 0, 0, 43137, 694, 0, - 9876, 0, 119168, 0, 78822, 64537, 0, 277, 74385, 7229, 12761, 0, 0, - 13025, 64811, 8757, 78824, 0, 1574, 7381, 0, 2525, 4852, 5749, 68465, - 13027, 42824, 120574, 1039, 9801, 10155, 5745, 188, 41858, 11592, 0, - 74015, 9055, 41853, 4858, 917780, 0, 436, 4771, 0, 2786, 0, 4856, 8051, - 0, 119609, 0, 9644, 0, 0, 0, 194916, 120732, 66710, 118834, 0, 73906, 0, - 127114, 0, 10234, 5843, 11939, 0, 42157, 0, 3157, 194918, 68393, 0, 3504, - 119178, 0, 10822, 5149, 66029, 10226, 65142, 0, 3594, 42424, 194959, 40, - 12657, 0, 0, 386, 0, 8834, 0, 12815, 43574, 0, 73907, 0, 74196, 7220, - 74504, 0, 74316, 0, 77932, 4304, 74503, 8160, 78707, 194753, 0, 0, 0, - 1348, 0, 78597, 0, 13303, 0, 0, 194755, 7599, 1278, 43616, 13269, 0, 0, - 74387, 78179, 78598, 74492, 6097, 7568, 8780, 4982, 0, 74501, 194763, - 78592, 194762, 2672, 3735, 194735, 13138, 42266, 9484, 10724, 41202, - 119024, 0, 43742, 0, 9487, 119959, 119117, 3842, 195034, 78668, 12442, - 6193, 9791, 0, 0, 42516, 7228, 7559, 74803, 78468, 194851, 11399, 119219, - 194691, 194855, 194690, 194857, 3604, 0, 119188, 0, 78540, 78541, 42507, - 1962, 78490, 78476, 42505, 11660, 0, 2072, 0, 6995, 74173, 5437, 74174, - 10669, 8702, 7964, 194706, 0, 199, 194843, 4105, 194845, 194699, 194847, + 0, 92485, 194651, 0, 0, 3394, 194894, 120668, 0, 0, 127358, 66219, + 127183, 43284, 194657, 7817, 1841, 11055, 120533, 194979, 194982, 1669, + 10776, 194981, 7701, 194980, 0, 194995, 1732, 4030, 0, 3963, 66611, + 127530, 41768, 6491, 0, 65324, 914, 65323, 8071, 3538, 0, 78713, 65328, + 92441, 74367, 7614, 0, 11819, 0, 12009, 12399, 0, 67852, 65537, 0, 10841, + 43430, 5301, 0, 92618, 5734, 8960, 0, 92527, 65317, 77880, 0, 0, 0, + 12304, 0, 0, 65315, 92670, 128511, 0, 0, 0, 119621, 92529, 74536, 12447, + 64486, 127374, 0, 0, 0, 0, 0, 42767, 10915, 0, 12007, 43695, 120520, + 11975, 194878, 0, 92604, 2555, 8629, 0, 43168, 41872, 43706, 4496, + 194879, 128148, 0, 0, 0, 0, 0, 64730, 0, 66714, 68222, 0, 0, 65596, + 92306, 11416, 4280, 67655, 8765, 12784, 7792, 1393, 127242, 67871, 74386, + 0, 8233, 12820, 0, 6683, 194876, 3442, 12144, 2841, 12543, 0, 1473, + 42820, 64329, 127832, 0, 68642, 6488, 357, 1048, 41100, 0, 41104, 0, + 3406, 1054, 119065, 1040, 65450, 0, 4434, 1069, 0, 118862, 65737, 917765, + 128705, 0, 0, 9693, 41943, 0, 41931, 41759, 12757, 4353, 0, 1059, 9790, + 8995, 128286, 0, 65937, 0, 41764, 10646, 0, 118833, 92372, 0, 74830, + 78569, 12743, 0, 6480, 917761, 41779, 42580, 66601, 12207, 119619, 6335, + 66602, 11312, 64807, 0, 0, 41767, 0, 0, 43020, 128271, 3955, 74254, 0, 0, + 917861, 0, 77926, 9770, 9246, 12230, 0, 0, 0, 10448, 41783, 41786, + 127093, 12797, 2755, 64571, 78578, 194927, 4857, 0, 4428, 12794, 73755, + 128061, 78574, 0, 0, 0, 5747, 78825, 0, 7978, 41092, 74571, 0, 11924, + 43812, 42144, 65015, 0, 563, 0, 0, 12798, 11271, 57, 0, 0, 917860, + 119043, 0, 119134, 43137, 694, 0, 9876, 0, 119168, 0, 78822, 64537, 0, + 277, 74385, 7229, 12761, 0, 0, 13025, 64811, 8757, 78824, 0, 1574, 7381, + 0, 2525, 4852, 5749, 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, 0, 9644, 0, 0, 0, 194916, + 120732, 66710, 118834, 0, 73906, 0, 127114, 0, 10234, 5843, 11939, 0, + 42157, 0, 3157, 194918, 68393, 0, 3504, 119178, 0, 10822, 5149, 66029, + 10226, 65142, 0, 3594, 42424, 194959, 40, 12657, 0, 0, 386, 0, 8834, 0, + 12815, 43574, 0, 73907, 0, 74196, 7220, 74504, 0, 74316, 0, 77932, 4304, + 74503, 8160, 78707, 194753, 0, 0, 0, 1348, 92349, 78597, 0, 13303, 0, + 92392, 194755, 7599, 1278, 43616, 13269, 0, 0, 74387, 78179, 78598, + 74492, 6097, 7568, 8780, 4982, 127464, 74501, 194763, 78592, 194762, + 2672, 3735, 127471, 13138, 42266, 9484, 10724, 41202, 119024, 0, 43742, + 0, 9487, 119959, 119117, 3842, 128768, 78668, 12442, 6193, 9791, 127976, + 0, 42516, 7228, 7559, 74803, 78468, 7873, 11399, 119219, 194691, 194855, + 194690, 194857, 3604, 0, 119188, 128877, 78540, 78541, 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, 0, 0, 195024, 10196, 7886, 0, 6585, - 0, 6680, 195042, 0, 195051, 6679, 74412, 0, 194866, 74421, 11382, 0, 0, - 0, 0, 194833, 194832, 6681, 194834, 12693, 194836, 42727, 194838, 194841, - 78195, 65442, 119610, 78199, 12166, 43248, 66248, 194816, 0, 194818, - 194817, 194820, 194819, 5297, 7042, 13284, 6112, 7968, 194825, 73927, - 194738, 194736, 65746, 0, 74409, 74389, 194826, 4342, 42839, 194831, - 1677, 0, 0, 194806, 917855, 11091, 11011, 2719, 0, 0, 119595, 64495, 0, - 0, 7585, 65169, 2052, 4308, 917858, 74177, 7505, 543, 64916, 64736, 0, 0, - 64655, 0, 118922, 2064, 0, 43158, 7902, 0, 65265, 194639, 0, 0, 0, 0, 0, - 0, 12994, 0, 10828, 0, 6228, 4307, 3482, 0, 0, 0, 0, 506, 74573, 41194, - 65735, 2055, 43255, 41195, 0, 8169, 0, 8841, 0, 516, 0, 2063, 119051, 34, - 0, 120186, 11504, 1612, 74333, 120182, 74520, 74308, 12001, 120178, - 10242, 64564, 120179, 120174, 6584, 7749, 11037, 0, 1758, 0, 10667, - 10560, 120197, 120756, 1935, 11517, 120193, 120196, 120195, 1931, 120189, - 74839, 120191, 1217, 64702, 12643, 825, 0, 194905, 12294, 127261, 78834, - 9138, 78831, 78833, 12631, 78829, 11080, 74554, 0, 5591, 1239, 0, 11313, - 0, 3403, 0, 0, 64364, 0, 0, 74582, 8998, 12988, 0, 9152, 0, 0, 194898, - 67589, 41850, 64290, 3433, 0, 12615, 1594, 42192, 6914, 67603, 0, 119569, - 74565, 41353, 67602, 67611, 4337, 0, 194897, 918, 65035, 41351, 7681, - 194900, 42577, 41393, 12668, 194904, 2477, 0, 0, 127302, 0, 67604, - 194880, 127235, 573, 194881, 194884, 11417, 194886, 194885, 194888, - 67599, 0, 194889, 67607, 11482, 0, 0, 3357, 0, 42223, 4207, 1288, 78842, - 78839, 68419, 78837, 11589, 42195, 194872, 917627, 127263, 64602, 67618, - 0, 0, 42788, 68416, 64480, 194875, 8423, 3348, 448, 68476, 9717, 0, 0, - 997, 0, 0, 0, 0, 11440, 11379, 42000, 13139, 42221, 65013, 126999, 0, + 0, 6680, 195042, 0, 195051, 6679, 74412, 92251, 194866, 74421, 11382, 0, + 0, 127891, 127484, 194833, 194832, 6681, 127482, 12693, 194836, 42727, + 194838, 128252, 78195, 65442, 119610, 69733, 9989, 43248, 66248, 194816, + 0, 194818, 128845, 194820, 194819, 5297, 7042, 13284, 6112, 7968, 194825, + 73927, 92444, 194736, 65746, 127476, 74409, 74389, 128696, 4342, 42839, + 194831, 1677, 0, 0, 194806, 917855, 11091, 11011, 2719, 0, 0, 119595, + 10160, 0, 0, 7585, 65169, 2052, 4308, 92174, 74177, 7505, 543, 64916, + 64736, 0, 0, 64655, 0, 118922, 2064, 0, 43158, 7902, 0, 65265, 194639, 0, + 127170, 0, 0, 0, 0, 12994, 92728, 10828, 0, 6228, 4307, 3482, 128527, 0, + 0, 0, 506, 74573, 41194, 65735, 2055, 43255, 41195, 0, 8169, 0, 8841, 0, + 516, 0, 2063, 119051, 34, 128850, 120186, 11504, 1612, 74333, 120182, + 74520, 74308, 12001, 120178, 10242, 64564, 120179, 120174, 6584, 7749, + 11037, 0, 1758, 0, 10667, 10560, 120197, 92593, 1935, 11517, 120193, + 120196, 120195, 1931, 120189, 74839, 120191, 1217, 64702, 12643, 825, + 127838, 194905, 12294, 92428, 78834, 9138, 78831, 78833, 12631, 78829, + 11080, 74554, 64000, 5591, 1239, 0, 11313, 0, 3403, 0, 0, 64364, 92269, + 0, 74582, 8998, 12988, 0, 9152, 0, 0, 194898, 67589, 41850, 64290, 3433, + 92393, 12615, 1594, 42192, 6914, 67603, 0, 119569, 74565, 41353, 67602, + 67611, 4337, 0, 127296, 918, 65035, 41351, 7681, 194900, 42577, 41393, + 12668, 194904, 2477, 127285, 0, 127301, 0, 67604, 194880, 127235, 573, + 127282, 194884, 11417, 194886, 119814, 194888, 67599, 0, 194889, 67607, + 11482, 0, 3981, 3357, 0, 42223, 4207, 1288, 78842, 78839, 68419, 78837, + 11589, 42195, 194872, 194599, 127263, 64602, 67618, 92539, 0, 42788, + 68416, 64480, 194875, 8423, 3348, 448, 68476, 9717, 0, 0, 997, 0, 0, + 92577, 0, 11440, 11379, 42000, 13139, 42221, 65013, 126999, 127760, 73796, 0, 119228, 12035, 0, 2818, 0, 0, 73793, 0, 4172, 0, 0, 8373, - 10873, 12197, 0, 0, 0, 0, 0, 78210, 0, 0, 194865, 126982, 74563, 64828, - 11419, 194868, 766, 1257, 0, 118845, 11381, 3265, 66617, 3274, 0, 0, 0, - 0, 119092, 41989, 0, 0, 0, 3263, 0, 65672, 0, 3270, 64539, 11489, 0, 0, - 0, 0, 9505, 65518, 194776, 756, 195052, 0, 0, 0, 7261, 0, 186, 0, 119156, - 5770, 13179, 65830, 12612, 12949, 64856, 12800, 0, 74203, 64718, 0, 0, 0, - 118929, 0, 11578, 0, 119296, 0, 0, 0, 0, 74568, 9254, 0, 1794, 120217, - 64521, 5624, 120220, 120221, 119958, 120223, 3617, 66636, 64886, 120211, - 120212, 120213, 120214, 1872, 66508, 120467, 41079, 10748, 5502, 119330, - 4452, 0, 0, 917879, 4511, 0, 0, 64678, 11425, 0, 43245, 1231, 0, 0, 0, - 9003, 8192, 0, 5305, 9653, 10616, 8694, 9546, 0, 0, 120478, 120200, - 65205, 120202, 64063, 9878, 74780, 119626, 78202, 64058, 8799, 42131, 0, - 64062, 1028, 64060, 64059, 837, 10567, 0, 43103, 0, 120754, 11427, 2902, - 64043, 64042, 66464, 10756, 0, 42606, 64045, 64044, 43979, 10076, 64040, - 43060, 0, 1034, 3392, 0, 43091, 64033, 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, 0, 0, 4767, 9343, 64049, 64048, 120034, 1133, 64053, 64052, - 43453, 64050, 41340, 118975, 0, 10005, 12329, 41333, 0, 8489, 1942, 0, 0, - 42520, 0, 0, 0, 10760, 64023, 64022, 64021, 6582, 43670, 0, 64025, 9167, - 42151, 78244, 0, 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, 126991, 65929, 0, 0, 0, 0, 64028, 8146, 64026, 41788, 194844, - 0, 118795, 6343, 43247, 119888, 0, 119886, 119891, 119892, 119889, 11433, - 119895, 119896, 0, 7801, 65578, 194839, 12915, 43968, 3297, 9699, 194955, - 1135, 0, 0, 0, 1995, 6722, 0, 0, 2552, 41546, 60, 68394, 8649, 41549, - 78496, 0, 0, 6682, 0, 78679, 64710, 41547, 0, 2013, 0, 78530, 78532, - 78528, 78529, 12832, 78493, 8081, 8362, 3537, 119908, 9137, 119906, 8999, - 0, 78533, 3466, 0, 0, 1996, 0, 3453, 6282, 0, 2002, 2000, 120175, 537, 0, - 4179, 65119, 1998, 0, 1842, 0, 0, 9628, 68446, 12081, 9826, 64502, 1767, - 0, 0, 0, 120201, 0, 0, 0, 3059, 44024, 120204, 119953, 120205, 0, 0, 0, - 4100, 920, 1811, 1355, 0, 0, 3592, 10078, 0, 0, 0, 8592, 65870, 68164, 0, - 10742, 0, 0, 1994, 9281, 3296, 12865, 1997, 1895, + 10873, 12197, 0, 0, 92265, 69706, 0, 78210, 0, 128110, 194865, 126982, + 74563, 64828, 11419, 194868, 766, 1257, 0, 118845, 11381, 3265, 66617, + 3274, 127365, 0, 0, 0, 74522, 41989, 0, 0, 128798, 3263, 0, 65672, 0, + 3270, 64539, 11489, 0, 0, 0, 0, 9505, 65518, 194776, 756, 194605, 0, 0, + 0, 7261, 0, 186, 0, 119156, 5770, 13179, 65830, 12612, 12949, 64856, + 12800, 0, 74203, 64718, 0, 0, 92434, 118929, 0, 11578, 0, 119296, 0, 0, + 0, 0, 74568, 9254, 0, 1794, 120217, 64521, 5624, 120220, 120221, 119958, + 120223, 3617, 66636, 64886, 120211, 120212, 120213, 120214, 1872, 66508, + 120467, 41079, 10748, 5502, 119330, 4452, 0, 0, 92526, 4511, 0, 0, 64678, + 11425, 0, 43245, 1231, 194783, 0, 0, 9003, 8192, 0, 5305, 9653, 10616, + 8694, 9546, 0, 0, 120478, 120200, 65205, 120202, 64063, 9878, 74780, + 119626, 78202, 64058, 8799, 42131, 0, 64062, 1028, 64060, 64059, 837, + 10567, 0, 43103, 0, 120754, 11427, 2902, 64043, 64042, 66464, 10756, 0, + 42606, 64045, 64044, 43979, 10076, 64040, 43060, 194942, 1034, 3392, + 127771, 43091, 64033, 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, 0, + 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, 0, 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, 126991, 65929, 0, 0, 0, 0, 64028, 8146, 64026, 41788, + 194844, 0, 118795, 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, 0, 0, 2552, 41546, + 60, 68394, 8649, 41549, 78496, 0, 0, 6682, 0, 78679, 64710, 41547, 0, + 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, 9826, 64502, 1767, 0, 0, 0, 120201, 0, 0, 0, 3059, 44024, + 120204, 119953, 92693, 0, 0, 92452, 4100, 920, 1811, 1355, 0, 0, 3592, + 10078, 0, 0, 0, 8592, 65870, 68164, 128792, 10742, 0, 42918, 1994, 9281, + 3296, 12865, 1997, 1895, }; #define code_magic 47 diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c new file mode 100644 index 00000000000..ec924f2117b --- /dev/null +++ b/Modules/xxlimited.c @@ -0,0 +1,287 @@ + +/* Use this file as a template to start implementing a module that + also declares object types. All occurrences of 'Xxo' should be changed + to something reasonable for your objects. After that, all other + occurrences of 'xx' should be changed to something reasonable for your + module. If your module is named foo your sourcefile should be named + foomodule.c. + + You will probably want to delete all references to 'x_attr' and add + your own types of attributes instead. Maybe you want to name your + local variables other than 'self'. If your object type is needed in + other files, you'll have to create a file "foobarobject.h"; see + floatobject.h for an example. */ + +/* Xxo objects */ + +#include "Python.h" + +static PyObject *ErrorObject; + +typedef struct { + PyObject_HEAD + PyObject *x_attr; /* Attributes dictionary */ +} XxoObject; + +static PyObject *Xxo_Type; + +#define XxoObject_Check(v) (Py_TYPE(v) == Xxo_Type) + +static XxoObject * +newXxoObject(PyObject *arg) +{ + XxoObject *self; + self = PyObject_New(XxoObject, (PyTypeObject*)Xxo_Type); + if (self == NULL) + return NULL; + self->x_attr = NULL; + return self; +} + +/* Xxo methods */ + +static void +Xxo_dealloc(XxoObject *self) +{ + Py_XDECREF(self->x_attr); + PyObject_Del(self); +} + +static PyObject * +Xxo_demo(XxoObject *self, PyObject *args) +{ + PyObject *o = NULL; + if (!PyArg_ParseTuple(args, "|O:demo", &o)) + return NULL; + /* Test availability of fast type checks */ + if (o != NULL && PyUnicode_Check(o)) { + Py_INCREF(o); + return o; + } + Py_INCREF(Py_None); + return Py_None; +} + +static PyMethodDef Xxo_methods[] = { + {"demo", (PyCFunction)Xxo_demo, METH_VARARGS, + PyDoc_STR("demo() -> None")}, + {NULL, NULL} /* sentinel */ +}; + +static PyObject * +Xxo_getattro(XxoObject *self, PyObject *name) +{ + if (self->x_attr != NULL) { + PyObject *v = PyDict_GetItem(self->x_attr, name); + if (v != NULL) { + Py_INCREF(v); + return v; + } + } + return PyObject_GenericGetAttr((PyObject *)self, name); +} + +static int +Xxo_setattr(XxoObject *self, char *name, PyObject *v) +{ + if (self->x_attr == NULL) { + self->x_attr = PyDict_New(); + if (self->x_attr == NULL) + return -1; + } + if (v == NULL) { + int rv = PyDict_DelItemString(self->x_attr, name); + if (rv < 0) + PyErr_SetString(PyExc_AttributeError, + "delete non-existing Xxo attribute"); + return rv; + } + else + return PyDict_SetItemString(self->x_attr, name, v); +} + +static PyType_Slot Xxo_Type_slots[] = { + {Py_tp_doc, "The Xxo type"}, + {Py_tp_dealloc, Xxo_dealloc}, + {Py_tp_getattro, Xxo_getattro}, + {Py_tp_setattr, Xxo_setattr}, + {Py_tp_methods, Xxo_methods}, + {0, 0}, +}; + +static PyType_Spec Xxo_Type_spec = { + "xxlimited.Xxo", + sizeof(XxoObject), + 0, + Py_TPFLAGS_DEFAULT, + Xxo_Type_slots +}; + +/* --------------------------------------------------------------------- */ + +/* Function of two integers returning integer */ + +PyDoc_STRVAR(xx_foo_doc, +"foo(i,j)\n\ +\n\ +Return the sum of i and j."); + +static PyObject * +xx_foo(PyObject *self, PyObject *args) +{ + long i, j; + long res; + if (!PyArg_ParseTuple(args, "ll:foo", &i, &j)) + return NULL; + res = i+j; /* XXX Do something here */ + return PyLong_FromLong(res); +} + + +/* Function of no arguments returning new Xxo object */ + +static PyObject * +xx_new(PyObject *self, PyObject *args) +{ + XxoObject *rv; + + if (!PyArg_ParseTuple(args, ":new")) + return NULL; + rv = newXxoObject(args); + if (rv == NULL) + return NULL; + return (PyObject *)rv; +} + +/* Test bad format character */ + +static PyObject * +xx_roj(PyObject *self, PyObject *args) +{ + PyObject *a; + long b; + if (!PyArg_ParseTuple(args, "O#:roj", &a, &b)) + return NULL; + Py_INCREF(Py_None); + return Py_None; +} + + +/* ---------- */ + +static PyType_Slot Str_Type_slots[] = { + {Py_tp_base, NULL}, /* filled out in module init function */ + {0, 0}, +}; + +static PyType_Spec Str_Type_spec = { + "xxlimited.Str", + 0, + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + Str_Type_slots +}; + +/* ---------- */ + +static PyObject * +null_richcompare(PyObject *self, PyObject *other, int op) +{ + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; +} + +static PyType_Slot Null_Type_slots[] = { + {Py_tp_base, NULL}, /* filled out in module init */ + {Py_tp_new, NULL}, + {Py_tp_richcompare, null_richcompare}, + {0, 0} +}; + +static PyType_Spec Null_Type_spec = { + "xxlimited.Null", + 0, /* basicsize */ + 0, /* itemsize */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + Null_Type_slots +}; + +/* ---------- */ + +/* List of functions defined in the module */ + +static PyMethodDef xx_methods[] = { + {"roj", xx_roj, METH_VARARGS, + PyDoc_STR("roj(a,b) -> None")}, + {"foo", xx_foo, METH_VARARGS, + xx_foo_doc}, + {"new", xx_new, METH_VARARGS, + PyDoc_STR("new() -> new Xx object")}, + {NULL, NULL} /* sentinel */ +}; + +PyDoc_STRVAR(module_doc, +"This is a template module just for instruction."); + +/* Initialization function for the module (*must* be called PyInit_xx) */ + + +static struct PyModuleDef xxmodule = { + PyModuleDef_HEAD_INIT, + "xxlimited", + module_doc, + -1, + xx_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit_xxlimited(void) +{ + PyObject *m = NULL; + PyObject *o; + + /* Due to cross platform compiler issues the slots must be filled + * here. It's required for portability to Windows without requiring + * C++. */ + Null_Type_slots[0].pfunc = &PyBaseObject_Type; + Null_Type_slots[1].pfunc = PyType_GenericNew; + Str_Type_slots[0].pfunc = &PyUnicode_Type; + + Xxo_Type = PyType_FromSpec(&Xxo_Type_spec); + if (Xxo_Type == NULL) + goto fail; + + /* Create the module and add the functions */ + m = PyModule_Create(&xxmodule); + if (m == NULL) + goto fail; + + /* Add some symbolic constants to the module */ + if (ErrorObject == NULL) { + ErrorObject = PyErr_NewException("xxlimited.error", NULL, NULL); + if (ErrorObject == NULL) + goto fail; + } + Py_INCREF(ErrorObject); + PyModule_AddObject(m, "error", ErrorObject); + + /* Add Str */ + o = PyType_FromSpec(&Str_Type_spec); + if (o == NULL) + goto fail; + PyModule_AddObject(m, "Str", o); + + /* Add Null */ + o = PyType_FromSpec(&Null_Type_spec); + if (o == NULL) + goto fail; + PyModule_AddObject(m, "Null", o); + return m; + fail: + Py_XDECREF(m); + return NULL; +} diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c index 1d9b08a88b5..a8a93606d78 100644 --- a/Modules/xxmodule.c +++ b/Modules/xxmodule.c @@ -10,7 +10,7 @@ your own types of attributes instead. Maybe you want to name your local variables other than 'self'. If your object type is needed in other files, you'll have to create a file "foobarobject.h"; see - intobject.h for an example. */ + floatobject.h for an example. */ /* Xxo objects */ @@ -63,16 +63,16 @@ static PyMethodDef Xxo_methods[] = { }; static PyObject * -Xxo_getattr(XxoObject *self, char *name) +Xxo_getattro(XxoObject *self, PyObject *name) { if (self->x_attr != NULL) { - PyObject *v = PyDict_GetItemString(self->x_attr, name); + PyObject *v = PyDict_GetItem(self->x_attr, name); if (v != NULL) { Py_INCREF(v); return v; } } - return Py_FindMethod(Xxo_methods, (PyObject *)self, name); + return PyObject_GenericGetAttr((PyObject *)self, name); } static int @@ -104,9 +104,9 @@ static PyTypeObject Xxo_Type = { /* methods */ (destructor)Xxo_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)Xxo_getattr, /*tp_getattr*/ + (getattrfunc)0, /*tp_getattr*/ (setattrfunc)Xxo_setattr, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -114,7 +114,7 @@ static PyTypeObject Xxo_Type = { 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ - 0, /*tp_getattro*/ + (getattrofunc)Xxo_getattro, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ @@ -125,7 +125,7 @@ static PyTypeObject Xxo_Type = { 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ - 0, /*tp_methods*/ + Xxo_methods, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ @@ -156,7 +156,7 @@ xx_foo(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "ll:foo", &i, &j)) return NULL; res = i+j; /* XXX Do something here */ - return PyInt_FromLong(res); + return PyLong_FromLong(res); } @@ -187,7 +187,7 @@ xx_bug(PyObject *self, PyObject *args) item = PyList_GetItem(list, 0); /* Py_INCREF(item); */ - PyList_SetItem(list, 1, PyInt_FromLong(0L)); + PyList_SetItem(list, 1, PyLong_FromLong(0L)); PyObject_Print(item, stdout, 0); printf("\n"); /* Py_DECREF(item); */ @@ -224,7 +224,7 @@ static PyTypeObject Str_Type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -246,7 +246,7 @@ static PyTypeObject Str_Type = { 0, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ - 0, /* see initxx */ /*tp_base*/ + 0, /* see PyInit_xx */ /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ @@ -279,7 +279,7 @@ static PyTypeObject Null_Type = { 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ @@ -301,14 +301,14 @@ static PyTypeObject Null_Type = { 0, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ - 0, /* see initxx */ /*tp_base*/ + 0, /* see PyInit_xx */ /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ - 0, /* see initxx */ /*tp_new*/ + 0, /* see PyInit_xx */ /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ }; @@ -334,12 +334,25 @@ static PyMethodDef xx_methods[] = { PyDoc_STRVAR(module_doc, "This is a template module just for instruction."); -/* Initialization function for the module (*must* be called initxx) */ +/* Initialization function for the module (*must* be called PyInit_xx) */ + + +static struct PyModuleDef xxmodule = { + PyModuleDef_HEAD_INIT, + "xx", + module_doc, + -1, + xx_methods, + NULL, + NULL, + NULL, + NULL +}; PyMODINIT_FUNC -initxx(void) +PyInit_xx(void) { - PyObject *m; + PyObject *m = NULL; /* Due to cross platform compiler issues the slots must be filled * here. It's required for portability to Windows without requiring @@ -351,29 +364,33 @@ initxx(void) /* Finalize the type object including setting type of the new type * object; doing it here is required for portability, too. */ if (PyType_Ready(&Xxo_Type) < 0) - return; + goto fail; /* Create the module and add the functions */ - m = Py_InitModule3("xx", xx_methods, module_doc); + m = PyModule_Create(&xxmodule); if (m == NULL) - return; + goto fail; /* Add some symbolic constants to the module */ if (ErrorObject == NULL) { ErrorObject = PyErr_NewException("xx.error", NULL, NULL); if (ErrorObject == NULL) - return; + goto fail; } Py_INCREF(ErrorObject); PyModule_AddObject(m, "error", ErrorObject); /* Add Str */ if (PyType_Ready(&Str_Type) < 0) - return; + goto fail; PyModule_AddObject(m, "Str", (PyObject *)&Str_Type); /* Add Null */ if (PyType_Ready(&Null_Type) < 0) - return; + goto fail; PyModule_AddObject(m, "Null", (PyObject *)&Null_Type); + return m; + fail: + Py_XDECREF(m); + return NULL; } diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c index d4316e75283..6944e377034 100644 --- a/Modules/xxsubtype.c +++ b/Modules/xxsubtype.c @@ -28,7 +28,7 @@ spamlist_getstate(spamlistobject *self, PyObject *args) { if (!PyArg_ParseTuple(args, ":getstate")) return NULL; - return PyInt_FromLong(self->state); + return PyLong_FromLong(self->state); } static PyObject * @@ -91,7 +91,7 @@ spamlist_init(spamlistobject *self, PyObject *args, PyObject *kwds) static PyObject * spamlist_state_get(spamlistobject *self) { - return PyInt_FromLong(self->state); + return PyLong_FromLong(self->state); } static PyGetSetDef spamlist_getsets[] = { @@ -109,7 +109,7 @@ static PyTypeObject spamlist_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -153,7 +153,7 @@ spamdict_getstate(spamdictobject *self, PyObject *args) { if (!PyArg_ParseTuple(args, ":getstate")) return NULL; - return PyInt_FromLong(self->state); + return PyLong_FromLong(self->state); } static PyObject * @@ -200,7 +200,7 @@ static PyTypeObject spamdict_type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -257,8 +257,21 @@ static PyMethodDef xxsubtype_functions[] = { {NULL, NULL} /* sentinel */ }; +static struct PyModuleDef xxsubtypemodule = { + PyModuleDef_HEAD_INIT, + "xxsubtype", + xxsubtype__doc__, + -1, + xxsubtype_functions, + NULL, + NULL, + NULL, + NULL +}; + + PyMODINIT_FUNC -initxxsubtype(void) +PyInit_xxsubtype(void) { PyObject *m; @@ -268,30 +281,29 @@ initxxsubtype(void) so it's not necessary to fill in ob_type first. */ spamdict_type.tp_base = &PyDict_Type; if (PyType_Ready(&spamdict_type) < 0) - return; + return NULL; spamlist_type.tp_base = &PyList_Type; if (PyType_Ready(&spamlist_type) < 0) - return; + return NULL; - m = Py_InitModule3("xxsubtype", - xxsubtype_functions, - xxsubtype__doc__); + m = PyModule_Create(&xxsubtypemodule); if (m == NULL) - return; + return NULL; if (PyType_Ready(&spamlist_type) < 0) - return; + return NULL; if (PyType_Ready(&spamdict_type) < 0) - return; + return NULL; Py_INCREF(&spamlist_type); if (PyModule_AddObject(m, "spamlist", (PyObject *) &spamlist_type) < 0) - return; + return NULL; Py_INCREF(&spamdict_type); if (PyModule_AddObject(m, "spamdict", (PyObject *) &spamdict_type) < 0) - return; + return NULL; + return m; } diff --git a/Modules/yuv.h b/Modules/yuv.h deleted file mode 100644 index 1e5fd281c54..00000000000 --- a/Modules/yuv.h +++ /dev/null @@ -1,99 +0,0 @@ - -#ifndef Py_YUV_H -#define Py_YUV_H -#ifdef __cplusplus -extern "C" { -#endif - -/* - * SVideo YUV 4:1:1 format. - * - * 4 consecutive quadwords describe 8 pixels on 2 lines, as depicted - * below. An array of (width/4) of the below structure describes 2 - * scan lines. - * - * +-------------------+ - * | 00 | 01 | 02 | 03 | . . . - * +-------------------+ - * | 10 | 11 | 12 | 13 | . . . - * +-------------------+ - */ -struct yuv411 { - struct { - unsigned int dummy:8; - unsigned int y0:8; - unsigned int u0:2; - unsigned int v0:2; - unsigned int y1:8; - unsigned int u1:2; - unsigned int v1:2; - } v[4]; -}; - -#define YUV411_Y00(y) (y).v[0].y0 -#define YUV411_Y01(y) (y).v[1].y0 -#define YUV411_Y02(y) (y).v[2].y0 -#define YUV411_Y03(y) (y).v[3].y0 -#define YUV411_Y10(y) (y).v[0].y1 -#define YUV411_Y11(y) (y).v[1].y1 -#define YUV411_Y12(y) (y).v[2].y1 -#define YUV411_Y13(y) (y).v[3].y1 -#define YUV411_U00(y) ((y).v[0].u0<<6|(y).v[1].u0<<4|(y).v[2].u0<<2|(y).v[3].u0) -#define YUV411_U01(y) YUV411_U00(y) -#define YUV411_U02(y) YUV411_U00(y) -#define YUV411_U03(y) YUV411_U00(y) -#define YUV411_U10(y) ((y).v[0].u1<<6|(y).v[1].u1<<4|(y).v[2].u1<<2|(y).v[3].u1) -#define YUV411_U11(y) YUV411_U10(y) -#define YUV411_U12(y) YUV411_U10(y) -#define YUV411_U13(y) YUV411_U10(y) -#define YUV411_V00(y) ((y).v[0].v0<<6|(y).v[1].v0<<4|(y).v[2].v0<<2|(y).v[3].v0) -#define YUV411_V01(y) YUV411_V00(y) -#define YUV411_V02(y) YUV411_V00(y) -#define YUV411_V03(y) YUV411_V00(y) -#define YUV411_V10(y) ((y).v[0].v1<<6|(y).v[1].v1<<4|(y).v[2].v1<<2|(y).v[3].v1) -#define YUV411_V11(y) YUV411_V10(y) -#define YUV411_V12(y) YUV411_V10(y) -#define YUV411_V13(y) YUV411_V10(y) - -/* - * Compression Library YUV 4:2:2 format. - * - * 1 longword describes 2 pixels. - * - * +-------+ - * | 0 | 1 | - * +-------+ - */ -struct yuv422 { - unsigned int u:8; - unsigned int y0:8; - unsigned int v:8; - unsigned int y1:8; -}; -#define YUV422_Y0(y) (y).y0 -#define YUV422_Y1(y) (y).y1 -#define YUV422_U0(y) (y).u -#define YUV422_U1(y) (y).u -#define YUV422_V0(y) (y).v -#define YUV422_V1(y) (y).v - -/* - * Compression library YUV 4:2:2 Duplicate Chroma format. - * - * This is like the previous format, but the U and V values are - * duplicated vertically (and hence there is some redundancy in the - * data). With other words, lines 2*n and 2*n+1 have the same U and V - * values but different Y values. - */ - -/* - * Conversion functions. - */ -void yuv_sv411_to_cl422dc(int, void *, void *, int, int); -void yuv_sv411_to_cl422dc_quartersize(int, void *, void *, int, int); -void yuv_sv411_to_cl422dc_sixteenthsize(int, void *, void *, int, int); - -#ifdef __cplusplus -} -#endif -#endif /* !Py_YUV_H */ diff --git a/Modules/yuvconvert.c b/Modules/yuvconvert.c deleted file mode 100644 index a0fa639c037..00000000000 --- a/Modules/yuvconvert.c +++ /dev/null @@ -1,118 +0,0 @@ - -#include "yuv.h" - -void -yuv_sv411_to_cl422dc(int invert, void *data, void *yuv, int width, int height) -{ - struct yuv411 *in = data; - struct yuv422 *out_even = yuv; - struct yuv422 *out_odd = out_even + width / 2; - int i, j; /* counters */ - - for (i = height / 2; i--; ) { - for (j = width / 4; j--; ) { - YUV422_Y0(*out_even) = YUV411_Y00(*in); - YUV422_U0(*out_even) = YUV411_U00(*in); - YUV422_V0(*out_even) = YUV411_V00(*in); - YUV422_Y1(*out_even) = YUV411_Y01(*in); - out_even++; - YUV422_Y0(*out_even) = YUV411_Y02(*in); - YUV422_U0(*out_even) = YUV411_U02(*in); - YUV422_V0(*out_even) = YUV411_V02(*in); - YUV422_Y1(*out_even) = YUV411_Y03(*in); - out_even++; - YUV422_Y0(*out_odd) = YUV411_Y10(*in); - YUV422_U0(*out_odd) = YUV411_U10(*in); - YUV422_V0(*out_odd) = YUV411_V10(*in); - YUV422_Y1(*out_odd) = YUV411_Y11(*in); - out_odd++; - YUV422_Y0(*out_odd) = YUV411_Y12(*in); - YUV422_U0(*out_odd) = YUV411_U12(*in); - YUV422_V0(*out_odd) = YUV411_V12(*in); - YUV422_Y1(*out_odd) = YUV411_Y13(*in); - out_odd++; - in++; - } - out_even += width / 2; - out_odd += width / 2; - } -} - -void -yuv_sv411_to_cl422dc_quartersize(int invert, void *data, void *yuv, - int width, int height) -{ - int w4 = width / 4; /* quarter of width is used often */ - struct yuv411 *in_even = data; - struct yuv411 *in_odd = in_even + w4; - struct yuv422 *out_even = yuv; - struct yuv422 *out_odd = out_even + w4; - int i, j; /* counters */ - int u, v; /* U and V values */ - - for (i = height / 4; i--; ) { - for (j = w4; j--; ) { - u = YUV411_U00(*in_even); - v = YUV411_V00(*in_even); - - YUV422_Y0(*out_even) = YUV411_Y00(*in_even); - YUV422_U0(*out_even) = u; - YUV422_V0(*out_even) = v; - YUV422_Y1(*out_even) = YUV411_Y02(*in_even); - - YUV422_Y0(*out_odd) = YUV411_Y10(*in_odd); - YUV422_U0(*out_odd) = u; - YUV422_V0(*out_odd) = v; - YUV422_Y1(*out_odd) = YUV411_Y12(*in_odd); - - in_even++; - in_odd++; - out_even++; - out_odd++; - } - in_even += w4; - in_odd += w4; - out_even += w4; - out_odd += w4; - } -} - -void -yuv_sv411_to_cl422dc_sixteenthsize(int invert, void *data, void *yuv, - int width, int height) -{ - int w4_3 = 3 * width / 4; /* three quarters of width is used often */ - int w8 = width / 8; /* and so is one eighth */ - struct yuv411 *in_even = data; - struct yuv411 *in_odd = in_even + width / 2; - struct yuv422 *out_even = yuv; - struct yuv422 *out_odd = out_even + w8; - int i, j; /* counters */ - int u, v; /* U and V values */ - - for (i = height / 8; i--; ) { - for (j = w8; j--; ) { - u = YUV411_U00(in_even[0]); - v = YUV411_V00(in_even[0]); - - YUV422_Y0(*out_even) = YUV411_Y00(in_even[0]); - YUV422_U0(*out_even) = u; - YUV422_V0(*out_even) = v; - YUV422_Y1(*out_even) = YUV411_Y00(in_even[1]); - - YUV422_Y0(*out_odd) = YUV411_Y00(in_odd[0]); - YUV422_U0(*out_odd) = u; - YUV422_V0(*out_odd) = v; - YUV422_Y1(*out_odd) = YUV411_Y00(in_even[1]); - - in_even += 2; - in_odd += 2; - out_even++; - out_odd++; - } - in_even += w4_3; - in_odd += w4_3; - out_even += w8; - out_odd += w8; - } -} diff --git a/Modules/zipimport.c b/Modules/zipimport.c index 7240cb49b62..7ae4f0a0513 100644 --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -35,19 +35,22 @@ typedef struct _zipimporter ZipImporter; struct _zipimporter { PyObject_HEAD - PyObject *archive; /* pathname of the Zip archive */ - PyObject *prefix; /* file prefix: "a/sub/directory/" */ + PyObject *archive; /* pathname of the Zip archive, + decoded from the filesystem encoding */ + PyObject *prefix; /* file prefix: "a/sub/directory/", + encoded to the filesystem encoding */ PyObject *files; /* dict with file info {path: toc_entry} */ }; static PyObject *ZipImportError; +/* read_directory() cache */ static PyObject *zip_directory_cache = NULL; /* forward decls */ -static PyObject *read_directory(char *archive); -static PyObject *get_data(char *archive, PyObject *toc_entry); +static PyObject *read_directory(PyObject *archive); +static PyObject *get_data(PyObject *archive, PyObject *toc_entry); static PyObject *get_module_code(ZipImporter *self, char *fullname, - int *p_ispackage, char **p_modpath); + int *p_ispackage, PyObject **p_modpath); #define ZipImporter_Check(op) PyObject_TypeCheck(op, &ZipImporter_Type) @@ -60,27 +63,29 @@ static PyObject *get_module_code(ZipImporter *self, char *fullname, static int zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds) { - char *path, *p, *prefix, buf[MAXPATHLEN+2]; - size_t len; + PyObject *pathobj, *files; + Py_UNICODE *path, *p, *prefix, buf[MAXPATHLEN+2]; + Py_ssize_t len; if (!_PyArg_NoKeywords("zipimporter()", kwds)) return -1; - if (!PyArg_ParseTuple(args, "s:zipimporter", - &path)) + if (!PyArg_ParseTuple(args, "O&:zipimporter", + PyUnicode_FSDecoder, &pathobj)) return -1; - len = strlen(path); + /* copy path to buf */ + len = PyUnicode_GET_SIZE(pathobj); if (len == 0) { PyErr_SetString(ZipImportError, "archive path is empty"); - return -1; + goto error; } if (len >= MAXPATHLEN) { PyErr_SetString(ZipImportError, "archive path too long"); - return -1; + goto error; } - strcpy(buf, path); + Py_UNICODE_strcpy(buf, PyUnicode_AS_UNICODE(pathobj)); #ifdef ALTSEP for (p = buf; *p; p++) { @@ -92,11 +97,15 @@ zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds) path = NULL; prefix = NULL; for (;;) { -#ifndef RISCOS struct stat statbuf; int rv; - rv = stat(buf, &statbuf); + if (pathobj == NULL) { + pathobj = PyUnicode_FromUnicode(buf, len); + if (pathobj == NULL) + goto error; + } + rv = _Py_stat(pathobj, &statbuf); if (rv == 0) { /* it exists */ if (S_ISREG(statbuf.st_mode)) @@ -104,65 +113,60 @@ zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds) path = buf; break; } -#else - if (object_exists(buf)) { - /* it exists */ - if (isfile(buf)) - /* it's a file */ - path = buf; - break; - } -#endif + else if (PyErr_Occurred()) + goto error; /* back up one path element */ - p = strrchr(buf, SEP); + p = Py_UNICODE_strrchr(buf, SEP); if (prefix != NULL) *prefix = SEP; if (p == NULL) break; *p = '\0'; + len = p - buf; prefix = p; + Py_CLEAR(pathobj); } - if (path != NULL) { - PyObject *files; - files = PyDict_GetItemString(zip_directory_cache, path); - if (files == NULL) { - files = read_directory(buf); - if (files == NULL) - return -1; - if (PyDict_SetItemString(zip_directory_cache, path, - files) != 0) - return -1; - } - else - Py_INCREF(files); - self->files = files; - } - else { + if (path == NULL) { PyErr_SetString(ZipImportError, "not a Zip file"); - return -1; + goto error; } - if (prefix == NULL) - prefix = ""; - else { + files = PyDict_GetItem(zip_directory_cache, pathobj); + if (files == NULL) { + files = read_directory(pathobj); + if (files == NULL) + goto error; + if (PyDict_SetItem(zip_directory_cache, pathobj, files) != 0) + goto error; + } + else + Py_INCREF(files); + self->files = files; + + self->archive = pathobj; + pathobj = NULL; + + if (prefix != NULL) { prefix++; - len = strlen(prefix); + len = Py_UNICODE_strlen(prefix); if (prefix[len-1] != SEP) { /* add trailing SEP */ prefix[len] = SEP; prefix[len + 1] = '\0'; + len++; } } - - self->archive = PyString_FromString(buf); - if (self->archive == NULL) - return -1; - - self->prefix = PyString_FromString(prefix); + else + len = 0; + self->prefix = PyUnicode_FromUnicode(prefix, len); if (self->prefix == NULL) - return -1; + goto error; return 0; + +error: + Py_XDECREF(pathobj); + return -1; } /* GC support. */ @@ -187,23 +191,14 @@ zipimporter_dealloc(ZipImporter *self) static PyObject * zipimporter_repr(ZipImporter *self) { - char buf[500]; - char *archive = "???"; - char *prefix = ""; - - if (self->archive != NULL && PyString_Check(self->archive)) - archive = PyString_AsString(self->archive); - if (self->prefix != NULL && PyString_Check(self->prefix)) - prefix = PyString_AsString(self->prefix); - if (prefix != NULL && *prefix) - PyOS_snprintf(buf, sizeof(buf), - "<zipimporter object \"%.300s%c%.150s\">", - archive, SEP, prefix); + if (self->archive == NULL) + return PyUnicode_FromString("<zipimporter object \"???\">"); + else if (self->prefix != NULL && PyUnicode_GET_SIZE(self->prefix) != 0) + return PyUnicode_FromFormat("<zipimporter object \"%U%c%U\">", + self->archive, SEP, self->prefix); else - PyOS_snprintf(buf, sizeof(buf), - "<zipimporter object \"%.300s\">", - archive); - return PyString_FromString(buf); + return PyUnicode_FromFormat("<zipimporter object \"%U\">", + self->archive); } /* return fullname.split(".")[-1] */ @@ -222,20 +217,26 @@ get_subname(char *fullname) archive (without extension) to the path buffer. Return the length of the resulting string. */ static int -make_filename(char *prefix, char *name, char *path) +make_filename(PyObject *prefix_obj, char *name, char *path, size_t pathsize) { size_t len; char *p; + PyObject *prefix; - len = strlen(prefix); + prefix = PyUnicode_EncodeFSDefault(prefix_obj); + if (prefix == NULL) + return -1; + len = PyBytes_GET_SIZE(prefix); /* self.prefix + name [+ SEP + "__init__"] + ".py[co]" */ - if (len + strlen(name) + 13 >= MAXPATHLEN) { + if (len + strlen(name) + 13 >= pathsize - 1) { PyErr_SetString(ZipImportError, "path too long"); + Py_DECREF(prefix); return -1; } - strcpy(path, prefix); + strcpy(path, PyBytes_AS_STRING(prefix)); + Py_DECREF(prefix); strcpy(path + len, name); for (p = path + len; *p; p++) { if (*p == '.') @@ -263,7 +264,7 @@ get_module_info(ZipImporter *self, char *fullname) subname = get_subname(fullname); - len = make_filename(PyString_AsString(self->prefix), subname, path); + len = make_filename(self->prefix, subname, path, sizeof(path)); if (len < 0) return MI_ERROR; @@ -309,8 +310,9 @@ static PyObject * zipimporter_load_module(PyObject *obj, PyObject *args) { ZipImporter *self = (ZipImporter *)obj; - PyObject *code, *mod, *dict; - char *fullname, *modpath; + PyObject *code = NULL, *mod, *dict; + char *fullname; + PyObject *modpath = NULL, *modpath_bytes; int ispackage; if (!PyArg_ParseTuple(args, "s:zipimporter.load_module", @@ -319,13 +321,11 @@ zipimporter_load_module(PyObject *obj, PyObject *args) code = get_module_code(self, fullname, &ispackage, &modpath); if (code == NULL) - return NULL; + goto error; mod = PyImport_AddModule(fullname); - if (mod == NULL) { - Py_DECREF(code); - return NULL; - } + if (mod == NULL) + goto error; dict = PyModule_GetDict(mod); /* mod.__loader__ = self */ @@ -336,15 +336,12 @@ zipimporter_load_module(PyObject *obj, PyObject *args) /* add __path__ to the module *before* the code gets executed */ PyObject *pkgpath, *fullpath; - char *prefix = PyString_AsString(self->prefix); char *subname = get_subname(fullname); int err; - fullpath = PyString_FromFormat("%s%c%s%s", - PyString_AsString(self->archive), - SEP, - *prefix ? prefix : "", - subname); + fullpath = PyUnicode_FromFormat("%U%c%U%s", + self->archive, SEP, + self->prefix, subname); if (fullpath == NULL) goto error; @@ -357,15 +354,24 @@ zipimporter_load_module(PyObject *obj, PyObject *args) if (err != 0) goto error; } - mod = PyImport_ExecCodeModuleEx(fullname, code, modpath); - Py_DECREF(code); + modpath_bytes = PyUnicode_EncodeFSDefault(modpath); + if (modpath_bytes == NULL) + goto error; + mod = PyImport_ExecCodeModuleEx(fullname, code, + PyBytes_AS_STRING(modpath_bytes)); + Py_DECREF(modpath_bytes); + Py_CLEAR(code); + if (mod == NULL) + goto error; + if (Py_VerboseFlag) - PySys_WriteStderr("import %s # loaded from Zip %s\n", - fullname, modpath); + PySys_FormatStderr("import %s # loaded from Zip %U\n", + fullname, modpath); + Py_DECREF(modpath); return mod; error: - Py_DECREF(code); - Py_DECREF(mod); + Py_XDECREF(code); + Py_XDECREF(modpath); return NULL; } @@ -375,21 +381,22 @@ zipimporter_get_filename(PyObject *obj, PyObject *args) { ZipImporter *self = (ZipImporter *)obj; PyObject *code; - char *fullname, *modpath; + char *fullname; + PyObject *modpath; int ispackage; if (!PyArg_ParseTuple(args, "s:zipimporter.get_filename", - &fullname)) - return NULL; + &fullname)) + return NULL; /* Deciding the filename requires working out where the code would come from if the module was actually loaded */ code = get_module_code(self, fullname, &ispackage, &modpath); if (code == NULL) - return NULL; + return NULL; Py_DECREF(code); /* Only need the path info */ - return PyString_FromString(modpath); + return modpath; } /* Return a bool signifying whether the module is a package or not. */ @@ -408,8 +415,7 @@ zipimporter_is_package(PyObject *obj, PyObject *args) if (mi == MI_ERROR) return NULL; if (mi == MI_NOT_FOUND) { - PyErr_Format(ZipImportError, "can't find module '%.200s'", - fullname); + PyErr_Format(ZipImportError, "can't find module '%s'", fullname); return NULL; } return PyBool_FromLong(mi == MI_PACKAGE); @@ -419,41 +425,52 @@ static PyObject * zipimporter_get_data(PyObject *obj, PyObject *args) { ZipImporter *self = (ZipImporter *)obj; - char *path; + PyObject *pathobj, *key; + const Py_UNICODE *path; #ifdef ALTSEP - char *p, buf[MAXPATHLEN + 1]; + Py_UNICODE *p, buf[MAXPATHLEN + 1]; #endif + Py_UNICODE *archive; PyObject *toc_entry; - Py_ssize_t len; + Py_ssize_t path_len, len; - if (!PyArg_ParseTuple(args, "s:zipimporter.get_data", &path)) + if (!PyArg_ParseTuple(args, "U:zipimporter.get_data", &pathobj)) return NULL; + path_len = PyUnicode_GET_SIZE(pathobj); + path = PyUnicode_AS_UNICODE(pathobj); #ifdef ALTSEP - if (strlen(path) >= MAXPATHLEN) { + if (path_len >= MAXPATHLEN) { PyErr_SetString(ZipImportError, "path too long"); return NULL; } - strcpy(buf, path); + Py_UNICODE_strcpy(buf, path); for (p = buf; *p; p++) { if (*p == ALTSEP) *p = SEP; } path = buf; #endif - len = PyString_Size(self->archive); - if ((size_t)len < strlen(path) && - strncmp(path, PyString_AsString(self->archive), len) == 0 && + archive = PyUnicode_AS_UNICODE(self->archive); + len = PyUnicode_GET_SIZE(self->archive); + if ((size_t)len < Py_UNICODE_strlen(path) && + Py_UNICODE_strncmp(path, archive, len) == 0 && path[len] == SEP) { - path = path + len + 1; + path += len + 1; + path_len -= len + 1; } - toc_entry = PyDict_GetItemString(self->files, path); + key = PyUnicode_FromUnicode(path, path_len); + if (key == NULL) + return NULL; + toc_entry = PyDict_GetItem(self->files, key); if (toc_entry == NULL) { - PyErr_SetFromErrnoWithFilename(PyExc_IOError, path); + PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, key); + Py_DECREF(key); return NULL; } - return get_data(PyString_AsString(self->archive), toc_entry); + Py_DECREF(key); + return get_data(self->archive, toc_entry); } static PyObject * @@ -484,13 +501,12 @@ zipimporter_get_source(PyObject *obj, PyObject *args) if (mi == MI_ERROR) return NULL; if (mi == MI_NOT_FOUND) { - PyErr_Format(ZipImportError, "can't find module '%.200s'", - fullname); + PyErr_Format(ZipImportError, "can't find module '%s'", fullname); return NULL; } subname = get_subname(fullname); - len = make_filename(PyString_AsString(self->prefix), subname, path); + len = make_filename(self->prefix, subname, path, sizeof(path)); if (len < 0) return NULL; @@ -502,8 +518,16 @@ zipimporter_get_source(PyObject *obj, PyObject *args) strcpy(path + len, ".py"); toc_entry = PyDict_GetItemString(self->files, path); - if (toc_entry != NULL) - return get_data(PyString_AsString(self->archive), toc_entry); + if (toc_entry != NULL) { + PyObject *res, *bytes; + bytes = get_data(self->archive, toc_entry); + if (bytes == NULL) + return NULL; + res = PyUnicode_FromStringAndSize(PyBytes_AS_STRING(bytes), + PyBytes_GET_SIZE(bytes)); + Py_DECREF(bytes); + return res; + } /* we have the module, but no source */ Py_INCREF(Py_None); @@ -607,7 +631,7 @@ static PyTypeObject ZipImporter_Type = { 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ - 0, /* tp_compare */ + 0, /* tp_reserved */ (reprfunc)zipimporter_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ @@ -669,7 +693,8 @@ get_long(unsigned char *buf) { A toc_entry is a tuple: - (__file__, # value to use for __file__, available for all files + (__file__, # value to use for __file__, available for all files, + # encoded to the filesystem encoding compress, # compression kind; 0 for uncompressed data_size, # size of compressed data on disk file_size, # size of decompressed data @@ -677,56 +702,61 @@ get_long(unsigned char *buf) { time, # mod time of file (in dos format) date, # mod data of file (in dos format) crc, # crc checksum of the data - ) + ) Directories can be recognized by the trailing SEP in the name, data_size and file_offset are 0. */ static PyObject * -read_directory(char *archive) +read_directory(PyObject *archive_obj) { + /* FIXME: work on Py_UNICODE* instead of char* */ PyObject *files = NULL; FILE *fp; - long compress, crc, data_size, file_size, file_offset, date, time; - long header_offset, name_size, header_size, header_position; + unsigned short flags; + short compress, time, date, name_size; + long crc, data_size, file_size, header_size; + Py_ssize_t file_offset, header_position, header_offset; long i, l, count; size_t length; - char path[MAXPATHLEN + 5]; + Py_UNICODE path[MAXPATHLEN + 5]; char name[MAXPATHLEN + 5]; + PyObject *nameobj = NULL; char *p, endof_central_dir[22]; - long arc_offset; /* offset from beginning of file to start of zip-archive */ + Py_ssize_t arc_offset; /* Absolute offset to start of the zip-archive. */ + PyObject *pathobj; + const char *charset; + int bootstrap; - if (strlen(archive) > MAXPATHLEN) { + if (PyUnicode_GET_SIZE(archive_obj) > MAXPATHLEN) { PyErr_SetString(PyExc_OverflowError, "Zip path name is too long"); return NULL; } - strcpy(path, archive); + Py_UNICODE_strcpy(path, PyUnicode_AS_UNICODE(archive_obj)); - fp = fopen(archive, "rb"); + fp = _Py_fopen(archive_obj, "rb"); if (fp == NULL) { - PyErr_Format(ZipImportError, "can't open Zip file: " - "'%.200s'", archive); + if (!PyErr_Occurred()) + PyErr_Format(ZipImportError, "can't open Zip file: '%U'", archive_obj); return NULL; } if (fseek(fp, -22, SEEK_END) == -1) { fclose(fp); - PyErr_Format(ZipImportError, "can't read Zip file: %s", archive); + PyErr_Format(ZipImportError, "can't read Zip file: %U", archive_obj); return NULL; } header_position = ftell(fp); if (fread(endof_central_dir, 1, 22, fp) != 22) { fclose(fp); - PyErr_Format(ZipImportError, "can't read Zip file: " - "'%.200s'", archive); + PyErr_Format(ZipImportError, "can't read Zip file: '%U'", archive_obj); return NULL; } if (get_long((unsigned char *)endof_central_dir) != 0x06054B50) { /* Bad: End of Central Dir signature */ fclose(fp); - PyErr_Format(ZipImportError, "not a Zip file: " - "'%.200s'", archive); + PyErr_Format(ZipImportError, "not a Zip file: '%U'", archive_obj); return NULL; } @@ -739,7 +769,7 @@ read_directory(char *archive) if (files == NULL) goto error; - length = (long)strlen(path); + length = Py_UNICODE_strlen(path); path[length] = SEP; /* Start of Central Directory */ @@ -753,8 +783,9 @@ read_directory(char *archive) l = PyMarshal_ReadLongFromFile(fp); if (l != 0x02014B50) break; /* Bad: Central Dir File Header */ - if (fseek(fp, header_offset + 10, 0) == -1) + if (fseek(fp, header_offset + 8, 0) == -1) goto fseek_error; + flags = (unsigned short)PyMarshal_ReadShortFromFile(fp); compress = PyMarshal_ReadShortFromFile(fp); time = PyMarshal_ReadShortFromFile(fp); date = PyMarshal_ReadShortFromFile(fp); @@ -781,13 +812,41 @@ read_directory(char *archive) *p = 0; /* Add terminating null byte */ header_offset += header_size; - strncpy(path + length + 1, name, MAXPATHLEN - length - 1); + bootstrap = 0; + if (flags & 0x0800) + charset = "utf-8"; + else if (!PyThreadState_GET()->interp->codecs_initialized) { + /* During bootstrap, we may need to load the encodings + package from a ZIP file. But the cp437 encoding is implemented + in Python in the encodings package. + + Break out of this dependency by assuming that the path to + the encodings module is ASCII-only. */ + charset = "ascii"; + bootstrap = 1; + } + else + charset = "cp437"; + nameobj = PyUnicode_Decode(name, name_size, charset, NULL); + if (nameobj == NULL) { + if (bootstrap) + PyErr_Format(PyExc_NotImplementedError, + "bootstrap issue: python%i%i.zip contains non-ASCII " + "filenames without the unicode flag", + PY_MAJOR_VERSION, PY_MINOR_VERSION); + goto error; + } + Py_UNICODE_strncpy(path + length + 1, PyUnicode_AS_UNICODE(nameobj), MAXPATHLEN - length - 1); - t = Py_BuildValue("siiiiiii", path, compress, data_size, + pathobj = PyUnicode_FromUnicode(path, Py_UNICODE_strlen(path)); + if (pathobj == NULL) + goto error; + t = Py_BuildValue("Nhllnhhl", pathobj, compress, data_size, file_size, file_offset, time, date, crc); if (t == NULL) goto error; - err = PyDict_SetItemString(files, name, t); + err = PyDict_SetItem(files, nameobj, t); + Py_CLEAR(nameobj); Py_DECREF(t); if (err != 0) goto error; @@ -795,17 +854,19 @@ read_directory(char *archive) } fclose(fp); if (Py_VerboseFlag) - PySys_WriteStderr("# zipimport: found %ld names in %s\n", - count, archive); + PySys_FormatStderr("# zipimport: found %ld names in %U\n", + count, archive_obj); return files; fseek_error: fclose(fp); Py_XDECREF(files); - PyErr_Format(ZipImportError, "can't read Zip file: %s", archive); + Py_XDECREF(nameobj); + PyErr_Format(ZipImportError, "can't read Zip file: %U", archive_obj); return NULL; error: fclose(fp); Py_XDECREF(files); + Py_XDECREF(nameobj); return NULL; } @@ -844,7 +905,7 @@ get_decompress_func(void) /* Given a path to a Zip file and a toc_entry, return the (uncompressed) data as a new reference. */ static PyObject * -get_data(char *archive, PyObject *toc_entry) +get_data(PyObject *archive, PyObject *toc_entry) { PyObject *raw_data, *data = NULL, *decompress; char *buf; @@ -852,27 +913,28 @@ get_data(char *archive, PyObject *toc_entry) int err; Py_ssize_t bytes_read = 0; long l; - char *datapath; - long compress, data_size, file_size, file_offset; + PyObject *datapath; + long compress, data_size, file_size, file_offset, bytes_size; long time, date, crc; - if (!PyArg_ParseTuple(toc_entry, "slllllll", &datapath, &compress, + if (!PyArg_ParseTuple(toc_entry, "Olllllll", &datapath, &compress, &data_size, &file_size, &file_offset, &time, &date, &crc)) { return NULL; } - fp = fopen(archive, "rb"); + fp = _Py_fopen(archive, "rb"); if (!fp) { - PyErr_Format(PyExc_IOError, - "zipimport: can not open file %s", archive); + if (!PyErr_Occurred()) + PyErr_Format(PyExc_IOError, + "zipimport: can not open file %U", archive); return NULL; } /* Check to make sure the local file header is correct */ if (fseek(fp, file_offset, 0) == -1) { fclose(fp); - PyErr_Format(ZipImportError, "can't read Zip file: %s", archive); + PyErr_Format(ZipImportError, "can't read Zip file: %U", archive); return NULL; } @@ -880,14 +942,14 @@ get_data(char *archive, PyObject *toc_entry) if (l != 0x04034B50) { /* Bad: Local File Header */ PyErr_Format(ZipImportError, - "bad local file header in %s", + "bad local file header in %U", archive); fclose(fp); return NULL; } if (fseek(fp, file_offset + 26, 0) == -1) { fclose(fp); - PyErr_Format(ZipImportError, "can't read Zip file: %s", archive); + PyErr_Format(ZipImportError, "can't read Zip file: %U", archive); return NULL; } @@ -895,20 +957,23 @@ get_data(char *archive, PyObject *toc_entry) PyMarshal_ReadShortFromFile(fp); /* local header size */ file_offset += l; /* Start of file data */ - raw_data = PyString_FromStringAndSize((char *)NULL, compress == 0 ? - data_size : data_size + 1); + bytes_size = compress == 0 ? data_size : data_size + 1; + if (bytes_size == 0) + bytes_size++; + raw_data = PyBytes_FromStringAndSize((char *)NULL, bytes_size); + if (raw_data == NULL) { fclose(fp); return NULL; } - buf = PyString_AsString(raw_data); + buf = PyBytes_AsString(raw_data); err = fseek(fp, file_offset, 0); if (err == 0) { bytes_read = fread(buf, 1, data_size, fp); } else { fclose(fp); - PyErr_Format(ZipImportError, "can't read Zip file: %s", archive); + PyErr_Format(ZipImportError, "can't read Zip file: %U", archive); return NULL; } fclose(fp); @@ -925,8 +990,11 @@ get_data(char *archive, PyObject *toc_entry) } buf[data_size] = '\0'; - if (compress == 0) /* data is not compressed */ - return raw_data; + if (compress == 0) { /* data is not compressed */ + data = PyBytes_FromStringAndSize(buf, data_size); + Py_DECREF(raw_data); + return data; + } /* Decompress with zlib */ decompress = get_decompress_func(); @@ -965,8 +1033,8 @@ static PyObject * unmarshal_code(char *pathname, PyObject *data, time_t mtime) { PyObject *code; - char *buf = PyString_AsString(data); - Py_ssize_t size = PyString_Size(data); + char *buf = PyBytes_AsString(data); + Py_ssize_t size = PyBytes_Size(data); if (size <= 9) { PyErr_SetString(ZipImportError, @@ -997,7 +1065,7 @@ unmarshal_code(char *pathname, PyObject *data, time_t mtime) if (!PyCode_Check(code)) { Py_DECREF(code); PyErr_Format(PyExc_TypeError, - "compiled module %.200s is not a code object", + "compiled module %s is not a code object", pathname); return NULL; } @@ -1011,14 +1079,16 @@ unmarshal_code(char *pathname, PyObject *data, time_t mtime) static PyObject * normalize_line_endings(PyObject *source) { - char *buf, *q, *p = PyString_AsString(source); + char *buf, *q, *p = PyBytes_AsString(source); PyObject *fixed_source; + int len = 0; - if (!p) - return NULL; + if (!p) { + return PyBytes_FromStringAndSize("\n\0", 2); + } /* one char extra for trailing \n and one for terminating \0 */ - buf = (char *)PyMem_Malloc(PyString_Size(source) + 2); + buf = (char *)PyMem_Malloc(PyBytes_Size(source) + 2); if (buf == NULL) { PyErr_SetString(PyExc_MemoryError, "zipimport: no memory to allocate " @@ -1034,10 +1104,11 @@ normalize_line_endings(PyObject *source) } else *q++ = *p; + len++; } *q++ = '\n'; /* add trailing \n */ *q = '\0'; - fixed_source = PyString_FromString(buf); + fixed_source = PyBytes_FromStringAndSize(buf, len + 2); PyMem_Free(buf); return fixed_source; } @@ -1053,7 +1124,7 @@ compile_source(char *pathname, PyObject *source) if (fixed_source == NULL) return NULL; - code = Py_CompileString(PyString_AsString(fixed_source), pathname, + code = Py_CompileString(PyBytes_AsString(fixed_source), pathname, Py_file_input); Py_DECREF(fixed_source); return code; @@ -1096,8 +1167,8 @@ get_mtime_of_source(ZipImporter *self, char *path) /* fetch the time stamp of the .py file for comparison with an embedded pyc time stamp */ int time, date; - time = PyInt_AsLong(PyTuple_GetItem(toc_entry, 5)); - date = PyInt_AsLong(PyTuple_GetItem(toc_entry, 6)); + time = PyLong_AsLong(PyTuple_GetItem(toc_entry, 5)); + date = PyLong_AsLong(PyTuple_GetItem(toc_entry, 6)); mtime = parse_dostime(time, date); } path[lastchar] = savechar; @@ -1111,24 +1182,23 @@ get_code_from_data(ZipImporter *self, int ispackage, int isbytecode, time_t mtime, PyObject *toc_entry) { PyObject *data, *code; - char *modpath; - char *archive = PyString_AsString(self->archive); + PyObject *modpath; - if (archive == NULL) - return NULL; - - data = get_data(archive, toc_entry); + data = get_data(self->archive, toc_entry); if (data == NULL) return NULL; - modpath = PyString_AsString(PyTuple_GetItem(toc_entry, 0)); - - if (isbytecode) { - code = unmarshal_code(modpath, data, mtime); - } - else { - code = compile_source(modpath, data); + modpath = PyUnicode_EncodeFSDefault(PyTuple_GetItem(toc_entry, 0)); + if (modpath == NULL) { + Py_DECREF(data); + return NULL; } + + if (isbytecode) + code = unmarshal_code(PyBytes_AS_STRING(modpath), data, mtime); + else + code = compile_source(PyBytes_AS_STRING(modpath), data); + Py_DECREF(modpath); Py_DECREF(data); return code; } @@ -1137,7 +1207,7 @@ get_code_from_data(ZipImporter *self, int ispackage, int isbytecode, 'fullname'. */ static PyObject * get_module_code(ZipImporter *self, char *fullname, - int *p_ispackage, char **p_modpath) + int *p_ispackage, PyObject **p_modpath) { PyObject *toc_entry; char *subname, path[MAXPATHLEN + 1]; @@ -1146,7 +1216,7 @@ get_module_code(ZipImporter *self, char *fullname, subname = get_subname(fullname); - len = make_filename(PyString_AsString(self->prefix), subname, path); + len = make_filename(self->prefix, subname, path, sizeof(path)); if (len < 0) return NULL; @@ -1155,9 +1225,8 @@ get_module_code(ZipImporter *self, char *fullname, strcpy(path + len, zso->suffix); if (Py_VerboseFlag > 1) - PySys_WriteStderr("# trying %s%c%s\n", - PyString_AsString(self->archive), - SEP, path); + PySys_FormatStderr("# trying %U%c%s\n", + self->archive, (int)SEP, path); toc_entry = PyDict_GetItemString(self->files, path); if (toc_entry != NULL) { time_t mtime = 0; @@ -1177,13 +1246,14 @@ get_module_code(ZipImporter *self, char *fullname, Py_DECREF(code); continue; } - if (code != NULL && p_modpath != NULL) - *p_modpath = PyString_AsString( - PyTuple_GetItem(toc_entry, 0)); + if (code != NULL && p_modpath != NULL) { + *p_modpath = PyTuple_GetItem(toc_entry, 0); + Py_INCREF(*p_modpath); + } return code; } } - PyErr_Format(ZipImportError, "can't find module '%.200s'", fullname); + PyErr_Format(ZipImportError, "can't find module '%s'", fullname); return NULL; } @@ -1204,13 +1274,25 @@ It is usually not needed to use the zipimport module explicitly; it is\n\ used by the builtin import mechanism for sys.path items that are paths\n\ to Zip archives."); +static struct PyModuleDef zipimportmodule = { + PyModuleDef_HEAD_INIT, + "zipimport", + zipimport_doc, + -1, + NULL, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initzipimport(void) +PyInit_zipimport(void) { PyObject *mod; if (PyType_Ready(&ZipImporter_Type) < 0) - return; + return NULL; /* Correct directory separator */ zip_searchorder[0].suffix[0] = SEP; @@ -1227,31 +1309,31 @@ initzipimport(void) zip_searchorder[4] = tmp; } - mod = Py_InitModule4("zipimport", NULL, zipimport_doc, - NULL, PYTHON_API_VERSION); + mod = PyModule_Create(&zipimportmodule); if (mod == NULL) - return; + return NULL; ZipImportError = PyErr_NewException("zipimport.ZipImportError", PyExc_ImportError, NULL); if (ZipImportError == NULL) - return; + return NULL; Py_INCREF(ZipImportError); if (PyModule_AddObject(mod, "ZipImportError", ZipImportError) < 0) - return; + return NULL; Py_INCREF(&ZipImporter_Type); if (PyModule_AddObject(mod, "zipimporter", (PyObject *)&ZipImporter_Type) < 0) - return; + return NULL; zip_directory_cache = PyDict_New(); if (zip_directory_cache == NULL) - return; + return NULL; Py_INCREF(zip_directory_cache); if (PyModule_AddObject(mod, "_zip_directory_cache", zip_directory_cache) < 0) - return; + return NULL; + return mod; } diff --git a/Modules/zlib/ChangeLog b/Modules/zlib/ChangeLog index 7f6869d3235..f310bb0fcdb 100644 --- a/Modules/zlib/ChangeLog +++ b/Modules/zlib/ChangeLog @@ -1,6 +1,359 @@ ChangeLog file for zlib +Changes in 1.2.5 (19 Apr 2010) +- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] +- Default to libdir as sharedlibdir in configure [Nieder] +- Update copyright dates on modified source files +- Update trees.c to be able to generate modified trees.h +- Exit configure for MinGW, suggesting win32/Makefile.gcc + +Changes in 1.2.4.5 (18 Apr 2010) +- Set sharedlibdir in configure [Torok] +- Set LDFLAGS in Makefile.in [Bar-Lev] +- Avoid mkdir objs race condition in Makefile.in [Bowler] +- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays +- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C +- Don't use hidden attribute when it is a warning generator (e.g. Solaris) + +Changes in 1.2.4.4 (18 Apr 2010) +- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok] +- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty +- Try to use bash or ksh regardless of functionality of /bin/sh +- Fix configure incompatibility with NetBSD sh +- Remove attempt to run under bash or ksh since have better NetBSD fix +- Fix win32/Makefile.gcc for MinGW [Bar-Lev] +- Add diagnostic messages when using CROSS_PREFIX in configure +- Added --sharedlibdir option to configure [Weigelt] +- Use hidden visibility attribute when available [Frysinger] + +Changes in 1.2.4.3 (10 Apr 2010) +- Only use CROSS_PREFIX in configure for ar and ranlib if they exist +- Use CROSS_PREFIX for nm [Bar-Lev] +- Assume _LARGEFILE64_SOURCE defined is equivalent to true +- Avoid use of undefined symbols in #if with && and || +- Make *64 prototypes in gzguts.h consistent with functions +- Add -shared load option for MinGW in configure [Bowler] +- Move z_off64_t to public interface, use instead of off64_t +- Remove ! from shell test in configure (not portable to Solaris) +- Change +0 macro tests to -0 for possibly increased portability + +Changes in 1.2.4.2 (9 Apr 2010) +- Add consistent carriage returns to readme.txt's in masmx86 and masmx64 +- Really provide prototypes for *64 functions when building without LFS +- Only define unlink() in minigzip.c if unistd.h not included +- Update README to point to contrib/vstudio project files +- Move projects/vc6 to old/ and remove projects/ +- Include stdlib.h in minigzip.c for setmode() definition under WinCE +- Clean up assembler builds in win32/Makefile.msc [Rowe] +- Include sys/types.h for Microsoft for off_t definition +- Fix memory leak on error in gz_open() +- Symbolize nm as $NM in configure [Weigelt] +- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt] +- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined +- Fix bug in gzeof() to take into account unused input data +- Avoid initialization of structures with variables in puff.c +- Updated win32/README-WIN32.txt [Rowe] + +Changes in 1.2.4.1 (28 Mar 2010) +- Remove the use of [a-z] constructs for sed in configure [gentoo 310225] +- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech] +- Restore "for debugging" comment on sprintf() in gzlib.c +- Remove fdopen for MVS from gzguts.h +- Put new README-WIN32.txt in win32 [Rowe] +- Add check for shell to configure and invoke another shell if needed +- Fix big fat stinking bug in gzseek() on uncompressed files +- Remove vestigial F_OPEN64 define in zutil.h +- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE +- Avoid errors on non-LFS systems when applications define LFS macros +- Set EXE to ".exe" in configure for MINGW [Kahle] +- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill] +- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev] +- Add DLL install in win32/makefile.gcc [Bar-Lev] +- Allow Linux* or linux* from uname in configure [Bar-Lev] +- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev] +- Add cross-compilation prefixes to configure [Bar-Lev] +- Match type exactly in gz_load() invocation in gzread.c +- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func +- Provide prototypes for *64 functions when building zlib without LFS +- Don't use -lc when linking shared library on MinGW +- Remove errno.h check in configure and vestigial errno code in zutil.h + +Changes in 1.2.4 (14 Mar 2010) +- Fix VER3 extraction in configure for no fourth subversion +- Update zlib.3, add docs to Makefile.in to make .pdf out of it +- Add zlib.3.pdf to distribution +- Don't set error code in gzerror() if passed pointer is NULL +- Apply destination directory fixes to CMakeLists.txt [Lowman] +- Move #cmakedefine's to a new zconf.in.cmakein +- Restore zconf.h for builds that don't use configure or cmake +- Add distclean to dummy Makefile for convenience +- Update and improve INDEX, README, and FAQ +- Update CMakeLists.txt for the return of zconf.h [Lowman] +- Update contrib/vstudio/vc9 and vc10 [Vollant] +- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc +- Apply license and readme changes to contrib/asm686 [Raiter] +- Check file name lengths and add -c option in minigzip.c [Li] +- Update contrib/amd64 and contrib/masmx86/ [Vollant] +- Avoid use of "eof" parameter in trees.c to not shadow library variable +- Update make_vms.com for removal of zlibdefs.h [Zinser] +- Update assembler code and vstudio projects in contrib [Vollant] +- Remove outdated assembler code contrib/masm686 and contrib/asm586 +- Remove old vc7 and vc8 from contrib/vstudio +- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe] +- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open() +- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant] +- Remove *64 functions from win32/zlib.def (they're not 64-bit yet) +- Fix bug in void-returning vsprintf() case in gzwrite.c +- Fix name change from inflate.h in contrib/inflate86/inffas86.c +- Check if temporary file exists before removing in make_vms.com [Zinser] +- Fix make install and uninstall for --static option +- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta] +- Update readme.txt in contrib/masmx64 and masmx86 to assemble + +Changes in 1.2.3.9 (21 Feb 2010) +- Expunge gzio.c +- Move as400 build information to old +- Fix updates in contrib/minizip and contrib/vstudio +- Add const to vsnprintf test in configure to avoid warnings [Weigelt] +- Delete zconf.h (made by configure) [Weigelt] +- Change zconf.in.h to zconf.h.in per convention [Weigelt] +- Check for NULL buf in gzgets() +- Return empty string for gzgets() with len == 1 (like fgets()) +- Fix description of gzgets() in zlib.h for end-of-file, NULL return +- Update minizip to 1.1 [Vollant] +- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c +- Note in zlib.h that gzerror() should be used to distinguish from EOF +- Remove use of snprintf() from gzlib.c +- Fix bug in gzseek() +- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant] +- Fix zconf.h generation in CMakeLists.txt [Lowman] +- Improve comments in zconf.h where modified by configure + +Changes in 1.2.3.8 (13 Feb 2010) +- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer] +- Use z_off64_t in gz_zero() and gz_skip() to match state->skip +- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t) +- Revert to Makefile.in from 1.2.3.6 (live with the clutter) +- Fix missing error return in gzflush(), add zlib.h note +- Add *64 functions to zlib.map [Levin] +- Fix signed/unsigned comparison in gz_comp() +- Use SFLAGS when testing shared linking in configure +- Add --64 option to ./configure to use -m64 with gcc +- Fix ./configure --help to correctly name options +- Have make fail if a test fails [Levin] +- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson] +- Remove assembler object files from contrib + +Changes in 1.2.3.7 (24 Jan 2010) +- Always gzopen() with O_LARGEFILE if available +- Fix gzdirect() to work immediately after gzopen() or gzdopen() +- Make gzdirect() more precise when the state changes while reading +- Improve zlib.h documentation in many places +- Catch memory allocation failure in gz_open() +- Complete close operation if seek forward in gzclose_w() fails +- Return Z_ERRNO from gzclose_r() if close() fails +- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL +- Return zero for gzwrite() errors to match zlib.h description +- Return -1 on gzputs() error to match zlib.h description +- Add zconf.in.h to allow recovery from configure modification [Weigelt] +- Fix static library permissions in Makefile.in [Weigelt] +- Avoid warnings in configure tests that hide functionality [Weigelt] +- Add *BSD and DragonFly to Linux case in configure [gentoo 123571] +- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212] +- Avoid access of uninitialized data for first inflateReset2 call [Gomes] +- Keep object files in subdirectories to reduce the clutter somewhat +- Remove default Makefile and zlibdefs.h, add dummy Makefile +- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_ +- Remove zlibdefs.h completely -- modify zconf.h instead + +Changes in 1.2.3.6 (17 Jan 2010) +- Avoid void * arithmetic in gzread.c and gzwrite.c +- Make compilers happier with const char * for gz_error message +- Avoid unused parameter warning in inflate.c +- Avoid signed-unsigned comparison warning in inflate.c +- Indent #pragma's for traditional C +- Fix usage of strwinerror() in glib.c, change to gz_strwinerror() +- Correct email address in configure for system options +- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser] +- Update zlib.map [Brown] +- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok] +- Apply various fixes to CMakeLists.txt [Lowman] +- Add checks on len in gzread() and gzwrite() +- Add error message for no more room for gzungetc() +- Remove zlib version check in gzwrite() +- Defer compression of gzprintf() result until need to +- Use snprintf() in gzdopen() if available +- Remove USE_MMAP configuration determination (only used by minigzip) +- Remove examples/pigz.c (available separately) +- Update examples/gun.c to 1.6 + +Changes in 1.2.3.5 (8 Jan 2010) +- Add space after #if in zutil.h for some compilers +- Fix relatively harmless bug in deflate_fast() [Exarevsky] +- Fix same problem in deflate_slow() +- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown] +- Add deflate_rle() for faster Z_RLE strategy run-length encoding +- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding +- Change name of "write" variable in inffast.c to avoid library collisions +- Fix premature EOF from gzread() in gzio.c [Brown] +- Use zlib header window size if windowBits is 0 in inflateInit2() +- Remove compressBound() call in deflate.c to avoid linking compress.o +- Replace use of errno in gz* with functions, support WinCE [Alves] +- Provide alternative to perror() in minigzip.c for WinCE [Alves] +- Don't use _vsnprintf on later versions of MSVC [Lowman] +- Add CMake build script and input file [Lowman] +- Update contrib/minizip to 1.1 [Svensson, Vollant] +- Moved nintendods directory from contrib to . +- Replace gzio.c with a new set of routines with the same functionality +- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above +- Update contrib/minizip to 1.1b +- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h + +Changes in 1.2.3.4 (21 Dec 2009) +- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility +- Update comments in configure and Makefile.in for default --shared +- Fix test -z's in configure [Marquess] +- Build examplesh and minigzipsh when not testing +- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h +- Import LDFLAGS from the environment in configure +- Fix configure to populate SFLAGS with discovered CFLAGS options +- Adapt make_vms.com to the new Makefile.in [Zinser] +- Add zlib2ansi script for C++ compilation [Marquess] +- Add _FILE_OFFSET_BITS=64 test to make test (when applicable) +- Add AMD64 assembler code for longest match to contrib [Teterin] +- Include options from $SFLAGS when doing $LDSHARED +- Simplify 64-bit file support by introducing z_off64_t type +- Make shared object files in objs directory to work around old Sun cc +- Use only three-part version number for Darwin shared compiles +- Add rc option to ar in Makefile.in for when ./configure not run +- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4* +- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile +- Protect against _FILE_OFFSET_BITS being defined when compiling zlib +- Rename Makefile.in targets allstatic to static and allshared to shared +- Fix static and shared Makefile.in targets to be independent +- Correct error return bug in gz_open() by setting state [Brown] +- Put spaces before ;;'s in configure for better sh compatibility +- Add pigz.c (parallel implementation of gzip) to examples/ +- Correct constant in crc32.c to UL [Leventhal] +- Reject negative lengths in crc32_combine() +- Add inflateReset2() function to work like inflateEnd()/inflateInit2() +- Include sys/types.h for _LARGEFILE64_SOURCE [Brown] +- Correct typo in doc/algorithm.txt [Janik] +- Fix bug in adler32_combine() [Zhu] +- Catch missing-end-of-block-code error in all inflates and in puff + Assures that random input to inflate eventually results in an error +- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/ +- Update ENOUGH and its usage to reflect discovered bounds +- Fix gzerror() error report on empty input file [Brown] +- Add ush casts in trees.c to avoid pedantic runtime errors +- Fix typo in zlib.h uncompress() description [Reiss] +- Correct inflate() comments with regard to automatic header detection +- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays) +- Put new version of gzlog (2.0) in examples with interruption recovery +- Add puff compile option to permit invalid distance-too-far streams +- Add puff TEST command options, ability to read piped input +- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but + _LARGEFILE64_SOURCE not defined +- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart +- Fix deflateSetDictionary() to use all 32K for output consistency +- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h) +- Clear bytes after deflate lookahead to avoid use of uninitialized data +- Change a limit in inftrees.c to be more transparent to Coverity Prevent +- Update win32/zlib.def with exported symbols from zlib.h +- Correct spelling error in zlib.h [Willem] +- Allow Z_BLOCK for deflate() to force a new block +- Allow negative bits in inflatePrime() to delete existing bit buffer +- Add Z_TREES flush option to inflate() to return at end of trees +- Add inflateMark() to return current state information for random access +- Add Makefile for NintendoDS to contrib [Costa] +- Add -w in configure compile tests to avoid spurious warnings [Beucler] +- Fix typos in zlib.h comments for deflateSetDictionary() +- Fix EOF detection in transparent gzread() [Maier] + +Changes in 1.2.3.3 (2 October 2006) +- Make --shared the default for configure, add a --static option +- Add compile option to permit invalid distance-too-far streams +- Add inflateUndermine() function which is required to enable above +- Remove use of "this" variable name for C++ compatibility [Marquess] +- Add testing of shared library in make test, if shared library built +- Use ftello() and fseeko() if available instead of ftell() and fseek() +- Provide two versions of all functions that use the z_off_t type for + binary compatibility -- a normal version and a 64-bit offset version, + per the Large File Support Extension when _LARGEFILE64_SOURCE is + defined; use the 64-bit versions by default when _FILE_OFFSET_BITS + is defined to be 64 +- Add a --uname= option to configure to perhaps help with cross-compiling + +Changes in 1.2.3.2 (3 September 2006) +- Turn off silly Borland warnings [Hay] +- Use off64_t and define _LARGEFILE64_SOURCE when present +- Fix missing dependency on inffixed.h in Makefile.in +- Rig configure --shared to build both shared and static [Teredesai, Truta] +- Remove zconf.in.h and instead create a new zlibdefs.h file +- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] +- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] + +Changes in 1.2.3.1 (16 August 2006) +- Add watcom directory with OpenWatcom make files [Daniel] +- Remove #undef of FAR in zconf.in.h for MVS [Fedtke] +- Update make_vms.com [Zinser] +- Use -fPIC for shared build in configure [Teredesai, Nicholson] +- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] +- Use fdopen() (not _fdopen()) for Interix in zutil.h [BŠck] +- Add some FAQ entries about the contrib directory +- Update the MVS question in the FAQ +- Avoid extraneous reads after EOF in gzio.c [Brown] +- Correct spelling of "successfully" in gzio.c [Randers-Pehrson] +- Add comments to zlib.h about gzerror() usage [Brown] +- Set extra flags in gzip header in gzopen() like deflate() does +- Make configure options more compatible with double-dash conventions + [Weigelt] +- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] +- Fix uninstall target in Makefile.in [Truta] +- Add pkgconfig support [Weigelt] +- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] +- Replace set_data_type() with a more accurate detect_data_type() in + trees.c, according to the txtvsbin.txt document [Truta] +- Swap the order of #include <stdio.h> and #include "zlib.h" in + gzio.c, example.c and minigzip.c [Truta] +- Shut up annoying VS2005 warnings about standard C deprecation [Rowe, + Truta] (where?) +- Fix target "clean" from win32/Makefile.bor [Truta] +- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] +- Update zlib www home address in win32/DLL_FAQ.txt [Truta] +- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] +- Enable browse info in the "Debug" and "ASM Debug" configurations in + the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] +- Add pkgconfig support [Weigelt] +- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, + for use in win32/zlib1.rc [Polushin, Rowe, Truta] +- Add a document that explains the new text detection scheme to + doc/txtvsbin.txt [Truta] +- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] +- Move algorithm.txt into doc/ [Truta] +- Synchronize FAQ with website +- Fix compressBound(), was low for some pathological cases [Fearnley] +- Take into account wrapper variations in deflateBound() +- Set examples/zpipe.c input and output to binary mode for Windows +- Update examples/zlib_how.html with new zpipe.c (also web site) +- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems + that gcc became pickier in 4.0) +- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain + un-versioned, the patch adds versioning only for symbols introduced in + zlib-1.2.0 or later. It also declares as local those symbols which are + not designed to be exported." [Levin] +- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure +- Do not initialize global static by default in trees.c, add a response + NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] +- Don't use strerror() in gzio.c under WinCE [Yakimov] +- Don't use errno.h in zutil.h under WinCE [Yakimov] +- Move arguments for AR to its usage to allow replacing ar [Marot] +- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] +- Improve inflateInit() and inflateInit2() documentation +- Fix structure size comment in inflate.h +- Change configure help option from --h* to --help [Santos] + Changes in 1.2.3 (18 July 2005) - Apply security vulnerability fixes to contrib/infback9 as well - Clean up some text files (carriage returns, trailing space) @@ -13,7 +366,7 @@ Changes in 1.2.2.4 (11 July 2005) compile - Fix some spelling errors in comments [Betts] - Correct inflateInit2() error return documentation in zlib.h -- Added zran.c example of compressed data random access to examples +- Add zran.c example of compressed data random access to examples directory, shows use of inflatePrime() - Fix cast for assignments to strm->state in inflate.c and infback.c - Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] diff --git a/Modules/zlib/FAQ b/Modules/zlib/FAQ index 441d910daa1..1a22750a58e 100644 --- a/Modules/zlib/FAQ +++ b/Modules/zlib/FAQ @@ -3,8 +3,8 @@ If your question is not there, please check the zlib home page -http://www.zlib.org which may have more recent information. -The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html +http://zlib.net/ which may have more recent information. +The lastest zlib FAQ is at http://zlib.net/zlib_faq.html 1. Is zlib Y2K-compliant? @@ -13,54 +13,51 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 2. Where can I get a Windows DLL version? - The zlib sources can be compiled without change to produce a DLL. - See the file win32/DLL_FAQ.txt in the zlib distribution. - Pointers to the precompiled DLL are found in the zlib web site at - http://www.zlib.org. + The zlib sources can be compiled without change to produce a DLL. See the + file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the + precompiled DLL are found in the zlib web site at http://zlib.net/ . 3. Where can I get a Visual Basic interface to zlib? See - * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm - * contrib/visual-basic.txt in the zlib distribution + * http://marknelson.us/1997/01/01/zlib-engine/ * win32/DLL_FAQ.txt in the zlib distribution 4. compress() returns Z_BUF_ERROR. - Make sure that before the call of compress, the length of the compressed - buffer is equal to the total size of the compressed buffer and not - zero. For Visual Basic, check that this parameter is passed by reference + Make sure that before the call of compress(), the length of the compressed + buffer is equal to the available size of the compressed buffer and not + zero. For Visual Basic, check that this parameter is passed by reference ("as any"), not by value ("as long"). 5. deflate() or inflate() returns Z_BUF_ERROR. - Before making the call, make sure that avail_in and avail_out are not - zero. When setting the parameter flush equal to Z_FINISH, also make sure - that avail_out is big enough to allow processing all pending input. - Note that a Z_BUF_ERROR is not fatal--another call to deflate() or - inflate() can be made with more input or output space. A Z_BUF_ERROR - may in fact be unavoidable depending on how the functions are used, since - it is not possible to tell whether or not there is more output pending - when strm.avail_out returns with zero. + Before making the call, make sure that avail_in and avail_out are not zero. + When setting the parameter flush equal to Z_FINISH, also make sure that + avail_out is big enough to allow processing all pending input. Note that a + Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be + made with more input or output space. A Z_BUF_ERROR may in fact be + unavoidable depending on how the functions are used, since it is not + possible to tell whether or not there is more output pending when + strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a + heavily annotated example. 6. Where's the zlib documentation (man pages, etc.)? - It's in zlib.h for the moment, and Francis S. Lin has converted it to a - web page zlib.html. Volunteers to transform this to Unix-style man pages, - please contact us (zlib@gzip.org). Examples of zlib usage are in the files - example.c and minigzip.c. + It's in zlib.h . Examples of zlib usage are in the files example.c and + minigzip.c, with more in examples/ . 7. Why don't you use GNU autoconf or libtool or ...? - Because we would like to keep zlib as a very small and simple - package. zlib is rather portable and doesn't need much configuration. + Because we would like to keep zlib as a very small and simple package. + zlib is rather portable and doesn't need much configuration. 8. I found a bug in zlib. - Most of the time, such problems are due to an incorrect usage of - zlib. Please try to reproduce the problem with a small program and send - the corresponding source to us at zlib@gzip.org . Do not send - multi-megabyte data files without prior agreement. + Most of the time, such problems are due to an incorrect usage of zlib. + Please try to reproduce the problem with a small program and send the + corresponding source to us at zlib@gzip.org . Do not send multi-megabyte + data files without prior agreement. 9. Why do I get "undefined reference to gzputc"? @@ -82,7 +79,7 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 12. Can zlib handle .Z files? - No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt + No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt the code of uncompress on your own. 13. How can I make a Unix shared library? @@ -99,8 +96,10 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html However, many flavors of Unix come with a shared zlib already installed. Before going to the trouble of compiling a shared version of zlib and - trying to install it, you may want to check if it's already there! If you - can #include <zlib.h>, it's there. The -lz option will probably link to it. + trying to install it, you may want to check if it's already there! If you + can #include <zlib.h>, it's there. The -lz option will probably link to + it. You can check the version at the top of zlib.h or with the + ZLIB_VERSION symbol defined in zlib.h . 15. I have a question about OttoPDF. @@ -109,8 +108,8 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 16. Can zlib decode Flate data in an Adobe PDF file? - Yes. See http://www.fastio.com/ (ClibPDF), or http://www.pdflib.com/ . - To modify PDF forms, see http://sourceforge.net/projects/acroformtool/ . + Yes. See http://www.pdflib.com/ . To modify PDF forms, see + http://sourceforge.net/projects/acroformtool/ . 17. Why am I getting this "register_frame_info not found" error on Solaris? @@ -121,67 +120,67 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html symbol __register_frame_info: referenced symbol not found The symbol __register_frame_info is not part of zlib, it is generated by - the C compiler (cc or gcc). You must recompile applications using zlib - which have this problem. This problem is specific to Solaris. See + the C compiler (cc or gcc). You must recompile applications using zlib + which have this problem. This problem is specific to Solaris. See http://www.sunfreeware.com for Solaris versions of zlib and applications using zlib. 18. Why does gzip give an error on a file I make with compress/deflate? The compress and deflate functions produce data in the zlib format, which - is different and incompatible with the gzip format. The gz* functions in - zlib on the other hand use the gzip format. Both the zlib and gzip - formats use the same compressed data format internally, but have different - headers and trailers around the compressed data. + is different and incompatible with the gzip format. The gz* functions in + zlib on the other hand use the gzip format. Both the zlib and gzip formats + use the same compressed data format internally, but have different headers + and trailers around the compressed data. 19. Ok, so why are there two different formats? - The gzip format was designed to retain the directory information about - a single file, such as the name and last modification date. The zlib - format on the other hand was designed for in-memory and communication - channel applications, and has a much more compact header and trailer and - uses a faster integrity check than gzip. + The gzip format was designed to retain the directory information about a + single file, such as the name and last modification date. The zlib format + on the other hand was designed for in-memory and communication channel + applications, and has a much more compact header and trailer and uses a + faster integrity check than gzip. 20. Well that's nice, but how do I make a gzip file in memory? You can request that deflate write the gzip format instead of the zlib - format using deflateInit2(). You can also request that inflate decode - the gzip format using inflateInit2(). Read zlib.h for more details. + format using deflateInit2(). You can also request that inflate decode the + gzip format using inflateInit2(). Read zlib.h for more details. 21. Is zlib thread-safe? - Yes. However any library routines that zlib uses and any application- - provided memory allocation routines must also be thread-safe. zlib's gz* + Yes. However any library routines that zlib uses and any application- + provided memory allocation routines must also be thread-safe. zlib's gz* functions use stdio library routines, and most of zlib's functions use the - library memory allocation routines by default. zlib's Init functions allow - for the application to provide custom memory allocation routines. + library memory allocation routines by default. zlib's *Init* functions + allow for the application to provide custom memory allocation routines. Of course, you should only operate on any given zlib or gzip stream from a single thread at a time. 22. Can I use zlib in my commercial application? - Yes. Please read the license in zlib.h. + Yes. Please read the license in zlib.h. 23. Is zlib under the GNU license? - No. Please read the license in zlib.h. + No. Please read the license in zlib.h. 24. The license says that altered source versions must be "plainly marked". So what exactly do I need to do to meet that requirement? - You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In + You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In particular, the final version number needs to be changed to "f", and an - identification string should be appended to ZLIB_VERSION. Version numbers + identification string should be appended to ZLIB_VERSION. Version numbers x.x.x.f are reserved for modifications to zlib by others than the zlib - maintainers. For example, if the version of the base zlib you are altering + maintainers. For example, if the version of the base zlib you are altering is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and - ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also + ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also update the version strings in deflate.c and inftrees.c. For altered source distributions, you should also note the origin and nature of the changes in zlib.h, as well as in ChangeLog and README, along - with the dates of the alterations. The origin should include at least your + with the dates of the alterations. The origin should include at least your name (or your company's name), and an email address to contact for help or issues with the library. @@ -197,105 +196,112 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 26. Will zlib work on a 64-bit machine? - It should. It has been tested on 64-bit machines, and has no dependence - on any data types being limited to 32-bits in length. If you have any + Yes. It has been tested on 64-bit machines, and has no dependence on any + data types being limited to 32-bits in length. If you have any difficulties, please provide a complete problem report to zlib@gzip.org 27. Will zlib decompress data from the PKWare Data Compression Library? - No. The PKWare DCL uses a completely different compressed data format - than does PKZIP and zlib. However, you can look in zlib's contrib/blast + No. The PKWare DCL uses a completely different compressed data format than + does PKZIP and zlib. However, you can look in zlib's contrib/blast directory for a possible solution to your problem. 28. Can I access data randomly in a compressed stream? - No, not without some preparation. If when compressing you periodically - use Z_FULL_FLUSH, carefully write all the pending data at those points, - and keep an index of those locations, then you can start decompression - at those points. You have to be careful to not use Z_FULL_FLUSH too - often, since it can significantly degrade compression. + No, not without some preparation. If when compressing you periodically use + Z_FULL_FLUSH, carefully write all the pending data at those points, and + keep an index of those locations, then you can start decompression at those + points. You have to be careful to not use Z_FULL_FLUSH too often, since it + can significantly degrade compression. Alternatively, you can scan a + deflate stream once to generate an index, and then use that index for + random access. See examples/zran.c . 29. Does zlib work on MVS, OS/390, CICS, etc.? - We don't know for sure. We have heard occasional reports of success on - these systems. If you do use it on one of these, please provide us with - a report, instructions, and patches that we can reference when we get - these questions. Thanks. + It has in the past, but we have not heard of any recent evidence. There + were working ports of zlib 1.1.4 to MVS, but those links no longer work. + If you know of recent, successful applications of zlib on these operating + systems, please let us know. Thanks. -30. Is there some simpler, easier to read version of inflate I can look at - to understand the deflate format? +30. Is there some simpler, easier to read version of inflate I can look at to + understand the deflate format? - First off, you should read RFC 1951. Second, yes. Look in zlib's + First off, you should read RFC 1951. Second, yes. Look in zlib's contrib/puff directory. 31. Does zlib infringe on any patents? - As far as we know, no. In fact, that was originally the whole point behind - zlib. Look here for some more information: + As far as we know, no. In fact, that was originally the whole point behind + zlib. Look here for some more information: http://www.gzip.org/#faq11 32. Can zlib work with greater than 4 GB of data? - Yes. inflate() and deflate() will process any amount of data correctly. + Yes. inflate() and deflate() will process any amount of data correctly. Each call of inflate() or deflate() is limited to input and output chunks of the maximum value that can be stored in the compiler's "unsigned int" - type, but there is no limit to the number of chunks. Note however that the - strm.total_in and strm_total_out counters may be limited to 4 GB. These + type, but there is no limit to the number of chunks. Note however that the + strm.total_in and strm_total_out counters may be limited to 4 GB. These counters are provided as a convenience and are not used internally by - inflate() or deflate(). The application can easily set up its own counters + inflate() or deflate(). The application can easily set up its own counters updated after each call of inflate() or deflate() to count beyond 4 GB. compress() and uncompress() may be limited to 4 GB, since they operate in a - single call. gzseek() and gztell() may be limited to 4 GB depending on how - zlib is compiled. See the zlibCompileFlags() function in zlib.h. + single call. gzseek() and gztell() may be limited to 4 GB depending on how + zlib is compiled. See the zlibCompileFlags() function in zlib.h. - The word "may" appears several times above since there is a 4 GB limit - only if the compiler's "long" type is 32 bits. If the compiler's "long" - type is 64 bits, then the limit is 16 exabytes. + The word "may" appears several times above since there is a 4 GB limit only + if the compiler's "long" type is 32 bits. If the compiler's "long" type is + 64 bits, then the limit is 16 exabytes. 33. Does zlib have any security vulnerabilities? - The only one that we are aware of is potentially in gzprintf(). If zlib - is compiled to use sprintf() or vsprintf(), then there is no protection - against a buffer overflow of a 4K string space, other than the caller of - gzprintf() assuring that the output will not exceed 4K. On the other - hand, if zlib is compiled to use snprintf() or vsnprintf(), which should - normally be the case, then there is no vulnerability. The ./configure - script will display warnings if an insecure variation of sprintf() will - be used by gzprintf(). Also the zlibCompileFlags() function will return - information on what variant of sprintf() is used by gzprintf(). + The only one that we are aware of is potentially in gzprintf(). If zlib is + compiled to use sprintf() or vsprintf(), then there is no protection + against a buffer overflow of an 8K string space (or other value as set by + gzbuffer()), other than the caller of gzprintf() assuring that the output + will not exceed 8K. On the other hand, if zlib is compiled to use + snprintf() or vsnprintf(), which should normally be the case, then there is + no vulnerability. The ./configure script will display warnings if an + insecure variation of sprintf() will be used by gzprintf(). Also the + zlibCompileFlags() function will return information on what variant of + sprintf() is used by gzprintf(). If you don't have snprintf() or vsnprintf() and would like one, you can find a portable implementation here: http://www.ijs.si/software/snprintf/ - Note that you should be using the most recent version of zlib. Versions - 1.1.3 and before were subject to a double-free vulnerability. + Note that you should be using the most recent version of zlib. Versions + 1.1.3 and before were subject to a double-free vulnerability, and versions + 1.2.1 and 1.2.2 were subject to an access exception when decompressing + invalid compressed data. 34. Is there a Java version of zlib? Probably what you want is to use zlib in Java. zlib is already included as part of the Java SDK in the java.util.zip package. If you really want a version of zlib written in the Java language, look on the zlib home - page for links: http://www.zlib.org/ + page for links: http://zlib.net/ . 35. I get this or that compiler or source-code scanner warning when I crank it up to maximally-pedantic. Can't you guys write proper code? Many years ago, we gave up attempting to avoid warnings on every compiler - in the universe. It just got to be a waste of time, and some compilers - were downright silly. So now, we simply make sure that the code always - works. + in the universe. It just got to be a waste of time, and some compilers + were downright silly as well as contradicted each other. So now, we simply + make sure that the code always works. 36. Valgrind (or some similar memory access checker) says that deflate is performing a conditional jump that depends on an uninitialized value. Isn't that a bug? - No. That is intentional for performance reasons, and the output of - deflate is not affected. This only started showing up recently since - zlib 1.2.x uses malloc() by default for allocations, whereas earlier - versions used calloc(), which zeros out the allocated memory. + No. That is intentional for performance reasons, and the output of deflate + is not affected. This only started showing up recently since zlib 1.2.x + uses malloc() by default for allocations, whereas earlier versions used + calloc(), which zeros out the allocated memory. Even though the code was + correct, versions 1.2.4 and later was changed to not stimulate these + checkers. 37. Will zlib read the (insert any ancient or arcane format here) compressed data format? @@ -305,20 +311,21 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 38. How can I encrypt/decrypt zip files with zlib? - zlib doesn't support encryption. The original PKZIP encryption is very weak - and can be broken with freely available programs. To get strong encryption, - use GnuPG, http://www.gnupg.org/ , which already includes zlib compression. - For PKZIP compatible "encryption", look at http://www.info-zip.org/ + zlib doesn't support encryption. The original PKZIP encryption is very + weak and can be broken with freely available programs. To get strong + encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib + compression. For PKZIP compatible "encryption", look at + http://www.info-zip.org/ 39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? - "gzip" is the gzip format, and "deflate" is the zlib format. They should - probably have called the second one "zlib" instead to avoid confusion - with the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 + "gzip" is the gzip format, and "deflate" is the zlib format. They should + probably have called the second one "zlib" instead to avoid confusion with + the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 correctly points to the zlib specification in RFC 1950 for the "deflate" transfer encoding, there have been reports of servers and browsers that incorrectly produce or expect raw deflate data per the deflate - specficiation in RFC 1951, most notably Microsoft. So even though the + specficiation in RFC 1951, most notably Microsoft. So even though the "deflate" transfer encoding using the zlib format would be the more efficient approach (and in fact exactly what the zlib format was designed for), using the "gzip" transfer encoding is probably more reliable due to @@ -328,12 +335,32 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 40. Does zlib support the new "Deflate64" format introduced by PKWare? - No. PKWare has apparently decided to keep that format proprietary, since - they have not documented it as they have previous compression formats. - In any case, the compression improvements are so modest compared to other - more modern approaches, that it's not worth the effort to implement. + No. PKWare has apparently decided to keep that format proprietary, since + they have not documented it as they have previous compression formats. In + any case, the compression improvements are so modest compared to other more + modern approaches, that it's not worth the effort to implement. -41. Can you please sign these lengthy legal documents and fax them back to us +41. I'm having a problem with the zip functions in zlib, can you help? + + There are no zip functions in zlib. You are probably using minizip by + Giles Vollant, which is found in the contrib directory of zlib. It is not + part of zlib. In fact none of the stuff in contrib is part of zlib. The + files in there are not supported by the zlib authors. You need to contact + the authors of the respective contribution for help. + +42. The match.asm code in contrib is under the GNU General Public License. + Since it's part of zlib, doesn't that mean that all of zlib falls under the + GNU GPL? + + No. The files in contrib are not part of zlib. They were contributed by + other authors and are provided as a convenience to the user within the zlib + distribution. Each item in contrib has its own license. + +43. Is zlib subject to export controls? What is its ECCN? + + zlib is not subject to export controls, and so is classified as EAR99. + +44. Can you please sign these lengthy legal documents and fax them back to us so that we can use your software in our product? No. Go away. Shoo. diff --git a/Modules/zlib/INDEX b/Modules/zlib/INDEX index 0587e5902bd..f6c51ca1759 100644 --- a/Modules/zlib/INDEX +++ b/Modules/zlib/INDEX @@ -1,23 +1,32 @@ +CMakeLists.txt cmake build file ChangeLog history of changes FAQ Frequently Asked Questions about zlib INDEX this file -Makefile makefile for Unix (generated by configure) -Makefile.in makefile for Unix (template for configure) +Makefile dummy Makefile that tells you to ./configure +Makefile.in template for Unix Makefile README guess what -algorithm.txt description of the (de)compression algorithm configure configure script for Unix -zconf.in.h template for zconf.h (used by configure) +make_vms.com makefile for VMS +treebuild.xml XML description of source file dependencies +zconf.h.cmakein zconf.h template for cmake +zconf.h.in zconf.h template for configure +zlib.3 Man page for zlib +zlib.3.pdf Man page in PDF format +zlib.map Linux symbol information +zlib.pc.in Template for pkg-config descriptor +zlib2ansi perl script to convert source files for C++ compilation amiga/ makefiles for Amiga SAS C -as400/ makefiles for IBM AS/400 +doc/ documentation for formats and algorithms msdos/ makefiles for MSDOS +nintendods/ makefile for Nintendo DS old/ makefiles for various architectures and zlib documentation files that have not yet been updated for zlib 1.2.x -projects/ projects for various Integrated Development Environments qnx/ makefiles for QNX +watcom/ makefiles for OpenWatcom win32/ makefiles for Windows - zlib public header files (must be kept): + zlib public header files (required for library use): zconf.h zlib.h @@ -28,7 +37,11 @@ crc32.c crc32.h deflate.c deflate.h -gzio.c +gzclose.c +gzguts.h +gzlib.c +gzread.c +gzwrite.c infback.c inffast.c inffast.h @@ -46,6 +59,7 @@ zutil.h source files for sample programs: example.c minigzip.c +See examples/README.examples for more unsupported contribution by third parties See contrib/README.contrib diff --git a/Modules/zlib/Makefile b/Modules/zlib/Makefile index 2fd6e45c48d..6bba86c73fc 100644 --- a/Modules/zlib/Makefile +++ b/Modules/zlib/Makefile @@ -1,154 +1,5 @@ -# Makefile for zlib -# Copyright (C) 1995-2005 Jean-loup Gailly. -# For conditions of distribution and use, see copyright notice in zlib.h +all: + -@echo "Please use ./configure first. Thank you." -# To compile and test, type: -# ./configure; make test -# The call of configure is optional if you don't have special requirements -# If you wish to build zlib as a shared library, use: ./configure -s - -# To use the asm code, type: -# cp contrib/asm?86/match.S ./match.S -# make LOC=-DASMV OBJA=match.o - -# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: -# make install -# To install in $HOME instead of /usr/local, use: -# make install prefix=$HOME - -CC=cc - -CFLAGS=-O -#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 -#CFLAGS=-g -DDEBUG -#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ -# -Wstrict-prototypes -Wmissing-prototypes - -LDFLAGS=libz.a -LDSHARED=$(CC) -CPP=$(CC) -E - -LIBS=libz.a -SHAREDLIB=libz.so -SHAREDLIBV=libz.so.1.2.3 -SHAREDLIBM=libz.so.1 - -AR=ar rc -RANLIB=ranlib -TAR=tar -SHELL=/bin/sh -EXE= - -prefix = /usr/local -exec_prefix = ${prefix} -libdir = ${exec_prefix}/lib -includedir = ${prefix}/include -mandir = ${prefix}/share/man -man3dir = ${mandir}/man3 - -OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ - zutil.o inflate.o infback.o inftrees.o inffast.o - -OBJA = -# to use the asm code: make OBJA=match.o - -TEST_OBJS = example.o minigzip.o - -all: example$(EXE) minigzip$(EXE) - -check: test -test: all - @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ - echo hello world | ./minigzip | ./minigzip -d || \ - echo ' *** minigzip test FAILED ***' ; \ - if ./example; then \ - echo ' *** zlib test OK ***'; \ - else \ - echo ' *** zlib test FAILED ***'; \ - fi - -libz.a: $(OBJS) $(OBJA) - $(AR) $@ $(OBJS) $(OBJA) - -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 - -match.o: match.S - $(CPP) match.S > _match.s - $(CC) -c _match.s - mv _match.o match.o - rm -f _match.s - -$(SHAREDLIBV): $(OBJS) - $(LDSHARED) -o $@ $(OBJS) - rm -f $(SHAREDLIB) $(SHAREDLIBM) - ln -s $@ $(SHAREDLIB) - ln -s $@ $(SHAREDLIBM) - -example$(EXE): example.o $(LIBS) - $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) - -minigzip$(EXE): minigzip.o $(LIBS) - $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) - -install: $(LIBS) - -@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi - -@if [ ! -d $(includedir) ]; then mkdir -p $(includedir); fi - -@if [ ! -d $(libdir) ]; then mkdir -p $(libdir); fi - -@if [ ! -d $(man3dir) ]; then mkdir -p $(man3dir); fi - cp zlib.h zconf.h $(includedir) - chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h - cp $(LIBS) $(libdir) - cd $(libdir); chmod 755 $(LIBS) - -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 - cd $(libdir); if test -f $(SHAREDLIBV); then \ - rm -f $(SHAREDLIB) $(SHAREDLIBM); \ - ln -s $(SHAREDLIBV) $(SHAREDLIB); \ - ln -s $(SHAREDLIBV) $(SHAREDLIBM); \ - (ldconfig || true) >/dev/null 2>&1; \ - fi - cp zlib.3 $(man3dir) - chmod 644 $(man3dir)/zlib.3 -# The ranlib in install is needed on NeXTSTEP which checks file times -# ldconfig is for Linux - -uninstall: - cd $(includedir); \ - cd $(libdir); rm -f libz.a; \ - if test -f $(SHAREDLIBV); then \ - rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ - fi - cd $(man3dir); rm -f zlib.3 - -mostlyclean: clean -clean: - rm -f *.o *~ example$(EXE) minigzip$(EXE) \ - libz.* foo.gz so_locations \ - _match.s maketree contrib/infback9/*.o - -maintainer-clean: distclean -distclean: clean - cp -p Makefile.in Makefile - cp -p zconf.in.h zconf.h - rm -f .DS_Store - -tags: - etags *.[ch] - -depend: - makedepend -- $(CFLAGS) -- *.[ch] - -# DO NOT DELETE THIS LINE -- make depend depends on it. - -adler32.o: zlib.h zconf.h -compress.o: zlib.h zconf.h -crc32.o: crc32.h zlib.h zconf.h -deflate.o: deflate.h zutil.h zlib.h zconf.h -example.o: zlib.h zconf.h -gzio.o: zutil.h zlib.h zconf.h -inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h -inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h -infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h -inftrees.o: zutil.h zlib.h zconf.h inftrees.h -minigzip.o: zlib.h zconf.h -trees.o: deflate.h zutil.h zlib.h zconf.h trees.h -uncompr.o: zlib.h zconf.h -zutil.o: zutil.h zlib.h zconf.h +distclean: + make -f Makefile.in distclean diff --git a/Modules/zlib/Makefile.in b/Modules/zlib/Makefile.in index 2fd6e45c48d..5b15bd00d73 100644 --- a/Modules/zlib/Makefile.in +++ b/Modules/zlib/Makefile.in @@ -1,11 +1,11 @@ # Makefile for zlib -# Copyright (C) 1995-2005 Jean-loup Gailly. +# Copyright (C) 1995-2010 Jean-loup Gailly. # For conditions of distribution and use, see copyright notice in zlib.h # To compile and test, type: # ./configure; make test -# The call of configure is optional if you don't have special requirements -# If you wish to build zlib as a shared library, use: ./configure -s +# Normally configure builds both a static and a shared library. +# If you want to build just a static library, use: ./configure --static # To use the asm code, type: # cp contrib/asm?86/match.S ./match.S @@ -24,17 +24,22 @@ CFLAGS=-O #CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ # -Wstrict-prototypes -Wmissing-prototypes -LDFLAGS=libz.a +SFLAGS=-O +LDFLAGS= +TEST_LDFLAGS=-L. libz.a LDSHARED=$(CC) CPP=$(CC) -E -LIBS=libz.a +STATICLIB=libz.a SHAREDLIB=libz.so -SHAREDLIBV=libz.so.1.2.3 +SHAREDLIBV=libz.so.1.2.5 SHAREDLIBM=libz.so.1 +LIBS=$(STATICLIB) $(SHAREDLIBV) AR=ar rc RANLIB=ranlib +LDCONFIG=ldconfig +LDSHAREDLIBC=-lc TAR=tar SHELL=/bin/sh EXE= @@ -42,33 +47,68 @@ EXE= prefix = /usr/local exec_prefix = ${prefix} libdir = ${exec_prefix}/lib +sharedlibdir = ${libdir} includedir = ${prefix}/include mandir = ${prefix}/share/man man3dir = ${mandir}/man3 +pkgconfigdir = ${libdir}/pkgconfig -OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ - zutil.o inflate.o infback.o inftrees.o inffast.o +OBJC = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ + gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o +PIC_OBJC = adler32.lo compress.lo crc32.lo deflate.lo gzclose.lo gzlib.lo gzread.lo \ + gzwrite.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo uncompr.lo zutil.lo + +# to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo OBJA = -# to use the asm code: make OBJA=match.o +PIC_OBJA = + +OBJS = $(OBJC) $(OBJA) + +PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) + +all: static shared -TEST_OBJS = example.o minigzip.o +static: example$(EXE) minigzip$(EXE) -all: example$(EXE) minigzip$(EXE) +shared: examplesh$(EXE) minigzipsh$(EXE) + +all64: example64$(EXE) minigzip64$(EXE) check: test -test: all - @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ - echo hello world | ./minigzip | ./minigzip -d || \ - echo ' *** minigzip test FAILED ***' ; \ - if ./example; then \ + +test: all teststatic testshared + +teststatic: static + @if echo hello world | ./minigzip | ./minigzip -d && ./example; then \ echo ' *** zlib test OK ***'; \ else \ - echo ' *** zlib test FAILED ***'; \ + echo ' *** zlib test FAILED ***'; false; \ + fi + -@rm -f foo.gz + +testshared: shared + @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \ + DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ + SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ + if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh; then \ + echo ' *** zlib shared test OK ***'; \ + else \ + echo ' *** zlib shared test FAILED ***'; false; \ + fi + -@rm -f foo.gz + +test64: all64 + @if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64; then \ + echo ' *** zlib 64-bit test OK ***'; \ + else \ + echo ' *** zlib 64-bit test FAILED ***'; false; \ fi + -@rm -f foo.gz -libz.a: $(OBJS) $(OBJA) - $(AR) $@ $(OBJS) $(OBJA) +libz.a: $(OBJS) + $(AR) $@ $(OBJS) -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 match.o: match.S @@ -77,58 +117,116 @@ match.o: match.S mv _match.o match.o rm -f _match.s -$(SHAREDLIBV): $(OBJS) - $(LDSHARED) -o $@ $(OBJS) +match.lo: match.S + $(CPP) match.S > _match.s + $(CC) -c -fPIC _match.s + mv _match.o match.lo + rm -f _match.s + +example64.o: example.c zlib.h zconf.h + $(CC) $(CFLAGS) -D_FILE_OFFSET_BITS=64 -c -o $@ example.c + +minigzip64.o: minigzip.c zlib.h zconf.h + $(CC) $(CFLAGS) -D_FILE_OFFSET_BITS=64 -c -o $@ minigzip.c + +.SUFFIXES: .lo + +.c.lo: + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) -DPIC -c -o objs/$*.o $< + -@mv objs/$*.o $@ + +$(SHAREDLIBV): $(PIC_OBJS) + $(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS) rm -f $(SHAREDLIB) $(SHAREDLIBM) ln -s $@ $(SHAREDLIB) ln -s $@ $(SHAREDLIBM) + -@rmdir objs + +example$(EXE): example.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) + +minigzip$(EXE): minigzip.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) + +examplesh$(EXE): example.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV) + +minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) -example$(EXE): example.o $(LIBS) - $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) - -minigzip$(EXE): minigzip.o $(LIBS) - $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) - -install: $(LIBS) - -@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi - -@if [ ! -d $(includedir) ]; then mkdir -p $(includedir); fi - -@if [ ! -d $(libdir) ]; then mkdir -p $(libdir); fi - -@if [ ! -d $(man3dir) ]; then mkdir -p $(man3dir); fi - cp zlib.h zconf.h $(includedir) - chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h - cp $(LIBS) $(libdir) - cd $(libdir); chmod 755 $(LIBS) - -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 - cd $(libdir); if test -f $(SHAREDLIBV); then \ +example64$(EXE): example64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) + +minigzip64$(EXE): minigzip64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS) + +install-libs: $(LIBS) + -@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi + -@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi + -@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi + -@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi + -@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi + cp $(STATICLIB) $(DESTDIR)$(libdir) + cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir) + cd $(DESTDIR)$(libdir); chmod u=rw,go=r $(STATICLIB) + -@(cd $(DESTDIR)$(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 + -@cd $(DESTDIR)$(sharedlibdir); if test "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ + chmod 755 $(SHAREDLIBV); \ rm -f $(SHAREDLIB) $(SHAREDLIBM); \ ln -s $(SHAREDLIBV) $(SHAREDLIB); \ ln -s $(SHAREDLIBV) $(SHAREDLIBM); \ - (ldconfig || true) >/dev/null 2>&1; \ + ($(LDCONFIG) || true) >/dev/null 2>&1; \ fi - cp zlib.3 $(man3dir) - chmod 644 $(man3dir)/zlib.3 + cp zlib.3 $(DESTDIR)$(man3dir) + chmod 644 $(DESTDIR)$(man3dir)/zlib.3 + cp zlib.pc $(DESTDIR)$(pkgconfigdir) + chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc # The ranlib in install is needed on NeXTSTEP which checks file times # ldconfig is for Linux +install: install-libs + -@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi + cp zlib.h zconf.h $(DESTDIR)$(includedir) + chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h + uninstall: - cd $(includedir); \ - cd $(libdir); rm -f libz.a; \ - if test -f $(SHAREDLIBV); then \ + cd $(DESTDIR)$(includedir); rm -f zlib.h zconf.h + cd $(DESTDIR)$(libdir); rm -f libz.a; \ + if test "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ fi - cd $(man3dir); rm -f zlib.3 + cd $(DESTDIR)$(man3dir); rm -f zlib.3 + cd $(DESTDIR)$(pkgconfigdir); rm -f zlib.pc + +docs: zlib.3.pdf + +zlib.3.pdf: zlib.3 + groff -mandoc -f H -T ps zlib.3 | ps2pdf - zlib.3.pdf + +zconf.h.in: zconf.h.cmakein + sed "/^#cmakedefine/D" < zconf.h.cmakein > zconf.h.in + touch -r zconf.h.cmakein zconf.h.in + +zconf: zconf.h.in + cp -p zconf.h.in zconf.h mostlyclean: clean clean: - rm -f *.o *~ example$(EXE) minigzip$(EXE) \ + rm -f *.o *.lo *~ \ + example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ + example64$(EXE) minigzip64$(EXE) \ libz.* foo.gz so_locations \ _match.s maketree contrib/infback9/*.o + rm -rf objs maintainer-clean: distclean -distclean: clean - cp -p Makefile.in Makefile - cp -p zconf.in.h zconf.h - rm -f .DS_Store +distclean: clean zconf docs + rm -f Makefile zlib.pc + -@rm -f .DS_Store + -@printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile + -@printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile + -@touch -r Makefile.in Makefile tags: etags *.[ch] @@ -138,17 +236,22 @@ depend: # DO NOT DELETE THIS LINE -- make depend depends on it. -adler32.o: zlib.h zconf.h -compress.o: zlib.h zconf.h -crc32.o: crc32.h zlib.h zconf.h +adler32.o zutil.o: zutil.h zlib.h zconf.h +gzclose.o gzlib.o gzread.o gzwrite.o: zlib.h zconf.h gzguts.h +compress.o example.o minigzip.o uncompr.o: zlib.h zconf.h +crc32.o: zutil.h zlib.h zconf.h crc32.h deflate.o: deflate.h zutil.h zlib.h zconf.h -example.o: zlib.h zconf.h -gzio.o: zutil.h zlib.h zconf.h +infback.o inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inffixed.h inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h -inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h -infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inftrees.o: zutil.h zlib.h zconf.h inftrees.h -minigzip.o: zlib.h zconf.h trees.o: deflate.h zutil.h zlib.h zconf.h trees.h -uncompr.o: zlib.h zconf.h -zutil.o: zutil.h zlib.h zconf.h + +adler32.lo zutil.lo: zutil.h zlib.h zconf.h +gzclose.lo gzlib.lo gzread.lo gzwrite.lo: zlib.h zconf.h gzguts.h +compress.lo example.lo minigzip.lo uncompr.lo: zlib.h zconf.h +crc32.lo: zutil.h zlib.h zconf.h crc32.h +deflate.lo: deflate.h zutil.h zlib.h zconf.h +infback.lo inflate.lo: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inffixed.h +inffast.lo: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.lo: zutil.h zlib.h zconf.h inftrees.h +trees.lo: deflate.h zutil.h zlib.h zconf.h trees.h diff --git a/Modules/zlib/README b/Modules/zlib/README index 758cc50020d..d4219bf889f 100644 --- a/Modules/zlib/README +++ b/Modules/zlib/README @@ -1,56 +1,52 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.3 is a general purpose data compression library. All the code is +zlib 1.2.5 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) -and rfc1952.txt (gzip format). These documents are also available in other -formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html +and rfc1952.txt (gzip format). All functions of the compression library are documented in the file zlib.h -(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example of the library is given in the file example.c which also tests that the library -is working correctly. Another example is given in the file minigzip.c. The +is working correctly. Another example is given in the file minigzip.c. The compression library itself is composed of all source files except example.c and minigzip.c. To compile all files and run the test program, follow the instructions given at -the top of Makefile. In short "make test; make install" should work for most -machines. For Unix: "./configure; make test; make install". For MSDOS, use one -of the special makefiles such as Makefile.msc. For VMS, use make_vms.com. +the top of Makefile.in. In short "./configure; make test", and if that goes +well, "make install" should work for most flavors of Unix. For Windows, use one +of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use +make_vms.com. Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant -<info@winimage.com> for the Windows DLL version. The zlib home page is -http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, -please check this site to verify that you have the latest version of zlib; -otherwise get the latest version and check whether the problem still exists or -not. +<info@winimage.com> for the Windows DLL version. The zlib home page is +http://zlib.net/ . Before reporting a problem, please check this site to +verify that you have the latest version of zlib; otherwise get the latest +version and check whether the problem still exists or not. -PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking -for help. +PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. -Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997 -issue of Dr. Dobb's Journal; a copy of the article is available in -http://dogma.net/markn/articles/zlibtool/zlibtool.htm +Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997 +issue of Dr. Dobb's Journal; a copy of the article is available at +http://marknelson.us/1997/01/01/zlib-engine/ . -The changes made in version 1.2.3 are documented in the file ChangeLog. +The changes made in version 1.2.5 are documented in the file ChangeLog. -Unsupported third party contributions are provided in directory "contrib". +Unsupported third party contributions are provided in directory contrib/ . -A Java implementation of zlib is available in the Java Development Kit -http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html -See the zlib home page http://www.zlib.org for details. +zlib is available in Java using the java.util.zip package, documented at +http://java.sun.com/developer/technicalArticles/Programming/compression/ . -A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is in the -CPAN (Comprehensive Perl Archive Network) sites -http://www.cpan.org/modules/by-module/Compress/ +A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available +at CPAN (Comprehensive Perl Archive Network) sites, including +http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is available in Python 1.5 and later versions, see -http://www.python.org/doc/lib/module-zlib.html +http://www.python.org/doc/lib/module-zlib.html . -A zlib binding for TCL written by Andreas Kupries <a.kupries@westend.com> is -availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html +zlib is built into tcl: http://wiki.tcl.tk/4610 . An experimental package to read and write files in .zip format, written on top of zlib by Gilles Vollant <info@winimage.com>, is available in the @@ -74,25 +70,21 @@ Notes for some targets: - zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with other compilers. Use "make test" to check your compiler. -- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. +- gzdopen is not supported on RISCOS or BEOS. - For PalmOs, see http://palmzlib.sourceforge.net/ -- When building a shared, i.e. dynamic library on Mac OS X, the library must be - installed before testing (do "make install" before "make test"), since the - library location is specified in the library. - Acknowledgments: - The deflate format used by zlib was defined by Phil Katz. The deflate - and zlib specifications were written by L. Peter Deutsch. Thanks to all the - people who reported problems and suggested various improvements in zlib; - they are too numerous to cite here. + The deflate format used by zlib was defined by Phil Katz. The deflate and + zlib specifications were written by L. Peter Deutsch. Thanks to all the + people who reported problems and suggested various improvements in zlib; they + are too numerous to cite here. Copyright notice: - (C) 1995-2004 Jean-loup Gailly and Mark Adler + (C) 1995-2010 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -113,13 +105,11 @@ Copyright notice: Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu -If you use the zlib library in a product, we would appreciate *not* -receiving lengthy legal documents to sign. The sources are provided -for free but without warranty of any kind. The library has been -entirely written by Jean-loup Gailly and Mark Adler; it does not -include third-party code. +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. -If you redistribute modified sources, we would appreciate that you include -in the file ChangeLog history information documenting your changes. Please -read the FAQ for more information on the distribution of modified source -versions. +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/Modules/zlib/adler32.c b/Modules/zlib/adler32.c index 007ba26277c..65ad6a5adc4 100644 --- a/Modules/zlib/adler32.c +++ b/Modules/zlib/adler32.c @@ -1,12 +1,15 @@ /* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2004 Mark Adler + * Copyright (C) 1995-2007 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ -#define ZLIB_INTERNAL -#include "zlib.h" +#include "zutil.h" + +#define local static + +local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2); #define BASE 65521UL /* largest prime smaller than 65536 */ #define NMAX 5552 @@ -125,10 +128,10 @@ uLong ZEXPORT adler32(adler, buf, len) } /* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) +local uLong adler32_combine_(adler1, adler2, len2) uLong adler1; uLong adler2; - z_off_t len2; + z_off64_t len2; { unsigned long sum1; unsigned long sum2; @@ -141,9 +144,26 @@ uLong ZEXPORT adler32_combine(adler1, adler2, len2) MOD(sum2); sum1 += (adler2 & 0xffff) + BASE - 1; sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; - if (sum1 > BASE) sum1 -= BASE; - if (sum1 > BASE) sum1 -= BASE; - if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); - if (sum2 > BASE) sum2 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; return sum1 | (sum2 << 16); } + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} diff --git a/Modules/zlib/compress.c b/Modules/zlib/compress.c index df04f0148e6..ea4dfbe9d7b 100644 --- a/Modules/zlib/compress.c +++ b/Modules/zlib/compress.c @@ -1,5 +1,5 @@ /* compress.c -- compress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. + * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -75,5 +75,6 @@ int ZEXPORT compress (dest, destLen, source, sourceLen) uLong ZEXPORT compressBound (sourceLen) uLong sourceLen; { - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; } diff --git a/Modules/zlib/configure b/Modules/zlib/configure index d7ffdc3458d..bd9edd26cdd 100755 --- a/Modules/zlib/configure +++ b/Modules/zlib/configure @@ -1,37 +1,61 @@ #!/bin/sh -# configure script for zlib. This script is needed only if -# you wish to build a shared library and your system supports them, -# of if you need special compiler, flags or install directory. -# Otherwise, you can just use directly "make test; make install" +# configure script for zlib. # -# To create a shared library, use "configure --shared"; by default a static -# library is created. If the primitive shared library support provided here -# does not work, use ftp://prep.ai.mit.edu/pub/gnu/libtool-*.tar.gz +# Normally configure builds both a static and a shared library. +# If you want to build just a static library, use: ./configure --static # # To impose specific compiler or flags or install directory, use for example: # prefix=$HOME CC=cc CFLAGS="-O4" ./configure # or for csh/tcsh users: # (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure) -# LDSHARED is the command to be used to create a shared library # Incorrect settings of CC or CFLAGS may prevent creating a shared library. # If you have problems, try without defining CC and CFLAGS before reporting # an error. -LIBS=libz.a -LDFLAGS="-L. ${LIBS}" +if [ -n "${CHOST}" ]; then + uname="$(echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/')" + CROSS_PREFIX="${CHOST}-" +fi + +STATICLIB=libz.a +LDFLAGS="${LDFLAGS} -L. ${STATICLIB}" VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` +VER3=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\\.[0-9]*\).*/\1/p' < zlib.h` VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h` VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h` -AR=${AR-"ar rc"} -RANLIB=${RANLIB-"ranlib"} +if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then + AR=${AR-"${CROSS_PREFIX}ar"} + test -n "${CROSS_PREFIX}" && echo Using ${AR} +else + AR=${AR-"ar"} + test -n "${CROSS_PREFIX}" && echo Using ${AR} +fi +AR_RC="${AR} rc" +if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then + RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"} + test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} +else + RANLIB=${RANLIB-"ranlib"} +fi +if "${CROSS_PREFIX}nm" --version >/dev/null 2>/dev/null || test $? -lt 126; then + NM=${NM-"${CROSS_PREFIX}nm"} + test -n "${CROSS_PREFIX}" && echo Using ${NM} +else + NM=${NM-"nm"} +fi +LDCONFIG=${LDCONFIG-"ldconfig"} +LDSHAREDLIBC="${LDSHAREDLIBC--lc}" prefix=${prefix-/usr/local} exec_prefix=${exec_prefix-'${prefix}'} libdir=${libdir-'${exec_prefix}/lib'} +sharedlibdir=${sharedlibdir-'${libdir}'} includedir=${includedir-'${prefix}/include'} mandir=${mandir-'${prefix}/share/man'} shared_ext='.so' -shared=0 +shared=1 +zprefix=0 +build64=0 gcc=0 old_cc="$CC" old_cflags="$CFLAGS" @@ -39,21 +63,29 @@ old_cflags="$CFLAGS" while test $# -ge 1 do case "$1" in - -h* | --h*) + -h* | --help) echo 'usage:' - echo ' configure [--shared] [--prefix=PREFIX] [--exec_prefix=EXPREFIX]' - echo ' [--libdir=LIBDIR] [--includedir=INCLUDEDIR]' - exit 0;; - -p*=* | --p*=*) prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; - -e*=* | --e*=*) exec_prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; - -l*=* | --libdir=*) libdir=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; - -i*=* | --includedir=*) includedir=`echo $1 | sed 's/[-a-z_]*=//'`;shift;; - -p* | --p*) prefix="$2"; shift; shift;; - -e* | --e*) exec_prefix="$2"; shift; shift;; - -l* | --l*) libdir="$2"; shift; shift;; - -i* | --i*) includedir="$2"; shift; shift;; - -s* | --s*) shared=1; shift;; - *) echo "unknown option: $1"; echo "$0 --help for help"; exit 1;; + echo ' configure [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' + echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' + echo ' [--includedir=INCLUDEDIR]' + exit 0 ;; + -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; + -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; + -l*=* | --libdir=*) libdir=`echo $1 | sed 's/.*=//'`; shift ;; + --sharedlibdir=*) sharedlibdir=`echo $1 | sed 's/.*=//'`; shift ;; + -i*=* | --includedir=*) includedir=`echo $1 | sed 's/.*=//'`;shift ;; + -u*=* | --uname=*) uname=`echo $1 | sed 's/.*=//'`;shift ;; + -p* | --prefix) prefix="$2"; shift; shift ;; + -e* | --eprefix) exec_prefix="$2"; shift; shift ;; + -l* | --libdir) libdir="$2"; shift; shift ;; + -i* | --includedir) includedir="$2"; shift; shift ;; + -s* | --shared | --enable-shared) shared=1; shift ;; + -t | --static) shared=0; shift ;; + -z* | --zprefix) zprefix=1; shift ;; + -6* | --64) build64=1; shift ;; + --sysconfdir=*) echo "ignored option: --sysconfdir"; shift ;; + --localstatedir=*) echo "ignored option: --localstatedir"; shift ;; + *) echo "unknown option: $1"; echo "$0 --help for help"; exit 1 ;; esac done @@ -63,46 +95,68 @@ extern int getchar(); int hello() {return getchar();} EOF -test -z "$CC" && echo Checking for gcc... -cc=${CC-gcc} +test -z "$CC" && echo Checking for ${CROSS_PREFIX}gcc... +cc=${CC-${CROSS_PREFIX}gcc} cflags=${CFLAGS-"-O3"} # to force the asm version use: CFLAGS="-O3 -DASMV" ./configure case "$cc" in - *gcc*) gcc=1;; + *gcc*) gcc=1 ;; esac if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then CC="$cc" - SFLAGS=${CFLAGS-"-fPIC -O3"} - CFLAGS="$cflags" - case `(uname -s || echo unknown) 2>/dev/null` in - Linux | linux | GNU | GNU/*) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"};; - CYGWIN* | Cygwin* | cygwin* | OS/2* ) - EXE='.exe';; + SFLAGS="${CFLAGS--O3} -fPIC" + CFLAGS="${CFLAGS--O3}" + if test $build64 -eq 1; then + CFLAGS="${CFLAGS} -m64" + SFLAGS="${SFLAGS} -m64" + fi + if test "${ZLIBGCCWARN}" = "YES"; then + CFLAGS="${CFLAGS} -Wall -Wextra -pedantic" + fi + if test -z "$uname"; then + uname=`(uname -s || echo unknown) 2>/dev/null` + fi + case "$uname" in + Linux* | linux* | GNU | GNU/* | *BSD | DragonFly) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} ;; + CYGWIN* | Cygwin* | cygwin* | OS/2*) + EXE='.exe' ;; + MINGW*|mingw*) +# temporary bypass + rm -f $test.[co] $test $test$shared_ext + echo "Please use win32/Makefile.gcc instead." + exit 1 + LDSHARED=${LDSHARED-"$cc -shared"} + LDSHAREDLIBC="" + EXE='.exe' ;; QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4 # (alain.bonnefoy@icbt.com) - LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"};; + LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;; HP-UX*) LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"} case `(uname -m || echo unknown) 2>/dev/null` in ia64) shared_ext='.so' - SHAREDLIB='libz.so';; + SHAREDLIB='libz.so' ;; *) shared_ext='.sl' - SHAREDLIB='libz.sl';; - esac;; + SHAREDLIB='libz.sl' ;; + esac ;; Darwin*) shared_ext='.dylib' SHAREDLIB=libz$shared_ext SHAREDLIBV=libz.$VER$shared_ext SHAREDLIBM=libz.$VER1$shared_ext - LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER"};; - *) LDSHARED=${LDSHARED-"$cc -shared"};; + LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} ;; + *) LDSHARED=${LDSHARED-"$cc -shared"} ;; esac else # find system name and corresponding cc options CC=${CC-cc} - case `(uname -sr || echo unknown) 2>/dev/null` in + gcc=0 + if test -z "$uname"; then + uname=`(uname -sr || echo unknown) 2>/dev/null` + fi + case "$uname" in HP-UX*) SFLAGS=${CFLAGS-"-O +z"} CFLAGS=${CFLAGS-"-O"} # LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"} @@ -110,57 +164,64 @@ else case `(uname -m || echo unknown) 2>/dev/null` in ia64) shared_ext='.so' - SHAREDLIB='libz.so';; + SHAREDLIB='libz.so' ;; *) shared_ext='.sl' - SHAREDLIB='libz.sl';; - esac;; + SHAREDLIB='libz.sl' ;; + esac ;; IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."} CFLAGS=${CFLAGS-"-ansi -O2"} - LDSHARED=${LDSHARED-"cc -shared"};; + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;; OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"} CFLAGS=${CFLAGS-"-O -std1"} - LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};; + LDFLAGS="${LDFLAGS} -Wl,-rpath,." + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"} ;; OSF1*) SFLAGS=${CFLAGS-"-O -std1"} CFLAGS=${CFLAGS-"-O -std1"} - LDSHARED=${LDSHARED-"cc -shared"};; + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;; QNX*) SFLAGS=${CFLAGS-"-4 -O"} CFLAGS=${CFLAGS-"-4 -O"} LDSHARED=${LDSHARED-"cc"} RANLIB=${RANLIB-"true"} - AR="cc -A";; + AR_RC="cc -A" ;; SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "} CFLAGS=${CFLAGS-"-O3"} - LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};; - SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."} - CFLAGS=${CFLAGS-"-fast -xcg89"} - LDSHARED=${LDSHARED-"cc -G"};; + LDSHARED=${LDSHARED-"cc -dy -KPIC -G"} ;; + SunOS\ 5*) LDSHARED=${LDSHARED-"cc -G"} + case `(uname -m || echo unknown) 2>/dev/null` in + i86*) + SFLAGS=${CFLAGS-"-xpentium -fast -KPIC -R."} + CFLAGS=${CFLAGS-"-xpentium -fast"} ;; + *) + SFLAGS=${CFLAGS-"-fast -xcg92 -KPIC -R."} + CFLAGS=${CFLAGS-"-fast -xcg92"} ;; + esac ;; SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} CFLAGS=${CFLAGS-"-O2"} - LDSHARED=${LDSHARED-"ld"};; - SunStudio\ 9*) SFLAGS=${CFLAGS-"-DUSE_MMAP -fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"} - CFLAGS=${CFLAGS-"-DUSE_MMAP -fast -xtarget=ultra3 -xarch=v9b"} - LDSHARED=${LDSHARED-"cc -xarch=v9b"};; + LDSHARED=${LDSHARED-"ld"} ;; + SunStudio\ 9*) SFLAGS=${CFLAGS-"-fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"} + CFLAGS=${CFLAGS-"-fast -xtarget=ultra3 -xarch=v9b"} + LDSHARED=${LDSHARED-"cc -xarch=v9b"} ;; UNIX_System_V\ 4.2.0) SFLAGS=${CFLAGS-"-KPIC -O"} CFLAGS=${CFLAGS-"-O"} - LDSHARED=${LDSHARED-"cc -G"};; + LDSHARED=${LDSHARED-"cc -G"} ;; UNIX_SV\ 4.2MP) SFLAGS=${CFLAGS-"-Kconform_pic -O"} CFLAGS=${CFLAGS-"-O"} - LDSHARED=${LDSHARED-"cc -G"};; + LDSHARED=${LDSHARED-"cc -G"} ;; OpenUNIX\ 5) SFLAGS=${CFLAGS-"-KPIC -O"} CFLAGS=${CFLAGS-"-O"} - LDSHARED=${LDSHARED-"cc -G"};; + LDSHARED=${LDSHARED-"cc -G"} ;; AIX*) # Courtesy of dbakker@arrayasolutions.com SFLAGS=${CFLAGS-"-O -qmaxmem=8192"} CFLAGS=${CFLAGS-"-O -qmaxmem=8192"} - LDSHARED=${LDSHARED-"xlc -G"};; - # send working options for other systems to support@gzip.org + LDSHARED=${LDSHARED-"xlc -G"} ;; + # send working options for other systems to zlib@gzip.org *) SFLAGS=${CFLAGS-"-O"} CFLAGS=${CFLAGS-"-O"} - LDSHARED=${LDSHARED-"cc -shared"};; + LDSHARED=${LDSHARED-"cc -shared"} ;; esac fi @@ -171,38 +232,83 @@ SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"} if test $shared -eq 1; then echo Checking for shared library support... # we must test in two steps (cc then ld), required at least on SunOS 4.x - if test "`($CC -c $SFLAGS $test.c) 2>&1`" = "" && - test "`($LDSHARED -o $test$shared_ext $test.o) 2>&1`" = ""; then - CFLAGS="$SFLAGS" - LIBS="$SHAREDLIBV" + if test "`($CC -w -c $SFLAGS $test.c) 2>&1`" = "" && + test "`($LDSHARED $SFLAGS -o $test$shared_ext $test.o) 2>&1`" = ""; then echo Building shared library $SHAREDLIBV with $CC. elif test -z "$old_cc" -a -z "$old_cflags"; then echo No shared library support. shared=0; else + echo Tested $CC -w -c $SFLAGS $test.c + $CC -w -c $SFLAGS $test.c + echo Tested $LDSHARED $SFLAGS -o $test$shared_ext $test.o + $LDSHARED $SFLAGS -o $test$shared_ext $test.o echo 'No shared library support; try without defining CC and CFLAGS' shared=0; fi fi if test $shared -eq 0; then LDSHARED="$CC" - echo Building static library $LIBS version $VER with $CC. + ALL="static" + TEST="all teststatic" + SHAREDLIB="" + SHAREDLIBV="" + SHAREDLIBM="" + echo Building static library $STATICLIB version $VER with $CC. else - LDFLAGS="-L. ${SHAREDLIBV}" + ALL="static shared" + TEST="all teststatic testshared" fi cat > $test.c <<EOF +#include <sys/types.h> +off64_t dummy = 0; +EOF +if test "`($CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c) 2>&1`" = ""; then + CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1" + SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1" + ALL="${ALL} all64" + TEST="${TEST} test64" + echo "Checking for off64_t... Yes." + echo "Checking for fseeko... Yes." +else + echo "Checking for off64_t... No." + cat > $test.c <<EOF +#include <stdio.h> +int main(void) { + fseeko(NULL, 0, 0); + return 0; +} +EOF + if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then + echo "Checking for fseeko... Yes." + else + CFLAGS="${CFLAGS} -DNO_FSEEKO" + SFLAGS="${SFLAGS} -DNO_FSEEKO" + echo "Checking for fseeko... No." + fi +fi + +cp -p zconf.h.in zconf.h + +cat > $test.c <<EOF #include <unistd.h> int main() { return 0; } EOF if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - sed < zconf.in.h "/HAVE_UNISTD_H/s%0%1%" > zconf.h + sed < zconf.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h echo "Checking for unistd.h... Yes." else - cp -p zconf.in.h zconf.h echo "Checking for unistd.h... No." fi +if test $zprefix -eq 1; then + sed < zconf.h "/#ifdef Z_PREFIX.* may be/s/def Z_PREFIX\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo "Using z_ prefix on all symbols." +fi + cat > $test.c <<EOF #include <stdio.h> #include <stdarg.h> @@ -219,13 +325,13 @@ int main() EOF if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()" + echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." cat > $test.c <<EOF #include <stdio.h> #include <stdarg.h> -int mytest(char *fmt, ...) +int mytest(const char *fmt, ...) { char buf[20]; va_list ap; @@ -249,7 +355,7 @@ EOF #include <stdio.h> #include <stdarg.h> -int mytest(char *fmt, ...) +int mytest(const char *fmt, ...) { int n; char buf[20]; @@ -271,6 +377,7 @@ EOF echo "Checking for return value of vsnprintf()... Yes." else CFLAGS="$CFLAGS -DHAS_vsnprintf_void" + SFLAGS="$SFLAGS -DHAS_vsnprintf_void" echo "Checking for return value of vsnprintf()... No." echo " WARNING: apparently vsnprintf() does not return a value. zlib" echo " can build but will be open to possible string-format security" @@ -278,6 +385,7 @@ EOF fi else CFLAGS="$CFLAGS -DNO_vsnprintf" + SFLAGS="$SFLAGS -DNO_vsnprintf" echo "Checking for vsnprintf() in stdio.h... No." echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" echo " can build but will be open to possible buffer-overflow security" @@ -287,7 +395,7 @@ EOF #include <stdio.h> #include <stdarg.h> -int mytest(char *fmt, ...) +int mytest(const char *fmt, ...) { int n; char buf[20]; @@ -309,6 +417,7 @@ EOF echo "Checking for return value of vsprintf()... Yes." else CFLAGS="$CFLAGS -DHAS_vsprintf_void" + SFLAGS="$SFLAGS -DHAS_vsprintf_void" echo "Checking for return value of vsprintf()... No." echo " WARNING: apparently vsprintf() does not return a value. zlib" echo " can build but will be open to possible string-format security" @@ -316,7 +425,7 @@ EOF fi fi else - echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()" + echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." cat >$test.c <<EOF #include <stdio.h> @@ -358,6 +467,7 @@ EOF echo "Checking for return value of snprintf()... Yes." else CFLAGS="$CFLAGS -DHAS_snprintf_void" + SFLAGS="$SFLAGS -DHAS_snprintf_void" echo "Checking for return value of snprintf()... No." echo " WARNING: apparently snprintf() does not return a value. zlib" echo " can build but will be open to possible string-format security" @@ -365,6 +475,7 @@ EOF fi else CFLAGS="$CFLAGS -DNO_snprintf" + SFLAGS="$SFLAGS -DNO_snprintf" echo "Checking for snprintf() in stdio.h... No." echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" echo " can build but will be open to possible buffer-overflow security" @@ -390,6 +501,7 @@ EOF echo "Checking for return value of sprintf()... Yes." else CFLAGS="$CFLAGS -DHAS_sprintf_void" + SFLAGS="$SFLAGS -DHAS_sprintf_void" echo "Checking for return value of sprintf()... No." echo " WARNING: apparently sprintf() does not return a value. zlib" echo " can build but will be open to possible string-format security" @@ -398,41 +510,37 @@ EOF fi fi -cat >$test.c <<EOF -#include <errno.h> -int main() { return 0; } -EOF -if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for errno.h... Yes." -else - echo "Checking for errno.h... No." - CFLAGS="$CFLAGS -DNO_ERRNO_H" -fi - -cat > $test.c <<EOF -#include <sys/types.h> -#include <sys/mman.h> -#include <sys/stat.h> -caddr_t hello() { - return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0); +if test "$gcc" -eq 1; then + cat > $test.c <<EOF +#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif +int ZLIB_INTERNAL foo; +int main() +{ + return 0; } EOF -if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - CFLAGS="$CFLAGS -DUSE_MMAP" - echo Checking for mmap support... Yes. -else - echo Checking for mmap support... No. + if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then + echo "Checking for attribute(visibility) support... Yes." + else + CFLAGS="$CFLAGS -DNO_VIZ" + SFLAGS="$SFLAGS -DNO_VIZ" + echo "Checking for attribute(visibility) support... No." + fi fi CPP=${CPP-"$CC -E"} case $CFLAGS in *ASMV*) - if test "`nm $test.o | grep _hello`" = ""; then + if test "`$NM $test.o | grep _hello`" = ""; then CPP="$CPP -DNO_UNDERLINE" echo Checking for underline in external names... No. else echo Checking for underline in external names... Yes. - fi;; + fi ;; esac rm -f $test.[co] $test $test$shared_ext @@ -441,19 +549,48 @@ rm -f $test.[co] $test $test$shared_ext sed < Makefile.in " /^CC *=/s#=.*#=$CC# /^CFLAGS *=/s#=.*#=$CFLAGS# +/^SFLAGS *=/s#=.*#=$SFLAGS# +/^LDFLAGS *=/s#=.*#=$LDFLAGS# +/^LDSHARED *=/s#=.*#=$LDSHARED# +/^CPP *=/s#=.*#=$CPP# +/^STATICLIB *=/s#=.*#=$STATICLIB# +/^SHAREDLIB *=/s#=.*#=$SHAREDLIB# +/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# +/^AR *=/s#=.*#=$AR_RC# +/^RANLIB *=/s#=.*#=$RANLIB# +/^LDCONFIG *=/s#=.*#=$LDCONFIG# +/^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC# +/^EXE *=/s#=.*#=$EXE# +/^prefix *=/s#=.*#=$prefix# +/^exec_prefix *=/s#=.*#=$exec_prefix# +/^libdir *=/s#=.*#=$libdir# +/^sharedlibdir *=/s#=.*#=$sharedlibdir# +/^includedir *=/s#=.*#=$includedir# +/^mandir *=/s#=.*#=$mandir# +/^all: */s#:.*#: $ALL# +/^test: */s#:.*#: $TEST# +" > Makefile + +sed < zlib.pc.in " +/^CC *=/s#=.*#=$CC# +/^CFLAGS *=/s#=.*#=$CFLAGS# /^CPP *=/s#=.*#=$CPP# /^LDSHARED *=/s#=.*#=$LDSHARED# -/^LIBS *=/s#=.*#=$LIBS# +/^STATICLIB *=/s#=.*#=$STATICLIB# /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# /^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# -/^AR *=/s#=.*#=$AR# +/^AR *=/s#=.*#=$AR_RC# /^RANLIB *=/s#=.*#=$RANLIB# /^EXE *=/s#=.*#=$EXE# /^prefix *=/s#=.*#=$prefix# /^exec_prefix *=/s#=.*#=$exec_prefix# /^libdir *=/s#=.*#=$libdir# +/^sharedlibdir *=/s#=.*#=$sharedlibdir# /^includedir *=/s#=.*#=$includedir# /^mandir *=/s#=.*#=$mandir# /^LDFLAGS *=/s#=.*#=$LDFLAGS# -" > Makefile +" | sed -e " +s/\@VERSION\@/$VER/g; +" > zlib.pc diff --git a/Modules/zlib/crc32.c b/Modules/zlib/crc32.c index f658a9ef55e..91be372d224 100644 --- a/Modules/zlib/crc32.c +++ b/Modules/zlib/crc32.c @@ -1,5 +1,5 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2006, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster @@ -53,7 +53,7 @@ /* Definitions for doing the crc four data bytes at a time. */ #ifdef BYFOUR -# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ +# define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \ (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); @@ -68,6 +68,8 @@ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2); + #ifdef DYNAMIC_CRC_TABLE @@ -219,7 +221,7 @@ const unsigned long FAR * ZEXPORT get_crc_table() unsigned long ZEXPORT crc32(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; - unsigned len; + uInt len; { if (buf == Z_NULL) return 0UL; @@ -367,22 +369,22 @@ local void gf2_matrix_square(square, mat) } /* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) +local uLong crc32_combine_(crc1, crc2, len2) uLong crc1; uLong crc2; - z_off_t len2; + z_off64_t len2; { int n; unsigned long row; unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - /* degenerate case */ - if (len2 == 0) + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) return crc1; /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ row = 1; for (n = 1; n < GF2_DIM; n++) { odd[n] = row; @@ -421,3 +423,20 @@ uLong ZEXPORT crc32_combine(crc1, crc2, len2) crc1 ^= crc2; return crc1; } + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/Modules/zlib/deflate.c b/Modules/zlib/deflate.c index 29ce1f64a57..5c4022f3d47 100644 --- a/Modules/zlib/deflate.c +++ b/Modules/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; + " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -79,19 +79,18 @@ local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifndef FASTEST #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif -#endif -local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, @@ -110,11 +109,6 @@ local void check_match OF((deflate_state *s, IPos start, IPos match, #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be @@ -288,6 +282,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + s->high_water = 0; /* nothing written to s->window yet */ + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); @@ -332,8 +328,8 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) strm->adler = adler32(strm->adler, dictionary, dictLength); if (length < MIN_MATCH) return Z_OK; - if (length > MAX_DIST(s)) { - length = MAX_DIST(s); + if (length > s->w_size) { + length = s->w_size; dictionary += dictLength - length; /* use the tail of the dictionary */ } zmemcpy(s->window, dictionary, length); @@ -435,9 +431,10 @@ int ZEXPORT deflateParams(strm, level, strategy) } func = configuration_table[s->level].func; - if (func != configuration_table[level].func && strm->total_in != 0) { + if ((strategy != s->strategy || func != configuration_table[level].func) && + strm->total_in != 0) { /* Flush the last buffer: */ - err = deflate(strm, Z_PARTIAL_FLUSH); + err = deflate(strm, Z_BLOCK); } if (s->level != level) { s->level = level; @@ -481,33 +478,66 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * - * This function could be more sophisticated to provide closer upper bounds - * for every combination of windowBits and memLevel, as well as wrap. - * But even the conservative upper bound of about 14% expansion does not - * seem onerous for output buffer allocation. + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; - uLong destLen; + uLong complen, wraplen; + Bytef *str; - /* conservative upper bound */ - destLen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; - /* if can't get parameters, return conservative bound */ + /* if can't get parameters, return conservative bound plus zlib wrapper */ if (strm == Z_NULL || strm->state == Z_NULL) - return destLen; + return complen + 6; - /* if not default parameters, return conservative bound */ + /* compute wrapper length */ s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; + default: /* for compiler happiness */ + wraplen = 6; + } + + /* if not default parameters, return conservative bound */ if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return destLen; + return complen + wraplen; /* default settings: return tight bound for that case */ - return compressBound(sourceLen); + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; } /* ========================================================================= @@ -557,7 +587,7 @@ int ZEXPORT deflate (strm, flush) deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_FINISH || flush < 0) { + flush > Z_BLOCK || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; @@ -581,7 +611,7 @@ int ZEXPORT deflate (strm, flush) put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); - if (s->gzhead == NULL) { + if (s->gzhead == Z_NULL) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); @@ -608,7 +638,7 @@ int ZEXPORT deflate (strm, flush) (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != NULL) { + if (s->gzhead->extra != Z_NULL) { put_byte(s, s->gzhead->extra_len & 0xff); put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } @@ -650,7 +680,7 @@ int ZEXPORT deflate (strm, flush) } #ifdef GZIP if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != NULL) { + if (s->gzhead->extra != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { @@ -678,7 +708,7 @@ int ZEXPORT deflate (strm, flush) s->status = NAME_STATE; } if (s->status == NAME_STATE) { - if (s->gzhead->name != NULL) { + if (s->gzhead->name != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; @@ -709,7 +739,7 @@ int ZEXPORT deflate (strm, flush) s->status = COMMENT_STATE; } if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != NULL) { + if (s->gzhead->comment != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; @@ -787,7 +817,9 @@ int ZEXPORT deflate (strm, flush) (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; - bstate = (*(configuration_table[s->level].func))(s, flush); + bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + (s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush)); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; @@ -808,13 +840,17 @@ int ZEXPORT deflate (strm, flush) if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); - } else { /* FULL_FLUSH or SYNC_FLUSH */ + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + } } } flush_pending(strm); @@ -1167,12 +1203,13 @@ local uInt longest_match(s, cur_match) return s->lookahead; } #endif /* ASMV */ -#endif /* FASTEST */ + +#else /* FASTEST */ /* --------------------------------------------------------------------------- - * Optimized version for level == 1 or strategy == Z_RLE only + * Optimized version for FASTEST only */ -local uInt longest_match_fast(s, cur_match) +local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { @@ -1225,6 +1262,8 @@ local uInt longest_match_fast(s, cur_match) return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } +#endif /* FASTEST */ + #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. @@ -1303,7 +1342,6 @@ local void fill_window(s) later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ - /* %%% avoid this when Z_RLE */ n = s->hash_size; p = &s->head[n]; do { @@ -1355,27 +1393,61 @@ local void fill_window(s) */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ -#define FLUSH_BLOCK_ONLY(s, eof) { \ +#define FLUSH_BLOCK_ONLY(s, last) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ - (eof)); \ + (last)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, eof) { \ - FLUSH_BLOCK_ONLY(s, eof); \ - if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ } /* =========================================================================== @@ -1449,7 +1521,7 @@ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { - IPos hash_head = NIL; /* head of the hash chain */ + IPos hash_head; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { @@ -1469,6 +1541,7 @@ local block_state deflate_fast(s, flush) /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ + hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } @@ -1481,19 +1554,8 @@ local block_state deflate_fast(s, flush) * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ -#ifdef FASTEST - if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || - (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { - s->match_length = longest_match_fast (s, hash_head); - } -#else - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } -#endif - /* longest_match() or longest_match_fast() sets match_start */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); @@ -1555,7 +1617,7 @@ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { - IPos hash_head = NIL; /* head of hash chain */ + IPos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ @@ -1576,6 +1638,7 @@ local block_state deflate_slow(s, flush) /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ + hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } @@ -1591,12 +1654,8 @@ local block_state deflate_slow(s, flush) * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } - /* longest_match() or longest_match_fast() sets match_start */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 @@ -1674,7 +1733,6 @@ local block_state deflate_slow(s, flush) } #endif /* FASTEST */ -#if 0 /* =========================================================================== * For Z_RLE, simply look for runs of bytes, generate matches only of distance * one. Do not maintain a hash table. (It will be regenerated if this run of @@ -1684,11 +1742,9 @@ local block_state deflate_rle(s, flush) deflate_state *s; int flush; { - int bflush; /* set if current block must be flushed */ - uInt run; /* length of run */ - uInt max; /* maximum length of run */ - uInt prev; /* byte at distance one to match */ - Bytef *scan; /* scan for end of run */ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ for (;;) { /* Make sure that we always have enough lookahead, except @@ -1704,23 +1760,33 @@ local block_state deflate_rle(s, flush) } /* See how many times the previous byte repeats */ - run = 0; - if (s->strstart > 0) { /* if there is a previous byte, that is */ - max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { scan = s->window + s->strstart - 1; - prev = *scan++; - do { - if (*scan++ != prev) - break; - } while (++run < max); + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (int)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (run >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, run); - _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); - s->lookahead -= run; - s->strstart += run; + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); @@ -1733,4 +1799,36 @@ local block_state deflate_rle(s, flush) FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } -#endif + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} diff --git a/Modules/zlib/deflate.h b/Modules/zlib/deflate.h index 05a5ab3a2c1..cbf0d1ea5d9 100644 --- a/Modules/zlib/deflate.h +++ b/Modules/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2004 Jean-loup Gailly + * Copyright (C) 1995-2010 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -260,6 +260,13 @@ typedef struct internal_state { * are always zero. */ + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + } FAR deflate_state; /* Output a byte on the stream. @@ -278,14 +285,18 @@ typedef struct internal_state { * distances are limited to MAX_DIST instead of WSIZE. */ +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + /* in trees.c */ -void _tr_init OF((deflate_state *s)); -int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); -void _tr_align OF((deflate_state *s)); -void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) @@ -298,11 +309,11 @@ void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) - extern uch _length_code[]; - extern uch _dist_code[]; + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; #else - extern const uch _length_code[]; - extern const uch _dist_code[]; + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ diff --git a/Modules/zlib/example.c b/Modules/zlib/example.c index 6c8a0ee7633..604736f15f6 100644 --- a/Modules/zlib/example.c +++ b/Modules/zlib/example.c @@ -1,12 +1,12 @@ /* example.c -- usage example of the zlib compression library - * Copyright (C) 1995-2004 Jean-loup Gailly. + * Copyright (C) 1995-2006 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ -#include <stdio.h> #include "zlib.h" +#include <stdio.h> #ifdef STDC # include <string.h> diff --git a/Modules/zlib/gzclose.c b/Modules/zlib/gzclose.c new file mode 100644 index 00000000000..caeb99a3177 --- /dev/null +++ b/Modules/zlib/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/Modules/zlib/gzguts.h b/Modules/zlib/gzguts.h new file mode 100644 index 00000000000..0f8fb79f87d --- /dev/null +++ b/Modules/zlib/gzguts.h @@ -0,0 +1,132 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include <stdio.h> +#include "zlib.h" +#ifdef STDC +# include <string.h> +# include <stdlib.h> +# include <limits.h> +#endif +#include <fcntl.h> + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#ifdef _MSC_VER +# include <io.h> +# define vsnprintf _vsnprintf +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include <windows.h> +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifdef STDC +# include <errno.h> +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default i/o buffer size -- double this for output when reading */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + z_off64_t pos; /* current position in uncompressed data */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer */ + unsigned char *out; /* output buffer (double-sized when reading) */ + unsigned char *next; /* next output data to deliver or write */ + /* just for reading */ + unsigned have; /* amount of output data unused at next */ + int eof; /* true if end of input file reached */ + z_off64_t start; /* where the gzip data started, for rewinding */ + z_off64_t raw; /* where the raw data started, for seeking */ + int how; /* 0: get header, 1: copy, 2: decompress */ + int direct; /* true if last read direct, false if gzip */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/Modules/zlib/gzlib.c b/Modules/zlib/gzlib.c new file mode 100644 index 00000000000..603e60ed544 --- /dev/null +++ b/Modules/zlib/gzlib.c @@ -0,0 +1,537 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const char *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + if (state->mode == GZ_READ) { /* for reading ... */ + state->have = 0; /* no output data available */ + state->eof = 0; /* not at end of file */ + state->how = LOOK; /* look for gzip header */ + state->direct = 1; /* default for empty file */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const char *path; + int fd; + const char *mode; +{ + gz_statep state; + + /* allocate gzFile structure to return */ + state = malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* save the path name for error messages */ + state->path = malloc(strlen(path) + 1); + if (state->path == NULL) { + free(state); + return NULL; + } + strcpy(state->path, path); + + /* open the file with the appropriate mode (or just use fd) */ + state->fd = fd != -1 ? fd : + open(path, +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | ( + state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))), + 0666); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) + state->mode = GZ_WRITE; /* simplify later checks */ + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; + sprintf(path, "<fd:%d>", fd); /* for debugging */ + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if (size == 0) + return -1; + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || state->err != Z_OK) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->pos + offset >= state->raw) { + ret = LSEEK(state->fd, offset - state->have, SEEK_CUR); + if (ret == -1) + return -1; + state->have = 0; + state->eof = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->pos += offset; + return state->pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->have) || (z_off64_t)state->have > offset ? + (unsigned)offset : state->have; + state->have -= n; + state->next += n; + state->pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? + (state->eof && state->strm.avail_in == 0 && state->have == 0) : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->msg == NULL ? "" : state->msg; +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) + state->eof = 0; + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, save as static string */ + if (err == Z_MEM_ERROR) { + state->msg = (char *)msg; + return; + } + + /* construct error message with path */ + if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { + state->err = Z_MEM_ERROR; + state->msg = (char *)"out of memory"; + return; + } + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); + return; +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/Modules/zlib/gzread.c b/Modules/zlib/gzread.c new file mode 100644 index 00000000000..548201ab009 --- /dev/null +++ b/Modules/zlib/gzread.c @@ -0,0 +1,653 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_next4 OF((gz_statep, unsigned long *)); +local int gz_head OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_make OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + + *have = 0; + do { + ret = read(state->fd, buf + *have, len - *have); + if (ret <= 0) + break; + *have += ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + gz_avail() assumes that strm->avail_in == 0. */ +local int gz_avail(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + if (state->err != Z_OK) + return -1; + if (state->eof == 0) { + if (gz_load(state, state->in, state->size, + (unsigned *)&(strm->avail_in)) == -1) + return -1; + strm->next_in = state->in; + } + return 0; +} + +/* Get next byte from input, or -1 if end or error. */ +#define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \ + (strm->avail_in == 0 ? -1 : \ + (strm->avail_in--, *(strm->next_in)++))) + +/* Get a four-byte little-endian integer and return 0 on success and the value + in *ret. Otherwise -1 is returned and *ret is not modified. */ +local int gz_next4(state, ret) + gz_statep state; + unsigned long *ret; +{ + int ch; + unsigned long val; + z_streamp strm = &(state->strm); + + val = NEXT(); + val += (unsigned)NEXT() << 8; + val += (unsigned long)NEXT() << 16; + ch = NEXT(); + if (ch == -1) + return -1; + val += (unsigned long)ch << 24; + *ret = val; + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->have must be zero. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression, and the gzip header will be skipped so + that the next available input data is the raw deflate stream. If direct + copying, then leftover input data from the input buffer will be copied to + the output buffer. In that case, all further file reads will be directly to + either the output buffer or a user buffer. If decompressing, the inflate + state and the check value will be initialized. gz_head() will return 0 on + success or -1 on failure. Failures may include read errors or gzip header + errors. */ +local int gz_head(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + int flags; + unsigned len; + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = malloc(state->want); + state->out = malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + if (state->out != NULL) + free(state->out); + if (state->in != NULL) + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get some data in the input buffer */ + if (strm->avail_in == 0) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for the gzip magic header bytes 31 and 139 */ + if (strm->next_in[0] == 31) { + strm->avail_in--; + strm->next_in++; + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in && strm->next_in[0] == 139) { + /* we have a gzip header, woo hoo! */ + strm->avail_in--; + strm->next_in++; + + /* skip rest of header */ + if (NEXT() != 8) { /* compression method */ + gz_error(state, Z_DATA_ERROR, "unknown compression method"); + return -1; + } + flags = NEXT(); + if (flags & 0xe0) { /* reserved flag bits */ + gz_error(state, Z_DATA_ERROR, "unknown header flags set"); + return -1; + } + NEXT(); /* modification time */ + NEXT(); + NEXT(); + NEXT(); + NEXT(); /* extra flags */ + NEXT(); /* operating system */ + if (flags & 4) { /* extra field */ + len = (unsigned)NEXT(); + len += (unsigned)NEXT() << 8; + while (len--) + if (NEXT() < 0) + break; + } + if (flags & 8) /* file name */ + while (NEXT() > 0) + ; + if (flags & 16) /* comment */ + while (NEXT() > 0) + ; + if (flags & 2) { /* header crc */ + NEXT(); + NEXT(); + } + /* an unexpected end of file is not checked for here -- it will be + noticed on the first request for uncompressed data */ + + /* set up for decompression */ + inflateReset(strm); + strm->adler = crc32(0L, Z_NULL, 0); + state->how = GZIP; + state->direct = 0; + return 0; + } + else { + /* not a gzip file -- save first byte (31) and fall to raw i/o */ + state->out[0] = 31; + state->have = 1; + } + } + + /* doing raw i/o, save start of raw data for seeking, copy any leftover + input to output -- this assumes that the output buffer is larger than + the input buffer, which also assures space for gzungetc() */ + state->raw = state->pos; + state->next = state->out; + if (strm->avail_in) { + memcpy(state->next + state->have, strm->next_in, strm->avail_in); + state->have += strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + If the end of the compressed data is reached, then verify the gzip trailer + check value and length (modulo 2^32). state->have and state->next are set + to point to the just decompressed data, and the crc is updated. If the + trailer is verified, state->how is reset to LOOK to look for the next gzip + stream or raw data, once state->have is depleted. Returns 0 on success, -1 + on failure. Failures may include invalid compressed data or a failed gzip + trailer verification. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret; + unsigned had; + unsigned long crc, len; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_DATA_ERROR, "unexpected end of file"); + return -1; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output and crc check value */ + state->have = had - strm->avail_out; + state->next = strm->next_out - state->have; + strm->adler = crc32(strm->adler, state->next, state->have); + + /* check gzip trailer if at end of deflate stream */ + if (ret == Z_STREAM_END) { + if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) { + gz_error(state, Z_DATA_ERROR, "unexpected end of file"); + return -1; + } + if (crc != strm->adler) { + gz_error(state, Z_DATA_ERROR, "incorrect data check"); + return -1; + } + if (len != (strm->total_out & 0xffffffffL)) { + gz_error(state, Z_DATA_ERROR, "incorrect length check"); + return -1; + } + state->how = LOOK; /* ready for next stream, once have is 0 (leave + state->direct unchanged to remember how) */ + } + + /* good decompression */ + return 0; +} + +/* Make data and put in the output buffer. Assumes that state->have == 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for (and skipped if found) to determine wither to copy or decompress. + Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY + or GZIP unless the end of the input file has been reached and all data has + been processed. */ +local int gz_make(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + if (state->how == LOOK) { /* look for gzip header */ + if (gz_head(state) == -1) + return -1; + if (state->have) /* got some data from gz_head() */ + return 0; + } + if (state->how == COPY) { /* straight copy */ + if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1) + return -1; + state->next = state->out; + } + else if (state->how == GZIP) { /* decompress */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->have) { + n = GT_OFF(state->have) || (z_off64_t)state->have > len ? + (unsigned)len : state->have; + state->have -= n; + state->next += n; + state->pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_make(state) == -1) + return -1; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + unsigned got, n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || state->err != Z_OK) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); + return -1; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* first just try copying data from the output buffer */ + if (state->have) { + n = state->have > len ? len : state->have; + memcpy(buf, state->next, n); + state->next += n; + state->have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && strm->avail_in == 0) + break; + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || len < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_make(state) == -1) + return -1; + continue; /* no progress yet -- go back to memcpy() above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, buf, len, &n) == -1) + return -1; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + strm->avail_out = len; + strm->next_out = buf; + if (gz_decomp(state) == -1) + return -1; + n = state->have; + state->have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->pos += n; + } while (len); + + /* return number of bytes read into user buffer (will fit in int) */ + return (int)got; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || state->err != Z_OK) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->have) { + state->have--; + state->pos++; + return *(state->next)++; + } + + /* nothing there -- try gzread() */ + ret = gzread(file, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || state->err != Z_OK) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->have == 0) { + state->have = 1; + state->next = state->out + (state->size << 1) - 1; + state->next[0] = c; + state->pos--; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->have == (state->size << 1)) { + gz_error(state, Z_BUF_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->next == state->out) { + unsigned char *src = state->out + state->have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->next = dest; + } + state->have++; + state->next--; + state->next[0] = c; + state->pos--; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || state->err != Z_OK) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->have == 0) { + if (gz_make(state) == -1) + return NULL; /* error */ + if (state->have == 0) { /* end of file */ + if (buf == str) /* got bupkus */ + return NULL; + break; /* got something -- return it */ + } + } + + /* look for end-of-line in current output buffer */ + n = state->have > left ? left : state->have; + eol = memchr(state->next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->next, n); + state->have -= n; + state->next += n; + state->pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* found end-of-line or out of space -- terminate string and return it */ + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return 0; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->how == LOOK && state->have == 0) + (void)gz_head(state); + + /* return 1 if reading direct, 0 if decompressing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : Z_OK; +} diff --git a/Modules/zlib/gzwrite.c b/Modules/zlib/gzwrite.c new file mode 100644 index 00000000000..e8defc6887a --- /dev/null +++ b/Modules/zlib/gzwrite.c @@ -0,0 +1,531 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004, 2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on failure or 0 on success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input and output buffers */ + state->in = malloc(state->want); + state->out = malloc(state->want); + if (state->in == NULL || state->out == NULL) { + if (state->out != NULL) + free(state->out); + if (state->in != NULL) + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + 15 + 16, 8, state->strategy); + if (ret != Z_OK) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer */ + strm->avail_out = state->size; + strm->next_out = state->out; + state->next = strm->next_out; + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file, otherwise 0. + flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, + then the deflate() state is reset to start a new gzip stream. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, got; + unsigned have; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + have = (unsigned)(strm->next_out - state->next); + if (have && ((got = write(state->fd, state->next, have)) < 0 || + (unsigned)got != have)) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + } + state->next = strm->next_out; + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on error, 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + unsigned put = len; + unsigned n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); + return 0; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + if (strm->avail_in == 0) + strm->next_in = state->in; + n = state->size - strm->avail_in; + if (n > len) + n = len; + memcpy(strm->next_in + strm->avail_in, buf, n); + strm->avail_in += n; + state->pos += n; + buf = (char *)buf + n; + len -= n; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + strm->avail_in = len; + strm->next_in = (voidp)buf; + state->pos += len; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } + + /* input was all buffered or compressed (put will fit in int) */ + return (int)put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (strm->avail_in < state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + strm->next_in[strm->avail_in++] = c; + state->pos++; + return c; + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = c; + if (gzwrite(file, buf, 1) != 1) + return -1; + return c; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + unsigned len; + + /* write string */ + len = (unsigned)strlen(str); + ret = gzwrite(file, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#ifdef STDC +#include <stdarg.h> + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) +{ + int size, len; + gz_statep state; + z_streamp strm; + va_list va; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; + va_start(va, format); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(state->in, format, va); + va_end(va); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = vsprintf(state->in, format, va); + va_end(va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(state->in, size, format, va); + va_end(va); + len = strlen(state->in); +# else + len = vsnprintf((char *)(state->in), size, format, va); + va_end(va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->pos += len; + return len; +} + +#else /* !STDC */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(state->in); +# else + len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->pos += len; + return len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* compress remaining data with requested flush */ + gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = 0; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + ret += gz_zero(state, state->skip); + } + + /* flush, free memory, and close file */ + ret += gz_comp(state, Z_FINISH); + (void)deflateEnd(&(state->strm)); + free(state->out); + free(state->in); + gz_error(state, Z_OK, NULL); + free(state->path); + ret += close(state->fd); + free(state); + return ret ? Z_ERRNO : Z_OK; +} diff --git a/Modules/zlib/infback.c b/Modules/zlib/infback.c index 455dbc9ee84..af3a8c965d5 100644 --- a/Modules/zlib/infback.c +++ b/Modules/zlib/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2009 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -55,7 +55,7 @@ int stream_size; state->wbits = windowBits; state->wsize = 1U << windowBits; state->window = window; - state->write = 0; + state->wnext = 0; state->whave = 0; return Z_OK; } @@ -253,7 +253,7 @@ void FAR *out_desc; unsigned bits; /* bits in bit buffer */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ - code this; /* current decoding table entry */ + code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ @@ -389,19 +389,19 @@ void FAR *out_desc; state->have = 0; while (state->have < state->nlen + state->ndist) { for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.val < 16) { - NEEDBITS(this.bits); - DROPBITS(this.bits); - state->lens[state->have++] = this.val; + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; } else { - if (this.val == 16) { - NEEDBITS(this.bits + 2); - DROPBITS(this.bits); + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; @@ -411,16 +411,16 @@ void FAR *out_desc; copy = 3 + BITS(2); DROPBITS(2); } - else if (this.val == 17) { - NEEDBITS(this.bits + 3); - DROPBITS(this.bits); + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { - NEEDBITS(this.bits + 7); - DROPBITS(this.bits); + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); @@ -438,7 +438,16 @@ void FAR *out_desc; /* handle error breaks in while */ if (state->mode == BAD) break; - /* build code tables */ + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; @@ -474,28 +483,28 @@ void FAR *out_desc; /* get a literal, length, or end-of-block code */ for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.op && (this.op & 0xf0) == 0) { - last = this; + if (here.op && (here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->lencode[last.val + + here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } - DROPBITS(this.bits); - state->length = (unsigned)this.val; + DROPBITS(here.bits); + state->length = (unsigned)here.val; /* process literal */ - if (this.op == 0) { - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); + "inflate: literal 0x%02x\n", here.val)); ROOM(); *put++ = (unsigned char)(state->length); left--; @@ -504,21 +513,21 @@ void FAR *out_desc; } /* process end of block */ - if (this.op & 32) { + if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } /* invalid code */ - if (this.op & 64) { + if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } /* length code -- get extra bits, if any */ - state->extra = (unsigned)(this.op) & 15; + state->extra = (unsigned)(here.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->length += BITS(state->extra); @@ -528,30 +537,30 @@ void FAR *out_desc; /* get distance code */ for (;;) { - this = state->distcode[BITS(state->distbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if ((this.op & 0xf0) == 0) { - last = this; + if ((here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->distcode[last.val + + here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } - DROPBITS(this.bits); - if (this.op & 64) { + DROPBITS(here.bits); + if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } - state->offset = (unsigned)this.val; + state->offset = (unsigned)here.val; /* get distance extra bits, if any */ - state->extra = (unsigned)(this.op) & 15; + state->extra = (unsigned)(here.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->offset += BITS(state->extra); diff --git a/Modules/zlib/inffast.c b/Modules/zlib/inffast.c index bbee92ed1e6..2f1d60b43b8 100644 --- a/Modules/zlib/inffast.c +++ b/Modules/zlib/inffast.c @@ -1,5 +1,5 @@ /* inffast.c -- fast decoding - * Copyright (C) 1995-2004 Mark Adler + * Copyright (C) 1995-2008, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -64,7 +64,7 @@ requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ -void inflate_fast(strm, start) +void ZLIB_INTERNAL inflate_fast(strm, start) z_streamp strm; unsigned start; /* inflate()'s starting value for strm->avail_out */ { @@ -79,7 +79,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ #endif unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ + unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ @@ -87,7 +87,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ - code this; /* retrieved table entry */ + code here; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ @@ -106,7 +106,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ #endif wsize = state->wsize; whave = state->whave; - write = state->write; + wnext = state->wnext; window = state->window; hold = state->hold; bits = state->bits; @@ -124,20 +124,20 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(PUP(in)) << bits; bits += 8; } - this = lcode[hold & lmask]; + here = lcode[hold & lmask]; dolen: - op = (unsigned)(this.bits); + op = (unsigned)(here.bits); hold >>= op; bits -= op; - op = (unsigned)(this.op); + op = (unsigned)(here.op); if (op == 0) { /* literal */ - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); - PUP(out) = (unsigned char)(this.val); + "inflate: literal 0x%02x\n", here.val)); + PUP(out) = (unsigned char)(here.val); } else if (op & 16) { /* length base */ - len = (unsigned)(this.val); + len = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { @@ -155,14 +155,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(PUP(in)) << bits; bits += 8; } - this = dcode[hold & dmask]; + here = dcode[hold & dmask]; dodist: - op = (unsigned)(this.bits); + op = (unsigned)(here.bits); hold >>= op; bits -= op; - op = (unsigned)(this.op); + op = (unsigned)(here.op); if (op & 16) { /* distance base */ - dist = (unsigned)(this.val); + dist = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; @@ -187,12 +187,34 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + PUP(out) = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + PUP(out) = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + PUP(out) = PUP(from); + } while (--len); + continue; + } +#endif } from = window - OFF; - if (write == 0) { /* very common case */ + if (wnext == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; @@ -202,17 +224,17 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ from = out - dist; /* rest from output */ } } - else if (write < op) { /* wrap around window */ - from += wsize + write - op; - op -= write; + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; if (op < len) { /* some from end of window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = window - OFF; - if (write < len) { /* some from start of window */ - op = write; + if (wnext < len) { /* some from start of window */ + op = wnext; len -= op; do { PUP(out) = PUP(from); @@ -222,7 +244,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else { /* contiguous in window */ - from += write - op; + from += wnext - op; if (op < len) { /* some from window */ len -= op; do { @@ -259,7 +281,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level distance code */ - this = dcode[this.val + (hold & ((1U << op) - 1))]; + here = dcode[here.val + (hold & ((1U << op) - 1))]; goto dodist; } else { @@ -269,7 +291,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level length code */ - this = lcode[this.val + (hold & ((1U << op) - 1))]; + here = lcode[here.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ @@ -305,7 +327,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and write == 0 + - Three separate decoding do-loops for direct, window, and wnext == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes diff --git a/Modules/zlib/inffast.h b/Modules/zlib/inffast.h index 1e88d2d97b5..e5c1aa4ca8c 100644 --- a/Modules/zlib/inffast.h +++ b/Modules/zlib/inffast.h @@ -1,5 +1,5 @@ /* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003 Mark Adler + * Copyright (C) 1995-2003, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -8,4 +8,4 @@ subject to change. Applications should only use zlib.h. */ -void inflate_fast OF((z_streamp strm, unsigned start)); +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/Modules/zlib/inflate.c b/Modules/zlib/inflate.c index 792fdee8e9c..a8431abeacf 100644 --- a/Modules/zlib/inflate.c +++ b/Modules/zlib/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -45,7 +45,7 @@ * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common write == 0 case for speed in inflate_fast() + * - Pull out common wnext == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() @@ -117,28 +117,52 @@ z_streamp strm; state->head = Z_NULL; state->wsize = 0; state->whave = 0; - state->write = 0; + state->wnext = 0; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; Tracev((stderr, "inflate: reset\n")); return Z_OK; } -int ZEXPORT inflatePrime(strm, bits, value) +int ZEXPORT inflateReset2(strm, windowBits) z_streamp strm; -int bits; -int value; +int windowBits; { + int wrap; struct inflate_state FAR *state; + /* get the state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; - value &= (1L << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; - return Z_OK; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); } int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) @@ -147,6 +171,7 @@ int windowBits; const char *version; int stream_size; { + int ret; struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || @@ -164,24 +189,13 @@ int stream_size; if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; - if (windowBits < 0) { - state->wrap = 0; - windowBits = -windowBits; - } - else { - state->wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) windowBits &= 15; -#endif - } - if (windowBits < 8 || windowBits > 15) { + state->window = Z_NULL; + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { ZFREE(strm, state); strm->state = Z_NULL; - return Z_STREAM_ERROR; } - state->wbits = (unsigned)windowBits; - state->window = Z_NULL; - return inflateReset(strm); + return ret; } int ZEXPORT inflateInit_(strm, version, stream_size) @@ -192,6 +206,27 @@ int stream_size; return inflateInit2_(strm, DEF_WBITS, version, stream_size); } +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. @@ -340,7 +375,7 @@ unsigned out; /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; - state->write = 0; + state->wnext = 0; state->whave = 0; } @@ -348,22 +383,22 @@ unsigned out; copy = out - strm->avail_out; if (copy >= state->wsize) { zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); - state->write = 0; + state->wnext = 0; state->whave = state->wsize; } else { - dist = state->wsize - state->write; + dist = state->wsize - state->wnext; if (dist > copy) dist = copy; - zmemcpy(state->window + state->write, strm->next_out - copy, dist); + zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, strm->next_out - copy, copy); - state->write = copy; + state->wnext = copy; state->whave = state->wsize; } else { - state->write += dist; - if (state->write == state->wsize) state->write = 0; + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; if (state->whave < state->wsize) state->whave += dist; } } @@ -564,7 +599,7 @@ int flush; unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ - code this; /* current decoding table entry */ + code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ @@ -619,7 +654,9 @@ int flush; } DROPBITS(4); len = BITS(4) + 8; - if (len > state->wbits) { + if (state->wbits == 0) + state->wbits = len; + else if (len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; @@ -771,7 +808,7 @@ int flush; strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: - if (flush == Z_BLOCK) goto inf_leave; + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); @@ -791,7 +828,11 @@ int flush; fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", @@ -816,6 +857,9 @@ int flush; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: state->mode = COPY; case COPY: copy = state->length; @@ -876,19 +920,19 @@ int flush; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.val < 16) { - NEEDBITS(this.bits); - DROPBITS(this.bits); - state->lens[state->have++] = this.val; + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; } else { - if (this.val == 16) { - NEEDBITS(this.bits + 2); - DROPBITS(this.bits); + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; @@ -898,16 +942,16 @@ int flush; copy = 3 + BITS(2); DROPBITS(2); } - else if (this.val == 17) { - NEEDBITS(this.bits + 3); - DROPBITS(this.bits); + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { - NEEDBITS(this.bits + 7); - DROPBITS(this.bits); + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); @@ -925,7 +969,16 @@ int flush; /* handle error breaks in while */ if (state->mode == BAD) break; - /* build code tables */ + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; @@ -946,88 +999,102 @@ int flush; break; } Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); + if (state->mode == TYPE) + state->back = -1; break; } + state->back = 0; for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.op && (this.op & 0xf0) == 0) { - last = this; + if (here.op && (here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->lencode[last.val + + here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); + state->back += last.bits; } - DROPBITS(this.bits); - state->length = (unsigned)this.val; - if ((int)(this.op) == 0) { - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); + "inflate: literal 0x%02x\n", here.val)); state->mode = LIT; break; } - if (this.op & 32) { + if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; state->mode = TYPE; break; } - if (this.op & 64) { + if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } - state->extra = (unsigned)(this.op) & 15; + state->extra = (unsigned)(here.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); + state->back += state->extra; } Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; state->mode = DIST; case DIST: for (;;) { - this = state->distcode[BITS(state->distbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if ((this.op & 0xf0) == 0) { - last = this; + if ((here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->distcode[last.val + + here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); + state->back += last.bits; } - DROPBITS(this.bits); - if (this.op & 64) { + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } - state->offset = (unsigned)this.val; - state->extra = (unsigned)(this.op) & 15; + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); + state->back += state->extra; } #ifdef INFLATE_STRICT if (state->offset > state->dmax) { @@ -1036,11 +1103,6 @@ int flush; break; } #endif - if (state->offset > state->whave + out - left) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: @@ -1048,12 +1110,32 @@ int flush; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; - if (copy > state->write) { - copy -= state->write; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; from = state->window + (state->wsize - copy); } else - from = state->window + (state->write - copy); + from = state->window + (state->wnext - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ @@ -1146,7 +1228,8 @@ int flush; strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0); + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; @@ -1366,3 +1449,32 @@ z_streamp source; dest->state = (struct internal_state FAR *)copy; return Z_OK; } + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->sane = !subvert; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + return Z_OK; +#else + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; + state = (struct inflate_state FAR *)strm->state; + return ((long)(state->back) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} diff --git a/Modules/zlib/inflate.h b/Modules/zlib/inflate.h index 07bd3e78a7c..95f4986d400 100644 --- a/Modules/zlib/inflate.h +++ b/Modules/zlib/inflate.h @@ -1,5 +1,5 @@ /* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2004 Mark Adler + * Copyright (C) 1995-2009 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -32,11 +32,13 @@ typedef enum { TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN, /* i: waiting for length/lit code */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ @@ -53,19 +55,21 @@ typedef enum { /* State transitions between above modes - - (most modes can go to the BAD or MEM mode -- not shown for clarity) + (most modes can go to BAD or MEM on error -- not shown for clarity) Process header: - HEAD -> (gzip) or (zlib) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME - NAME -> COMMENT -> HCRC -> TYPE + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE + (raw) -> TYPEDO Read deflate blocks: - TYPE -> STORED or TABLE or LEN or CHECK - STORED -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN - Read deflate codes: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN @@ -73,7 +77,7 @@ typedef enum { CHECK -> LENGTH -> DONE */ -/* state maintained between inflate() calls. Approximately 7K bytes. */ +/* state maintained between inflate() calls. Approximately 10K bytes. */ struct inflate_state { inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ @@ -88,7 +92,7 @@ struct inflate_state { unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ + unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ @@ -112,4 +116,7 @@ struct inflate_state { unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ }; diff --git a/Modules/zlib/inftrees.c b/Modules/zlib/inftrees.c index 8a9c13ff03d..11e9c52accb 100644 --- a/Modules/zlib/inftrees.c +++ b/Modules/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; + " inflate 1.2.5 Copyright 1995-2010 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -29,7 +29,7 @@ const char inflate_copyright[] = table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ -int inflate_table(type, lens, codes, table, bits, work) +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) codetype type; unsigned short FAR *lens; unsigned codes; @@ -50,7 +50,7 @@ unsigned short FAR *work; unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ - code this; /* table entry for duplication */ + code here; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ @@ -62,7 +62,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 195}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, @@ -115,15 +115,15 @@ unsigned short FAR *work; if (count[max] != 0) break; if (root > max) root = max; if (max == 0) { /* no symbols to code at all */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)1; - this.val = (unsigned short)0; - *(*table)++ = this; /* make a table to force an error */ - *(*table)++ = this; + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; *bits = 1; return 0; /* no symbols, but wait for decoding to report error */ } - for (min = 1; min <= MAXBITS; min++) + for (min = 1; min < max; min++) if (count[min] != 0) break; if (root < min) root = min; @@ -166,11 +166,10 @@ unsigned short FAR *work; entered in the tables. used keeps track of how many table entries have been allocated from the - provided *table space. It is checked when a LENS table is being made - against the space in *table, ENOUGH, minus the maximum space needed by - the worst case distance code, MAXD. This should never happen, but the - sufficiency of ENOUGH has not been proven exhaustively, hence the check. - This assumes that when type == LENS, bits == 9. + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This @@ -209,24 +208,25 @@ unsigned short FAR *work; mask = used - 1; /* mask for comparing low */ /* check available table space */ - if (type == LENS && used >= ENOUGH - MAXD) + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ - this.bits = (unsigned char)(len - drop); + here.bits = (unsigned char)(len - drop); if ((int)(work[sym]) < end) { - this.op = (unsigned char)0; - this.val = work[sym]; + here.op = (unsigned char)0; + here.val = work[sym]; } else if ((int)(work[sym]) > end) { - this.op = (unsigned char)(extra[work[sym]]); - this.val = base[work[sym]]; + here.op = (unsigned char)(extra[work[sym]]); + here.val = base[work[sym]]; } else { - this.op = (unsigned char)(32 + 64); /* end of block */ - this.val = 0; + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; } /* replicate for those indices with low len bits equal to huff */ @@ -235,7 +235,7 @@ unsigned short FAR *work; min = fill; /* save offset to next table */ do { fill -= incr; - next[(huff >> drop) + fill] = this; + next[(huff >> drop) + fill] = here; } while (fill != 0); /* backwards increment the len-bit code huff */ @@ -277,7 +277,8 @@ unsigned short FAR *work; /* check for enough space */ used += 1U << curr; - if (type == LENS && used >= ENOUGH - MAXD) + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) return 1; /* point entry in root table to sub-table */ @@ -295,20 +296,20 @@ unsigned short FAR *work; through high index bits. When the current sub-table is filled, the loop drops back to the root table to fill in any remaining entries there. */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)(len - drop); - this.val = (unsigned short)0; + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; while (huff != 0) { /* when done with sub-table, drop back to root table */ if (drop != 0 && (huff & mask) != low) { drop = 0; len = root; next = *table; - this.bits = (unsigned char)len; + here.bits = (unsigned char)len; } /* put invalid code marker in table */ - next[huff >> drop] = this; + next[huff >> drop] = here; /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); diff --git a/Modules/zlib/inftrees.h b/Modules/zlib/inftrees.h index b1104c87e76..baa53a0b1a1 100644 --- a/Modules/zlib/inftrees.h +++ b/Modules/zlib/inftrees.h @@ -1,5 +1,5 @@ /* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2005, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -35,21 +35,28 @@ typedef struct { 01000000 - invalid code */ -/* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1444 code structures (852 for length/literals - and 592 for distances, the latter actually the result of an - exhaustive search). The true maximum is not known, but the value - below is more than safe. */ -#define ENOUGH 2048 -#define MAXD 592 +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) -/* Type of code to build for inftable() */ +/* Type of code to build for inflate_table() */ typedef enum { CODES, LENS, DISTS } codetype; -extern int inflate_table OF((codetype type, unsigned short FAR *lens, +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); diff --git a/Modules/zlib/make_vms.com b/Modules/zlib/make_vms.com index c2a1fb54b2f..6576490e651 100644 --- a/Modules/zlib/make_vms.com +++ b/Modules/zlib/make_vms.com @@ -1,33 +1,57 @@ $! make libz under VMS written by $! Martin P.J. Zinser -$! <zinser@zinser.no-ip.info or zinser@sysdev.deutsche-boerse.com> $! -$ on error then goto err_exit +$! In case of problems with the install you might contact me at +$! zinser@zinser.no-ip.info(preferred) or +$! zinser@sysdev.deutsche-boerse.com (work) +$! +$! Make procedure history for Zlib $! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20060120 First version to receive a number +$! 0.02 20061008 Adapt to new Makefile.in +$! 0.03 20091224 Add support for large file check +$! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite +$! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in $! -$! Just some general constants... +$ on error then goto err_exit +$ set proc/parse=ext $! $ true = 1 $ false = 0 $ tmpnam = "temp_" + f$getjpi("","pid") -$ SAY = "WRITE SYS$OUTPUT" +$ tt = tmpnam + ".txt" +$ tc = tmpnam + ".c" +$ th = tmpnam + ".h" +$ define/nolog tconfig 'th' +$ its_decc = false +$ its_vaxc = false +$ its_gnuc = false +$ s_case = False $! $! Setup variables holding "config" information $! -$ Make = "" +$ Make = "" $ name = "Zlib" $ version = "?.?.?" $ v_string = "ZLIB_VERSION" $ v_file = "zlib.h" -$ ccopt = "" -$ lopts = "" +$ ccopt = "" +$ lopts = "" +$ dnsrl = "" +$ aconf_in_file = "zconf.h.in#zconf.h_in" +$ conf_check_string = "" $ linkonly = false $ optfile = name + ".opt" -$ its_decc = false -$ its_vaxc = false -$ its_gnuc = false -$ axp = f$getsyi("HW_MODEL").ge.1024 -$ s_case = false +$ libdefs = "" +$ axp = f$getsyi("HW_MODEL").ge.1024 .and. f$getsyi("HW_MODEL").lt.4096 +$! +$ whoami = f$parse(f$enviornment("Procedure"),,,,"NO_CONCEAL") +$ mydef = F$parse(whoami,,,"DEVICE") +$ mydir = f$parse(whoami,,,"DIRECTORY") - "][" +$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") +$! $! Check for MMK/MMS $! $ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" @@ -36,11 +60,16 @@ $! $! $ gosub find_version $! +$ open/write topt tmp.opt +$ open/write optf 'optfile' +$! $ gosub check_opts $! $! Look for the compiler used $! $ gosub check_compiler +$ close topt +$! $ if its_decc $ then $ ccopt = "/prefix=all" + ccopt @@ -60,6 +89,52 @@ $ then $ if f$trnlnm("SYS").eqs."" then define sys sys$library: $ endif $! +$! Build a fake configure input header +$! +$ open/write conf_hin config.hin +$ write conf_hin "#undef _LARGEFILE64_SOURCE" +$ close conf_hin +$! +$! +$ i = 0 +$FIND_ACONF: +$ fname = f$element(i,"#",aconf_in_file) +$ if fname .eqs. "#" then goto AMISS_ERR +$ if f$search(fname) .eqs. "" +$ then +$ i = i + 1 +$ goto find_aconf +$ endif +$ open/read/err=aconf_err aconf_in 'fname' +$ open/write aconf zconf.h +$ACONF_LOOP: +$ read/end_of_file=aconf_exit aconf_in line +$ work = f$edit(line, "compress,trim") +$ if f$extract(0,6,work) .nes. "#undef" +$ then +$ if f$extract(0,12,work) .nes. "#cmakedefine" +$ then +$ write aconf line +$ endif +$ else +$ cdef = f$element(1," ",work) +$ gosub check_config +$ endif +$ goto aconf_loop +$ACONF_EXIT: +$ write aconf "#define VMS 1" +$ write aconf "#include <unistd.h>" +$ write aconf "#include <unixio.h>" +$ write aconf "#ifdef _LARGEFILE" +$ write aconf "#define off64_t __off64_t" +$ write aconf "#define fopen64 fopen" +$ write aconf "#define fseeko64 fseeko" +$ write aconf "#define lseek64 lseek" +$ write aconf "#define ftello64 ftell" +$ write aconf "#endif" +$ close aconf_in +$ close aconf +$ if f$search("''th'") .nes. "" then delete 'th';* $! Build the thing plain or with mms $! $ write sys$output "Compiling Zlib sources ..." @@ -74,8 +149,14 @@ $ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" - crc32.c zlib.h zconf.h $ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" - deflate.c deflate.h zutil.h zlib.h zconf.h -$ CALL MAKE gzio.OBJ "CC ''CCOPT' gzio" - - gzio.c zutil.h zlib.h zconf.h +$ CALL MAKE gzclose.OBJ "CC ''CCOPT' gzclose" - + gzclose.c zutil.h zlib.h zconf.h +$ CALL MAKE gzlib.OBJ "CC ''CCOPT' gzlib" - + gzlib.c zutil.h zlib.h zconf.h +$ CALL MAKE gzread.OBJ "CC ''CCOPT' gzread" - + gzread.c zutil.h zlib.h zconf.h +$ CALL MAKE gzwrite.OBJ "CC ''CCOPT' gzwrite" - + gzwrite.c zutil.h zlib.h zconf.h $ CALL MAKE infback.OBJ "CC ''CCOPT' infback" - infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h $ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" - @@ -107,7 +188,7 @@ $ call make minigzip.exe - $ endif $ else $ gosub crea_mms -$ SAY "Make ''name' ''version' with ''Make' " +$ write sys$output "Make ''name' ''version' with ''Make' " $ 'make' $ endif $! @@ -133,6 +214,15 @@ $ write sys$output "C compiler required to build ''name'" $ goto err_exit $ERR_EXIT: $ set message/facil/ident/sever/text +$ close/nolog optf +$ close/nolog topt +$ close/nolog conf_hin +$ close/nolog aconf_in +$ close/nolog aconf +$ close/nolog out +$ close/nolog min +$ close/nolog mod +$ close/nolog h_in $ write sys$output "Exiting..." $ exit 2 $! @@ -180,61 +270,72 @@ $!------------------------------------------------------------------------------ $! $! Check command line options and set symbols accordingly $! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20041206 First version to receive a number +$! 0.02 20060126 Add new "HELP" target $ CHECK_OPTS: $ i = 1 $ OPT_LOOP: $ if i .lt. 9 $ then $ cparm = f$edit(p'i',"upcase") -$ if cparm .eqs. "DEBUG" -$ then -$ ccopt = ccopt + "/noopt/deb" -$ lopts = lopts + "/deb" -$ endif -$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) -$ then -$ start = f$locate("=",cparm) + 1 -$ len = f$length(cparm) - start -$ ccopt = ccopt + f$extract(start,len,cparm) -$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - - then s_case = true -$ endif -$ if cparm .eqs. "LINK" then linkonly = true -$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) -$ then -$ start = f$locate("=",cparm) + 1 -$ len = f$length(cparm) - start -$ lopts = lopts + f$extract(start,len,cparm) -$ endif -$ if f$locate("CC=",cparm) .lt. f$length(cparm) +$! +$! Check if parameter actually contains something +$! +$ if f$edit(cparm,"trim") .nes. "" $ then -$ start = f$locate("=",cparm) + 1 -$ len = f$length(cparm) - start -$ cc_com = f$extract(start,len,cparm) - if (cc_com .nes. "DECC") .and. - - (cc_com .nes. "VAXC") .and. - - (cc_com .nes. "GNUC") +$ if cparm .eqs. "DEBUG" $ then -$ write sys$output "Unsupported compiler choice ''cc_com' ignored" -$ write sys$output "Use DECC, VAXC, or GNUC instead" -$ else -$ if cc_com .eqs. "DECC" then its_decc = true -$ if cc_com .eqs. "VAXC" then its_vaxc = true -$ if cc_com .eqs. "GNUC" then its_gnuc = true +$ ccopt = ccopt + "/noopt/deb" +$ lopts = lopts + "/deb" $ endif -$ endif -$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) -$ then -$ start = f$locate("=",cparm) + 1 -$ len = f$length(cparm) - start -$ mmks = f$extract(start,len,cparm) -$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") +$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) $ then -$ make = mmks -$ else -$ write sys$output "Unsupported make choice ''mmks' ignored" -$ write sys$output "Use MMK or MMS instead" +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ ccopt = ccopt + f$extract(start,len,cparm) +$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - + then s_case = true +$ endif +$ if cparm .eqs. "LINK" then linkonly = true +$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ lopts = lopts + f$extract(start,len,cparm) $ endif +$ if f$locate("CC=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ cc_com = f$extract(start,len,cparm) + if (cc_com .nes. "DECC") .and. - + (cc_com .nes. "VAXC") .and. - + (cc_com .nes. "GNUC") +$ then +$ write sys$output "Unsupported compiler choice ''cc_com' ignored" +$ write sys$output "Use DECC, VAXC, or GNUC instead" +$ else +$ if cc_com .eqs. "DECC" then its_decc = true +$ if cc_com .eqs. "VAXC" then its_vaxc = true +$ if cc_com .eqs. "GNUC" then its_gnuc = true +$ endif +$ endif +$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ mmks = f$extract(start,len,cparm) +$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") +$ then +$ make = mmks +$ else +$ write sys$output "Unsupported make choice ''mmks' ignored" +$ write sys$output "Use MMK or MMS instead" +$ endif +$ endif +$ if cparm .eqs. "HELP" then gosub bhelp $ endif $ i = i + 1 $ goto opt_loop @@ -244,6 +345,11 @@ $!------------------------------------------------------------------------------ $! $! Look for the compiler used $! +$! Version history +$! 0.01 20040223 First version to receive a number +$! 0.02 20040229 Save/set value of decc$no_rooted_search_lists +$! 0.03 20060202 Extend handling of GNU C +$! 0.04 20090402 Compaq -> hp $CHECK_COMPILER: $ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) $ then @@ -257,9 +363,26 @@ $! $ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) $ then goto CC_ERR $ else -$ if its_decc then write sys$output "CC compiler check ... Compaq C" -$ if its_vaxc then write sys$output "CC compiler check ... VAX C" -$ if its_gnuc then write sys$output "CC compiler check ... GNU C" +$ if its_decc +$ then +$ write sys$output "CC compiler check ... hp C" +$ if f$trnlnm("decc$no_rooted_search_lists") .nes. "" +$ then +$ dnrsl = f$trnlnm("decc$no_rooted_search_lists") +$ endif +$ define/nolog decc$no_rooted_search_lists 1 +$ else +$ if its_vaxc then write sys$output "CC compiler check ... VAX C" +$ if its_gnuc +$ then +$ write sys$output "CC compiler check ... GNU C" +$ if f$trnlnm(topt) then write topt "gnu_cc:[000000]gcclib.olb/lib" +$ if f$trnlnm(optf) then write optf "gnu_cc:[000000]gcclib.olb/lib" +$ cc = "gcc" +$ endif +$ if f$trnlnm(topt) then write topt "sys$share:vaxcrtl.exe/share" +$ if f$trnlnm(optf) then write optf "sys$share:vaxcrtl.exe/share" +$ endif $ endif $ return $!------------------------------------------------------------------------------ @@ -276,7 +399,8 @@ $ deck # written by Martin P.J. Zinser # <zinser@zinser.no-ip.info or zinser@sysdev.deutsche-boerse.com> -OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj, infback.obj\ +OBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\ + gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\ deflate.obj, trees.obj, zutil.obj, inflate.obj, \ inftrees.obj, inffast.obj @@ -308,7 +432,10 @@ compress.obj : compress.c zlib.h zconf.h crc32.obj : crc32.c zutil.h zlib.h zconf.h deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h example.obj : example.c zlib.h zconf.h -gzio.obj : gzio.c zutil.h zlib.h zconf.h +gzclose.obj : gzclose.c zutil.h zlib.h zconf.h +gzlib.obj : gzlib.c zutil.h zlib.h zconf.h +gzread.obj : gzread.c zutil.h zlib.h zconf.h +gzwrite.obj : gzwrite.c zutil.h zlib.h zconf.h inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h inflate.obj : inflate.c zutil.h zlib.h zconf.h inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h @@ -328,7 +455,7 @@ $! $CREA_OLIST: $ open/read min makefile.in $ open/write mod modules.opt -$ src_check = "OBJS =" +$ src_check = "OBJC =" $MRLOOP: $ read/end=mrdone min rec $ if (f$extract(0,6,rec) .nes. src_check) then goto mrloop @@ -382,13 +509,182 @@ $ close h_in $ return $!------------------------------------------------------------------------------ $! +$CHECK_CONFIG: +$! +$ in_ldef = f$locate(cdef,libdefs) +$ if (in_ldef .lt. f$length(libdefs)) +$ then +$ write aconf "#define ''cdef' 1" +$ libdefs = f$extract(0,in_ldef,libdefs) + - + f$extract(in_ldef + f$length(cdef) + 1, - + f$length(libdefs) - in_ldef - f$length(cdef) - 1, - + libdefs) +$ else +$ if (f$type('cdef') .eqs. "INTEGER") +$ then +$ write aconf "#define ''cdef' ", 'cdef' +$ else +$ if (f$type('cdef') .eqs. "STRING") +$ then +$ write aconf "#define ''cdef' ", """", '''cdef'', """" +$ else +$ gosub check_cc_def +$ endif +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check if this is a define relating to the properties of the C/C++ +$! compiler +$! +$ CHECK_CC_DEF: +$ if (cdef .eqs. "_LARGEFILE64_SOURCE") +$ then +$ copy sys$input: 'tc' +$ deck +#include "tconfig" +#define _LARGEFILE +#include <stdio.h> + +int main(){ +FILE *fp; + fp = fopen("temp.txt","r"); + fseeko(fp,1,SEEK_SET); + fclose(fp); +} + +$ eod +$ test_inv = false +$ comm_h = false +$ gosub cc_prop_check +$ return +$ endif +$ write aconf "/* ", line, " */" +$ return +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler +$! +$! Version history +$! 0.01 20031020 First version to receive a number +$! 0.02 20031022 Added logic for defines with value +$! 0.03 20040309 Make sure local config file gets not deleted +$! 0.04 20041230 Also write include for configure run +$! 0.05 20050103 Add processing of "comment defines" +$CC_PROP_CHECK: +$ cc_prop = true +$ is_need = false +$ is_need = (f$extract(0,4,cdef) .eqs. "NEED") .or. (test_inv .eq. true) +$ if f$search(th) .eqs. "" then create 'th' +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link 'tmpnam',tmp.opt/opt +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'.*;*/exclude='th' +$ if (cc_prop .and. .not. is_need) .or. - + (.not. cc_prop .and. is_need) +$ then +$ write sys$output "Checking for ''cdef'... yes" +$ if f$type('cdef_val'_yes) .nes. "" +$ then +$ if f$type('cdef_val'_yes) .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_yes) +$ if f$type('cdef_val'_yes) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_yes) +$ else +$ call write_config f$fao("#define !AS 1",cdef) +$ endif +$ if (cdef .eqs. "HAVE_FSEEKO") .or. (cdef .eqs. "_LARGE_FILES") .or. - + (cdef .eqs. "_LARGEFILE64_SOURCE") then - + call write_config f$string("#define _LARGEFILE 1") +$ else +$ write sys$output "Checking for ''cdef'... no" +$ if (comm_h) +$ then + call write_config f$fao("/* !AS */",line) +$ else +$ if f$type('cdef_val'_no) .nes. "" +$ then +$ if f$type('cdef_val'_no) .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_no) +$ if f$type('cdef_val'_no) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_no) +$ else +$ call write_config f$fao("#undef !AS",cdef) +$ endif +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler with multiple result values +$! +$! Version history +$! 0.01 20040127 First version +$! 0.02 20050103 Reconcile changes from cc_prop up to version 0.05 +$CC_MPROP_CHECK: +$ cc_prop = true +$ i = 1 +$ idel = 1 +$ MT_LOOP: +$ if f$type(result_'i') .eqs. "STRING" +$ then +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam'_'i' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link 'tmpnam'_'i',tmp.opt/opt +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'_'i'.*;* +$ if (cc_prop) +$ then +$ write sys$output "Checking for ''cdef'... ", mdef_'i' +$ if f$type(mdef_'i') .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,mdef_'i') +$ if f$type('cdef_val'_yes) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,mdef_'i') +$ goto msym_clean +$ else +$ i = i + 1 +$ goto mt_loop +$ endif +$ endif +$ write sys$output "Checking for ''cdef'... no" +$ call write_config f$fao("#undef !AS",cdef) +$ MSYM_CLEAN: +$ if (idel .le. msym_max) +$ then +$ delete/sym mdef_'idel' +$ idel = idel + 1 +$ goto msym_clean +$ endif +$ return +$!------------------------------------------------------------------------------ +$! $! Analyze Object files for OpenVMS AXP to extract Procedure and Data $! information to build a symbol vector for a shareable image $! All the "brains" of this logic was suggested by Hartmut Becker $! (Hartmut.Becker@compaq.com). All the bugs were introduced by me -$! (zinser@decus.de), so if you do have problem reports please do not +$! (zinser@zinser.no-ip.info), so if you do have problem reports please do not $! bother Hartmut/HP, but get in touch with me $! +$! Version history +$! 0.01 20040406 Skip over shareable images in option file +$! 0.02 20041109 Fix option file for shareable images with case_sensitive=YES +$! 0.03 20050107 Skip over Identification labels in option file +$! 0.04 20060117 Add uppercase alias to code compiled with /name=as_is +$! $ ANAL_OBJ_AXP: Subroutine $ V = 'F$Verify(0) $ SAY := "WRITE_ SYS$OUTPUT" @@ -409,6 +705,17 @@ $ create a.tmp $ open/append atmp a.tmp $ loop: $ read/end=end_loop in line +$ if f$locate("/SHARE",f$edit(line,"upcase")) .lt. f$length(line) +$ then +$ write sys$output "ANAL_SKP_SHR-i-skipshare, ''line'" +$ goto loop +$ endif +$ if f$locate("IDENTIFICATION=",f$edit(line,"upcase")) .lt. f$length(line) +$ then +$ write sys$output "ANAL_OBJ_AXP-i-ident: Identification ", - + f$element(1,"=",line) +$ goto loop +$ endif $ f= f$search(line) $ if f .eqs. "" $ then @@ -450,8 +757,31 @@ $ edito/edt/command=sys$input f.tmp sub/symbol: "/symbol_vector=(/whole sub/"/=DATA)/whole exit -$ sort/nodupl d.tmp,f.tmp 'p2' -$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;* +$ sort/nodupl d.tmp,f.tmp g.tmp +$ open/read raw_vector g.tmp +$ open/write case_vector 'p2' +$ RAWLOOP: +$ read/end=end_rawloop raw_vector raw_element +$ write case_vector raw_element +$ if f$locate("=PROCEDURE)",raw_element) .lt. f$length(raw_element) +$ then +$ name = f$element(1,"=",raw_element) - "(" +$ if f$edit(name,"UPCASE") .nes. name then - + write case_vector f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)", - + f$edit(name,"UPCASE"), name) +$ endif +$ if f$locate("=DATA)",raw_element) .lt. f$length(raw_element) +$ then +$ name = f$element(1,"=",raw_element) - "(" +$ if f$edit(name,"UPCASE") .nes. name then - + write case_vector f$fao(" symbol_vector=(!AS/!AS=DATA)", - + f$edit(name,"UPCASE"), name) +$ endif +$ goto rawloop +$ END_RAWLOOP: +$ close raw_vector +$ close case_vector +$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;*,g.tmp;* $ if f$search("x.tmp") .nes. "" - then $ delete x.tmp;* $! @@ -459,3 +789,16 @@ $ EXIT_AA: $ if V then set verify $ endsubroutine $!------------------------------------------------------------------------------ +$! +$! Write configuration to both permanent and temporary config file +$! +$! Version history +$! 0.01 20031029 First version to receive a number +$! +$WRITE_CONFIG: SUBROUTINE +$ write aconf 'p1' +$ open/append confh 'th' +$ write confh 'p1' +$ close confh +$ENDSUBROUTINE +$!------------------------------------------------------------------------------ diff --git a/Modules/zlib/minigzip.c b/Modules/zlib/minigzip.c index 4524b96a1d6..9825ccc3a71 100644 --- a/Modules/zlib/minigzip.c +++ b/Modules/zlib/minigzip.c @@ -1,5 +1,5 @@ /* minigzip.c -- simulate gzip using the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2006, 2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -15,8 +15,8 @@ /* @(#) $Id$ */ -#include <stdio.h> #include "zlib.h" +#include <stdio.h> #ifdef STDC # include <string.h> @@ -32,6 +32,9 @@ #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) # include <fcntl.h> # include <io.h> +# ifdef UNDER_CE +# include <stdlib.h> +# endif # define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) #else # define SET_BINARY_MODE(file) @@ -50,9 +53,75 @@ # include <unix.h> /* for fileno */ #endif +#if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) #ifndef WIN32 /* unlink already in stdio.h for WIN32 */ extern int unlink OF((const char *)); #endif +#endif + +#if defined(UNDER_CE) +# include <windows.h> +# define perror(s) pwinerror(s) + +/* Map the Windows error number in ERROR to a locale-dependent error + message string and return a pointer to it. Typically, the values + for ERROR come from GetLastError. + + The string pointed to shall not be modified by the application, + but may be overwritten by a subsequent call to strwinerror + + The strwinerror function does not change the current setting + of GetLastError. */ + +static char *strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +static void pwinerror (s) + const char *s; +{ + if (s && *s) + fprintf(stderr, "%s: %s\n", s, strwinerror(GetLastError ())); + else + fprintf(stderr, "%s\n", strwinerror(GetLastError ())); +} + +#endif /* UNDER_CE */ #ifndef GZ_SUFFIX # define GZ_SUFFIX ".gz" @@ -198,6 +267,11 @@ void file_compress(file, mode) FILE *in; gzFile out; + if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } + strcpy(outfile, file); strcat(outfile, GZ_SUFFIX); @@ -227,7 +301,12 @@ void file_uncompress(file) char *infile, *outfile; FILE *out; gzFile in; - uInt len = (uInt)strlen(file); + size_t len = strlen(file); + + if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } strcpy(buf, file); @@ -258,7 +337,8 @@ void file_uncompress(file) /* =========================================================================== - * Usage: minigzip [-d] [-f] [-h] [-r] [-1 to -9] [files...] + * Usage: minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...] + * -c : write to standard output * -d : decompress * -f : compress with Z_FILTERED * -h : compress with Z_HUFFMAN_ONLY @@ -270,17 +350,30 @@ int main(argc, argv) int argc; char *argv[]; { + int copyout = 0; int uncompr = 0; gzFile file; - char outmode[20]; + char *bname, outmode[20]; strcpy(outmode, "wb6 "); prog = argv[0]; + bname = strrchr(argv[0], '/'); + if (bname) + bname++; + else + bname = argv[0]; argc--, argv++; + if (!strcmp(bname, "gunzip")) + uncompr = 1; + else if (!strcmp(bname, "zcat")) + copyout = uncompr = 1; + while (argc > 0) { - if (strcmp(*argv, "-d") == 0) + if (strcmp(*argv, "-c") == 0) + copyout = 1; + else if (strcmp(*argv, "-d") == 0) uncompr = 1; else if (strcmp(*argv, "-f") == 0) outmode[3] = 'f'; @@ -310,11 +403,36 @@ int main(argc, argv) gz_compress(stdin, file); } } else { + if (copyout) { + SET_BINARY_MODE(stdout); + } do { if (uncompr) { - file_uncompress(*argv); + if (copyout) { + file = gzopen(*argv, "rb"); + if (file == NULL) + fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); + else + gz_uncompress(file, stdout); + } else { + file_uncompress(*argv); + } } else { - file_compress(*argv, outmode); + if (copyout) { + FILE * in = fopen(*argv, "rb"); + + if (in == NULL) { + perror(*argv); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + + gz_compress(in, file); + } + + } else { + file_compress(*argv, outmode); + } } } while (argv++, --argc); } diff --git a/Modules/zlib/trees.c b/Modules/zlib/trees.c index 395e4e16814..56e9bb1c115 100644 --- a/Modules/zlib/trees.c +++ b/Modules/zlib/trees.c @@ -1,5 +1,6 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2005 Jean-loup Gailly + * Copyright (C) 1995-2010 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -152,7 +153,7 @@ local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, ct_data *ltree, ct_data *dtree)); -local void set_data_type OF((deflate_state *s)); +local int detect_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); @@ -203,12 +204,12 @@ local void send_bits(s, value, length) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (value << s->bi_valid); + s->bi_buf |= (ush)value << s->bi_valid; put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { - s->bi_buf |= value << s->bi_valid; + s->bi_buf |= (ush)value << s->bi_valid; s->bi_valid += length; } } @@ -218,12 +219,12 @@ local void send_bits(s, value, length) { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ - s->bi_buf |= (val << s->bi_valid);\ + s->bi_buf |= (ush)val << s->bi_valid;\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ - s->bi_buf |= (value) << s->bi_valid;\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ s->bi_valid += len;\ }\ } @@ -250,11 +251,13 @@ local void tr_static_init() if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; +#endif /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; @@ -348,13 +351,14 @@ void gen_trees_header() static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } - fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } - fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); @@ -379,7 +383,7 @@ void gen_trees_header() /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ -void _tr_init(s) +void ZLIB_INTERNAL _tr_init(s) deflate_state *s; { tr_static_init(); @@ -864,13 +868,13 @@ local void send_all_trees(s, lcodes, dcodes, blcodes) /* =========================================================================== * Send a stored block */ -void _tr_stored_block(s, buf, stored_len, eof) +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ - int eof; /* true if this is the last block for a file */ + int last; /* one if this is the last block for a file */ { - send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; @@ -889,7 +893,7 @@ void _tr_stored_block(s, buf, stored_len, eof) * To simplify the code, we assume the worst case of last real code encoded * on one bit only. */ -void _tr_align(s) +void ZLIB_INTERNAL _tr_align(s) deflate_state *s; { send_bits(s, STATIC_TREES<<1, 3); @@ -918,11 +922,11 @@ void _tr_align(s) * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ -void _tr_flush_block(s, buf, stored_len, eof) +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ - int eof; /* true if this is the last block for a file */ + int last; /* one if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ @@ -931,8 +935,8 @@ void _tr_flush_block(s, buf, stored_len, eof) if (s->level > 0) { /* Check if the file is binary or text */ - if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) - set_data_type(s); + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); @@ -978,20 +982,20 @@ void _tr_flush_block(s, buf, stored_len, eof) * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ - _tr_stored_block(s, buf, stored_len, eof); + _tr_stored_block(s, buf, stored_len, last); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif - send_bits(s, (STATIC_TREES<<1)+eof, 3); + send_bits(s, (STATIC_TREES<<1)+last, 3); compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { - send_bits(s, (DYN_TREES<<1)+eof, 3); + send_bits(s, (DYN_TREES<<1)+last, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); @@ -1005,21 +1009,21 @@ void _tr_flush_block(s, buf, stored_len, eof) */ init_block(s); - if (eof) { + if (last) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*eof)); + s->compressed_len-7*last)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ -int _tr_tally (s, dist, lc) +int ZLIB_INTERNAL _tr_tally (s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ @@ -1118,24 +1122,45 @@ local void compress_block(s, ltree, dtree) } /* =========================================================================== - * Set the data type to BINARY or TEXT, using a crude approximation: - * set it to Z_TEXT if all symbols are either printable characters (33 to 255) - * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). * IN assertion: the fields Freq of dyn_ltree are set. */ -local void set_data_type(s) +local int detect_data_type(s) deflate_state *s; { + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; int n; - for (n = 0; n < 9; n++) + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) if (s->dyn_ltree[n].Freq != 0) - break; - if (n == 9) - for (n = 14; n < 32; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; } /* =========================================================================== diff --git a/Modules/zlib/trees.h b/Modules/zlib/trees.h index 72facf900f7..d35639d82a2 100644 --- a/Modules/zlib/trees.h +++ b/Modules/zlib/trees.h @@ -70,7 +70,7 @@ local const ct_data static_dtree[D_CODES] = { {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; -const uch _dist_code[DIST_CODE_LEN] = { +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, @@ -99,7 +99,7 @@ const uch _dist_code[DIST_CODE_LEN] = { 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; -const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, diff --git a/Modules/zlib/uncompr.c b/Modules/zlib/uncompr.c index b59e3d0defb..ad98be3a5d8 100644 --- a/Modules/zlib/uncompr.c +++ b/Modules/zlib/uncompr.c @@ -1,5 +1,5 @@ /* uncompr.c -- decompress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. + * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -16,8 +16,6 @@ been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output diff --git a/Modules/zlib/zconf.h b/Modules/zlib/zconf.h index 03a9431c8be..02ce56c4313 100644 --- a/Modules/zlib/zconf.h +++ b/Modules/zlib/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -11,52 +11,124 @@ /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 # define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy # define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset +# define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams -# define deflateBound z_deflateBound # define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader # define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound +# define inflateUndermine z_inflateUndermine +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table # define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table # define zError z_zError +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef # define alloc_func z_alloc_func +# define charf z_charf # define free_func z_free_func +# define gzFile z_gzFile +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp # define in_func z_in_func +# define intf z_intf # define out_func z_out_func -# define Byte z_Byte # define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf # define uIntf z_uIntf +# define uLong z_uLong # define uLongf z_uLongf -# define voidpf z_voidpf # define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + #endif #if defined(__MSDOS__) && !defined(MSDOS) @@ -284,49 +356,73 @@ typedef uLong FAR uLongf; typedef Byte *voidp; #endif -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include <sys/types.h> /* for off_t */ -# include <unistd.h> /* for SEEK_* and off_t */ +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef STDC +# include <sys/types.h> /* for off_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include <unistd.h> /* for SEEK_* and off_t */ # ifdef VMS -# include <unixio.h> /* for off_t */ +# include <unixio.h> /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t # endif -# define z_off_t off_t #endif + #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif + #ifndef z_off_t # define z_off_t long #endif +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define z_off64_t off64_t +#else +# define z_off64_t z_off_t +#endif + #if defined(__OS400__) # define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ diff --git a/Modules/zlib/zconf.h.cmakein b/Modules/zlib/zconf.h.cmakein new file mode 100644 index 00000000000..a2f71b1f32e --- /dev/null +++ b/Modules/zlib/zconf.h.cmakein @@ -0,0 +1,430 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H +#cmakedefine Z_PREFIX +#cmakedefine Z_HAVE_UNISTD_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# define uncompress z_uncompress +# define zError z_zError +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# define gzFile z_gzFile +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include <windows.h> + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef STDC +# include <sys/types.h> /* for off_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include <unistd.h> /* for SEEK_* and off_t */ +# ifdef VMS +# include <unixio.h> /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +#endif + +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define z_off64_t off64_t +#else +# define z_off64_t z_off_t +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/Modules/zlib/zconf.h.in b/Modules/zlib/zconf.h.in new file mode 100644 index 00000000000..02ce56c4313 --- /dev/null +++ b/Modules/zlib/zconf.h.in @@ -0,0 +1,428 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# define uncompress z_uncompress +# define zError z_zError +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# define gzFile z_gzFile +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include <windows.h> + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef STDC +# include <sys/types.h> /* for off_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include <unistd.h> /* for SEEK_* and off_t */ +# ifdef VMS +# include <unixio.h> /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +#endif + +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define z_off64_t off64_t +#else +# define z_off64_t z_off_t +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/Modules/zlib/zlib.3 b/Modules/zlib/zlib.3 index 90b8162870f..27adc4cd10a 100644 --- a/Modules/zlib/zlib.3 +++ b/Modules/zlib/zlib.3 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "18 July 2005" +.TH ZLIB 3 "19 Apr 2010" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -9,15 +9,15 @@ for full description] The .I zlib library is a general purpose data compression library. -The code is thread safe. +The code is thread safe, assuming that the standard library functions +used are thread safe, such as memory allocation routines. It provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) -but other algorithms will be added later -and will have the same stream interface. +but other algorithms may be added later +with the same stream interface. .LP Compression can be done in a single step if the buffers are large enough -(for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output @@ -30,7 +30,7 @@ with an interface similar to that of stdio. .LP The library does not install any signal handler. The decoder checks the consistency of the compressed data, -so the library should never crash even in case of corrupted input. +so the library should never crash even in the case of corrupted input. .LP All functions of the compression library are documented in the file .IR zlib.h . @@ -38,18 +38,19 @@ The distribution source includes examples of use of the library in the files .I example.c and -.IR minigzip.c . +.IR minigzip.c, +as well as other examples in the +.IR examples/ +directory. .LP Changes to this version are documented in the file .I ChangeLog -that accompanies the source, -and are concerned primarily with bug fixes and portability enhancements. +that accompanies the source. .LP -A Java implementation of .I zlib -is available in the Java Development Kit 1.1: +is available in Java using the java.util.zip package: .IP -http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html +http://java.sun.com/developer/technicalArticles/Programming/compression/ .LP A Perl interface to .IR zlib , @@ -57,7 +58,7 @@ written by Paul Marquess (pmqs@cpan.org), is available at CPAN (Comprehensive Perl Archive Network) sites, including: .IP -http://www.cpan.org/modules/by-module/Compress/ +http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .LP A Python interface to .IR zlib , @@ -66,14 +67,11 @@ is available in Python 1.5 and later versions: .IP http://www.python.org/doc/lib/module-zlib.html .LP -A .I zlib -binding for -.IR tcl (1), -written by Andreas Kupries (a.kupries@westend.com), -is availlable at: +is built into +.IR tcl: .IP -http://www.westend.com/~kupries/doc/trf/man/man.html +http://wiki.tcl.tk/4610 .LP An experimental package to read and write files in .zip format, written on top of @@ -81,40 +79,34 @@ written on top of by Gilles Vollant (info@winimage.com), is available at: .IP -http://www.winimage.com/zLibDll/unzip.html +http://www.winimage.com/zLibDll/minizip.html and also in the .I contrib/minizip directory of the main .I zlib -web site. +source distribution. .SH "SEE ALSO" The .I zlib -web site can be found at either of these locations: +web site can be found at: .IP -http://www.zlib.org -.br -http://www.gzip.org/zlib/ +http://zlib.net/ .LP The data format used by the zlib library is described by RFC (Request for Comments) 1950 to 1952 in the files: .IP -http://www.ietf.org/rfc/rfc1950.txt (concerning zlib format) +http://www.ietf.org/rfc/rfc1950.txt (for the zlib header and trailer format) .br -http://www.ietf.org/rfc/rfc1951.txt (concerning deflate format) +http://www.ietf.org/rfc/rfc1951.txt (for the deflate compressed data format) .br -http://www.ietf.org/rfc/rfc1952.txt (concerning gzip format) -.LP -These documents are also available in other formats from: -.IP -ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html +http://www.ietf.org/rfc/rfc1952.txt (for the gzip header and trailer format) .LP -Mark Nelson (markn@ieee.org) wrote an article about +Mark Nelson wrote an article about .I zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at: .IP -http://dogma.net/markn/articles/zlibtool/zlibtool.htm +http://marknelson.us/1997/01/01/zlib-engine/ .SH "REPORTING PROBLEMS" Before reporting a problem, please check the @@ -127,14 +119,14 @@ Please read the .I zlib FAQ at: .IP -http://www.gzip.org/zlib/zlib_faq.html +http://zlib.net/zlib_faq.html .LP before asking for help. Send questions and/or comments to zlib@gzip.org, or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). .SH AUTHORS -Version 1.2.3 -Copyright (C) 1995-2005 Jean-loup Gailly (jloup@gzip.org) +Version 1.2.5 +Copyright (C) 1995-2010 Jean-loup Gailly (jloup@gzip.org) and Mark Adler (madler@alumni.caltech.edu). .LP This software is provided "as-is," diff --git a/Modules/zlib/zlib.h b/Modules/zlib/zlib.h index 022817927ce..bfbba83e8ee 100644 --- a/Modules/zlib/zlib.h +++ b/Modules/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.3, July 18th, 2005 + version 1.2.5, April 19th, 2010 - Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,41 +37,44 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.3" -#define ZLIB_VERNUM 0x1230 +#define ZLIB_VERSION "1.2.5" +#define ZLIB_VERNUM 0x1250 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 5 +#define ZLIB_VER_SUBREVISION 0 /* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. - - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output (providing more output space) before each call. - The compressed data format used by default by the in-memory functions is + The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. - The library also supports reading and writing files in gzip (.gz) format + The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - This library can optionally read and write gzip streams in memory as well. + This library can optionally read and write gzip streams in memory as well. - The zlib format was designed to be compact and fast for use in memory + The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); @@ -126,45 +129,45 @@ typedef struct gz_header_s { typedef gz_header FAR *gz_headerp; /* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the opaque value. - zalloc must return Z_NULL if there is not enough memory for the object. + zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_PARTIAL_FLUSH 1 #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 +#define Z_TREES 6 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 @@ -176,8 +179,8 @@ typedef gz_header FAR *gz_headerp; #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 @@ -207,119 +210,140 @@ typedef gz_header FAR *gz_headerp; #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ + /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when forced to flush. - The detailed semantics are as follows. deflate performs one or both of the + The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not + accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. + accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumualte before producing output, in order to + decide how much data to accumulate before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - the value returned by deflateBound (see below). If deflate does not return + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). If deflate does not return Z_STREAM_END, then it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ @@ -328,13 +352,13 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. + This function discards any unprocessed input and does not flush any pending + output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be deallocated). */ @@ -342,10 +366,10 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - Initializes the internal stream state for decompression. The fields + Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to @@ -353,95 +377,108 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce + buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. - The detailed semantics are as follows. inflate performs one or both of the + The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, - Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() stop - if and when it gets to the next deflate block boundary. When decoding the - zlib or gzip format, this will cause inflate() to return immediately after - the header and before the first block. When doing a raw inflate, inflate() - will go ahead and process the first block, and will return when it gets to - the end of that block, or when it runs out of data. + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 - if inflate() is currently decoding the last block in the deflate stream, - plus 128 if inflate() returned immediately after decoding an end-of-block - code or decoding the complete header up to just before the first byte of the - deflate stream. The end-of-block will not be indicated until all of the - uncompressed data from that block has been written to strm->next_out. The - number of unused bits may in general be greater than seven, except when - bit 7 of data_type is set, in which case the number of unused bits will be - less than eight. + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster approach - may be used for the single inflate() call. + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all the uncompressed data. (The size + of the uncompressed data may have been saved by the compressor for this + purpose.) The next operation on this stream must be inflateEnd to deallocate + the decompression state. The use of Z_FINISH is never required, but can be + used to inform inflate that a faster approach may be used for the single + inflate() call. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation + first call. So the only effect of the flush parameter in this implementation is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK is used. + because Z_BLOCK or Z_TREES is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm->adler to the adler32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the adler32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 + below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. - inflate() will decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically. Any information - contained in the gzip header is not retained, so applications that need that - information should instead use raw inflate, see inflateInit2() below, or - inflateBack() and perform their own processing of the gzip header and - trailer. + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has @@ -449,27 +486,28 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may then - call inflateSync() to look for a good compression block if a partial recovery - of the data is desired. + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. + This function discards any unprocessed input and does not flush any pending + output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a + was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ + /* Advanced functions */ /* @@ -484,55 +522,57 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int memLevel, int strategy)); - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. - The method parameter is the compression method. It must be Z_DEFLATED in + The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. - windowBits can also be greater than 15 for optional gzip encoding. Add + windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), - no header crc, and the operating system will be set to 255 (unknown). If a + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. - The strategy parameter is used to tune the compression algorithm. Use the + The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between - Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as - Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy - parameter only affects the compression ratio but not the correctness of the - compressed output even if it is not set appropriately. Z_FIXED prevents the - use of dynamic Huffman codes, allowing for a simpler decoder for special - applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, @@ -540,37 +580,37 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any call + of deflate. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a + used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. In addition, the - current implementation of deflate will use at most the window size minus - 262 bytes of the provided dictionary. + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value + which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not + or if the compression method is bsort). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ @@ -581,26 +621,26 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed + data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and + (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, @@ -610,18 +650,18 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, @@ -645,9 +685,10 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() - or deflateInit2(). This would be used to allocate an output buffer - for deflation in a single pass, and so would be called before deflate(). + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, @@ -655,21 +696,21 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the - bits leftover from a previous deflate stream when appending to it. As such, - this function can only be used for raw deflate, and must be used before the - first deflate() call after a deflateInit2() or deflateReset(). bits must be - less than or equal to 16, and that many of the least significant bits of - value will be inserted in the output. - - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* - deflateSetHeader() provides gzip header information for when a gzip + deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information @@ -682,11 +723,11 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. - If deflateSetHeader is not used, the default gzip header has text false, + If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ @@ -694,43 +735,50 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); - This is another version of inflateInit with an extra parameter. The + This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window + deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This + looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom + such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments + most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. - windowBits can also be greater than 15 for optional gzip decoding. Add + windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is - a crc32 instead of an adler32. + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg - is set to null if there is no error message. inflateInit2 does not perform - any decompression apart from reading the zlib header if present: this will - be done by inflate(). (So next_in and avail_in may be modified, but next_out - and avail_out are unchanged.) + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, @@ -738,8 +786,8 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called @@ -748,26 +796,26 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, dictionary that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not + expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been + found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the + success case, the application may save the current current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, @@ -782,18 +830,30 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and + (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, @@ -801,54 +861,87 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int value)); /* This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* - inflateGetHeader() requests that gzip header information be stored in the + inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK can be used to - force inflate() to return immediately after header processing is complete - and before any actual data is decompressed. + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. - The text, time, xflags, and os fields are filled in with the gzip header + The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max + was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When - any of extra, name, or comment are not Z_NULL and the respective field is - not present in the header, then that field is set to Z_NULL to signal its + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. - If inflateGetHeader is not used, then the header information is simply + If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ @@ -869,9 +962,9 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not - be allocated, or Z_VERSION_ERROR if the version of the library does not - match the version of the header file. + the paramaters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); @@ -891,15 +984,15 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free - the allocated state. + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects - only the raw deflate stream to decompress. This is different from the - normal behavior of inflate(), which expects either a zlib or gzip header and + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then @@ -925,7 +1018,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These @@ -935,15 +1028,15 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format - error in the deflate stream (in which case strm->msg is set to indicate the - nature of the error), or Z_STREAM_ERROR if the stream was not properly - initialized. In the case of Z_BUF_ERROR, an input or output error can be - distinguished using strm->next_in which will be Z_NULL only if in() returned - an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to - out() returning non-zero. (in() will always be called before out(), so - strm->next_in is assured to be defined if out() returns non-zero.) Note - that inflateBack() cannot return Z_OK. + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); @@ -999,23 +1092,22 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* utility functions */ /* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least the value returned - by compressBound(sourceLen). Upon exit, destLen is the actual size of the + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. @@ -1025,11 +1117,11 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* - Compresses the source buffer into the destination buffer. The level + Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the + length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough @@ -1040,22 +1132,20 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before - a compress() or compress2() call to allocate the destination buffer. + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output @@ -1063,136 +1153,199 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, */ -typedef voidp gzFile; + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef voidp gzFile; /* opaque gzip file descriptor */ -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h", or 'R' for run-length encoding - as in "wb1R". (See the description of deflateInit2 for more information - about the strategy parameter.) +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) Also "a" + can be used instead of "w" to request that the gzip stream that will be + written be appended to the file. "+" will result in an error, since reading + and writing to the same gzip file is not supported. gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* - Dynamically update the compression level or strategy. See the description + Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ + Reads the given number of uncompressed bytes from the compressed file. If + the input file was not in gzip format, gzread copies the given number of + bytes into the buffer. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream, or failing that, reading the rest + of the input file directly without decompression. The entire input file + will be read if gzread is called until it returns less than the requested + len. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. */ -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); /* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). The number of - uncompressed bytes written is limited to 4095. The caller should assure that - this limit is not exceeded. If it is exceeded, then gzprintf() will return - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* - Writes the given null-terminated string to the compressed file, excluding + Writes the given null-terminated string to the compressed file, excluding the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. + + gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. */ -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. */ -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* - Push one character back onto the stream to be read again later. - Only one character of push-back is allowed. gzungetc() returns the - character pushed, or -1 on failure. gzungetc() will fail if a - character has been pushed but not read yet, or if c is -1. The pushed - character will be discarded if the stream is repositioned with gzseek() - or gzrewind(). + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). */ -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. */ -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); /* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are + extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. - gzseek returns the resulting offset location as measured in bytes from + gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. @@ -1202,68 +1355,127 @@ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ +/* ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + /* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* - Returns 1 if file is being read directly without decompression, otherwise - zero. + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. This state can change from + false to true while reading the input file if the end of a gzip stream is + reached, but is followed by data that is not another gzip stream. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ + /* checksum functions */ /* These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. + anyway because they might be useful in applications using the compression + library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: uLong adler = adler32(0L, Z_NULL, 0); @@ -1273,9 +1485,10 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ +/* ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); -/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of @@ -1285,9 +1498,11 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is NULL, this function returns the required initial - value for the for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the for the crc. Pre- and post-conditioning (one's + complement) is performed within this function so it shouldn't be done by the + application. + Usage example: uLong crc = crc32(0L, Z_NULL, 0); @@ -1298,9 +1513,9 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ +/* ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); -/* Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 @@ -1339,16 +1554,57 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) + ZLIB_VERSION, sizeof(z_stream)) +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# ifdef _LARGEFILE64_SOURCE + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif +/* hack for buggy compilers */ #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ + struct internal_state {int dummy;}; #endif +/* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); #ifdef __cplusplus } diff --git a/Modules/zlib/zlib.map b/Modules/zlib/zlib.map new file mode 100644 index 00000000000..f282d3624a5 --- /dev/null +++ b/Modules/zlib/zlib.map @@ -0,0 +1,68 @@ +ZLIB_1.2.0 { + global: + compressBound; + deflateBound; + inflateBack; + inflateBackEnd; + inflateBackInit_; + inflateCopy; + local: + deflate_copyright; + inflate_copyright; + inflate_fast; + inflate_table; + zcalloc; + zcfree; + z_errmsg; + gz_error; + gz_intmax; + _*; +}; + +ZLIB_1.2.0.2 { + gzclearerr; + gzungetc; + zlibCompileFlags; +} ZLIB_1.2.0; + +ZLIB_1.2.0.8 { + deflatePrime; +} ZLIB_1.2.0.2; + +ZLIB_1.2.2 { + adler32_combine; + crc32_combine; + deflateSetHeader; + inflateGetHeader; +} ZLIB_1.2.0.8; + +ZLIB_1.2.2.3 { + deflateTune; + gzdirect; +} ZLIB_1.2.2; + +ZLIB_1.2.2.4 { + inflatePrime; +} ZLIB_1.2.2.3; + +ZLIB_1.2.3.3 { + adler32_combine64; + crc32_combine64; + gzopen64; + gzseek64; + gztell64; + inflateUndermine; +} ZLIB_1.2.2.4; + +ZLIB_1.2.3.4 { + inflateReset2; + inflateMark; +} ZLIB_1.2.3.3; + +ZLIB_1.2.3.5 { + gzbuffer; + gzoffset; + gzoffset64; + gzclose_r; + gzclose_w; +} ZLIB_1.2.3.4; diff --git a/Modules/zlib/zlib.pc.in b/Modules/zlib/zlib.pc.in new file mode 100644 index 00000000000..7e5acf9c77e --- /dev/null +++ b/Modules/zlib/zlib.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +sharedlibdir=@sharedlibdir@ +includedir=@includedir@ + +Name: zlib +Description: zlib compression library +Version: @VERSION@ + +Requires: +Libs: -L${libdir} -L${sharedlibdir} -lz +Cflags: -I${includedir} diff --git a/Modules/zlib/zutil.c b/Modules/zlib/zutil.c index d55f5948a37..898ed345b0e 100644 --- a/Modules/zlib/zutil.c +++ b/Modules/zlib/zutil.c @@ -1,5 +1,5 @@ /* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2005, 2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -34,25 +34,25 @@ uLong ZEXPORT zlibCompileFlags() uLong flags; flags = 0; - switch (sizeof(uInt)) { + switch ((int)(sizeof(uInt))) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } - switch (sizeof(uLong)) { + switch ((int)(sizeof(uLong))) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } - switch (sizeof(voidpf)) { + switch ((int)(sizeof(voidpf))) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } - switch (sizeof(z_off_t)) { + switch ((int)(sizeof(z_off_t))) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; @@ -117,9 +117,9 @@ uLong ZEXPORT zlibCompileFlags() # ifndef verbose # define verbose 0 # endif -int z_verbose = verbose; +int ZLIB_INTERNAL z_verbose = verbose; -void z_error (m) +void ZLIB_INTERNAL z_error (m) char *m; { fprintf(stderr, "%s\n", m); @@ -146,7 +146,7 @@ const char * ZEXPORT zError(err) #ifndef HAVE_MEMCPY -void zmemcpy(dest, source, len) +void ZLIB_INTERNAL zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; @@ -157,7 +157,7 @@ void zmemcpy(dest, source, len) } while (--len != 0); } -int zmemcmp(s1, s2, len) +int ZLIB_INTERNAL zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; @@ -170,7 +170,7 @@ int zmemcmp(s1, s2, len) return 0; } -void zmemzero(dest, len) +void ZLIB_INTERNAL zmemzero(dest, len) Bytef* dest; uInt len; { @@ -213,7 +213,7 @@ local ptr_table table[MAX_PTR]; * a protected system like OS/2. Use Microsoft C instead. */ -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf = opaque; /* just to make some compilers happy */ ulg bsize = (ulg)items*size; @@ -237,7 +237,7 @@ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) return buf; } -void zcfree (voidpf opaque, voidpf ptr) +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ @@ -272,13 +272,13 @@ void zcfree (voidpf opaque, voidpf ptr) # define _hfree hfree #endif -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } -void zcfree (voidpf opaque, voidpf ptr) +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); @@ -297,7 +297,7 @@ extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif -voidpf zcalloc (opaque, items, size) +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) voidpf opaque; unsigned items; unsigned size; @@ -307,7 +307,7 @@ voidpf zcalloc (opaque, items, size) (voidpf)calloc(items, size); } -void zcfree (opaque, ptr) +void ZLIB_INTERNAL zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { diff --git a/Modules/zlib/zutil.h b/Modules/zlib/zutil.h index b7d5eff81b6..258fa88799a 100644 --- a/Modules/zlib/zutil.h +++ b/Modules/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -13,31 +13,21 @@ #ifndef ZUTIL_H #define ZUTIL_H -#define ZLIB_INTERNAL +#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + #include "zlib.h" #ifdef STDC -# ifndef _WIN32_WCE +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) # include <stddef.h> # endif # include <string.h> # include <stdlib.h> #endif -#ifdef NO_ERRNO_H -# ifdef _WIN32_WCE - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. We rename it to - * avoid conflict with other libraries that use the same workaround. - */ -# define errno z_errno -# endif - extern int errno; -#else -# ifndef _WIN32_WCE -# include <errno.h> -# endif -#endif #ifndef local # define local static @@ -89,7 +79,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 # if defined(__TURBOC__) || defined(__BORLANDC__) -# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) /* Allow compilation with ANSI keywords only enabled */ void _Cdecl farfree( void *block ); void *_Cdecl farmalloc( unsigned long nbytes ); @@ -118,7 +108,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #ifdef OS2 # define OS_CODE 0x06 # ifdef M_I86 - #include <malloc.h> +# include <malloc.h> # endif #endif @@ -151,7 +141,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define fdopen(fd,mode) NULL /* No fdopen() */ #endif -#if (defined(_MSC_VER) && (_MSC_VER > 600)) +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ # ifndef _PTRDIFF_T_DEFINED @@ -163,6 +153,18 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # endif #endif +#if defined(__BORLANDC__) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + /* common defaults */ #ifndef OS_CODE @@ -197,7 +199,9 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # ifdef WIN32 /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ # if !defined(vsnprintf) && !defined(NO_vsnprintf) -# define vsnprintf _vsnprintf +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif # endif # endif # ifdef __SASC @@ -232,16 +236,16 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define zmemzero(dest, len) memset(dest, 0, len) # endif #else - extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - extern void zmemzero OF((Bytef* dest, uInt len)); + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef DEBUG # include <stdio.h> - extern int z_verbose; - extern void z_error OF((char *m)); + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} @@ -258,8 +262,9 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #endif -voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); -void zcfree OF((voidpf opaque, voidpf ptr)); +voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); +void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index 519af940c7e..bb453aed637 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -5,41 +5,19 @@ #include "Python.h" +#include "structmember.h" #include "zlib.h" #ifdef WITH_THREAD -#include "pythread.h" - -/* #defs ripped off from _tkinter.c, even though the situation here is much - simpler, because we don't have to worry about waiting for Tcl - events! And, since zlib itself is threadsafe, we don't need to worry - about re-entering zlib functions. - - N.B. - - Since ENTER_ZLIB and LEAVE_ZLIB only need to be called on functions - that modify the components of preexisting de/compress objects, it - could prove to be a performance gain on multiprocessor machines if - there was an de/compress object-specific lock. However, for the - moment the ENTER_ZLIB and LEAVE_ZLIB calls are global for ALL - de/compress objects. - */ - -static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */ - -#define ENTER_ZLIB \ - Py_BEGIN_ALLOW_THREADS \ - PyThread_acquire_lock(zlib_lock, 1); \ - Py_END_ALLOW_THREADS - -#define LEAVE_ZLIB \ - PyThread_release_lock(zlib_lock); - + #include "pythread.h" + #define ENTER_ZLIB(obj) \ + Py_BEGIN_ALLOW_THREADS; \ + PyThread_acquire_lock((obj)->lock, 1); \ + Py_END_ALLOW_THREADS; + #define LEAVE_ZLIB(obj) PyThread_release_lock((obj)->lock); #else - -#define ENTER_ZLIB -#define LEAVE_ZLIB - + #define ENTER_ZLIB(obj) + #define LEAVE_ZLIB(obj) #endif /* The following parameters are copied from zutil.h, version 0.95 */ @@ -53,7 +31,6 @@ static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */ /* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */ #define DEFAULTALLOC (16*1024) -#define PyInit_zlib initzlib static PyTypeObject Comptype; static PyTypeObject Decomptype; @@ -67,6 +44,9 @@ typedef struct PyObject *unused_data; PyObject *unconsumed_tail; int is_initialised; + #ifdef WITH_THREAD + PyThread_type_lock lock; + #endif } compobject; static void @@ -116,16 +96,19 @@ newcompobject(PyTypeObject *type) if (self == NULL) return NULL; self->is_initialised = 0; - self->unused_data = PyString_FromString(""); + self->unused_data = PyBytes_FromStringAndSize("", 0); if (self->unused_data == NULL) { Py_DECREF(self); return NULL; } - self->unconsumed_tail = PyString_FromString(""); + self->unconsumed_tail = PyBytes_FromStringAndSize("", 0); if (self->unconsumed_tail == NULL) { Py_DECREF(self); return NULL; } +#ifdef WITH_THREAD + self->lock = PyThread_allocate_lock(); +#endif return self; } @@ -138,21 +121,31 @@ static PyObject * PyZlib_compress(PyObject *self, PyObject *args) { PyObject *ReturnVal = NULL; - Byte *input, *output; - int length, level=Z_DEFAULT_COMPRESSION, err; + Py_buffer pinput; + Byte *input, *output = NULL; + unsigned int length; + int level=Z_DEFAULT_COMPRESSION, err; z_stream zst; /* require Python string object, optional 'level' arg */ - if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level)) + if (!PyArg_ParseTuple(args, "y*|i:compress", &pinput, &level)) return NULL; + if (pinput.len > UINT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "Size does not fit in an unsigned int"); + goto error; + } + input = pinput.buf; + length = pinput.len; + zst.avail_out = length + length/1000 + 12 + 1; output = (Byte*)malloc(zst.avail_out); if (output == NULL) { PyErr_SetString(PyExc_MemoryError, "Can't allocate memory to compress data"); - return NULL; + goto error; } /* Past the point of no return. From here on out, we need to make sure @@ -194,12 +187,13 @@ PyZlib_compress(PyObject *self, PyObject *args) err=deflateEnd(&zst); if (err == Z_OK) - ReturnVal = PyString_FromStringAndSize((char *)output, - zst.total_out); + ReturnVal = PyBytes_FromStringAndSize((char *)output, + zst.total_out); else zlib_error(zst, err, "while finishing compression"); error: + PyBuffer_Release(&pinput); free(output); return ReturnVal; @@ -214,29 +208,39 @@ PyDoc_STRVAR(decompress__doc__, static PyObject * PyZlib_decompress(PyObject *self, PyObject *args) { - PyObject *result_str; + PyObject *result_str = NULL; + Py_buffer pinput; Byte *input; - int length, err; + unsigned int length; + int err; int wsize=DEF_WBITS; Py_ssize_t r_strlen=DEFAULTALLOC; z_stream zst; - if (!PyArg_ParseTuple(args, "s#|in:decompress", - &input, &length, &wsize, &r_strlen)) + if (!PyArg_ParseTuple(args, "y*|in:decompress", + &pinput, &wsize, &r_strlen)) return NULL; + if (pinput.len > UINT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "Size does not fit in an unsigned int"); + goto error; + } + input = pinput.buf; + length = pinput.len; + if (r_strlen <= 0) r_strlen = 1; zst.avail_in = length; zst.avail_out = r_strlen; - if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen))) - return NULL; + if (!(result_str = PyBytes_FromStringAndSize(NULL, r_strlen))) + goto error; zst.zalloc = (alloc_func)NULL; zst.zfree = (free_func)Z_NULL; - zst.next_out = (Byte *)PyString_AS_STRING(result_str); + zst.next_out = (Byte *)PyBytes_AS_STRING(result_str); zst.next_in = (Byte *)input; err = inflateInit2(&zst, wsize); @@ -275,12 +279,12 @@ PyZlib_decompress(PyObject *self, PyObject *args) /* fall through */ case(Z_OK): /* need more memory */ - if (_PyString_Resize(&result_str, r_strlen << 1) < 0) { + if (_PyBytes_Resize(&result_str, r_strlen << 1) < 0) { inflateEnd(&zst); goto error; } - zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \ - + r_strlen; + zst.next_out = + (unsigned char *)PyBytes_AS_STRING(result_str) + r_strlen; zst.avail_out = r_strlen; r_strlen = r_strlen << 1; break; @@ -297,10 +301,14 @@ PyZlib_decompress(PyObject *self, PyObject *args) goto error; } - _PyString_Resize(&result_str, zst.total_out); + if (_PyBytes_Resize(&result_str, zst.total_out) < 0) + goto error; + + PyBuffer_Release(&pinput); return result_str; error: + PyBuffer_Release(&pinput); Py_XDECREF(result_str); return NULL; } @@ -381,23 +389,30 @@ PyZlib_decompressobj(PyObject *selfptr, PyObject *args) } static void -Comp_dealloc(compobject *self) +Dealloc(compobject *self) { - if (self->is_initialised) - deflateEnd(&self->zst); +#ifdef WITH_THREAD + PyThread_free_lock(self->lock); +#endif Py_XDECREF(self->unused_data); Py_XDECREF(self->unconsumed_tail); PyObject_Del(self); } static void +Comp_dealloc(compobject *self) +{ + if (self->is_initialised) + deflateEnd(&self->zst); + Dealloc(self); +} + +static void Decomp_dealloc(compobject *self) { if (self->is_initialised) inflateEnd(&self->zst); - Py_XDECREF(self->unused_data); - Py_XDECREF(self->unconsumed_tail); - PyObject_Del(self); + Dealloc(self); } PyDoc_STRVAR(comp_compress__doc__, @@ -411,25 +426,34 @@ PyDoc_STRVAR(comp_compress__doc__, static PyObject * PyZlib_objcompress(compobject *self, PyObject *args) { - int err, inplen; + int err; + unsigned int inplen; Py_ssize_t length = DEFAULTALLOC; - PyObject *RetVal; + PyObject *RetVal = NULL; + Py_buffer pinput; Byte *input; unsigned long start_total_out; - if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen)) + if (!PyArg_ParseTuple(args, "y*:compress", &pinput)) return NULL; + if (pinput.len > UINT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "Size does not fit in an unsigned int"); + goto error_outer; + } + input = pinput.buf; + inplen = pinput.len; - if (!(RetVal = PyString_FromStringAndSize(NULL, length))) - return NULL; + if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) + goto error_outer; - ENTER_ZLIB + ENTER_ZLIB(self); start_total_out = self->zst.total_out; self->zst.avail_in = inplen; self->zst.next_in = input; self->zst.avail_out = length; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); Py_BEGIN_ALLOW_THREADS err = deflate(&(self->zst), Z_NO_FLUSH); @@ -438,10 +462,13 @@ PyZlib_objcompress(compobject *self, PyObject *args) /* while Z_OK and the output buffer is full, there might be more output, so extend the output buffer and try again */ while (err == Z_OK && self->zst.avail_out == 0) { - if (_PyString_Resize(&RetVal, length << 1) < 0) + if (_PyBytes_Resize(&RetVal, length << 1) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; goto error; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ - + length; + } + self->zst.next_out = + (unsigned char *)PyBytes_AS_STRING(RetVal) + length; self->zst.avail_out = length; length = length << 1; @@ -460,10 +487,15 @@ PyZlib_objcompress(compobject *self, PyObject *args) RetVal = NULL; goto error; } - _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); + if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; + } error: - LEAVE_ZLIB + LEAVE_ZLIB(self); + error_outer: + PyBuffer_Release(&pinput); return RetVal; } @@ -476,7 +508,7 @@ save_unconsumed_input(compobject *self, int err) /* The end of the compressed data has been reached. Store the leftover input data in self->unused_data. */ if (self->zst.avail_in > 0) { - Py_ssize_t old_size = PyString_GET_SIZE(self->unused_data); + 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) { @@ -484,23 +516,23 @@ save_unconsumed_input(compobject *self, int err) return -1; } new_size = old_size + self->zst.avail_in; - new_data = PyString_FromStringAndSize(NULL, new_size); + new_data = PyBytes_FromStringAndSize(NULL, new_size); if (new_data == NULL) return -1; - Py_MEMCPY(PyString_AS_STRING(new_data), - PyString_AS_STRING(self->unused_data), old_size); - Py_MEMCPY(PyString_AS_STRING(new_data) + old_size, + Py_MEMCPY(PyBytes_AS_STRING(new_data), + PyBytes_AS_STRING(self->unused_data), old_size); + Py_MEMCPY(PyBytes_AS_STRING(new_data) + old_size, self->zst.next_in, self->zst.avail_in); Py_DECREF(self->unused_data); self->unused_data = new_data; self->zst.avail_in = 0; } } - if (self->zst.avail_in > 0 || PyString_GET_SIZE(self->unconsumed_tail)) { + if (self->zst.avail_in > 0 || PyBytes_GET_SIZE(self->unconsumed_tail)) { /* This code handles two distinct cases: 1. Output limit was reached. Save leftover input in unconsumed_tail. 2. All input data was consumed. Clear unconsumed_tail. */ - PyObject *new_data = PyString_FromStringAndSize( + PyObject *new_data = PyBytes_FromStringAndSize( (char *)self->zst.next_in, self->zst.avail_in); if (new_data == NULL) return -1; @@ -524,34 +556,43 @@ PyDoc_STRVAR(decomp_decompress__doc__, static PyObject * PyZlib_objdecompress(compobject *self, PyObject *args) { - int err, inplen, max_length = 0; + int err, max_length = 0; + unsigned int inplen; Py_ssize_t old_length, length = DEFAULTALLOC; - PyObject *RetVal; + PyObject *RetVal = NULL; + Py_buffer pinput; Byte *input; unsigned long start_total_out; - if (!PyArg_ParseTuple(args, "s#|i:decompress", &input, - &inplen, &max_length)) + if (!PyArg_ParseTuple(args, "y*|i:decompress", &pinput, + &max_length)) return NULL; + if (pinput.len > UINT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "Size does not fit in an unsigned int"); + goto error_outer; + } + input = pinput.buf; + inplen = pinput.len; if (max_length < 0) { PyErr_SetString(PyExc_ValueError, "max_length must be greater than zero"); - return NULL; + goto error_outer; } /* limit amount of data allocated to max_length */ if (max_length && length > max_length) length = max_length; - if (!(RetVal = PyString_FromStringAndSize(NULL, length))) - return NULL; + if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) + goto error_outer; - ENTER_ZLIB + ENTER_ZLIB(self); start_total_out = self->zst.total_out; self->zst.avail_in = inplen; self->zst.next_in = input; self->zst.avail_out = length; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); Py_BEGIN_ALLOW_THREADS err = inflate(&(self->zst), Z_SYNC_FLUSH); @@ -573,10 +614,13 @@ PyZlib_objdecompress(compobject *self, PyObject *args) if (max_length && length > max_length) length = max_length; - if (_PyString_Resize(&RetVal, length) < 0) + if (_PyBytes_Resize(&RetVal, length) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; goto error; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ - + old_length; + } + self->zst.next_out = + (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length; self->zst.avail_out = length - old_length; Py_BEGIN_ALLOW_THREADS @@ -604,11 +648,15 @@ PyZlib_objdecompress(compobject *self, PyObject *args) goto error; } - _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); + if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; + } error: - LEAVE_ZLIB - + LEAVE_ZLIB(self); + error_outer: + PyBuffer_Release(&pinput); return RetVal; } @@ -634,18 +682,18 @@ PyZlib_flush(compobject *self, PyObject *args) /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in doing any work at all; just return an empty string. */ if (flushmode == Z_NO_FLUSH) { - return PyString_FromStringAndSize(NULL, 0); + return PyBytes_FromStringAndSize(NULL, 0); } - if (!(RetVal = PyString_FromStringAndSize(NULL, length))) + if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) return NULL; - ENTER_ZLIB + ENTER_ZLIB(self); start_total_out = self->zst.total_out; self->zst.avail_in = 0; self->zst.avail_out = length; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); Py_BEGIN_ALLOW_THREADS err = deflate(&(self->zst), flushmode); @@ -654,10 +702,13 @@ PyZlib_flush(compobject *self, PyObject *args) /* while Z_OK and the output buffer is full, there might be more output, so extend the output buffer and try again */ while (err == Z_OK && self->zst.avail_out == 0) { - if (_PyString_Resize(&RetVal, length << 1) < 0) + if (_PyBytes_Resize(&RetVal, length << 1) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; goto error; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ - + length; + } + self->zst.next_out = + (unsigned char *)PyBytes_AS_STRING(RetVal) + length; self->zst.avail_out = length; length = length << 1; @@ -691,10 +742,13 @@ PyZlib_flush(compobject *self, PyObject *args) goto error; } - _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); + if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) { + Py_DECREF(RetVal); + RetVal = NULL; + } error: - LEAVE_ZLIB + LEAVE_ZLIB(self); return RetVal; } @@ -715,7 +769,7 @@ PyZlib_copy(compobject *self) /* Copy the zstream state * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe */ - ENTER_ZLIB + ENTER_ZLIB(self); err = deflateCopy(&retval->zst, &self->zst); switch(err) { case(Z_OK): @@ -731,7 +785,6 @@ PyZlib_copy(compobject *self) zlib_error(self->zst, err, "while copying compression object"); goto error; } - Py_INCREF(self->unused_data); Py_INCREF(self->unconsumed_tail); Py_XDECREF(retval->unused_data); @@ -742,11 +795,11 @@ PyZlib_copy(compobject *self) /* Mark it as being initialized */ retval->is_initialised = 1; - LEAVE_ZLIB + LEAVE_ZLIB(self); return (PyObject *)retval; error: - LEAVE_ZLIB + LEAVE_ZLIB(self); Py_XDECREF(retval); return NULL; } @@ -766,7 +819,7 @@ PyZlib_uncopy(compobject *self) /* Copy the zstream state * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe */ - ENTER_ZLIB + ENTER_ZLIB(self); err = inflateCopy(&retval->zst, &self->zst); switch(err) { case(Z_OK): @@ -793,11 +846,11 @@ PyZlib_uncopy(compobject *self) /* Mark it as being initialized */ retval->is_initialised = 1; - LEAVE_ZLIB + LEAVE_ZLIB(self); return (PyObject *)retval; error: - LEAVE_ZLIB + LEAVE_ZLIB(self); Py_XDECREF(retval); return NULL; } @@ -823,17 +876,17 @@ PyZlib_unflush(compobject *self, PyObject *args) PyErr_SetString(PyExc_ValueError, "length must be greater than zero"); return NULL; } - if (!(retval = PyString_FromStringAndSize(NULL, length))) + if (!(retval = PyBytes_FromStringAndSize(NULL, length))) return NULL; - ENTER_ZLIB + ENTER_ZLIB(self); start_total_out = self->zst.total_out; - self->zst.avail_in = PyString_GET_SIZE(self->unconsumed_tail); - self->zst.next_in = (Byte *)PyString_AS_STRING(self->unconsumed_tail); + self->zst.avail_in = PyBytes_GET_SIZE(self->unconsumed_tail); + self->zst.next_in = (Byte *)PyBytes_AS_STRING(self->unconsumed_tail); self->zst.avail_out = length; - self->zst.next_out = (Byte *)PyString_AS_STRING(retval); + self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval); Py_BEGIN_ALLOW_THREADS err = inflate(&(self->zst), Z_FINISH); @@ -842,9 +895,12 @@ PyZlib_unflush(compobject *self, PyObject *args) /* while Z_OK and the output buffer is full, there might be more output, so extend the output buffer and try again */ while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) { - if (_PyString_Resize(&retval, length << 1) < 0) + if (_PyBytes_Resize(&retval, length << 1) < 0) { + Py_DECREF(retval); + retval = NULL; goto error; - self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length; + } + self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length; self->zst.avail_out = length; length = length << 1; @@ -873,11 +929,14 @@ PyZlib_unflush(compobject *self, PyObject *args) } } - _PyString_Resize(&retval, self->zst.total_out - start_total_out); + if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) { + Py_DECREF(retval); + retval = NULL; + } error: - LEAVE_ZLIB + LEAVE_ZLIB(self); return retval; } @@ -908,80 +967,86 @@ static PyMethodDef Decomp_methods[] = {NULL, NULL} }; -static PyObject * -Comp_getattr(compobject *self, char *name) -{ - /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch - internal data. */ - - return Py_FindMethod(comp_methods, (PyObject *)self, name); -} - -static PyObject * -Decomp_getattr(compobject *self, char *name) -{ - PyObject * retval; - - ENTER_ZLIB - - if (strcmp(name, "unused_data") == 0) { - Py_INCREF(self->unused_data); - retval = self->unused_data; - } else if (strcmp(name, "unconsumed_tail") == 0) { - Py_INCREF(self->unconsumed_tail); - retval = self->unconsumed_tail; - } else - retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name); - - LEAVE_ZLIB - - return retval; -} +#define COMP_OFF(x) offsetof(compobject, x) +static PyMemberDef Decomp_members[] = { + {"unused_data", T_OBJECT, COMP_OFF(unused_data), READONLY}, + {"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY}, + {NULL}, +}; PyDoc_STRVAR(adler32__doc__, "adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n" "\n" "An optional starting value can be specified. The returned checksum is\n" -"a signed integer."); +"an integer."); static PyObject * PyZlib_adler32(PyObject *self, PyObject *args) { unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */ - Byte *buf; - int len, signed_val; + Py_buffer pbuf; - if (!PyArg_ParseTuple(args, "s#|I:adler32", &buf, &len, &adler32val)) + if (!PyArg_ParseTuple(args, "y*|I:adler32", &pbuf, &adler32val)) return NULL; - /* In Python 2.x we return a signed integer regardless of native platform - * long size (the 32bit unsigned long is treated as 32-bit signed and sign - * extended into a 64-bit long inside the integer object). 3.0 does the - * right thing and returns unsigned. http://bugs.python.org/issue1202 */ - signed_val = adler32(adler32val, buf, len); - return PyInt_FromLong(signed_val); + /* Releasing the GIL for very small buffers is inefficient + and may lower performance */ + if (pbuf.len > 1024*5) { + unsigned char *buf = pbuf.buf; + Py_ssize_t len = pbuf.len; + + Py_BEGIN_ALLOW_THREADS + /* Avoid truncation of length for very large buffers. adler32() takes + length as an unsigned int, which may be narrower than Py_ssize_t. */ + while (len > (size_t) UINT_MAX) { + adler32val = adler32(adler32val, buf, UINT_MAX); + buf += (size_t) UINT_MAX; + len -= (size_t) UINT_MAX; + } + adler32val = adler32(adler32val, buf, len); + Py_END_ALLOW_THREADS + } else { + adler32val = adler32(adler32val, pbuf.buf, pbuf.len); + } + PyBuffer_Release(&pbuf); + return PyLong_FromUnsignedLong(adler32val & 0xffffffffU); } PyDoc_STRVAR(crc32__doc__, "crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n" "\n" "An optional starting value can be specified. The returned checksum is\n" -"a signed integer."); +"an integer."); static PyObject * PyZlib_crc32(PyObject *self, PyObject *args) { unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */ - Byte *buf; - int len, signed_val; + Py_buffer pbuf; + int signed_val; - if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val)) + if (!PyArg_ParseTuple(args, "y*|I:crc32", &pbuf, &crc32val)) return NULL; - /* In Python 2.x we return a signed integer regardless of native platform - * long size (the 32bit unsigned long is treated as 32-bit signed and sign - * extended into a 64-bit long inside the integer object). 3.0 does the - * right thing and returns unsigned. http://bugs.python.org/issue1202 */ - signed_val = crc32(crc32val, buf, len); - return PyInt_FromLong(signed_val); + /* Releasing the GIL for very small buffers is inefficient + and may lower performance */ + if (pbuf.len > 1024*5) { + unsigned char *buf = pbuf.buf; + Py_ssize_t len = pbuf.len; + + Py_BEGIN_ALLOW_THREADS + /* Avoid truncation of length for very large buffers. crc32() takes + length as an unsigned int, which may be narrower than Py_ssize_t. */ + while (len > (size_t) UINT_MAX) { + crc32val = crc32(crc32val, buf, UINT_MAX); + buf += (size_t) UINT_MAX; + len -= (size_t) UINT_MAX; + } + signed_val = crc32(crc32val, buf, len); + Py_END_ALLOW_THREADS + } else { + signed_val = crc32(crc32val, pbuf.buf, pbuf.len); + } + PyBuffer_Release(&pbuf); + return PyLong_FromUnsignedLong(signed_val & 0xffffffffU); } @@ -1009,13 +1074,28 @@ static PyTypeObject Comptype = { 0, (destructor)Comp_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)Comp_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 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*/ + comp_methods, /*tp_methods*/ }; static PyTypeObject Decomptype = { @@ -1025,13 +1105,29 @@ static PyTypeObject Decomptype = { 0, (destructor)Decomp_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)Decomp_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + 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*/ + Decomp_methods, /*tp_methods*/ + Decomp_members, /*tp_members*/ }; PyDoc_STRVAR(zlib_module_documentation, @@ -1049,17 +1145,29 @@ PyDoc_STRVAR(zlib_module_documentation, "Compressor objects support compress() and flush() methods; decompressor\n" "objects support decompress() and flush()."); +static struct PyModuleDef zlibmodule = { + PyModuleDef_HEAD_INIT, + "zlib", + zlib_module_documentation, + -1, + zlib_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC PyInit_zlib(void) { PyObject *m, *ver; - Py_TYPE(&Comptype) = &PyType_Type; - Py_TYPE(&Decomptype) = &PyType_Type; - m = Py_InitModule4("zlib", zlib_methods, - zlib_module_documentation, - (PyObject*)NULL,PYTHON_API_VERSION); + if (PyType_Ready(&Comptype) < 0) + return NULL; + if (PyType_Ready(&Decomptype) < 0) + return NULL; + m = PyModule_Create(&zlibmodule); if (m == NULL) - return; + return NULL; ZlibError = PyErr_NewException("zlib.error", NULL, NULL); if (ZlibError != NULL) { @@ -1081,13 +1189,11 @@ PyInit_zlib(void) PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH); PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH); - ver = PyString_FromString(ZLIB_VERSION); + ver = PyUnicode_FromString(ZLIB_VERSION); if (ver != NULL) PyModule_AddObject(m, "ZLIB_VERSION", ver); PyModule_AddStringConstant(m, "__version__", "1.0"); -#ifdef WITH_THREAD - zlib_lock = PyThread_allocate_lock(); -#endif /* WITH_THREAD */ + return m; } |